RoboCup サッカー 2D シミュレーション講習会 @ 秋キャンプ 2011

RoboCup サッカー
2D シミュレーション講習会
@ 秋キャンプ 2011
福岡大学 秋山英久
今日の内容

サッカーシミュレーションとは何か

2D サッカーシミュレータの仕組み

2D サッカーシミュレータの設定方法

agent2d を使ったチーム開発
サッカーシミュレーションとは?
RoboCup サッカーシミュレーションリーグ

実機ロボットを使わない,ソフトウェアのみの競技

現在, 2D リーグ, 3D リーグという 2 つのサブリーグ
2D リーグ
3D リーグ
2D と 3D の違い

チームワーク (2D) vs. リアルロボットシミュレータ (3D)


2D リーグ: ロボットの制御そのものにはあまり注目して
いない.どうやってパスをつなげるか?といった戦術面を
重視
3D リーグ: 二足歩行制御の開発から必要
プレイヤ
物理計算
2D
円で表現
3D
NAO の形をしたロボット
簡易なモデル
円同士の衝突検出程度
ODE などの物理エンジンを使って厳密に
衝突を計算
プレイヤの制御 抽象化されたコマンド
(kick, turn, dash など )
実際のロボットの制御に近い
(関節角度の操作)
何が難しいか?
東京大学竹内研制作のポスターより
何が難しいか?

完全な分散マルチエージェントシステム



不完全情報処理



テレビゲームのサッカーと違って,プレイヤは一人一人が
独自に考えなければならない
能力やスタミナなどを考えた役割分担が必要
プレイヤはそれぞれ自分の視界を持っていて,フィールド
の一部しか観ることができない
味方同士で声をかけて情報を教えあう必要がある
実時間処理

シミュレータはプレイヤを待ってくれない.考えすぎてい
ると何もできないまま時間はどんどん過ぎていく
勝つためには何が必要か?

開発者の意図どおりに動くプログラムを作る

サッカープレイヤとしてのアクションの精度を高める



より有効な戦術を組み立てる


シミュレータの中身を知る
ライブラリを理解し,改良する
プレイヤが出来るアクションを生かすことを考える
デバッグ技術


デバッグ・調整作業を効率化する
バージョン管理を確実に行い,安定性を高める
2D サッカーシミュレータの仕組み
2D サッカーシミュレータの構造
右チームのプレイヤ
左チームのプレイヤ
rcssserver
(シミュレータ本体)
通信
通信
通信
rcssmonitor
(ビューワプログラム)
画面表示



3D サッカーシミュレータも基本的な作りは同じ
プレイヤをすべて異なるホスト(別々のパソコン)上で動かすこと
ができる

世界大会では1チームあたり 3 〜 4 台のパソコンを使用.
インターネット経由で対戦することも可能(ただし,通信速度の問
題で実現は難しい)
2D サッカーシミュレータのプレイヤ

円で表される

プレイヤごとに能力の違いが設定されている

走る速さ,ボールを蹴る上手さ,スタミナの回復量など
プレイヤの視界
プレイヤのキック可能エリア
ボール
2D サッカーシミュレータの物理モデル

それらしく動くようになっているだけで,現実世界と
は大きく異なる


特定のロボットやデバイスでしか使えない技術を作るのではなく,どんなロボットでも使えるチーム
ワーク技術を作ることが目的なので, 2D リーグでは細かい物理計算をほとんど無視している
プレイヤ・ボールの移動


プレイヤ・ボールは空中を飛びない
加速度が与えられると速度上昇



kick コマンドでボールに加速度が, dash コマンドでプレイ
ヤ自身に加速度が与えられる
加速度がなければ物体は慣性移動し,速度減衰率に応
じてスピードが落ちていく
物体同士の衝突の計算はいい加減
プレイヤが得られるセンサ情報



