模組化生成SDF模型: xacro4sdf的簡單介紹
1. SDF建模簡介
在使用ROS進行機器人開發的時候,模擬是非常重要的一個環境,而Gazebo是與ROS相容性最好的模擬器之一。在使用Gazebo模擬的時候,需要先對環境和機器人進行建模,而Gazebo模擬建模的標準格式就是SDF(sdformat),ROS中機器人的描述標準格式為URDF,兩者均採用xml語言,在一定程度上具有一定相似性,但是是不相容的。至於SDF與URDF的選擇,以及為什麼選擇SDF,可以參考 小明工坊 的文章,總結的非常好,這裡不再重複。
SDF檔案採用xml語言編寫,直接編寫sdf檔案非常不友好。
URDF也是採用xml語言編寫,但是採用xacro工具,可以定義巨集變數與巨集模組,然後複用這些變數和巨集模組,基於巨集的方式的使得編寫xml變得相對友好,既減少了程式碼量,又節省了建模時間。
- 先編寫robot.xacro,然後使用xacro工具,解析生成robot.urdf檔案。
不幸的是xacro不支援sdf檔案的巨集定義的書寫,小明工坊
提到的ERB:模組化生成SDF模型的方法是基於ERB的方案,明顯感覺不如xacro使用方便,然後目前網上也沒發現有為sdf開發出一個類似於xacro的外掛,於是,自己動手,豐衣足食,便由此產生了xacro4sdf外掛。
- xacro4sdf開源地址:
2 xacro4sdf的安裝
pip安裝方式
#install by pip
pip install xacro4sdf
原始碼安裝方式
# install from source code
git clone https://github.com/gezp/xacro4sdf.git
cd xacro4sdf && sudo python3 setup.py install
3 xacro4sdf的簡單介紹
xacro4sdf支援類似於xacro的Properties和Macros的功能,通過定義巨集,然後使用巨集,極大複用了程式碼,即減少了程式碼量,又節省了建模時間。雖然xacro4sdf開發靈感來源於xacro,但是使用API完全不同於xacro,一方面功能相對更加少,不支援block引數等,另一方面使用相對也更加簡單。<br />xacro4sdf支援tag
<xacro_define_property>
:變數定義<xacro_define_macro>
:巨集模組定義<xacro_macro>
:巨集模組使用<xacro_include_definition>
:引用其他檔案中的<xacro_define_property>
和<xacro_define_macro>
<xacro_include_model>
:引用其他檔案中的model,即<model>...</model>
之間的內容。(不推薦使用)
xacro4sdf支援${xxx}
方式的數學表示式
- 與xacro使用方式類似。
xacro4sdf還提供了一些預定義的巨集,可直接使用
<!--macro defination:inertia-->
<xacro_define_macro name="inertia_cylinder" params="m r l">
<xacro_define_macro name="inertia_box" params="m x y z">
<xacro_define_macro name="inertia_sphere" params="m r">
<!--macro defination:geometry-->
<xacro_define_macro name="geometry_cylinder" params="r l">
<xacro_define_macro name="geometry_box" params="x y z">
<xacro_define_macro name="geometry_sphere" params="r">
<xacro_define_macro name="geometry_mesh" params="uri">
<!--macro defination:visual_collision_with_mesh-->
<xacro_define_macro name="visual_collision_with_mesh" params="prefix uri">
4 xacro4sdf的簡單使用
首先編寫一個sdf.model.xacro檔案(必須.xacro結尾)
<?xml version="1.0"?>
<sdf version="1.7">
<!--definition of property-->
<xacro_define_property name="h" value="0.2" />
<xacro_define_property name="mass" value="0.2" />
<!--definition of macro-->
<xacro_define_macro macro_name="inertia_box" params="m x y z">
<mass>${m}</mass>
<inertia>
<ixx>${m*(y*y+z*z)/12}</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>${m*(x*x+z*z)/12}</iyy>
<iyz>0</iyz>
<izz>${m*(x*x+y*y)/12}</izz>
</inertia>
</xacro_define_macro>
<!--rplidar a2-->
<model name='rplidar_a2'>
<link name="link">
<inertial>
<pose>0 0 0.02 0 0 0</pose>
<xacro_macro name="inertia_box" m="0.5" x="${h}" y="${h+0.1}" z="${2*h}"/>
</inertial>
<collision name="collision">
<xacro_macro name="geometry_mesh" uri="model://rplidar_a2/meshes/rplidar_a2.dae"/>
</collision>
<visual name="visual">
<xacro_macro name="geometry_mesh" uri="model://rplidar_a2/meshes/rplidar_a2.dae"/>
</visual>
</link>