4、曲线优化:加速度连续优化、跃度(Jerk)最小化优化、速度峰值限制优化
好,咱们进入第四讲。前面几章我们把凸轮曲线的数学基础、多项式构造、还有S型曲线都聊透了。但说实话,光会生成曲线,离真正的工程应用还差一大截。
你想想看,一条曲线如果加速度不连续,机器跑起来会怎样?轻则抖动,重则撞机。我当年调试一台高速贴片机,就是吃了这个亏——曲线看着漂亮,结果一跑起来,末端执行器像在跳舞。后来一查,加速度在衔接点跳变了。
所以这一章,咱们专门聊优化。说白了,就是给曲线“做手术”,让它更平滑、更安全、更快。
4.1 加速度连续优化
加速度连续,是凸轮曲线最基本的要求。为什么?因为加速度不连续,意味着力会突变。力突变,机器就会振动。
我个人的习惯是,拿到一条曲线,第一件事不是看位置,而是看加速度曲线。加速度曲线如果有“尖角”,那肯定有问题。
核心原则:加速度连续,要求位置曲线至少是C2连续(二阶导数连续)。对于高阶优化,我们甚至要求C3、C4连续。
怎么实现加速度连续?其实很简单——在多项式拼接时,保证相邻段在连接点处的二阶导数相等。
举个例子,假设我们有两段多项式:
# 第一段:0 ≤ t ≤ T1
p1(t) = a0 + a1*t + a2*t^2 + a3*t^3 + a4*t^4 + a5*t^5
# 第二段:T1 ≤ t ≤ T2
p2(t) = b0 + b1*(t-T1) + b2*(t-T1)^2 + b3*(t-T1)^3 + b4*(t-T1)^4 + b5*(t-T1)^5
要保证加速度连续,就需要:
p1''(T1) = p2''(0)
即:2*a2 + 6*a3*T1 + 12*a4*T1^2 + 20*a5*T1^3 = 2*b2
嗯,这里要注意,这只是二阶连续。如果你想要更平滑,还得保证三阶连续(跃度连续)。
实战技巧:我在做五段S型曲线时,通常会在中间段用7次多项式,这样能同时保证位置、速度、加速度、跃度四个边界条件全部连续。代价是计算量大了点,但现在的MCU完全扛得住。
4.2 跃度(Jerk)最小化优化
跃度,就是加速度的变化率。为什么跃度重要?因为跃度直接决定了机器的“冲击感”。
你坐过那种急加速又急减速的电梯吗?那种难受的感觉,就是跃度太大造成的。机器也一样,跃度过大会导致:
- 机械结构疲劳加剧
- 螺栓松动、焊缝开裂
- 加工精度下降
- 噪音增大
跃度最小化,本质上是一个优化问题。我们的目标函数是:
minimize ∫(jerk(t))^2 dt
subject to:
- 位置边界条件(起点、终点位置)
- 速度边界条件(起点、终点速度)
- 加速度边界条件(起点、终点加速度)
- 速度峰值限制
- 加速度峰值限制
这个优化问题,用变分法可以解。但实际工程中,我更推荐用数值优化方法——比如用scipy的优化器直接求解多项式系数。
我曾经在一个项目中,需要把跃度峰值从原来的1200 mm/s³降到300 mm/s³以下。一开始用解析法,算得头大。后来改用数值优化,几分钟就搞定了。
关键结论:跃度最小化,本质上是在“平滑性”和“响应速度”之间做权衡。跃度越小,曲线越平滑,但运动时间会变长。你需要根据实际工况来取舍。
4.3 速度峰值限制优化
速度峰值限制,这个好理解——电机有额定转速,丝杠有最大线速度,你不能让机器超速。
但问题来了:当你限制了速度峰值,曲线的形状就会受影响。尤其是当运动行程很短、时间要求很紧的时候,速度很容易撞到天花板。
我常用的策略是“三段式”优化:
- 先算理论速度峰值:用未优化的曲线算一下,看看最大速度是多少。
- 判断是否超限:如果理论速度峰值 ≤ 允许速度,那就不用优化,直接用。
- 如果超限:那就需要重新规划曲线,把速度峰值压下来。
怎么压速度峰值?说白了就是“拉长时间”或者“降低加速度”。
| 优化方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 增加运动时间 | 简单直接,效果明显 | 降低生产效率 | 对节拍要求不高的场合 |
| 降低加速度峰值 | 保持运动时间不变 | 可能影响跃度 | 加速度有余量的场合 |
| 修改曲线类型 | 从梯形改为S型 | 计算复杂 | 对平滑性要求高的场合 |
| 分段优化 | 灵活,可局部调整 | 需要迭代计算 | 复杂运动曲线 |
避坑指南:我曾经犯过一个错误——为了压速度峰值,把加速度降得太低,结果导致电机在低速区运行时间过长,反而发热严重。后来才明白,速度峰值和加速度峰值要一起优化,不能只看一个指标。
4.4 综合优化策略
实际项目中,这三个优化往往是同时进行的。我一般按这个顺序来:
- 先保证加速度连续——这是底线,不连续就别谈优化。
- 再优化跃度——让曲线更平滑,减少冲击。
- 最后限制速度峰值——确保不超速。
但要注意,这三个目标有时候是冲突的。比如你为了降低跃度,把曲线弄得更平滑,结果速度峰值反而上去了。这时候就需要做权衡。
我个人习惯用“加权目标函数”来处理:
J_total = w1 * J_acc + w2 * J_jerk + w3 * J_vel
其中:
J_acc = ∫(acc(t))^2 dt (加速度平方积分)
J_jerk = ∫(jerk(t))^2 dt (跃度平方积分)
J_vel = max(vel(t)) (速度峰值)
w1, w2, w3 是权重系数
权重怎么选?没有标准答案。我一般先设成等权重,然后根据仿真结果调整。如果发现速度超限了,就把w3调大;如果跃度太大,就把w2调大。
小技巧:权重调整可以用“试错法”,但更高效的是用网格搜索。把w1、w2、w3各取几个值,组合起来跑一遍仿真,选效果最好的那组参数。我写过一个脚本,自动跑1000组参数,半小时出结果。
4.5 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以看到,三个优化目标并不是孤立的,它们相互影响,最终通过加权优化达到平衡。
这张图你看懂了吗?三个优化目标从不同角度约束曲线,最终通过综合优化达到平衡。实际项目中,你不需要每次都从头算起——很多成熟的库已经封装好了这些算法,你只需要调参就行。
但话说回来,调参的前提是你得理解背后的原理。不然参数调坏了,你都不知道问题出在哪。
好了,这一章的内容就到这里。曲线优化是个大话题,咱们今天聊了加速度连续、跃度最小化、速度峰值限制这三个核心方向。下一章,我会带你看看更高级的优化技巧——比如时间最优轨迹规划、能量最优轨迹规划。到时候咱们再细聊。
本章小结:
- 加速度连续是底线,必须保证C2连续
- 跃度最小化能减少冲击,但会牺牲响应速度
- 速度峰值限制要结合加速度一起优化
- 三个目标用加权函数统一优化,权重靠仿真调
公众号:蓝海资料掘金营,微信deep3321