4. 凸轮曲线数学基础:多项式插值、样条曲线、三角函数曲线
说实话,很多做运动控制的工程师,一听到“数学基础”四个字就头大。我当年刚入行时也一样,觉得能调通伺服就行,管它什么多项式。直到有一次,我负责一台高速贴片机的凸轮曲线设计,设备一跑起来,振动大得像要散架。老工程师看了一眼我的曲线数据,只说了一句:“你这加速度不连续,机器不抖才怪。”
从那以后,我老老实实把数学基础补上了。今天这章,咱们就聊聊凸轮曲线背后最核心的三种数学工具:多项式插值、样条曲线和三角函数曲线。说白了,它们就是用来“造曲线”的三种手艺。
核心观点:凸轮曲线的本质,是用数学函数描述“从位置A到位置B,速度、加速度、加加速度怎么变”。选对数学工具,你的机器就稳;选错了,振动、冲击、过冲全来了。
4.1 多项式插值:最直接的曲线构造法
多项式插值,说白了就是“给几个点,画一条光滑曲线穿过它们”。你给定起点和终点的位置、速度、加速度,多项式就能帮你算出一条满足所有条件的曲线。
我个人的习惯是,先搞清楚你需要几阶多项式。为什么?因为每个约束条件对应一个系数。举个例子:
- 3次多项式(立方曲线):只能约束位置和速度(4个系数,4个条件)
- 5次多项式:可以约束位置、速度、加速度(6个系数,6个条件)
- 7次多项式:再加加加速度约束(8个系数,8个条件)
你想想看,如果只约束位置和速度,加速度在端点处会突变。机器一启动就是“哐”的一下,这就是冲击的来源。
实战建议:做电子凸轮时,我建议至少用5次多项式。它能保证加速度连续,这对大多数工业应用已经够用了。7次多项式虽然更平滑,但计算量大了不少,而且对系统带宽要求更高。
5次多项式的标准形式长这样:
// 5次多项式通用形式
// s(t) = a0 + a1*t + a2*t² + a3*t³ + a4*t⁴ + a5*t⁵
// 约束条件(t=0 和 t=T 时刻)
// s(0) = 0, v(0) = 0, a(0) = 0
// s(T) = S, v(T) = 0, a(T) = 0
// 解出来的系数(归一化时间 u = t/T)
// s(u) = S * (10*u³ - 15*u⁴ + 6*u⁵)
这段代码看着简单,但背后有门道。系数 10、-15、6 不是随便来的,它们是解6元一次方程组的结果。我在项目中经常用这个公式,因为它能保证起停时速度、加速度都为零,机器动作特别“柔”。
注意:多项式阶数不是越高越好。阶数超过9次后,曲线会在端点附近出现剧烈振荡,这叫“龙格现象”。我曾经见过有人用15次多项式做凸轮,结果曲线在中间段抖得像心电图,机器根本没法用。
4.2 样条曲线:分段拼接的艺术
多项式插值有个硬伤:如果你要经过很多个点,用一个高次多项式去拟合,龙格现象会让你崩溃。怎么办?分段处理。
样条曲线的思路很简单:把整个行程切成若干小段,每段用一个低阶多项式(通常是3次)去拟合,然后在拼接处保证位置、速度、加速度连续。这就是“分段低阶、整体高阶”的效果。
我记得有一次做一台包装机的凸轮,行程有3000多个点。如果用单一多项式,阶数得几千次,根本算不出来。用样条曲线,每段只用3次多项式,3000段拼起来,整条曲线平滑得像丝绸。
最常用的是三次样条(Cubic Spline):
| 特性 | 三次样条 | B样条 | NURBS |
|---|---|---|---|
| 每段阶数 | 3次 | 3次(可调) | 3次(可调) |
| 连续性 | C²(加速度连续) | C²(加速度连续) | C²(加速度连续) |
| 局部控制 | 差(改一点影响全局) | 好(局部修改) | 好(局部修改) |
| 适用场景 | 数据点密集、平滑要求高 | 需要局部调整 | 需要精确控制形状 |
我个人偏爱B样条。为什么?因为它的“局部性”太实用了。你想想看,调试凸轮曲线时,经常是某个局部段振动偏大,需要微调。用三次样条,改一个点整条曲线都得重算;用B样条,只影响附近几段,其他部分纹丝不动。
关键区别:三次样条是“插值”——曲线必须穿过所有给定点;B样条是“逼近”——曲线被控制点“吸引”但不一定穿过。做凸轮时,如果你有精确的路径要求,用三次样条;如果你只关心曲线形状的平滑性,用B样条更灵活。
4.3 三角函数曲线:天生的平滑大师
说到三角函数曲线,很多人第一反应是正弦曲线。没错,正弦曲线确实是最基础的三角函数曲线,但凸轮领域里,我们用的更多是摆线(Cycloidal)和修正正弦(Modified Sine)。
为什么三角函数曲线天生平滑?因为它的各阶导数(速度、加速度、加加速度)都是正弦或余弦的线性组合,天然连续,没有突变。这一点,多项式插值需要特意构造才能做到。
摆线曲线的公式很漂亮:
// 摆线曲线(归一化形式)
// u = t / T, 0 ≤ u ≤ 1
// s(u) = S * (u - sin(2πu) / (2π))
// 速度:v(u) = S/T * (1 - cos(2πu))
// 加速度:a(u) = S/T² * (2π * sin(2πu))
// 加加速度:j(u) = S/T³ * (4π² * cos(2πu))
你看,所有导数都是连续的。而且摆线的最大特点是:加速度在起点和终点都为零,加加速度在起点和终点达到最大。这意味着什么?起停时没有冲击,但中间段加加速度变化剧烈。
我在项目中遇到过一个问题:一台高速贴片机用摆线曲线,起停确实很柔,但到了行程中间段,机器开始轻微抖动。后来分析发现,是加加速度峰值太高,激发了机械结构的共振频率。
避坑指南:我曾经以为摆线曲线是万能的,后来发现不是。如果你的机械结构固有频率较低,摆线中间段的加加速度峰值可能会引发共振。这时候,修正正弦曲线是更好的选择——它把加加速度峰值分散到整个行程中,峰值更低,更“温和”。
修正正弦曲线是摆线和正弦曲线的混合体,它把行程分成三段:
- 加速段(0~1/8行程):用正弦曲线,加速度从0缓慢上升
- 中间段(1/8~7/8行程):用摆线曲线,保持平滑
- 减速段(7/8~1行程):用正弦曲线,加速度缓慢归零
这种“三段式”设计,让加加速度峰值比纯摆线降低了约30%。我后来做高速凸轮时,修正正弦曲线成了我的首选。
4.4 三种曲线的对比与选型
说了这么多,到底什么时候用哪种?我整理了一张对比表,你直接拿去用:
| 对比维度 | 5次多项式 | B样条 | 修正正弦 |
|---|---|---|---|
| 加速度连续性 | 连续 | 连续 | 连续 |
| 加加速度连续性 | 不连续(阶跃) | 不连续(分段线性) | 连续 |
| 加加速度峰值 | 中等 | 低(可调) | 低 |
| 计算复杂度 | 低 | 中 | 中 |
| 局部调整能力 | 无(全局) | 强 | 无(全局) |
| 适用速度 | 中低速 | 中高速 | 高速 |
| 典型应用 | 通用凸轮、起停频繁 | 长行程、多点路径 | 高速、低振动要求 |
选型时,我一般按这个逻辑走:
- 速度不高、起停频繁:5次多项式,简单可靠
- 行程长、路径复杂、需要反复调试:B样条,局部修改太方便了
- 高速运行、对振动敏感:修正正弦,加加速度连续是最大优势
最后提醒一句:数学工具只是手段,不是目的。我见过太多人沉迷于“更平滑的曲线”,结果曲线平滑了,机器反而跑不动——因为伺服系统的带宽跟不上。曲线再好,也得硬件能执行。这一点,后面章节咱们会细聊。