构建可动的 URDF 模型
目标: 学习如何在 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 joint),它可以取从负无穷到正无穷的任意角度。轮子也是这样建模的,能够在两个方向上无限滚动。
此外只需指定旋转轴,这里用一个 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 joint)。它们和连续关节一样可以旋转,但有严格的角度限制。因此必须用 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 joint)。它沿一个轴平移,而不是围绕轴旋转,从而让机器人模型能够伸缩夹爪臂。
棱柱臂的限制指定方式与旋转关节相同,但单位是米而不是弧度。
其他类型的关节
Section titled “其他类型的关节”还有两种可以在空间中移动的关节。棱柱关节只能沿一维移动,而平面关节(planar joint)可以在一个平面上做二维移动。浮动关节(floating joint)则完全不受约束,可以在三维空间中任意移动。这两种关节无法仅用一个数字来描述,因此不在本教程的讨论范围内。
当你在 GUI 中拖动滑块时,模型在 RViz 中也会同步移动。原理是这样的:首先 GUI 会解析 URDF,找到所有非固定关节及其限位,然后用滑块的值发布 sensor_msgs/msg/JointState 消息。robot_state_publisher 接收这些消息后,计算出各个部件之间的变换,生成的变换树最终用于在 RViz 中渲染所有几何形状。
现在你已经拥有一个看起来功能完备的模型了,接下来可以添加物理属性,或者学习使用 xacro 简化代码。