在本教程中,我们将了解如何向 URDF 模型添加一些基本物理属性以及如何指定其碰撞属性。
碰撞
到目前为止,我们仅使用单个子元素 指定了链接,visual它定义了(毫不奇怪)机器人的外观。然而,为了使碰撞检测起作用或模拟机器人,我们collision还需要定义一个元素。 下面是具有碰撞和物理属性的新 urdf 。
<?xml version="1.0"?>
<robot name="physics"><material name="blue"><color rgba="0 0 0.8 1"/></material><material name="black"><color rgba="0 0 0 1"/></material><material name="white"><color rgba="1 1 1 1"/></material><link name="base_link"><visual><geometry><cylinder length="0.6" radius="0.2"/></geometry><material name="blue"/></visual><collision><geometry><cylinder length="0.6" radius="0.2"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><link name="right_leg"><visual><geometry><box size="0.6 0.1 0.2"/></geometry><origin rpy="0 1.57075 0" xyz="0 0 -0.3"/><material name="white"/></visual><collision><geometry><box size="0.6 0.1 0.2"/></geometry><origin rpy="0 1.57075 0" xyz="0 0 -0.3"/></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="base_to_right_leg" type="fixed"><parent link="base_link"/><child link="right_leg"/><origin xyz="0 -0.22 0.25"/></joint><link name="right_base"><visual><geometry><box size="0.4 0.1 0.1"/></geometry><material name="white"/></visual><collision><geometry><box size="0.4 0.1 0.1"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="right_base_joint" type="fixed"><parent link="right_leg"/><child link="right_base"/><origin xyz="0 0 -0.6"/></joint><link name="right_front_wheel"><visual><origin rpy="1.57075 0 0" xyz="0 0 0"/><geometry><cylinder length="0.1" radius="0.035"/></geometry><material name="black"/></visual><collision><origin rpy="1.57075 0 0" xyz="0 0 0"/><geometry><cylinder length="0.1" radius="0.035"/></geometry></collision><inertial><mass value="1"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="right_front_wheel_joint" type="continuous"><axis rpy="0 0 0" xyz="0 1 0"/><parent link="right_base"/><child link="right_front_wheel"/><origin rpy="0 0 0" xyz="0.133333333333 0 -0.085"/></joint><link name="right_back_wheel"><visual><origin rpy="1.57075 0 0" xyz="0 0 0"/><geometry><cylinder length="0.1" radius="0.035"/></geometry><material name="black"/></visual><collision><origin rpy="1.57075 0 0" xyz="0 0 0"/><geometry><cylinder length="0.1" radius="0.035"/></geometry></collision><inertial><mass value="1"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="right_back_wheel_joint" type="continuous"><axis rpy="0 0 0" xyz="0 1 0"/><parent link="right_base"/><child link="right_back_wheel"/><origin rpy="0 0 0" xyz="-0.133333333333 0 -0.085"/></joint><link name="left_leg"><visual><geometry><box size="0.6 0.1 0.2"/></geometry><origin rpy="0 1.57075 0" xyz="0 0 -0.3"/><material name="white"/></visual><collision><geometry><box size="0.6 0.1 0.2"/></geometry><origin rpy="0 1.57075 0" xyz="0 0 -0.3"/></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="base_to_left_leg" type="fixed"><parent link="base_link"/><child link="left_leg"/><origin xyz="0 0.22 0.25"/></joint><link name="left_base"><visual><geometry><box size="0.4 0.1 0.1"/></geometry><material name="white"/></visual><collision><geometry><box size="0.4 0.1 0.1"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="left_base_joint" type="fixed"><parent link="left_leg"/><child link="left_base"/><origin xyz="0 0 -0.6"/></joint><link name="left_front_wheel"><visual><origin rpy="1.57075 0 0" xyz="0 0 0"/><geometry><cylinder length="0.1" radius="0.035"/></geometry><material name="black"/></visual><collision><origin rpy="1.57075 0 0" xyz="0 0 0"/><geometry><cylinder length="0.1" radius="0.035"/></geometry></collision><inertial><mass value="1"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="left_front_wheel_joint" type="continuous"><axis rpy="0 0 0" xyz="0 1 0"/><parent link="left_base"/><child link="left_front_wheel"/><origin rpy="0 0 0" xyz="0.133333333333 0 -0.085"/></joint><link name="left_back_wheel"><visual><origin rpy="1.57075 0 0" xyz="0 0 0"/><geometry><cylinder length="0.1" radius="0.035"/></geometry><material name="black"/></visual><collision><origin rpy="1.57075 0 0" xyz="0 0 0"/><geometry><cylinder length="0.1" radius="0.035"/></geometry></collision><inertial><mass value="1"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="left_back_wheel_joint" type="continuous"><axis rpy="0 0 0" xyz="0 1 0"/><parent link="left_base"/><child link="left_back_wheel"/><origin rpy="0 0 0" xyz="-0.133333333333 0 -0.085"/></joint><joint name="gripper_extension" type="prismatic"><parent link="base_link"/><child link="gripper_pole"/><limit effort="1000.0" lower="-0.38" upper="0" velocity="0.5"/><origin rpy="0 0 0" xyz="0.19 0 0.2"/></joint><link name="gripper_pole"><visual><geometry><cylinder length="0.2" radius="0.01"/></geometry><origin rpy="0 1.57075 0 " xyz="0.1 0 0"/></visual><collision><geometry><cylinder length="0.2" radius="0.01"/></geometry><origin rpy="0 1.57075 0 " xyz="0.1 0 0"/></collision><inertial><mass value="0.05"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="left_gripper_joint" type="revolute"><axis xyz="0 0 1"/><limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/><origin rpy="0 0 0" xyz="0.2 0.01 0"/><parent link="gripper_pole"/><child link="left_gripper"/></joint><link name="left_gripper"><visual><origin rpy="0.0 0 0" xyz="0 0 0"/><geometry><mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/></geometry></visual><collision><geometry><mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/></geometry><origin rpy="0.0 0 0" xyz="0 0 0"/></collision><inertial><mass value="0.05"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="left_tip_joint" type="fixed"><parent link="left_gripper"/><child link="left_tip"/></joint><link name="left_tip"><visual><origin rpy="0.0 0 0" xyz="0.09137 0.00495 0"/><geometry><mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/></geometry></visual><collision><geometry><mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/></geometry><origin rpy="0.0 0 0" xyz="0.09137 0.00495 0"/></collision><inertial><mass value="0.05"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="right_gripper_joint" type="revolute"><axis xyz="0 0 -1"/><limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/><origin rpy="0 0 0" xyz="0.2 -0.01 0"/><parent link="gripper_pole"/><child link="right_gripper"/></joint><link name="right_gripper"><visual><origin rpy="-3.1415 0 0" xyz="0 0 0"/><geometry><mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/></geometry></visual><collision><geometry><mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/></geometry><origin rpy="-3.1415 0 0" xyz="0 0 0"/></collision><inertial><mass value="0.05"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="right_tip_joint" type="fixed"><parent link="right_gripper"/><child link="right_tip"/></joint><link name="right_tip"><visual><origin rpy="-3.1415 0 0" xyz="0.09137 0.00495 0"/><geometry><mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/></geometry></visual><collision><geometry><mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/></geometry><origin rpy="-3.1415 0 0" xyz="0.09137 0.00495 0"/></collision><inertial><mass value="0.05"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><link name="head"><visual><geometry><sphere radius="0.2"/></geometry><material name="white"/></visual><collision><geometry><sphere radius="0.2"/></geometry></collision><inertial><mass value="2"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="head_swivel" type="continuous"><parent link="base_link"/><child link="head"/><axis xyz="0 0 1"/><origin xyz="0 0 0.3"/></joint><link name="box"><visual><geometry><box size="0.08 0.08 0.08"/></geometry><material name="blue"/><origin xyz="-0.04 0 0"/></visual><collision><geometry><box size="0.08 0.08 0.08"/></geometry></collision><inertial><mass value="1"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="tobox" type="fixed"><parent link="head"/><child link="box"/><origin xyz="0.1814 0 0.1414"/></joint></robot>
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 碰撞元素是链接对象的直接子元素,与视觉标签处于同一级别。
-
碰撞元素定义其形状的方式与视觉元素相同,使用几何标签。此处几何标记的格式与视觉效果完全相同。
在许多情况下,您会希望碰撞几何体和原点与视觉几何体和原点完全相同。但是,有两种主要情况您不会这样做:
-
处理速度更快。对两个网格进行碰撞检测比对两个简单几何体进行碰撞检测要复杂得多。因此,您可能希望在碰撞元素中用更简单的几何图形替换网格。
-
安全区。您可能需要限制靠近敏感设备的活动。例如,如果我们不希望任何东西与 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>
惯性(Inertial)
这部分描述了该部件的质量和惯性矩阵,这些属性对于动力学模拟至关重要。
质量:质量为10千克。
惯性矩阵:
ixx, iyy, izz:主对角线元素分别为0.001 kg·m²,这些值描述了沿对应轴的惯性。
ixy, ixz, iyz:非对角线元素均为0,表示惯性的对称性,这些值在对角线惯性矩阵中常为0,表明没有交叉产品的惯性。
接触系数
您还可以定义链接相互接触时的行为方式。这是通过碰撞标签的一个名为 contact_coefficients
的子元素来完成的。需要指定三个属性:
mu——摩擦系数
kp——刚度系数
kd——阻尼系数
联合动力学
关节的移动方式由关节的动力学标签定义。这里有两个属性:
-
friction- 物理静摩擦力:对于棱柱形关节,单位是牛顿。对于旋转接头,单位为牛顿米。
-
damping- 物理阻尼值:对于棱柱形接头,单位是牛顿秒每米。对于旋转接头,每弧度牛顿米秒。