Skip to content

构建可动的 URDF 模型

目标: 学习如何在 URDF 中定义可动关节。

教程级别: 中级

预计用时: 10 分钟

本教程将在上一个教程制作的 R2D2 模型基础上添加可动关节。之前的模型中所有关节都是固定的,这次我们将引入另外三种重要的关节类型:连续关节(continuous)、旋转关节(revolute)和棱柱关节(prismatic)。

开始之前,请确保已安装所有依赖,具体要求请参阅上一个教程。

同样,本教程中提到的所有机器人模型都可以在 urdf_tutorial 包中找到。

这里是包含柔性关节的新版 URDF。你可以将它与之前的版本对比查看完整变化,下面我们只关注三个示例关节。

可视化和控制模型的命令与上一个教程相同:

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

这次启动后还会弹出一个 GUI 窗口,让你控制所有非固定关节的值。动手拖动试试,看看模型如何运动,然后我们再来看具体实现。

Screenshot of Flexible Model

<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)。它沿一个轴平移,而不是围绕轴旋转,从而让机器人模型能够伸缩夹爪臂。

棱柱臂的限制指定方式与旋转关节相同,但单位是米而不是弧度。

还有两种可以在空间中移动的关节。棱柱关节只能沿一维移动,而平面关节(planar joint)可以在一个平面上做二维移动。浮动关节(floating joint)则完全不受约束,可以在三维空间中任意移动。这两种关节无法仅用一个数字来描述,因此不在本教程的讨论范围内。

当你在 GUI 中拖动滑块时,模型在 RViz 中也会同步移动。原理是这样的:首先 GUI 会解析 URDF,找到所有非固定关节及其限位,然后用滑块的值发布 sensor_msgs/msg/JointState 消息。robot_state_publisher 接收这些消息后,计算出各个部件之间的变换,生成的变换树最终用于在 RViz 中渲染所有几何形状。

现在你已经拥有一个看起来功能完备的模型了,接下来可以添加物理属性,或者学习使用 xacro 简化代码。