第3章 · joint标签详解

固定关节、旋转关节、棱柱关节、浮动关节,还有限位与动力学——这一章我们把 joint 的底裤都扒干净。

joint 标签知识体系 joint 类型 fixed 固定 revolute/continuous prismatic 棱柱 floating 浮动 限位 & 动力学 无自由度,刚性连接 绕单轴旋转 (连续/限位) 直线滑动 6自由度 (很少用) limit / dynamics / safety

3.1 固定关节 (fixed)

固定关节,说白了就是把两个 link 焊死。没有自由度,不能动。我刚开始学 URDF 时觉得这玩意儿有啥用?后来做传感器支架才明白——固定关节是搭建结构骨架的基石。

典型场景: 激光雷达固定在底盘上,摄像头固定在支架上。你想想看,如果这些都用旋转关节,模型一加载就乱晃。

<joint name="lidar_joint" type="fixed">
    <parent link="base_link"/>
    <child link="lidar_link"/>
    <origin xyz="0.2 0 0.15" rpy="0 0 0"/>
</joint>

注意,固定关节不需要 <limit> 和 <dynamics>,写了也会被忽略。嗯,这里有个坑:如果你把固定关节的 type 拼写成 "fix" 或者 "fixedd",ROS 会直接报错,而且错误信息不太友好。我曾经排查了半小时才发现少打了个 d。

3.2 旋转关节 (revolute / continuous)

旋转关节是机器人里最常见的关节。轮子、关节臂、舵机……都是它。revolute 和 continuous 的区别就一句话:revolute 有角度限位,continuous 可以一直转圈。

  • revolute:像人的肘关节,只能在一定范围内摆动。必须设置 <limit> 的 lower 和 upper。
  • continuous:像车轮,没有起点终点。不需要 lower/upper,但通常要设 effort 和 velocity。

💡 我的习惯: 只要不是轮子,一律用 revolute。因为 continuous 关节在 rviz 里调试时,角度值会一直累加,看着头晕。而且一旦忘记设限位,仿真时关节可能飞掉。

<!-- 带限位的旋转关节 -->
<joint name="arm_joint" type="revolute">
    <parent link="base_link"/>
    <child link="arm_link"/>
    <origin xyz="0 0 0.1" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-1.57" upper="1.57" effort="30" velocity="1.0"/>
    <dynamics damping="0.7" friction="0.1"/>
</joint>

<axis> 定义旋转轴。默认是 (1,0,0) 即绕 X 轴。我见过有人把轴设成 (0,0,0),结果关节完全不动——因为零向量没有方向。

3.3 棱柱关节 (prismatic)

棱柱关节就是滑动关节,直线运动。比如升降台、电动推杆、滑轨。它只有一个平移自由度。

限位用 lower 和 upper 表示位置(米)。axis 指定滑动方向。举个例子:

<joint name="slide_joint" type="prismatic">
    <parent link="base_link"/>
    <child link="slider_link"/>
    <origin xyz="0 0 0.5" rpy="0 0 0"/>
    <axis xyz="1 0 0"/>
    <limit lower="0.0" upper="0.3" effort="50" velocity="0.5"/>
</joint>

⚠️ 我曾经踩过的坑: 棱柱关节的 axis 一定要归一化!如果你写成 (0.5, 0, 0),关节运动会变得很奇怪,因为内部会做归一化,但你的限位值却是按原始向量算的。结果就是实际滑动距离和预期不符。

3.4 浮动关节 (floating)

浮动关节有 6 个自由度(3 平移 + 3 旋转)。说实话,我在实际项目里几乎没用过。它通常用于一些特殊场景,比如无人机在空中全自由运动,或者两个不固定连接的物体。

浮动关节不需要 <axis>,也不需要 <limit>。你想想看,6 个自由度怎么限位?没法简单定义。所以它基本就是个“自由身”。

个人看法: 除非你搞高级仿真或者多体动力学,否则别碰 floating。用 fixed + 虚拟关节反而更可控。我在做多机器人协同项目时试过 floating,结果调试 TF 调到怀疑人生。

3.5 关节限位与动力学属性

限位和动力学是 joint 标签里最容易被忽略、但影响最大的部分。咱们一个一个说。

属性子标签说明适用关节
limitlower, upper, effort, velocity位置/力/速度限制revolute, prismatic
dynamicsdamping, friction阻尼与库仑摩擦所有运动关节
safety_controllersoft_lower_limit, soft_upper_limit, k_position, k_velocity软限位(安全控制器)revolute, prismatic

限位 (limit) 是硬约束。比如 lower="-1.57" upper="1.57",关节就不能转到 90° 以外。effort 是最大力矩,velocity 是最大速度。这两个值设太小,机器人动不了;设太大,可能损坏硬件。

动力学 (dynamics) 影响仿真中的运动表现。damping 是阻尼系数,friction 是静摩擦力。我一般先设一个小的阻尼 (0.1~0.5),让关节运动看起来“有质感”,而不是像在真空中飘。

🔧 避坑指南: 如果你在 Gazebo 里仿真,dynamics 的 friction 不要设成 0。否则关节会像抹了油一样停不下来。我曾经设 friction=0,结果机械臂一甩就转圈圈,差点把仿真模型甩飞。

安全控制器 (safety_controller) 是软限位,用于在接近硬限位时提前减速。一般配合 k_position 和 k_velocity 使用。说实话,这个标签我平时用得不多,但在协作机器人项目里它很重要——防止关节撞到硬限位时“哐”一声。

3.6 小结一下

joint 标签是 URDF 的关节灵魂。固定关节搭骨架,旋转关节给自由度,棱柱关节做直线运动,浮动关节……嗯,先放一放。限位和动力学是让模型“像真机”的关键。你写 joint 时多花一分钟设好 limit 和 dynamics,后面调试能省一小时。