package jp.ac.fit.asura.nao.naoji.motion;
import org.apache.log4j.Logger;
import jp.ac.fit.asura.nao.RobotContext;
import jp.ac.fit.asura.nao.motion.Motion;
import jp.ac.fit.asura.nao.motion.MotionParam;
import jp.ac.fit.asura.nao.motion.MotionParam.CircleTurnParam;
import jp.ac.fit.asura.nao.motion.MotionParam.CircleTurnParam.Side;
import jp.ac.fit.asura.naoji.jal.JALMotion;
import jp.ac.fit.asura.naoji.robots.NaoV3R.Joint;
/**
* 実機用のサークルターン.ターンとサイドステップを連続で実行する.
*
* @author takata
*/
public class NaojiCircleTurn extends Motion {
private static final Logger log = Logger.getLogger(NaojiCircleTurn.class);
private JALMotion jalmotion;
private NaojiWalker walker;
private int samples;
private float sideDist;
private float angle;
private int taskId;
private float[] turnConfig;
public NaojiCircleTurn(JALMotion motion, NaojiWalker walker) {
this.jalmotion = motion;
this.walker = walker;
samples = 38;
angle = 0.28f;
sideDist = 0.06f;
taskId = -1;
turnConfig = new float[] {0.035f, 0.01f, 0.025f, 0.25f, 0.22f, 3.3f};
}
@Override
public String getName() {
return "NaojiCircleTurn";
}
@Override
public boolean canAccept(MotionParam param) {
return param instanceof MotionParam.CircleTurnParam;
}
@Override
public void start(MotionParam param) throws IllegalArgumentException {
float turn;
float left;
if (isRunning()) {
log.warn("Motion " + taskId + " is running.");
return;
}
taskId = -1;
assert param instanceof MotionParam.CircleTurnParam;
CircleTurnParam turnp = (CircleTurnParam) param;
// NaojiWalkerで使用されているJointStiffnessと同じものを使用する
jalmotion.setJointStiffness(Joint.RHipPitch.getId(), walker
.getJointStiffnesses().get(Joint.RHipPitch));
jalmotion.setJointStiffness(Joint.LHipPitch.getId(), walker
.getJointStiffnesses().get(Joint.LHipPitch));
jalmotion.setJointStiffness(Joint.RHipYawPitch.getId(), walker
.getJointStiffnesses().get(Joint.RHipYawPitch));
jalmotion.setJointStiffness(Joint.LHipYawPitch.getId(), walker
.getJointStiffnesses().get(Joint.LHipYawPitch));
jalmotion.setJointStiffness(Joint.RHipRoll.getId(), walker
.getJointStiffnesses().get(Joint.RHipRoll));
jalmotion.setJointStiffness(Joint.LHipRoll.getId(), walker
.getJointStiffnesses().get(Joint.LHipRoll));
jalmotion.setJointStiffness(Joint.RAnkleRoll.getId(), walker
.getJointStiffnesses().get(Joint.RAnkleRoll));
jalmotion.setJointStiffness(Joint.LAnkleRoll.getId(), walker
.getJointStiffnesses().get(Joint.LAnkleRoll));
jalmotion.setJointStiffness(Joint.RKneePitch.getId(), walker
.getJointStiffnesses().get(Joint.RKneePitch));
jalmotion.setJointStiffness(Joint.LKneePitch.getId(), walker
.getJointStiffnesses().get(Joint.LKneePitch));
jalmotion.setJointStiffness(Joint.RAnklePitch.getId(), walker
.getJointStiffnesses().get(Joint.RAnklePitch));
jalmotion.setJointStiffness(Joint.LAnklePitch.getId(), walker
.getJointStiffnesses().get(Joint.LAnklePitch));
if (turnp.getSide() == Side.Left) {
turn = angle * -1.0f;
left = sideDist;
} else {
turn = angle;
left = sideDist * -1.0f;
}
jalmotion.setWalkConfig(turnConfig[0], turnConfig[1], turnConfig[2], turnConfig[3], turnConfig[4], turnConfig[5]);
jalmotion.addTurn(turn, samples);
jalmotion.addWalkSideways(left, samples);
taskId = jalmotion.walk();
}
@Override
public boolean canStop() {
boolean active = jalmotion.walkIsActive();
log.trace("canStop? " + active);
return !active && !isRunning();
}
@Override
public void requestStop() {
log.debug("requestStop is called.");
}
@Override
public boolean hasNextStep() {
boolean active = jalmotion.walkIsActive();
log.trace("hasNextStep? " + active);
return active || isRunning();
}
@Override
public void stop() {
log.debug("stop() called.");
}
@Override
public void step() {
}
/**
* NaojiCircleTurnが実行中かどうかを返す. 実行中でなければtaskId=-1になる.
*
* @return
*/
public boolean isRunning() {
if (taskId < 0) {
return false;
}
boolean isRunning = jalmotion.isRunning(taskId);
log.trace("isRunning? " + isRunning);
if (!isRunning)
taskId = -1;
return isRunning;
}
public void setSideDist(float dist) {
this.sideDist = dist;
}
public void setAngle(float angle) {
this.angle = angle;
}
public void setSamples(int samples) {
this.samples = samples;
}
public void setWalkConfig(float pMaxStepLength, float pMaxStepHeight, float pMaxStepSide, float pMaxStepTurn, float pHipHeight, float pTorsoYOrientation) {
turnConfig[0] = pMaxStepLength;
turnConfig[1] = pMaxStepHeight;
turnConfig[2] = pMaxStepSide;
turnConfig[3] = pMaxStepTurn;
turnConfig[4] = pHipHeight;
turnConfig[5] = pTorsoYOrientation;
log.info("set turn's walk config.");
}
}