1. SDF建模簡介
在使用ROS進行機器人開發(fā)的時候前酿,仿真是非常重要的一個環(huán)境珊佣,而Gazebo是與ROS兼容性最好的仿真器之一副砍。在使用Gazebo仿真的時候溜歪,需要先對環(huán)境和機器人進行建模抄肖,而Gazebo仿真建模的標準格式就是SDF(sdformat)久信,ROS中機器人的描述標準格式為URDF,兩者均采用xml語言漓摩,在一定程度上具有一定相似性裙士,但是是不兼容的。至于SDF與URDF的選擇管毙,以及為什么選擇SDF腿椎,可以參考 小明工坊 的文章,總結的非常好夭咬,這里不再重復啃炸。
SDF文件采用xml語言編寫卓舵,直接編寫sdf文件非常不友好南用。
URDF也是采用xml語言編寫,但是采用xacro工具掏湾,可以定義宏變量與宏模塊裹虫,然后復用這些變量和宏模塊,基于宏的方式的使得編寫xml變得相對友好融击,既減少了代碼量筑公,又節(jié)省了建模時間。
- 先編寫robot.xacro尊浪,然后使用xacro工具匣屡,解析生成robot.urdf文件涩拙。
不幸的是xacro不支持sdf文件的宏定義的書寫,小明工坊
提到的ERB:模塊化生成SDF模型的方法是基于ERB的方案耸采,明顯感覺不如xacro使用方便,然后目前網(wǎng)上也沒發(fā)現(xiàn)有為sdf開發(fā)出一個類似于xacro的插件工育,于是虾宇,自己動手,豐衣足食如绸,便由此產生了xacro4sdf插件嘱朽。
- xacro4sdf開源地址:https://github.com/gezp/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的功能,通過定義宏怔接,然后使用宏搪泳,極大復用了代碼,即減少了代碼量扼脐,又節(jié)省了建模時間岸军。雖然xacro4sdf開發(fā)靈感來源于xacro,但是使用API完全不同于xacro瓦侮,一方面功能相對更加少艰赞,不支持block參數(shù)等,另一方面使用相對也更加簡單肚吏。<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}
方式的數(shù)學表達式
- 與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>
</model>
</sdf>
- 其中
inertia_box
和geometry_mesh
為預定義好的宏,可直接使用斋泄,這里重新定義了宏inertia_box
( 即覆蓋了預定義的宏杯瞻,這里只是為了演示<xacro_define_macro>
的使用)
使用xacro4sdf進行轉化
xacro4sdf model.sdf.xacro
生成的model.sdf結果如下
<?xml version="1.0" encoding="UTF-8"?>
<!-- =================================================================================== -->
<!-- | This document was autogenerated by xacro4sdf from model.sdf.xacro | -->
<!-- | EDITING THIS FILE BY HAND IS NOT RECOMMENDED | -->
<!-- =================================================================================== -->
<sdf version="1.7">
<!--definition of property-->
<!--definition of macro-->
<!--rplidar a2-->
<model name="rplidar_a2">
<link name="link">
<inertial>
<pose>0 0 0.02 0 0 0</pose>
<mass>0.5</mass>
<inertia>
<ixx>0.01041666666666667</ixx>
<ixy>0</ixy>
<ixz>0</ixz>
<iyy>0.008333333333333335</iyy>
<iyz>0</iyz>
<izz>0.005416666666666668</izz>
</inertia>
</inertial>
<collision name="collision">
<geometry>
<mesh>
<uri>model://rplidar_a2/meshes/rplidar_a2.dae</uri>
</mesh>
</geometry>
</collision>
<visual name="visual">
<geometry>
<mesh>
<uri>model://rplidar_a2/meshes/rplidar_a2.dae</uri>
</mesh>
</geometry>
</visual>
</link>
</model>
</sdf>
- 更多使用詳情參考https://github.com/gezp/xacro4sdf中的readme.md。
5. 最后
SDF建模小Tip:
- 先使用SW是己,blender等3D建模工具進行建模又兵,然后再把各個模塊(依照可活動關節(jié)分離)導出STL或dea文件。
- 然后編寫SDF文件(采用xacro4sdf 宏工具可簡化SDF文件編寫)卒废,使用xacro4sdf可輕松采用模塊化的建模方式沛厨,可分成幾個文件分別構建模塊,然后再進行組裝摔认。
如果你覺得xacro4sdf工具對你有用的話逆皮,希望可以在GitHub上給一個star. (●'?'●)