ゆるふわフィジカルAI
パソコンで作業中のゆるロボ

URDF入門|自作ロボットをシミュレータで動かすためのモデル記述

2026-08-11実践

#URDF#ROS2#シミュレーション#実践

シミュレータでロボットを動かすには、まず**「このロボットはこういう形で、ここが曲がります」**とコンピュータに教える必要があります。その共通フォーマットが URDF(Unified Robot Description Format) です。

URDFは「ロボットの設計図」

中身はXMLで、たった2種類の要素でできています。

土台(ベース)リンク(骨)リンク(骨)ジョイント(関節)=回るところエンドエフェクタ(手先)
図: ロボットアームの正体は、リンク(骨)とジョイント(関節)の繰り返し

← 図は横にスクロールできます →

  • link(リンク) = 骨。硬いパーツ1つ
  • joint(ジョイント) = 関節。2つのlinkをつなぎ、動き方を定義する

メカ超入門で学んだ構造が、そのままファイルになったものだと考えてください。

最小のURDF

2つのリンクを1つの回転関節でつないだ、最もシンプルなロボットです。

<?xml version="1.0"?>
<robot name="my_arm">

  <!-- 土台 -->
  <link name="base_link">
    <visual>
      <geometry><box size="0.2 0.2 0.05"/></geometry>
      <material name="pink"><color rgba="1 0.84 0.91 1"/></material>
    </visual>
    <collision>
      <geometry><box size="0.2 0.2 0.05"/></geometry>
    </collision>
    <inertial>
      <mass value="1.0"/>
      <inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/>
    </inertial>
  </link>

  <!-- 腕 -->
  <link name="arm_link">
    <visual>
      <origin xyz="0 0 0.15"/>
      <geometry><cylinder radius="0.02" length="0.3"/></geometry>
    </visual>
    <collision>
      <origin xyz="0 0 0.15"/>
      <geometry><cylinder radius="0.02" length="0.3"/></geometry>
    </collision>
    <inertial>
      <mass value="0.5"/>
      <inertia ixx="0.004" ixy="0" ixz="0" iyy="0.004" iyz="0" izz="0.001"/>
    </inertial>
  </link>

  <!-- 関節: base_link から arm_link へ -->
  <joint name="shoulder" type="revolute">
    <parent link="base_link"/>
    <child link="arm_link"/>
    <origin xyz="0 0 0.025"/>
    <axis xyz="0 1 0"/>
    <limit lower="-1.57" upper="1.57" effort="10" velocity="2.0"/>
  </joint>

</robot>

3つのブロックの役割

要素用途手を抜くとどうなる
visual画面での見た目見た目が変なだけ(実害は小さい)
collision衝突判定物をすり抜ける/めり込む
inertial質量・慣性物理が崩壊して吹き飛ぶ
⚠️

inertial は必ず書く

質量や慣性を省略したり0にすると、シミュレータが計算不能になり、ロボットが宇宙の彼方へ吹き飛びます。「起動したら消えた」の原因はほぼこれです。おおよその値でいいので必ず入れてください。

jointの型を選ぶ

type動き使う場面
revolute回転(角度制限あり)ほとんどの関節
continuous無限回転車輪
prismatic直線スライド昇降軸、グリッパー
fixed動かないセンサーの取り付けなど

axis で「どの軸まわりに回るか」を指定します。0 1 0 ならY軸まわり(横から見て曲がる肘の動き)です。

座標系のつまずき

URDFの座標は親リンクからの相対位置です。絶対座標ではありません。

<origin xyz="0 0 0.025" rpy="0 0 0"/>
<!-- 親から見て、Z方向に2.5cm上 -->

rpy はロール・ピッチ・ヨー(ラジアン)。度ではなくラジアンなので、90度は 1.5708 です。ここは全員が一度は間違えます。

確認と読み込み

# 文法チェック
check_urdf my_arm.urdf

# ROS 2で可視化(スライダーで関節を動かせる)
ros2 launch urdf_tutorial display.launch.py model:=my_arm.urdf