see : 視覚情報
hear : 聴覚情報
sense_body : その他のさまざまな情報
(see 270 ((f g r b) 39.6 26) ((g r) 34.1 19 0 -0) ((f g r t) 29.1 10 0 -0) ((f p r t) 7.9 18 0 -0) ((f r 0) 37.3 13) ((f r t 10) 31.2 0 0 -0) ((f r t 20) 27.4 -18) ((f r
b 10) 45.2 23) ((f r b 20) 53.5 29) ((b) 18.2 -13 0 -0) ((p "Oxsy" 1 goalie) 27.1 12 0 -0 135 178) ((p "Oxsy" 4) 18.2 -12 0 -0 -97 -97) ((p "Oxsy" 5) 4.5
-7 -0 0 -175 -175) ((p "Oxsy" 8) 14.9 -1 0 -0 -25 -44) ((l r) 25.3 59))
(hear 270 -11 our 6 "Rm7lSRMQG+")
(sense_body 270 (view_mode high narrow) (stamina 7327.91 0.854798 119021) (speed 0 135) (head_angle -77) (kick 11) (dash 136) (turn 238)
(say 32) (turn_neck 386) (catch 0) (move 1) (change_view 33) (arm (movable 0) (expires 0) (target 0 0) (count 0)) (focus (target l 6) (count 140))
(tackle (expires 0) (count 0)) (collision none) (foul (charged 0) (card none)))
これらのセンサ情報を使ってプレイヤは世界を認識する


情報はテキストでシミュレータから飛んでくる.カメラ,マイクなど
のデバイスは無視.画像処理・音声処理は必要ない
ほとんどライブラリにお任せで OK .より高度なこと(例えば,他
のプレイヤがどのくらい動いたかの予測)をやろうとすると工夫
が必要
プレイヤの運動モデル

rcssserver のソースを読みましょう

player.cpp が重要
シミュレータの物理モデル

rcssserver のソースを読みましょう


object.cpp を参照
移動物体の位置と速度は MPObject::_inc() で更新
される
プレイヤの主なコマンド











(dash POWER [DIR])
(turn MOMENT)
(kick POWER DIR)
(tackle DIR [FOUL])
(catch DIR)
(move X Y)
(turn_neck MOMENT)
(change_view WIDTH)
(say ”MESSAGE”)
(pointto DIST DIR)
(attentionto SIDE UNUM)
一サイクルに一コマンドしか実行できない
サッカープレイヤとして動かすには,適切
な順番でコマンドを実行することが必要
dash

player.cpp 内 Player::dash() を参照



スタミナを消費して移動
全方位移動モデルへ移行途中
体の向きを固定して移動したい場合を除いて,ライ
ブラリにお任せで OK
turn

player.cpp 内 Player::turn() を参照

慣性モーメントにより,実際の回転角度は指定した回転
角度よりも小さくなる


ライブラリに任せておけば OK
回転角度にノイズが 10% 乗る点には注意
kick モデル

player.cpp 内 Player::kick() を参照


キックの制御はライブラリに任せるべき
加速度の計算は各自で行う必要があるかもしれない
kick
tackle

player.cpp 内 Player::tackle() を参照



プレイヤのクライアントバージョンによって挙動が異なる
点に注意
バージョン 14 以降,ファウルを実行可能
今後,再びルール変更があるかもしれない

通常タックルへのイエローカード,ファウルへの一発レッ
ドカードなど
catch

player.cpp 内 Player::goalieCatch() を参照


バージョン 12 からキャッチ可能領域が縮小
バージョン 14 からヘテロゴーリー導入.キャッチ範囲が
広がる代わりに,キャッチを失敗する可能性

バックパス違反あり

対角線キャッチを使おう
turn_neck

player.cpp 内 Player::turn_neck() を参照



コマンド到達直後に首の角度が変わるわけではない
チーム開発時,首が向けられる範囲を考えて首振り
をプランニングしなければならない
実は,首振りを効率良く行わせるのはとても難しい
change_view

