親子関係によるボディの連動¶
概要¶
複数のボディアイテムをアイテムツリー上で親子関係となるように配置すると、それらのボディの位置を連動させることができます。例えば、移動ロボットのモデルの子アイテムとして荷物のモデルを配置しておくと、ロボットを動かした際に荷物もそれに合わせて動くようになります。マニピュレータの手先に取り付ける工具や、台車の上に載せる物体など、複数のボディを組み合わせて配置する場面で活用できます。これらの具体例を 活用例:ロボットと物体の組み合わせ で紹介します。
この仕組みはロボットと物体の組み合わせに限らず、環境モデルの構築においても有用です。大きな環境物体の上に、別のボディとしてモデル化された小さな環境物体を子アイテムとして配置していき、多数のモデルを階層化してグループ化しておくことで、大規模な環境モデルの位置関係の編集も効率的に行えるようになります。具体例を 活用例:環境モデルの階層的な構築 で紹介します。
連動の仕方は、子となるボディアイテムの「親ボディ連結」プロパティで、以下の3つのモードから選択します。
モード |
動作 |
|---|---|
独立 |
連動を行いません。親子関係はアイテムの整理としてのみ機能します。 |
連動 |
親ボディの動きに子ボディが追従します(片方向の連動)。デフォルトのモードです。 |
固定 |
子ボディが親ボディのリンクに固定され、一体のものとして双方向に連動します。 |
また、連動の基準となる親ボディ側のリンクは「親リンク」プロパティで指定します。何も指定しない場合は、親ボディのルートリンクが基準となります。
これらのプロパティの設定はプロジェクトに保存されます。
連動モード¶
デフォルトでは「親ボディ連結」プロパティが「連動」となっているため、ボディアイテムを他のボディアイテムの子アイテムとして配置するだけで、このモードによる連動が有効となります。
このモードでは、子アイテムとして配置した時点での、親リンクと子ボディの相対位置関係が記憶されます。以降、親ボディが動くと、記憶された相対位置関係が保たれるように子ボディも動きます。親ボディの移動に限らず、親リンクの位置が変化する動作であれば連動の対象となります。例えば「親リンク」プロパティにマニピュレータの手先リンクを指定しておけば、マニピュレータの関節を動かして手先が移動する場合にも、子ボディは手先に追従します。
この連動は親から子への片方向のもので、子ボディを単独で動かすことは引き続き可能です。子ボディを動かした場合は、動かした後の相対位置関係が新たに記憶され、以降はその関係が保たれるようになります。
活用例:環境モデルの階層的な構築¶
連動モードの活用例として、環境モデルの構築を考えてみます。部屋のモデルの中にテーブルや棚を配置し、さらにテーブルの上に箱やトレイといった物品を配置するとします。それぞれが別のボディとしてモデル化されているとして、これらを以下のようにアイテムツリー上で階層化して配置します。
[ ] - World
[/] + Room
[/] + Table1
[/] + Box1
[/] + Box2
[/] + Table2
[/] + Tray
[/] + Shelf
ここではRoom(部屋)の子アイテムとしてTable1、Table2(テーブル)とShelf(棚)を配置し、Table1の子アイテムとしてBox1、Box2(箱)を、Table2の子アイテムとしてTray(トレイ)を配置しています。
このように階層化しておくと、物体を載せているモデルを動かした際に、その上の物体もまとめて動くようになります。例えばTable1を動かすと、上に載っているBox1とBox2もテーブルとの位置関係を保ったまま一緒に移動します。部屋全体のレイアウトを変えたい場合は、Roomを動かせば配下の全てのモデルがまとめて移動します。一方で、個々の物体を単独で動かして配置を微調整することも引き続き可能です。
多数の環境物体からなる大規模な環境モデルでも、このようにまとまりごとにグループ化しておくことで、「グループ単位での大まかな配置」と「個々の物体の細かな配置」を使い分けながら、位置関係の編集を効率的に進めることができます。
なお、この例のように親子関係が深い階層になっていても、ワールドアイテムの配下にあるボディアイテムは全てシミュレーションの対象となります。
固定モード¶
「親ボディ連結」プロパティを「固定」にすると、子ボディは親リンクに固定され、親ボディと一体の複合ボディのように扱われるようになります。親の動きに子が追従するのは連動モードと同じですが、さらに以下の点が異なります。
子ボディの位置は親リンクからの相対位置(オフセット)として管理されるようになり、配置ビュー等での位置の表示・編集も親リンクからの相対位置で行われます。相対位置を編集することで、固定する位置を調整できます。
シーンビュー上で子ボディをドラッグすると、子ボディが単独で動くのではなく、親ボディ側の運動学を介した操作となります。例えばマニピュレータの手先リンクに工具のモデルを固定した場合、工具をドラッグするとマニピュレータの腕が逆運動学によって動きます。
注釈
子ボディのモデルがアタッチメントデバイス(AttachmentDevice)を、親ボディのモデルがホルダデバイス(HolderDevice)を備えている場合は、固定モードにおいて両デバイスの位置が一致するように固定位置が自動で決定されます。
注釈
本ページで説明した連動は、GUI上でのモデルの配置や運動学操作を対象としたものです。動力学シミュレーションにおいては、この親子連結によってボディ間の結合が自動で行われるわけではない点にご注意ください。
活用例:ロボットと物体の組み合わせ¶
概要で挙げた、ロボットと物体を組み合わせる例を紹介します。
台車の上に載せる物体(連動モード)¶
台車型のロボットのモデル(Cart)の上に、荷物のモデル(Luggage1、Luggage2)を載せる例です。荷物のアイテムを台車の子アイテムとして、以下のように配置します。
[ ] - World
[/] + Cart
[/] + Luggage1
[/] + Luggage2
「親ボディ連結」プロパティはデフォルトの「連動」のまま、「親リンク」プロパティも未指定(台車のルートリンクが基準)でかまいません。この状態で台車を動かすと、荷物も載せた位置関係を保ったまま一緒に移動します。荷物を単独で動かして、積み方を調整することも可能です。
マニピュレータの手先に取り付ける工具(固定モード)¶
マニピュレータのモデル(ここでは サンプルモデル のPA10とします)の手先に、工具のモデル(Tool)を取り付ける例です。工具のアイテムをマニピュレータの子アイテムとして、以下のように配置します。
[ ] - World
[/] + PA10
[/] + Tool
そのうえで、Toolの「親リンク」プロパティに手先のリンク(PA10であれば "J7")を指定し、「親ボディ連結」プロパティを「固定」にします。すると工具は手先リンクに固定され、マニピュレータの関節を動かして手先が移動・回転すると、工具もそれに合わせて動くようになります。取り付け位置は、手先リンクからの相対位置を編集することで調整できます。また、シーンビュー上で工具をドラッグすると、マニピュレータのアームが逆運動学によって動きます。
なお、手先の動きに追従させるだけでよい場合は、「親リンク」に手先のリンクを指定した上で、「親ボディ連結」を「連動」のままとしてもかまいません。この場合は工具を単独で動かして位置を調整することができます。