見出し画像

ROS入門 (24) - URDFによるロボットモデルの作成

URDFによるロボットモデルの作成手順をまとめました。

・Melodic

前回

1. urdf_tutorial

今回は、公式の「urdf_tutorial」を利用します。

2. urdf_tutorialのセットアップ

「urdf_tutorial」のセットアップ手順は、次のとおりです。

(1) ワークスペースのセットアップ。
ROS入門 (8) - ROS1のパッケージの作成」と同様です。

(2) 「~/catkin_ws/src」に「urdf_tutorial」パッケージをクローン。
マウントしたPC側でクローンしました。

$ cd ~/catkin_ws/src
$ git clone git@github.com:ros/urdf_tutorial.git

(3) ワークスペースのビルドとセットアップ。

$ cd ~/catkin_ws
$ catkin build
$ source ~/catkin_ws/devel/setup.bash
$ cd ~/catkin_ws/src/urdf_tutorial

(5)「ros-melodic-joint-state-publisher-gui」のインストール。
「rviz」で利用します。

$ sudo apt update
$ sudo apt install ros-melodic-joint-state-publisher-gui

(6) 「urdf_tutorial」フォルダに移動。
rviz起動時のモデルのパスをurdf_tutorialからの相対パスで指定します。

$ cd ~/catkin_ws/src/urdf_tutorial

3. 単一のシェイプ

はじめに、単一のシェイプを記述するURDFを作成します。

◎ URDFの作成
・~/catkin_ws/src/urdf_tutorial/urdf/01-myfirst.urdf

<?xml version="1.0"?>
<robot name="myfirst">
  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
    </visual>
  </link>
</robot>

・<robot> : ロボットを定義。名前は「myfirst」。
・<link> : リンクを定義。
・<visual> : ビジュアルを定義。今回は長さ0.6m、半径0.2mの円柱。

◎ rvizでの確認
rvizでURDFを表示するコマンドは、次のとおりです。

$ roslaunch urdf_tutorial display.launch model:=urdf/01-myfirst.urdf
画像1

4. 複数のシェイプ

はじめに、複数のシェイプを記述するURDFを作成します。

「リンク」をURDFに追加するだけでは、パーサーはそれをどこに配置するかわかりません。そこで、「関節」を追加します。関節は、可動関節と固定関節があります。今回は、固定関節を使います。

◎ URDFの作成
・~/catkin_ws/src/urdf_tutorial/urdf/02-multipleshapes.urdf

<?xml version="1.0"?>
<robot name="multipleshapes">
  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
    </visual>
  </link>

  <link name="right_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
    </visual>
  </link>

  <joint name="base_to_right_leg" type="fixed">
    <parent link="base_link"/>
    <child link="right_leg"/>
  </joint>
</robot>

・<joint> : 関節を定義。関節は、親と子で定義される。

URDFは、最終的には1つのルートリンクを持つツリー構造になります。今回の構造は、「right_leg」が「base_link」に依存していることを意味します。

◎ rvizでの確認
rvizでURDFを表示するコマンドは、次のとおりです。

$ roslaunch urdf_tutorial display.launch model:=urdf/02-multipleshapes.urdf
画像2

5. 原点

「R2D2」の脚は、胴体の上半分の側面に取り付けられています。そこで、関節の「原点」を指定します。 また、脚の中央ではなく上部に取り付けられるため、脚の「原点」も指定します。そして、脚を回転させて直立させます。

◎ URDFの作成
・~/catkin_ws/src/urdf_tutorial/urdf/03-origins.urdf

<?xml version="1.0"?>
<robot name="origins">
  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
    </visual>
  </link>

  <link name="right_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
    </visual>
  </link>

  <joint name="base_to_right_leg" type="fixed">
    <parent link="base_link"/>
    <child link="right_leg"/>
    <origin xyz="0 -0.22 0.25"/>
  </joint>
</robot>

・<origin> : 原点の定義。

親の関節の原点は、<joint>に追加します。「xyz」で原点のXYZ方向のオフセットを指定します。今回は、y方向-0.22m、z方向0.25mです。

