第4回ROS勉強会 in カワダロボティクス開催まであと1週間を切りましたので、久しぶりにROS勉強記を更新してウォーミングアップを図ります。

今日はURDFを学びます。URDFとはUnified Robot Description Formatを意味し、ROSで扱うロボットの視覚形状、物理形状、関節構成、センサ構成などのハードウェア情報がXMLフォーマットで書かれています。このURDFを記述するだけで順運動学、逆運動学が計算できるようになり、RVizやGazeboを使ったロボットのシミュレーションもできるようになります。

6軸マニピュレータを記述するにはどうすればよいかを例にとって説明していきます。ソースコードはlearning_urdfパッケージという名前でGitHubにアップしました。

https://github.com/ros-japan-users/rosjp_tutorials/tree/master/learning_urdf

関節構成

まずは関節構成を記述します。一から設計してもよいのですが面倒ですので、有り物を使いましょう。今回はNEXTAGE OPENの左腕だけを切り出して、6軸マニピュレータの代わりにします。かなり特殊な自由度構成ですが、ご了承ください。関節構成だけを切り出したURDFは非常に読みやすいです。NextageOpen_LeftArmOnly.urdfをご覧ください。でき上がったURDFのリンクツリーの検証方法も充実しています。

$ check_urdf urdf/NextageOpen_LeftArmOnly.urdf
robot name is: NextageOpen
---------- Successfully Parsed XML ---------------
root Link: WAIST has 1 child(ren)
    child(1):  LARM_JOINT0_Link
        child(1):  LARM_JOINT1_Link
            child(1):  LARM_JOINT2_Link
                child(1):  LARM_JOINT3_Link
                    child(1):  LARM_JOINT4_Link
                        child(1):  LARM_JOINT5_Link

もしくは

$ urdf_to_graphviz urdf/NextageOpen_LeftArmOnly.urdf
$ evince NextageOpen.pdf

WAISTからLARM_JOINT5_Linkへと数珠つなぎでリンクが定義されていて、その間がLARM_JOINT0,1,2,3,4,5_Linkという6つの関節で繋がっていることがわかります。

さて、リンクツリーの検証が終わり、次に3次元的に正しく配置されているか、関節角度方向、関節角の限界角度が正しく設定されているかを検証したくなります。これに必要な作業はjoint_state_publisherrobot_state_publisherの2つのROSノードを起動することだけです。前者が関節角情報JointStateメッセージをpublishし、後者がそのJointStateとURDFの保存場所を示すrobot_descriptionパラメータを基にロボットのtfをpublishします。joint_simulation.launchをご覧ください。これをroslaunchすると、その2つのノードとともにrvizが起動します。joint_state_publisherノードのuse_guiパラメータをtrueにすることで、関節角をスライダーで操作できるウィンドウを表示できます。これを使えば、回転軸や回転方向の間違いをすぐ発見できます。

$ roslaunch learning_urdf joint_simulation.launch

視覚形状、物理形状

ボーンモデルが出来れば、次はジオメトリに凝ってみたくなります。NEXTAGE OPENのCADモデルは公開されているので、ボーンモデル同様ジオメトリも左腕だけ取り出して利用します。新しいNextageOpen_LeftArmOnly.urdfをご覧ください。各link要素には子要素としてvisualcollisionがぶら下がっています。この前者が視覚形状となり、後者が物理形状となります。視覚形状とはシミュレータ上に表示されるモデルで、実ロボットと同じCADモデルで描画すると、視覚的にもわかりやすいでしょう。一方、物理形状は自己干渉や環境物体との干渉を計算するのに使われます。計算量削減のため、物理形状は凸包などの簡易形状で置き換えることが多いですが、元々のNextageOpen.urdfvisualと同じものを使っていたので、僕もそれに倣いました。

また、linkのもう一つの子要素としてinertiaがありますが、こちらは動力学計算に必要な重心や慣性力が定義されています。rvizRobotModelをAddして描画するようにすると、NEXTAGE OPENの左腕が描画されます。

ロボット実機との接続

joint_state_publisherノードの代わりに自分で関節角情報JointStateメッセージをpublishするノードを実装すると、それだけでロボットの簡単なビュアーが完成します。詳しくは説明しませんが、nextage_state_publisher.pyrobot_connection.launchを参考にしてください。JointStateには角速度やトルクも与えられますが、今回は角度を与えているだけです。それだけでビュアーとしては十分です。

その他

センサ構成、FK/IKに関しては次回以降に回します。NEXTAGE OPENにはハンドカメラが装着されているので、カメラをURDFに追加しましょう。