[V-REP] Child scripts の特徴
目次
Child scripts の基本
- 言語はLua
- 豊富なAPI関数により楽にシミュレーションを行える。関数リストはこちら
- オブジェクトに追加する形で使う
- そのため親子関係が(一応)存在する
- シミュレーション1ステップ毎に実行される
追加方法
追加したいオブジェクトを選択した状態で 右クリック→Add→Associated child script→Non threaded
これでScene hierarchy中の選択したオブジェクトにChild Scriptsのアイコンが表示されます。コレをダブルクリックすることでスクリプトの編集ができます。
命令範囲
命令は親子関係なくシーン内全てのオブジェクトを対象に行えます。
ただし、同じ命令が親と子にあった場合には、子の命令が優先されます。例えば同じハンドルのjointに対して親が「停止」、「子」が「回転」の命令を出したときjointは回転します。
シミュレーション中の分類(sim_call_typeの種類)
ver3.1.3よりsim_call_typeのif thenの外に書いた命令は実行されなくなれました。このようにsim_call_typeでフラグ管理をしています。
1 2 3 |
if (sim_call_type==sim_childscriptcall_initialization) then --初期化命令文 end |
初期化命令文には変数の初期化やオブジェクトハンドルの取得を行うスクリプトを書きましょう。
それぞれのsim_call_typeの説明は次の通りです。
sim_childscriptcall_initialization
sim_childscriptcall_actuation
動作フェーズで、ステップ毎に毎回実行されます。主に物体の動作に関するコードを記述します。
sim_childscriptcall_sensing
感知フェーズで、ステップ毎に毎回、動作フェーズの後に実行されます。主にセンサーに関するコードを記述します。
sim_childscriptcall_cleanup
終了フェーズでシミュレーション終了時に一度だけ実行されます。
実行順序
初期化フェーズ→動作フェーズ→感知フェーズ→動作フェーズ→感知フェーズ…→終了フェーズ
便利機能
ハンドル取得時にオブジェクト名の#以降を考慮した振る舞いをする
simGetObjectHandle(‘Object_name’)でオブジェクトハンドルを取得するときに、スクリプト名に「#数値」が付いている場合には’Object_nam’eに「#数値」があるものとして処理します。
つまり次のようなシーン中で
dodai#0のスクリプトに
1 |
simGetObjectHandle('joint') |
と記述すればdodai#0の子のjoint#0のオブジェクトハンドルを取得できます。これはそれぞれの異なる数値の「#数値」付きオブジェクトが親子関係になっていても同様です。
このおかげで、コピーした際にオブジェクト名の重複することなく同じスクリプトを使い回せるという利点が生まれます。
もし明示的にsimGetObjectHandle(‘Object_name#1’)のように「#数値」を含めた書き方をすれば、スクリプト名に関係なく指定したオブジェクトハンドルを取得します。
子のスクリプトに値を渡せる
親から指定した値を、子の変数に代入することが出来ます。次のようなスクリプトを記述することで行えます。
親
1 2 3 4 5 6 7 |
if (sim_call_type==sim_childscriptcall_initialization) then simSetScriptAttribute(sim_handle_self,sim_childscriptattribute_automaticcascadingcalls,false) end if(sim_call_type==sim_childscriptcall_actuation) then simHandleChildScripts(sim_call_type,5) end |
子
1 2 3 |
if(sim_call_type==sim_childscriptcall_actuation) then hensu=... end |
ここでは親から数値5をこの変数hensuに格納しています。子側の「=…」は必須です。
複数受け取る場合は「hensu1,hensu2,hensu3=…」の様にカンマ区切りで列挙すれば可能です。
コメントを残す