======================================================================= ======================================================================= === libsclient ver 0.03 1997/4/1 Noda Itsuki === === サッカークライアント用ライブラリ === ======================================================================= ======================================================================= ======================================================================= 関数名: init_connection 引数: char *host int port 返戻値: Socket ----------------------------------------------------------------------- host に soccerserver のホスト名、port に soccerserver のポート番号を指 定すると、UDP ソケットを作り、サーバとの通信のための初期化を行う。返戻 値として Socket 構造体を返す。 typedef struct socket{ int socketfd ; struct sockaddr_in serv_addr ; } Socket ; ======================================================================= 関数名: send_message 引数: Socket sock char *buf 返戻値: Bool ----------------------------------------------------------------------- init_connection で作成した Socket 構造体と、soccerserver に送信したい 文字列を指定する事で、soccerserver へ指定した文字列を送信する。返戻値 として、送信に成功した場合に TRUE、失敗した場合には FALSE を返す。しか しUDP を使用しているため、正しく soccerserver に送信されない場合がある が、この場合にも返戻値は TRUE になる。 ======================================================================= 関数名: recieve_message 引数: Socket *sock char *buf int size 返戻値: Bool ----------------------------------------------------------------------- init_connection で作成した Socket 構造体と格納するバッファのポインタと、 そのサイズを指定する事で、soccerserver からソケットに受信した文字列を 指定したバッファに格納する。格納される文字列は soccerserver が1回に送 信する情報である。返戻値として、情報が受信できた場合に TRUE、何も受信 できなかった場合には FALSE を返し、ソケットの異常によって受信に失敗す るとプログラムを終了する。 この関数は、ソケットから1情報ずつ順番に取り出すため、通信途中で紛失し た情報以外は確実に受信可能である。しかし、後述の receive_info 関数を使 用した場合には、読み出していない最も古い情報から receive_info 関数によっ て読み出す情報の1つ前に送られて来た情報までが破棄される。 ======================================================================= 関数名: close_connection 引数: Socket *sock 返戻値: なし ----------------------------------------------------------------------- init_connection で作成した Socket 構造体を指定する事で、ソケットを閉じ る。 ======================================================================= 関数名: recieve_info 引数: Socket *socket char *buffer int size 返戻値: Bool ----------------------------------------------------------------------- init_connection で作成した Socket 構造体と格納するバッファのポインタと、 そのサイズを指定する事で、soccerserver からソケットに受信した情報の最 新のものを指定したバッファに格納する。返戻値として、情報が受信できた場 合に TRUE、何も受信できなかった場合には FALSE を返す。 この関数は最新の情報だけを読み出すため、以前に読み出していない情報が破 棄される場合がある。 ======================================================================= 関数名: scan_info 引数: char *buffer SensorInfo *sinfo char *teamname 返戻値: Bool ----------------------------------------------------------------------- recieve_info 又は recieve_massage で soccerserver から得た文字列 (buffer) の内容を解析して SensorInfo 構造体に格納する。返戻値として、 成功した場合に TRUE、文字列がフォーマットと異なっていたなどの原因によっ て失敗した場合に FALSE を返す。 この関数の中で、得られた情報が視覚情報か音声情報かによって scan_visual_info か scan_autitoria_info 関数が呼ばれる。 typedef struct _SensorInfo { SensorInfoType type ; union { SeeInfo see ; HearInfo hear ; } info ; } SensorInfo ; SensorInfoType: SIT_See : 視覚情報 SIT_Hear : 音声情報 ======================================================================= 関数名: scan_visual_info 引数: char *buffer SeeInfo *sinfo char *teamname 返戻値: Bool ----------------------------------------------------------------------- soccerserver からの取得情報が視覚情報の場合に、メッセージを解析して SeeInfo 構造体にその情報を格納する。格納される情報は以下の通り。 typedef struct _SeeInfo { int time ; /* 時間 */ int n_obj ; /* 取得したオブジェクトの総数 */ SeenObj obj[SEENOBJMAX] ; } SeeInfo ; typedef struct _SeenObj { ObjectType type ; Bool inViewConeP ; /* 視界に入っている場合に TRUE */ union { PlayerInfo player ; Side side ; FlagPos fpos ; LinePos lpos ; } id ; double dist ; /* オブジェクトまでの距離 */ double dir ; /* オブジェクトとの角度 */ double dist_chng ; /* 相対距離変化量 */ double dir_chng ; /* 相対角度変化量 */ } SeenObj ; typedef struct _Ppos { WhichTeam team ; int unum ; /* プレイヤー番号 */ } PlayerInfo ; Side: S_UNKNOWN S_LEFT S_RIGHT ObjectType: OT_Unknown OT_Ball OT_Player OT_Goal OT_Flag OT_Line FlagPos: FP_Unknown FP_L_T FP_L_B FP_R_T FP_R_B FP_C_T FP_C_B FP_P_L_T FP_P_L_C FP_P_L_B FP_P_R_T FP_P_R_C FP_P_R_B LinePos: LP_Unknown LP_L LP_T LP_B LP_R WhichTeam: WT_Opponent = -1 WT_Unknown = 0 WT_Our = 1 ======================================================================= 関数名: scan_auditorial_info 引数: char *buffer HearInfo *sinfo 返戻値: Bool ----------------------------------------------------------------------- soccerserver からの取得情報が音声情報の場合に、メッセージを解析して HearInfo 構造体にその情報を格納する。格納される情報は以下の通り。 typedef struct _HearInfo { int time ; /* 時間 */ SenderType sender ; double direction ; /* 発信源の方向 */ char message[BUFSIZE] ; /* メッセージ */ } HearInfo ; SenderType: ST_Self ST_Referee ST_Player ======================================================================= 関数名: send_com_init 引数: Socket *sock char *teamname 返戻値: InitInfo ----------------------------------------------------------------------- 引数に作成した Socket 構造体とチーム名を示す文字列を指定する事によって soccerserver に対して、クライアントの初期化メッセージを送信する。初期 化に成功すると、チームのサイド番号 (side)、プレイヤーの背番号 (unum) および初期化ができた時点での playmode を文字列 (playmodestr) と数字 (playmode) で返す。初期化に失敗した場合にはチームのサイドに S_UNKNOWN を返す。 typedef struct _InitInfo { Side side ; int unum ; char playmodestr[32] ; PlayMode playmode ; } InitInfo ; PLAYMODE_STRINGS: PlayMode: "before_kick_off" PM_BeforeKickOff "play_on" PM_PlayOn "time_over" PM_TimeOver "kick_off_l" PM_KickOff_L "kick_off_r" PM_KickOff_R "kick_in_l" PM_KickIn_L "kick_in_r" PM_KickIn_R "free_kick_l" PM_FreeKick_L "free_kick_r" PM_FreeKick_R "corner_kick_l" PM_CornerKick_L "corner_kick_r" PM_CornerKick_R "goal_kick_l" PM_GoalKick_L "goal_kick_r" PM_GoalKick_R "goal_l" PM_Goal_L "goal_r" PM_Goal_R NULL PM_Error ======================================================================= 関数名: send_com_reconnect 引数: Socket *sock char *teamname int unum 返戻値: InitInfo ----------------------------------------------------------------------- 引数に作成した Socket 構造体とチーム名を示す文字列、および再接続したい プレイヤーの背番号をを指定する事によってsoccerserver に対して再接続を行う。 返戻値は send_com_init と同様。 ======================================================================= 関数名: send_com_move 引数: Socket *sock double x double y 返戻値: Bool ----------------------------------------------------------------------- soccerserver に対して move コマンドを送信する。移動する座標は引数の x と y で指定する。コマンド送信に成功した場合には TRUE を、失敗した場合 には FALSE を返す。move コマンドは playmode が PM_BeforeKickOff の時に しか受理されないため、送信に成功しても移動しない場合がある。 ======================================================================= 関数名: send_com_turn 引数: Socket *sock double moment 返戻値: Bool ----------------------------------------------------------------------- soccerserver に対して trun コマンドを送信する。回転する角度は引数の moment で指定する。コマンド送信に成功した場合には TRUE を、失敗した場 合には FALSE を返す。送信が成功しても soccerserver が受理しない場合が あるが、その場合にも TRUE を返す。 ======================================================================= 関数名: send_com_dash 引数: Socket *sock double power 返戻値: Bool ----------------------------------------------------------------------- soccerserver に対して dash コマンドを送信する。dash のパワーは引数の power で指定する。コマンド送信に成功した場合には TRUE を、失敗した場合 には FALSE を返す。送信が成功しても soccerserver が受理しない場合があ るが、その場合にも TRUE を返す。 ======================================================================= 関数名: send_com_kick 引数: Socket *sock double power double dir 返戻値: Bool ----------------------------------------------------------------------- soccerserver に対して kick コマンドを送信する。kick のパワーは引数の power で、方向は dir で指定する。コマンド送信に成功した場合には TRUE を、失敗した場合には FALSE を返す。送信が成功しても soccerserver が受 理しない場合があるが、その場合にも TRUE を返す。 ======================================================================= 関数名: send_com_say 引数: Socket *sock char *message 返戻値: Bool ----------------------------------------------------------------------- soccerserver に対して say コマンドを送信する。メッセージは引数の message で指定する。コマンド送信に成功した場合には TRUE を、失敗した場 合には FALSE を返す。送信が成功しても soccerserver が受理しない場合が あるが、その場合にも TRUE を返す。 ======================================================================= 関数名: send_com_change_view 引数: Socket *sock ViewWidth width ViewQuality quality 返戻値: Bool ----------------------------------------------------------------------- soccerserver に対して change_view コマンドを送信する。視覚の広さは引数 の width で、視覚の質は quality で指定する。コマンド送信に成功した場合 には TRUE を、失敗した場合には FALSE を返す。送信が成功しても soccerserver が受理しない場合があるが、その場合にも TRUE を返す。 ViewWidth: VW_Narrow VW_Normal VW_Wide ViewQuality: VQ_high VQ_low ======================================================================= 関数名: estimate_current_pos 引数: SeeInfo *sinf Side side PosState *pstate 返戻値: Bool ----------------------------------------------------------------------- 引数に SeeInfo 構造体、チームのサイド (side)、そして位置情報を格納する PosState 構造体へのポインタを指定する事によって、視覚情報からプレイヤー の現在位置(絶対座標 (pos) とプレイヤーの向き (dir))を求める。現在位置 の取得に成功した場合には TRUE、失敗した場合には FALSE を返す。 ここでの絶対座標とは、プレイヤーの攻めている方向を x の正方向、この方 向に対して右方向を y の正方向とする。また、プレイヤーの向きは x の正方 向を向いている時を 0 度とし、それを基準に右方向に +180 度までと左方向 に -180 どまでの値をとる。 求める方法は、まずはじめに line 情報から x、y どちらかの座標を求め、も う一方の座標を最もプレイヤーに近い flag 情報から求める。もし、flag 情 報が無い場合に goal 情報があれば goal 情報から求める。このため、line 情報がない場合や、flag 情報と goal 情報両方がない場合には求める事がで きないため FALSE を返す。 typedef struct _PosState { Pos pos ; double dir ; } PosState ; typedef struct _XYPos { double x ; double y ; } Pos ;