[V-REP] Child scripts の特徴

 

Child scripts の基本

  • 言語はLua
  • 豊富なAPI関数により楽にシミュレーションを行える。関数リストはこちら
  • オブジェクトに追加する形で使う
  • そのため親子関係が(一応)存在する
  • シミュレーション1ステップ毎に実行される

追加方法

追加したいオブジェクトを選択した状態で 右クリック→Add→Associated child script→Non threaded

vrep-child-scripts-characteristic_02

これでScene hierarchy中の選択したオブジェクトにChild Scriptsのアイコンが表示されます。コレをダブルクリックすることでスクリプトの編集ができます。

vrep-child-scripts-characteristic_03

命令範囲

命令は親子関係なくシーン内全てのオブジェクトを対象に行えます。

ただし、同じ命令が親と子にあった場合には、子の命令が優先されます。例えば同じハンドルのjointに対して親が「停止」、「子」が「回転」の命令を出したときjointは回転します。

シミュレーション中の分類(sim_call_typeの種類)

ver3.1.3よりsim_call_typeのif thenの外に書いた命令は実行されなくなれました。このようにsim_call_typeでフラグ管理をしています。

初期化命令文には変数の初期化やオブジェクトハンドルの取得を行うスクリプトを書きましょう。

それぞれのsim_call_typeの説明は次の通りです。

sim_childscriptcall_initialization

初期化フェーズで、チャイルドスクリプトが初めて呼び出された時のみ実行されます。これはシミュレーション開始時ではなく、あくまでチャイルドスクリプトが呼び出された時であることに注意して下さい。
これはシミュレーション中でもcopy/pasteでchild scriptが関連付けられたオブジェクトを増やすことができ、その初期化を行えることを示しています。

sim_childscriptcall_actuation

動作フェーズで、ステップ毎に毎回実行されます。主に物体の動作に関するコードを記述します。

sim_childscriptcall_sensing

感知フェーズで、ステップ毎に毎回、動作フェーズの後に実行されます。主にセンサーに関するコードを記述します。

sim_childscriptcall_cleanup

終了フェーズでシミュレーション終了時に一度だけ実行されます。

実行順序

初期化フェーズ→動作フェーズ→感知フェーズ→動作フェーズ→感知フェーズ…→終了フェーズ

便利機能

ハンドル取得時にオブジェクト名の#以降を考慮した振る舞いをする

simGetObjectHandle(‘Object_name’)でオブジェクトハンドルを取得するときに、スクリプト名に「#数値」が付いている場合には’Object_nam’eに「#数値」があるものとして処理します。

つまり次のようなシーン中で

vrep-child-scripts-characteristic_01

dodai#0のスクリプトに

と記述すればdodai#0の子のjoint#0のオブジェクトハンドルを取得できます。これはそれぞれの異なる数値の「#数値」付きオブジェクトが親子関係になっていても同様です。

このおかげで、コピーした際にオブジェクト名の重複することなく同じスクリプトを使い回せるという利点が生まれます。

もし明示的にsimGetObjectHandle(‘Object_name#1’)のように「#数値」を含めた書き方をすれば、スクリプト名に関係なく指定したオブジェクトハンドルを取得します。

子のスクリプトに値を渡せる

親から指定した値を、子の変数に代入することが出来ます。次のようなスクリプトを記述することで行えます。

ここでは親から数値5をこの変数hensuに格納しています。子側の「=…」は必須です。

複数受け取る場合は「hensu1,hensu2,hensu3=…」の様にカンマ区切りで列挙すれば可能です。

コメントを残す