URDFを使ったロボットモデルの記述
第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_publisher
とrobot_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
要素には子要素としてvisual
とcollision
がぶら下がっています。この前者が視覚形状となり、後者が物理形状となります。視覚形状とはシミュレータ上に表示されるモデルで、実ロボットと同じCADモデルで描画すると、視覚的にもわかりやすいでしょう。一方、物理形状は自己干渉や環境物体との干渉を計算するのに使われます。計算量削減のため、物理形状は凸包などの簡易形状で置き換えることが多いですが、元々のNextageOpen.urdfがvisual
と同じものを使っていたので、僕もそれに倣いました。
また、link
のもう一つの子要素としてinertia
がありますが、こちらは動力学計算に必要な重心や慣性力が定義されています。rviz
でRobotModel
をAddして描画するようにすると、NEXTAGE OPENの左腕が描画されます。
ロボット実機との接続
joint_state_publisher
ノードの代わりに自分で関節角情報JointState
メッセージをpublishするノードを実装すると、それだけでロボットの簡単なビュアーが完成します。詳しくは説明しませんが、nextage_state_publisher.py
とrobot_connection.launch
を参考にしてください。JointState
には角速度やトルクも与えられますが、今回は角度を与えているだけです。それだけでビュアーとしては十分です。
その他
センサ構成、FK/IKに関しては次回以降に回します。NEXTAGE OPENにはハンドカメラが装着されているので、カメラをURDFに追加しましょう。
Comments powered by Disqus.