Claude に URDF を生成させる
Inventor ファイルを直接 Claude に渡すのは不可。iLogic で質量特性 / 拘束を JSON ダンプして渡す、または YAML に手書きして渡すのが実用ルート。
要点: .iam / .ipt はバイナリ独自形式なので Claude で直接読めない。iLogic で質量特性とジョイント情報を JSON ダンプする、または YAML に手書きすることで Claude に URDF を生成させられる。
直接はなぜ不可か
.ipt/.iamは Autodesk 独自のバイナリ (OLE compound file + ShapeManager 内部形式)- Claude が使えるパーサ・ライブラリ (Python 等) は存在しない。FreeCAD の
InventorLoaderが部分パースできるが FreeCAD 環境が必要で、Claude の実行環境からは呼べない - Inventor API (iLogic / VBA / .NET) は Windows 上で Inventor プロセスに接続する必要があり、これも Claude の実行環境からは呼べない
Claude が扱える中間形式
| 形式 | 中身 | 扱えるか |
|---|---|---|
| STEP (.stp) | テキスト、ジオメトリ + アセンブリ階層 | 読めるが数十 MB。ジョイント情報は無い |
| OBJ (.obj) | テキスト、メッシュ + グループ名 | 読める。.mtl も |
| iLogic 出力 JSON | 質量特性 + 拘束情報 | 完壁 |
| BOM CSV | パーツ一覧 + iProperties | 完壁 |
| 手書きの構造記述 (YAML/Markdown) | リンクツリー + ジョイント指定 | 完壁 |
ルート A: YAML 手書き (一番早い)
ロボコン規模 (10-20 リンク) なら Inventor の iProperties → Physical タブで数値を目視して YAML に書くのが 30 分で終わる。
入力フォーマット
robot: my_robot
links:
- name: base_link
mass: 5.2 # kg
com: [0.0, 0.0, 0.05] # m, リンクローカル座標での重心
inertia: # kg·m², 重心での慣性テンソル
ixx: 0.02
iyy: 0.02
izz: 0.03
ixy: 0
ixz: 0
iyz: 0
mesh:
visual: meshes/visual/base_link.dae
collision: meshes/collision/base_link.stl
- name: arm_link_1
mass: 1.8
com: [0.05, 0.0, 0.1]
inertia: {ixx: 0.005, iyy: 0.005, izz: 0.001, ixy: 0, ixz: 0, iyz: 0}
mesh:
visual: meshes/visual/arm_link_1.dae
collision: meshes/collision/arm_link_1.stl
joints:
- name: joint_1
type: revolute # revolute / prismatic / fixed / continuous
parent: base_link
child: arm_link_1
origin: [0.0, 0.0, 0.15] # 親リンクのローカル座標でのジョイント位置
rpy: [0, 0, 0]
axis: [0, 0, 1]
limit:
lower: -3.14
upper: 3.14
effort: 30 # N·m
velocity: 3.14 # rad/sClaude への渡し方
YAML をチャットに負り付けて「この仕様で URDF (と xacro) を作って」と依頼すれば、Claude は完全な URDF を出力する。xacro 化して共通部分をマクロにまとめることも可能。
ルート B: iLogic で JSON ダンプ
リンク数が多い、または繰り返し使うなら iLogic スクリプトを 1 回書いて周す。
スクリプト雛形
' export_urdf_props.iLogic
' アセンブリを開いた状態で実行。コンポーネントごとの質量 / CoM / 慣性テンソルを JSON で吐く。
Dim oAssy As AssemblyDocument = ThisApplication.ActiveDocument
Dim oOccs As ComponentOccurrences = oAssy.ComponentDefinition.Occurrences
Dim sw As System.IO.StreamWriter = New System.IO.StreamWriter("C:\temp\urdf_props.json")
sw.WriteLine("{""links"": [")
Dim first As Boolean = True
For Each oOcc As ComponentOccurrence In oOccs
Dim mp As MassProperties = oOcc.MassProperties
If Not first Then sw.WriteLine(",")
first = False
sw.WriteLine(" {")
sw.WriteLine(" ""name"": """ & oOcc.Name & """,")
' Inventor 内部単位: 質量は kg (換算不要)、長さは cm (m へ × 0.01)
sw.WriteLine(" ""mass_kg"": " & mp.Mass.ToString() & ",")
sw.WriteLine(" ""com_m"": [" & (mp.CenterOfMass.X * 0.01) & "," & _
(mp.CenterOfMass.Y * 0.01) & "," & (mp.CenterOfMass.Z * 0.01) & "],")
Dim Ixx, Iyy, Izz, Ixy, Iyz, Ixz As Double
mp.XYZMomentsOfInertia(Ixx, Iyy, Izz, Ixy, Iyz, Ixz)
' Inventor 内部単位: kg·cm² → kg·m² は × 1e-4
sw.WriteLine(" ""inertia_kgm2"": {")
sw.WriteLine(" ""ixx"": " & (Ixx * 1e-4) & ",")
sw.WriteLine(" ""iyy"": " & (Iyy * 1e-4) & ",")
sw.WriteLine(" ""izz"": " & (Izz * 1e-4) & ",")
sw.WriteLine(" ""ixy"": " & (Ixy * 1e-4) & ",")
sw.WriteLine(" ""ixz"": " & (Ixz * 1e-4) & ",")
sw.WriteLine(" ""iyz"": " & (Iyz * 1e-4))
sw.WriteLine(" }")
sw.WriteLine(" }")
Next
sw.WriteLine("]}")
sw.Close()単位換算
Inventor の内部データベース単位は cm / kg / rad。MassProperties.XYZMomentsOfInertia は kg·cm² 相当を返す (g·cm² ではない)。URDF は m / kg / kg·m²。換算係数:
| 項目 | Inventor 内部 | URDF | 係数 |
|---|---|---|---|
| 長さ (CoM) | cm | m | × 0.01 |
| 質量 (Mass) | kg | kg | × 1 (換算不要) |
| 慣性モーメント (XYZMomentsOfInertia) | kg·cm² | kg·m² | × 1e-4 |
Autodesk 資料に明示なく、g·cm² と誤って書かれた解説記事もあるので注意。実機質量が 2.5 kg のパーツを export したら JSON が 0.0025 で出て初めて発覚するパターン。判定は「予想 kg オーダーの部品を 1 個 export して比較」が確実。
拘束の抽出は難しい
拘束情報 (ジョイントの親子と軸) も iLogic で取れるが、Inventor の Constraint API は面・軸・点ごとの制約を列挙する形なので URDF のジョイント定義に直接マップしにくい。Insert 拘束は Rotational にほぼ 1:1、Mate 平面 × N は Rigid か Slider か Motion か判定が要る (詳細: Inventor Constraint と Joint の関係)。
実用上は:
- Assembly 側で Rotational / Slider などの Joint を先に定義し、iLogic では
AssemblyJointsを walk する方が早い - Joint 情報の抽出は
AssemblyJointDefinition.OriginOneから。ただし戻り値はGeometryIntentで、直接.AxisVector/.Pointを呼ぶとランタイムエラー ("Public member 'AxisVector' on type 'GeometryIntent' not found") GeometryIntent.Geometryを取り出して型判定 (WorkAxis / Cylinder Face / Circle Edge / WorkPoint / Vertex) して axis と origin を抽出する必要がある
ルート C: BOM CSV
Inventor の BOM エディタで iProperties 列を CSV エクスポート。質量は取れるが、慣性テンソルは BOM には出ちない (Physical タブを見にいく必要)。質量だけ CSV で、慣性は後で手書き追加するハイブリッドも実用的。
ルート D: STEP も一緒に渡す (参考用)
STEP を Claude に上げると、アセンブリ階層 (NEXT_ASSEMBLY_USAGE_OCCURRENCE) とパーツ名を拾えるのでリンク名の青写しには使える。ただし:
- ファイルサイズが大きい (千 KB - 数十 MB)。十リンク規模ならさして問題ないが、千パーツ規模だとコンテクストを食う
- ジョイント・拘束情報は入っていない (STEP 仕様の制約)
- 慣性テンソル・質量は入っていない (制造情報中心でない)
例: YAML → URDF の依頼の仕方
Chat で以下と依頼:
この YAML 仕様を元に URDF を作って。2 つのアームを持つロボットなので共通部分を xacro マクロ化して。<
.md.mdx>meshes はpackage://my_robot_description/相対で。リンク名は英数字 + アンダースコアにして。
Claude が出す:
robot.urdf.xacro(トップファイル)arm_macro.xacro(アーム共通部分)<robot>_description/package.xmlとCMakeLists.txt- 予想されるつまづきどころのリスト
なぜこのスタイルが有効か
- Inventor を自動化するのはやめて Claude を URDF ジェネレータとして使う のが確実
- 数値の抽出 (質量・慣性) は Inventor が得意、XML 生成は Claude が得意。役割分担
- xacro パラメータ化 / 命名規則一致 / launch ファイル付属なども Claude に依頼できる
つまづきどころ
- 単位換算 を忘れない。iLogic の慣性モーメントは kg·cm²、URDF は kg·m²。係数 1e-4 (上の表を参照)
- 慣性テンソルは CoM 基準 で URDF に書く必要がある。iLogic の
XYZMomentsOfInertiaはパーツ座標系基準なので、平行軸の定理 (parallel axis theorem) で CoM 周りに変換する必要がある (この変換も Claude に依頼すればやってくれる) - 慣性テンソルの方向 はリンクのローカル座標に合わせる。Inventor の Principal / Global / COG のどれを使ったかを明示する
- リンク名 = パーツ名 = メッシュファイル名 で 3 者を揃えておくと、後で自動化しやすい
関連
- CAD から URDF への変換
- Inventor から iLogic で URDF を出す
- URDF の visual メッシュを Inventor の DAE で差し替える
- Isaac Sim: URDF Import