package jp.ac.fit.asura.nao.strategy.tactics;
import static jp.ac.fit.asura.nao.motion.Motions.NAOJI_WALKER;
import org.apache.log4j.Logger;
import jp.ac.fit.asura.nao.RobotContext;
import jp.ac.fit.asura.nao.localization.WorldObject;
import jp.ac.fit.asura.nao.misc.MathUtils;
import jp.ac.fit.asura.nao.motion.Motions;
import jp.ac.fit.asura.nao.naoji.motion.NaojiWalker;
import jp.ac.fit.asura.nao.strategy.StrategyContext;
import jp.ac.fit.asura.nao.strategy.Task;
import jp.ac.fit.asura.nao.strategy.permanent.BallTrackingTask;
import jp.ac.fit.asura.nao.strategy.permanent.BallTrackingTask.Mode;
public class GetBallTask extends Task {
private Logger log = Logger.getLogger(GetBallTask.class);
private BallTrackingTask tracking;
private int preBalld;
private float preBallh;
@Override
public String getName() {
return "GetBallTask";
}
public void init(RobotContext context) {
tracking = (BallTrackingTask) context.getStrategy().getTaskManager()
.find("BallTracking");
assert tracking != null;
}
public void enter(StrategyContext context) {
context.getScheduler().setTTL(400);
preBalld = 999;
}
public void continueTask(StrategyContext context) {
WorldObject ball = context.getBall();
int balld;
float ballh;
if (ball.getConfidence() == 0) {
context.getScheduler().abort();
return;
}
if (ball.getConfidence() > 0 && ball.getDistance() != 0) {
balld = ball.getDistance();
preBalld = balld;
} else {
balld = preBalld;
}
ballh = ball.getHeading();
if (context.getFrame() % 3 == 0)
log.trace("bc:" + ball.getConfidence() + " bd:" + balld + " bh:"
+ ballh);
if (balld < 800) {
tracking.setMode(Mode.Cont);
if (Math.abs(ballh) > 20f) {
if (ballh > 0) {
if (context.hasMotion(Motions.NAOJI_WALKER))
context.makemotion(NAOJI_WALKER, 0, 0, MathUtils
.toRadians(0.4f * ballh));
else
context.makemotion(Motions.MOTION_LEFT_YY_TURN);
} else {
if (context.hasMotion(Motions.NAOJI_WALKER))
if (context.hasMotion(NAOJI_WALKER))
context.makemotion(NAOJI_WALKER, 0, 0, MathUtils
.toRadians(0.4f * ballh));
else
context.makemotion(Motions.MOTION_RIGHT_YY_TURN);
}
} else if (balld > 230) {
if (context.hasMotion(Motions.NAOJI_WALKER))
context
.makemotion(NAOJI_WALKER, balld * 0.35f / 1e3f, 0,
0);
else
context.makemotion(Motions.MOTION_YY_FORWARD_STEP);
} else {
log.info("Getting ball finished.");
context.pushQueue("TurnTask");
context.getScheduler().abort();
}
return;
} else {
tracking.setMode(Mode.Localize);
if (Math.abs(ballh) > 27) {
if (ballh > 0) {
if (context.hasMotion(Motions.NAOJI_WALKER))
context.makemotion(NAOJI_WALKER, 0, 0, MathUtils
.toRadians(0.4f * ballh));
else
context.makemotion(Motions.MOTION_LEFT_YY_TURN);
} else {
if (context.hasMotion(NAOJI_WALKER))
context.makemotion(NAOJI_WALKER, 0, 0, MathUtils
.toRadians(0.4f * ballh));
else
context.makemotion(Motions.MOTION_RIGHT_YY_TURN);
}
} else {
if (context.hasMotion(Motions.NAOJI_WALKER))
context.makemotion(NAOJI_WALKER, balld * 0.5f / 1e3f, 0, 0);
else
context.makemotion(Motions.MOTION_YY_FORWARD_STEP);
}
return;
}
}
@Override
public void leave(StrategyContext context) {
}
}