ROS講座14 URDFを記述する2

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

| 項目 | 値 |
|:-:|:-:|
| 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)を参照してください。

#概要
前回はURDFの基本的な書き方を見てきました。もっと詳しい書き方を解説します。このページまでを理解すればURDFのうちrvizの表示に必要な要素はほぼすべて出そろいます。

# 形状・色の記述
前回のURDFをもとに内容を一部追加します。前回の箱に加えて、円柱、球の形をrvizで表示します。

```xml:vis_lecture/urdf/simple_body2.urdf
<robot name="test_robot">
  <link name="base_link"/>

  <joint name="body1_joint" type="fixed">
    <parent link="base_link"/>
    <child  link="body1_link"/>
  </joint>
  <link name="body1_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 2.0"/>
      </material>
    </visual>
  </link>

  <joint name="body2_joint" type="fixed">
    <parent link="base_link"/>
    <child  link="body2_link"/>
    <origin xyz="0.5 0 0" rpy="0 0 0"/>
  </joint>
  <link name="body2_link">
    <visual>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <material name="green">
        <color rgba="0.0 1.0 0.0 2.0"/>
      </material>
    </visual>
  </link>

  <joint name="body3_joint" type="fixed">
    <parent link="base_link"/>
    <child  link="body3_link"/>
    <origin xyz="-0.5 0 0" rpy="0 0 0"/>
  </joint>
  <link name="body3_link">
    <visual>
      <geometry>
        <cylinder length="0.3" radius="0.1"/>
      </geometry>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <material name="blue">
        <color rgba="0.0 0.0 1.0 2.0"/>
      </material>
    </visual>
  </link>
</robot>
```

```shell:実行
roscd vis_lecture/urdf/
roslaunch urdf_tutorial display.launch model:=simple_body2.urdf  
```

以下のようなGUIが立ち上がります。このURDFの中には4つのLinkがあります。1つは基準点を表す`base_link`で残りの3つは3種類の図形に対応しています。`<link>`の中身はほぼ同じで`<visual>`の`<geometry>`の中身だけが違います。違いをリストアップすると

* body1_link: `<box size="0.3 0.3 0.2"/>`
* body2_link: `<sphere radius="0.2"/>`
* body3_link: `<cylinder length="0.3" radius="0.1"/>`

それぞれが何を表しているのかは画像を見れば一目瞭然ですが、boxは箱型を表します。sizeの後の数字はx、y、zそれぞれの軸方向の長さです。sphereは球で半径を指定します。cylinderは円柱で、底面の円の半径を高さを指定します。

