package jp.ac.fit.asura.nao.strategy.tactics; /** * ボールの加速度を ボールの加速度=前のボール位置(balld0)- 後のボールの位置(balld) という風にする。 * もし加速度が20以上だったら対応した方向の腕を動かすモーションを使う。 * headingで対応する腕を決める。 * * @author aqua */ 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.motion.Motions; 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 GoalieTask extends Task { private static final Logger log = Logger.getLogger(GoalieTask.class); private double balld; private double balld0; private float ballh; private float ballh0; private long ballt; private BallTrackingTask tracking; private int switchFlag; @Override public String getName() { // TODO 自動生成されたメソッド・スタブ return "GoalieTask"; } @Override public void init(RobotContext context) { tracking = (BallTrackingTask) context.getStrategy().getTaskManager() .find("BallTracking"); switchFlag = 0; } public void after(StrategyContext context) { // log.info("balld(after)=" + balld); // log.info("balld0(after)=" + balld0); // log.info("ballh(after)=" + ballh); // log.info("ballh0(after)=" + ballh0); // log.info("ballt(after)=" + ballt); if (ballt <= 5000) { if (context.getGoalieFlag() == false && context.getFrame() % 3 == 0) { // 前のボールの値を保存する balld0 = balld; ballh0 = ballh; // log.info("balld(after2)=" + balld); // log.info("balld0(after2)=" + balld0); // log.info("ballh(after2)=" + ballh); // log.info("ballh0(after2)=" + ballh0); // 値保存のためのフラグ context.setGoalieFlag(true); log.debug("GoalieFlag = 1"); } } else { balld = 0; ballh = 0; balld0 = 0; ballh0 = 0; // ゴーリーの横でボールが止まっていて見失った時の保険 if (context.getFrame() % 5 == 0) { context.makemotion(Motions.MOTION_L_GOTE_ITO); context.makemotion(Motions.MOTION_R_GOTE_ITO); } } } /** * 前のボールの距離と後のボールの距離を比較する。 腕を振る方向は、前保存した値と後で保存した値を比較する。 正面の時は蹴り返す処理。 * */ @Override public void continueTask(StrategyContext context) { // TODO 自動生成されたメソッド・スタブ tracking.setMode(Mode.Cont); WorldObject ball = context.getBall(); balld = ball.getDistance(); ballh = ball.getHeading(); ballt = ball.getDifftime(); if (context.getGoalieFlag() == true && balld <= 1400) { context.setGoalieFlag(false); log.info("GoalieFlag = 0"); // log.info("balld =" + balld); // log.info("balld0 =" + balld0); // log.info("ballh =" + ballh); // log.info("ballh0 =" + ballh0); // 状態:キックモーションのフラグ if (context.getGoalieKickFlag() == false && balld <= 300) { context.setGoalieDefenceFlag(false); context.setGoalieKickFlag(true); // log.info("------------------"); // log.info("GoalieKickFlag = 1"); // log.info("------------------"); } // 状態:ディフェンスモーションのフラグ if (context.getGoalieDefenceFlag() == false && balld > 300) { context.setGoalieDefenceFlag(true); context.setGoalieKickFlag(false); // log.info("------------------"); // log.info("GoalieDefenceFlag=1"); // log.info("------------------"); } /** * 状態の切り替え 1 ディフェンスモーション 2 キックモーション */ if (context.getGoalieDefenceFlag() == true && context.getGoalieKickFlag() == false) { switchFlag = 1; } else if (context.getGoalieDefenceFlag() == false && context.getGoalieKickFlag() == true) { switchFlag = 2; } log.info("switchFlag=" + switchFlag); switch (switchFlag) { case 1: // ディフェンスモーションを出すときのパターン if (balld0 - balld >= 10) { // ballが左側にあるとき if (ballh0 > 0) { // ballが左側からゴーリーの左側に抜けるとき if (ballh0 < ballh) { log.info("L^L"); context.makemotion(Motions.MOTION_L_GORI_ITO); } else // ballが左側からゴーリーの右側に抜けるとき if (ballh0 > ballh) { log.info("L^R"); context.makemotion(Motions.MOTION_R_GORI_ITO); } } else // ballが右側にあるとき if (ballh0 <= 0) { // ballが右側からゴーリーの左側に抜けるとき if (ballh0 < ballh) { log.info("R^L"); context.makemotion(Motions.MOTION_L_GORI_ITO); } else // ballが右側からゴーリーの右側に抜けるとき if (ballh0 > ballh) { log.info("R^R"); context.makemotion(Motions.MOTION_R_GORI_ITO); } } /** * 止めた後を想定してキックモーションのフラグを立て、ディフェンスモーションのフラグを折る。 */ context.setGoalieDefenceFlag(false); log.info("GoalieDefenceFlag=0"); context.setGoalieKickFlag(true); log.info("GoalieKickFlag=1"); switchFlag = 0; log.info("switchFlag=0"); // 前保存した値を初期化する balld = 0; ballh = 0; balld0 = 0; ballh0 = 0; log.info("balld(zero1) =" + balld); log.info("ballh(zero1) =" + ballh); log.info("balld0(zero1)=" + balld0); log.info("ballh0(zero1)=" + ballh0); } break; case 2: // 近距離モーションを出すときのパターン if (ballh > 0) { // 左側 if (ballh <= 40) { if (balld <= 180) { log.info("S^C^SiL"); context.makemotion(Motions.MOTION_L_GOKIS_ITO); context.setGoalieKickFlag(false); log.info("GoalieKickFlag=0"); context.setGoalieDefenceFlag(false); log.info("GoalieDefenceFlag=0"); switchFlag = 0; log.info("switchFlag=0"); // 前保存した値を初期化する balld = 0; ballh = 0; balld0 = 0; ballh0 = 0; log.info("balld(zero) =" + balld); log.info("ballh(zero) =" + ballh); log.info("balld0(zero)=" + balld0); log.info("ballh0(zero)=" + ballh0); } } else if (balld <= 280) { log.info("S^C^TL"); context.makemotion(Motions.MOTION_L_GOTE_ITO); context.setGoalieKickFlag(false); log.info("GoalieKickFlag=0"); context.setGoalieDefenceFlag(false); log.info("GoalieDefenceFlag=0"); switchFlag = 0; log.info("switchFlag=0"); // 前保存した値を初期化する balld = 0; ballh = 0; balld0 = 0; ballh0 = 0; log.info("balld(zero) =" + balld); log.info("ballh(zero) =" + ballh); log.info("balld0(zero)=" + balld0); log.info("ballh0(zero)=" + ballh0); } else if (balld <= 500) { // ボールへ近づくための処理 } }// 右側 else if (ballh <= 0) { if (ballh >= -50) { if (balld <= 180) { log.info("S^C^SiR"); context.makemotion(Motions.MOTION_R_GOKIS_ITO); context.setGoalieKickFlag(false); log.info("GoalieKickFlag=0"); context.setGoalieDefenceFlag(false); log.info("GoalieDefenceFlag=0"); switchFlag = 0; log.info("switchFlag=0"); // 前保存した値を初期化する balld = 0; ballh = 0; balld0 = 0; ballh0 = 0; log.info("balld(zero) =" + balld); log.info("ballh(zero) =" + ballh); log.info("balld0(zero)=" + balld0); log.info("ballh0(zero)=" + ballh0); } } else if (balld <= 300) { log.info("S^C^TR"); context.makemotion(Motions.MOTION_R_GOTE_ITO); context.setGoalieKickFlag(false); log.info("GoalieKickFlag=0"); context.setGoalieDefenceFlag(false); log.info("GoalieDefenceFlag=0"); switchFlag = 0; log.info("switchFlag=0"); // 前保存した値を初期化する balld = 0; ballh = 0; balld0 = 0; ballh0 = 0; log.info("balld(zero) =" + balld); log.info("ballh(zero) =" + ballh); log.info("balld0(zero)=" + balld0); log.info("ballh0(zero)=" + ballh0); } else if (balld <= 500) { // ボールへ近づくための処理 } } break; default: } // ボールへ近づいた時に元の場所に戻ろうとする処理 } }// continue end @Override public void leave(StrategyContext context) { // TODO 自動生成されたメソッド・スタブ } @Override public void enter(StrategyContext context) { // TODO 自動生成されたメソッド・スタブ context.getScheduler().setTTL(100); } }