子の関節の原点は、<visual>に追加します。「rpy」(ロー・ピッチ・ヨー)でXYZ軸の回転を指定します。今回は、z方向-0.3mオフセットを指定し、Y軸にPI/2(1.57075)回転させています。

◎ rvizでの確認
rvizでURDFを表示するコマンドは、次のとおりです。

$ roslaunch urdf_tutorial display.launch model:=urdf/03-origins.urdf
画像3

6. マテリアル

「R2D2」の色を変更するために、マテリアルを指定します。

◎ URDFの作成
・~/catkin_ws/src/urdf_tutorial/urdf/04-materials.urdf

<?xml version="1.0"?>
<robot name="materials">

  <material name="blue">
    <color rgba="0 0 0.8 1"/>
  </material>

  <material name="white">
    <color rgba="1 1 1 1"/>
  </material>


  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
      <material name="blue"/>
    </visual>
  </link>

  <link name="right_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
      <material name="white"/>
    </visual>
  </link>

  <joint name="base_to_right_leg" type="fixed">
    <parent link="base_link"/>
    <child link="right_leg"/>
    <origin xyz="0 -0.22 0.25"/>
  </joint>

  <link name="left_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
      <material name="white"/>
    </visual>
  </link>

  <joint name="base_to_left_leg" type="fixed">
    <parent link="base_link"/>
    <child link="left_leg"/>
    <origin xyz="0 0.22 0.25"/>
  </joint>
</robot>

・<material> : マテリアルの定義。

「blue」という名前のマテリアルを定義し、「rgba」に(0, 0, 0.8, 1)を指定しています。すべての値は[0,1]の範囲にあります。このマテリアルは、「base_link」の<visual>によって参照されます。「white」という名前のマテリアルも同様です。色の代わりに画像を指定することもできます。

 ◎ rvizでの確認
rvizでURDFを表示するコマンドは、次のとおりです。

$ roslaunch urdf_tutorial display.launch model:=urdf/04-materials.urdf
画像4

7. 最終モデル

最後に、足、車輪、頭など、いくつかのシェイプを追加して、モデルを完成させます。 注目すべきは、球といくつかのメッシュを追加するところです。また、後で使用する他のいくつかの部品も追加しています。

◎ URDFの作成
・~/catkin_ws/src/urdf_tutorial/urdf/05-visual.urdf

