ゆるふわフィジカル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からのエクスポートか既存モデルの改造が主流

次の一歩 🌸

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

あわせて読みたい