player.cpp 内 Player::change_view(),
visualsenderplayer.cpp 内
VisualSenderPlayerV1::sendVisual() などを参照


視界の広さと視覚情報頻度のトレードオフ
コマンド到達直後に視界の広さが変わる


ただし,最近はあまり意識しなくてよい
turn_neck と合わせて効率の良い情報収集を行う
ためには,不可欠
say, attentionto

聴覚情報配信の実装は audio.cpp を参照




しかし,実装がやや複雑なのであまり読まなくてもいい
プレイヤは一サイクルに一メッセージしか聞けない
attentionto で優先してメッセージを聞くプレイヤを選択
する
コミュニケーションを効率よく行うのはとても難しい

資源配分問題
pointto

player.{h,cpp}, arm.h を参照



視覚的コミュニケーション
コマンドそのものがやや使いにくい
まだあまり有効活用されていない
ヘテロジーニアスプレイヤ

プレイヤは一人一人の能力が異なる

rcssserver 起動時にランダムに 18 種類を生成

割り当てはコーチが試合開始前に行う

パラメータの種類とトレードオフは playerparam.
{h,cpp}, heteroplayer.{h,cpp} を参照
コーチエージェント

敵チームのモデリングと適応のためのエージェント

プレイヤと違い,ほぼ完全情報

コーチ言語

本来の目的のためには,まだあまり有効活用されて
いない


プレイヤ交代と敵チームのヘテロ分析
マークの割り当て分析には使われている
Keepaway モード

少人数でのボールの奪い合い

強化学習のテストベッドとして提案
2D サッカーシミュレータの設定
http://rctools.sourceforge.jp/pukiwiki/ドキュメント/シミュレータの設定変更
agent2d を使ったチーム開発
内容

フォーメーションの作り方

ポジショニングの修正方法

探索型エージェントの使い方

soccerwindow2 を使ったデバッグ方法

新しいアクション・役割の追加方法
配布物

librcsc : ライブラリ

agent2d : ベースチーム

soccerwindow2 : 高機能ビューワ

fedit2 : フォーメーションエディタ
librcsc の構造
librcsc は名前空間 rcsc の中で宣言・定義されている















rcsc/action : プレイヤの基本行動クラス群
rcsc/ann : 汎用ニューラルネットライブラリ
rcsc/coach : コーチエージェント
rcsc/common : 共通モジュール
rcsc/formation : フォーメーション管理用クラスライブラリ
rcsc/geom : 幾何計算クラスライブラリ
rcsc/gz : gzip ライブラリ
rcsc/monitor : モニタクライアント
rcsc/net : 通信ライブラリ
rcsc/param : コマンドライン,設定ファイル,サーバパラメータなどの読み込み
rcsc/player : プレイヤエージェント
rcsc/rcg : rcg ファイル解析用ライブラリ
rcsc/time : タイマーなど
rcsc/trainer : トレーナエージェント
rcsc/util : その他
フォーメーションの作り方
フォーメーションの作り方


librcsc,agent2d に組み込みのフォーメーションシ
ステムを利用する
フォーメーションエディタ fedit2 を使って編集
フォーメーションシステムの原理

Delaunay 三角形分割+線形補間


入力された頂点に基づいて領域を三角形に分割
三角形の各頂点が持つ出力値を線形補間
Delaunay 三角形分割



平面上の点集合 P の三角形分割 T を構成した場合に, T に含まれる任意の三角形の外
接円がその内部に P の点を含まない分割
各三角形の最小の内角を最大にする(三角形をなるべく細長くしない)という特徴を持
つ
一意に求められる. O(n log(n)) のアルゴリズムが存在
線形補間

3DCD におけるグローシェーディングと同じアルゴ
リズム
P
a
m2
B
n2
Pb
m1
I
n1
Pc
fedit2

agent2d 用のフォーメーションエディタ

GUI でのサンプルデータ編集

現在のフォーメーションを視覚的に確認

