notes
Robotics

URDF の visual メッシュを Inventor の DAE で差し替える

既存 URDF の visual メッシュだけを Inventor から per-link のシュリンクラップ OBJ → Blender で DAE に変換して差し替える。collision は簡易な STL のまま保つ。

要点: URDF の <visual> と <collision> は独立して指定できる。collision は軸い STL のまま、visual にだけ Inventor でシュリンクラップ化した リンク単位 の OBJ → Blender で DAE 変換した高品質メッシュを入れる。物理は軽いまま見た目だけ良くなる。

前提#

  • fusion2urdf-ros2 等でキネマティクスとリンク構造だけ 先に確定させた URDF がある
  • 各リンクの visual メッシュが仮の (Fusion 360 側で作った簡易) STL で入っている
  • Inventor 側に見た目のちゃんとしたパーツモデルがある

URDF の visual / collision 分離#

<link name="arm_link_1">
  <visual>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <mesh filename="package://my_robot_description/meshes/visual/arm_link_1.dae"/>
    </geometry>
  </visual>
  <collision>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <mesh filename="package://my_robot_description/meshes/collision/arm_link_1.stl"/>
    </geometry>
  </collision>
  <inertial>...</inertial>
</link>
  • visual: 見た目専用。ポリゴン多めでも OK。DAE なら色 / テクスチャも乗る
  • collision: 物理エンジンが使う。ポリゴンは限界まで少なさとこ。STL やプリミティブで十分

リンク単位でファイルを出す (ネジ問題の解決)#

ここが一番重要。Inventor の OBJ エクスポートの One File Per Part Instance は文字通り リーフパーツごとに 1 ファイル を作るので、ネジ 40 本あるアセンブリなら .obj が 40 個出て URDF リンクと対応が取れない。

解決策: リンク単位のサブアセンブリを Shrinkwrap / Simplify で 1 パーツに焦き固める。

手順#

  1. Inventor アセンブリを リンク単位のサブアセンブリ で構造化 (base_link.iam, arm_link_1.iam, gripper.iam ...)
  2. 各サブアセンブリで Assemble → Simplify (Inventor 2022+) または Shrinkwrap
    • Style: Single Solid Without Seams (URDF 用ならこれで十分)
    • Remove fasteners を on にしてネジ・小径穴を自動除去
    • 出力: <link_name>_simplified.ipt
  3. 新しいトップアセンブリ <robot>_sim.iam を作り、Simplified の .ipt を並べて組み立てる
  4. このアセンブリを One File Per Part Instance で OBJ エクスポート → リンク単位で 1 ファイル ずつ出る

別解: Create Substitutes の一括生成#

Inventor には「Create Substitutes」という隠し機能があり、トップアセンブリの各サブアセンブリに対して shrinkwrap substitute LOD を一括生成できる。同時にトップアセンブリを全サブアセンブリを shrinkwrap 表示に切り替える LOD に設定してくれる。

この LOD を選んだ状態でエクスポートすれば、元アセンブリを壊さずにリンク単位のファイルが得られる。

Inventor 側のエクスポート設定#

上記で Simplified の .ipt を並べたアセンブリを開いた状態で、File → Export → CAD Format → OBJ (*.obj) → Options:

項目値意図
StructureOne File Per Part Instanceパーツごとに 1 ファイル (今回の「パーツ」= Simplified リンク 1 つ)
UnitsmeterURDF は m 前提
Export Colorsonアピアランスを .mtl に書き出す
Facet Tolerance0.001 cm 付近見た目重視なら小さめ。ファイルサイズとトレードオフ

出力: リンク数 N と同じ数の .obj + .mtl + テクスチャ画像 (使っていれば)。

色が飛ぶ問題#

Inventor の OBJ / STL エクスポートは、Export Colors にチェックを入れてもマテリアル情報が正しく伝わらないことがある (3rd-party ビューアでグレーになる)。飛んだら Blender で付け直すのが確実。

ネイティブ DAE エクスポータについて#

