Fusion360で作成したCADモデルをURDF化し、Unityに召喚し操作する

#はじめに

UnityとROS2を連携させることを可能にする[Unity-Robotics-Hub](https://github.com/Unity-Technologies/Unity-Robotics-Hub)が、最近ROS2対応しました。


Unity-Robotics-Hubには、「URDF-Importer」というドキュメンテーションが提供されており、Unity内にURDFファイルをインポートすることができます。

本記事では、三輪車を作成することを想定して、Fusion360で作成したCADモデルをURDF化し、Unity内に召喚し操作する方法について解説します。



#実行環境

本記事で用いる実行環境は以下の通りです。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i7-9750H  |
|  OS |  Windows10 |
| ROS2    |  Foxy Fitzroy |
|Unity|2020.3.16f1|




| 項目 | 値 |
|:-:|:-:|
| CPU |1.5GHz クアッドコア Cortex-A72(ARMv8、64bit L1=32KB、L2=1M) |
|メモリ |UD-RP4B8：8GB|
|  OS |  Ubuntu Desktop 20.04 |
| ROS2    |  Foxy Fitzroy |

##Fusion360で自作ロボットのモデルを作成する

[fusion2urdf](https://github.com/SpaceMaster85/fusion2urdf)を使用して、URDFファイルを作成します。
※2021/10/13にROS2対応しました。

ここでは、手順といくつかの注意点を記述します。


######0：Fusion360の言語を英語にする

* 出力されるファイルに日本語が混ざり、エラーの原因になります

######１：z軸が上になるように設定する

* Fusion360の座標系はデフォルトでY軸が上、ROS2はZ軸が上なので、ROS2に合わせる

* [Fusion360の軸の変更方法](https://www.niteco.co.jp/blog/setting-coordinate-system-3d-data/)

######２：モデリング

* ジョイントを作成する際のコンポーネントの選択順で親子関係が設定されます。子にあたるコンポーネントを先に、親にあたるコンポーネントを後に選択します。

例）タイヤ(子)→シャフト(親)、シャフト(子)→base_link(親)
 
######３：コンポーネント化して、アッセンブル

* base_linkを指定する（component１をbase_linkにするとダメらしいので、プロパティで名前をcomponet２に変更する）
* base_linkをFusionワールドの中心に配置しておく


僕が作成したモデルは以下のような三輪車です。キャスターはUnity側で作成します。（理由は後述します）

![スクリーンショット 2021-11-11 14.00.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035642/7ed7c387-e446-d967-17ca-d6d492223cc2.png)

![スクリーンショット 2021-11-11 14.00.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035642/8742e26e-d1e0-9e34-250e-03a7672476c9.png)



##Fusion360からURDFファイルを出力する

#####１：githubから[fusion2urdf](https://github.com/SpaceMaster85/fusion2urdf)をdownloadする

#####２：「URDF_Exporter」をFusion360のAPIにコピーする

* シェルでのpathの指定

```
$ cd <path to fusion2urdf>
```
例えば、以下のように指定します

```
$ cd ~/documents/fusion2urdf-master
```

* 続けて、「URDF_Exporter」をFusion360のAPIにコピーする

Mac OSの場合

```
cp -r ./URDF_Exporter "$HOME/Library/Application Support/Autodesk/Autodesk Fusion 360/API/Scripts/"
```

Windows OSの場合

```
Copy-Item ".\URDF_Exporter\" -Destination "${env:APPDATA}\Autodesk\Autodesk Fusion 360\API\Scripts\" -Recurse
```

#####３：Fusion360でURDF_Exporter」を実行

* Fusion360の「ツール」→「アドイン」→「スクリプト 」→「URDF_Exporter」を実行

* errorが出た場合は、エラーメッセージに従う

* successした場合は、「hogehoge_description」というフォルダにxacroファイルなどが入っていることを確認する


#####４：URDF(xacro)→URDF変換する

UnityにURDFを召喚するための「URDF-Importer」は「.urdf」というファイル形式のみを扱います。しかし、「fusion2urdf」では「.xacro」ファイルが出力されます。（.xacroは、XML macroの略で、.urdfをより楽に書くためのもの）

そのため、「.xacro」を「.urdf」に変換する必要があります。こちらは、Ubuntu Desktop 20.04で実行しています。


変換手順

```
$ cd ~/my_workspace
$ . install/setup.bash
$ ros2 run xacro xacro -o /home/ubuntu/my_workspace/src/hogehoge_description/hogehoge.urdf /home/ubuntu/my_workspace/src/hogehoge_description/urdf/hogehoge.xacro
```

urdfファイルが完成し、指定したフォルダ内に出現していることを確認してください。

※xacroが入っていない人へ
[こちら](https://github.com/ros/xacro/tree/ros2/)からフォルダをDownloadし、workspace/srcに入れてビルドすればxacroが使えるようになります


##URDFをUnityにインポートする

#####１：package managerで「Add Package from Git URL」を選択し、`https://github.com/Unity-Technologies/URDF-Importer.git?path=/com.unity.robotics.urdf-importer#v0.5.0`を入力

#####２：Asset内にURDF_sampleというフォルダを作る

* その中に「hogehoge.urdf」と「hogehoge_description(ROS2 Package)」を入れる

※hogehoge_description(ROS2 Package) = fusion2urdfで作成したフォルダ
※hogehoge_descriptionフォルダにも「hogehoge.urdf」が入っていると思いますが、「URDF_sample」フォルダの中にも配置してください


######３：URDFをインポート

* URDF_sampleのフォルダにある「hogehoge.urdf」を右クリックし、「import Robot from Selected URDF file」を選択し、「Import URDF」をクリック。モデルが出現することを確認してください。


##URDFをUnity内で操作する

[Unity-Robotics-Hubのサンプルのスクリプト](https://github.com/Unity-Technologies/Robotics-Nav2-SLAM-Example/blob/main/Nav2SLAMExampleProject/Assets/Scripts/AGVController.cs)を使うと便利です

* このスクリプトのwheelに左タイヤと右タイヤのcomponentをDrag&Dropする

* 左右キーで直進、上下キーで旋回

* Modeを「Keyboard」に変更
※「ROS」の場合では、ROSからのTopicで制御することが可能になります。

![スクリーンショット 2021-11-11 142831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035642/7a1cb609-fd83-0517-5741-b89a2fc40395.png)


######僕のモデルの場合

キャスターをURDFファイルで作成すると、キャスターの摩擦によって真っ直ぐ走行できないことが確認されたため、キャスターはUnity側で摩擦ゼロのSphere Colliderを設置しました。

[Unity-Robotics-Hubのサンプル](https://github.com/Unity-Technologies/Robotics-Nav2-SLAM-Example)でも同じ手法が使われていました。

![スクリーンショット 2021-11-11 14.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035642/f887e994-1c74-2a0f-e55e-1c551b126d98.png)


このように動けば成功です
![yamaha_3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035642/a45c8fa0-7147-dde0-f761-54309d191856.gif)


##おわりに
本記事では、三輪車を作成することを想定して、Fusion360で作成したCADモデルをURDF化し、Unity内に召喚し操作する方法について解説しました。

自作ロボットのシミュレーションや、Unityコンテンツに召喚するなどの様々な応用方法が考えられます。