環境
この記事は以下の環境で動いています。
項目 | 値 |
---|---|
CPU | Core i5-8250U |
Ubuntu | 20.04 |
ROS | Noetic |
インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。
#概要
この先Rvizのプログラムの製作方法を解説していきます。今回はその第1段階のロボットの記述ファイルであるURDFの書き方ととりあえずの表示の仕方を解説します。
#URDFとは
URDF (Unified Robot Description Format)とは、ロボットの構造を記述するためのXMLのフォーマットです。URDFにおける記述はLinkとJointから構成されます。
- Linkはロボットの駆動しない1ブロックです。Linkは以下のような要素を持ちます。
- 見た目の形、色
- 衝突判定の形
- 重さとイナーシャ
- JointはLinkとLinkの接続を表します。
- jointの種類(固定、回転、直動....)
- jointの詳細オプション
このlinkとjointによって、木構造となります。
またurdfに詳細なオプションを書くことで、これからsimulation用モデルを生成することができます。
ROS wikiより
#前準備
パッケージの作成
(git cloneした場合は必要ありません)
cd ~/catkin_ws/src/
catkin_create_pkg vis_lecture std_msgs rospy roscpp tf
urdf_tutrialパッケージのインストール
urdfを表示するlaunchが含まれているのでそれを使用します。
sudo apt-get install -y ros-kinetic-urdf-tutorial
URDFファイルの作成
URDFファイルは慣例的にROSパッケージ名/urdf/
以下に置きます。今回は簡単な箱が1つあるだけの簡単なURDFを作成します。
<robot name="test_robot">
<link name="base_link"/>
<joint name="body_joint" type="fixed">
<parent link="base_link"/>
<child link="body_link"/>
</joint>
<link name="body_link">
<visual>
<geometry>
<box size="0.3 0.3 0.2"/>
</geometry>
<origin xyz="0 0 0" rpy="0 0 0"/>
<material name="red">
<color rgba="1.0 0.0 0.0 1.0"/>
</material>
</visual>
</link>
</robot>
URDFファイルの解説
<robot>
タグの中に書いていきます。今回のファイルには大きく分けて3つの要素があります。
-
base_link
は中身のないlinkです。流儀としてロボットの位置を示す基準のとしてbase_link
という名のlinkを製作します。 -
body_link
は言わばロボットの本体を示すlinkです。
<link name="body_link">
~</link>
の中身としてvisual
要素があります。これはRviz上での見た目を定義しています。形は今回は箱型(box
)を使っています。size="0.3 0.3 0.2"
は箱のx軸方向、y軸方向、z軸方向のサイズを示しています。ほかのオプションについては次回解説します。
material
以下では色を定義できます。HTMLなどではred
と入れるだけで赤色が入るのですが、URDFでは名前とRGBAの両方を定義しなくてはなりません。color
タグの中のrgba
属性で定義している値は、順に赤、緑、青、アルファ値(透明度)です。赤緑青は0.0~1.0までの値をとれてすべての値が0.0なら黒、1.0なら白になります。アルファ値は0.0~1.0で値が小さいと透明、大きいと不透明なのですが、バグなのか2.0ぐらいにならないと不透明になりません。 -
body_joint
はbase_link
とbody_link
を接続するjointです。種類はfixed
で名前の通り固定された稼働しない接続です。
URDFのチェック
製作したURDFが正しいフォーマットになっているかを確認します。ただこのツールはlinkやjointの関係が正しいかを見るだけで、細かいチェックはできません。例えば<material name="red">
が<materialllll name="red">
のようにつづり間違えをしていてもチェックしてくれません。
roscd vis_lecture/urdf/
check_urdf simple_body1.urdf
正しいと以下のような表示が出ます。
robot name is: test_robot
---------- Successfully Parsed XML ---------------
root Link: base_link has 1 child(ren)
child(1): body_link
表示
本当はURDFの作成後にRviz上のロボットを動かすためのROSノードやlaunchファイルの記述が必要なのですが、とりあえず表示をします。
下のコマンドを実行すると以下のような画面が出てきます。赤い直方体がURDFで記述して表示されているロボットです。
もし表示されていないときはFixed frame
がbase_link
であること、RobotModel
にチェックがついていることを確認してください。
roscd vis_lecture/urdf/
roslaunch urdf_tutorial display.launch model:=simple_body1.urdf
#launchの解説
apt-getで入手したROSパッケージであるurdf_displayの今回呼び出しだlaunchファイルの中身を見てみましょう。
roscd urdf_tutorial/launch/
less display.launch
<launch>
<arg name="model" />
<arg name="gui" default="true" />
<arg name="rvizconfig" default="$(find urdf_tutorial)/rviz/urdf.rviz" />
<param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" />
<param name="use_gui" value="$(arg gui)"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>
今まで解説していない要素がありますが、ざっくり理解してほしいところは以下の3点です。
- modelという変数で読み込むurdfファイルを設定している。
- GUIを表示するrvizという名前のROSノードを起動している。
- Rviz中での物体の表示のためにjoint_state_publisher、robot_state_publisherというROSノードが使われている。
#参考
ROS wiki