RoboCup Soccer Server 3D Manual †ここは,RoboCup Soccer Server 3D Manualの日本語訳に関するページです. システムの概要 †はじめるにあたって,システムの構成要素についてある程度精通しておくべきである.サッカーシミュレーションは3つの重要な部分(サーバ,モニタとエージェント)から構成される. サーバ †サーバを動かすために,SPADESシミュレーションミドルウエアについて精通しておくべきである.知っておくべきいくつかの重要な概念として以下がある.サーバはエージェントのプロセスを開始する責任がある.すなわち,2Dシミュレーションではエージェントの接続を待機するが,3Dシミュレーションでは待機しない.SPADESライブラリは,様々なエージェントタイプの開始方法に関する情報を含むデータベースを用いる.それはagentdb.xmlと呼ばれており,ディレクトリ ./app/simulator/にある. モニタ †初期モニタはrcssmonitor3D-liteと呼ばれており,ディレクトリ ./app/rcssmonitor3d/liteにある.それはサーバが自動的に生成するログファイルを再生するためにも用いられる(--logfile<filename>オプションを使う).自動的に生成されるログファイルは`monitor.log`と呼ばれている.サーバを開始したディレクトリ下のディレクトリ Logfiles/にある.2004 RoboCupのログファイルのセットが[?]*1で見つけられる. サッカシミュレーション †サッカチーム †チームは複数の等しい能力を持つロボットで構成される.チームを生成するために書いたプログラムは,ロボットに与えられている(仮想の)低レベルコントロールシステムとデータを交換する.ロボットのパーセプタとエフェクタの両方がS式と共に動作する.この文法は,2Dサッカーシミュレータからすでに知っているでしょうし,そうでなければ,お気に入りのプログラミング言語からご存知でしょう. 環境 †環境とあなたの新しいロボットの技術的データは以下のようになっている: プレーヤ †シミュレータの現在のバージョンでは,ロボットは(来年に,さらに洗練された表現にいきつくまでは)球体として表現される.全てのロボットの直径は0.44メートルであり,重さは75kgである. Createエフェクタ †初めにシミュレータに接続するとき,あなたのエージェントはなんの物理的表現もない.エージェントが持っている唯一のものは“Createエフェクタ”である.Createエフェクタの概念は,様々なエフェクタとパーセプタとロボットタイプを要求することである.現在,たった1つの用意されたロボットタイプがあるだけであり,Createエフェクタは全てのパラメータを無視する.当面は,初めに“( create )”を実行し,デフォルトのロボットタイプを得る. コマンドの例: ( create ) Initエフェクタ †チームの名前とユニフォームナンバを設定するために,Initエフェクタを用いなければならない.初期化しなければ,エフェクタとパーセプタは適切に動かない. 文法: ( init (unum <number> ) ( teamname <string> ) ) 例: ( init (unum 7 ) ( teamname RoboLog ) ) Beamエフェクタ †kickエフェクタと同様に,初期の計画には,2Dサッカーサーバの“move”コマンドのような,ある場所から別の場所へエージェントを“beaming”するといった人為的行動の導入はなかった.未だに,計画では,beamingがエフェクタセットから消滅するように,サッカーシミュレーションを開発することになっている. 文法: ( beam <x> <y> <z> ) 例: ( beam -6.6 0 0 ) Driveエフェクタ †エージェントの全方位駆動装置を動かすために,いわゆるDriveエフェクタを用いなければならない.それは,最大の長さ100ユニットのデカルト座標上のベクトル* (x, y ,z) を持つ*4.x軸はフィールドの敵側を指し,z軸は上を指す.Driveエフェクタを使ってモータの力を設定する.すなわち,もし,しばらくフルスピードで動かしたいなら,Driveエフェクタを“一度だけ”使えば十分である.設定した力は再び変更するまで各シミュレータステップで適用される.Driveエフェクタは確実に働き,それぞれの軸毎に,力に対する誤差がある(各軸の適用された力の2%以内).誤差は0.0を中心とする正規分布である. 文法: ( drive <x> <y> <z> ) 例: ( drive 20.0 50.0 0.0 ) Kickエフェクタ †ボールを動かすために,ボールを望ましい方向に押すようにロボットを使う単純なオプションがある.または,ボールをキックするためにkickエフェクタを用いることが出来る.元々は,人為的kickエフェクタを生成するつもりはなかった.しかしながら,3番目の次元を使用するために,これは最も容易な方法である.本年度のコンペティションではない,将来のバージョンにおいてこの種のkickエフェクタを取り除き,実際の物理デバイスを支持するつもりである.
文法: ( kick <angle> <power> ) 例: ( kick 20.0 80.0 ) Visionパーセプタ †ロボットは賢い画像処理ソフトウエアが備えられた特別な全方位カメラを保持する.ロボットは360度の視界がある*5.Visionパーセプタは見えたオブジェクトのリストを供給する.ここで,オブジェクトと,ロボット,ボールまたはフィールド上のマーカである.現在フィールド上に8つのマーカがあり,フィールドの各コーナに1つ,各ゴールポストに1つある.
2Dサッカーシミュレーションと違って,視覚システムはオブジェクトの速度を提供しない.オブジェクトは他のオブジェクトにより見えなくなるかもしれない(これはまだ完全に実装されていない).すべての距離と角度はカメラの位置と相対的に与えられる.カメラは現在ロボット球体の中心に位置している.
文法: ( vision ( <Type> ( team <teamname> ) ( id <id> )~ ( pol <distance> <horizontal angle> <latitudal angle> ) ) ) とりうる値は以下である:
視覚出力の例: (Vision (Flag (id 1_l) (pol 54.3137 -148.083 -0.152227)) (Flag (id2_l) (pol 59.4273 141.046 -0.131907)) (Flag (id 1_r) (pol 61.9718-27.4136 -0.123048)) (Flag (id 2_r) (pol 66.4986 34.3644 -0.108964))(Goal (id 1_l) (pol 46.1688 179.18 -0.193898)) (Goal (id 2_l) (pol46.8624 170.182 -0.189786)) (Goal (id 1_r) (pol 54.9749 0.874504-0.149385)) (Goal (id 2_r) (pol 55.5585 8.45381 -0.146933)) (Ball (pol6.2928 45.0858 -0.94987)) (Player (team robolog) (id 1) (pol 7.3364337.5782 5.86774))) Sayエフェクタ †他のプレーヤにメッセージを送信するために,Sayエフェクタを用いなければならない.メッセージはsayMsgSize?文字の長さ(当面は512)である.ここで,sayメッセージに対して有効な文字はスペースと()を除いた表示文字*7である.プレーヤが言うメッセージは両方のチームのメンバからaudioCutDist?(当面は50)の範囲内で聞くことが出来る 文法: ( say <message> ) 例: ( say player10_pass ) Hearパーセプタ †プレーヤがSayエフェクタを用いてメッセージを送るとき,パーセプタから知覚を得る.サーバ*8からの実際のセンサメッセージのフォーマットは以下になる: ( hear <time> <direction in degree> <message> )
Hearパーセプタに影響を与えるサーバのパラメータは以下である:
聴力が少なくともhearDecayであるならば,プレーヤはメッセージを聞くことが出来る.というのは,メッセージが聞こえたとき,hearDecayだけ聴力は減少するからである.毎サイクルにおいて,聴力はhearIncだけ増加する.最大聴力はhearMaxである.チャンネルに負担を掛けて他のチームのコミュニケーションを使用不可にすることからチームを避けるために,プレーヤは各チームに対して別々の聴力を持っている.現在の値では,1知覚更新おきに,各チームからせいぜい1つのメッセージしか聞けないということを意味する. Hear出力の例: (hear 0.8 -179.99 Test_1) (hear 0.4 self Test_2) GameState?パーセプタ †GameState?パーセプタはゲームの現在の状態について教えてくれる.このパーセプタから得られる最初の知覚は,ボールの重さやフィールドのサイズなどのようなものがくる.ゲームの変数についてである. 文法: (GameState (<Name> <Value>) ...)
利用可能なプレイモードは, BeforeKickOff, KickOff Left, KickOff Right, PlayOn, KickIn Left, KickIn Right, corner kick left, corner kick right, goal kick left, goal kick right, offside left, offside right, GameOver, Goal Left, Goal Right, free kick left, free kick right, unknown. 全てのプレイモードの最新のリストについては,./plugin/soccer/soccertypes.hを参照すること. GameState出力の例: (GameState (time 0) (playmode BeforeKickOff)) AgentState?パーセプタ †AgentState?パーセプタはエージェントの現在の状態を教えてくれる.今現在はバッテリレベルと温度である. 文法: (AgentState (battery <battery level in percent>) (temp <temperature in degree>) ) AgentState出力の例: (AgentState (battery 100) (temp 23)) モニタとトレーナプロトコル †サッカーシミュレーションに対するデフォルトのモニタポートは12001である.サーバは定期的にS式を含むテキストをあなたに送信する.モニタに送られた全ての式の記録されたシークエンスを含むモニタログファイルは,ログファイルフォーマットとして後で用いられる.サーバディレクトリを起点として,Logfiles/monitor.logに自動的に生成される. Init式 †初めに1つのInit 式が送られる.init 式の例が下記で与えられている.サーバからは1行のS式が送られる事に注意しなさい.それらは,読みやすさのために,ここでは再フォーマットされている. (Init (FieldLength 104) (FieldWidth 68) (FieldHeight 40)(GoalWidth 32)(GoalDepth 2) (GoalHeight 0.5) (BorderSize 10) (FreeKickDistance 9.15) (WaitBeforeKickOff 2) (AgentMass 75) (AgentRadius 0.22) (AgentMaxSpeed 10) (BallRadius 0.111) (BallMass 0.425878) (RuleGoalPauseTime 3) (RuleKickInPauseTime 1)(RuleHalfTime 300) (play_modes BeforeKickOff KickOff_Left KickOff_Right PlayOn KickIn_Left KickIn Right corner_kick_left corner_kick_right goal_kick_left goal_kick_right offside_left offside_right GameOver Goal_Left Goal_Right free_kick_left free_kick_right) ) init 式のそれぞれの部分式は,シミュレーションの現在のインスタンスが用いるある1つのパラメータを与える名前−値の組である.様々なパラメータの意味は以下の通りである:
Info式 †初期initメッセージが送信された後はInfo 式のみが送信される.これらの式は現在のシミュレーションの全ての状態を含んでいる.Info式の例が以下で与えられている: (Info (time 0)(half 1)(score_left 0)(score_right 0)(play_mode 0) (P(pos 0 0 0)) (P (pos 0 0 0))(P (pos 0 0 0))(P (pos 0 0 0)) (P (pos 0 0 0))(P (pos 0 0 0))(P (pos 0 0 0))(P (pos 0 0 0)) (P (pos 0 0 0))(P (pos 0 0 0))(F (id 1_l)(pos -52 -34 0)) (F (id 2_l)(pos -52 34 0))(F (id 1_r)(pos 52 -34 0))(F (id 2_r)(pos 52 34 0)) (G (id 1_l)(pos -52 -3.66 0))(G (id 2_l)(pos -52 3.66 0)) (G (id 1_r) (pos 52 -3.66 0))(G (id 2_r)(pos 52 3.66 0)) (B (pos 0 0 10)) ) Info 式の各部分式は,現在のシミュレーションの状態のある側面についての情報を含んでいる名前−値の組である.すべての部分式が繰り返し送られるわけではない.これはフィールドのフラグの位置と2つのチームの名前に関係している.この情報は一度だけ送信される.スコアカウントのような更にゲーム状態の情報と現在のゲームの状態は,それらが変化したときのみに送信される.様々な式の意味は以下の通りである:
モニタコマンドパーサ †接続されたモニタは,更にモニタ接続を用いてサーバへS式としてコマンドを送信することが出来る.これらのコマンドにより,接続されたモニタは現在のプレイモードを設定することができ,またフィールド上の任意の位置へプレーヤとボールを動かすことが出来る.これはトレーナクライアントの実装を許可する.
例: ((kickOff)(getAck kicked_off)) シーン記述言語 †Sparkは管理されたシーングラフを利用する方法をいくつか与える.内部のC++インターフェースとRubyスクリプト言語による外部アクセスに加えて,シーン記述言語に対する拡張性のある機構が実装されている.これは,シーンの手続的なセットアップと記述ベースのセットアップの両方を可能とする. RubySceneGraph? language †現在,一つのS式に基づくインポータが実装されている.この参照言語はRubySceneGraph? と呼ばれている.これは,シーングラフ構造をLispに似たS式の入れ子へと変換する. character -> ”A” | … | ”Z” | ”1” | … | ”9”, atom -> character+ list -> ”(” s_expression* ”)” s_expression -> atom | list Listing 1: EBNF notation of s-expression
意味に関して,RubySceneGraph?インタプリタは特別なアトムの集合を認識する.各部分式における最初のアトムは,そのタイプを決定する.キーワードの集合は,インタプリタが5つの異なる式タイプを区別することを可能とする4つのアトムから構成される.
上記で記載された様々な式タイプに加えて,置換機構が実装されている.ドル記号で始まるすべてのアトムリテラルはテンプレートパラメータとして解釈され,実際の値で置き換えられる. ファイル構造 †Rubyシーンファイルのトップレベルは,二つのS式から構成される.最初の式はヘッダ式でなければならない.ヘッダ式はパーサがファイルタイプを確認し,用いられている言語のバージョンに関する情報を得ることを可能にする. ; the header expression (RubySceneGraph 0 1) ( ; the body of the file starts here ; declare this file as a template (template $lenX $lenY $lenZ $density $material) ; declare the top level scene graph node (node Box ; children of the top level node go here (node DragController ) ) ) Listing 2: File Structure
ノード式 †シーングラフはオブジェクトインスタンスノードの木から構成される.シーングラフにおける各ノードは式 (node <ClassName?>)を用いて宣言される.引数ClassName?はZeitgeistクラスファクトリに登録されたクラスの名前を与える. シーングラフテンプレート †シーン記述言語はさらに,マクロのような方法でシーングラフの部品の再利用を可能とする.これは,あらかじめ定義された一部のシーンもしくは完全なエージェントの記述のレポジトリを生成することを可能とする.マクロの概念は 式(importScene <filename> <parameter>*)を用いて利用可能である.この式は,システムのインポータ機能を再帰的に呼び出す.その式は,最も内側で囲んでいるノード式を相対的なルートノードとみなし,与えられたファイル内で記述されたシーングラフを組み込む. (RubySceneGraph 0 1) ( (node Transform (importScene box.rsg 1 3 0.8 10 matRed) ) (node Transform (importScene box.rsg 2 4 0.4 8 matBlue) ) ) Listing 3: importScene example
メソッドコール †上述のノード式を用いて生成されたノードは,デフォルトの性質を修正するためにメソッドコールを用いてさらにパラメータ化される.上で記述された式タイプに一致しない全ての式は,メソッドコールとして解釈される.それは,関数の名前で始まり,任意のパラメータリストが続くS式として解釈される (<method name> <parameter>*).
各メソッドコールは最も内側で囲まれたノード式の文脈で評価される.メソッドコールの意味は,対応するC++クラスのRuby記述インターフェース,つまりこの言語の名前を呼び出す. (RubySceneGraph 0 1) ( (node Transform (setLocalPos 10 20 5) (node Box (setExtents 1 1 1) ) ) ) Listing 4: Method call example
言語リファレンス †このセクションで,私たちは最も代表的なノードタイプとそれらのもっとも重要なメソッドを記載する.ただし,完全なリファレンスはとても大規模なものとなるだろうし,シミュレータは常に拡張されているので,完成することはないだろう. BaseNode? †BaseNode?タイプは全てのシーングラフノードに対する親クラスである.以下のメソッドが利用可能である:
Transform †Transformノードタイプは,対応する最も近い親変換ノードに対する子ノードの位置と方向を決定する.
SingleMatNode? †SingleMatNode?は一つの物体の特性を用いたオブジェクト(例えば,軸,箱,球,capped cylinder)を表示する全てのノードに対する抽象親クラスである.以下のメソッドが利用可能である:
Axis †Axisノードは色つきの直行線を用いて座標軸を表示するSingleMatNode?である.デフォルトで,単位長さの線を描く.以下のメソッドが利用可能である:
Box †Boxノードは与えられた大きさを持つ立方体を表示するSingleMatNode?である.デフォルトで単位長さの箱を描く.以下のメソッドが利用可能である:
Sphere †Sphereノードは与えられた半径を持つ球を表示するSingleMatNode?である.デフォルトで,単位球を描く.以下のメソッドが利用可能である:
CCylinder †CCylinderノードは与えられた半径と長さを持つcapped cylinderを表示するSingleMatNode?である.デフォルトで,単位長さと半径を持つcylinderを描く.以下のメソッドが利用可能である:
Body †Bodyノードはシミュレートされるオブジェクトの物理的な側面を表現する.以下のメソッドが利用可能である:
Collider(粒子(衝突型)加速器) †Colliderは全てのサポートされる衝突プリミティブに対する抽象基底クラスである.それはさらに,Colliderインスタンスにより検出される衝突イベントに反応するCollisionHandler?の子ノードセットを管理する.利用可能なメソッドは以下の通りである:
BoxCollider? †BoxCollider?はBoxCollider?プリミティブを実装するColliderノードである.デフォルトでは,単位サイズのボックスColliderを生成する.利用可能なメソッドは以下の通りである:
SphereCollider? †SphereCollider?は球体衝突プリミティブを実装するColliderノードである.デフォルトでは,単位サイズの球体 Colliderを生成する.
CCylinderCollider? †CCylinderCollider?はcapped cylinder衝突プリミティブを実装するColliderノードである.初期では,単位長さと半径のcapped Colliderを生成する.利用可能なメソッドは以下の通りである:
CollisionHandler? †CollisionHandler?*14は,衝突に対して行動を起こすハンドラの抽象基底クラスである.それぞれのColliderインスタンスに対して,1つ以上のCollisionHandler?が登録される.この基底クラスにおける利用可能なメソッドは無い. ContactJointHandler? †ContactJointHandler?は,2つの影響する衝突プリミティブと関連する2つのボディの間でODEジョイントを生成するCollisionHandler?である.ジョイントは衝突を分析するために用いられる.すなわち,2つのボディが互いに貫通することができないような適切な力を生成することである.利用可能なメソッドは以下の通りである:
RecorderHandler? †RecorderHandler?は,それが所属するColliderの衝突情報を集めるCollisionHandler?である.それは例えば,バンパーセンサの実装やゲームルールの実装を支援する.そこで,それは,エージェントがフィールド上の特定のエリアに存在するかどうかを発見するために用いられる.これらのエリアは例えば,BoxCollider?として表現される.スクリプトインタフェイスを通してこれ以上利用可能なメソッドはない. Joint †JointノードはすべてのJointに対する抽象基底クラスである.2つのボディがお互いに相対的なポジションと方向が特定の物になるように,2つのボディの間で強制される関係(制約)を定義する. Jointの図形パラメータを設定する関数は,Jointがボディに接続され,それらのボディが正しく配置された後にだけ呼び出される.そうでなければ,Jointは正しく初期化されないかもしれない,ということに注意しなさない.もしJointがまだ接続されていないなら,これらの関数は何もしないであろう. Jointノードは,親変換ノードにしたがって配置され,また方向付けられることに注意しなさい.利用可能なメソッドは以下の通りである:
FixedJoint? †FixedJoint?ノードは2つのボディ,または1つのボディと静的環境間の固定された相対位置と方向を維持するジョイントを表す. BallJoint? †BallJoint?ノードは,2つのボディをアンカーポイントで接続するball and socket jointを表す.それは,このアンカーに対する2つのボディの不変的な距離を強要する.その上,それはアンカーポイントに対してそれぞれのボディが一定の向きを保つことを強要する.2つのボディは,アンカーポイントのまわりを自由にぐるぐる回る. HingeJoint? †HingeJoint?ノードはヒンジジョイントを表す.このJointタイプは,定義されたアンカーポイントを通る1つの軸に沿って,2つの剛体ボディを接続する.軸は,ノードの局所的座標系におけるz軸と固定されている.これは,親変換ノードを用いて調整可能である.ball and socket jointのように,それはアンカーポイントに対して,一定の距離や向きを強制する.しかしながら,回転する自由は,定められた軸に制約される. Hinge2Joint †Hinge2Jointは,ヒンジが2つあるジョイントを表す.それは,連続して接続された2つのヒンジジョイントのように振る舞う.それぞれのヒンジジョイントは,異なるHingeJoint?を定義するが,同じアンカーポイントを共有する.2つの軸は,ノードの局所的座標系におけるxとz軸へと固定される.これは,親トランスフォームノードを用いて調整可能である.このジョイントタイプは一般的に,車のハンドルの操作をシミュレートするために用いられる.この場合では,1つ目の軸により車輪の操作,2つ目の軸により車輪の回転が可能となる. UniversalJoint? †UniversalJoint?ノードは,いわゆるユニバーサルジョイントを表す.それは,追加的な回転自由度を制約するソケットジョイントである.UniversalJoint?は,2つの垂直軸で動作する(それぞれのボディで1つ定められている).ジョイントの局所的座標系におけるxとz軸へと固定されているこれらの軸は,垂直のままでいるように強制される.これは,2つの他の軸に垂直な軸について,2つのボディの回転が等しいということを意味する.したがって,2つのボディのいずれかが軸の周りを回っている時は,他方も同様に回転している. おわりに †この日本語訳の翻訳者,連絡先は下記の通りである. 翻訳者 †横田泰之(担当:1〜3章,4.6.9〜4.6.21節) 連絡先 †大阪府立大学 大学院工学研究科 電気・情報系専攻 計算知能工学研究室 |