環境
この記事は以下の環境で動いています。
項目 | 値 |
---|---|
CPU | Core i5-8250U |
Ubuntu | 20.04 |
ROS | Noetic |
インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。
概要
URDFにはプログラマブルな要素が一切ないので繰り返しのパターンなどもすべて書く必要があります。例えばタイヤが4つあるロボットでも4つのタイヤを別々に記述する必要があります。そこでxacro(Xml mACRO)という記法を使うことでこれを解決します。
例1(property)
まずXacroの書式と一番基本的な機能であるpropertyを説明します。そしてXacroの使い方を説明します。
ソースコード
<robot name="test_robot" xmlns:xacro="http://ros.org/wiki/xacro">
<xacro:property name="side" value="0.5" />
<link name="base_link">
<visual>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<box size="${side} ${side} ${side}" />
</geometry>
<material name="red">
<color rgba="1.0 0.0 0.0 2.0"/>
</material>
</visual>
</link>
</robot>
ポイントを説明していきます。
- 1行目の
<robot>
タグの中の属性としてxmlns:xacro="http://ros.org/wiki/xacro"
を書きます。これを書かないとxacroとして認識されません。 - 2行目の
<xacro:property name="side" value="0.5" />
ではいわば定数の設定をしています。nameに変数名、valueに値を入れます。この値は数字、文字列、true/falseが使えます。 - 14行目の
<box size="${side} ${side} ${side}" />
では上で設定した「定数」を使用しています。この部分は後々<box size="0.5 0.5 0.5" />
と解釈されます。
実行
上記のxacroファイルを指定して実行します。
roscd vis_lecture/xacro/
roslaunch urdf_tutorial display.launch model:=basic1.xacro
以下のようにRviz上に一辺0.5mの立方体が出現します。
(Fixed Frameをbase_linkに変更、RobotModelの表示の操作が必要です)
xacroファイルの変換と確認
デバッグ用にxacroファイルの変換とそれを確認する手段を説明します。
xacroファイルのurdfへの展開を行う
以下のコマンドでxacroファイルを展開することができます。
roscd vis_lecture/xacro/
rosrun xacro xacro basic1.xacro --inorder >basic1.urdf
展開した中身を見てみましょう。
<?xml version="1.0" ?>
<!-- =================================================================================== -->
<!-- | This document was autogenerated by xacro from basic1.xacro | -->
<!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | -->
<!-- =================================================================================== -->
<robot name="test_robot" xmlns:xacro="http://ros.org/wiki/xacro">
<link name="base_link">
<visual>
<origin rpy="0 0 0" xyz="0 0 0"/>
<geometry>
<box size="0.5 0.5 0.5"/>
</geometry>
<material name="red">
<color rgba="1.0 0.0 0.0 2.0"/>
</material>
</visual>
</link>
</robot>
確かに11行目で<box size="0.5 0.5 0.5"/>
と正しく展開できています。
エラーチェック
xacroが正しく展開できても、展開したurdfの書式が正しいかはわかりません。またこの辺りでエラーがあってもroslaunchで実行すると何が悪いのかわかりにくいです。以下のようにcheck_urdf
を使ってあらかじめ構文を確認するのをお勧めします。
roscd vis_lecture/xacro/
rosrun xacro xacro basic1.xacro --inorder >basic1.urdf
check_urdf basic1.urdf
エラーがなかった場合は以下のような表示になります。
robot name is: test_robot
---------- Successfully Parsed XML ---------------
root Link: base_link has 0 child(ren)
例2(数式)
ソースコード
<robot name="test_robot" xmlns:xacro="http://ros.org/wiki/xacro">
<xacro:property name="side" value="0.5" />
<material name="red">
<color rgba="1.0 0.0 0.0 2.0"/>
</material>
<link name="base_link"/>
<joint name="body0_joint" type="fixed">
<origin rpy="0 0 0" xyz="${0.5*cos(radians(0))} ${0.5*sin(radians(0))} 0"/>
<parent link="base_link"/>
<child link="body0_link"/>
</joint>
<link name="body0_link">
<visual>
<geometry>
<box size="0.1 0.1 0.1" />
</geometry>
<material name="red"/>
</visual>
</link>
<joint name="body1_joint" type="fixed">
<origin rpy="0 0 0" xyz="${0.5*cos(radians(30))} ${0.5*sin(radians(30))} 0"/>
<parent link="base_link"/>
<child link="body1_link"/>
</joint>
<link name="body1_link">
<visual>
<geometry>
<box size="0.1 0.1 0.1" />
</geometry>
<material name="red"/>
</visual>
</link>
<joint name="body2_joint" type="fixed">
<origin rpy="0 0 0" xyz="${0.5*cos(radians(60))} ${0.5*sin(radians(60))} 0"/>
<parent link="base_link"/>
<child link="body2_link"/>
</joint>
<link name="body2_link">
<visual>
<geometry>
<box size="0.1 0.1 0.1" />
</geometry>
<material name="red"/>
</visual>
</link>
</robot>
<origin rpy="0 0 0" xyz="${0.5*cos(radians(0))} ${0.5*sin(radians(0))} 0"/>
のように数式を${ }
で囲った中に書きます。この部分はpythonのeval()が実行されるようで、pythonデフォルトの関数と、mathライブラリの関数が使えます。
実行
roscd vis_lecture/xacro/
roslaunch urdf_tutorial display.launch model:=basic2.xacro
例3(条件式)
ソースコード
<robot name="test_robot" xmlns:xacro="http://ros.org/wiki/xacro">
<xacro:property name="color" value="blue" />
<material name="red">
<color rgba="1.0 0.0 0.0 2.0"/>
</material>
<material name="blue">
<color rgba="0.0 0.0 1.0 2.0"/>
</material>
<link name="base_link">
<visual>
<geometry>
<box size="0.1 0.1 0.1" />
</geometry>
<xacro:if value="${color=='red'}">
<material name="red"/>
</xacro:if>
<xacro:if value="${color=='blue'}">
<material name="blue"/>
</xacro:if>
</visual>
</link>
</robot>
<xacro:if value="${color=='red'}">
から</xacro:if>
の間がvalue属性の中の条件式が真の時のみ展開されます。またvalue値を指定するのにクォーテーションが必要で、また条件式で文字列を作るためにもクォーテーションを使います。両方同じクォーテーションを使うと誤動作するので、片方をダブルクォーテーションにして、もう片方をシングルクォーテーションにします。
実行
roscd vis_lecture/xacro/
roslaunch urdf_tutorial display.launch model:=basic3.xacro