目标:学习如何为连杆(link-被翻译为链接)添加碰撞和惯性属性,以及如何为关节添加关节动力学。
教程级别:中级
时间:10 分钟
目录
碰撞
物理性质
惯性
接触系数
关节动力学
其他标签
下一步
在本教程中,我们将学习如何为您的 URDF 模型添加一些基本的物理属性以及如何指定其碰撞属性。
碰撞
到目前为止,我们只用一个子元素 visual
指定了我们的链接,这个子元素定义了机器人看起来的样子(这并不奇怪)。然而,为了使碰撞检测工作或模拟机器人,我们还需要定义一个 collision
元素。以下是具有碰撞和物理属性的新 urdf。
以下是我们新基础链接的代码。
<link name="base_link">
<!-- 定义一个名为base_link的链接 -->
<visual>
<!-- 定义视觉元素 -->
<geometry>
<!-- 定义几何形状 -->
<cylinder length="0.6" radius="0.2"/>
<!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
</geometry>
<material name="blue">
<!-- 定义一个名为blue的材质 -->
<color rgba="0 0 .8 1"/>
<!-- 定义颜色为蓝色,RGBA值为(0, 0, 0.8, 1) -->
</material>
</visual>
<collision>
<!-- 定义碰撞元素 -->
<geometry>
<!-- 定义几何形状 -->
<cylinder length="0.6" radius="0.2"/>
<!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
</geometry>
</collision>
</link>
碰撞元素是链接对象的直接子元素,与视觉标签处于同一级别。
碰撞元素通过几何标签以与视觉元素相同的方式定义其形状。几何标签的格式与视觉元素的格式完全相同。
您还可以以与视觉元素相同的方式指定碰撞标签的子元素中的原点。
在许多情况下,您会希望碰撞几何和原点与视觉几何和原点完全相同。然而,有两种主要情况您不会这样做:
更快的处理。对两个网格进行碰撞检测比对两个简单几何体进行碰撞检测要复杂得多。因此,您可能希望在碰撞元素中用更简单的几何体替换网格。
安全区域。您可能希望限制靠近敏感设备的移动。例如,如果我们不希望任何东西碰撞到 R2D2 的头部,我们可以将碰撞几何体定义为包围他头部的圆柱体,以防止任何东西过于靠近他的头部。
物理性质
为了使您的模型正确模拟,您需要定义机器人的一些物理属性,即物理引擎(如 Gazebo)所需的属性。
惯性
每个被模拟的链接元素都需要一个惯性标签。这里有一个简单的例子。
<link name="base_link">
<!-- 定义一个名为base_link的链接 -->
<visual>
<!-- 定义视觉元素 -->
<geometry>
<!-- 定义几何形状 -->
<cylinder length="0.6" radius="0.2"/>
<!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
</geometry>
<material name="blue">
<!-- 定义一个名为blue的材质 -->
<color rgba="0 0 .8 1"/>
<!-- 定义颜色为蓝色,RGBA值为(0, 0, 0.8, 1) -->
</material>
</visual>
<collision>
<!-- 定义碰撞元素 -->
<geometry>
<!-- 定义几何形状 -->
<cylinder length="0.6" radius="0.2"/>
<!-- 定义一个圆柱体,长度为0.6,半径为0.2 -->
</geometry>
</collision>
<inertial>
<!-- 定义惯性元素 -->
<mass value="10"/>
<!-- 定义质量为10 -->
<inertia ixx="1e-3" ixy="0.0" ixz="0.0" iyy="1e-3" iyz="0.0" izz="1e-3"/>
<!-- 定义惯性张量,ixx=1e-3, ixy=0.0, ixz=0.0, iyy=1e-3, iyz=0.0, izz=1e-3 -->
</inertial>
</link>
此元素也是 link 对象的子元素。
质量以千克为单位定义。
3x3 旋转惯性矩阵由惯性元素指定。由于这是对称的,因此它可以仅由 6 个元素表示,如下所示。
这些信息可以通过诸如 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 千克的盒子!)。
您还可以指定一个原点标签,以指定重心和惯性参考系(相对于链接的参考系)。
在使用实时控制器时,惯性元素为零(或几乎为零)可能会导致机器人模型在没有警告的情况下崩溃,并且所有链接的原点将与世界原点重合。
接触系数
您还可以定义 link 在彼此接触时的行为。这是通过一个名为 contact_coefficients 的碰撞标签子元素完成的。需要指定三个属性:
mu - 摩擦系数 https://simple.wikipedia.org/wiki/Coefficient_of_friction
kp-刚度系数 https://en.wikipedia.org/wiki/Stiffness
kd-阻尼系数 https://en.wikipedia.org/wiki/Damping_ratio#Damping_ratio_definition
关节动力学
关节的运动方式由关节的动力学标签定义。这里有两个属性:
friction - 物理静摩擦力。对于棱柱关节,单位是牛顿。对于旋转关节,单位是牛顿米。
damping
- 物理阻尼值。对于棱柱关节,单位是牛顿秒每米。对于旋转关节,单位是牛顿米秒每弧度。
如果未指定,这些系数默认为零。
其他标签
在纯 URDF 领域(即不包括 Gazebo 特定标签),还有两个标签可以帮助定义关节:校准和安全控制器 calibration and safety controller.。查看规范 https://wiki.ros.org/urdf/XML/joint ,因为它们不包含在本教程中。
1. <Joint> 元素
关节元件描述了关节的运动学和动力学,并指定了关节的安全限制。
以下是一个关节元素的示例:
<joint name="my_joint" type="floating">
<!-- 定义一个名为my_joint的关节,类型为浮动 -->
<origin xyz="0 0 1" rpy="0 0 3.1416"/>
<!-- 定义关节的原点,位置为(0, 0, 1),绕x轴旋转0度,绕y轴旋转0度,绕z轴旋转3.1416弧度 -->
<parent link="link1"/>
<!-- 定义父链接为link1 -->
<child link="link2"/>
<!-- 定义子链接为link2 -->
<calibration rising="0.0"/>
<!-- 定义校准参数,rising值为0.0 -->
<dynamics damping="0.0" friction="0.0"/>
<!-- 定义动力学参数,阻尼值为0.0,摩擦值为0.0 -->
<limit effort="30" velocity="1.0" lower="-2.2" upper="0.7"/>
<!-- 定义限制参数,最大作用力为30,最大速度为1.0,下限为-2.2,上限为0.7 -->
<safety_controller k_velocity="10" k_position="15" soft_lower_limit="-2.0" soft_upper_limit="0.5"/>
<!-- 定义安全控制器参数,速度系数为10,位置系数为15,软下限为-2.0,软上限为0.5 -->
</joint>
2. 属性
关节元素有两个属性:
name(必需)
指定关节的唯一名称。
type(必需)
指定关节的类型,类型可以是以下之一:
revolute - 一个围绕轴旋转并且有上下限制的铰链关节。
continuous - 一个围绕轴无限旋转的连续铰链关节,没有上下限制。
prismatic - 一个沿轴滑动并且有上下限制的滑动关节。
fixed - 这实际上不是一个关节,因为它不能移动。所有自由度都被锁定。这种类型的关节不需要<axis>、<calibration>、<dynamics>、<limits>或<safety_controller>。
floating - 这种关节允许所有六个自由度的运动。
planar - 这种关节允许在垂直于轴的平面内运动。
The joint element has two attributes:
name (required)
type (required)
revolute — a hinge joint that rotates along the axis and has a limited range specified by the upper and lower limits.
continuous — a continuous hinge joint that rotates around the axis and has no upper and lower limits.
prismatic — a sliding joint that slides along the axis, and has a limited range specified by the upper and lower limits.
fixed — this is not really a joint because it cannot move. All degrees of freedom are locked. This type of joint does not require the <axis>, <calibration>, <dynamics>, <limits> or <safety_controller>.
floating — this joint allows motion for all 6 degrees of freedom.
planar — this joint allows motion in a plane perpendicular to the axis.
Specifies the type of joint, where type can be one of the following:
Specifies a unique name of the joint
3.元素
关节元素具有以下元素:
<origin>(可选:如果未指定,则默认为身份矩阵)
这是从父链接到子链接的变换。关节位于子链接的原点,如上图所示。
xyz(可选:默认为零向量)
表示x、y、z偏移。所有位置都以米为单位指定。
rpy(可选:默认为零向量)
表示围绕固定轴的旋转:首先围绕x轴滚动,然后围绕y轴俯仰,最后围绕z轴偏航。所有角度都以弧度为单位指定。
<parent>(必需)
父链接名称,具有强制属性:
link
在机器人树结构中作为此链接父链接的链接名称。
<child>(必需)
子链接名称,具有强制属性:
link
子链接的名称。
<axis>(可选:默认为(1,0,0))
在关节框架中指定的关节轴。这是旋转关节的旋转轴,棱柱关节的平移轴,以及平面关节的表面法线。轴在关节参考框架中指定。固定和浮动关节不使用轴字段。
xyz(必需)
表示向量的(x, y, z)分量。向量应归一化。
<calibration>(可选)
关节的参考位置,用于校准关节的绝对位置。
rising(可选)
当关节向正方向移动时,此参考位置将触发上升沿。
falling(可选)
当关节向正方向移动时,此参考位置将触发下降沿。
<dynamics>(可选)
指定关节物理特性的元素。这些值用于指定关节的建模特性,特别适用于仿真。
damping(可选,默认为0)
关节的物理阻尼值(对于棱柱关节,以牛顿秒每米[N∙s/m]为单位,对于旋转关节,以牛顿米秒每弧度[N∙m∙s/rad]为单位)。
friction(可选,默认为0)
关节的物理静摩擦值(对于棱柱关节,以牛顿[N]为单位,对于旋转关节,以牛顿米[N∙m]为单位)。
<limit>(仅对旋转和棱柱关节必需)
元素可以包含以下属性:
lower(可选,默认为0)
指定关节下限的属性(对于旋转关节,以弧度为单位,对于棱柱关节,以米为单位)。如果关节是连续的,则省略。
upper(可选,默认为0)
指定关节上限的属性(对于旋转关节,以弧度为单位,对于棱柱关节,以米为单位)。如果关节是连续的,则省略。
effort(必需)
用于强制执行最大关节作用力的属性(|applied effort| < |effort|)。参见安全限制。
velocity(必需)
用于强制执行最大关节速度的属性(对于旋转关节,以每秒弧度[rad/s]为单位,对于棱柱关节,以每秒米[m/s]为单位)。参见安全限制。
<mimic>(可选)(ROS Groovy新增功能。参见问题)
此标签用于指定定义的关节模仿另一个现有关节。此关节的值可以计算为value = multiplier * other_joint_value + offset。
预期和可选属性:
joint(必需)
指定要模仿的关节的名称。
multiplier(可选)
指定上述公式中的乘数因子。
offset(可选)
指定上述公式中的偏移量。默认为0(对于旋转关节,以弧度为单位,对于棱柱关节,以米为单位)。
<safety_controller>(可选)
元素可以包含以下属性:
soft_lower_limit(可选,默认为0)
指定安全控制器开始限制关节位置的下关节边界的属性。此限制需要大于关节下限(见上文)。有关更多详细信息,请参见安全限制。
soft_upper_limit(可选,默认为0)
指定安全控制器开始限制关节位置的上关节边界的属性。此限制需要小于关节上限(见上文)。有关更多详细信息,请参见安全限制。
k_position(可选,默认为0)
指定位置和速度限制之间关系的属性。有关更多详细信息,请参见安全限制。
k_velocity(必需)
指定作用力和速度限制之间关系的属性。有关更多详细信息,请参见安全限制。
下一步
通过使用 xacro 减少你需要编写的代码量和烦人的数学计算。