ROSでカスタムのロボットを作ったらURDFを作ってそれを/robot_descriptionのパラメータに入れないといけない.
ROSでは、Rvizなどが/robot_descriptionの値を参考にロボットの形状を読み込んで、robot_state_publisherから得られる情報で現在のロボットの状態を描画する
robot_descriptionは当然パラメータサーバに値が置かれているわけだけど、ここにURDFの値が常にそのまま放り込まれている.(http://wiki.ros.org/rviz/DisplayTypes/RobotModel)
そのため大体ロボット関連のroslaunchを行ったときは、以下のような記述をしていて、立ち上げると同時にパラメータサーバに値をセットする.
<launch>
<param name="robot_description" command="cat $(find museumGuide)/urdf_model/peoplebot.xml" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
</launch>
(https://answers.ros.org/question/61479/adding-robot_description-to-parameter-server/ より)
さて、肝心のURDFの作り方だが、基本的には
- Xacroの形式で記述して
- XacroをURDFに変換する
形で通す.Xacroはマクロが使えたり変数が使えたりURDFの少し使いやすい版でこっちで書かないと使いづらい.少なくともパラメータを調整するまではxacroで書く.
Xacro・URDFの書き方の概要
URDFでロボットの形の書き方はツリー状の形になるように記述される.
基準となる座標から子の座標を生やす形でツリー状に伸ばしていく.
ヒューマノイドロボットの形なら胴体から太ももと腕を生やしてその先に足と手先、更にそこからロボットの指先を生やすようにつなげていく.
このときURDFに書かれるのは、腕とか胴体ではなく、この一つ一つの部分をつなげていく関節を定義していくことでロボットの形を定義する.即ち型関節やひじ、親指の第一関節と言った具合に.もちろん腕をどういう形状で表示するかというのも記述するがそれはあくまで関節に対して相対的にどういう位置にあるかで記述する.あくまで関節ありきで肉付けのためのリンク.
以下のようにロボットの関節を定義して、それぞれの関節に名前をつけて、それらの関節間の位置関係を定義する.
URDFでは関節をjointタグで記述する.そして関節間にある部位をlinkタグで記述する.
linkの中では見た目をどうしたいかを記述するvisualタグと
障害物判定をするとき用のcollisionタグを記述することができる.
visualタグではcollada(.dae)ファイル等も指定できるので、関節からどんな形の腕やグリッパを表示したいかを詳細に決めることができる.位置調整も容易にできるので関節側を変更する必要はない.(というか関節側を変えるのはおかしい)
collisionタグは通常visualで表示された物体を完全に囲い込めるような簡単な直方体や球で記述するのが一般的.簡単な図形にするのは計算速度を上げるためで完全に囲い込めるようにするのは、物体の衝突回避を安全目に計画するため.
以上で、URDFの概要は終了.これで後はなんとなくで書けると思います.
おわりに
PR2のURDFなどは参考になると思うので、以下に貼っておきます。
https://github.com/PR2/pr2_common/blob/kinetic-devel/pr2_description/urdf/forearm_v0/forearm.urdf.xacro