0
0

実習ROS 2 URDFを記述する1

Last updated at Posted at 2024-07-11

環境

本記事は以下の環境を想定して記述している。

項目
OS Ubuntu 22.04
ROS ROS 2 Humble

概要

この記事では、ロボットの構造を記述するための書式であるURDF(Unified Robot Description Format)の概要を説明する。ごく簡単なURDFファイルを作成したのち、作成したURDFをRVizで可視化する。
この記事は、ROS 2公式チュートリアルを参考に、ROS講座13 URDFを記述する1の内容をROS 2対応させたものである。

URDFとは

URDFはロボットの構造を記述するためのフォーマットである。URDFでは、ロボットの構造をリンクとジョイントの2種類の要素を使って表現する。リンクとはロボットの駆動しない1ブロックを指し、ジョイントはリンクとリンクをつなぐ関節部にあたる。例えば以下の図では、4つのリンクと3つのジョイントを持つロボットを表している。

ROS Wikiより引用

リンク、ジョイントはそれぞれ以下のような要素を持つ

  • リンク
    • 見た目  :色や形など
    • 衝突判定 :衝突判定を持つ範囲やその形状など
    • 物理特性 :重さ、イナーシャ(慣性)など
  • ジョイント
    • 種類   :固定ジョイント、回転ジョイントなど
    • オプション:回転軸の方向、移動量の限界値など
    • 親子関係 :親リンク、子リンク

URDFで記述されたロボットは、ジョイントに設定した親子関係に基づいて、木構造を持つ。上記の図の木構造はこのようになる。

リンク1
  ├──────────┐
リンク3       リンク2
  │   
リンク4

なお、木構造を持つURDFの特性上、閉ループ構造を持つロボット(パラレルリンクロボットなど)は記述できない。

ROS 2パッケージの実装

urdf1というパッケージを作成し、作成したパッケージ内にsimple_urdf1.urdfというURDFファイルを作成する。URDFファイルは、/urdf/以下に作成する。したがって、ディレクトリ構成は以下の形となる。
includeディレクトリおよびsrcディレクトリはパッケージ作成時に自動生成される。この記事の範囲ではこれらのディレクトリを使用しないため、GitHub上のサンプルには含まない。

urdf1
├── CMakeLists.txt
├── include
│   └── urdf1
├── package.xml
├── urdf           #新規作成
│   └── simple_urdf1.urdf
└── src

ROS 2パッケージの作成

パッケージurdf1を作成する。このチュートリアルは、Pub&Sub通信を実行していることを前提に、Pub&Sub通信のチュートリアルで作成したワークスペースros2_lecture_wsを利用する。
本記事の後半では、RVizを使用してURDFを可視化する。その際にurdf_launchパッケージを使用するため、urdf_launchパッケージへの依存関係をコマンドで指定する。

cd ~/ros2_lecture_ws/src
ros2 pkg create urdf1 --build-type ament_cmake --dependencies urdf_launch

URDFファイルの作成

以下のコマンドでurdfディレクトリを作成する。

cd ./urdf1
mkdir urdf && cd urdf

作成したディレクトリ内にsimple_urdf1.urdfを作成し、以下の通り記載する。

<robot name="test_robot">
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.3 0.3 0.2"/>
      </geometry>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <material name="red">
        <color rgba="1.0 0.0 0.0 1.0"/>
      </material>
    </visual>
  </link>

  <link name="body_link">
    <visual>
      <geometry>
        <box size="0.1 0.1 0.3"/>
      </geometry>
      <origin xyz="0 0 0.15" rpy="0 0 0"/>
      <material name="green">
        <color rgba="0.0 1 0.0 1.0"/>
      </material>
    </visual>
  </link>

  <joint name="body_joint" type="fixed">
    <parent link="base_link"/>
    <child  link="body_link"/>
    <origin xyz="0 0 0.1"/>
  </joint>
</robot>

simple_urdf1.urdf

URDFファイルの書式の説明

simple_urdf1.urdfで使用したURDFの記法を説明する。より詳しく知りたい場合は、ROS 2公式チュートリアル:Building a visual robot model from scratchや、ROS公式ドキュメントなどを参照すると良い。

  • <robot>タグ
    • name=xxxでロボットの名前を設定する
    • このタグ内にリンクやジョイントの情報を記述する
    • <link>タグ
      • name=xxxでリンクの名前を記述する
      • このタグ内にリンクの見た目や衝突判定、物理特性を記述する
      • <visual>タグ
        • このタグ内にリンクの見た目を記述する
        • <geometry>タグ
          • <visual>の形状と大きさを記述する
          • 形状は、箱型(box)や球(shpere)、円柱(cylinder)などが利用できる
          • 大きさの単位は[m]を使用する
          • 大きさの記述方法は形状により異なる
            • 箱型:xyzの順で辺の長さを指定する(以下は辺の長さが1mの箱型の例)
              <box size="1 1 1"/>
            • 球:半径を指定する(以下は半径が1mの球の例)
              <sphere radius="1"/>
            • 円柱:高さと半径を指定する(以下は高さ1m、半径1mの円柱の例)
              <cylinder length="1" radius="1"/>
        • <origin>タグ
          • リンクの座標系に対する<visual>中心までの相対位置と相対角度を指定する
          • 位置の単位は[m]で、xyzの順で指定する。
          • 回転角の単位は[rad]で、rpyの順で指定する
        • <material>タグ
          • name=xxxでmaterialの名前を設定する
          • このタグ内にリンクの色やテクスチャを記述する
          • <color>タグ
            • リンクの色を記述する
            • 色の指定には、rgbaを用いる
            • aはアルファ値(透明度)で、0のときに透明に、1のとき不透明になる
    • <joint>タグ
      • name=xxxでジョイントの名前を、Type=xxxでジョイントの種類を指定する
      • このタグ内にジョイントのオプションや親子関係を記述する
      • <parent>タグ
        • 親リンクを記述する
      • <child>タグ
        • 子リンクを記述する
      • <origin>タグ
        • 親リンクを基準とした子リンクの相対位置を指定する

