URDF kitchen : GUIでURDF作成を強力に補助

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) 2024アドベントカレンダー！

  
この記事は[ROS 2 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ros2) の参加記事です。

![urdf_kitchen_banner202550406.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/d0591654-94b9-4385-a00a-f2fefab9e4ed.png)


# URDFづくりをなんとかしたい

URDFはロボットのモデルを記述するためのデファクト・スタンダードな記述方法です。
自作のロボットをURDF化しておくと何かと便利ですが、いざ作るとなると大変な作業になりがちです。

CADなどからURDFを出力することもできます。しかし、ヒューマノイドタイプなど、多関節のメカを作っている場合、出力が思うようにいかず結局手打ちで調整する...ということも多いのではないでしょうか。  
  
Fusion360からの出力で全く問題なし！という場合もあるかと思います。もちろんその場合はこの記事はスルーで大丈夫です。（うらやましい）

いくつか既存の方法を試してみましたが、これぞといったURDF出力専門のツールはないような気がしています。
そこで、多少遠回りでも確実にURDFを組み立てられるツールを作った方が、かえって心穏やかにロボット開発人生を楽しめるのではないかと思い立ちました。9月ぐらいから少しずつ開発を進め、ようやく公開にこぎ着けました。
イマドキの作業ですのでAIコーディングに多くの部分をヘルプしてもらいながら作成しました。

下記のリンクから使えます↓

  
https://github.com/Ninagawa123/URDF_kitchen  

  
# URDF kitchen

さて、URDFキッチンはURDFを記述するための補助ツール群です。
料理をつくるように楽しく気軽にURDFを作成できることを目指しました。
今回は大まかな使い方を紹介します。

※URDF化したいロボットのCADやCGデータを持っていることが前提となります。練習用のSTLもGitHubに登録していますので、記事の最後で案内します。

# STEP 1 : 仕入れ・仕込み "Stl Sourcer"

まず最初に、CADやCGソフトなどで、ロボットを一塊のパーツごとにSTLファイルとして書き出す作業があります。

一緒に動く部分をひとまとまりのユニットとして捉え、お手持ちのソフトで、パーツのまとまりをSTL形式で書き出していきます。
この時、動きの支点が座標の原点となるように書き出すことがポイントです。
(この操作は、CADで行うもので、Stl Sourcerではできません。)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/24429358-563b-5ae3-dc3a-700e97a9198c.png" width = 400/>

上図はSketchUPでの設定例です。例えばサーボの出力軸の先端を、CAD座標の原点としてSTLで書き出します。このユニットはx軸（赤い線）を中心に回転するという意味になります。

urdf_kitchenではこの作業のサポートとして、"Stl Sourcer"というSTLファイルの仕込みをヘルプするツールを用意しました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/87b787b1-b1e4-6283-0923-6bf53f625231.png" width = 400/>

このツールではSTLファイルの原点を調整したり、座標軸を変更したりできます。

#### Stl Sourcerの操作方法
操作方法は
[R]キーが視点のリセット
[A,D,W,S,Q,E]キーがSTLの90度ずつの回転
[T]キーはワーヤーフレームモードのオンオフ切り替え
となります。

紫色の軸付きマーカーが新しい中心点を示し、アローキーで位置を直感的に操作することができます。アローキーを押す際にシフトやctrlを押すことで移動の微調整にも対応し、座標を数値で指定することも可能です。

また、「Set Front as X」ボタンを押すことで、STLの現在の見た目上の角度を基準に、xyz軸を再設定することもできます。（画面手前がx+,右がy+, 真上がz+となる）

Stl Sourcerは次のPartsEditorを作るためのライブラリ検証の過程で生まれたおまけツールです。同等の作業を慣れたCADツールで行ってしまうのが良いと思います。

#### 大事なルール（パーツの命名）

次以降の作業のための仕込みとして、ちょっとしたルールに従っていただく必要があります。

**STLを出力する際に、ロボットの左半身に位置するパーツは必ずl_ではじまるように**してください。また、中心に位置するパーツはc_で始まるようにしてください。
このルールに従っていただくことで、**左右対称のロボットの場合、右半身のパーツについては作業しなくてもOK**となります。

ここまでの工程で、**ロボットのすべてのパーツを"回転軸の中心が原点となるSTL"として出力するというプロセスが完了**していることになります。

