$ cd a: $ cd RoboCup/libsclient-0.03/dribbler既に RobuCup/libsclient-0.03 の下にいる場合は単に
$ cd dribblerとする.次に make を実行する.
$ make
$ ./dribbler TeamL成功すればモニタ画面にプレイヤが出現する.
モニタで,Soccermonitor menu から Kick off を選択 する.
プレイヤで Ctrl-c (Ctrl を押しながら c)を押す.
モニタで,Soccermonitor menu で Disconnect を選ん だ後,Exit を選ぶ.
サーバのウィンドウで,何かキーを叩く.
クライアントを作成するのに使用している libsclient の詳細に付いては 日本語の説明書 を参照すること.
以前に西野先生がまと められていたプレイヤの作成に関する情報に加筆したものを次に示す.
====
サッカーサーバでの行動は dash, turn, kick (前進,回転,ボールキック)の3
種類がある.
例)
dash 50 パワー 50でダッシュ
turn 10 10度くらい回転
kick 50 0 蹴る力 50 方向 0度でボールを蹴る
強さについては -100〜100 が選べ,角度は±360度を超えても良い.プレイヤか
らの角度は,正面から右手方向に回転する向きを正に取っている.
キーパーはさらに catch ができるが,今回の演習で提供している libsclient
では,キーパーは作成できず,キーパーとしての特別な機能は利用できない.
====
サッカーサーバは,10 分の 1 秒につき1回しか行動のコマンドを受け付けない.
このため,dash(100); dash(100); dash(100); のように繰り返しても,意味が
無く,次の受け付けまでのコマンドは全て捨てられてしまう.適当な間隔をあけ
て送らなければならない.また,スタミナというものがあり,連続して最高速度
で走り続けることはできないようになっている.
マイクロ秒単位で遅延をするために usleep と言う関数が OS によって提供され
ているので,プログラムの実行の間隔を開けるにはこれを利用すると良い.
usleep が利用できない環境では,select のタイムアウトを利用する方法も考え
られる.
====
dribbler.c(ドリブル専門プレイヤ)の思考プログラムを大まかにしめすと次の
ようになる.このプログラムでは見えた人が敵か味方かの区別をしていない.
while (1) { /* 以下を無限に繰り返す */
/* 1 */ ボールが見えないなら, 5 度ほど右へ回る.;
/* 2 */ ボールが見えて± 20 度以上の誤差なら ボールの方を向く.;
/* 3 */ ボールと離れているなら, 前方に 50 の力で進む.;
/* 4 */ ボールが近くてゴールが見えないなら, 90 度右へ 10 の力で蹴る.;
/* 5 */ ゴールが見えて,人が見えないなら, ゴールの方へ 50 の力で蹴る.;
/* 6 */ ゴールが見えて,人も見えたら, 見えた相手の 90 度右に全力で蹴る;
}
====
/* キット中のポイント */
◯ プレイヤが必要とするデータはすべて構造体で扱っています.
◯ その構造体にデータを出し入れする関数が用意されています.
receive_info (sock, buf, sizeof (buf)); で,サーバから情報を buf に受取り,
scan_info (buf, &info, tname); で,buf の情報を分析して,info に入れる.
◯ 使いたいデータは構造体メンバとして参照する.
視覚的な情報は info という名前の構造体変数に格納される.
構造体のメンバ info.info.see.obj[i] に i番目に見えたモノの情報が入ってい
る.見えたモノの個数は info.info.see.n_obj に保存されている.
たとえば,i番目のモノがボールかどうかは,
if (info.info.see.obj[i].type == OT_Ball) で判断できる.
このメンバ「type」の値は,ゴールであれば OT_Goal,プレイヤであれば
OT_Player である.見えたプレイヤーが敵か味方かはすぐには分からない.プレ
イヤの所属するチームの情報は info.info.see.obj[i].id.player.team に保存
されまた,プレイヤの番号が info.info.see.obj[i].id.player.unum にある.
他に,フラグ (OT_Flag) やライン (OT_line),何だか分からないもの
(OT_Unknown) が見えることがある.
◯ info.info.see.obj[i].id.player.team には敵チームを表す WT_Opponent,
味方チームを表す WT_Our または,どちらか分からないと言う意味の
WT_Unknown が保存されている.
◯ info.info.see.obj[i].dist と info.info.see.obj[i].dir が,それぞれ距
離と方向をあらわしている.但し,自分の位置と,見ている方向を基準にした相
対的な値である.自分がどこにいるかを知るには,ラインやゴール,フラグとの
距離から逆算する必要がある.そのために estimate_current_pos という関数が
用意されている.
◯ ゴールやプレイヤ,ボールの大きさはサーバーの設定ファイル RoboCup/Winserver/server.conf で定義されている.
◯ プレイヤはフィールド全体が見えるわけではなく,限られた範囲の情報のみ
が得られる.
====
dribbler は視覚情報は使っているが,聴覚情報は使用していない.プレイヤ同
士でメッセージをやりとりできるが,聴覚情報を受け取れる量やタイミングやメッ
セージが届く距離には制限がある.また,審判や相手チームからのメッセージも
聞こえる.
====
オフサイドがある.
====
サッカー場は2次元なので,ボールがプレイヤの頭上を越えて行くことは無い.
====
Q&A
====
Q1:ボールがラインの外にでてしまいました.どうしたらいいでしょうか?
A1:ラインの外に蹴り出すとその瞬間にキックイン(相手チームボール)になり
ます.このとき相手のプレイヤがそのボールを取りに行きますから,しばらく待っ
て見ましょう.
Q2:キックインしたとたんに相手のキックインに入れ替わってしまいます.
A2:たいていはボールの扱いが下手なため,入れようとしたプレイヤが逆にボー
ルを出して,キックインの権利が繰り返し入れ替わることが起こります.対処方
法としては,何回かやっているとうまく行くようになるのでほっておくのが良い
でしょう.あまりに回数がかかりすぎる時は両チーム相談して,Drop in すると
よいでしょう.
Q3:ボールを囲んで動かなくなりました.
A3:二人がボールをはさんでぶつかり合い,蹴り合いになって試合が進まない
ことも時々あります.しばらく待って見ましょう.ボールがこぼれれば,試合が
続きます.しかし,あまりに長い間(1分以上)続くなら,人間(審判係)の手で
「その場にDrop in」すると良いでしょう.自動的に10メートルずつボールか
ら離れます.
Q4:オフサイドでプレーが止まりました.
A4:暫く待っていると自動的にプレーが再開されます.
Q5:試合時間が終わりました.次に試合をするにはどうすれば良いですか?
A5:クライアント(プレイヤ)を全て終了し,モニタの接続を切ってから,サッ
カーサーバを再起動してください.モニタはサーバの起動後に接続しなおします.
その後,プレイヤをサーバに接続します.
Soccer Server Ver 5.0 のマニュアルの日本語訳が http://www.ita.tutkie.tut.ac.jp/~watta/RoboCup/jmanual.html で閲覧出 来ます.プレイヤの作成に対するヒント等も出ていますので,プレイヤのスタミ ナなどの詳しい情報を調べたい人は,このページも参照すると良いでしょう.
プレイヤの作成については http://www.is.noda.sut.ac.jp/isws/RoboCup/ にも情報が出ています.こ ちらでは Java を使ってプレイヤを作成していますが,C 言語を使ってプレイヤ (クライアント)を作成する場合にも役立つヒントが公開されています.