package jp.ac.fit.asura.nao.motion.motions;
import static jp.ac.fit.asura.nao.PressureSensor.LFsrBL;
import static jp.ac.fit.asura.nao.PressureSensor.LFsrBR;
import static jp.ac.fit.asura.nao.PressureSensor.LFsrFL;
import static jp.ac.fit.asura.nao.PressureSensor.LFsrFR;
import static jp.ac.fit.asura.nao.PressureSensor.RFsrBL;
import static jp.ac.fit.asura.nao.PressureSensor.RFsrBR;
import static jp.ac.fit.asura.nao.PressureSensor.RFsrFL;
import static jp.ac.fit.asura.nao.PressureSensor.RFsrFR;
import jp.ac.fit.asura.nao.Effector;
import jp.ac.fit.asura.nao.Joint;
import jp.ac.fit.asura.nao.RobotContext;
import jp.ac.fit.asura.nao.SensorContext;
import jp.ac.fit.asura.nao.motion.MotionParam;
import org.apache.log4j.Logger;
@Deprecated
public class ForwardMotion extends CompatibleMotion {
private Logger log = Logger.getLogger(ForwardMotion.class);
private boolean canStop = false;
private boolean stopRequested = false;
public ForwardMotion(float[] frames, int[] steps) {
super(frames, steps);
}
@Override
public boolean canStop() {
if (currentStep <= 0) {
// ストップするときは、フレームが終わるか、モーションが始まってないとき
return true;
}
if (sequence >= 30 && sequenceStep >= steps[sequence])
return true;
SensorContext s = context.getSensorContext();
int leftOnGround = 0;
if (s.getForce(LFsrFL) > 1.5f)
leftOnGround++;
if (s.getForce(LFsrFR) > 1.5f)
leftOnGround++;
if (s.getForce(LFsrBL) > 1.5f)
leftOnGround++;
if (s.getForce(LFsrBR) > 1.5f)
leftOnGround++;
int rightOnGround = 0;
if (s.getForce(RFsrFL) > 1.5f)
rightOnGround++;
if (s.getForce(RFsrFR) > 1.5f)
rightOnGround++;
if (s.getForce(RFsrBL) > 1.5f)
rightOnGround++;
if (s.getForce(RFsrBR) > 1.5f)
rightOnGround++;
if (rightOnGround >= 2 && leftOnGround >= 2) {
// 片足で二点ずつ接地していれば停止できる
log.debug("touchSensor=true");
return true;
}
if (rightOnGround == 0 && leftOnGround == 0) {
log.debug("no grounded.");
return true;
}
log.trace("can't stop. l:" + leftOnGround + " r:" + rightOnGround);
return false;
}
@Override
public void init(RobotContext context) {
super.init(context);
}
@Override
public void step() {
SensorContext sensor = context.getSensorContext();
Effector effector = context.getRobotContext().getEffector();
if (currentStep == 0) {
float[] current = sensor.getJointAngles();
System.arraycopy(current, 0, ip, 0, ip.length);
sequence = 0;
sequenceStep = 0;
interpolateFrame();
} else if (sequenceStep >= steps[sequence]) {
// 切り替え時
nextSequence();
interpolateFrame();
}
currentStep++;
sequenceStep++;
for (int j = 0; j < ip.length; j++) {
ip[j] += dp[j];
}
if (Math.random() > 0.55 && hasNextStep()) {
if (sequenceStep >= steps[sequence]) {
nextSequence();
interpolateFrame();
}
sequenceStep++;
}
for (Joint j : Joint.values()) {
if (j == Joint.HeadYaw || j == Joint.HeadPitch)
continue;
effector.setJoint(j, ip[j.ordinal()]);
}
}
private void nextSequence() {
assert sequenceStep >= steps[sequence];
if (sequenceStep < steps[sequence])
return;
if (sequence == 23 || sequence == 6) {
if (stopRequested)
sequence = 24;
else
sequence = 7;
} else {
sequence++;
}
sequenceStep = 0;
}
@Override
public void requestStop() {
stopRequested = true;
}
@Override
public void continueMotion() {
stopRequested = false;
}
@Override
public boolean hasNextStep() {
return sequence < 30 || sequenceStep < steps[sequence];
}
@Override
public void start(MotionParam param) {
stopRequested = false;
super.start(param);
}
}