ROS講座13 URDFを記述する1

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 20.04 |
| ROS | Noetic |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

#概要
この先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用モデルを生成することができます。

![link.png](https://qiita-image-store.s3.amazonaws.com/0/254442/52539f8a-67d2-16b3-8057-f22c77d10827.png)

[ROS wiki](http://wiki.ros.org/ja/urdf/Tutorials/Create%20your%20own%20urdf%20file)より

#前準備
## パッケージの作成
(git cloneした場合は必要ありません)

```shell
cd ~/catkin_ws/src/
catkin_create_pkg vis_lecture std_msgs rospy roscpp tf
```

## urdf_tutrialパッケージのインストール
urdfを表示するlaunchが含まれているのでそれを使用します。

```shell
sudo apt-get install -y ros-kinetic-urdf-tutorial 
```

# URDFファイルの作成
URDFファイルは慣例的に`ROSパッケージ名/urdf/`以下に置きます。今回は簡単な箱が1つあるだけの簡単なURDFを作成します。

```xml:vis_lecture/urdf/simple_body1.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">`のようにつづり間違えをしていてもチェックしてくれません。

```shell:URDFのチェック
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`にチェックがついていることを確認してください。

```shell:URDFの表示
roscd vis_lecture/urdf/
roslaunch urdf_tutorial display.launch model:=simple_body1.urdf 
```
![rviz.png](https://qiita-image-store.s3.amazonaws.com/0/254442/150a09d8-3250-7071-9101-0dfaf2cb74f2.png)

#launchの解説

apt-getで入手したROSパッケージであるurdf_displayの今回呼び出しだlaunchファイルの中身を見てみましょう。

```shell:launchの表示
roscd urdf_tutorial/launch/
less display.launch 
```

```xml:urdf_tutorial/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](http://wiki.ros.org/ja/urdf/Tutorials/Create%20your%20own%20urdf%20file)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)