添加物理与碰撞属性
目标: 学习如何为 link 添加碰撞和惯性属性,以及如何为关节添加关节动力学。
教程级别: 中级
预计用时: 10 分钟
本教程将介绍如何为 URDF 模型添加基本的物理属性,并定义碰撞属性。
到目前为止,我们只通过 visual 子元素来定义 link,顾名思义,它描述的是机器人的外观。但要让碰撞检测正常工作或在仿真器中运行,还需要额外定义 collision 元素。这里是带有碰撞和物理属性的新 URDF。
以下是新的 base link 代码。
<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>- collision 元素是 link 的直接子元素,与 visual 标签同级。
- collision 元素通过 geometry 标签定义形状,用法与 visual 元素完全相同。
- 同样可以在 collision 标签下指定 origin 子元素,方式与 visual 一致。
在多数情况下,碰撞几何体和原点会与可视几何体和原点保持一致。但有两种常见情况需要区别对待:
- 提升处理速度: 对两个网格进行碰撞检测的计算量远大于两个简单几何体。因此,可以在 collision 元素中用更简单的几何体替代网格。
- 安全区域: 有时需要限制运动范围,避免靠近敏感部件。例如,如果不希望任何东西碰到 R2D2 的头部,可以把碰撞几何体定义为一个包围头部的圆柱体,从而阻止其他物体过于靠近。
要让模型正确仿真,需要为机器人定义一些物理属性,也就是 Gazebo 等物理引擎所需的参数。
每个参与仿真的 link 元素都需要一个 inertial 标签。下面是一个简单的示例。
<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>- 这个元素同样是 link 的子元素。
- 质量的单位为千克。
- 3×3 旋转惯性矩阵通过 inertia 元素指定。由于矩阵是对称的,只需 6 个元素即可表示,如下所示:
| ixx | ixy | ixz |
| ixy | iyy | iyz |
| ixz | iyz | izz |
- 这些信息可以由 MeshLab 等建模软件提供。几何图元(圆柱体、长方体、球体)的惯性可以参考维基百科的惯性矩张量列表来计算(上面的示例就使用了这些值)。
- 惯性张量取决于物体的质量和质量分布。一个较好的初步近似,是假设质量在物体体积内均匀分布,再根据物体形状计算惯性张量。
- 如果不确定该填什么,ixx/iyy/izz=1e-3 或更小的值对于中等大小的 link 通常是一个合理的默认值(对应于边长 0.1 m、质量 0.6 kg 的长方体)。单位矩阵则是特别糟糕的选择,因为惯性通常过高(对应于边长 0.1 m、质量 600 kg 的长方体!)。
- 还可以指定 origin 标签,用于定义重心和惯性参考系(相对于 link 的参考系)。
- 使用实时控制器时,零(或接近零)的惯性可能导致机器人模型在没有任何警告的情况下坍塌,所有 link 的原点将与世界原点重合。
此外,还可以定义 link 之间接触时的行为方式,这通过 collision 标签下的 contact_coefficients 子元素来设置。需要指定三个属性:
关节的运动特性由 dynamics 标签定义,包含两个属性:
friction- 物理静摩擦力。对于棱柱关节,单位是牛顿。对于旋转关节,单位是牛顿·米。damping- 物理阻尼值。对于棱柱关节,单位是牛顿·秒/米。对于旋转关节,单位是牛顿·米·秒/弧度。
如果未指定,这些系数默认为零。
在纯 URDF 范畴内(即不包括 Gazebo 特定的标签),还有两个标签可用于定义关节特性:calibration 和 safety controller。它们不在本教程的讨论范围内,请参阅规范。
通过使用 xacro来减少代码量和繁琐的数学计算。