一、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}
,这些极大的降低了代码的重复性,最后两个车轮的定义也只需两行。这不仅仅简化了模型的开发,也提高了模块的可扩展性。