ROS2でgazebo用のsdfを書く最初の一歩

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) あんちゅうもさく

# やること

https://qiita.com/Ninagawa_Izumi/items/411746933d221cb43e9d

前回のつづきです。
前回は**最小限のurdfファイル**を書いて、それが**rviz2で表示できるか**を確かめました。
書いたのは長方形のモノリスですが、**今回はそのモノリスをGazeboに表示**させてみたいと思います。
Gazeboで扱う標準ファイル形式はsdfとなります。
urdfをGazebo用に変換する方法もあるようですが、自分にはまだ難しいのでsdfを直接書いていきます。
とにかくモノリスを表示できるかどうかだけを今回は確かめたいと思います。

# 必要なもの
- ROS2が使える環境（Ubuntu 20.02 + ROS2/foxy）
- ROS2の基礎知識（topicの送受信デモを試した程度でよい）
- Gazeboが導入済み（バージョンはROS2に対応しているGazebo9以降を推奨）

# 参考
[Testing Gazebo and ROS 2 integration](http://gazebosim.org/tutorials?tut=ros2_installing)
[ 安曇野の森から > ROS(Robot Operating System)を使う > ロボット記述言語 ](
http://forestofazumino.web.fc2.com/ros/ros_urdf_xacro.html)
大変参考になりました。ありがとうございます。

# ROS2のパッケージを作る

まず適当なワークスペースに移動して、urdfテスト用のパッケージを作ります。
前回の続きなど、もともとある場合は不要です。


```shell
$ ~/dev_ws/src #ビルド済みで使える状態の適当なワークスペース
$ ros2 pkg create urdf_test --build-type ament_python --dependencies rclpy
```
新たにワークスペースを作ったという場合は、一応アクティベートもしておきます。
<details><summary>（アクティベートする場合はこちらをクリック）</summary><div>

```shell
$ CD ~/dev_ws/
$ source install/local_setup.bash
$ CD ~/dev_ws/src
```
</div></details>


# sdfを書く

sdfの中身を書いていきます。sdfはxml形式のファイルとなります。
今回はモノリスを含む環境ごとファイルに記述するので拡張子を「.world」とします。
（というのもモノリス単体をファイルにしてlaunchする方法をまだ知りません。）

```
$ nano test.world
```
nanoのところはもちろん vim でも codeでも使いなれたエディタでOKです。

```xml:test.world
<?xml version="1.0"?>

<sdf version="1.6">
  <world name="default">
    <!--地面を導入する-->
    <include>
      <uri>model://ground_plane</uri>
    </include>
    <!--ライティングを導入する-->
    <include>
      <uri>model://sun</uri>
    </include>

    <!--ここからモノリスの記述-->
    <model name='monolith'>
      <!--位置と角度。x,y,z,roll,pitch,yaw 単位はメートルとdegree-->
      <pose>0 0 0 0 0 0</pose>

      <!--パーツの記述-->
      <link name='body'>
        <pose>0 0 0 0 0 0</pose>
        <inertial>
          <!--質量-->
          <mass>1</mass>
          <!--慣性行列（後述）-->
          <inertia>
            <ixx>0.016667</ixx>
            <ixy>0</ixy>
            <ixz>0</ixz>
            <iyy>0.014167</iyy>
            <iyz>0</iyz>
            <izz>0.004167</izz>
          </inertia>
        </inertial>

        <!--表示用の記述-->
        <visual name='visual'>
          <geometry>
            <box>
              <!--x,y,zのサイズ（メートル）-->
              <size>0.1 0.2 0.4</size>
            </box>
          </geometry>
        </visual>

        <!--衝突判定の範囲-->
        <collision name='collision'>
          <geometry>
            <box>
              <!--x,y,zのサイズ（メートル）-->
              <size>0.1 0.2 0.4</size>
            </box>
          </geometry>
        </collision>

      </link>
    </model>

  </world>
</sdf>
```

上記はGazeboにモノリスを登場させる際のおそらく最小限ギリギリの必要要素になります。
奥行き10cm、幅20cm、高さ40cm、質量１の直方体です。
慣性行列は計算で求める必要があります。
[ ロボット記述言語 ](
http://forestofazumino.web.fc2.com/ros/ros_urdf_xacro.html)のサイトを参考に、
ixx = 1 / 12 x 質量 x (y^2 + z^2)
iyy = 1 / 12 x 質量 x (x^2 + z^2)
izz = 1 / 12 x 質量 x (x^2 + y^2)
で求めます。

# Gazeboでsdfを表示する


#### Gazeboを起動する

```
$ gazebo test.world
```

Gazeboが開くと同時に、設定したモノリスがビューの中央に出現しているはずです。
<img src =https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/359640ca-d27b-99fb-dab5-489aecbe0a99.png width= 500>

ちなみにgazeboのビュー画面の操作は、

- 左クリック＋移動：移動 (rvizでは回転）
- ホイール押下＋移動：回転 (rvizでは移動）
- 右クリック＋上下：拡大縮小 (rvizと同じ）

となっています。

また、画面上のメニューの十字矢印アイコンを選択すると、画像のように赤緑青のハンドルが出るのでそこを持って物体を移動させることができます。
重力が働いているので青矢印で上に持ち上げてから離すと下に落ちます。
同様に回転アイコンを選択するとモノリスを回転させることができます。
傾けて離すとどうなるかはお察しの通りです。

# つづき
これでヒューマノイドを記述するとなると、先は長そうです。
ジョイントとリンクで記述していく必要もありますし、今回出てこなかった要素もいくつかあります。
xacroを使って書いてさらに変換したりとか役者も多いですし、launchの作り方でも一苦労ありそうです。
ROS2環境でうまくいくよい方法が見つかるといいなと思います。

次回記事：

https://qiita.com/Ninagawa_Izumi/items/d65e92877246e649cca6

前回記事：

https://qiita.com/Ninagawa_Izumi/items/411746933d221cb43e9d