4、多项式轨迹规划:三次多项式插值、五次多项式插值、带中间点的多项式轨迹、过约束问题的处理

轨迹规划里,多项式插值是最基础、最常用的方法之一。说白了,就是给机器人关节或末端位置找一条平滑的曲线,让它从A点走到B点,中间不抖、不跳、不超限。

我个人习惯把多项式轨迹分成两类:低阶和高阶。低阶计算快、简单,但约束少;高阶更灵活,能加更多条件,但算起来也重一些。咱们一个一个说。

4.1 三次多项式插值

三次多项式是最简单的连续轨迹形式。它的公式长这样:

θ(t) = a₀ + a₁·t + a₂·t² + a₃·t³

它有四个未知系数,所以需要四个约束条件。通常我们给定起点和终点的位置、速度:

约束 数学表达
起点位置 θ(0) = θ₀
终点位置 θ(t_f) = θ_f
起点速度 θ̇(0) = 0
终点速度 θ̇(t_f) = 0

解这个方程组,就能得到四个系数。我在项目中遇到过一个问题:三次多项式只能保证位置和速度连续,加速度在起点和终点会突变。如果你做的是高速抓取,加速度突变会产生冲击力,轻则抖动,重则损坏机构。

注意:三次多项式在起点和终点的加速度不为零,且存在跳变。如果系统对加速度有严格限制,不要直接用三次多项式。

代码实现很简单,我一般这样写:

def cubic_trajectory(theta_0, theta_f, t_f, t):
    # 解系数
    a0 = theta_0
    a1 = 0.0
    a2 = 3.0 * (theta_f - theta_0) / (t_f ** 2)
    a3 = -2.0 * (theta_f - theta_0) / (t_f ** 3)
    # 计算位置
    return a0 + a1*t + a2*t**2 + a3*t**3

4.2 五次多项式插值

如果你需要更平滑的轨迹,那就得上五次多项式了。它比三次多项式多了两个自由度,可以额外约束起点和终点的加速度:

θ(t) = a₀ + a₁·t + a₂·t² + a₃·t³ + a₄·t⁴ + a₅·t⁵

六个系数,六个约束:位置、速度、加速度在起点和终点都给定。这样加速度就是连续的,不会突变。

约束类型 起点 终点
位置 θ(0) = θ₀ θ(t_f) = θ_f
速度 θ̇(0) = 0 θ̇(t_f) = 0
加速度 θ̈(0) = 0 θ̈(t_f) = 0

解这个方程组稍微麻烦一点,但也是解析解,直接算就行:

def quintic_trajectory(theta_0, theta_f, t_f, t):
    # 归一化时间
    tau = t / t_f
    # 五次多项式系数(解析解)
    a0 = theta_0
    a1 = 0.0
    a2 = 0.0
    a3 = 10.0 * (theta_f - theta_0)
    a4 = -15.0 * (theta_f - theta_0)
    a5 = 6.0 * (theta_f - theta_0)
    # 计算位置
    return a0 + a1*tau + a2*tau**2 + a3*tau**3 + a4*tau**4 + a5*tau**5
我的经验:在工业机器人上做点位运动时,我几乎只用五次多项式。虽然计算量比三次大一点,但加速度连续这个特性太重要了——尤其是当机器人带着工件做高速运动时,加速度突变会导致工件晃动甚至脱落。

4.3 带中间点的多项式轨迹

实际应用中,很少只做A到B的单段运动。更多时候,我们需要经过多个中间点,比如避障、抓取路径上的关键位置。

带中间点的轨迹,常见做法有两种:

  1. 分段多项式:每两个相邻点之间用一段三次或五次多项式连接。段与段之间在中间点处保证位置、速度连续。
  2. 全局多项式:用一个高阶多项式一次性穿过所有点。点数多了,阶数就高,容易出现龙格现象(Runge's phenomenon)——曲线在端点附近剧烈振荡。

我个人更推荐分段多项式。原因很简单:稳定、可控、好调试。每段只负责两个点之间的运动,出了问题只需要改局部,不用动全局。

分段多项式在中间点处的衔接条件是这样的:

衔接条件 说明
位置连续 前一段终点 = 后一段起点
速度连续 前一段终点速度 = 后一段起点速度
加速度连续(可选) 前一段终点加速度 = 后一段起点加速度

嗯,这里要注意:如果中间点处速度不为零,那你就得额外指定中间点的速度值。我一般用两种方式确定中间点速度:

  • 平均法:取前后两段平均速度作为中间点速度。
  • 用户指定:由工艺要求直接给定,比如在抓取点处速度必须为零。

4.4 过约束问题的处理

什么叫过约束?就是你给的条件太多了,多项式系数不够用。比如你只有四个系数,却给了五个约束条件——这就无解了。

为什么会这样?你想想看,实际项目中经常出现这种情况:既要保证起点终点位置速度加速度,又要保证中间某点的位置,还要限制最大速度……约束条件一多,低阶多项式就扛不住了。

处理过约束,我常用的方法有几种:

方法 思路 适用场景
提高多项式阶数 增加自由度,容纳更多约束 约束数量不多,阶数可控
分段处理 把过约束拆到多段轨迹中 中间点较多,约束分散
最小二乘拟合 不要求精确满足所有约束,只求误差最小 约束矛盾,无法同时满足
优化方法 把约束作为优化目标或惩罚项 需要权衡多个约束

我曾经在一个六轴机器人项目中遇到过这种情况:用户要求轨迹经过7个点,每个点都要位置、速度、加速度连续。如果用全局多项式,阶数高达18阶,计算不稳定,曲线振荡严重。最后我用了分段五次多项式+中间点速度优化,把问题拆成6段,每段5次多项式,中间点速度用优化算法自动确定。效果很好,曲线平滑,计算也快。

核心原则:多项式轨迹的阶数 = 约束数量 - 1。约束多了,要么升阶,要么分段,要么放松约束。没有万能的方案,只有适合场景的方案。

下面这张图总结了本章的知识体系:

多项式轨迹规划知识体系 多项式轨迹规划 三次多项式插值 4个系数,4个约束 位置+速度连续 五次多项式插值 6个系数,6个约束 位置+速度+加速度连续 带中间点的轨迹 分段多项式 全局多项式 过约束问题处理 提高多项式阶数 分段处理 最小二乘/优化 核心原则:多项式阶数 = 约束数量 - 1 约束多了,升阶、分段、放松约束三选一
避坑指南:我曾经在一个项目中,为了省事直接用了一个15阶全局多项式穿过12个点。结果轨迹在两端剧烈振荡,最大位置误差超过5mm。后来换成5段三次多项式,每段只负责2-3个点,问题立刻解决。记住:高阶不等于高精度,分段才是工程正道。

好了,多项式轨迹规划的核心内容就这些。从三次到五次,从单段到多段,再到过约束处理——本质上都是在约束数量和计算复杂度之间找平衡。实际项目中,我建议你从五次多项式起步,遇到中间点就分段,遇到过约束就升阶或放松条件。这套思路,基本能覆盖90%以上的轨迹规划场景。