/* * 作成日: 2009/04/11 */ package jp.ac.fit.asura.nao.naoji.motion; import java.util.EnumMap; import jp.ac.fit.asura.nao.misc.MathUtils; import jp.ac.fit.asura.nao.motion.Motion; import jp.ac.fit.asura.nao.motion.MotionParam; import jp.ac.fit.asura.nao.motion.MotionParam.WalkParam; import jp.ac.fit.asura.naoji.jal.JALMotion; import jp.ac.fit.asura.naoji.robots.NaoV3R.Joint; import org.apache.log4j.Logger; /** * @author $Author: sey $ * * @version $Id: $ * */ public class NaojiWalker extends Motion { private static final Logger log = Logger.getLogger(NaojiWalker.class); private JALMotion jalmotion; private int samples; private int taskId; private EnumMap<Joint, Float> jointStiffnesses; private float trapezoidLeft; private float trapezoidRight; private float[] walkConfig; public NaojiWalker(JALMotion motion) { this.jalmotion = motion; this.samples = 38; taskId = -1; jointStiffnesses = new EnumMap<Joint, Float>(Joint.class); setJointStiffness(Joint.RHipPitch, 0.8f); setJointStiffness(Joint.LHipPitch, 0.8f); setJointStiffness(Joint.RHipYawPitch, 0.6f); setJointStiffness(Joint.LHipYawPitch, 0.6f); setJointStiffness(Joint.RHipRoll, 0.7f); setJointStiffness(Joint.LHipRoll, 0.7f); setJointStiffness(Joint.RAnkleRoll, 0.9f); setJointStiffness(Joint.LAnkleRoll, 0.9f); setJointStiffness(Joint.RKneePitch, 0.7f); setJointStiffness(Joint.LKneePitch, 0.7f); setJointStiffness(Joint.RAnklePitch, 0.5f); setJointStiffness(Joint.LAnklePitch, 0.5f); walkConfig = new float[] {0.02f, 0.01f, 0.025f, 0.4f, 0.24f, 5.0f}; } @Override public boolean canAccept(MotionParam param) { return param instanceof MotionParam.WalkParam; } @Override public void start(MotionParam param) { if (isRunning()) { log.warn("Motion " + taskId + " is running."); return; } taskId = -1; assert param instanceof MotionParam.WalkParam; WalkParam walkp = (WalkParam) param; float forward = MathUtils.clipAbs(walkp.getForward(), 5.0f); float left = MathUtils.clipAbs(walkp.getLeft(), 5.0f); float turn = MathUtils.clipAbs(walkp.getTurn(), MathUtils.PIf); if (forward == 0 && turn == 0 && left == 0) { jalmotion.setJointStiffness(Joint.RHipPitch.getId(), 1.0f); jalmotion.setJointStiffness(Joint.LHipPitch.getId(), 1.0f); jalmotion.setJointStiffness(Joint.RHipYawPitch.getId(), 1.0f); jalmotion.setJointStiffness(Joint.LHipYawPitch.getId(), 1.0f); jalmotion.setJointStiffness(Joint.RHipRoll.getId(), 1.0f); jalmotion.setJointStiffness(Joint.LHipRoll.getId(), 1.0f); jalmotion.setJointStiffness(Joint.RAnkleRoll.getId(), 1.0f); jalmotion.setJointStiffness(Joint.LAnkleRoll.getId(), 1.0f); jalmotion.setJointStiffness(Joint.RKneePitch.getId(), 1.0f); jalmotion.setJointStiffness(Joint.LKneePitch.getId(), 1.0f); jalmotion.setJointStiffness(Joint.RAnklePitch.getId(), 1.0f); jalmotion.setJointStiffness(Joint.LAnklePitch.getId(), 1.0f); } else { jalmotion.setJointStiffness(Joint.RHipPitch.getId(), jointStiffnesses.get(Joint.RHipPitch)); jalmotion.setJointStiffness(Joint.LHipPitch.getId(), jointStiffnesses.get(Joint.LHipPitch)); jalmotion.setJointStiffness(Joint.RHipYawPitch.getId(), jointStiffnesses.get(Joint.RHipYawPitch)); jalmotion.setJointStiffness(Joint.LHipYawPitch.getId(), jointStiffnesses.get(Joint.LHipYawPitch)); jalmotion.setJointStiffness(Joint.RHipRoll.getId(), jointStiffnesses.get(Joint.RHipRoll)); jalmotion.setJointStiffness(Joint.LHipRoll.getId(), jointStiffnesses.get(Joint.LHipRoll)); jalmotion.setJointStiffness(Joint.RAnkleRoll.getId(), jointStiffnesses.get(Joint.RAnkleRoll)); jalmotion.setJointStiffness(Joint.LAnkleRoll.getId(), jointStiffnesses.get(Joint.LAnkleRoll)); jalmotion.setJointStiffness(Joint.RKneePitch.getId(), jointStiffnesses.get(Joint.RKneePitch)); jalmotion.setJointStiffness(Joint.LKneePitch.getId(), jointStiffnesses.get(Joint.LKneePitch)); jalmotion.setJointStiffness(Joint.RAnklePitch.getId(), jointStiffnesses.get(Joint.RAnklePitch)); jalmotion.setJointStiffness(Joint.LAnklePitch.getId(), jointStiffnesses.get(Joint.LAnklePitch)); } jalmotion.setWalkTrapezoidConfig(trapezoidLeft, trapezoidRight); jalmotion.setWalkConfig(walkConfig[0], walkConfig[1], walkConfig[2], walkConfig[3], walkConfig[4], walkConfig[5]); if (forward != 0 && turn != 0) { log.debug("walkArc with:" + param); taskId = jalmotion.walkArc(turn, forward, samples); } else if (forward != 0) { log.debug("walkForward with:" + param); taskId = jalmotion.walkStraight(forward, samples); } else if (left != 0) { log.debug("walkSideways with:" + param); taskId = jalmotion.walkSideways(left, samples); } else if (turn != 0) { log.debug("turn with:" + param); taskId = jalmotion.turn(turn, samples); } } @Override public void step() { } @Override public void stop() { log.debug("stop() called."); // jalmotion.clearFootsteps(); } @Override public boolean canStop() { boolean active = jalmotion.walkIsActive(); log.trace("canStop? " + active); return !active && !isRunning(); } @Override public String getName() { return "NaojiWalker"; } @Override public void requestStop() { log.debug("requestStop is called."); // jalmotion.clearFootsteps(); } @Override public boolean hasNextStep() { boolean active = jalmotion.walkIsActive(); log.trace("hasNextStep? " + active); return active || isRunning(); } public boolean isRunning() { if (taskId < 0) return false; boolean isRunning = jalmotion.isRunning(taskId); log.trace("isRunning? " + isRunning); if (!isRunning) taskId = -1; return isRunning; } /** * 関節jointの歩く時のStiffnessを設定する. * @param joint * @param value */ public void setJointStiffness(Joint joint, float value) { jointStiffnesses.put(joint, value); } /** * 関節jointの歩く時のStiffnessを設定する.(schemeから呼び出す用) * @param joint * @param value */ public void setJointStiffness(String joint, float value) { Joint j = Joint.valueOf(joint); if (j == null) { log.error("setJointStiffness: Invalid Joint " + j); return; } setJointStiffness(j, value); } public void setWalkSamples(int samples) { log.info("set walkSamples: " + samples); this.samples = samples; } protected EnumMap<Joint, Float> getJointStiffnesses() { return jointStiffnesses; } protected int getWalkSamples() { return samples; } public void setJointsStiffness() { // for (Joint j : Joint.values()) { // setJointStiffness(j, jointStiffnesses.get(j)); // } jalmotion.setJointStiffness(Joint.RHipPitch.getId(), jointStiffnesses.get(Joint.RHipPitch)); jalmotion.setJointStiffness(Joint.LHipPitch.getId(), jointStiffnesses.get(Joint.LHipPitch)); jalmotion.setJointStiffness(Joint.RHipYawPitch.getId(), jointStiffnesses.get(Joint.RHipYawPitch)); jalmotion.setJointStiffness(Joint.LHipYawPitch.getId(), jointStiffnesses.get(Joint.LHipYawPitch)); jalmotion.setJointStiffness(Joint.RHipRoll.getId(), jointStiffnesses.get(Joint.RHipRoll)); jalmotion.setJointStiffness(Joint.LHipRoll.getId(), jointStiffnesses.get(Joint.LHipRoll)); jalmotion.setJointStiffness(Joint.RAnkleRoll.getId(), jointStiffnesses.get(Joint.RAnkleRoll)); jalmotion.setJointStiffness(Joint.LAnkleRoll.getId(), jointStiffnesses.get(Joint.LAnkleRoll)); jalmotion.setJointStiffness(Joint.RKneePitch.getId(), jointStiffnesses.get(Joint.RKneePitch)); jalmotion.setJointStiffness(Joint.LKneePitch.getId(), jointStiffnesses.get(Joint.LKneePitch)); jalmotion.setJointStiffness(Joint.RAnklePitch.getId(), jointStiffnesses.get(Joint.RAnklePitch)); jalmotion.setJointStiffness(Joint.LAnklePitch.getId(), jointStiffnesses.get(Joint.LAnklePitch)); log.info("set stiffnesses for walk."); } public void setTrapezoidConfig(float left, float right) { trapezoidLeft = left; trapezoidRight = right; log.info("set walk trapezoidConfig."); } public void setWalkConfig(float pMaxStepLength, float pMaxStepHeight, float pMaxStepSide, float pMaxStepTurn, float pHipHeight, float pTorsoYOrientation) { walkConfig[0] = pMaxStepLength; walkConfig[1] = pMaxStepHeight; walkConfig[2] = pMaxStepSide; walkConfig[3] = pMaxStepTurn; walkConfig[4] = pHipHeight; walkConfig[5] = pTorsoYOrientation; log.info("set walk config."); } }