ボールを画面上でドラッグしてプレイヤ配置を確認

2 つのフォーメーションを同時に表示可能
fedit2 の機能
サンプルの一覧
サンプル位置の確認
三角形分割の確認
現在のフォーメーションの
確認
fedit2 の起動方法
$ fedit2 [FORMATION_CONF [REFERENCE_CONF]]
例: normal-formation.conf を参照データとして, offense-formation.conf を
$編集
fedit2 offense-formation.conf normal-formation.conf
その他オプションは” --help” オプションで確認可能
fedit2 の操作方法

右クリック: ボールのドロップ

左ドラッグ: オブジェクトの移動

Ctrl+ 左ドラッグ : スクロール

マウスホイール: サンプルデータ選択

その他ショートカットはメニューから確認可能
fedit2 の操作方法
シンメトリーモード
役割が左右対称なプレイヤを自動
的に動かす , 編集する
追加ボタン
新しいサンプルデータを末尾に
追加する
Y 座標反転
ボール,プレイヤを含めてすべてのオ
ブジェクトの Y 座標値を反転する
上書き保存
インデックス選択
現在選択中のサンプルデータ
のインデックス番号
挿入実行ボタン
削除
現在選択中のサンプ
ルデータを削除する
プレイヤの自動再配置
ボールは動かすがプレイヤは動か
さない場合に off にする
置換実行ボタン
現在選択注のサンプルデータ
を,画面表示の値に置き換える
学習実行ボタン
使わない
新しいサンプルデータを,現在
選択中のサンプルデータの次
に追加する
conf ファイルのフォーマット
Formation DelaunayTriangulation 2
Begin Roles
1 Goalie 0
2 CenterBack -1
3 CenterBack 2
4 SideBack -1
5 SideBack 4
6 DefensiveHalf 0
7 OffensiveHalf -1
8 OffensiveHalf 7
9 SideForward -1
10 SideForward 9
11 CenterForward 0
End Roles
Begin Samples 2 115
----- 0 ----Ball 54.5 -36
1 -50 0
2 -0.72 -12
3 -0.84 1.08
4 4.9 -27.3
5 10 8
6 27.43 -16.5
7 33.12 -27
8 38.22 -3.5
9 44.22 -30.85
10 46 6.8
11 46.28 -14
----- 1 ----Ball 54.5 36
1 -50 -0
2 -0.84 -1.08
3 -0.72 12
4 10 -8
5 4.9 27.3
6 27.43 16.5
7 38.22 3.5
8 33.12 27
9 46 -6.8
10 44.22 30.85
11 46.28 14
----- 2 ----…
ヘッダ
役割配分
サンプルデータセット
フォーメーション作成で意識すべきこと

ボールの移動経路を想定して配置する




誰かがボールを持った状況を想定する
パス回しの三角形を維持する
プレイヤの移動量を抑える
経験的に,パフォーマンスが高いフォーメーションは
以下のような傾向がある



サンプルデータは 100 個程度
ボール位置はフィールド全体にほぼ一様に分布
敵陣自陣を問わず,ペナルティエリア周辺は他よりもサ
ンプルデータの密度が高い.プレイヤの密度も高い
ポジショニングの修正方法
ポジショニング


各 Role クラスの doMove() 関数が移動動作の実
装
agent2d では Bhv_BasicMove が実行される


ボールを追いかける場面でなければ,フォーメーションを
維持しようとするのみ
状況に応じたポジショニングは実装されていないので,
まずは状況に応じて目標位置を変更してみる
目標位置の変更

Bhv_BasicMove::execute() 内の target_point
などを変更すれば良い
bhv_basic_move.cpp の 93 行目付近
目標位置
const Vector2D target_point = Strategy::i().getPosition( wm.self().unum() );
const double dash_power = Strategy::get_normal_dash_power( wm );
double dist_thr = wm.ball().distFromSelf() * 0.1;
if ( dist_thr < 1.0 ) dist_thr = 1.0;
目標位置との
許容誤差
dash コマンドで
使用するパワー
(=走るスピード)
移動アクション

