河原林研究室 >> EcoBe!世界一への道 >> ライブラリ関数
ここではRoboCup? Mixed Reality League (MRリーグ)で使用されているサッカーサーバで用意されている(サッカークライアントに関する)関数の一部を紹介する。
ボールに関する関数には以下のものがある
この関数は自分からボールまでの距離と自分の正面からの角度を返す関数である。
vector_t WorldData :: pv_ball() { if (pv_i_am_lost()) throw ClientException("World::pv_ball() request on lost agent"); vector_t auxBall; auxBall.angle = mXmlWorldData.mBall.mAngle; auxBall.length = mXmlWorldData.mBall.mDist; return auxBall; }
ゴールに関する関数には以下のものがある
この関数は自分側のゴールの左ポストまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が左ポストとなっている)
WorldData :: pv_mygoal_pole1() { if (mAgentTeam == TEAM_BLUE){ return mrTopRightPole(); } else return mrTopLeftPole(); }
vector_t WorldData :: pv_mygoal_pole1() { if (mAgentTeam == TEAM_BLUE){ return mrTopLeftPole(); } else return mrBottomRightPole(); }
この関数は自分側のゴールの右ポストまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が右ポストとなっている)
vector_t WorldData :: pv_mygoal_pole2() { if (mAgentTeam == TEAM_BLUE){ return mrBottomRightPole(); } else return mrBottomLeftPole(); }
vector_t WorldData :: pv_mygoal_pole2() { if (mAgentTeam == TEAM_BLUE){ return mrBottomLeftPole(); } else return mrTopRightPole(); }
この関数は相手側のゴールの(相手側から見て)左ポストまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が左ポストとなっている)
vector_t WorldData :: pv_opgoal_pole1() { if (mAgentTeam == TEAM_BLUE){ return mrTopLeftPole(); } else { return mrTopRightPole(); } }
vector_t WorldData :: pv_opgoal_pole1() { if (mAgentTeam == TEAM_BLUE){ return mrBottomRightPole(); } else { return mrTopLeftPole(); } }
この関数は相手側のゴールの(相手側から見て)右ポストまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が右ポストとなっている)
vector_t WorldData :: pv_opgoal_pole2() { if (mAgentTeam == TEAM_BLUE){ return mrBottomLeftPole(); } else { return mrBottomRightPole(); } }
vector_t WorldData :: pv_opgoal_pole2() { if (mAgentTeam == TEAM_BLUE){ return mrTopRightPole(); } else { return mrBottomLeftPole(); } }
フィールドエリアに関する関数には以下のものがある。
この関数は自分側の左コーナーまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が左コーナーとなっている)
vector_t WorldData :: pv_mycorner_flag1() { if (mAgentTeam == TEAM_BLUE){ return mrTopRightCorner(); } else return mrTopLeftCorner(); }
vector_t WorldData :: pv_mycorner_flag1() { if (mAgentTeam == TEAM_BLUE){ return mrTopLeftCorner(); } else return mrBottomRightCorner(); }
この関数は自分側の右コーナーまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が右コーナーとなっている)
vector_t WorldData :: pv_mycorner_flag2() { if (mAgentTeam == TEAM_BLUE){ return mrBottomRightCorner(); } else return mrBottomLeftCorner(); }
vector_t WorldData :: pv_mycorner_flag2() { if (mAgentTeam == TEAM_BLUE){ return mrBottomLeftCorner(); } else return mrTopRightCorner(); }
この関数は相手側の(相手から見て)左コーナーまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が左コーナーとなっている)
vector_t WorldData :: pv_opcorner_flag1() { if (mAgentTeam == TEAM_BLUE){ return mrTopLeftCorner(); } else return mrTopRightCorner(); }
vector_t WorldData :: pv_opcorner_flag1() { if (mAgentTeam == TEAM_BLUE){ return mrBottomRightCorner(); } else return mrTopLeftCorner(); }
この関数は相手側の(相手から見て)右コーナーまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が右コーナーとなっている)
vector_t WorldData :: pv_opcorner_flag2() { if (mAgentTeam == TEAM_BLUE){ return mrBottomLeftCorner(); } else return mrBottomRightCorner(); }
vector_t WorldData :: pv_opcorner_flag2() { if (mAgentTeam == TEAM_BLUE){ return mrTopRightCorner(); } else return mrBottomLeftCorner(); }
IDに関する関数には以下のものなどがある
この関数は自分のIDを取得する
int WorldData :: pv_my_id() { return mXmlWorldData.Me().uid(); }
この関数は一番近い味方のIDを取得する
int WorldData :: pv_closest_teammate_to(vector_t v) { return ClosestInList(v, mXmlWorldData.Teammates() .WithFound(true)); }
この関数は一番近い相手のIDを取得する
int WorldData :: pv_closest_opponent_to(vector_t v) { return ClosestInList(v, mXmlWorldData.Opponents() .WithFound(true)); }
キックに関する関数には以下の関数がある
この関数はキックできるかどうかを判断する関数である
bool BasicPlayer :: pv_can_kick() { vector_t t = mWorldData->pv_ball(); /* Length is already in milimmeters. */ if (t.length < MR_TOKICK_MAX_DISTANCE) return true; else return false; }
この関数は angle で指定した角度に strength で指定した強さでボールを蹴る関数である
void BasicPlayer :: pv_kick(double angle, double strength) { mCmd.setKick(angle, strength); }
移動に関する関数には以下の関数などがある
この関数は左右の車輪の速度を直接指定する関数である
void BasicPlayer :: pv_set_velocity(double left, double right) { mCmd.setVelocity(left, right); }
この関数は speed で指定した速度で直進する関数である
void BasicPlayer :: pv_go_straight(double speed) { pv_set_velocity(speed,speed); }
この関数は自分からの距離と自分の正面からの角度で指定した場所に移動する関数である
void BasicPlayer :: pv_go_to(vector_t v) { /* Adjust the angle to be between -180 * and 180 degrees. */ BOUND_ANGLE(v.angle) int back = 0 ; if((v.angle < -M_PI/3 && v.angle > -(2*M_PI/3)) || (v.angle > M_PI/3 && v.angle < (2*M_PI/3) )) { pv_go_to_original(v); // ou pv_turn_left(); } else { /* If the angle error is bigger than * 90 degrees let's flag it and reduce the angle */ if (v.angle > M_PI/2) { back = 1; v.angle = v.angle-M_PI; } else if (v.angle < -M_PI/2) { back = 1; v.angle = v.angle+M_PI; } /* Now let's check the distance */ if (v.length > 150) { /* We are still far, let's * not care much about being * completely aligned. */ if (v.angle > DEG2RAD(20.0)) pv_curve_right2(back); else if (v.angle < DEG2RAD(-20.0)) pv_curve_left2(back); else if (v.length > 120) { if (back) pv_go_straight(-MR_FASTEST_WHEEL_SPEED); else pv_go_straight(MR_FASTEST_WHEEL_SPEED); } else { pv_go_straight(back ? -MR_FASTEST_WHEEL_SPEED : MR_FASTEST_WHEEL_SPEED); } } else if (v.length > 50) { /* Okay we are closer, let's * narrow the angle */ if (v.angle > DEG2RAD(10.0)) pv_curve_right2(back); else if (v.angle < DEG2RAD(-10.0)) pv_curve_left2(back); /* Angle seems OK, let's keep going * straight ahead */ else pv_go_straight(back ? -MR_SLOW_WHEEL_SPEED: MR_SLOW_WHEEL_SPEED); } else if (v.length > 10) { /* Okay we are closer, let's * narrow the angle */ if (v.angle > DEG2RAD(5.0)) { if (back) pv_set_velocity(0,-MR_SLOW_WHEEL_SPEED); else pv_set_velocity(MR_SLOW_WHEEL_SPEED,0); } else if (v.angle < DEG2RAD(-5.0)) { if (back) pv_set_velocity(-MR_SLOW_WHEEL_SPEED,0); else pv_set_velocity(0,MR_SLOW_WHEEL_SPEED); } /* Angle seems OK, let's keep going * straight ahead */ else pv_go_straight(back ? -MR_NORMAL_WHEEL_SPEED : MR_NORMAL_WHEEL_SPEED); } else { /* Good enough! We stop here. */ pv_stop(); } } }
この関数はストップする関数である
void BasicPlayer :: pv_stop() { pv_set_velocity(0,0); }