Main Content

URDF 入門

URDF とは

URDF (Unified Robotics Description Format) は、製造業の組み立てライン用ロボット マニピュレーター アームや遊園地用のアニマトロニクス ロボットなどのマルチボディ システムをモデル化するために、学術界や産業界で使用される XML 仕様です。URDF は ROS (Robotics Operating System) のユーザーに特によく使用されています。ROS とは、URDF モデルの標準サポートを提供するフレームワークです。URDF モデルは、たとえば、シミュレーション、解析、制御設計などのタスクのために Simscape™ Multibody™ 環境にインポートすることができます。単純な使用例は、ヒューマノイド ロボットの使用例を参照してください。

ヒューマノイド ロボットの URDF モデル

URDF ファイルに含まれるもの

他のタイプの XML ファイルと同様に、URDF ファイルは、XML ツリーと呼ばれる階層構造内で入れ子にされた <robot><link><joint> などのさまざまな XML 要素で構成されています。たとえば、<link> 要素と <joint> 要素は <robot> 要素の子であり、その逆に <robot> 要素は <link> 要素と <joint> 要素の親であると言われます。

<robot>
	<link>
		...
	</link>
	<link>
		...
	</link>
	<joint>
		...
	</joint>
</robot>

<robot> の下にある <link><joint> などの子要素も、それぞれ独自の子要素をもつことができます。たとえば、<link> 要素は、子要素 <inertial> および <visual> をもっています。<visual> 要素は、子要素 <geometry> および <material> をもっています。さらに、<material> 要素は、子要素 <color> をもっています。このような子要素の連鎖は、親要素の特性と動作を定義するために不可欠です。

<robot>
	<link>
		<inertial>
			...
		</inertial>
		<visual>
			<geometry>
				...
			</geometry>
			<material>
				<color />
			</material>
		</visual>
	</link>
	...
</robot>

子要素に加え、URDF モデル内の XML 要素は属性をもつことができます。たとえば、<robot> 要素、<link> 要素および <joint> 要素はすべて、要素の特定に役立つ文字列である属性 <name> をもっています。<color> 要素には属性 rgba があります。これは、リンク色の赤、緑、青、およびアルファ (すなわち不透明度) の値をもつ数値配列です。このような属性は、モデル内の要素を完全に定義するために役立ちます。

<robot name = "linkage">
	<link name = "root link">
		<inertial>
			...
		</inertial>
		<visual>
			<geometry>
				...
			</geometry>
			<material>
				<color rgba = "1 0 0 1" />
			</material>
		</visual>
	</link>
	...
</robot>

XML の階層構造と運動学ツリー

URDF のリンクは、階層構造内でジョイントを介して接続されます。この階層構造は、URDF ファイル内で XML 要素を入れ子にして形成されるものとよく似ています。<joint> 要素は、一方のリンクを親、他方を子として特定する <parent> 要素と <child> 要素によってこれらの階層を実現します。親リンク自身は、モデル内の他のリンクの子になることができ、子リンクは他のリンクの親になることができます。

<parent> および <child> のジョイント要素

<robot name = "linkage">
	<joint name = "joint A ... >
		<parent link = "link A" />
		<child link = "link B" />
	</joint>
	<joint name = "joint B ... >
		<parent link = "link A" />
		<child link = "link C" />
	</joint>
	<joint name = "joint C ... >
		<parent link = "link C" />
		<child link = "link D" />
	</joint>
</robot>

"連結性グラフ" と呼ばれる概略図を使用して、リンク間の接続を可視化することができます。次の図に例を示します。円はリンクを表し、矢印はジョイントを表します。矢印の根元は親ノードを示し、矢印の先端は子ノードを示します。連結性グラフによって、基礎となるモデルのトポロジ (ここでは、2 つの分岐をもつ単純な運動学ツリー) が明確になります。

運動学ツリーの連結性グラフ

URDF ではモデルのトポロジが重要です。モデルの連結性グラフは、運動学ツリーの形状 (分岐の有無を問わず常に開いている連鎖) のみをとることができます。通常であれば開いている連鎖の端をつなげて形成された、それぞれが閉じた連鎖である運動学的ループは許可されません。この制限は、URDF モデル内で <link> 要素がどのように接続できるかに影響します。