MuJoCoやIsaac Simにもインポートできます。

# MuJoCoで読む場合(要MJCF変換 or 直接対応版)
import mujoco
model = mujoco.MjModel.from_xml_path("my_arm.urdf")

よくあるエラー

  • ロボットが吹き飛ぶinertial の質量・慣性が0か未記述
  • 関節が動かないlimit の上下限が同じ、または axis0 0 0
  • パーツが変な場所にあるorigin を絶対座標で書いている(親からの相対が正解)
  • メッシュが表示されない → STLのパス指定ミス。package:// 形式を確認

実務での作り方

ゼロから手書きすることは稀です。現実的には:

  1. CAD(Fusion 360, SolidWorks)からエクスポート — URDF出力プラグインが定番
  2. 既存ロボットのURDFを改造 — SO-101等は公式で公開されている
  3. 手書きは学習用と簡易モデルのみ

まとめ

  • URDFは「link(骨)+joint(関節)」でロボットの形を記述するXML
  • visual/collision/inertialの3点セット。inertialを省くと物理が壊れる
  • 座標は親リンクからの相対、角度はラジアン
  • 実務ではCADからのエクスポートか既存モデルの改造が主流

もう少し詳しく(背景と理論)

URDF(Unified Robot Description Format)は、ロボットをリンク(剛体)とジョイント(関節)の木構造として記述するXML形式です1。各リンクには見た目(visual)・衝突形状(collision)・慣性(質量・慣性テンソル)を持たせ、これがあって初めて運動学や動力学シミュレーションが正しく動きます2。木構造ゆえ閉ループ機構(並列リンク)は素直に書けず、拡張が必要です3。後継・関連フォーマットとして、環境も記述できる SDF(Gazebo)や、Isaac などで使われる USD があり、相互変換しながら使うのが実務です。

次の一歩 🌸

作ったモデルを動かすならMuJoCo入門、ROS 2との連携はROS 2入門へどうぞ。

Footnotes

  1. URDF は ROS 標準のロボット記述フォーマット。link と joint(revolute / prismatic / fixed 等)の親子関係で運動連鎖を表す XML。

  2. 動力学シミュレーションには各リンクの質量・重心・慣性テンソルが必須。これらが不正確だと制御やSim-to-Realがずれる。CADから抽出するのが一般的。

  3. URDF は木構造前提のため、並列リンクなどの閉ループは直接表現できず、SDF や追加の制約記述で補う。環境ごと記述するなら SDF、Omniverse系なら USD が使われる。

🔥 この分野の最新トレンドをチェック →

学習コース

25 / 46 本目

学習コースの全体を見る

あわせて読みたい

A*経路探索をPythonで実装する|ロボットの「最短ルート」を見つける

ロボットや自律移動の経路計画で定番のA*(エースター)アルゴリズムをPythonでゼロから実装。ヒューリスティックがなぜ探索を速くするのか、グリッド上で障害物を避けて最短経路を見つける流れを、動くコードで理解します。

SLAM(自己位置推定と地図作成)をPythonで実装する|占有格子地図とパーティクルフィルタ

「地図が無いと自分の位置が分からず、位置が分からないと地図が作れない」というSLAMの鶏と卵問題を、占有格子地図とパーティクルフィルタでPython実装。ロボットが自分の位置と周囲の地図を同時に組み立てる仕組みをコードで理解します。

PID制御をPythonで実装する|ロボットを"ちょうどよく"目標へ動かす

ロボット制御の基本「PID制御」をPythonでゼロから実装。比例・積分・微分の3項が何をしているのか、ゲイン調整で挙動がどう変わるのかを、動くシミュレーションコードで手を動かして理解します。

ロボティクス転職に効くポートフォリオの作り方【GitHub活用】

フィジカルAI・ロボティクス領域への転職や就職で評価されるポートフォリオの作り方を解説。何を作るべきか、GitHubの見せ方、READMEの書き方、動画の重要性まで実践的にまとめました。