ROS2で表示できるレゴ3Dモデルを作る方法

これは[ROS2アドベントカレンダー2022](https://qiita.com/advent-calendar/2022/ros2)の22日目の記事です。

# 要約

* ROS2制御のロボットを作るのにレゴを使いたい。
* ロボットをROSで扱うために、URDFを作りたい。
* しかし、ハマるポイントがあるので、上手くいく方法を共有する。

# 動機

私はロボットをレゴで作ります。ロボット制作には試行錯誤がどうしても必要であり、組み立てなどの設計変更が何度起こります。この面倒な作業もレゴを使えば容易にできます(むしろ楽しい)。また、ロボット制作時に頭をよぎる「強度は十分か？」という課題についても、「これはあくまで趣味での制作。なので強度を求めない」と割り切れば何も問題ありません。壊れたらまた組む、交換するで即解決ですw

オリジナルの4脚ロボットをレゴで制作する際に、URDFが必要になりました。そのときに見つけた上手くいく方法を共有します。

なお、この4脚ロボットはROSの[champパッケージ](https://github.com/chvmp/champ/tree/ros2)で動いております。作った4足ロボットをchampで動かす方法は実はシンプルでして、ロボットの構造や寸法をURDFで渡してやると出来上がり、という神のように素晴らしいパッケージです。詳細が気になる方は[champ_setup_assistant](https://github.com/chvmp/champ_setup_assistant)を参照ください。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">4本足で歩くロボットを作りました。<br><br>Lego Compatible Quadruped Robot <a href="https://t.co/o9JNLtx91l">https://t.co/o9JNLtx91l</a><a href="https://twitter.com/hashtag/%E3%83%AC%E3%82%B4%E4%BA%92%E6%8F%9B?src=hash&amp;ref_src=twsrc%5Etfw">#レゴ互換</a> <a href="https://twitter.com/hashtag/lego?src=hash&amp;ref_src=twsrc%5Etfw">#lego</a> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://twitter.com/hashtag/ROS?src=hash&amp;ref_src=twsrc%5Etfw">#ROS</a> <a href="https://twitter.com/hashtag/champ?src=hash&amp;ref_src=twsrc%5Etfw">#champ</a> <a href="https://twitter.com/hashtag/minipupper?src=hash&amp;ref_src=twsrc%5Etfw">#minipupper</a></p>&mdash; nisshan_ にっしゃん (@nisshan_) <a href="https://twitter.com/nisshan_/status/1586913348032946176?ref_src=twsrc%5Etfw">October 31, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# レゴのモデリングアプリ

まずレゴを組み合わせて3Dモデルを作ります。無料で使えるツールが現在(2022年11月)2つあります。

|  ツール名  | [Lego Studio](https://www.bricklink.com/v3/studio/download.page) | Mecabricks |
| -------- | ----------- | ---------- |
| 使い方      | PCにアプリインストール | ブラウザ |
| 利用可能OS | Win,Mac | ブラウザが動くもの何でも |
| exportできる3Dモデルフォーマット | <ul><li>Collada (dae)</li><li>Pov-Ray</li><li>Sketchfabへの直接export</li> | <ul><li>Collada (dae)</li><li>OBJ</li><li>STL</li></ul> |
| 制約 |  | 要アカウント(無料)<br/>オンライン |
| 配布元 | [bricklink](https://www.bricklink.com/v2/main.page)。オリジナルのモデルを公開したり、パーツを購入できるサイト。 | [Mecabricks](https://www.mecabricks.com/en/)。オリジナルのモデルを公開しできる。 |
| 他の機能 | <ul><li>レゴ組み立て手順を作成できる。</li><li>直接bricklinkにuploadし公開できる。</li></ul> | <ul><li>直接Mecabricksにuploadし公開できる</li></ul> |
| URDF化 | 時々上手くいく | 100%上手くいく |

これらのアプリは、レゴ部品を画面内で自由に呼び出し、サクサクとパーツがはめて組み立てられます。かなり快適です。別の言い方をすれば、レゴを買わなくても無限に組み立てられる夢のようなアプリですので、「レゴ持ってないし…」という方も試してみてください。

## Lego Studio
![LegoStudio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/83f89720-270c-abbc-cbea-c8d35d50bdcf.png)

## Mecabricks
![Mecabricks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630585/7da23592-48d3-0c4d-2090-fc947305531a.png)


ちなみに、私がbricklinkで公開しているレゴモデルはこちらです。
[Playable Bass Drum](https://www.bricklink.com/v3/studio/design.page?idModel=173607)
<iframe width="560" height="315" src="https://www.youtube.com/embed/FrWGUomXlww" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 変換方法

URDFで読み込める3Dモデル形式は、STL (.stl)かCollada (.dae)です。アプリからexportしたものがそのまま使うと問題が起こります。具体的には、

* スケールがおかしい (ミリメートル単位。ROSはメートル単位)
* 原点がずれてる/原点を調整したい
* 読み込んでも表示されないことがある

という問題が起こりますので、これらを解決しながら変換していく必要があります。

下記の方法は試行錯誤して見出したやり方なので、アプリの仕様が変更されると上手くいかなくなるリスクがあります。なので、複数の方法を共有しておきます。

## 【おすすめ】 ① Mecabricksで作成しFusion360で手直しする

いまのところ100%成功している方法です。変換に3D CADのFusion360を使用します。

1. Mecabricks でモデルを組み立てる。
1. STL形式でexportする。
1. Fusion360にて、STLファイルをimportする。[やり方](https://knowledge.autodesk.com/ja/support/fusion-360/learn-explore/caas/sfdcarticles/sfdcarticles/JPN/How-to-import-or-open-a-file-in-Autodesk-Fusion-360.html)
1. 原点の位置がずれてたらFusion360上で直す。
1. たまに面の表裏が反対になっていることがあるので、反転する。インポートした物体の表面が全体的に黒いとサーフェスが裏返っています。[やり方](https://knowledge.autodesk.com/ja/support/fusion-360/learn-explore/caas/sfdcarticles/sfdcarticles/kA93g00000003M5.html)
1. Fusion360からSTL形式でexportする。
1. ROS2のURDFで読み込む。

## 【たまに上手くいかない】 ② Lego Studioで作成しSketchfabを経由して、ツールで変換する

成功確率はたまに上手く行かない程度です。あらかじめSketchfabのアカウントを持っている必要があります。あと手直しにはblenderとFusion360を使用します。手順が多いので、あまりおすすめはできません。

1. Lego Studio でモデルを組み立てる。
1. Sketchfabにアップロードする。
1. 一旦公開し、そのページからgltf形式でPCにダウンロードする。
1. blender上でgltfをimportし、以下の順で調整する。
	1. 軸の向きを回転する
	2. サイズを0.001倍 (ミリをメートルに変換)
	3. 原点の位置
1. blender上でSTL形式でexportする。
1. Fusion360上でSTL形式をimportし、以下の手順で直す
	1. 実寸とfusion上のサイズを比較し、縮尺を調整する※。結果的に0.401倍でOK。
	2. 原点の位置がずれてたら直す。
	3. メッシュの裏表が反対なので、反転する。
1. ROS2のURDFで読み込む。

blenderでスケール変換するとなぜかおかしなサイズになります。これはblenderの不具合かもしれませんので、直ったら※の手順は不要になるかもしれません。

## 【上手くいかないことが多い】 ③ Lego Studioで作成しツールで変換する

②の手順からSketchfabを経由する部分が含まれていない手順です。この③の手順で上手くいかないことがあったので、②の手順が生まれました。

1. Lego Studio でモデルを組み立てる。
1. Collada (.dae)形式でexportする。
2. blenderでDAEをimportし、以下の順で調整する。
1. blender上でgltfをimportし、以下の順で調整する。
	1. 軸の向きを回転する
	2. サイズを0.001倍 (ミリをメートルに変換)
	3. 原点の位置
1. blender上でSTL形式でexportする。
1. Fusion360上でSTL形式をimportし、以下の手順で直す
	1. 実寸とfusion上のサイズを比較し、縮尺を調整する※。結果的に0.401倍でOK。
	2. 原点の位置がずれてたら直す。
	3. メッシュの裏表が反対なので、反転する。
1. ROS2のURDFで読み込む。

# 完成

この動画では、ざっと以下の手順で動かしています。

1. 胴体、肩x4、上の足ｘ４、下の足x4のレゴモデルを作り、STL化する。
1. URDFでそれらのSTLファイルを読み込む。
1. launchしてrvizで表示する。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">URDFがやっとできた。 <a href="https://t.co/UYBq7afHf1">pic.twitter.com/UYBq7afHf1</a></p>&mdash; nisshan_ にっしゃん (@nisshan_) <a href="https://twitter.com/nisshan_/status/1584926558229532672?ref_src=twsrc%5Etfw">October 25, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

もっとスマートな方法があると思いますので、見出した方は↓で気軽にコメントくださいませ　m(_ _)m