URDF和XACRO的区别

一、URDF

1.1 缺点

  • 模型冗长,重复内容过多
  • 参数修改麻烦,不便于二次开发
  • 没有参数计算的功能

例如一辆四轮汽车,在用URDF建模时,要重复创建4份车轮的代码,这里面只有轮子的位置参数是不同的,这种重复性增加了URDF开发的难度。

1.2 URDF的缺陷展示

<!--back wheel x=-0.1 y_l=-0.1 y_r=+0.1 -->

<link name="left_back_wheel_link">
    <visual>
        <origin xyz="0 0 0" rpy="1.5707 0 0" />
        <geometry>
            <cylinder radius="0.06" length = "0.025"/>
        </geometry>
        <material name="white">
            <color rgba="0 0 1 0.9"/>
        </material>
    </visual>
</link>
<joint name="left_back_wheel_joint" type="continuous">
    <origin xyz="-0.1 -0.1 -0.08" rpy="0 0 0"/>
    <parent link="base_link"/>
    <child link="left_back_wheel_link"/>
    <axis xyz="0 1 0"/>
</joint>


<link name="right_back_wheel_link">
    <visual>
        <origin xyz="0 0 0" rpy="1.5707 0 0" />
        <geometry>
            <cylinder radius="0.06" length = "0.025"/>
        </geometry>
        <material name="white">
            <color rgba="0 0 1 0.9"/>
        </material>
    </visual>
</link>
<joint name="right_back_wheel_joint" type="continuous">
    <origin xyz="-0.1 0.1 -0.08" rpy="0 0 0"/>
    <parent link="base_link"/>
    <child link="right_back_wheel_link"/>
    <axis xyz="0 1 0"/>
</joint>

每个车轮都用于两个标签参数<link> ... </link><joint> ... </joint>,而不同车轮间的区别仅仅是名字和位置参数,所以当一个机器人有100个轮子时,代码的冗余程度是无法接受的。

二、XACRO

2.1 优点

针对URDF的缺点,XACRO借鉴了函数的思想,在精简模型代码方面提供了创建宏定义文件包含,同时也提供了可编程接口,例如引入了常量变量数字计算条件语句等功能。这些特性降低了模型的开发难度。

2.2 模型精简效果

    <!-- 常量定义 -->
    <xacro:property name="M_PI" value="3.1415926"/>   

    <!-- 车轮定义 -->
    <xacro:macro name="wheel" params="prefix reflect orientation">
        <joint name="${prefix}_wheel_joint" type="continuous">
            <origin xyz="${orientation*wheel_joint_x} ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0"/>
            <parent link="base_link"/>
            <child link="${prefix}_wheel_link"/>
            <axis xyz="0 1 0"/>
        </joint>

        <link name="${prefix}_wheel_link">
            <visual>
                <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />
                <geometry>
                    <cylinder radius="${wheel_radius}" length = "${wheel_length}"/>
                </geometry>
                <material name="gray" />
            </visual>
        </link>
    </xacro:macro>


    <wheel prefix="back_left"  reflect="-1" orientation="-1"/>     <!-- 后左轮-->
    <wheel prefix="back_right" reflect="1"  orientation="-1"/>     <!-- 后右论-->

使用了XACRO属性后,可以定义常量·M_PI·,也可以定义变量·prefix·,·reflect·,·orientation·,以及对数字的计算${M_PI/2},这些极大的降低了代码的重复性,最后两个车轮的定义也只需两行。这不仅仅简化了模型的开发,也提高了模块的可扩展性。


   转载规则


《URDF和XACRO的区别》 kieranych 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录