![rviz2-1.png](https://qiita-image-store.s3.amazonaws.com/0/254442/47131e66-363a-7da8-4f60-a9fe0c4f57ed.png)

# 色の記述
同じ色の物体を複数作るときには以下のような書き方を行います。このように書くと1回色の定義をして、あとは色の名前を指定するだけで色が使えます。

```xml:vis_lecture/urdf/simple_body3.urdf
<robot name="test_robot">
  <material name="red">
    <color rgba="1.0 0.0 0.0 2.0"/>
  </material>

  <link name="base_link"/>

  <joint name="body1_joint" type="fixed">
    <parent link="base_link"/>
    <child  link="body1_link"/>
  </joint>
  <link name="body1_link">
    <visual>
      <geometry>
        <box size="0.3 0.3 0.2"/>
      </geometry>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <material name="red"/>
      </visual>
  </link>

  <joint name="body2_joint" type="fixed">
    <parent link="base_link"/>
    <child  link="body2_link"/>
    <origin xyz="0.5 0 0" rpy="0 0 0"/>
  </joint>
  <link name="body2_link">
    <visual>
      <geometry>
        <box size="0.3 0.3 0.2"/>
      </geometry>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <material name="red"/>
    </visual>
  </link>
</robot>
```

```shelll:実行
roscd vis_lecture/urdf/
roslaunch urdf_tutorial display.launch model:=simple_body3.urdf
```

上記のように初めに色を定義している`<material>`を書き、`<link>`の中では`<material name="red"/>`のように色を指定します。

![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/254442/841d9896-7a43-03bc-9bd0-3c80c9b1aeb0.png)

# jointの記述1(多関節ロボット)
今まではただ物体が空間上に置かれるだけでロボットっぽさがありませんでした。fixed以外のjointを使うことで動きのあるロボットを表せます。

```xml:vis_lecture/urdf/simple_body4.urdf
<robot name="test_robot">
  <material name="red">
    <color rgba="1.0 0.0 0.0 2.0"/>
  </material>

  <link name="base_link"/>

  <joint name="body1_joint" type="fixed">
    <parent link="base_link"/>
    <child  link="body1_link"/>
  </joint>
  <link name="body1_link">
    <visual>
      <geometry>
        <box size="0.1 0.1 0.5"/>
      </geometry>
      <origin xyz="0 0 0.25" rpy="0 0 0"/>
      <material name="red"/>
    </visual>
  </link>

  <joint name="body2_joint" type="revolute">
    <parent link="body1_link"/>
    <child  link="body2_link"/>
    <origin xyz="0.1 0 0.5" rpy="0 0 0"/>
    <limit lower="-1.5" upper="1.5" effort="0" velocity="0"/>
  </joint>
  <link name="body2_link">
    <visual>
      <geometry>
        <box size="0.1 0.1 0.4"/>
      </geometry>
      <origin xyz="0 0 0.2" rpy="0 0 0"/>
      <material name="red"/>
    </visual>
  </link>

  <joint name="body3_joint" type="revolute">
    <parent link="body2_link"/>
    <child  link="body3_link"/>
    <origin xyz="0.1 0 0.4" rpy="0 0 0"/>
    <limit lower="-1.5" upper="1.5" effort="0" velocity="0"/>
  </joint>
  <link name="body3_link">
    <visual>
      <geometry>
        <box size="0.1 0.1 0.4"/>
      </geometry>
      <origin xyz="0 0 0.2" rpy="0 0 0"/>
      <material name="red"/>
    </visual>
  </link>
</robot>
```

```shelll:実行
roscd vis_lecture/urdf/
roslaunch urdf_tutorial display.launch model:=simple_body4.urdf
```

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/254442/9220bd23-0cd8-68e9-efa8-418e600ad75f.gif)

上の画像のように一緒に表示されるGUIのスライダーを動かすことでロボットを動かすことができます。
さて、今回のURDFが今までと違う場所は`<joint>`タグの中身です。代表としてjoint2の中身を見てみましょう。

```xml:vis_lecture/urdf/simple_body4.urdfの一部
<joint name="body2_joint" type="revolute">
  <parent link="body1_link"/>
  <child  link="body2_link"/>
  <origin xyz="0.1 0 0.5" rpy="0 0 0"/>
  <limit lower="-1.5" upper="1.5" effort="0" velocity="0"/>
</joint>
```

typeが今までfixedだったのがrevoluteになっています。これはタイヤのように1回転はせずに、関節のように回転の限界のあるヒンジ構造を表します。またrevoluteの場合は`<limit>`タグの記述が必須になります。lower、upperは回転角の下限、上限でラジアンで表します。-1.5rad~+1.5radは大体-90deg~+90degを表します。effortとvelocityは関節が出せる最大の速度とトルクを示します。これはurdfの仕様上必須でgazeboシミュレーターで使用する値なのですが、今は適当に0を入れておきます。

#まとめ
今回はサンプルコードを載せるだけで細かい解説は省きました。各パラメーターが表しているものは以下のリンクで確認できます。実際に自分で値を変えながら動かしてみましょう。

#参考
[ROS wiki(urdf概要)](http://wiki.ros.org/ja/urdf/Tutorials/Create%20your%20own%20urdf%20file)
[ROS wiki(link要素解説)](http://wiki.ros.org/urdf/XML/link)
[ROS wiki(joint要素解説)](http://wiki.ros.org/urdf/XML/joint)

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