Body_GoToPoint

指定位置へ移動するアクションクラス


全方位移動にも少しだけ対応
最低限,目標位置,許容誤差,ダッシュパワーが必要
他に,ダッシュスピード,必要サイクル数,リカバリー維持,
ダッシュ方向の許容誤差,を指定できる.


目標位置との距離が許容誤差以下であれば, execute
関数が false を返す
bhv_basic_move.cpp の 108 行目付近
If ( ! Bhv_GoToPoint( target_point, dist_thr, dash_power
).execute( agent ) )
{
Body_TurnToBall().execute( agent );
}
目標位置へ到達したので
ボールの方へ向く
新しいアクション・役割の追加方法
アクションクラスの設計

すべて, AbstractAction からの派生クラス



仮想関数 bool execute( PlayerAgent * agent ) を実装する
実際には,以下の各タイプからの派生クラスを作る
複数のタイプ





BodyAction : メインコマンド用( kick,dash,turn など)
NeckAction : turn_neck 専用
ViewAction : change_view 専用
ArmAction : pointto 専用
SoccerBehavior : 上記 4 タイプの同時使用
ただし,各タイプでコマンドの使用が制限されているわけで
は無い.
使い分けは開発者が実装時に注意しなければない.
アクションクラスのサンプル

librcsc-x.x.x/rcsc/action/ 以下を参照

ファイル名,クラス名ともに以下の命名規則





Body_XXX : BodyAction 派生
Neck_XXX : NeckAction 派生
View_XXX : ViewAction 派生
Arm_XXX : ArmAction 派生
Bhv_XXX : SoccerBehavior 派生
役割クラスの設計

すべて, SoccerRole からの派生クラス

新規に役割を追加するには以下の準備が必要



static 関数 SoccerRole::Ptr create() を用意
仮想関数 bool execute( PlayerAgent * agent ) を実装する
strategy.cpp で役割クラスの create() 関数を登録する
(Strategy クラスのコンストラクタを参照 )
Makefile の再生成

新規アクション・役割をコンパイルできるようにする
には,以下の手順が必要




Makefile.am の編集
bootstrap の実行
configure の実行
make
$ cd agent2d-x.x.x
$ ./bootstrap
$ ./configure
$ make
Makefile.am の編集

GNU automake の入力ファイル

Makefile を自動生成するための元ファイル
agent2d-3.0.0/src/Makefile.am
PLAYERSOURCES = \
bhv_basic_move.cpp \
bhv_basic_offensive_kick.cpp \
bhv_basic_tackle.cpp \
bhv_custom_before_kick_off.cpp \
bhv_go_to_static_ball.cpp \
bhv_goalie_basic_move.cpp \
bhv_goalie_chase_ball.cpp \
bhv_goalie_free_kick.cpp \
bhv_prepare_set_play_kick.cpp \
bhv_set_play.cpp \
bhv_set_play_free_kick.cpp \
…
PLAYERHEADERS = \
bhv_basic_move.h \
bhv_basic_offensive_kick.h \
bhv_basic_tackle.h \
bhv_custom_before_kick_off.h \
bhv_go_to_static_ball.h \
bhv_goalie_basic_move.h \
bhv_goalie_chase_ball.h \
bhv_goalie_free_kick.h \
bhv_prepare_set_play_kick.h \
bhv_set_play.h \
bhv_set_play_free_kick.h \
...
bhv_test_kick.{h,cpp} を追
加 PLAYERSOURCES = \
bhv_basic_move.cpp \
bhv_basic_offensive_kick.cpp \
bhv_basic_tackle.cpp \
bhv_custom_before_kick_off.cpp \
bhv_go_to_static_ball.cpp \
bhv_goalie_basic_move.cpp \
bhv_goalie_chase_ball.cpp \
bhv_goalie_free_kick.cpp \
bhv_prepare_set_play_kick.cpp \
bhv_test_kick.cpp \
bhv_set_play.cpp \
bhv_set_play_free_kick.cpp \
…
PLAYERHEADERS = \
bhv_basic_move.h \
bhv_basic_offensive_kick.h \
bhv_basic_tackle.h \
bhv_custom_before_kick_off.h \
bhv_go_to_static_ball.h \
bhv_goalie_basic_move.h \
bhv_goalie_chase_ball.h \
bhv_goalie_free_kick.h \
bhv_prepare_set_play_kick.h \
bhv_test_kick.h \
bhv_set_play.h \
bhv_set_play_free_kick.h \
...
bootstrap, configure

