4. 轨迹生成:多项式插值、贝塞尔曲线、B样条曲线

好,咱们进入轨迹生成这个核心环节。说白了,规划器算出来的路径只是一堆离散的点,比如「从A到B,中间经过C、D、E」。但机器人真正要动起来,需要一条连续、平滑的曲线——这就是轨迹生成要干的事。

我个人习惯把轨迹生成分成三类:多项式插值贝塞尔曲线B样条曲线。它们各有各的脾气,也各有各的适用场景。咱们一个一个聊。

4.1 多项式插值:最朴素,也最直接

多项式插值,说白了就是「给一堆点,用一条多项式曲线把它们串起来」。最常见的做法是五次多项式插值,因为它能同时约束位置、速度、加速度。

我在项目中遇到过一个问题:用三次多项式插值做机械臂的关节轨迹,结果末端执行器在拐点处抖得厉害。后来换成五次多项式,瞬间就稳了。为什么?因为五次多项式能保证加速度连续,而三次多项式只能保证速度和位置连续。

核心公式: 五次多项式形式为 q(t) = a₀ + a₁t + a₂t² + a₃t³ + a₄t⁴ + a₅t⁵

求解这六个系数,需要六个边界条件:起始和终止的位置、速度、加速度。写成矩阵形式就是:

// 边界条件示例
q(0) = q_start,   q(T) = q_end
q'(0) = v_start,  q'(T) = v_end
q''(0) = a_start, q''(T) = a_end

嗯,这里要注意:如果路径点太多,用高阶多项式会出问题——龙格现象。你想想看,一个10阶多项式在端点附近会剧烈震荡,机器人根本没法跟。所以实际工程中,我更推荐用分段多项式,比如每两个路径点之间用一段五次多项式,然后在连接处保证二阶连续。

避坑指南: 我曾经在AGV导航项目里用全局七次多项式插值,结果路径在中间段出现了诡异的「甩尾」现象。后来改成三段五次多项式拼接,问题就解决了。记住:多项式阶数不是越高越好。

4.2 贝塞尔曲线:直观,但全局牵一发动全身

贝塞尔曲线,做图形学的朋友肯定不陌生。它的核心思想是:用一组控制点来「拉扯」曲线。控制点越多,曲线越复杂。

我个人觉得贝塞尔曲线最大的优点是直观。你拖动一个控制点,曲线会朝着那个方向弯曲,非常符合直觉。在机器人轨迹规划里,我常用它来做路径平滑——把折线路径的拐角用贝塞尔曲线圆角化。

但贝塞尔曲线有个硬伤:全局性。你移动任何一个控制点,整条曲线都会变。这在实时调整轨迹时很要命。比如你正在规划一条避障路径,突然发现中间某个控制点需要微调,结果整条曲线都变了,可能又撞到别的障碍物。

// 三次贝塞尔曲线公式
B(t) = (1-t)³P₀ + 3(1-t)²tP₁ + 3(1-t)t²P₂ + t³P₃
// t ∈ [0, 1]
我的经验: 贝塞尔曲线适合做局部平滑,比如在路径的拐角处插入一段贝塞尔曲线。但别用它做全局路径规划,否则调整起来会让你崩溃。

4.3 B样条曲线:工业界的首选

B样条曲线,说白了就是「分段贝塞尔曲线的升级版」。它解决了贝塞尔曲线的全局性问题——每个控制点只影响曲线的一小段。这才是工业机器人、数控机床、自动驾驶里最常用的方案。

我记得第一次接触B样条是在做协作机器人轨迹规划时。当时需要一条能实时调整的平滑曲线,贝塞尔曲线搞不定,多项式插值又太死板。后来换成B样条,问题迎刃而解。

B样条有几个关键参数:

  • 阶数 p:决定了曲线的平滑度。p=3是三次B样条,能保证C²连续(加速度连续)。
  • 控制点 Pᵢ:你拖拽的点,每个点只影响局部。
  • 节点向量 U:决定了曲线在参数空间里的分段位置。
核心公式: B样条曲线定义为 C(u) = Σᵢ Nᵢₚ(u) Pᵢ
其中 Nᵢₚ(u) 是B样条基函数,由Cox-de Boor递推公式计算。

你想想看,如果我想让机器人经过某个精确位置,只需要在那个位置附近多放几个控制点,或者使用准均匀B样条(两端节点重复p+1次)。这样曲线就会精确经过首尾控制点,而中间段依然保持平滑。

避坑指南: 我曾经在无人机航迹规划里用均匀B样条,结果发现曲线在首尾段抖动严重。后来查资料才知道,均匀B样条不经过首尾控制点,导致无人机起飞和降落阶段轨迹不理想。换成准均匀B样条后,问题解决。

4.4 三种方法的对比与选择

咱们用一张表来总结一下:

特性 多项式插值 贝塞尔曲线 B样条曲线
局部控制 否(全局) 否(全局) 是(局部)
连续性 可调(阶数决定) Cⁿ(n为阶数) Cᵖ⁻¹(p为阶数)
计算复杂度
实时调整 困难 困难 容易
适用场景 简单路径、关节空间 路径平滑、可视化 工业机器人、自动驾驶

我个人建议:新手先从多项式插值入手,理解轨迹生成的本质。然后过渡到B样条,因为它是工程中最实用的。贝塞尔曲线嘛,可以当作一个中间桥梁,帮你理解B样条的原理。

4.5 知识体系结构图

下面这张图展示了本章的核心逻辑:

轨迹生成方法体系 轨迹生成 多项式插值 贝塞尔曲线 B样条曲线 全局控制 · 阶数决定连续性 适合关节空间轨迹 全局控制 · 直观易调 适合路径平滑圆角 局部控制 · C²连续 工业首选 · 实时调整 选择建议:新手从多项式入手,工程实践用B样条

嗯,这张图把三种方法的核心特性都串起来了。你可以看到,从多项式到贝塞尔再到B样条,其实是一个「控制能力逐渐增强」的过程。多项式插值最基础,B样条最灵活。

我的小技巧: 在实际项目中,我经常把B样条和多项式插值混合使用。比如在笛卡尔空间用B样条做路径平滑,在关节空间用五次多项式做插值。这样既能保证路径的灵活性,又能保证关节运动的平滑性。

好了,轨迹生成这块就聊到这儿。记住一句话:没有最好的方法,只有最合适的场景。下次你遇到轨迹规划问题,先问问自己:我需要局部控制吗?需要实时调整吗?需要多高的连续性?想清楚这些,选哪种方法自然就明白了。

专注资料整理