10. URDF XML规程

10.1 robot

元素robot用于描述机器人的所有属性。

10.1.1 <robot>元素

在一个机器人的描述文件中,根元素必须是<robot>元素,所有其它元素都必须封装在<robot>元素之内。

10.1.2 子元素

<robot>主要有以下子元素:

<link>元素:用于定义具有其自身坐标系的链接。

<joint>元素:用于定义强制性关节坐标系。

<transmission>元素:专用于PR2机器人。

<gazebo>元素:Gazebo仿真扩展。

10.1.3 属性

Name属性:主文件中必须有name属性。在包含文件中name属性是可选的。如果在额外的包含文件中指定了属性name,则其值必须与主文件中的name属性值相同。

10.1.4 示例

<robot name="pr2">
<!-- pr2 robot links and joints and more -->
</robot>

10.2 link

元素link用于描述链接的运动学和动力学属性。

10.2.1 <link>元素

<link>元素用于描述具有惯性、视觉特征和碰撞属性的刚体。

下面是一个<link>元素的示例:

<link name="my_link">
  <inertial>
    <origin xyz="0 0 0.5" rpy="0 0 0"/>
    <mass value="1"/>
<inertia ixx="100"  ixy="0"  ixz="0" iyy="100" iyz="0" izz="100" />
</inertial>

  <visual>
    <origin xyz="0 0 0" rpy="0 0 0" />
    <geometry>
      <box size="1 1 1" />
   </geometry>
    <material name="Cyan">
      <color rgba="0 1.0 1.0 1.0"/>
    </material>
  </visual>

  <collision>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <cylinder radius="1" length="0.5"/>
    </geometry>
  </collision>
</link>

10.2.2 属性

Name属性(必须有):用于指定链接本身的名称。

10.2.3 子元素

<link>元素的子元素有<inertial>、<visual>和<collision>。

1、<inertial>元素

可选子元素,用于指定某个链接的惯性属性。如果未指定该子元素,则默认情况下该链接的mass和inertia子元素值均为0。该子元素又包括以下3个子元素:

(1)<origin>子元素

可选子元素,用于指定该惯性的原点,即相对于链接参考坐标系,该惯性参考坐标系的位姿。如果未指定,则默认与链接的原点相同。惯性参考坐标系的原点必须位于重心处。惯性参考坐标系的轴不必与惯性的主轴对齐。

该元素可以用以下两个子元素来描述:

①xyz

可选子元素,用于表达惯性参考坐标系原点对链接参考坐标系原点在xyz三个轴上的偏移量,默认为0向量。

②rpy

可选子元素,用于表达惯性绕xyz三个固定轴的旋转角度即横滚角(roll)、俯仰角(pitch)和偏航角(yaw),单位为弧度。如果未指定该子元素的值,则默认情况下为0向量,即不绕三个轴旋转或与链接参考坐标系的三个轴方向相同。

(2)<mass>子元素

此子元素的value属性用于表示链接的质量大小。

(3)<inertia>子元素

以惯性表示的3×3转动惯性矩阵。由于转动惯性矩阵是对称的,所以这里只指定了此矩阵对角线之上的6个元素,用属性ixx、ixy、ixz、iyy、iyz、izz来表示。一些原始形状的惯性矩阵可以在此处找到。

2、<visual>元素

可选子元素,用于指定链接的视觉属性。此元素为可视化目的指定物体的形状(方盒、圆柱体、球体等)。注意:同一链接可以有多个<visual>标签实例。这些标签实例定义的几何体的并集构成了该链接的视觉表示。

<visual>元素可以用可选属性name来指定链接几何体某个部分的名称,这对于引用链接几何体的特定部分非常有用。

<visual>元素包括以下3个子元素:

(1)<origin>子元素

可选子元素,用于指定该视觉的原点,即相对于链接参考坐标系,该视觉参考坐标系的位姿。如果未指定,则默认与链接的原点相同。

该元素可以用以下两个子元素来描述:

①xyz

可选子元素,用于表达视觉参考坐标系原点对链接参考坐标系原点在xyz三个轴上的偏移量,默认为0向量。

②rpy

可选子元素,用于表达视觉绕xyz三个固定轴的旋转角度即横滚角(roll)、俯仰角(pitch)和偏航角(yaw),单位为弧度。如果未指定该子元素的值,则默认情况下为0向量,即不绕三个轴旋转或与链接参考坐标系的三个轴方向相同。

(2)<geometry>子元素

此子元素是必须有的,用于指定视觉对象的形状,可以用以下4个子元素之一来指定:

①<box>

视觉对象形状为方盒(长方体)时使用此子元素,其属性size用于指定方盒三条边(长、宽、高)的长度,方盒的原点位于其中心点处。

