前言
实际物理世界中的物体需要遵守物理定律,机器人也不例外,在urdf中我们同样可以给机器人添加相关属性以模拟对应真实物理世界中的情况。
动动手
碰撞collision
碰撞属性指的是该物体的最小安全物理空间,站在机器人的角度,这个最小安全空间就是自身所占空间。
前面的urdf文件中,对于机器人部件(link)我们只给出了visual标签,定义了其形状、颜色,现在我们可以将碰撞属性加入。[原文件:07-physics.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>
- collision属性标签与visual标签同级;
- collision属性里的子标签geometry用来定义最终的最小安全空间范围(几何形状、大小);
- collision属性里同样可以添加原点数据(具体可以参考上面的原文件)。
在许多情况下,我们是希望碰撞几何体和原点要与机器人本身视觉几何体和原点保持一致,但下面的两种情况除外:
- 快速处理。对两个网格(前面提到的mesh文件,如抓手等比较复杂的模型)进行碰撞检测比对两个简单几何体进行碰撞检测要复杂得多。因此,往往可以考虑将mesh简化为容易计算的简单几何体(此时碰撞几何体和原点就与部件本身不一致了);
- 安全区域。我们可能想要限制在敏感设备附近的移动。例如,如果我们不希望任何物体与R2D2的头部发生碰撞,我们可能会定义一个包围其头部的圆柱体作为碰撞几何体,以防止任何物体过于接近其头部(可联想为一隐形头盔)。
物理属性physical properties
此处的物理属性主要指的是惯性(inertia),初中物理我们学过惯性与质量成正比,在机器人动力学中,惯性是机器人机构动力学特性的一个重要因素。由于机器人机构通常包含多个运动部件,这些部件在运动时会产生惯性力,这些惯性力会影响机器人的运动状态和控制精度。因此,在机器人动力学建模和分析中,需要充分考虑惯性因素的影响,以得到更准确的机器人动力学模型和控制算法。计算还是相当复杂的存在。
在Gazebo中也是需要提供机器人的惯性属性来仿真模拟真实情况。
惯性inertia
每个被模拟的连接元素(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>
inertial标签与visual及collision标签等级,也是link标签的子标签;
inertial标签中的mass属性为质量,单位为千克;
3x3 的转动惯量矩阵由惯性元素指定。由于这个矩阵是对称的,因此它可以用仅6个元素来表示,如下所示。
ixx | ixy | ixz |
ixy | iyy | iyz |
ixz | iyz | izz |
这里,3x3的转动惯量矩阵描述了一个物体在空间三个维度上的转动惯量特性。由于矩阵是对称的(即I_xy = I_yx, I_xz = I_zx, I_yz = I_zy),我们只需要存储对角线上的3个元素(表示绕x、y、z轴的转动惯量)以及上三角(或下三角)的3个元素(表示不同轴之间的惯性积)即可。因此,总共需要6个元素来表示这个矩阵。
- 这些信息我们可以通过建模程序(如MeshLab)获取。几何原始形状(如圆柱体、盒子、球体)的惯性可以通过查阅维基百科上关于惯性张量矩列表(在上面的例子中有所使用)来计算得出;
- 惯性张量取决于物体的质量和质量的分布。一个好的初步近似方法是假设物体体积内质量均匀分布,并根据物体的形状来计算惯性张量,如上所述;
- 如果不确定应该填入什么值,对于一个中等大小的连杆,一个合理的默认值是ixx/iyy/izz=1e-3或更小的矩阵(这相当于一个边长为0.1米、质量为0.6千克的盒子)。单位矩阵是一个特别糟糕的选择,因为它通常太高了(它相当于一个边长为0.1米、质量为600千克的盒子!);
- 我们还可以指定一个“origin”标签来指定重心以及惯性参考系(相对于连杆的参考系);
- 在使用实时控制器时,如果惯性元素为零(或几乎为零),可能会导致机器人模型在没有警告的情况下崩溃,并且所有连杆的原点都将与世界原点重合。
接触系数contact coefficients
我们也可以定义连杆在相互接触时如何表现。这是通过collision
标签的一个子元素contact_coefficients
来完成的。其需要指定三个属性:
- mu - 摩擦系数Friction coefficient(有动态和静态两种)
- kp - 刚性系数Stiffness coefficient
- kd - 阻尼系数Dampening coefficient
关节动力学
在urdf中可以通过动力学标签来定义关节的移动属性,这里有两个属性:
- 摩擦friction - 物理静态摩擦。对于滑动关节来说,其单位是牛顿(N),对于有限制的转动关节,其单位是牛米(Nm)。
- 阻尼damping - 物理阻力值,对于滑动关节来说,其单位是牛顿秒每米(Ns/m),有限制的转动关节,其单位是牛顿米秒每弧度(Nms/rad)。
如果不指定具体值,这些系数值默认为0.
其他标签
在纯URDF(即不包括Gazebo特定标签)的领域中,还有两个剩余的标签用于帮助定义关节:calibration
和safety_controller
。但是,需要澄清的是,在标准的URDF规范中,calibration
和safety_controller
并不是标准的标签。URDF(Unified Robot Description Format)主要用于描述机器人的结构、尺寸、质量和关节等物理特性,但不直接涉及控制、校准或安全控制器的配置。
然而,在某些机器人软件框架或应用中,可能会扩展URDF以包含这些额外的信息。例如,calibration
标签可能被用于指定关节校准的参数,而safety_controller
可能用于描述与关节安全相关的控制器参数或配置。
但注意,这些并不是URDF规范的标准部分,而是特定于某个软件框架或应用的扩展。如果在某个特定的机器人软件或仿真环境中看到了这些标签,应该查阅该软件的文档以了解这些标签的具体含义和用法。[参考教程]
本篇完。