bootstrap



中身は ” autoreconf -i -f” (このコマンドを直接実行しても OK )
configure.ac から configure を, Makefile.am から
Makefile.in を生成する
configure


環境のチェック
Makefile.in から Makefile を生成する
探索型エージェントの使い方
探索型エージェントの構造
WorldModel
ActionChainHolder
ActionChainGraph
FieldEvaluator
ActionGenerator
ActionStatePair
CooperativeAction
Bhv_ChainAction
PredictState
アクション生成器

ActionGenerator の派生クラス

仮想関数


を定義する
WorldModel,PredictState を入力とし, ActionStatePair
のリストを返す
ActGen_XXX が実際に使用される派生クラス


void generate( … )
自分で独自のジェネレータを作ることもできる
探索の深さに応じて使い分ける必要がある


例えば,深さ 1 では厳密計算, 2 以上では簡易計算
SamplePlayer::createActionGenerator() では,
actgen_action_chain_length_filter.h で定義されているフィルタ
を使って適用する深さを切り替えている
アクション生成器関連クラス


CooperativeAction

抽象化されたアクションクラス

アクションの種類,開始位置,目標位置,ボールの初速度などを保持
PredictState


ActionStatePair


CooperativeAction とそのアクション実行後の PredictState のペア
ActionChainGraph


アクション実行後の予測状態
探索木( ActionStatePair のツリー)の生成と評価を実行
Bhv_ChainAction

CooperativeAction からコマンドを生成
アクション連鎖探索の設定変更

agent2d のデフォルト実装では,深さ 1 の探索しか
実行しない


深さ 2 以上のアクション生成器が登録されていない
SamplePlayer::createActionGenerator() でコメント
アウトされている部分を有効にすると,深さ 2 以上の探
索を実行するようになる
ActionGenerator::ConstPtr
SamplePlayer::createActionGenerator() const
{
...
//
// direct pass
//
// g->addGenerator( new ActGen_RangeActionChainLengthFilter
//
( new ActGen_DirectPass(),
//
2, ActGen_RangeActionChainLengthFilter::MAX ) );
ActionGenerator::ConstPtr
SamplePlayer::createActionGenerator() const
{
...
//
// direct pass
//
g->addGenerator( new ActGen_RangeActionChainLengthFilter
( new ActGen_DirectPass(),
2, ActGen_RangeActionChainLengthFilter::MAX ) );
//
// simple dribble
//
// g->addGenerator( new ActGen_RangeActionChainLengthFilter
//
( new ActGen_SimpleDribble(),
//
2, ActGen_RangeActionChainLengthFilter::MAX ) );
//
// simple dribble
//
g->addGenerator( new ActGen_RangeActionChainLengthFilter
( new ActGen_SimpleDribble(),
2, ActGen_RangeActionChainLengthFilter::MAX ) );
return ActionGenerator::ConstPtr( g );
}
return ActionGenerator::ConstPtr( g );
}
評価関数の設計

FieldEvaluator の派生クラス

仮想関数
double operator()( const PredictState &, std::vector< ActionStatePair > & ) const
を実装する