この制限は、<link> 要素は複数の <joint> 要素の子ノードになることはできないという規則に言い換えられます。別の言い方をすると、モデルの連結性グラフ内で、<link> 要素は複数の親要素をもてないということです。親ノードの数が 1 以外 (0) になるのは、連結性グラフの起点にあるルート リンクだけです。モデル内では 1 つのルート リンクのみが許可されています。

運動学的ループの URDF の例

<robot name = "linkage">
	<joint name = "joint A ... >
		<parent link = "link A" />
		<child link = "link B" />
	</joint>
	<joint name = "joint B ... >
		<parent link = "link A" />
		<child link = "link C" />
	</joint>
	<joint name = "joint C ... >
		<parent link = "link C" />
		<child link = "link D" />
	</joint>
	<joint name = "joint D ... >
		<parent link = "link B" />
		<child link = "link D" />
	</joint>
</robot>

コードは、リンク link D を、2 つの <joint> 要素 joint Cjoint D の子ノードとして宣言しています。link D 要素が 2 つの親をもつことで運動学的ループを形成しています。このモデルは URDF の接続規則に違反しているため無効です。次の図は、モデルの連結性グラフを示しています。

運動学的ループの連結性グラフ

必須の URDF エンティティとオプションの URDF エンティティ

URDF 仕様にリストされているすべての要素と属性が必須なわけではありません。<link> の下の <inertial> などのように、一部はオプションとなっています。次のコードには、使用可能なさまざまな要素と属性が示されています。オプションの要素や属性は緑色です。

オプションの要素内部で必須とされている要素や属性は、そのオプション要素が使用されている場合にのみ必須となります。かっこ内にオプションの属性の既定値がイタリックで示されています。このコードは、参考用としてのみ記載されており、有効な URDF モデルを表すものではないことに注意してください。省略記号 ("...") は URDF モデルでは無効であり、単に、長いコード行を改行して見やすくするために使用されています。

<robot name>
	<link name>
		<inertial>
			<origin xyz("0 0 0") rpy("0 0 0") />
			<mass value />
			<inertia ixx iyy izz ixy ixz iyz />
		</inertial>
		<visual name>
			<origin xyz("0 0 0") rpy("0 0 0") />
			<geometry>
				<box size />
				<cylinder radius length />
				<sphere radius />
				<mesh filename scale("1") />
			</geometry>
			<material name>
				<color rgba("0.5 0.5 0.5 1") />
				<texture filename />
			</material>
		</visual>
		<collision name>
			<origin xyz("0 0 0") rpy("0 0 0") />
			<geometry>
				<box size />
				<cylinder radius length />
				<sphere radius />
				<mesh filename scale("1") />
			</geometry>
		</collision>
	</link>
	<joint name type>
		<origin xyz("0 0 0") rpy("0 0 0") />
		<parent link />
		<child link />
		<axis xyz("1 0 0") />
		<calibration rising />
		<calibration falling />
		<dynamics damping("0") friction("0") />
		<limit lower upper effort velocity />
		<mimic joint multiplier("1") offset("0") />
		<safety_controller soft_lower_limit("0") ...
		... soft_upper_limit("0") k_position("0") k_velocity("0") />
	</joint>
</robot>

typeprismaticrevolute である <joint> 要素でのみ必須です。

単純な URDF モデルの作成

例として、二重振子の URDF モデルを作成します。選択したテキスト エディターで以下に示すコードを含むファイルを作成し、double_pendulum.urdf として任意のフォルダーに保存します。ファイル拡張子をファイル名に含めます。別の例で、このモデルを Simscape Multibody 環境にインポートする方法を説明しています (単純な URDF モデルのインポートを参照)。

<robot name = "linkage">
	<!-- links section -->>
	<link name = "link A">
		<inertial>
			<origin xyz = "0 0 0" />
			<mass value = "0.5" />
			<inertia ixx = "0.5" iyy = "0.5" izz = "0.5" 
