PyBulletでURDF(Unified Robot Description Format) URDF解説編(2)
前回はURDFの基本構造の紹介と、Colaboratoryを使ってPyBulletにhumanoid.urdfを読み込ませ、表示させる方法を紹介しました。
今回はhumanoid.urdfの中身を見ていきます。
1.PyBulletのHumanoid.urdfの用途について
PyBulletのプロジェクトにあるhumanoid.urdfは宙返り(backflip)学習サンプル用の人型モデルのようです。PyBulletサイトに簡単な紹介がありました。
基になっているサイトはこちらで、モーションキャプチャーデータをガイドとし、物理シミュレータPyBullet内のロボット制御を深層強化学習させるといった興味深いものです。宙返りだけでなく、さまざまな動きに挑戦しています。
DeepMimic: Example-Guided Deep Reinforcement Learning of Physics-Based Character Skills
2.humanoid.urdfの中身
humanoid.urdfはinertialとcollisionのみを定義していてvisualは定義してませんが、前回の記事で紹介した様にPyBulletで読み込むとちゃんと表示されます。visualの代わりにcollisionのgeometryが表示されている様です。
humanoid.urdfは次のリンク先にあります。リンク先を開いて画面右上のRawボタンを押すとhumanoid.urdfをダウンロードできます。
リンク :bullet3/humanoid.urdf at master · bulletphysics/bullet3 · GitHub
urdfは前回の記事で紹介した通り、ロボットを部品であるlink(parent、child)をjointで結合して定義します。jointはparent linkの座標系をjoint座標系に変換します。child linkの座標系はjoint座標系と同じになります。
humanoid.urdfを読み、linkを整理すると次の図になります。
各linkの慣性モーメント(Inertia)は、Inertiaマトリクスの要素9つのうち、同じ値になる3つを除いた6つで定義します。また、通常はInertiaマトリクスの対角要素以外は0になります。
URDFの単位はmass(質量)はkg、長さはm、inertia(慣性モーメント)はkgm2です。
次にhumanoid.urdfのjointの位置を整理します。
ロボットの基準位置は腰の中心で、脚の付け根のjointと同じ高さにあります。URDF読み込み時にスケール1/4としているのでhumanoidの高さは約1.62mです。重量は各linkのmassを単純に加算すると45kgでした。
黒の線はjointのoriginで定義されている座標変換です。例えば次のように定義されていたとすると、
<link name="right_hip" >
</link>
<joint name="right_hip" type="spherical" >
<parent link="root" />
<child link="right_hip" />
</joint>
<link name="right_knee" >
<collision>
<origin rpy = "-1.570796 0 0" xyz = "0.000000 -0.800000 0.000000" />
<geometry>
<capsule length="1.240000" radius="0.200000"/>
</geometry>
</collision>
</link>
<joint name="right_knee" type="revolute" >
<parent link="right_hip" />
<child link="right_knee" />
<origin rpy = "0 0 0" xyz = "0.0 -1.686184 0.0" />
</joint>
link "right_knee"の座標原点はparent_linkであるright_hipの原点=joint "right_hip"からxyz = "0.0 -1.686184 0.0"だけ 移動します。上図の黒の線はこの移動量を示しています。同様に青の線はlinkの中で定義されているcollisionのorignと等しく、linkの原点=joint位置からの移動量-0.8を示しています。
また、linkの円筒形の回転は単位がラジアンなので、-1.57=-2/π = 90度回転させています。
humanoidを見ると、URDFでのロボット定義は基本的にlinkのinertial、collisionを与えてjointで結合するだけでよさそうです。
なお、humanoidのjointはspherical×8、revloute×4の計12でした(固定であるfixedを除きます)。
つづく
URDFの仕組みがある程度わかったところで、次回はオリジナルのロボットを定義してみようと思います。