ROS入門 (24) - URDFによるロボットモデルの作成
URDFによるロボットモデルの作成手順をまとめました。
前回
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>
◎ rvizでの確認
rvizでURDFを表示するコマンドは、次のとおりです。
$ roslaunch urdf_tutorial display.launch model:=urdf/01-myfirst.urdf
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>
URDFは、最終的には1つのルートリンクを持つツリー構造になります。今回の構造は、「right_leg」が「base_link」に依存していることを意味します。
◎ rvizでの確認
rvizでURDFを表示するコマンドは、次のとおりです。
$ roslaunch urdf_tutorial display.launch model:=urdf/02-multipleshapes.urdf
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>
親の関節の原点は、<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
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>
「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
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
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.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」の属性は、次のとおりです。
「joint」の属性は、次のとおりです。
次回
この記事が気に入ったらサポートをしてみませんか?