目标: 学习如何在 URDF 中定义可移动关节。
教程级别: 中级
时间: 10 分钟
在本教程中,我们将修改在上一个教程中制作的 R2D2 模型,使其具有可移动关节。在之前的模型中,所有关节都是固定的。现在我们将探索其他三种重要的关节类型:continuous(连续旋转)、revolute(旋转)和 prismatic(棱柱/平移)。
在继续之前,请确保您已安装所有先决条件。有关所需内容的信息,请参见上一个教程。
同样,本教程中提到的所有机器人模型都可以在 urdf_tutorial 包中找到。
这是带有可移动关节的新 urdf。您可以将其与之前的版本进行比较以查看所有更改,但我们只关注三个示例关节。
要可视化和控制此模型,请运行与上一个教程相同的命令:
ros2 launch urdf_tutorial display.launch.py model:=urdf/06-flexible.urdf但现在这还会弹出一个 GUI,允许您控制所有非固定关节的值。操作一下模型,看看它是如何移动的。然后,我们可以看看是如何实现这一点的。

头部
<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>身体和头部之间的连接是一个 continuous 关节,这意味着它可以取从负无穷到正无穷的任何角度。轮子也以这种方式建模,因此它们可以无限地向两个方向滚动。
我们唯一需要添加的额外信息是旋转轴,这里由一个 xyz 三元组指定,它指定了头部将围绕其旋转的向量。由于我们希望它绕 z 轴旋转,我们指定向量 "0 0 1"。
夹爪
<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>左右夹爪关节都被建模为 revolute 关节。这意味着它们以与 continuous 关节相同的方式旋转,但它们有严格的限制。因此,我们必须包含 limit 标签,指定关节的上限和下限(以弧度为单位)。我们还必须为此关节指定最大速度和力,但实际值对于我们的目的来说并不重要。
夹爪臂
<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>夹爪臂是一种不同类型的关节,即 prismatic 关节。这意味着它沿轴移动,而不是绕轴旋转。这种平移运动使我们的机器人模型能够伸出和收回其夹爪臂。
prismatic 关节的限制与 revolute 关节的指定方式相同,只是单位是米而不是弧度。
其他类型的关节
还有两种其他类型的关节可以在空间中移动。prismatic 关节只能沿一个维度移动,而 planar 关节可以在一个平面内移动,即两个维度。此外,floating 关节不受约束,可以在三个维度中的任何一个移动。这些关节不能仅由一个数字指定,因此不包含在本教程中。
指定位姿
当您在 GUI 中移动滑块时,模型会在 Rviz 中移动。这是如何实现的?首先,GUI 解析 URDF 并找到所有非固定关节及其限制。然后,它使用滑块的值发布 sensor_msgs/msg/JointState 消息。然后 robot_state_publisher 使用这些消息来计算不同部件之间的所有变换。由此产生的变换树随后用于在 Rviz 中显示所有形状。
后续步骤
既然您有了一个视觉上功能正常的模型,您可以添加一些物理属性,或者开始使用 xacro 来简化您的代码。
夜雨聆风