添加物理和碰撞属性
**目标:**学习如何为链接添加碰撞和惯性属性,以及如何为关节添加关节动力学。
教程级别: 中级
时间: 10分钟
在本教程中,我们将介绍如何为URDF模型添加一些基本的物理属性,并指定其碰撞属性。
碰撞
到目前为止,我们只为链接指定了一个子元素“visual”,它定义了机器人的外观。然而,为了使碰撞检测工作或者模拟机器人,我们还需要定义一个“collision”元素。这是带有碰撞和物理属性的新URDF文件。
这是我们新基本链接的代码。
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
<material name="blue">
<color rgba="0 0 .8 1"/>
</material>
</visual>
<collision>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
</collision>
</link>
碰撞元素是链接对象的直接子元素,与视觉标签处于同一级别。
碰撞元素的形状定义方式与视觉元素相同,都是使用geometry标签。在这里,geometry标签的格式与视觉元素完全相同。
您还可以像在视觉元素中一样,在碰撞标签的子元素中指定一个起点。
在许多情况下,您希望碰撞几何体和原点与视觉几何体和原点完全相同。然而,有两种情况下您不会这样做:
更快的处理速度。检测两个网格的碰撞要比检测两个简单几何体复杂得多。因此,您可能希望将网格替换为碰撞元素中的简单几何体。
安全区域。您可能希望限制靠近敏感设备的移动。例如,如果我们不希望任何物体与R2D2的头碰撞,我们可以将碰撞几何体定义为一个包围他头部的圆柱体,以防止任何物体靠近他的头部。
物理属性
为了使您的模型能够正确模拟,您需要定义机器人的几个物理属性,即像Gazebo这样的物理引擎需要的属性。
惯性
每个被模拟的链接元素都需要一个惯性标签。这是一个简单的标签。
<link name="base_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
<material name="blue">
<color rgba="0 0 .8 1"/>
</material>
</visual>
<collision>
<geometry>
<cylinder length="0.6" radius="0.2"/>
</geometry>
</collision>
<inertial>
<mass value="10"/>
<inertia ixx="1e-3" ixy="0.0" ixz="0.0" iyy="1e-3" iyz="0.0" izz="1e-3"/>
</inertial>
</link>
该元素也是链接对象的子元素。
质量以千克为单位定义。
3x3旋转惯性矩阵由惯性元素指定。由于它是对称的,只需要用6个元素来表示。
ixx
ixy
ixz
ixy
iyy
iyz
ixz
iyz
izz
这些信息可以由诸如MeshLab之类的建模程序提供。可以使用维基百科的`惯性矩张量列表<https://en.wikipedia.org/wiki/List_of_moments_of_inertia#List_of_3D_inertia_tensors>`_来计算几何原始体(圆柱体、长方体、球体)的惯性(在上面的示例中使用)。
惯性张量取决于物体的质量和质量分布。一个很好的第一近似是假设物体的质量在体积上均匀分布,并基于物体的形状计算惯性张量,如上所述。
如果不确定应该填写什么,一个常见的中等大小连接的合理默认值是ixx/iyy/izz=1e-3或更小(它对应于一边长为0.1米、质量为0.6千克的长方体)。恒等矩阵是一个特别糟糕的选择,因为它通常太大(它对应于一边长为0.1米、质量为600千克的长方体)。
您还可以指定一个原点标签,以指定重心和惯性参考系(相对于链接的参考系)。
在使用实时控制器时,惯性元素为零(或几乎为零)可能导致机器人模型突然崩溃,并且所有链接将与世界原点重合。
其他标签
在纯URDF领域(即不包括Gazebo特定标签的情况下),还有两个剩余的标签可用于定义关节:校准和安全控制器。请查看`规范 <https://wiki.ros.org/urdf/XML/joint>`_,因为它们在本教程中没有包含。