<?xml version="1.0"?>
<robot name="visual">

  <material name="blue">
    <color rgba="0 0 0.8 1"/>
  </material>
  <material name="black">
    <color rgba="0 0 0 1"/>
  </material>
  <material name="white">
    <color rgba="1 1 1 1"/>
  </material>

  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
      <material name="blue"/>
    </visual>
  </link>

  <link name="right_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
      <material name="white"/>
    </visual>
  </link>

  <joint name="base_to_right_leg" type="fixed">
    <parent link="base_link"/>
    <child link="right_leg"/>
    <origin xyz="0 -0.22 0.25"/>
  </joint>

  <link name="right_base">
    <visual>
      <geometry>
        <box size="0.4 0.1 0.1"/>
      </geometry>
      <material name="white"/>
    </visual>
  </link>

  <joint name="right_base_joint" type="fixed">
    <parent link="right_leg"/>
    <child link="right_base"/>
    <origin xyz="0 0 -0.6"/>
  </joint>

  <link name="right_front_wheel">
    <visual>
      <origin rpy="1.57075 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.1" radius="0.035"/>
      </geometry>
      <material name="black"/>
    </visual>
  </link>
  <joint name="right_front_wheel_joint" type="fixed">
    <parent link="right_base"/>
    <child link="right_front_wheel"/>
    <origin rpy="0 0 0" xyz="0.133333333333 0 -0.085"/>
  </joint>

  <link name="right_back_wheel">
    <visual>
      <origin rpy="1.57075 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.1" radius="0.035"/>
      </geometry>
      <material name="black"/>
    </visual>
  </link>
  <joint name="right_back_wheel_joint" type="fixed">
    <parent link="right_base"/>
    <child link="right_back_wheel"/>
    <origin rpy="0 0 0" xyz="-0.133333333333 0 -0.085"/>
  </joint>

  <link name="left_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
      <material name="white"/>
    </visual>
  </link>

  <joint name="base_to_left_leg" type="fixed">
    <parent link="base_link"/>
    <child link="left_leg"/>
    <origin xyz="0 0.22 0.25"/>
  </joint>

  <link name="left_base">
    <visual>
      <geometry>
        <box size="0.4 0.1 0.1"/>
      </geometry>
      <material name="white"/>
    </visual>
  </link>

  <joint name="left_base_joint" type="fixed">
    <parent link="left_leg"/>
    <child link="left_base"/>
    <origin xyz="0 0 -0.6"/>
  </joint>

  <link name="left_front_wheel">
    <visual>
      <origin rpy="1.57075 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.1" radius="0.035"/>
      </geometry>
      <material name="black"/>
    </visual>
  </link>
  <joint name="left_front_wheel_joint" type="fixed">
    <parent link="left_base"/>
    <child link="left_front_wheel"/>
    <origin rpy="0 0 0" xyz="0.133333333333 0 -0.085"/>
  </joint>

  <link name="left_back_wheel">
    <visual>
      <origin rpy="1.57075 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.1" radius="0.035"/>
      </geometry>
      <material name="black"/>
    </visual>
  </link>
  <joint name="left_back_wheel_joint" type="fixed">
    <parent link="left_base"/>
    <child link="left_back_wheel"/>
    <origin rpy="0 0 0" xyz="-0.133333333333 0 -0.085"/>
  </joint>

  <joint name="gripper_extension" type="fixed">
    <parent link="base_link"/>
    <child link="gripper_pole"/>
    <origin rpy="0 0 0" xyz="0.19 0 0.2"/>
  </joint>

  <link name="gripper_pole">
    <visual>
      <geometry>
        <cylinder length="0.2" radius="0.01"/>
      </geometry>
      <origin rpy="0 1.57075 0 " xyz="0.1 0 0"/>
    </visual>
  </link>

  <joint name="left_gripper_joint" type="fixed">
    <origin rpy="0 0 0" xyz="0.2 0.01 0"/>
    <parent link="gripper_pole"/>
    <child link="left_gripper"/>
  </joint>

  <link name="left_gripper">
    <visual>
      <origin rpy="0.0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/>
      </geometry>
    </visual>
  </link>

  <joint name="left_tip_joint" type="fixed">
    <parent link="left_gripper"/>
    <child link="left_tip"/>
  </joint>

  <link name="left_tip">
    <visual>
      <origin rpy="0.0 0 0" xyz="0.09137 0.00495 0"/>
      <geometry>
        <mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/>
      </geometry>
    </visual>
  </link>
  <joint name="right_gripper_joint" type="fixed">
    <origin rpy="0 0 0" xyz="0.2 -0.01 0"/>
    <parent link="gripper_pole"/>
    <child link="right_gripper"/>
  </joint>

  <link name="right_gripper">
    <visual>
      <origin rpy="-3.1415 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/>
      </geometry>
    </visual>
  </link>

  <joint name="right_tip_joint" type="fixed">
    <parent link="right_gripper"/>
    <child link="right_tip"/>
  </joint>

  <link name="right_tip">
    <visual>
      <origin rpy="-3.1415 0 0" xyz="0.09137 0.00495 0"/>
      <geometry>
        <mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/>
      </geometry>
    </visual>
  </link>

  <link name="head">
    <visual>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
      <material name="white"/>
    </visual>
  </link>
  <joint name="head_swivel" type="fixed">
    <parent link="base_link"/>
    <child link="head"/>
    <origin xyz="0 0 0.3"/>
  </joint>

  <link name="box">
    <visual>
      <geometry>
        <box size="0.08 0.08 0.08"/>
      </geometry>
      <material name="blue"/>
    </visual>
  </link>

  <joint name="tobox" type="fixed">
    <parent link="head"/>
    <child link="box"/>
    <origin xyz="0.1814 0 0.1414"/>
  </joint>
