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 チーム?
© Copyright 2024 Paperzz