simple_urdf1.urdfの説明

  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.3 0.3 0.2"/>
      </geometry>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <material name="red">
        <color rgba="1.0 0.0 0.0 1.0"/>
      </material>
    </visual>
  </link>

このブロックでは、base_linkという名前のリンクを作成している。base_linkはロボットの位置を表す基準となるリンクである。
<geometry>タグを使って、x軸方向に0.3、y軸方向に0.3、z軸方向に0.2の大きさの箱型(box)を指定している。また、<origin>タグでリンクの基準位置から箱型までの相対位置を指定している。相対位置の指定がxyz="0 0 0"のため、リンクの基準位置と箱型の中心が一致する。
<material>タグではredという名前を付けて、リンクの色を赤色に設定している。

  <link name="body_link">
    <visual>
      <geometry>
        <box size="0.1 0.1 0.3"/>
      </geometry>
      <origin xyz="0 0 0.15" rpy="0 0 0"/>
      <material name="green">
        <color rgba="0.0 1 0.0 1.0"/>
      </material>
    </visual>
  </link>

このブロックでは、body_linkという名前のリンクを作成している。
<geometry>タグを使って、x軸方向に0.1、y軸方向に0.1、z軸方向に0.3の大きさの箱型を指定している。また、<origin>タグでリンクの基準位置から箱型までの相対位置を指定している。相対位置の指定がxyz="0 0 0.15"のため、z軸方向に0.15m移動した位置に箱型の中心が位置する。<material>タグではgreenという名前を付けて、リンクの色を緑色に設定している。

  <joint name="body_joint" type="fixed">
    <parent link="base_link"/>
    <child  link="body_link"/>
    <origin xyz="0 0 0.1"/>
  </joint>

このブロックでは、body_jointという名前のジョイントを記述している。ジョイントの種類には、駆動しないジョイントであるfixedを指定している。
<parent>タグで親リンクをbase_linkに、<child>タグで子リンクをbody_linkに設定している。<origin>タグで、親リンクを基準とした、子リンクの相対位置を設定している。

パッケージのビルド

CMakeLists.txtに以下の内容を追記する。

# install urdf files
install(
  DIRECTORY
  urdf
  DESTINATION share/${PROJECT_NAME}/
)

CMakeLists.txt

以下のコマンドを実行し、作成したパッケージの依存関係を解決する。
URDFファイルのチェックおよび可視化に利用するパッケージがインストールされる。
urdf_launchパッケージが依存するパッケージ(urdfdomパッケージなど)がインストールされていない場合も、上記のコマンドでまとめてインストールされる。

sudo rosdep init
rosdep update
rosdep install --from-paths ~/ros2_lecture_ws/src/urdf1

作成したパッケージをビルドする。

cd ~/ros2_lecture_ws
colcon build --packages-select urdf1

作成したURDFのチェックと可視化

URDFファイルのチェック

作成したURDFが正しく記述できているか、"check_urdf"というツールで確認できる。check_urdfは以下のコマンドで使用する。

check_urdf ./src/urdf1/urdf/simple_urdf1.urdf

すると以下のような結果が表示され、URDFが正しく記述できていることを確認できる。

robot name is: test_robot
---------- Successfully Parsed XML ---------------
root Link: base_link has 1 child(ren)
    child(1):  body_link

記述が正しくないときは、エラー情報が表示される。例えば<robot name="test_robot">と最終行の</robot>をコメントアウトすると、以下のように表示される。

Error:   Could not find the 'robot' element in the xml file
         at line 80 in /tmp/binarydeb/ros-humble-urdfdom-2.3.3/urdf_parser/src/model.cpp
ERROR: Model Parsing the xml failed

しかし、このツールでは検出できないミスも多い。例えば、""のような綴りミスは検出できない。このようにミスを含むURDFをRVizで表示すると、ミスのある行は無視され、``にはデフォルトの値(xyz="0 0 0" rpy="0 0 0")が反映されるため、意図した形状のURDFが表示されない。

RVizでURDFの可視化

作成したURDFをRVizで可視化する。RVizの起動にはurdf_launchパッケージのdisplay.launchというlaunchファイルを使用する。なお、launchファイルの内容はこの記事では取り扱わない。
ディレクトリros2_lecture_ws/src/urdf1から以下のコマンドを実行し、URDFを可視化する。このコマンドでは、launchファイルのパラメータに作成したURDFファイルのパッケージおよびパッケージ内の配置場所を指定し、launchファイルを起動している。

. install/setup.bash
ros2 launch urdf_launch display.launch.py urdf_package:=urdf1 urdf_package_path:=urdf/simple_urdf1.urdf 

なお、RVizの画面上に正常に表示されないときは以下の2点を確認する。

  1. 左側の"Displays"欄の"Fixed Frame"に"base_link"が指定されていること
  2. "Robot_model"にチェックが入っていること

RViz_display

RViz上では2つの座標軸が表示されている。それぞれの座標軸は、URDFで定義したbase_linkbody_linkの2つのリンクの座標軸を表す。ジョイントで指定した位置(base_linkからz軸方向に0.1m移動した点)に、body_linkが位置する。また、base_linkの座標軸を中心とした赤色の箱型と、body_linkからz軸方向に0.15mの点を中心とした緑色の箱型の2つが表示されている。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0