3. 常见轨迹规划算法:多项式插值、贝塞尔曲线、样条曲线、梯形速度规划

好,咱们进入正题。轨迹规划算法,说白了就是解决「怎么让机器人从A点走到B点」的问题。你想想看,如果只是简单地把目标位置发给电机,那机器人会「哐」一下弹过去,轻则抖动,重则损坏机构。所以我们需要一条平滑的、可控的路径。

我个人习惯把这几种算法分成两类:一类是路径形状生成器(多项式、贝塞尔、样条),另一类是速度调度器(梯形速度规划)。前者决定「走什么路」,后者决定「怎么走」。下面我一个一个讲。

核心观点: 没有万能的算法,只有最合适的场景。选错了算法,轻则轨迹不平滑,重则机器人直接「抽风」。

3.1 多项式插值

多项式插值是最直观的方法。给定几个关键点(位置、速度甚至加速度),用一个多项式函数把它们串起来。最常见的是三次多项式,因为它能保证位置和速度连续。

公式长这样:

q(t) = a0 + a1*t + a2*t^2 + a3*t^3

四个系数由起点和终点的位置、速度决定。我在项目中遇到过一个问题:用五次多项式做插值,结果加速度曲线出现了剧烈震荡。后来发现是采样点太密,多项式阶数太高导致的过拟合。嗯,这里要注意:阶数不是越高越好。

多项式阶数 连续保证 典型应用
3次(三次) 位置、速度 点到点运动
5次(五次) 位置、速度、加速度 高精度轨迹
7次及以上 更高阶连续 特殊场景(慎用)
我的小技巧: 如果只是简单的点到点运动,用三次多项式就够了。别一上来就上五次,给自己找麻烦。

3.2 贝塞尔曲线

贝塞尔曲线在图形学里用得很多,但在机器人轨迹规划里,它有个天然优势:凸包性质。什么意思?就是整条曲线一定落在控制点构成的凸多边形内部。这对避障非常友好——你只要保证控制点不在障碍物里,曲线就不会碰到。

公式(以三次贝塞尔为例):

B(t) = (1-t)^3 * P0 + 3*(1-t)^2*t * P1 + 3*(1-t)*t^2 * P2 + t^3 * P3

我曾经在一个焊接机器人项目里用过贝塞尔曲线。当时需要让焊枪沿着一个复杂曲面边缘运动,用多项式插值怎么调都不顺。换成贝塞尔后,通过调整中间两个控制点,很快就搞定了。说白了,贝塞尔曲线的「手感」很好,你拖拽控制点,曲线会直观地变化。

注意: 贝塞尔曲线是全局的。你改一个控制点,整条曲线都会变。如果你需要局部调整,请考虑B样条。

3.3 样条曲线

样条曲线是贝塞尔曲线的「升级版」。它把整条轨迹分成多段,每段是一个低阶多项式,段与段之间保证连续。最常用的是三次B样条。

样条曲线的优点很明显:

  • 局部性:改一个控制点,只影响附近几段曲线
  • 平滑性:可以做到C2连续(加速度连续)
  • 数值稳定:不会像高次多项式那样震荡

我记得有一次做码垛机器人的轨迹规划,需要经过几十个路径点。如果用多项式插值,阶数会高得离谱,计算量爆炸。换成B样条后,每段只用三次多项式,计算又快,轨迹又平滑。嗯,这里有个避坑指南:样条曲线的节点向量设置很关键。我曾经因为节点分布不均匀,导致曲线在某个区域出现「鼓包」,排查了半天才发现是节点的问题。

一句话总结: 如果你需要经过多个点,且要求轨迹平滑,选样条曲线准没错。

3.4 梯形速度规划

前面讲的都是路径形状,现在聊聊速度。梯形速度规划是最简单、最常用的速度曲线。它把运动分成三个阶段:加速、匀速、减速。速度曲线看起来像个梯形,所以叫这个名字。

参数就三个:最大速度Vmax、最大加速度Amax、总位移S。算法会计算出加速段和减速段的时间,以及匀速段是否出现。

// 伪代码示例
if (S < Vmax^2 / Amax) {
    // 三角形速度曲线(没有匀速段)
    T_acc = sqrt(S / Amax);
    T_const = 0;
} else {
    // 梯形速度曲线
    T_acc = Vmax / Amax;
    T_const = (S - Vmax^2 / Amax) / Vmax;
}

梯形速度规划的好处是简单、直观、计算量小。但缺点也很明显:加速度在切换点处有突变,会导致冲击。如果你做的是高精度装配或者医疗机器人,建议用S形速度规划(后面章节会讲)。

我的经验: 在大多数工业机器人场景中,梯形速度规划完全够用。别为了追求「完美」而过度设计。我曾经在一个项目中强行上S形曲线,结果调试时间翻了三倍,最后发现梯形曲线加个低通滤波效果一样好。

知识体系总览

下面这张图帮你理清这几种算法的关系和应用场景:

轨迹规划算法分类与选择 轨迹规划算法 路径形状生成 速度调度 多项式插值 贝塞尔曲线 样条曲线 梯形速度规划 选择建议 少点、简单路径 → 多项式插值 | 多点、需避障 → 贝塞尔曲线 | 多点、高平滑 → 样条曲线 速度要求不高 → 梯形速度规划 | 高精度、低冲击 → 考虑S形速度规划

好了,这四种算法是轨迹规划的「基本功」。我个人建议你从梯形速度规划和三次多项式插值入手,先把最简单的场景跑通。等遇到复杂需求了,再逐步引入贝塞尔和样条。别一上来就想搞个大而全的系统,容易把自己绕进去。

最后说一句: 算法是死的,场景是活的。多动手仿真验证,比看一百篇论文都管用。

可可精品资料库