4、多项式曲线(二):五次多项式曲线的推导、特性与适用场景
上一章我们聊完了三次多项式,说白了就是「位置+速度」四个边界条件。但实际项目中你会发现,三次曲线在启停瞬间,加速度是跳变的。嗯,这个问题在高速凸轮系统里很要命。
我印象很深,有一次调试一台包装机,速度一上去,机器就开始抖。查了半天,不是机械间隙,也不是伺服增益,问题就出在加速度突变上。从那以后,我对五次多项式就格外重视。
4.1 为什么需要五次多项式?
三次多项式只能保证位置和速度连续。加速度呢?它不连续。加速度突变意味着什么?意味着力突变,意味着冲击。
五次多项式多了两个自由度。它能同时约束位置、速度、加速度。六个边界条件,六个系数,刚刚好。
核心差异一句话:
- 三次多项式:位置、速度连续,加速度跳变
- 五次多项式:位置、速度、加速度全部连续
你想想看,如果你的凸轮从动件在运动过程中,加速度突然变一下,那冲击力就直接传到机构上了。轻则振动,重则磨损。五次多项式就是来解决这个问题的。
4.2 五次多项式的数学推导
五次多项式的一般形式长这样:
s(t) = C0 + C1·t + C2·t² + C3·t³ + C4·t⁴ + C5·t⁵
速度、加速度、加加速度(Jerk)依次求导:
v(t) = C1 + 2·C2·t + 3·C3·t² + 4·C4·t³ + 5·C5·t⁴
a(t) = 2·C2 + 6·C3·t + 12·C4·t² + 20·C5·t³
j(t) = 6·C3 + 24·C4·t + 60·C5·t²
六个未知数,需要六个方程。我们通常用起点和终点的位置、速度、加速度来约束。
假设运动时间归一化到 [0, 1],起点 t=0,终点 t=1:
| 边界条件 | 起点 (t=0) | 终点 (t=1) |
|---|---|---|
| 位置 s | s₀ | s₁ |
| 速度 v | v₀ | v₁ |
| 加速度 a | a₀ | a₁ |
代入后得到方程组:
s₀ = C0
v₀ = C1
a₀ = 2·C2
s₁ = C0 + C1 + C2 + C3 + C4 + C5
v₁ = C1 + 2·C2 + 3·C3 + 4·C4 + 5·C5
a₁ = 2·C2 + 6·C3 + 12·C4 + 20·C5
解这个方程组,得到系数:
C0 = s₀
C1 = v₀
C2 = a₀ / 2
C3 = 20·(s₁ - s₀) - (8·v₁ + 12·v₀) - (3·a₀ - a₁) / 2
C4 = 30·(s₀ - s₁) + (14·v₁ + 16·v₀) + (3·a₀ - 2·a₁) / 2
C5 = 12·(s₁ - s₀) - 6·(v₁ + v₀) - (a₀ - a₁) / 2
看着有点复杂,但实际用的时候,大部分情况起点和终点的速度、加速度都是零。代入 v₀=v₁=a₀=a₁=0,公式会简化很多:
C0 = s₀
C1 = 0
C2 = 0
C3 = 10·(s₁ - s₀)
C4 = -15·(s₁ - s₀)
C5 = 6·(s₁ - s₀)
这个简化形式在实际项目中非常常用。我一般把它存成模板函数,直接调。
4.3 五次多项式的特性分析
五次多项式最大的优点就是加速度连续。但凡事都有代价。
个人经验:五次多项式的加速度曲线是抛物线形状,最大值出现在中间位置。设计时要注意校核峰值加速度是否超过机构允许范围。
我们来看一下各阶曲线的形状特点:
| 曲线阶次 | 形状 | 连续性 | 特点 |
|---|---|---|---|
| 位置 s(t) | S 形 | C2 连续 | 平滑无拐点突变 |
| 速度 v(t) | 钟形 | C1 连续 | 起止为零,中间峰值 |
| 加速度 a(t) | 抛物线 | C0 连续 | 起止为零,中间有极值 |
| 加加速度 j(t) | 直线 | 不连续 | 存在跳变 |
注意看,加加速度(Jerk)虽然存在跳变,但加速度是连续的。对于大多数工业应用,加速度连续已经足够。只有在对振动极其敏感的场合,才需要考虑更高阶的曲线。
4.4 适用场景与避坑指南
五次多项式最适合哪些场景?我总结了几条:
- 高速启停运动:比如贴片机的取放头,需要快速启停且不能有冲击
- 精密定位:比如数控机床的进给轴,加速度突变会影响加工精度
- 重载搬运:负载大时,加速度突变可能造成工件滑落或机构损坏
我曾经踩过的坑:有一次在高速分度机构上用了五次多项式,结果发现加速度峰值太高,电机扭矩不够。后来加了速度限制,把运动时间拉长才解决。所以用五次多项式之前,一定要先算峰值加速度。
另外,五次多项式不适合以下情况:
- 对计算资源敏感的系统:虽然计算量不大,但在老式 PLC 上频繁调用还是有点吃力
- 需要严格限制加加速度的场合:如果 Jerk 也必须连续,那就得上七次多项式了
- 简单点位运动:如果只是低速、轻载的 A 到 B 移动,三次多项式就够用
4.5 知识体系总览
下面这张图把五次多项式的核心逻辑串起来了:
4.6 代码实现示例
最后给一段实际可用的代码。这是我在 C 语言项目里常用的五次多项式计算函数:
// 五次多项式位置计算(归一化时间 t ∈ [0,1])
// s0: 起始位置, s1: 终止位置
// v0: 起始速度, v1: 终止速度
// a0: 起始加速度, a1: 终止加速度
double quintic_s(double t, double s0, double s1,
double v0, double v1,
double a0, double a1) {
double dt = s1 - s0;
double t2 = t * t;
double t3 = t2 * t;
double t4 = t3 * t;
double t5 = t4 * t;
double C0 = s0;
double C1 = v0;
double C2 = a0 / 2.0;
double C3 = 20.0 * dt - (8.0*v1 + 12.0*v0) - (3.0*a0 - a1) / 2.0;
double C4 = 30.0 * (-dt) + (14.0*v1 + 16.0*v0) + (3.0*a0 - 2.0*a1) / 2.0;
double C5 = 12.0 * dt - 6.0*(v1 + v0) - (a0 - a1) / 2.0;
return C0 + C1*t + C2*t2 + C3*t3 + C4*t4 + C5*t5;
}
实际项目中,我通常把起止速度加速度都设为零,然后调用简化版本。这样代码更干净,计算也更快。
小技巧:如果运动时间不是归一化的,记得先做时间缩放。把实际时间 t_actual 除以总时间 T,得到归一化时间 t = t_actual / T,然后再代入公式。位置结果也要乘以总位移。
五次多项式是工程中最常用的平滑曲线之一。它比三次多项式多了一层加速度连续性,又比七次多项式简单实用。掌握好它,你的凸轮曲线设计就能上一个台阶。