Fusion360で描いたロボットモデルをROSのURDF形式に変換する

######概要
使ってみてすごいと思ったFusion360スクリプトの紹介になります。やってみてちょっとハマったポイントの補足もします。

######序
ROSのURDFとかXacroとかなんか難しそうですやん…？ → 「Fusion360 URDF」でググる → 神ツール発見

http://syuntoku14.hatenablog.com/entry/2018/09/24/085723
https://github.com/syuntoku14/fusion2urdf

基本的にはこちらのgithubに書かれているとおりにすればできます。

######github内に記されてることをかいつまんでまとめると、

- ボディ(複数可)を持ったコンポーネントが一つのリンクになります。
- コンポーネントを含んだコンポーネントには対応していません。コンポーネントに含まれていいのはボディのみ。作者の方はコンポーネントを含んだコンポーネントにも対応しようと思えばできそうな感じですがなんだか忙しそうです。
- コンポーネント間(=リンク間)のジョイントのうち、リジッド・スライダー・回転に対応しているらしいです。リジッド(固着)はともかくスライドはROSでどういう感じなのか理解できてないのもありましてとりあえず自分は回転しか試していないです。
- スクリプトを走らせるとファイルを変更してしまうのでうっかり上書き保存しないしないように気をつけましょう。というかバックアップをとっておきましょう。
- Fusion360のデフォルトではXZが平面でYが上になっているけど、Zを上にモデリングしたほうがいい。Yが上になっているFusion360のデータをURDFに変換するとロボットが横に倒れたようなURDFになる。
 ![rviz_robot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189966/762557f2-0923-17db-fd58-4b54646b40d9.png) (画像は上記githubから転載)

- base_linkに相当するコンポーネント名はbase_linkにする。他のコンポーネント名はなんでもいいけどスペース(空白文字)が含まれるのはダメ。たぶん日本語もだめ。


######特に記されていないがやってみてややハマった注意点

- ローカルに保存してあるCADデータに対しては実行できないぽい。変換したいデータはクラウドに上げる必要がある。
- Fusion360ではジョイント名(=関節名)はデフォルトで「回転○○」のような日本語になるが英語に変更しておく。そうしないとLinux環境にファイルを持ってきたあとのスクリプトによる変換作業がうまくいかない。たとえば
![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189966/45ad3905-9fab-2931-ed04-8cb372914b5c.png)
↑このままだとうまくいかないのでこんなふう↓にしたりする(別に「rev〇〇」でなくてもいい)。
![qiita-f3d-urdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189966/c5e9e2ee-3785-aafe-d9dc-b1d6942b00b8.png)
あらかじめFusion360の言語を英語にしておくのもいいかも。

- base_linkの固定を解除しておくように書かれているが解除しなくてもうまくいっている気がする
- このツールというよりFusion360の使い方なのかもしれませんが、ジョイントを連結するさい、**先に選んだほうが子リンクになり後に選ぶほうが親リンクになります。**
- 関節の回転の向きが意図と逆回転になってしまったらジョイント原点を親子それぞれ反転すると回転の向きが逆になります。
 ![qiita-f3d-joirev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189966/4c843edb-2495-04af-2252-7e04cf32a591.png)

- なぜかよく分かりませんがすべてのパーツが真っ赤なURDFができます。が、色を変える程度ならURDFの編集は簡単です。
- **スクリプト実行した時点での関節位置が0度とみなされてしまうようです。意図した0度の関節位置に移動させてからスクリプト実行したほうがよさそうです。**上のほうで作者様のgithubから転載させてもらったこの例ですが、
![rviz_robot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189966/1eb9528e-d898-8ba9-3f63-ed3648c58111.png)
公開されているデータをそのまま変換したようで、その状態ですべての関節が0度ということになってしまっているようです。あらかじめFusion360内ですべての関節を0度の位置に移動して(それに加えてROSで扱いやすくなるようCADデータ全体をZが上になるように回転しました)から変換すると、このようになります。
![Screenshot from 2019-05-22 21-26-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189966/f36209b4-461b-495a-0c51-a4df11cece6b.png)
さらに変換のさいに生成されるlaunchファイルにより起動される joint_state_publisher の GUI で関節をぐりぐり動かすとこのようになります。
![Screenshot from 2019-05-22 21-28-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189966/9b880351-b5e4-5817-c285-c5edfbafb859.png)
こちらのほうが元々の設計意図を汲んだURDFでしょう。繰り返しますが、意図した0度の関節位置に移動させてからスクリプト実行したほうがよさそうです。

- Fusion360内の関節のリミット設定もURDFに反映されます。何も設定していないと車輪みたいな扱いになったような。
- 位置制御でなく速度制御や力制御をしたいならURDFの編集が必要かも…？ros_controllと関係あるっぽいのですがそのあたり理解できていないです。
- 別にFusion360でなくてもSTLを出力できればURDFに取り込めますが、たいていの機械部品系CADは[mm]単位ですがROSでの単位は[m]ですのでそのことを意識して描くかSTLをURDFに取り込む前に大きさを変換するのは煩わしそうです。**が、このスクリプトを使うならこんなことは考えなくていいです。** 大きさを自動的に変換してくれてるみたいです。神に合掌。

私はこのツールを使わせてもらって某ロボット競技会向けに近藤科学のサーボでつくった機体をURDF化できました。**実機とrviz内の両方でオリジナルロボットがシンクロして動く**のは少し感動します(gazeboは難しそうでよく分かりません…)。しかし、根本のサーボが力不足でまともに動きませんでしたが…(苦笑)。**近藤科学のサーボをROSから動かせるパッケージをつくってくださった方もおられる**ので、その使用法のまとめもそのうち記したいと思います。そのさいにはFusion360内でつけたジョイント名がROS側の設定で必要になります。また、回転方向や0度の位置(サーボのニュートラルポジション)は実機とFusion360内のモデルで一致させておく必要があります。

![roboken.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189966/6db029da-f2e0-c409-0de0-ab44d4c30ed7.png)
![Screenshot from 2019-05-22 21-11-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189966/45ecbd9c-1504-a65c-d10f-d7bb6ef0e350.png)