ライブラリ関数


河原林研究室 >> EcoBe!世界一への道 >> ライブラリ関数

ここではRoboCup? Mixed Reality League (MRリーグ)で使用されているサッカーサーバで用意されている(サッカークライアントに関する)関数の一部を紹介する。

WorldData?.cpp

  • このWorldData?.cppはmr-soccer-server2008/soccer_clientに用意されてる
  • 以下で紹介する関数はこのWorldData?内に書かれている
  • WorldData?内には主に環境に関する関数が書かれている

ボール

ボールに関する関数には以下のものがある

pv_ball

この関数は自分からボールまでの距離と自分の正面からの角度を返す関数である。

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;
}

ゴール

ゴールに関する関数には以下のものがある

pv_mygoal_pole1

この関数は自分側のゴールの左ポストまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が左ポストとなっている)

  • 変更前
    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();
    }

pv_mygoal_pole2

この関数は自分側のゴールの右ポストまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が右ポストとなっている)

  • 変更前
    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();
    }

pv_opgoal_pole1

この関数は相手側のゴールの(相手側から見て)左ポストまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が左ポストとなっている)

  • 変更前
    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();
        }
    }

pv_opgoal_pole2

この関数は相手側のゴールの(相手側から見て)右ポストまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が右ポストとなっている)

  • 変更前
    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();
        }
    }

フィールドエリア

フィールドエリアに関する関数には以下のものがある。

pv_mycorner_flag1

この関数は自分側の左コーナーまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が左コーナーとなっている)

  • 変更前
    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();
    }

pv_mycorner_flag2

この関数は自分側の右コーナーまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が右コーナーとなっている)

  • 変更前
    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();
    }

pv_opcorner_flag1

この関数は相手側の(相手から見て)左コーナーまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が左コーナーとなっている)

  • 変更前
    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();
    }

pv_opcorner_flag2

この関数は相手側の(相手から見て)右コーナーまでの自分からの距離と自分の正面からの角度を返す関数である。(この関数は自分で変更をしていて、変更後が右コーナーとなっている)

  • 変更前
    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に関する関数には以下のものなどがある

pv_my_id

この関数は自分のIDを取得する

int
WorldData :: pv_my_id()
{
    return mXmlWorldData.Me().uid();
}

pv_closest_teammate_to

この関数は一番近い味方のIDを取得する

int
WorldData :: pv_closest_teammate_to(vector_t v)
{ 
	return ClosestInList(v, mXmlWorldData.Teammates()
	.WithFound(true));
}

pv_closest_opponent_to

この関数は一番近い相手のIDを取得する

int
WorldData :: pv_closest_opponent_to(vector_t v)
{ 
	return ClosestInList(v, mXmlWorldData.Opponents()
	.WithFound(true));
}

BasicPlayer?.cpp

  • このBasicPlayer?.cppはmr-soccer-server2008/soccer_clientに用意されてる
  • 以下で紹介する関数はこのBasicPlayer?内に書かれている
  • BasicPlayer?には主に動作に関する関数が書かれている

キック

キックに関する関数には以下の関数がある

pv_can_kick

この関数はキックできるかどうかを判断する関数である

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;
}

pv_kick

この関数は angle で指定した角度に strength で指定した強さでボールを蹴る関数である

void
BasicPlayer ::  pv_kick(double angle, double strength)
{
    mCmd.setKick(angle, strength);
}

移動

移動に関する関数には以下の関数などがある

pv_set_velocity

この関数は左右の車輪の速度を直接指定する関数である

void
BasicPlayer :: pv_set_velocity(double left, double right)
{
    mCmd.setVelocity(left, right);
}

pv_go_straight

この関数は speed で指定した速度で直進する関数である

void
BasicPlayer :: pv_go_straight(double speed)
{
    pv_set_velocity(speed,speed);
}

pv_go_to

この関数は自分からの距離と自分の正面からの角度で指定した場所に移動する関数である

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();
		}
	}
}

pv_stop

この関数はストップする関数である

void
BasicPlayer :: pv_stop()
{
    pv_set_velocity(0,0);
}