#### 保存ディレクトリ

ディレクトリについてもルールがありますので、任意のロボット名の末尾を「_description」としたディレクトリを作成し、その中のmeshesディレクトリに先ここまでで作成したstlファイルをすべて入れてください。
また、meshesと同じ階層にurdfという空のディレクトリも作成しておいてください。
```
robotname_description
    ├ meshes
    │    ├ l_upper_arm.stl
    │    ├ l_lower_arm.stl
    │    ├ c_head.stl
    │    └ ...
    └ urdf
         └ *.urdf(このファイルはあとで自動作成)
```


# STEP 2 : 調理 "Parts Editor"

いよいよここからが本題です。
Parts Editorでは、パーツごとに、次のパーツがジョイント連結されるべきポイント座標を設定していきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/ebd24e91-6f8d-df25-b704-aa90450d3258.png" width = 400/>

#### Parts Editorの操作方法
まずLoad STLを押し、ロボットのパーツとなるSTLファイルを読み込みます。

読み込んだSTLファイルのどこに次のパーツが連結されるかをマーキングしていきます。
画面左下に8つのPoint座標があります。チェックを入れることでマーキング座標の設定が有効になります。
アーム型などはPoint 1のみの設定でOKですが、胴体から腕や車輪が複数でている場合には、ジョイントの数だけPointを設定してください。

操作方法はStl Sourcerと同様で、[R]キーが視点のリセット、[A,D,W,S,Q,E]キーがSTLの90度ずつの回転で、[T]キーはワーヤーフレームモードのオンオフ切り替えです。紫色の軸付きマーカーが新しい中心点を示し、アローキーで位置を指定します。（シフトやctrlを押すことで移動の微調整にも対応し、座標を数値で指定することも可能です。）

**目標にセンターを合わせて入れてスイッチ**...という作業になります。

また、ここでパーツの重さを実測して入力しておくことで、イナーシャの計算などもできてしまいます。左側中央にパラメータの入力欄がありますので、値を入れたところ、たとえばMass(kg)にチェックを入れてCalculateボタンを押すと、それに応じた慣性テンソルが計算されます。（※イナーシャの計算方法が間違っていたらご指摘ください。）

パーツの回転方向の設定もここで行います。ラジオボタンで回転軸を選べます。（RotateTestボタンでアニメーションします！）
STLへの着色もできますので、カラーの選択も試してみてください。

一通りの設定ができたら、「Export XML」ボタンを押します。
現在の設定が、STLと同じファイル名の.xmlファイルとして出力されます。
**xmlファイルはstlと同じmeshesファイルに格納**します。

この作業は地道でなかなか大変ですが、**左右対称のロボットの場合は、中心のパーツと左側のパーツのみ**の作業でOKです。

#### ここで右側パーツをバルク出力！

入力の苦労を文字通り半減できるのが、この一括変換機能です。
「Batch convert "l_"  to "r_" in /meshes」ボタンを押し、meshesディレクトリを指定することで、左右反転したstlファイルと、それに準じたxmlファイルを一気に作成できます。

全てのパーツについてのxmlファイルが出力できたら、いよいよ組み立て工程です。

# STEP 3 : 盛り付け "Assembler"

いままで設定してきたパーツをグラフィカルなノードで組み立てていく工程です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/09cbbd9d-3d41-488f-b274-ec143a7bb402.png" width = 600/>

まず、「Import XMLs」ボタンを押し、先ほどまでの設定ファイルを入れた「meshes」ディレクトリを指定します。
すると、パーツのSTLと該当する設定ファイルがノードパネルに紐づいた状態で画面に表示されます。
あとはこれをつなぎ合わせていきます。

base_linkは固定となっており、ロボットの要となる腰などのパーツをまずそこに接続します。
ノードを開くとインスペクタウィンドウが開き、パーツの設定を変更することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/81338db5-08b1-2e86-c43b-4178f9c16281.png" width = 400/>

飾りのようなパーツもここで処理できます。[+]AddボタンでSTLの原点位置にポイントを追加することができるので、そこに飾り用のSTLデータを連結できます。飾り用のSTLのインスペクタウィンドウで「MasslessDecoration」を指定すると、URDF書き出しの時によき感じに処理します。

