4. 轨迹规划:关节空间与操作空间

轨迹规划这章,说白了就是让机器人「怎么动」的问题。你给机器人一个起点和终点,它得自己算出一条路来——不能撞到自己,不能抖得像帕金森,还得在合理时间内走完。

我个人习惯把轨迹规划分成两大类:关节空间和操作空间。这两者的区别,我刚开始做项目时也迷糊过一阵子,后来踩了几个坑才真正搞明白。

4.1 关节空间轨迹规划

关节空间规划,就是直接在机器人的每个关节角度上做文章。你不管末端执行器在空间里画了什么曲线,只关心每个关节从角度 A 转到角度 B 时,速度、加速度怎么变化。

这样做的好处很明显——计算量小,而且不会遇到奇异性问题。但代价是末端轨迹在笛卡尔空间里是不可预测的,可能走一条很诡异的弧线。

4.1.1 多项式轨迹

最简单的思路:给每个关节的起点角度和终点角度之间,拟合一条光滑曲线。

三次多项式是最常用的入门方案。它需要四个约束条件:起点位置、终点位置、起点速度、终点速度(通常设为零)。

// 三次多项式系数求解
θ(t) = a₀ + a₁·t + a₂·t² + a₃·t³

// 约束条件
θ(0) = θ₀          // 起点角度
θ(tf) = θf         // 终点角度
θ'(0) = 0          // 起点速度
θ'(tf) = 0         // 终点速度

// 解出系数
a₀ = θ₀
a₁ = 0
a₂ = 3·(θf - θ₀) / tf²
a₃ = -2·(θf - θ₀) / tf³

嗯,这里要注意:三次多项式只能保证位置和速度连续,加速度在起点和终点会有跳变。如果你做的是高速抓取,这种跳变会引起末端抖动。

我曾经踩过的坑: 有一次做码垛机器人,用了三次多项式规划,结果末端在抓取点附近一直抖。查了两天才发现是加速度不连续导致的。后来换成五次多项式,问题立刻解决。

五次多项式多了两个约束——起点加速度和终点加速度都设为零。这样位置、速度、加速度全部连续,运动更平滑。

// 五次多项式
θ(t) = a₀ + a₁·t + a₂·t² + a₃·t³ + a₄·t⁴ + a₅·t⁵

// 六个约束条件
θ(0) = θ₀,  θ(tf) = θf
θ'(0) = 0,  θ'(tf) = 0
θ''(0) = 0, θ''(tf) = 0
多项式类型 连续阶数 适用场景 缺点
三次多项式 速度连续 低速、精度要求不高的搬运 加速度跳变
五次多项式 加速度连续 高速抓取、精密装配 计算量稍大
七次多项式 加加速度连续 超精密操作、医疗机器人 参数多,调参麻烦

4.1.2 梯形速度轨迹

多项式轨迹虽然平滑,但有个问题——你不知道最大速度是多少。实际项目中,电机有速度上限、加速度上限,你不能让规划结果超出硬件能力。

梯形速度轨迹就是来解决这个问题的。它把运动分成三段:加速段、匀速段、减速段。你直接设定最大速度 v_max 和最大加速度 a_max,规划器保证不越界。

核心思路: 梯形速度曲线在时间-速度图上看起来像个梯形(或者三角形,如果距离太短来不及加速到最大速度)。

// 梯形速度轨迹三段式
// 加速段:0 ≤ t ≤ ta
θ(t) = θ₀ + 0.5·a_max·t²
θ'(t) = a_max·t

// 匀速段:ta ≤ t ≤ tf - ta  
θ(t) = θ₀ + 0.5·a_max·ta² + v_max·(t - ta)
θ'(t) = v_max

// 减速段:tf - ta ≤ t ≤ tf
θ(t) = θf - 0.5·a_max·(tf - t)²
θ'(t) = a_max·(tf - t)

你想想看,梯形速度最大的优点就是直观。我在调试现场时,经常直接看速度曲线是不是梯形——如果不是,说明参数设得有问题。

我个人的经验: 梯形速度的加速段和减速段对称时最省力。但如果负载不对称(比如抓取重物后放下空爪),我会把减速段的加速度设得比加速段小一些,防止末端过冲。

4.2 操作空间轨迹规划