がファクトリメソッドなので,別
の評価関数を試すときはこの関数の返り値を変更する
SamplePlayer::createFeildEvaluator()
agent2d-3.1.0 では,ボールキック時の意思決定
にのみ影響
まずは, agent2d の sample_field_evaluator.{h,cpp}
を触ってみると良い

例えば,敵ゴールとの距離が近いほど良い評価にする,
など
soccerwindow2 を使った
デバッグ方法
提供されるデバッグ機能

オンラインデバッグサーバ


デバッグログファイルによるオフラインデバッグ


プレイヤのプロセス実行中の簡易デバッグ用
プレイヤのプロセス終了後の詳細デバッグ用
オフラインクライアントモード


プレイヤのプロセス終了後の詳細デバッグ用
センサ情報を記録しておき,まったく同じ状態を再現
オンラインデバッグサーバによる内部状態
の表示
簡易デバッグメッセージ
WorldModel の重ね合わせ
基本的な図形描画
デバッグログファイルによるオフライン詳細
デバッグ
対象プレイヤの選択
デバッグログファイル
のオープン (Ctrl-O)
デバッグレベルの選択
サイクル選択
文字列検索
描画対象の選択
デバッグモードでの起動方法

soccerwindow2 の起動オプション
$ soccerwindow2 --debug-server-mode
または
$ soccerwindow2 -d
または, soccerwindow2 起動後にメニューから
「 Debug 」→「 Start/Stop the debug server 」

agent2d の起動オプション例
$ ./start.sh –debug-server-connect
デバッグサーバへ接続
$ ./start.sh --debug --debug-server-connect
デバッグログを記録 & デバッグサーバへ接続
$ ./start.sh --offline-logging –debug-server-connect
オフラインクライアントのためのセンサ情報を記録
& デバッグサーバへ接続
$ ./start.sh –offline-client-mode --debug –debug-server-logging
オフラインクライアントモード & デバッグログを記録
& デバッグサーバ用のログを記録
ログファイルの種類

*.rcg : rcssserver が記録するログプレイヤ用のログファイル

*.rcl : rcssserver が記録するコマンドログファイル

*.log : agent2d が記録する詳細デバッグログ. soccerwindow2 が使用す
る. Debug Message ウインドウで開かれるログの実体

*.dcl :デバッグサーバへ送信するメッセージを記録したログファイ
ル. soccerwindow2 がオフラインクライアントモードで使用する.メインウインドウ
のメニュー「 File 」→「 Open debug view 」から開く

*.ocl :センサ情報をそのまま記録したファイル. agent2d がオフラインクライア
ントモードで実行された場合に使用される
典型的な手順
1.rcssserver と soccerwindow2 をデバッグサーバ
モードで起動
2.agent2d を実行
$ ./start.sh --offline-logging --debug-server-connect
3.rcssserver のみ停止
$ killall rcssserver
4.agent2d を再実行
$ ./start.sh --offline-client-mode --debug --debug-server-logging
5.soccerwindow2 でデバッグログオープン
デフォルト設定では, /tmp 以下に各種ログファイルが記録されている
おすすめの設定

RAMDISK の利用


詳細デバッグでファイルに書き出す情報量が多いと,
ディスクのパフォーマンスの影響を受けてしまう
メモリに余裕があれば, RAMDISK を作ってメモリに書
き出すようにすれば高速化できる
以下の一行を /etc/fstab に追加して再起動
物理メモリの容量に合わせてサイズを設定する
agent2d を 3000 サイクル実行する場合, 1GB 程度あれば十分
tmpfs
/tmp
tmpfs
defaults,size=2g 0
0
新しいアクション・役割の追加方法
アクションクラスの設計

すべて, AbstractAction からの派生クラス



仮想関数 bool execute( PlayerAgent * agent ) を実装する
実際には,以下の各タイプからの派生クラスを作る
複数のタイプ





