まずロボットモデルの記述ですがこれはURDFで行います。基本的にはROS Wikiを参照すればよいので、今回は大まかなところを注意点しか書きません。
パッケージの構成を以下のようにします。(黒はパッケージ作成時からあるもの、青は手動で追加するもの)
/package_name
/src
/include
/urdf
/robot.urdf
/launch
/display.launch
/config
/CMakeLists.txt
/package.xml
この記事ではロボットモデルを記述するrobot.urdfの書き方と、モデルの確認を行うdisplay.launchの2つのファイルを書いていきます。
基本の表示
URDFの書き方
ロボットを可動部分で分割した部分であるlinkをjointでつなげてロボットを作ります。今回は2輪で動作するロボットを製作します。2つの動輪と2つの補助輪があるイメージです。
しかしとりあえず初めは上記のような複雑なことをせずにただの物体を表示することを目標とします。
##### robot.urdf #####
<robot name="my_robot">
<link name="base_link">
<visual>
<geometry>
<cylinder radius="0.15" length="0.10" />
</geometry>
</visual>
</link>
</robot>
##### end #####
上記で原点を中心とする円柱を持つロボットモデル(これをロボットモデルというのは微妙ですが)が完成しました。
<link>タグに挟まれたところがlinkの定義です。name属性で名前を付けます。その下の<visual>タグで挟まれているのは「表示される形状」です。これとは別に衝突判定の形状を定義することが出来ます(衝突判定用の形状は処理を軽くするために細部を省略した形状を当てはめることが多い)。
geometryタグの中は形状の定義です。基本形状として、box、cylinder、sphere、それとstlファイルを読み込むmeshがあります。cylinderはz軸が軸になります。
各タグの詳細な意味はhttp://wiki.ros.org/urdf/XML/linkを見てください。
Launchの書き方
Launchではモデルのロードとrvizの起動を行います。##### display.launch #####
<launch>
<arg name="model" default="$(find package_name)/urdf/robot.urdf"/>
<param name="robot_description" textfile="$(arg model)" />
<node name="rviz" pkg="rviz" type="rviz" />
</launch>
##### end #####
model変数に先ほど作ったurdfファイルの場所を入れて、その内容をrobot_descriptionというrosparamに格納します。疎下4行目でrvizの起動を行います。
次にTerminalに移ってlaunchを行います。
$roslaunch package_name display.launch
このようにroslaunch <パッケージ名> <launchファイル名>とコマンド入力することでlaunchファイルを実行します。rvizが表示されるのですが、初期状態では以下の様に何も表示されないのでrvizの設定を行います。
この時roslaunch paぐらいまで売った後にtabキーを押せば保管されるはずです。しかしrosの仕様なのかpackageを作った後の初回時だけは補完をしてくれません。
- displaysウィンドウのGlobal Options→Fixed Frame の中身をmapからbase_linkに書き換える。
- displaysウィンドウ下部のAddボタンを押しBy display_tipeタブの中でrviz→RobotModelを選択してOKボタンを押す。
毎回この設定をするのは面倒なのでrvizの設定ファイルを製作してそれを読み込み用にします。
上記のrviz上でモデルが表示されている状態でメニューバーからFile→Save Config Asを選択します。これをはじめに作ったフォルダのpackge_name/config/SETTING.rvizとして保存します。
この設定ファイルを起動時に読み込むためにlaunchを編集します。
##### display.launch #####
<launch>
<arg name="model" default="$(find package_name)/urdf/robot.urdf"/>
<param name="robot_description" textfile="$(arg model)" />
<arg name="rvizconfig" default="$(find package_name)/config/SETTING.rviz" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" />
</launch>
##### end #####
こうすることで
$roslaunch package_name display.launch
だけでモデルが表示されます。
ロボットモデルの製作
他の部品も加えます。
##### robot.urdf #####
<robot name="my_robo" xmlns:xacro="http://ros.org/wiki/xacro">
<!-- links -->
<link name="base_link" />
<link name="body_link">
<visual>
<geometry>
<box size="0.400 0.200 0.140"/>
</geometry>
<material name="gray">
<color rgba="0.8 0.8 0.8 1.0"/>
</material>
</visual>
</link>
<link name="left_wheel_link">
<visual>
<geometry>
<cylinder radius="0.100" length="0.050"/>
</geometry>
<material name="red">
<color rgba="1.0 0.0 0.0 1.0"/>
</material>
</visual>
</link>
<link name="right_wheel_link">
<visual>
<geometry>
<cylinder radius="0.1" length="0.05"/>
</geometry>
<material name="green">
<color rgba="0.0 1.0 0.0 1.0"/>
</material>
</visual>
</link>
<link name="caster_link">
<visual>
<geometry>
<sphere radius="0.080"/>
</geometry>
<material name="gray"/>
</visual>
</link>
<!-- joints -->
<joint name="body_joint" type="fixed">
<parent link="base_link"/>
<child link="body_link"/>
<origin xyz="0.000 0.000 0.150"/>
</joint>
<joint name="left_wheel_joint" type="continuous">
<parent link="body_link"/>
<child link="left_wheel_link"/>
<origin rpy="-1.5707 0 0" xyz="-0.100 0.105 -0.050"/>
<axis xyz="0 0 1"/>
</joint>
<joint name="right_wheel_joint" type="continuous">
<parent link="body_link"/>
<child link="right_wheel_link"/>
<origin rpy="1.5707 0 0" xyz="-0.100 -0.105 -0.050"/>
<axis xyz="0 0 -1"/>
</joint>
<joint name="caster_joint" type="fixed">
<parent link="body_link"/>
<child link="caster_link"/>
<origin xyz="0.100 0 -0.070" />
<axis xyz="0.0 0.0 1.0"/>
</joint>
</robot>
##### end #####
<visual>タグの中に<material>というものが増えました。
<material name="gray">
<color rgba="0.8 0.8 0.8 1.0"/>
</material>
これはrviz上での色を定義するものです。
$ cd ~/catkin_ws/package_name
$ check_urdf robot.urdf
とするとurdfファイルが正しいかが分かります。