package jp.ac.fit.asura.nao.strategy.tactics; 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; /** * PK戦専用のゴーリー * ベース:既存のゴーリー * 既存のゴーリーとの違いは *● フレーム数で獲得していた「前のボールの位置」を定数に変更(PK戦ではボールの初期位置が決まっているため) * 他にもいろいろ追加する予定 * * @author aqua */ public class GoaliePkTask extends Task { private static final Logger log = Logger.getLogger(GoaliePkTask.class); private double balld; private float ballh; private BallTrackingTask tracking; private int switchFlag; @Override public String getName() { // TODO 自動生成されたメソッド・スタブ return "GoaliePkTask"; } @Override public void init(RobotContext context) { tracking = (BallTrackingTask) context.getStrategy().getTaskManager() .find("BallTracking"); switchFlag = 0; } public void after(StrategyContext context) { } @Override public void continueTask(StrategyContext context) { // TODO 自動生成されたメソッド・スタブ tracking.setMode(Mode.Cont); WorldObject ball = context.getBall(); balld = ball.getDistance(); ballh = ball.getHeading(); // 状態:キックモーションのフラグ if (context.getGoalieKickFlag() == false && balld <= 300) { context.setGoalieDefenceFlag(false); context.setGoalieKickFlag(true); // log.info("------------------"); // log.info("GoalieKickFlag = 1"); // log.info("------------------"); }else{ // 状態:ディフェンスモーションのフラグ 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 (1500 - balld >= 10) { if (ballh > 5) { // ballがゴーリーの左側に抜けるとき log.info("L^L"); context.makemotion(Motions.MOTION_L_GORI_ITO); } else if (ballh <= -5) { // ballがゴーリーの右側に抜けるとき 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; log.info("balld(zero1) =" + balld); log.info("ballh(zero1) =" + ballh); } 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; log.info("balld(zero) =" + balld); log.info("ballh(zero) =" + ballh); } } 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; log.info("balld(zero) =" + balld); log.info("ballh(zero) =" + ballh); } 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; log.info("balld(zero) =" + balld); log.info("ballh(zero) =" + ballh); } } 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; log.info("balld(zero) =" + balld); log.info("ballh(zero) =" + ballh); } 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); } }