ixy = "0" ixz = "0" iyz = "0" />
		</inertial>
		<visual>
			<origin xyz = "0 0 0" />
			<geometry>
				<box size = "0.5 0.5 0.1" />
			</geometry>
			<material name = "gray A">
				<color rgba = "0.1 0.1 0.1 1" />
			</material>
		</visual>
	</link>
	<link name = "link B">
		<inertial>
			<origin xyz = "0 0 -0.5" />
			<mass value = "0.5" />
			<inertia ixx = "0.5" iyy = "0.5" izz = "0.5" 
	ixy = "0" ixz = "0" iyz = "0" />
		</inertial>
		<visual>
			<origin xyz = "0 0 -0.5" />
			<geometry>
				<cylinder radius = "0.05" length = "1"  />
			</geometry>
			<material name = "gray B">
				<color rgba = "0.3 0.3 0.3 1" />
			</material>
		</visual>
	</link>
	<link name = "link C">
		<inertial>
			<origin xyz = "0 0 -0.5" />
			<mass value = "0.5" />
			<inertia ixx = "0.5" iyy = "0.5" izz = "0.5" 
	ixy = "0" ixz = "0" iyz = "0" />
		</inertial>
		<visual>
			<origin xyz = "0 0 -0.5" />
			<geometry>
				<cylinder radius = "0.05" length = "1"  />
			</geometry>
			<material name = "gray C">
				<color rgba = "0.5 0.5 0.5 1" />
			</material>
		</visual>
	</link>

	<!-- joints section -->>
	<joint name = "joint A" type = "continuous">
		<parent link = "link A" />
		<child link = "link B" />
		<origin xyz = "0 0 -0.05" />
		<axis xyz = "0 1 0" />
	</joint>
	<joint name = "joint B" type = "continuous">
		<parent link = "link B" />
		<child link = "link C" />
		<origin xyz = "0 0 -1" />
		<axis xyz = "0 1 0" />
		<dynamics damping ="0.002" />
	</joint>
</robot>

URDF モデルについて

このコードは linkage という名前のマルチボディ モデルを定義しています。モデルには、joint Ajoint B という名前の 2 つのジョイントを介して接続された link Alink Blink C という 3 つのリンクが含まれています。ジョイントの <parent> 要素と <child> 要素によって、リンクが互いにどのように接続されるかが特定されます。link Alink B に接続され、link Blink C に接続されています。link A に親リンクはありません。つまり、<joint> 要素に子要素のみとして現れ、したがってルート リンクになります。

link A<inertial> 要素は、リンクの質量と慣性モーメント (ixxiyyizz) を定義します。慣性乗積 (ixyixz および iyz) は未指定のため URDF の既定値である 0 となります。link Avisual 要素は、モデルの可視化に使用するジオメトリのタイプおよび材料の色を定義します。この場合のジオメトリは、幅と厚さが 0.5 m で高さが 0.1 m の箱です。リンク <inertial><visual><origin> 要素は、リンクの基準座標系から慣性基準座標系と視覚基準座標系への変換をそれぞれ指定します。同様の要素が link Blink C に適用されます。

<joint> 要素の type 属性は、ジョイントを連続として定義します。これは、動作制限がないタイプの回転ジョイントです。<origin> 要素は、ジョイントの位置を親リンク要素の基準座標系に対して指定します。たとえば、joint A<origin> 要素は、link A の基準座標系の原点に対し、-Z 軸に沿ってジョイントを 0.05 m オフセットします。各 joint 要素内部の入れ子になった axis 要素は、ジョイントの回転軸を直交座標ベクトル [0, 1, 0]、すなわち +Y として定義します。

次の図は、モデルのコンポーネント (リンクおよびジョイント) とそれらに含まれるさまざまな座標系を示しています。R はリンクの基準座標系、I はリンクの慣性座標系、V はリンクの視覚座標系を表します。J はジョイントの基準座標系を表し、定義によって子リンクの基準座標系との一致が維持されます。慣性座標系と視覚座標系はリンクの中心にオフセットされ、ジョイントの座標系はリンクの下端へとオフセットされます。

二重振子モデルのコンポーネント

インポート対象とする URDF モデルの入手

手動で独自の URDF ファイルを作成することはできますが、ほとんどの場合その必要はありません。より複雑なモデルでは、他のソースから URDF ファイルを入手する方が望ましいことがあります。ロボットの製造会社やコンサルタントは、多くの場合自社のロボット システムの URDF モデルを提供しています。SolidWorks® や PTC® Creo™ などの CAD アプリケーションは、CAD アセンブリを URDF モデルに変換する URDF エクスポーターをサポートしています。手動作成が容易でないことがある複雑なロボット工学モデルを取り扱う場合は、これらの選択肢を検討してください。

参考

関連するトピック