syuntoku14の進捗

進捗を書きなぐります

Fusion360からURDFを一撃で生成するスクリプトを書いた話

作ったもの

URDFを書くのが最高にめんどくさかったので、Fusion360のモデルからURDFを一撃で吐き出すアドインを作りました。

github.com

詳細や使い方、インストール方法などは全部READMEに書きました。そっちを参照してください(英語ですが、自信が無いです... 誰か添削してくれると喜びます)

吐き出すのは

  • URDFファイル
  • gazeboでシミュレーションするためのlaunchファイル

などです。

urdfだけでなく、確認用にlaunchファイルも吐き出します。

roslaunchすると、Fusionで作ったモデルがgazeboでシミュレーションできます。

例えば、

f:id:syuntoku14:20180920160144p:plain こんな感じのFusionのモデルが

f:id:syuntoku14:20180920160213p:plain

gazeboでシミュレーションできます(やったね)。

もちろんrvizでも確認可能です。

f:id:syuntoku14:20180924085234p:plain

欠点

Fusion側でモデルをきちんと定義しないと正しく動作しません。

例えば

  • リンクを全部コンポーネントとして定義する必要がある(Bodiesで全部保持してもダメ)
  • それぞれのコンポーネントをつなげるジョイントを定義する必要がある
  • revジョイント以外には対応していない

など、Fusion側での調整が必要になります。まあそれでもゴリゴリURDFを書くよりはずっと楽な上、デバッグも楽になると思うので...

コンポーネントさえきちんと定義すればちゃんと動作するはずですが、まだバグがあるかもしれません。 何か問題があればissueを投げてくれると泣きながら喜びます。スターをくれると更に喜びます。

Fusion360のアドインの開発について

公式のwebページ以外、書籍やネットにあんまり情報がない気がします。特に日本語の情報は全く無いんじゃないかな。とりあえず公式のリファレンスをひたすら参照しました。

公式のリファレンス:

https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-A92A4B10-3781-4925-94C6-47DA85A4F65A

http://help.autodesk.com/cloudhelp/ENU/Fusion-360-API/images/Fusion.pdf

そもそも私がFusion360を触ったことがなかったので、結構苦労しました。 はまりかけたこと:

  • occuranceとcomponentの違いに気をつけよう。occuranceがオブジェクトでcomponentがクラスに当たるのかな?
  • モデルの原点に気をつけよう。モデルの原点がいちいち異なってるとURDF的に正しく計算されないので、スクリプト上では一回全てのoccuranceのコピーを作成し、モデルの原点をworld座標系の原点と合致させている。
  • コンポーネントの作り方:
occs = allOccs.addNewComponent(transform)

ただし、この書き方で返ってくるのはComponentではないので注意。

  • 対応していないライブラリを入れるやり方が分からん。numpyなど入ってないので、行列演算はnumpyでできない。Matrix3D.transformByなどで出来そう。要調査。
  • ジョイントはrootcomponent.jointsに入っている。回転をrevoluteにしているなら、jointsのjoint.jointMotion.rotationAxisVector.asArrayで回転軸が得られる。
  • URDFにおいて、Inertiaは全部重心を原点に計算している。APIでは重心原点のInertiaを返す関数がないので、(returnValue, xx, yy, zz, xy, yz, xz) = physicalProperties_var.getXYZMomentsOfInertia()で得られた値を平行軸の定理と"Parallel plane theorem"(和名はわかんないです)を使って重心原点のものを計算しよう。 式はここに載っているので: Parallel Axis And Parallel Plane Theorem

  • physicalProperties_var.getXYZMomentsOfInertia()だが、多分公式のリファレンスが間違っている。返り値が(returnValue, xx, yy, zz, xy, yz, xz) と書いてあるが、計算してみたら返ってきた値は(returnValue, xx, yy, zz, xy, xz, yz)だった。むかつく。