URDF・SDF・MJCFの違いを一気に整理。ROS2やGazebo、MuJoCoで「どれをいつ使うか」を用途別に解説し、比較表・最小サンプルとURDF→MJCF/URDF⇄SDFの変換手順も掲載します。
URDF (Unified Robot Description Format)
ROS(Robot Operating System)で使用される主要なロボット記述フォーマット。
ロボットの機械構造、関節、センサー、その他の部品を定義するためのXMLベースのフォーマット。
主にロボットのキネマティクス(運動学)とビジュアルおよびコリジョンジオメトリの定義に使用される。
力学的な詳細(摩擦、不完全性など)の表現は限られている。
以下は、簡単な2軸ロボットアームのURDFサンプルです。このサンプルでは、ロボットは基底(base_link)、2つのリンク(link1、link2)、そして2つの回転関節(joint1、joint2)で構成されています。
<?xml version="1.0"?>
<robot name="simple_two_link_arm">
<!-- Base Link -->
<link name="base_link">
<visual>
<geometry>
<box size="0.1 0.1 0.1"/>
</geometry>
</visual>
</link>
<!-- Link 1 -->
<link name="link1">
<visual>
<geometry>
<cylinder length="1.0" radius="0.1"/>
</geometry>
</visual>
</link>
<!-- Link 2 -->
<link name="link2">
<visual>
<geometry>
<cylinder length="1.0" radius="0.1"/>
</geometry>
</visual>
</link>
<!-- Joint 1 -->
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="link1"/>
<origin xyz="0 0 0.05" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-1.57" upper="1.57" effort="100.0" velocity="0.5"/>
</joint>
<!-- Joint 2 -->
<joint name="joint2" type="revolute">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="0 0 1" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-1.57" upper="1.57" effort="100.0" velocity="0.5"/>
</joint>
</robot>SDF (Simulation Description Format)
Gazeboという人気のあるロボットシミュレーション環境で使用されるフォーマット。
URDFよりも詳細な物理的特性(摩擦、不完全性、バネ特性など)を持つオブジェクトや環境を記述するためのフォーマット。
ロボットだけでなく、物理シミュレーション全体のシーンや環境を記述する能力がある。
多体の動的シミュレーションや環境要素(風、光など)の詳細な記述が可能。
以下は、簡単な2軸ロボットアームのSDFサンプルです。このサンプルでは、ロボットアームは基底(base)、2つのリンク(link1、link2)、そして2つの回転関節(joint1、joint2)で構成されています。さらに、物理的な属性やシミュレーションの詳細も含めることができます。
<sdf version="1.6">
<model name="simple_two_link_arm">
<static>false</static>
<!-- Base link -->
<link name="base">
<pose>0 0 0.1 0 0 0</pose>
<visual name="base_visual">
<geometry>
<box>
<size>0.2 0.2 0.2</size>
</box>
</geometry>
</visual>
</link>
<!-- Link 1 -->
<link name="link1">
<pose>0 0 0.5 0 0 0</pose>
<visual name="link1_visual">
<geometry>
<cylinder>
<radius>0.1</radius>
<length>1.0</length>
</cylinder>
</geometry>
</visual>
</link>
<!-- Link 2 -->
<link name="link2">
<pose>0 0 1.5 0 0 0</pose>
<visual name="link2_visual">
<geometry>
<cylinder>
<radius>0.1</radius>
<length>1.0</length>
</cylinder>
</geometry>
</visual>
</link>
<!-- Joint 1 -->
<joint name="joint1" type="revolute">
<parent>base</parent>
<child>link1</child>
<axis>
<xyz>0 0 1</xyz>
<limit>
<lower>-1.57</lower>
<upper>1.57</upper>
</limit>
</axis>
</joint>
<!-- Joint 2 -->
<joint name="joint2" type="revolute">
<parent>link1</parent>
<child>link2</child>
<axis>
<xyz>0 0 1</xyz>
<limit>
<lower>-1.57</lower>
<upper>1.57</upper>
</limit>
</axis>
</joint>
</model>
</sdf>MJCF (MuJoCo XML Format)
MuJoCo(Multi-Joint dynamics with Contact)という高速物理シミュレーションエンジン専用のフォーマット。
ロボットや他の物理オブジェクトの定義に使用され、特に接触ダイナミクスのシミュレーションに優れている。
MJCFは、効率的なシミュレーションのために特化されており、シンプルながら高度な機能を提供する。
以下は、簡単な2リンクのロボットアームのMJCFサンプルです。この例では、ロボットは基底("base")と2つのリンク("link1"、"link2")、そして2つの関節("joint1"、"joint2")で構成されています。
<mujoco model="simple_two_link_arm">
<worldbody>
<body name="base" pos="0 0 0">
<geom shape="box" size="0.1 0.1 0.1" type="fixed"/>
<body name="link1" pos="0 0 0.1">
<geom shape="cylinder" size="0.05 0.5" />
<joint name="joint1" type="hinge" axis="0 0 1" pos="0 0 0" range="-90 90"/>
<body name="link2" pos="0 0 1">
<geom shape="cylinder" size="0.05 0.5"/>
<joint name="joint2" type="hinge" axis="0 0 1" pos="0 0 0" range="-90 90"/>
</body>
</body>
</body>
</worldbody>
</mujoco>MuJoCoはMulti-Joint dynamics with Contactの略です。ロボット工学、バイオメカニクス、グラフィックス、アニメーション、機械学習など、環境と相互作用する多関節構造の高速かつ正確なシミュレーションを必要とする分野の研究開発を促進することを目的とした汎用物理エンジンです。
このリポジトリはGoogle DeepMindによって管理されている。
MuJoCoはC APIを持ち、研究者や開発者を対象としています。ランタイム・シミュレーション・モジュールは、パフォーマンスを最大化するように調整されており、組み込みのXMLコンパイラによって事前に割り当てられた低レベルのデータ構造で動作します。このライブラリには、OpenGLでレンダリングされたネイティブGUIによるインタラクティブな可視化が含まれています。MuJoCoはさらに、物理関連量を計算するための多数のユーティリティ関数を公開しています。
また、PythonバインディングとUnityゲームエンジン用のプラグインも提供しています。
Q. URDF・SDF・MJCFの違いは?
A. URDFはROS系のロボット“本体”記述、SDFはGazebo向けで“世界+ロボット”を詳細に記述、MJCFはMuJoCo向けで高速な接触・拘束モデルと学習用途に強いXMLです。
Q. ROS2ではどれを使うべき?
A. 基本はURDF(xacro併用)。Gazeboでシミュレーションする場合はSDF生成・調整を前提にします。
Q. Gazebo(Ignition/新Gazebo)との相性は?
A. SDFが第一言語。URDFは読み込み時にSDFへ変換される想定で、細部はSDFで詰めるのが安全です。
Q. MuJoCo/MJCFの利点は?
A. 高速で安定した接触・勾配情報、アクチュエータや腱(tendon)・拘束(equality)の表現が豊富で、RL・最適化に強いです。
Q. 閉リンク(クローズドループ)は扱えますか?
A. URDFは素の仕様では非対応(回避策はあり)。SDFは物理エンジン依存で可能、MJCFは拘束で安定的に表現できます。
Q. センサや環境(ライト・地形)はどれが得意?
A. SDFが最も表情豊か(sensor・world定義が豊富)。URDFは拡張タグ頼み、MJCFもsensor/texture/geomで十分に記述可能です。
Q. 座標系・単位は?
A. 3者とも原則SI(m, kg, s, rad)。ROSのREP-103(x前・y左・z上)に合わせて定義するのが無難です。
Q. 慣性(inertial)の落とし穴は?
A. 対角化されていない慣性テンソルや極端値は発散の原因。実測/CAD由来の値を正規化し、桁と原点位置をチェックしましょう。
Q. メッシュ(STL/DAE/OBJ)の扱いは?
A. 可視用と衝突用を分離し、衝突はできるだけ単純(凸)形状へ。スケールと単位、原点合わせを事前に統一します。
Q. マテリアル/見た目は?
A. URDFは簡易、SDFはPBR系まで拡張があり、MJCFは質感・テクスチャ指定が可能。見た目依存の検証は避け、物理値を基準に。
Q. URDF→SDFやURDF→MJCF変換はできる?
A. 可能ですが“自動7割・手調整3割”が現実。関節・摩擦・拘束・センサの細部はターゲット側で詰め直します。
Q. xacroは使うべき?
A. はい。モジュール化・パラメトリック化・機種差分管理に有効で、モデル資産の再利用性が上がります。
Q. どれが軽くて速い?
A. 設定次第ですが、学習や大量ロールアウトはMJCF+MuJoCoが有利。大規模環境・多様センサはSDF+Gazeboが現実的です。
Q. 物理エンジンの違いは影響する?
A. します。同じSDFでもODE/DART/Bullet等で挙動は変わります。摩擦・反発・ERP/CFMの初期値に注意。
Q. よくあるエラーは?
A. 慣性の未設定、コリジョンの重複・貫通、リンク原点ミス、単位スケール違い、自己衝突の設定漏れが定番です。
Q. デバッグ/検証のコツは?
A. 1) 最小モデルで安定化→2) 慣性とジョイントを段階追加→3) 可視と衝突を分離→4) 時間刻み・反復回数を監視、の順で。
Q. 学習(RL)での形式選択は?
A. MuJoCoネイティブのMJCFが王道。既存URDF資産は一度MJCFへ移し、報酬計算・拘束を明示的に設計すると安定します。
Q. 版管理のコツは?
A. xacro変数・共通マクロを小分けし、テスト用に“最小構成サブセット”を同リポジトリに置くと回帰検出が楽です。
Q. ライセンス/商用利用の注意は?
A. フォーマット自体は問題になりにくいですが、メッシュやテクスチャ等のアセット権利は必ず確認してください。
Q. どれから学び始めればいい?
A. 操作と可視が目的→URDF、シミュレーションと世界表現→SDF、学習・最適化→MJCF、の順で小さく回すのがおすすめです。