また、詳細な設定をやり直したい場合は、新しいターミナルを開いてそこからPartsEditorを立ち上げ、xmlを保存してください。そのxmlファイルをこのインスペクタのしたにあるボタンで読み込むことで、新しい設定を反映できます。

部品が多くなるとこのポチポチつなぐだけの連結作業でも時間がかかります。
「Save Project」ボタンがありますので、適宜このプロジェクトを保存するようにしてください。

左上のロボット名はディレクトリ名から自動生成されます。これはあまり変更しない方がラクです。ディレクトリ名とurdf内のパスに使われる名前が一致している必要があるため、変更の場合は気をつけてください。

#### urdfファイルを出力！

すべてのノードが接続できたら、URDFを出力します。
「Export URDF」ボタンを押し、パッケージのルートとなる「〜_description」 のディレクトリを指定してください。〜_description/urdfの位置に、urdfファイルが出力されます。

ちなみに、UnityのURDF-importer用のファイルを出力するボタンもつけました。違いは.urdfの置き場所です。こちらは指定した階層にSTLファイルも含めた内容を_descriptionディレクトリごと書き出します。

# urdfファイルの表示テスト

最後にチェックを行います。このチェックには外部の便利ツールを利用させていただきます。

open urdf-loadersというボタンを開くと、Garrett Johnson氏が開発したURDFを表示できる強力なブラウザツールのURLに飛びます。

https://gkjohnson.github.io/urdf-loaders/javascript/example/bundle/

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/6d29b220-7807-f489-1c57-010cf47ea34c.png" width = 500/>

ここでブラウザ画面に先ほどの「〜_description」フォルダをドロップすると、万事うまく行っていればURDF化されたロボットが表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/47c5d940-9e60-484c-7e49-5b696da32d5b.png" width = 500/>

ロボットが表示されない場合、show controlsの文字をクリックしてみてください。スライドバーが表示される場合は、urdfは有効です。
ロボットのサイズによっては初期に豆粒みたいに小さく表示される場合がありますので、その場合はマウスホイールやピンチアップで拡大してみてください。
それでも表示されない場合は、stlのパスの設定がうまくっていない可能性が高いので、urdfファイルを確認してみてください。

## おわりに
urdfの手書きは大変ですが、初心者にとっては自分で入力することでロボットの構造などを把握したり、パラメータの変更なども入力で対応できるなど、理解を深める上で少しだけ良い点もあると思います。

CADの機能拡張などで一気に出力した場合、ちょっとした不具合の修正などで融通が効かない場面もあると思います。
URDF kitchenではあくまで手作業の補助ツールという側面が大きく、大変な部分も多いですが、パーツごとにプロセスを踏める分、修正や調整がしやすいという利点があると思います。少なくとも自分にとってはブラックボックスなオートメーション出力よりも見通しが立ちやすく、扱いやすいツールになっています。

VScode上でURDFをビジュアライズできるプラグインがいくつかあるようなので、出力後のURDFの編集には、そちらを使用すると便利そうです。

https://note.com/npaka/n/n77d8bafc857b


https://marketplace.visualstudio.com/items?itemName=morningfrog.urdf-visualizer

## AIコーディングのパワー
今回のツールの作成には、ChatGPTとClaudeを使用しました。とくにClaudeはPythonのコーディングが上手で、大変助かりました。自分一人では到底つくれないだろうというプログラムが、AIとの協業コーディングのおかげで実現し、とても良い経験になりました。

それではみなさん、よいロボット開発ライフを！


# シリーズ記事

最後にURDFとの格闘の歴史をリンクしておきます。

https://qiita.com/Ninagawa123/items/411746933d221cb43e9d

https://qiita.com/Ninagawa123/items/522bc711b77fd1d0e48d

https://qiita.com/Ninagawa123/items/d65e92877246e649cca6

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

https://qiita.com/Ninagawa123/items/b24ceee29755e09b4d73

https://qiita.com/Ninagawa123/items/ce5ea21939931a241537

https://qiita.com/Ninagawa123/items/e7bfa821f49a054833ae

https://note.com/ninagawa123/n/nb20cc9b41e47

https://qiita.com/Ninagawa123/items/45f5e3ef11e419c471b4

https://qiita.com/Ninagawa123/items/29e6692eaa22bfb1c4de