②<cylinder>

视觉对象形状为圆柱体时使用此子元素,其属性radiuslength用于指定圆柱体的圆形截面半径和圆柱体的长度。圆柱体的原点位于其中心点处。

③<sphere>

视觉对象形状为球体时使用此子元素,其属性radius用于指定球体的半径。球体的原点位于其中心点处。

④<mesh>

由一个filename和一个可选的scale指定的三角网格(trimesh)元素,其中scale会缩放网格的轴以使其与边界框对齐。可以接受任何几何格式,但具体的应用程序兼容性取决于具体实现。最佳纹理和颜色支持的推荐格式是Collada的.dae文件。网格文件不能在引用相同模型的不同机器之间进行传输,即网格文件必须是本地文件。在网格文件名之前加上package://<packagename>/<path>来设置该网格文件相对于软件包<packagename>的路径。

(3)<material>子元素

可选子元素,用于指定视觉元素的材质。允许在顶层<robot>元素中、<link>元素外指定材质元素。这样就可以在某个链接元素中以该材质元素的名称来引用。其name属性用于指定材质的名称。

该子元素又可以包括以下2个子元素:

①<color>

可选子元素,此子元素的rgba属性用代表红/绿/蓝/alpha颜色通道的四个数值集合来指定材质的颜色,这四个数值的范围均为[0,1]。

②<texture>

可选子元素,通过一个filename属性来指定某种材质的纹理。

3、<collision>元素

可选子元素,用于指定链接的碰撞属性。请注意,某个链接的碰撞属性可能会与其视觉属性不同,例如,通常使用更简单的碰撞模型来减少计算时间。注意:同一链接可以有多个<collision>标签实例,这些标签实例定义的几何体的并集构成了该链接的碰撞表示。

<collision>元素可以用可选属性name来指定链接几何体某个部分的名称,这对于引用链接几何体的特定部分非常有用。

<collision>元素包括以下2个子元素:

(1)<origin>子元素

可选子元素,用于指定该碰撞元素的原点,即相对于链接参考坐标系,该碰撞元素参考坐标系的位姿。如果未指定,则默认与链接的原点相同。

该元素可以用以下两个子元素来描述:

①xyz

可选子元素,用于表达碰撞元素参考坐标系原点对链接参考坐标系原点在xyz三个轴上的偏移量,默认为0向量。

②rpy

可选子元素,用于表达碰撞元素绕xyz三个固定轴的旋转角度即横滚角(roll)、俯仰角(pitch)和偏航角(yaw),单位为弧度。如果未指定该子元素的值,则默认情况下为0向量,即不绕三个轴旋转或与链接参考坐标系的三个轴方向相同。

(2)<geomery>子元素

与<visual>元素的相同,因此请参见上面<visual>元素中的<geometry>子元素说明。

10.2.4 推荐的网格分辨率

● 为了使用ROS运动规划(motion planning)软件包进行碰撞检测,推荐每个链接在URDF中的碰撞网格使用尽可能少的面(最好小于1000)。如果可能,鼓励使用其它原始形状(方盒、圆柱体、球体)来近似网格。

10.2.5 多碰撞体

URDF决定不支持多组碰撞体,即使有时会有这样的应用。URDF的目的仅在于表示实际机器人的属性,而不是为了表示用于诸如控制器碰撞检测等外部事物的碰撞。在URDF中,<visual>元素应该尽可能精确表达真实机器人,而<collision>元素则仍应该是真实机器人的一种近似,尽管在网格中的三角形要少得多。

如果您确实需要用于诸如碰撞检测和控制器之类的粗粒度、超大的碰撞几何体,则可以将这些网格/几何体移至自定义的XML元素中。例如,若您的控制器需要一些特殊的粗略碰撞检测几何体,则可以在<collision>元素之后添加<collision_checking>标签,如下所示:

  <link name="torso">
    <visual>
      <origin rpy="0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://robot_description/meshes/base_link.DAE"/>
      </geometry>
    </visual>
    <collision>
      <origin rpy="0 0 0" xyz="-0.065 0 0.0"/>
      <geometry>
        <mesh filename="package://robot_description/meshes/base_link_simple.DAE"/>
      </geometry>
    </collision>
    <collision_checking>
      <origin rpy="0 0 0" xyz="-0.065 0 0.0"/>
      <geometry>
        <cylinder length="0.7" radius="0.27"/>
      </geometry>
    </collision_checking>
    <inertial>
      ...
    </inertial>
  </link>  

URDF会忽略这些自定义元素,如“collision_checking”,而您的具体程序则可以解析XML本身以获取此信息。

英语原文地址:wiki.ros.org/urdf/XML