</robot>


球を追加する方法は、次のとおりです。

  <link name="head">
    <visual>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
      <material name="white"/>
    </visual>
  </link>

以下のメッシュはPR2から借りたものです。これらは、パスを指定する必要がある個別のファイルです。「package://NAME_OF_PACKAGE/path」を使用する必要があります。 このチュートリアルのメッシュは、urdf_tutorialパッケージ内のmeshesフォルダにあります。

  <link name="left_gripper">
    <visual>
      <origin rpy="0.0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/>
      </geometry>
    </visual>
  </link>

様々な形式のメッシュをインポートできます。 DAEは独自の色データを持てるため、色や素材を指定する必要はありません。多くの場合、これらは別ファイルにあります。これらのメッシュは、meshesフォルダ内の.tifファイルも参照します。

メッシュは、相対スケーリングパラメータまたはバウンディングボックスサイズを使用してサイズ設定することもできます。完全に異なるパッケージのメッシュを参照することもできます。「package://pr2_description/meshes/gripper_v0/l_finger.dae」は、pr2_descriptionパッケージがインストールされている場合に機能します。

◎ rvizでの確認
rvizでURDFを表示するコマンドは、次のとおりです。

$ roslaunch urdf_tutorial display.launch model:=urdf/05-visual.urdf
画像5

8. 参考

【おまけ】 display.launch

「display.launch」の中身は、次のとおりです。

<launch>
  <!-- 引数 -->
  <arg name="model" default="$(find urdf_tutorial)/urdf/01-myfirst.urdf"/>
  <arg name="gui" default="true" />
  <arg name="rvizconfig" default="$(find urdf_tutorial)/rviz/urdf.rviz" />

  <!-- パラメータにモデルを読み込み -->
  <param name="robot_description" command="$(find xacro)/xacro $(arg model)" />

  <!-- joint_state_publisherの起動 -->
  <node if="$(arg gui)" name="joint_state_publisher" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
  <node unless="$(arg gui)" name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

  <!-- robot_state_publisherの起動 -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

  <!-- rvizの起動 -->
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>

モデルと関節の伝達経路は、次のとおりです。

◎ モデル
・URDF
        ↓
・パラメータ - robot_description
        ↓
・rviz - robot_description

◎ 関節
・joint_state_publisher
        ↓
   sensor_msgs/JointState
・robot_state_publisher
        ↓
    tf
・rviz

【おまけ】 urdf.rviz

「urdf.rviz」の中身は、次のとおりです。

Panels:
  - Class: rviz/Displays
    Name: Displays
  - Class: rviz/Views
    Name: Views
Visualization Manager:
  Displays:
    - Class: rviz/Grid
      Name: Grid
      Value: true
    - Alpha: 0.8
      Class: rviz/RobotModel
      Enabled: true
      Name: RobotModel
      Robot Description: robot_description
      Value: true
    - Class: rviz/TF
      Name: TF
      Value: false
    Global Options:
    Fixed Frame: base_link
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz/MoveCamera
  Value: true
  Views:
    Current:
      Class: rviz/Orbit
      Distance: 1.7
      Name: Current View
      Pitch: 0.33
      Value: Orbit (rviz)
      Yaw: 5.5
Window Geometry:
  Height: 800
  Width: 1200

【おまけ】 linkの属性

「link」の属性は、次のとおりです。

・<collision> : 衝突情報の定義。
・<visual> : 可視化情報の定義。
・<inertial> : 慣性情報の定義。
・<mass> : 重さ(kg)の定義。
・<inertia> : 慣性テンソルの定義
・<material> : マテリアルの定義。

「joint」の属性は、次のとおりです。

・<parent> : 関節の親リンクの名前の指定。
・<child> : 関節の子リンクの名前の指定。
・<origin> : 親リンクの座標系から子リンクの座標系への相対座標の変換。
・<axis> : 回転軸の定義。
・<limit> : 関節の速度、力、回転角度の上限下限の指定。

次回



この記事が気に入ったらサポートをしてみませんか?