Webots 使い方まとめ

7. オブジェクト化による効率化

前節ではSolidの設定方法について説明した。 しかしこの方法には何かと面倒な作業が多い。前節で体験したと思うが、Solidのchildren属性のShapeのサイズとboundingObjectのサイズは別で指定されるため、それら二つの大きさを手動で合わせなければならない。 また、性質が同じ物体(ノード)を複数個設置した場合、それらの性質を変更しようと試みると、すべての物体(ノード)を一つづつ訂正しなければならない。
しかしこれらの作業を効率化するために、ちゃんとWebotsにはオブジェクト化機能がある。
ノードをオブジェクト化して"部品化"することにより、何度も同じノードを作成しなくても済む。

7.1 DEFキーワードとUSEキーワード

Webotsにおけるオブジェクト化では、worldに追加されたノードをDEFキーワード(以下DEF)でユーザー定義することにより、そのノードの性質をUSEキーワード(以下USE)で呼び出すことができる。 注意点として、必ずDEFがUSEよりも先に(上で)定義されてないといけない。 このDEF・USEは、.wbtまたは.protoファイルにおいて使用できる。 ただしこの定義は一つの同じ.wbtまたは.protoファイル内のみで有効であり、別のworldで定義されたDEFはUSEで呼び出せない。 また、同じDEFを複数定義した場合、それを呼び出すUSEから最も近いDEFが呼び出される。

7.2 DEFキーワードの定義

Scene treeの、前節で作成したSolid > Shape > geometry box を選択する。
リスト下のDEFの入力欄に任意のユーザー定義名を入力する。ここでは"WALL_BOX"とする。

DEFキーワードのユーザー定義はこれで完了だ。

7.3 USEキーワードでの呼び出し

先ほど定義したDEFをUSEで使用する。 一度設定した衝突検出ノード(boundingObject)の属性をリセットして、定義したDEFに対応するUSEノードを追加する。 これにより、定義したSolidのboxノードの設定がboundingObjectに自動で反映されるようになる。

Scene tree Solid > boundingObject を選択し、Reset to Defaultをクリックする。
Add Newをクリックし、USEを選択すると、リストの最後のほうに先ほど定義した"WALL_BOX"(任意)があるはずである。 これを追加する。

以上がDEF定義したノードをUSEノードとして使用する方法である。
Shapeのboxのサイズ属性を変更してみよう。するとboundingObjectのサイズもそれに同期するはずである。

7.4 DEF・USEのその他利用法

DEFキーワードは、基本的にScene treeの赤色で表示されるノードなら全てに定義可能だ。
しかし、場合によってはあまり意味をなさない場合がある。 例えば、複数の同じ大きさ・外装の壁を設置する際、Solid自体を定義してしまうと、全ての壁が重なってしまう。
これはSolid自体に座標の属性が含まれるため、すべての壁の座標が同値になるからだ。

このような時は、まずSolidのchildren属性のShapeをDEF定義する。
ここでは"WALL_SHAPE"と定義する。

次に2枚目の壁となる新しいSolidノードをAdd Newから追加する。
children属性に先ほど定義した"WALL_SHAPE"を選択する。 boundingObjectには"WALL_BOX"を選択する。
これで、大きさや外装などは反映されるが、座標は独立した二つの壁が完成した。

これをノードのCopyPasteによって3つに複製する。

合計4つのSolidの座標と角度を床の各辺に沿うように設定する。

最後にDEF定義したノードの属性値を変更する。
すぐには適応されないため、一度Saveし、Revertする。

すべての壁のサイズが反映されれば、成功である。
このように、DEF・USEを使用することにより、作業効率はずいぶんと向上するはずだ。

HOME > Webots 使い方まとめ > 7. オブジェクト化による効率化