跳到主要内容

创建真实机器人

在URDF中定义可移动关节

前一节将所有关节都定义为了 fixed(固定)类型。但在现实世界中,机器人的车轮需要滚动,头部需要转动,机械臂需要伸缩。

在本节中,我们将修改模型,探索三种最重要的活动关节:

(1). Continuous(连续关节):如车轮。

(2). Revolute(旋转关节):如手臂肘关节(有角度限制)。

(3). Prismatic(滑动关节):如直线伸缩杆。

本节的完整代码已包含在教程包中,运行以下命令启动示例:

ros2 launch urdf_tutorial display.launch.py model:=urdf/06-flexible.urdf

启动后,会看到一个带有滑块控制面板(GUI)的窗口。试着拖动滑块,观察 RViz 中机器人的运动变化。

robot

图 3: 显示真实的机器人

1. 连续关节 (Continuous Joint)

这种关节可以绕着轴进行无限旋转(从负无穷到正无穷),最典型的应用就是机器人的头部车轮

<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>
  • type="continuous":定义关节类型为连续旋转。

  • <axis xyz="0 0 1"/>:这是关键的标签。它定义了旋转轴的方向向量。

    • 0 0 1 表示围绕 Z 轴 旋转(头部左右转动)。

    • 如果是车轮,通常会围绕 Y 轴 旋转,即设置为 0 1 0

2. 旋转关节 (Revolute Joint)

这种关节类似于连续关节,但它有严格的角度限制(即不能转满一圈),通常用它来模拟机器人的左右夹爪

<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>
  • type="revolute":定义为有限位的旋转关节。

  • <limit>:这是旋转关节必须包含的标签。

    • lower="0.0" / upper="0.548":关节的下限和上限(单位:弧度)。

    • velocity:关节最大旋转速度(弧度/秒)。

    • effort:关节最大力矩(牛顿·米)。在纯可视化示例中,这两个值不影响显示,但在物理仿真中至关重要。

3. 滑动关节 (Prismatic 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>
  • type="prismatic":定义为直线滑动关节。

  • 运动方向:同样由 <axis> 标签决定。如果没有指定,有些解析器默认沿 X 轴移动,但建议显式指定。

  • <limit> 的变化: 对于棱柱关节,lowerupper 的单位是米 (m),而不是弧度。limit 限制了伸缩臂能伸多长、缩多短。

补充知识:其他关节类型

  • Planar(平面关节):允许在平面内移动。
  • Floating(浮动关节):允许在 3D 空间中自由移动和旋转。

为链接添加碰撞和惯性属性

到目前为止,我们在 <visual> 标签中定义的一切都只是为了“好看”。但在 Gazebo 等物理仿真器中,机器人需要遵循牛顿力学定律——它必须有质量,会发生碰撞,且运动会受到惯性的影响。

1. 碰撞体(Collision)

<visual> 标签定义了机器人的外观(皮肤),而 <collision> 标签定义了机器人的物理边界(骨骼/肌肉)。

<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> 的直接子标签,它的语法结构(<geometry>, <origin>)与 <visual> 完全一致。虽然可以直接复制 <visual> 的几何形状到 <collision> 中,但在以下两种情况下,我们通常会修改碰撞体:

(1) . 简化计算: 当机器人的外观是一个拥有数万个面的复杂网格时(Mesh文件,如精细的人手模型)。通常在 <collision> 中使用简单的长方体 (Box)圆柱体 (Cylinder) 来代替。物理引擎检测两个简单几何体的碰撞只需要几微秒,而检测复杂网格的碰撞则极其消耗计算资源。仿真中“看不见”碰撞体,所以简单粗暴即可。

(2). 安全缓冲(安全区域): 当我们希望保护机器人头部的昂贵摄像头时,可以将头部的碰撞体做得比实际外观大一圈。这样在障碍物还没碰到摄像头本身时,物理引擎就会判定发生碰撞并阻止运动,从而起到保护作用。

2. 惯性属性(Inertial)

每个被仿真的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>
<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>

参数详解:

  • <mass>:物体的质量,单位为千克 (kg)。

  • <inertia>:描述物体绕轴旋转的难易程度。这是一个 3x3 的对称矩阵,我们只需要填写 6 个数值:

    [ ixx  ixy  ixz ]
    [ ixy iyy iyz ]
    [ ixz iyz izz ]

如何获取这些数值?

(1). 理想方法:使用 CAD 软件(如 SolidWorks, Fusion 360)或 MeshLab,导入模型后软件会自动计算出质量和惯性矩阵。

(2). 估算方法:对于规则几何体(球、圆柱、方块),可以查阅维基百科的“转动惯量列表”公式进行计算。

(3). “万能”填法: 如果实在不知道填什么,且不想让物理引擎报错,可以使用一个极小的值:ixx=iyy=izz=1e-3 (即 0.001),其余为 0。这相当于一个质量轻、体积小的方块。

警告:千万不要填 0!如果将 <mass><inertia> 设为 0(或非常接近 0),物理引擎在计算除法时会产生“除以零”的错误,导致模型在仿真中瞬间崩溃、乱飞或消失。即使是固定不动的物体,也建议给一个非零的惯性值。

3. 高级物理属性 (Advanced Dynamics)

除了基础的碰撞和惯性,URDF 还支持更精细的物理参数调节。

(1). 接触系数 (Contact Coefficients)

当两个物体碰撞或摩擦时,可以通过 <collision> 下的 <surface> 属性来定义:

  • mu (Friction):摩擦系数。决定物体在表面滑动的难易程度。

  • kp (Stiffness):刚度系数。决定物体是像石头一样硬(高 kp),还是像橡胶一样软(低 kp)。

  • kd (Damping):阻尼系数。决定碰撞后振动消失的快慢。

(2). 关节动力学 (Joint Dynamics)

<joint> 标签下,我们可以定义关节的物理特性:

<joint name="..." type="...">
<dynamics damping="0.1" friction="0.05"/>
</joint>
  • friction (物理静摩擦):关节转动时内部的摩擦力。旋转关节单位为 NmN \cdot m,棱柱关节为 NN

  • damping (物理阻尼):与运动速度成正比的阻力(类似在水中移动的感觉)。阻尼可以防止关节像钟摆一样永远摆动下去,使运动更真实平稳。旋转关节单位为 Nms/radN \cdot m \cdot s/rad,棱柱关节为 Ns/mN \cdot s/m

若不指定这些值,默认为 0,这意味着关节是“完美光滑”的,在现实中这是不存在的。