
URDF入門|自作ロボットをシミュレータで動かすためのモデル記述
2026-08-11 ・ 実践
シミュレータでロボットを動かすには、まず**「このロボットはこういう形で、ここが曲がります」**とコンピュータに教える必要があります。その共通フォーマットが 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の上下限が同じ、またはaxisが0 0 0 - パーツが変な場所にある →
originを絶対座標で書いている(親からの相対が正解) - メッシュが表示されない → STLのパス指定ミス。
package://形式を確認
実務での作り方
ゼロから手書きすることは稀です。現実的には:
- CAD(Fusion 360, SolidWorks)からエクスポート — URDF出力プラグインが定番
- 既存ロボットのURDFを改造 — SO-101等は公式で公開されている
- 手書きは学習用と簡易モデルのみ
まとめ
- URDFは「link(骨)+joint(関節)」でロボットの形を記述するXML
- visual/collision/inertialの3点セット。inertialを省くと物理が壊れる
- 座標は親リンクからの相対、角度はラジアン
- 実務ではCADからのエクスポートか既存モデルの改造が主流
ゆるふわフィジカルAI