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_boxgeometry_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