URDF-Importerを使うコツ


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png" align="top" /> パターンがつかめてきた

ROS用の3DモデルであるURDFファイルは、Unityに読み込むことができます。
すでに提供されているURDF-Importerを使えばOKなのですが、ファイルによってはちょっとインポートにコツが必要な場合があります。
ということで一発で読めないURDFを場合別に対処しつつ読み込んでみます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/0ca6a83e-27d7-410a-864e-99bfc179a95f.png" width = 600 />

### Unityのバージョンに注意(2025.01.02追記)

URDF-Importerは2025年1月2日現在、更新が止まっています。
記事を書いた当時は問題がありませんでしたが、URDF-ImporterはUnity2020.xに対応しており、Unity2021.x以降では、[VHACD](https://github.com/Unity-Technologies/VHACD)が使えなくなっています。おそらく内部的にVHACDの場所が変更になったためです。
その場合、インポート時のウィンドウの「Select Convex Decomposer」のMesh Decomposerの設定をデフォルトのVHACDからUnityに変更することで読み込みができるようになります。
VHACDを使用したい場合、応急処置として、Unity2020.xで読み込んだものをプレハブとしてエクスポートし、Unity2021.x以降でインポートすることで対応できそうです。


### 準備１

まずURDF-Importerの導入については下記にまとめました。動画もついています。

https://qiita.com/Ninagawa_Izumi/items/f0c1a72c0ba011685d68

この記事ではURDF-Importerv0.5.2のバージョンを前提としています。

### 準備２

公開されているURDFをDLします。
① ロイドワン：https://github.com/Ninagawa123/roid1
② ガンダム　：https://github.com/gundam-global-challenge/gundam_robot
③ プリメイド：https://github.com/chikuta/premaidai_description
など

慣れている方はgit cloneでどうぞ。
もちろんzip形式でDLしてデスクトップで作業を進めることもできます。上記リポジトリのグリーンのCodeボタンからDownload ZIPします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/80971b01-c5ee-ffd2-0ec6-0d899ccfe961.png" width = 300/>



### コツその１ .urdfファイルを読み込める場合

①のロイドワンはインポーターに適合した.urdfファイルを持っています。
URDF-Importerの導入済みのUnityのAssetsディレクトリに→URDFフォルダをドロップし→中にある**roid1_urdf_unity.urdf**を右クリック→Import Robot From Selected URDFファイルを選択。
とすることで読み込むことができます。

### コツその２ .urdfファイルがあるが階層構造が違う場合

②のガンダムは.urdfファイルを持ちますが、そのままではディレクトリが適合しません。そのためインポート時にルートディレクトリか個々のファイルまでのパスをURDF-Importerに教える必要があります。方法については前述の動画にまとめておきました。
また、ルートディレクトリの選択でうまくいかない場合は、コツその３が参考になると思います。

### コツその３ .urdfファイルを書き換える必要がある場合

一発で読み込めない場合、URDF-Importer用に階層を整理することで読み込めるようになります。
まず、Assets内での.urdfファイルのディレクトリを、
```
URDF
 ├ xxx_description
 │       └meshes
 │       　　└.stlや.daeファイル
 └ xxx.urdf
```
のように置き直します。
今のところ一番上のディレクトリをURDFとする必要があるようです。

次に、xxx.urdf内のファイルのmeshデータのパスを整理します。

```
      <geometry>
        <mesh filename="package://xxx_description/meshes/xxx.stl" />
      </geometry>
```
「package://」が「URDF」ディレクトリを示しますので、上記のようにmeshファイル本体までの位置を先ほど置き直した階層構造に合致するようにパスで指定します。
コード内の該当箇所を一つ見つければ、あとは置換で一発変換してしまいましょう。


### コツその４ .xacroから.urdfへの変換

バージョンv0.5.2のURDF-Importerは惜しいことにURDFしか読み取ることができません。.xacroファイルしかもたないファイルはそのままでは読み取れないので、一度変換する必要があります。

例えば③のプリメイドにはいまのところ.urdfがありません。
モデル全体の.xacroはrobotsディレクトリに入っていますので、これを.urdfに変換します。

変換するには今のところROSの入ったUbuntu環境を使用することになります。
ROS環境のない方は検索でROSの導入方法を探してください...
```
$ cd ~catkin_ws/src #いつものROSのワークスペース
```
の中に、該当の.xacroファイルが入ったディレクトリを親ディレクトリごと入れ、その後で、
```
$ roscd
$ catkin build
$ source ~/catkin_ws/devel/setup.bash（環境によりパスが違うかも?）
```
を実行します。
これで変換のためのパスが通りましたので、xxxx.xacroファイルがある階層にcdで移動し、

```
xacro xxxx.xacro > xxxx.urdf
```
とします。
これで展開された.urdfができますので、あとはコツ３→コツ１の手順で読み込むことができると思います。

### 実行結果
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/4e7c0d0e-223e-4eac-39a9-8594a69264a2.png" width= 600/>

同じ手順でさまざまなURDFファイルをUnityに読み込むことができました。
ROS本でよく出てくるRP2ですが、今回初めて立体を見ることができた気がします。

**一つ一つのモデルの内部構造までは精査できていないので、使用するには修正が必要なものもあるかもしれません。**

### おまけ１ : nao の召喚はちょっと難しい
naoはmeshファイルそのもののデータは提供されていないらしく、別途ビルドする必要があるようです。
ビルド方法のヒントは下記に紹介されていました。

https://github.com/ros-naoqi/nao_meshes/issues/6#issuecomment-399157857

meshが作成できたらコツ３のフォーマットに階層に整理しパスを書き換えればインポート可能でした。
ただし内部処理はけっこう大変なようで、インポート完了までに時間がかかりました。
お時間のある方はパズルゲームのつもりで試してみてはいかがでしょうか。

### おまけ２ : 四脚を召喚してみよう！

以下は教えていただいたリポジトリです。URDFをまとめてDLできるらしいです。

https://github.com/chvmp/robots

### おまけ３ : 実行時の操作（2025.01.02追記）
URDF-Importerの標準機能として、インポート後にプロジェクトを実行すると、URDFのモデルを操作できます。
ヒエラルキーウィンドウにてロボットのオブジェクトを選択した状態でインスペクターウィンドウを見るとControllerに値を設定できるようになりますので、適当に値を入れます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/806a5ec2-ff72-f012-1dca-3e573ee85c43.png" width = 200>

Unityを実行中に、カーソルキーの上下で動かしたいジョイントを選択し、左右で回転させます。
選択したジョイントには色がつくはずですが、色がつかない場合は、ヒエラルキーウィンドウの中のロボットパーツのVisualsがCollisionsよりも上にくるように階層を変更してください。

そのまま実行するとロボットは下に落ちてしまうので、床を設置するか、もしくはBaseLinkをインスペクターウィンドウの設定で固定するとよいでしょう。

### おまけ４ : その他の詳しい情報（2025.01.02追記）

https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/urdf_importer/urdf_tutorial.md

https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/urdf_importer/urdf_appendix.md#file-hierarchy


### 参考

https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/urdf_importer/urdf_tutorial.md#setting-up-the-urdf-importer-in-unity-editor


### 謝辞
階層を指定する必要があるというコツをROS japan UGスラックの質問コーナーで教えていただきました。ありがとうございました。

### 関連記事

https://qiita.com/Ninagawa_Izumi/items/ee2c9dfbc5880adea0da