1. SDF建模简介
在使用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开源地址:https://github.com/gezp/xacro4sdf
2 xacro4sdf的安装
pip安装方式
#install by pip pip install xacro4sdf
源码安装方式
# or 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参数等,另一方面使用相对也更加简单。 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>
</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. 最后
如果你觉得xacro4sdf工具对你有用的话,希望可以在GitHub上给一个star. (●’◡’●)
- https://github.com/gezp/xacro4sdf