BodyAction : メインコマンド用( kick,dash,turn など)
NeckAction : turn_neck 専用
ViewAction : change_view 専用
ArmAction : pointto 専用
SoccerBehavior : 上記 4 タイプの同時使用
ただし,各タイプでコマンドの使用が制限されているわけで
は無い.
使い分けは開発者が実装時に注意しなければない.
アクションクラスのサンプル

librcsc-x.x.x/rcsc/action/ 以下を参照

ファイル名,クラス名ともに以下の命名規則





Body_XXX : BodyAction 派生
Neck_XXX : NeckAction 派生
View_XXX : ViewAction 派生
Arm_XXX : ArmAction 派生
Bhv_XXX : SoccerBehavior 派生
役割クラスの設計

すべて, SoccerRole からの派生クラス

新規に役割を追加するには以下の準備が必要



static 関数 SoccerRole::Ptr create() を用意
仮想関数 bool execute( PlayerAgent * agent ) を実装する
strategy.cpp で役割クラスの create() 関数を登録する
(Strategy クラスのコンストラクタを参照 )
Makefile の再生成

新規アクション・役割をコンパイルできるようにする
には,以下の手順が必要




Makefile.am の編集
bootstrap の実行
configure の実行
make
$ cd agent2d-x.x.x
$ ./bootstrap
$ ./configure
$ make
Makefile.am の編集

GNU automake の入力ファイル

Makefile を自動生成するための元ファイル
agent2d-3.0.0/src/Makefile.am
PLAYERSOURCES = \
bhv_basic_move.cpp \
bhv_basic_offensive_kick.cpp \
bhv_basic_tackle.cpp \
bhv_custom_before_kick_off.cpp \
bhv_go_to_static_ball.cpp \
bhv_goalie_basic_move.cpp \
bhv_goalie_chase_ball.cpp \
bhv_goalie_free_kick.cpp \
bhv_prepare_set_play_kick.cpp \
bhv_set_play.cpp \
bhv_set_play_free_kick.cpp \
…
PLAYERHEADERS = \
bhv_basic_move.h \
bhv_basic_offensive_kick.h \
bhv_basic_tackle.h \
bhv_custom_before_kick_off.h \
bhv_go_to_static_ball.h \
bhv_goalie_basic_move.h \
bhv_goalie_chase_ball.h \
bhv_goalie_free_kick.h \
bhv_prepare_set_play_kick.h \
bhv_set_play.h \
bhv_set_play_free_kick.h \
...
bhv_test_kick.{h,cpp} を追
加 PLAYERSOURCES = \
bhv_basic_move.cpp \
bhv_basic_offensive_kick.cpp \
bhv_basic_tackle.cpp \
bhv_custom_before_kick_off.cpp \
bhv_go_to_static_ball.cpp \
bhv_goalie_basic_move.cpp \
bhv_goalie_chase_ball.cpp \
bhv_goalie_free_kick.cpp \
bhv_prepare_set_play_kick.cpp \
bhv_test_kick.cpp \
bhv_set_play.cpp \
bhv_set_play_free_kick.cpp \
…
PLAYERHEADERS = \
bhv_basic_move.h \
bhv_basic_offensive_kick.h \
bhv_basic_tackle.h \
bhv_custom_before_kick_off.h \
bhv_go_to_static_ball.h \
bhv_goalie_basic_move.h \
bhv_goalie_chase_ball.h \
bhv_goalie_free_kick.h \
bhv_prepare_set_play_kick.h \
bhv_test_kick.h \
bhv_set_play.h \
bhv_set_play_free_kick.h \
...
bootstrap, configure

bootstrap



中身は ” autoreconf -i -f” (このコマンドを直接実行しても OK )
configure.ac から configure を, Makefile.am から
Makefile.in を生成する
configure


環境のチェック
Makefile.in から Makefile を生成する
コーディング大会

即席 OZ で対戦


OZ とは,一体一体を異なる開発者が担当するチー
ム
人数的には 2 〜 3 チーム?