Welcome to Mashykom WebSite
ロボットモデルの URDF ファイルの作成とシミュレーション
|
URDF (Unified Robotics Description Format) は、製造業の組み立てライン用ロボット、マニピュレーター アームロボットなどのマルチボディ システムをモデル化するために使用される XML フォーマット仕様の記述ファイルです。URDF は ROS (Robotics Operating System) で広範囲に使用されています。URDF モデルは、ロボット、車両のサスペンション、建設機械、航空機着陸装置などの 3D 機械システムで使用するマルチボディ シミュレーション環境にインポートすることができます。当然、ゲーム作成ソフトのUnity 環境にもインポートできます。
URDFはロボットのモデルをXML形式で、モデルの3次元形状、表面の見え方、動作、動衝突特性、慣性特性などを記述することが出来ます。また、センサーの記述も可能です。URDFで記述したロボットのモデルはrvizで3D表示したり、Gazeboでシミュレーションすることが出来ます。そして、URDFファイルはファイル拡張子が.urdfになります。
ROSを直接PCなどにインストールにはROSの各バージョン毎にサポートするOSが異なります。プラットフォームに依存せずにROSをインストールするために、ROSの Docker イメージを利用します。Docker のインストールなどについては、ここでは説明を省略しますので、Docker 入門のページを参照ください。
ROS の Docker image はこのOSRFのgithubからダウンロードできます。ここでは、ブラウザからROSを操作したいので、Tiryohさんが用意したdocker-ros2-desktop-vncを利用します。サイズは約4.7GBあります。
このページでは、ROSをプラットフォームとしたロボットの操作シミュレーションをURDFを活用して実行する手続きについて説明します。
Last updated: 2022.7.18
アーム型ロボットモデルの URDF ファイルの作成
|
URDF ファイルは、XML ツリーと呼ばれる階層構造内で入れ子にされた <robot>、<link>、<joint> などのさまざまな XML
要素で構成されています。<link>要素はロボットの剛体であり、 <joint> 要素はロボットの関節に対応します。たとえば、 <link> 要素と<joint>
要素は<robot> 要素の子であり、その逆に <robot> 要素は <link> 要素と <joint> 要素の親であると言われます。下のアームロボット型モデルの例を見てください。
簡単なアーム型ロボットのツリー構造
このアーム型ロボットのツリー構造の記述は以下のようなURDFファイルで記述されます。詳しい説明は、URDFのROS Wikiを参照ください。
この urdf ファイルの意味を理解するために、要素タグの説明を箇条書きにしておきます。<robot> ~ </robot>タグの間に、linkタグとjointタグを記述します。linkタグは、ロボットの1つの部品を定義し、jointタグは、linkとlinkを繋げる部分を定義します。linkタグには、下記の属性と要素などが定義できます。
- name リンクの名前
- origin 位置(xyz, rpy)
- visual 外観に関するデータ
- geometry 形状に関するデータ
- collision 衝突に関するデータ
- inertial 慣性に関するデータ
jointタグには、下記の要素などが定義できます。
- name ジョイントの名前
- type 形式
- parent 親リンク
- child 子リンク
- origin 親リンクと子リンクの位置関係
- axis 回転軸、スライド軸
- limit ジョイントの可動範囲
上記のアーム型ロボットのツリー構造を見てみましょう。Joint2 を見てみましょう. Joint2 は Link1 からX軸のマイナス方向に少しだけ移動し, Y軸のプラス方向に移動し,さらに Z軸周りに90度回転しています。そのため、次のように <origin> 要素を加える必要があります。
<origin xyz="-2 5 0" rpy="0 0 1.57" />
xyzは joint2 の中心座標を親リンクの原点からのオフセット位置として設定します。単位はメートルです。rpyは回転の大きさをラジアンで表示します。角度90度はπ/2(=1.57)です。
同じように、 joint1, joint3 に対しての記述も必要となります。まだ定義していないのは joint がどの軸の周りに回転可能かということです。これを追加すれば,このロボットの完全な運動学モデルを作成したことになります。したがって、 <axis/> 要素を各 joint に付け加えることが必要です。ローカル座標で表された回転軸を定義します。例えば、 joint2 に関しては, Y 軸の正方向周りに回転しています。そのため,joint 要素に次の xml を付け加えます。
<axis xyz="0 1 0" />
以上の要素を加えた URDF ファイルは以下の通りです。回転軸は正規化してあります。
上記の例から分かる通り、<joint> の属性は name と type です。ジョイントの type の動作定義は以下の5つです。
- continuous 1軸の周りに角度制限なして回転できる
- floating 6次元の並進と回転ができる
- fixed 固定
- planar 平面上の並進とその平面にす直な軸の周りで回転ができる
- prismatic 1軸に沿って直線的にスライドできる
- revolute 1軸の周りに角度制限のある回転できる
上の例で使用しているのは、continuous でした。
geometry の基本形状定義は以下の4つです。
- cylinder 円筒
- box 箱
- sphere 球
- mesh メッシュ
なお、複雑な形状を表示するには他の3Dデザインソフトで作成したmeshを張り付けます。
ジョイントの origin の指定についてもう少し説明します。例えば、joint3 をみてください。<origin xyz="5 0 0" rpy="0 0 -1.57"/> です。これは子供リンク(link 4)の原点になります。 親リンク(link 3)の原点からのオフセットの座標で指定します。この場合は親リンク(link 3)の原点からX軸方向に+5m移動した座標を指定しています。以下の模型図が分かりやすいでしょう。
gbiggs.github.io/rosjp_urdf_tutorial_text/mobile_robot_urdf.htmlから引用
urdf_tutorial を用いて、URDF ファイルの Rviz 表示をしたいと思います。ROSのDockerイメージをダウンロードして、コンテナを実行します。Docker を起動して、PCのターミナルから
$ docker run -v ~/ros2_ws:/home/ubuntu/colcon_ws -p 10000:10000 -p 6080:80 --shm-size=512m tiryoh/ros2-desktop-vnc:foxy
と入力すると、VNCが起動して、ブラウザからアクセスが可能になります。ホストでのワーキングディレクトリをros2_ws、dockerでのディレクトリを/home/ubuntu/colcon_ws としています。MacにROS2 のdockerイメージをインストールしたときは、Macのブラウザから VNCのアドレス「http://127.0.0.1:6080/」にアクセスします。
このdocker containerは ROS2-Foxy-desktop バージョンに対応しています。以下すべてのコマンド入力は、VNCウインドウ内のlaunchpad の System Tools からLXTerminalを起動して行います。
ROS2 におけるパッケージ作成と同じ要領で、urdf_tutorial パッケージを作成します。LXTerminal を起動して、
$ cd ~/colcon_ws/src
$ git clone -b ros2 https://github.com/ros/urdf_tutorial
$ cd ..
$ colcon build
$ source ~/colcon_ws/install/setup.bash
これで、urdf_tutorial に組み込まれた Rviz を利用できます。
以下に単純なアーム型ロボットのurdf ファイルを紹介します。
このURDFファイルは、布留川英一 著『Unityではじめる ROS・人工知能 ロボットプログラミング実践入門』第6章から引用したものです。
urdf_tutorial を用いて、この URDF ファイルのRViz表示をしたいと思います。urdf_tutorial/urdf 配下にこのファイルを配置します。「arm2.urdf」とします。
始めに、ros2-foxy-joint-state-publisher-gui をインストールします。そして、RViz を用いて表示します。LXTerminalから
$ sudo apt update
$ sudo apt install ros-foxy-joint-state-publisher-gui
$ sudo apt install ros-foxy-joint-state-publisher
$ sudo apt install ros-foxy-xacro
RViz起動時のモデルのパスを相対パスで指定します。
$ cd ~/colcon_ws/src
$ ros2 launch urdf_tutorial display.launch.py model:=urdf_tutorial/urdf/arm2.urdf
以下のような画像が表示されます。
「joint_state_publisher」のウインドウが表示できますので、これを使用してロボットを動かすことができます。赤と緑の座標系は3つの「link」の「origin」に対応してます。RVizで座標軸を表示する際には、X軸:R(赤)Y軸:G(緑)Z軸:B(青)で表します
完成したアーム型ロボットのURDF モデルを表示します。
$ cd ~/colcon_ws/src
$ ros2 launch urdf_tutorial display.launch.py model:=urdf_tutorial/urdf/my_robot_arm.urdf
完成したアーム型ロボット:布留川英一 著『Unityではじめる・・・』第6章より
当然のことながら、「joint_state_publisher」のウインドウが表示できますので、これを使用してロボットの各ジョイントを動かすことができます。
類似の多関節ロボットのurdfファイルの作成例は ROS講座14 URDFを記述する2に紹介されています。複雑なマニピュレータ型ロボット(RT製CRANE+)のurdf ファイルの作成についての解説はmanipulator_urdf.htmlを参照ください。
URDFによる移動型ロボットモデルの作成については、ROS2-Foxy: Building a visual robot model from scratchに解説があります。対応する日本語版解説は、npakaさんの記事が参考になります。ただし、ROS-melodic バージョンに対応しています。
ダウンロードした urdf_tutorial パッケージの urdf ディレクトリには上記のサイトで説明されている例のurdfファイルが配置されています。Docker を起動して、PCのターミナルから
$ docker run -v ~/ros2_ws:/home/ubuntu/colcon_ws -p 10000:10000 -p 6080:80 --shm-size=512m tiryoh/ros2-desktop-vnc:foxy
と入力すると、VNCが起動して、ブラウザからアクセスが可能になります。ブラウザから VNCのアドレス「http://127.0.0.1:6080/」にアクセスします。ブラウザのLXTerminal から
$ cd ~/colcon_ws/src
$ vim urdf_tutorial/urdf/01-myfirst.urdf
最も単純な UDRF ファイル(01-myfirst)の中身は以下の通りです。
このURDFファイルは以下のことを記述しています。「myfirst」という名前のロボットで、リンクが1つだけ(base_link)含まれています。その視覚的コンポーネントは、長さ0.6メートル、半径0.2メートルの円柱(cylinder)です。
ros2-foxy-joint-state-publisher-gui をインストールします。そして、RViz を用いて表示します。
$ sudo apt update
$ sudo apt install ros-foxy-joint-state-publisher-gui
$ sudo apt install ros-foxy-joint-state-publisher
$ sudo apt install ros-foxy-xacro
RViz起動時のモデルのパスを相対パスで指定します。
$ cd ~/colcon_ws/src
$ ros2 launch urdf_tutorial display.launch.py model:=urdf_tutorial/urdf/01-myfirst.urdf
以下のような画像が表示されます。
次に、複数の図形/リンクを追加する方法を見てみましょう。 urdfにリンク要素を追加するだけでは、パーサーはそれらをどこに配置するかわかりません。したがって、ジョイントを追加する必要があります。
ジョイント要素は、柔軟なジョイントと柔軟でないジョイントの両方を指す場合があります。柔軟性のない、または固定されたジョイントから始めます。
right_leg と base_link をつなぐ joint を追加します。
joint の type は固定です。右足は 0.6m x 0.1m x 0.2m の立方体です。
どの位置にjoint を付けるかの指定が必要です。R2D2の脚は、胴体の上半分の側面に取り付けられています。そこで、joint の原点を指定します。また、脚の中央ではなく上部に付着するため、脚の原点もオフセットする必要があります。origin を xyz="0 0 -0.3" とします。 また、脚をY軸周りに回転させて直立させます。90度 = π/2です。以下のURDF になります。
この後、左足、車輪、頭など、いくつかのシェイプを追加して、モデルを完成させます。この間のプロセスは省略します。 この後の手順は、Building-a-Movable-Robot-Model-with-URDF.htmlを参照ください。完成したR2D2モデルを表示します。
$ ros2 launch urdf_tutorial display.launch.py model:=urdf_tutorial/urdf/05-visual.urdf
urdfファイルは以下の通りです。
2輪走行ロボット Raspberry Pi Mouse の URDF モデルの作成は、移動型ロボットのURDF作成にて解説されています。
ここまで、ロボットがどのように見えるかを記述する単一のサブ要素であるビジュアルを使用してリンクを指定してきました。しかし、衝突検出を機能させたり、ロボットをシミュレートしたりするには、衝突要素も定義する必要があります。この公式サイトのTutorials、Adding-Physical-and-Collision-Properties-to-a-URDF-Model.html を参照ください。以下が、衝突と物理的特性を備えた base_link を記述するurdfです。
衝突(collision)要素は、visual要素と同じレベルにある、リンク要素の一つです。collisionタグ要素は、geometryタグを使用して、visual要素と同じ方法でその形状を定義します。geometryタグの形式は、ここでは、visualとまったく同じです。collisionタグのサブ要素と同じ方法で(visualの場合と同様に)原点を指定することもできます。
多くの場合、collision の geometry と origin は、visual な geometry と origin とまったく同じである必要があります。 ただし、そうしないケースもあります。ここでは無視してください。
モデルを適切にシミュレートするには、ロボットのいくつかの物理的特性、つまり、Gazeboなどの物理エンジンに必要なプロパティを定義する必要があります。シミュレートされるすべてのリンク要素には、慣性(inertial)タグが必要です。以下のurdfが簡単な例です。
mass はKg単位で記述します。回転慣性を表現する3x3行列の各要素は慣性要素で指定されます。この慣性モーメント行列 \( I \) は対称的であるので、6つの要素のみで表すことができます。
\[
I =
\begin{pmatrix}
i_{xx} & i_{xy} & i_{xz} \\
i_{xy} & i_{yy} & i_{yz} \\
i_{xz} & i_{yz} & i_{zz}
\end{pmatrix}
\]
幾何学的にプリミティブな立体(円柱、ボックス、球)の慣性モーメントは、ウィキペディアの 慣性モーメントテンソルのリストを使用して計算できます。この計算については、以下で簡単に説明します。
慣性テンソルは、物体の質量と質量分布の両方に依存します。 最初の適切な近似は、オブジェクトの体積に質量が均等に分布していると仮定し、上記で概説したように、オブジェクトの形状に基づいて慣性テンソルを計算することです。
何を入れるべきかわからない場合は、ixx / iyy / izz = 1e-3以下のマトリックスが、中型リンクの妥当なデフォルトであることがよくあります(これは、質量0.6kgの側面の長さが0.1mのボックスに対応します)。単位行列は、この数値が異常に大きく、極端なケースに対応するので、使用しない方が良いでしょう。(これは、一辺の長さが0.1 m、質量が600 kgのボックスに相当します)
単純な立体構造の慣性モーメントの計算は以下の通りです。
- 球体:半径 r 、質量 m の均質な球体のケース
\[
I =
\begin{pmatrix}
\frac{2}{5} mr^2 & 0 & 0 \\
0 & \frac{2}{5} mr^2 & 0 \\
0 & 0 & \frac{2}{5} mr^2
\end{pmatrix}
\]
- 立方体:横幅 w 、高さ h 、奥行き d の均質な立方体のケース
\[
I =
\begin{pmatrix}
\frac{1}{12} m(h^2 + d^2) & 0 & 0 \\
0 & \frac{1}{12} m(w^2 + h^2) & 0 \\
0 & 0 & \frac{1}{12} m(w^2 + d^2)
\end{pmatrix}
\]
- 円柱:半径 r 、高さ h 、質量 m の均質な円柱のケース
\[
I =
\begin{pmatrix}
\frac{1}{12} m(3r^2 + h^2) & 0 & 0 \\
0 & \frac{1}{12} m(3r^2 + h^2) & 0 \\
0 & 0 & \frac{1}{2} mr^2
\end{pmatrix}
\]
慣性モーメントの計算方法の簡単な紹介が、【物理】慣性モーメントの計算の基礎を5種類の物体でわかりやすく解説にありますので、参考にすると良いでしょう。なお、Pythonを用いた計算スクリプトが ROS入門 (62) - URDFに設定するinertiaの計算方法に紹介されています。
Xacro を用いた URDF ファイルのスリム化
|
以上の URDF ファイルの作成の手順に従うとき、簡単なロボットモデルを作成するためにも、あらゆる種類の計算を行うことにうんざりすることでしょう。幸運なことに、xacroパッケージを使用すると、作業が簡単になります。 それは、「定数」、「簡単な数式」「マクロ」という非常に役立つ3つのモジュールを利用することです。
Xacro は XML のマクロ言語です。Xacro を使用するとき、URDFファイルの先頭で、ファイルを正しく解析するために名前空間を指定する必要があります。 たとえば、以下のように、xacroファイルの最初の2行を記述することが必要です。
名称の「firefighter」は適宜置き換えてください。constants(定数)は以下のように使います。R2D2ロボットの base_link 例で見ると、
のように、<cylinder length="0.6" radius="0.2" />が2回出てきます。この重複を避けるために、以下のように、 xacro:property を使用します。
2つの定数を、先頭の2行で定義しています。これは、使用前後どこでも、任意のレベルで定義できますが、 通常は先頭に記述します。そして、<geometry>で実際の半径を指定する代わりに、${定数名}で指定します。定数では、値だけでなく文字列と置き換えることも利用できます。
${} の中では、4つの基本演算子(+, -, *, /)、括弧、sin/cosを使用して、任意の数式を埋め込むこともできます。例えば、
のように使用できます。
macro はxacroパッケージの最大かつ最も有用なコンポーネントです。以下が最も単純な例です。
次に、パラメータ化したマクロの例を紹介します。R2D2の例を使用します。
次のように使用します。
詳しい説明は、Using-Xacro-to-Clean-Up-a-URDF-File.htmlを参照ください。
launch ファイルで、「Xacroファイル」を「URDF」に変換することができます。これは、常に最新の状態に保たれ、ハードディスク容量も消費しないため便利です。ただし、生成に時間がかかります。display.launchもXacroに対応しています。その結果、URDFと同じ方法で、Xacroファイルを開くことができます。
$ ros2 launch urdf_tutorial display.launch model:=urdf_tutorial/urdf/08-macroed.urdf.xacro
---- To be conitued ----
このページのトップへ
Unity-ROSを用いたロボットシミュレーション
トップページに行く