关节空间规划虽然简单,但有个硬伤——末端走的路径不可控。如果你需要机器人末端走一条直线、画一个圆弧,或者沿着工件表面运动,就必须在操作空间(笛卡尔空间)里做规划。

操作空间规划的核心流程是:

  1. 在笛卡尔空间里生成路径点(位置 + 姿态)
  2. 对每个路径点做逆运动学求解,得到关节角度
  3. 在关节空间做插值,保证运动平滑

说白了,操作空间规划是「先定路径,再算关节」。关节空间规划是「先定关节,不管路径」。

4.2.1 直线轨迹规划

直线轨迹是最常见的需求。给定起点 P₀ 和终点 Pf,在两者之间线性插值:

// 位置线性插值
P(s) = P₀ + s·(Pf - P₀),  s ∈ [0, 1]

// 姿态用球面线性插值(SLERP)
// 避免欧拉角的万向锁问题
R(s) = slerp(R₀, Rf, s)

这里 s 是归一化参数,你可以用前面讲的多项式或梯形速度来控制 s 随时间的变化。这样末端走的是直线,但速度曲线可以自己定。

注意: 直线轨迹在靠近奇异位形时,逆运动学求解会出问题。我遇到过最离谱的一次——末端走直线走到一半,关节突然要转 180 度,电机直接报警。后来我在规划前加了可操作性度量检查,提前避开奇异区域。

4.2.2 圆弧轨迹规划

圆弧轨迹在焊接、打磨、涂胶等场景中很常见。三点确定一个圆弧:起点、中间点、终点。

// 圆弧参数计算
1. 由三点确定圆心 O 和半径 r
2. 计算起始角 θ₀ 和终止角 θf
3. 沿圆弧角度插值:
   θ(s) = θ₀ + s·(θf - θ₀)
   P(s) = O + r·[cos(θ(s)), sin(θ(s)), 0]^T

嗯,这里要注意:圆弧轨迹在三维空间里可能不在一个平面上。如果三点不共面,你需要先拟合一个最佳平面,或者用样条曲线代替。

4.3 关节空间 vs 操作空间:怎么选?

我经常被问到这个问题。其实没有的好坏,关键看场景。

对比维度 关节空间规划 操作空间规划
计算量 小,不需要实时逆运动学 大,每个插值点都要逆解
路径可控性 不可控,末端走弧线 可控,直线/圆弧/样条
奇异问题 无 需要额外处理
适用场景 点对点搬运、码垛 焊接、切割、精密装配

我的建议: 如果任务只要求「从 A 到 B,别撞到东西」,用关节空间规划就够了。如果要求「末端必须走一条特定路径」,那就老老实实用操作空间规划,但一定要加奇异检测和避障逻辑。

4.4 本章知识体系

下面这张图总结了轨迹规划的完整脉络,你可以把它当作快速索引:

轨迹规划知识体系 轨迹规划知识体系 轨迹规划 关节空间轨迹规划 操作空间轨迹规划 多项式轨迹 梯形速度轨迹 直线轨迹 圆弧轨迹 三次多项式 五次多项式 对称/非对称加减速 位置+姿态插值 三点定弧 关键选择:路径可控性要求高 → 操作空间规划 计算资源有限 / 无路径要求 → 关节空间规划

4.5 避坑指南

最后分享几个我这些年积累的经验,希望能帮你少走弯路:

  • 不要迷信高阶多项式。七次多项式虽然平滑,但参数多、调起来费劲。我一般先用五次多项式,如果抖动明显再升级。
  • 梯形速度的加速度不能设太大。我曾经为了赶节拍,把加速度设到电机极限的 90%,结果机器人跑起来像在跳舞——末端抖动严重。后来控制在 60%-70% 就稳了。
  • 操作空间规划一定要做碰撞检测。因为末端走直线时,其他关节可能撞到周围设备。我习惯在规划阶段用包围盒做快速碰撞检查,而不是等到运行时才发现。
  • 逆运动学求解失败时,不要直接报错。可以尝试在路径点附近微调姿态,或者切换到关节空间规划做降级处理。系统鲁棒性比完美路径更重要。

一个小技巧: 如果你用梯形速度做操作空间规划,可以在加速段和减速段用 S 形曲线(正弦或多项式)做圆角处理,避免加速度突变。这样既保留了梯形速度的直观性,又改善了平滑度。