Fusion 360で作ったモデルをROS2で利用したい

## 背景
ROS2で関節のあるロボットを動かしたくなった。
KDLとかURDFとか使うんだよと同僚に教えてもらったので勉強したことをメモ。
Fusion 360からURDFを出力するアドインがあるそうなので、それをインストールし、Rviz2に表示するところまで目標にする。

## 準備
- Ubuntuの準備
WSL2でUbuntu22.04TLSをインストール
```
wsl --install -d Ubuntu-22.04
```

- ROS2のインストール
ROS2 humbleを使います。
ここは淡々と公式にしたがってインストールしていきます。
https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debs.html

- Fusion 360
公式からインストール。
※商業利用については個人向けライセンスは使えないはず。個人的な勉強なので気にしないで使う
https://www.autodesk.com/products/fusion-360/personal

## アドオンのインストール
fusion360でURDFを出力するアドオンがあるそう。いくつかフォークがあるそうだけど、以下を参考に<a href="https://github.com/SpaceMaster85/fusion2urdf">SpaceMaster85/fusion2urdf</a>を利用。

https://qiita.com/sfc_nakanishi_lab/items/83c10533e3eadd7cac56

インストールまではハマるところないかな？と思う。ダウンロードしたファイルを以下のコマンドをpowershell上で実行。
```
cd <path to fusion2urdf>
Copy-Item ".\URDF_Exporter\" -Destination "${env:APPDATA}\Autodesk\Autodesk Fusion 360\API\Scripts\" -Recurse
```

- はまりポイント
基本的に公式通り進めていくとインストールできると思いますが、Python3.9以上ではdistutilsの名前が変わったみたいでそのままでは動かない。実行時にエラーが見えない。
pullrequestが出てるがまだマージはされてないみたいなのでここに紹介。

```URDF_Exporter/utils/utils.py
from distutils.dir_util import copy_tree
```
```URDF_Exporter/utils/utils.py 
copy_tree(package_dir, save_dir)
```
この2行を、下のように直す。
```URDF_Exporter/utils/utils.py
from shutil import copytree
```
```URDF_Exporter/utils/utils.py
copytree(package_dir, save_dir, dirs_exist_ok=True)
```

個人的には、ソフトウェアのこういうところがめちゃくちゃ嫌い。
ハードウェアで言ったら、みんな使ってる半田ごて買ってきたけど、自分で直さないと使えませんよ！みたいなのが平然と出回ってる。解せぬ。


## Rviz2で表示するまでの実行手順
ここまでで準備ができたので、順番にいく。

### Fusion360でモデルを作成
気を付けること：
- Fusion360は英語にしておく
- アセンブリのジョイントを設定（拘束ではなくジョイントにする）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271412/9a2c5cc4-a512-e1e8-2318-4e3f816dae2e.png)

- 子部品→親部品の順に選択しないと正しくインポートされないらしい。
- base_linkを設定
base_linkは、そのモデルの基盤となるリンクのことで、単純に名前をbase_linkにするとよい。

### 実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271412/7ac2c3c2-b216-51c1-b7f6-13789774cfd1.png)

ここから、URDF_Exporterを実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271412/4f1ce68f-6180-8c13-5ca2-573e4cf6b02e.png)

正しく実行されると、保存先フォルダの確認、ROS1/ROS2の確認画面が出てくる。

### ちょっとした後処理
URDF変換といいつつ、実際に出てくるのはxacroなので、変換が必要。
先ほど出力したファイルを全て丸ごと、WSL上のROS2のworkspaceのsrcフォルダへコピーする。正しく配置すると以下のようなファイル構成。
```
/home/ubuntu/
     |--urdf_tutorial
        |--src
          |--launch
          |--meshes
          |--urdf
          |--CmakeLists.txt
          ...
```
WSL上でMakeする。
```
colcon build
source ./install/setup.bash
```

## 未解決編
ここからは未解決。
公式のチュートリアルに従えば、あとはlaunchするだけで表示できるはずだが、ROS2ではなぜか実行できない。また、URDFファイルもこの時点ではできていない。（なんでやねん！）

- xacroを実行してurdfを作成。
※colcon buildしてからじゃないとxacroは実行エラーになる。
```
$ ros2 run xacro xacro -o ./src/urdf/[robotname].urdf ./src/urdf/[robotname].xacro
```
- Rviz2で表示
rviz2を立ち上げ、add > RobotModelを選択して[OK]を押す。
```
$rviz2
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271412/0b1ed977-c56e-c05f-9df7-686731c04982.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271412/49c19a04-d856-767f-bb5b-9e754e900b39.png)

RobotModelを開き、Description SourceをFileに、その下のファイルタブからファイル名を選択するとロボットが表示されるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271412/f1d5acc4-1ef3-4442-f607-5b13a4f739a0.png)

これでやっと表示されました。
**なぜか先ほどFusion360上で設定した関節がぐちゃぐちゃになって出てきましたけどね！！！**

解決したら追記します。