notes
Robotics

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/s

Claude への渡し方#

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)cmm× 0.01
質量 (Mass)kgkg× 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 者を揃えておくと、後で自動化しやすい

関連#

最終更新:

On this page