ROS講座34 stlファイルをrvizで表示する。

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

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

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

# 概要
urdfでは基本図形として、直方体、円柱、球を表示することができます。しかし、実際のロボットに近い形を表したいときにはこれではなく、自由形状を記述できるSTLファイルを使うことができます。stlファイルの作り方から表示の仕方までを説明します。

# stlファイルの作成
CADを使ってモデリングをします。操作はCADによって異なりますが今回はFusion 360を例に説明します。

## モデルの作成
好きなように作ってかまいませんが、CADの原点が後々のモデルの原点にする（またはそこからわかりやすい位置にする）ことが大事です。また軸ですが、ロボットの慣例としてX軸が正面になります。

## stlファイルの出力
モデルを開いて、左側のメニューの一番上のコンポーネント名を右クリックします。ここで「STL形式で保存」を選びます。この次に出てくるメニューで「OK」を押すとSTLファイルが保存されます。

![vis_stlの生成.png](https://qiita-image-store.s3.amazonaws.com/0/254442/6d25949c-731c-e84c-3f9f-9bf206f92eba.png)

CADもUbuntu上で行えれば、すべてがUbuntuでできてよいのですが、Ubuntuでで使える良いCADってなかなかありません。

# stlファイルの編集
CADから生成したSTLファイルをそのままROSで使用することはできません。ROSで使うためには

* サイズ
* 軸の方向
* 原点の位置

を修正する必要があります。
特にサイズは重要です。多くのCADソフトでは基本単位は`mm`です。しかしROSは値は全てSI標準単位で表記するので単位は`m`です。つまり<font color="Red">サイズは必ず0.001倍する必要があります。</font>
STLファイルを修正するソフトはいくつかありますが、今回は「blender」を使います。

## blenderのインストール
blenderはWin、Mac、Linuxのすべてに対応している3Dモデリングソフトです。例えばWindowsなら[ここ](https://www.blender.org/download/)からダウンロードすることができます。blenderを起動すると「スタートページ」のようなものが出てくるので、画面の端をクリックすると、以下のような画面になります。
![vis_blender1.png](https://qiita-image-store.s3.amazonaws.com/0/254442/31487208-b5f6-6e8c-4ba4-5d15f413e07c.png)

## インポート
最初に画面の中に立方体があるので、左クリックで選択した後にdeleteキーを押して消します。そのあとに上にあるメニューバーの「file」->「import」->「STL(.stl)」を選び、出てくるウィンドウで先ほどCADで保存したSTLファイルを選びます。どうやら日本語に対応していないので「デスクトップ」は「□□□□□□」と表示されるのでそれっぽいものを信じて探そう。
![vis_stlのインポート.png](https://qiita-image-store.s3.amazonaws.com/0/254442/26b518d4-013b-2736-43a8-0d93a2b44fd6.png)

## 編集
軸の回転->サイズ変更->原点調整の順に行うのをお勧めする。
右側のウィンドウの黄色い箱の「object」ウィンドウを開く。Rotationのところで軸の入れ替えをする。Fusion360はビジュアル系のCADなのか上方向がy軸になる。X=90[deg]と入れるとz軸が上になる。またScaleはmm->mの変換のためにx、y、zともに0.001にする。Locationで原点を合わせれるが「この穴の真ん中ぴったりを原点にする」などということはできない。あらかじめCADでモデルを作るときに原点を意識するのが良い。

![vis_stlの編集.png](https://qiita-image-store.s3.amazonaws.com/0/254442/dd916acb-ecba-0901-263e-a7e0ca3d2e6a.png)

## エクスポート
インポートと同様に「file」->「export」->「STL(.stl)」と選択して、保存する場所を選びます。

![vis_stlのエクスポート.png](https://qiita-image-store.s3.amazonaws.com/0/254442/72ee87ab-f507-e97c-7a80-2a316fb28f9c.png)

# stlファイルの表示
ここからUbuntuとROSに戻ります。

## ソースコード
以下がstlファイルを表示するurdfです。`<visual>`タグの`<geometry>`タグの中に`<mesh filename="package://(ROSパッケージ名)/(相対パス).stl" />`のように書きます。

```xml:vis_lecture/urdf/stl_body.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>
        <mesh filename="package://vis_lecture/stl/stl_part.stl" />
      </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>
</robot>
```

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

表示が小さいので拡大してみてください。

![vis_stlの表示.png](https://qiita-image-store.s3.amazonaws.com/0/254442/2f5e9fcd-09cc-b668-00a0-014122205a7b.png)

# コメント
stlをrvizで表示するとどうしてもrvizの実行が重くなってしまいます。結局はrvizでは簡易的に確認するための形を基本プリミティブで表現するのが良いかと思います。

#参考
[blenderのインストール](https://blender-cg.net/download-install/)
[stlのrvizでの表示](http://ishi.main.jp/ros/ros_create_urdf.html)

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