Inventor 単体に DAE エクスポートは無い。有償プラグインとしては SimLab Collada Exporter for Inventor がある (テクスチャ・マテリアル対応、Inventor 2026 までは確認済み)。フリーで済ませるなら OBJ → Blender → DAE ルートで十分。

Blender で OBJ → DAE 変換#

GUI で 1 回だけ#

  1. File → Import → Wavefront (.obj)
  2. 必要に応じてマテリアルを付け直す
  3. File → Export → Collada (.dae) → Selection Only をチェック

CLI (バッチ変換)#

# obj2dae.py
import bpy, sys, os
in_dir, out_dir = sys.argv[-2], sys.argv[-1]
os.makedirs(out_dir, exist_ok=True)
for f in os.listdir(in_dir):
    if not f.endswith(".obj"): continue
    bpy.ops.wm.read_factory_settings(use_empty=True)
    bpy.ops.wm.obj_import(filepath=os.path.join(in_dir, f))
    bpy.ops.wm.collada_export(
        filepath=os.path.join(out_dir, f.replace(".obj", ".dae")),
        apply_modifiers=True, selected=False)
blender --background --python obj2dae.py -- ./inventor_obj ./meshes/visual

注: Blender 4.x の OBJ インポートは bpy.ops.wm.obj_import (旧 API bpy.ops.import_scene.obj は削除済み)。

URDF の書き換え#

命名規則をリンク名と揃えておくと sed で一括置換できる:

# visual メッシュを STL → DAE に差し替え
sed -i 's|meshes/\([a-z_0-9]*\)\.stl|meshes/visual/\1.dae|g' my_robot.urdf

もし fusion2urdf の出力が 1 つのメッシュを visual / collision 両方に使う形なら、手で分けるか Python で URDF を XML パースして書き換える。

ファイル配置#

my_robot_description/
  meshes/
    visual/       # Inventor をソースにした DAE (見た目重視)
      base_link.dae
      arm_link_1.dae
      ...
    collision/    # Fusion 360 からの STL (軽い)
      base_link.stl
      arm_link_1.stl
      ...

座標系の落とし穴#

  • Inventor 側でエクスポートする前に、各リンクの Simplified .ipt を URDF リンクのローカル原点に合わせて配置 しておく。こうすれば URDF 側の <origin xyz="0 0 0" rpy="0 0 0"/> で漏れなく取り付く
  • アセンブリ座標系ではなくパーツ座標系で吐くと、全メッシュが原点重なりになるケースあり
  • Blender の Collada エクスポータでは Z-up で出す (ROS 規約)。Y-up で出すと URDF でモデルが横倒しに見える
  • スケールは m。DAE の内部単位がミリなら URDF の <mesh scale="0.001 0.001 0.001"/> で逃げることもできるが、元を m で揃える方がカオスない

Isaac Sim での注意#

  • Isaac Sim の URDF Importer は DAE をサポートし、import 時に USD に変換する
  • マテリアルは USD の Material Prim になるので、後から Isaac Sim 側で PBR マテリアルを当て直すこともできる
  • ポリゴン数が多すぎる DAE は import に時間がかかる。visual でも千重オーダのポリゴンは機会を見て間引く

つまづきどころ#

  • ネジはとにかく Simplify で除去。Simplify を使わずに One File Per Part Instance を実行すると、パーツ数だけファイルができてURDF 側のリンク単位と対応しない
  • パーツ名に日本語 / 空白 / 特殊文字 → OBJ ファイル名もそのままになり URDF / ROS で払い出す。Inventor 側で ASCII でリネームしておく
  • Blender で DAE エクスポートしたときにテクスチャパスが絶対パスになる → DAE をテキストエディタで開いて相対パスに直す、またはテクスチャをメッシュと同じフォルダに置く
  • 平面尺度だけ合わない → Inventor のエクスポート単位が mm になっていないか確認 (URDF は m)
  • visual だけでなく collision も重い → collision はプリミティブ (<box>, <cylinder>, <sphere>) に置き換えると劉的に軽くなる

関連#

最終更新:

On this page