やること
URDFを記述する際に、LINKの記述方法がいつもわからなくなるのでまとめておきます。
間違っていたらご指摘ください。
参考は公式ドキュメント
クイズ
図のような腕パーツがあるとします。
パーツは前腕から拳の部分まで一体型です。丸い穴が空いた部分が回転軸で、肘にあたります。
URDFのLINKとして記述する際に、座標の原点になりそうな候補がいくつかあります。
① STLやdaeモデルの原点
② 回転軸の中心
③ イナーシャ用の重心
④ ロボット全体の原点
上記のうち、LINKの原点はどれでしょうか?
正解
正解は、たぶん「② 回転軸の中心」です。
ということで、図の紫円の中心を原点とします。
それに合わせ、STLなどのモデルの座標の中心も同じ紫円の中心となるようにします。
イナーシャ用の重心(図では赤い球のライン)については、URDL上で記述します。
以下は公式ドキュメントに掲載されている記述例にコメントしたものです。
<link name="my_link">
<inertial>
<origin xyz="0 0 0.5" rpy="0 0 0"/> #原点からの重心座標
<mass value="1"/>
<inertia ixx="100" ixy="0" ixz="0" iyy="100" iyz="0" izz="100" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" /> #原点からのオフセット
<geometry>
<box size="1 1 1" />
</geometry>
<material name="Cyan">
<color rgba="0 1.0 1.0 1.0"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/> #原点からのオフセット
<geometry>
<cylinder radius="1" length="0.5"/>
</geometry>
</collision>
</link>
まだ謎のところ
例えば手首のヨー軸(ローカル)などの場合は、拳などのパーツの原点を前腕の原点と揃えることも多いようです。手首の回転軸がヨー軸のみの場合、拳は前腕に対しては振り回されませんが、二の腕(肘)に対しては前腕と共に振り回されるので、確かにその方がよさそうです。むしろそうすべきかもしれません。
拳の原点を手首とすべきか肘とすべきかについての回答はまだ見つかっていません。
さいごに
STL,daeなどのビジュアルやコリジョンについてはオフセット設定もできるようですが、設定できる場合は回転軸を原点に合わせてしまうとわかりやすいと思います。
いくつかの公開されているURDFファイルを覗いたところ、STLなどモデルの中心がパーツの回転軸に設定されていたので多分あっているとは思いますが、もし間違っていたり、より詳しい情報をご存知の方はご指摘ください。
シリーズ記事
ヒューマノイドのURDFを書き始める