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 速度峰值限制优化

速度峰值限制,这个好理解——电机有额定转速,丝杠有最大线速度,你不能让机器超速。

但问题来了:当你限制了速度峰值,曲线的形状就会受影响。尤其是当运动行程很短、时间要求很紧的时候,速度很容易撞到天花板。

我常用的策略是“三段式”优化:

  1. 先算理论速度峰值:用未优化的曲线算一下,看看最大速度是多少。
  2. 判断是否超限:如果理论速度峰值 ≤ 允许速度,那就不用优化,直接用。
  3. 如果超限:那就需要重新规划曲线,把速度峰值压下来。

怎么压速度峰值?说白了就是“拉长时间”或者“降低加速度”。

优化方法 优点 缺点 适用场景
增加运动时间 简单直接,效果明显 降低生产效率 对节拍要求不高的场合
降低加速度峰值 保持运动时间不变 可能影响跃度 加速度有余量的场合
修改曲线类型 从梯形改为S型 计算复杂 对平滑性要求高的场合
分段优化 灵活,可局部调整 需要迭代计算 复杂运动曲线

避坑指南:我曾经犯过一个错误——为了压速度峰值,把加速度降得太低,结果导致电机在低速区运行时间过长,反而发热严重。后来才明白,速度峰值和加速度峰值要一起优化,不能只看一个指标。

4.4 综合优化策略

实际项目中,这三个优化往往是同时进行的。我一般按这个顺序来:

  1. 先保证加速度连续——这是底线,不连续就别谈优化。
  2. 再优化跃度——让曲线更平滑,减少冲击。
  3. 最后限制速度峰值——确保不超速。

但要注意,这三个目标有时候是冲突的。比如你为了降低跃度,把曲线弄得更平滑,结果速度峰值反而上去了。这时候就需要做权衡。

我个人习惯用“加权目标函数”来处理:

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连续约束 • 高阶多项式拼接 实现方法 • 变分法/数值优化 • 加权目标函数 实现方法 • 增加运动时间 • 降低加速度峰值 综合优化:加权目标函数 + 迭代求解

这张图你看懂了吗?三个优化目标从不同角度约束曲线,最终通过综合优化达到平衡。实际项目中,你不需要每次都从头算起——很多成熟的库已经封装好了这些算法,你只需要调参就行。

但话说回来,调参的前提是你得理解背后的原理。不然参数调坏了,你都不知道问题出在哪。


好了,这一章的内容就到这里。曲线优化是个大话题,咱们今天聊了加速度连续、跃度最小化、速度峰值限制这三个核心方向。下一章,我会带你看看更高级的优化技巧——比如时间最优轨迹规划、能量最优轨迹规划。到时候咱们再细聊。

本章小结:

  • 加速度连续是底线,必须保证C2连续
  • 跃度最小化能减少冲击,但会牺牲响应速度
  • 速度峰值限制要结合加速度一起优化
  • 三个目标用加权函数统一优化,权重靠仿真调

公众号:蓝海资料掘金营,微信deep3321