18、加减速控制:离线加减速与在线加减速、速度平滑处理

各位好,我是老张。今天咱们聊聊加减速控制。说实话,这个主题在运动控制里属于「看着简单,做起来全是坑」的那种。我入行头三年,至少有两回因为加减速没处理好,导致设备在客户现场「跳舞」——嗯,就是那种高频抖动,看着都心疼。

加减速控制,说白了就是解决一个问题:电机怎么从A点跑到B点,既快又稳。你想想看,如果直接给电机发一个阶跃速度指令,它会怎么样?轻则丢步,重则机械冲击。所以我们需要一套策略,让速度平滑地变化。

核心观点:加减速控制不是「要不要做」的问题,而是「怎么做才够好」的问题。离线加减速保下限,在线加减速冲上限,速度平滑处理则是两者的粘合剂。

18.1 离线加减速:先算好,再执行

离线加减速,我的理解就是「预计算」。在运动开始之前,我们已经把整条速度曲线算好了。控制器只管按时间戳查表输出就行。

我记得第一次做离线加减速,是在一个点胶机上。当时要求轨迹精度很高,但计算资源有限。我选择了离线方式——先把S曲线算好,存成数组,运行时直接查表。效果还不错,CPU占用率降了40%。

离线加减速的典型流程是这样的:

  1. 输入参数:起始速度、目标速度、加速度、加加速度
  2. 计算阶段:划分加速段、匀速段、减速段
  3. 生成表格:按固定时间间隔生成速度/位置序列
  4. 存储:存入RAM或Flash
  5. 执行:运行时按周期查表输出

它的优点很明显:

  • 计算量小,适合低性能MCU
  • 曲线可预先优化,比如做加加速度限制
  • 确定性好,不会因为计算延迟导致抖动

但缺点也致命:

  • 无法响应实时变化,比如突然的急停指令
  • 占用存储空间,尤其是长距离运动
  • 灵活性差,参数变了就得重新算

我的经验:离线加减速最适合「固定周期、固定路径」的场景。比如印刷机、贴片机,每次运动都一样。我曾经在一个项目中,把离线表格压缩成差分格式,存储量减少了70%,大家可以试试这个思路。

18.2 在线加减速:边跑边算

在线加减速就灵活多了。它不预先计算,而是在每个控制周期里实时算下一步的速度。说白了,就是「走一步看一步」。

我做过一个六轴机器人项目,要求能响应上位机的实时速度变更。离线方式根本不行——你总不能每次改速度都重新算一遍表格吧?所以必须上在线算法。

在线加减速的核心是递推公式。以梯形加减速为例:

// 在线梯形加减速递推
// 输入:当前速度 v_cur, 目标速度 v_tar, 加速度 a, 周期 T
// 输出:下一周期速度 v_next

if (v_cur < v_tar) {
    // 加速阶段
    v_next = v_cur + a * T;
    if (v_next > v_tar) v_next = v_tar;
} else if (v_cur > v_tar) {
    // 减速阶段
    v_next = v_cur - a * T;
    if (v_next < v_tar) v_next = v_tar;
} else {
    // 匀速阶段
    v_next = v_tar;
}

你看,就这么几行代码。但实际项目里,远没这么简单。为什么?因为你还得考虑终点位置约束——不能跑过头了。

在线加减速的优缺点:

  • 优点:灵活,能响应实时指令变化
  • 优点:不占存储空间
  • 缺点:计算量大,对CPU有要求
  • 缺点:容易受计算延迟影响,产生抖动

注意:在线加减速最怕「计算超时」。我曾经在一个项目中,因为中断优先级没调好,导致加减速计算偶尔延迟一个周期。结果就是电机每几秒抖一下,查了三天才找到原因。所以,用在线方式时,一定要做最坏情况下的时序分析。

18.3 速度平滑处理:让曲线更「丝滑」

不管是离线还是在线,原始的速度曲线往往不够平滑。比如梯形加减速,在拐点处加速度突变,会产生冲击。这时候就需要速度平滑处理。

我常用的平滑方法有三种:

方法 原理 适用场景 计算量
S曲线 限制加加速度(Jerk) 高精度轨迹
FIR滤波 对速度序列做滑动平均 实时性要求高
样条插值 用三次样条拟合速度点 离线预计算

我个人最常用的是S曲线。为什么呢?因为它物理意义明确——限制加加速度,就是限制力的变化率。你想想看,电机输出力矩的变化如果太剧烈,机械结构就会振动。S曲线正好解决了这个问题。

S曲线的核心公式其实不复杂:

// S曲线速度计算(简化版)
// 输入:时间 t, 总时间 T, 起始速度 vs, 目标速度 ve
// 输出:当前速度 v(t)

// 加速段 (0 <= t <= T/2)
// 使用正弦函数做平滑过渡
v(t) = vs + (ve - vs) * (1 - cos(π * t / T)) / 2;

// 减速段 (T/2 < t <= T)
// 对称处理
v(t) = ve + (vs - ve) * (1 - cos(π * (T - t) / T)) / 2;

当然,实际工程中不会直接用正弦,因为计算量太大。我们一般用多项式近似,或者查表法。

避坑指南:我曾经在一个项目中,把S曲线的加加速度设得太小,结果加速时间拉长了一倍,节拍完全跟不上。后来我总结了一个经验:加加速度的取值,一般设为加速度的5~10倍。这样既能平滑,又不至于太拖沓。

18.4 离线 vs 在线:怎么选?

很多初学者会问:到底用离线还是在线?我的回答是:看场景,别纠结

我列了一个决策表,供大家参考:

场景 推荐方式 理由
固定路径、固定速度 离线 省CPU,曲线可预优化
实时变速、变路径 在线 灵活,能响应外部指令
高精度轨迹(如激光切割) 离线+S曲线 平滑度可控,无实时抖动
多轴协同(如机器人) 在线+前瞻 需要实时调整各轴速度
低性能MCU 离线 计算量小,存储换时间

其实还有一种混合方式——离线规划+在线微调。我最近几个项目都在用这个思路:先离线算好一条基准曲线,然后在线根据反馈做小范围修正。既保证了平滑性,又保留了灵活性。大家可以试试。

18.5 小结

好了,这一章的内容就这些。总结几个要点:

  • 离线加减速:先算后跑,适合固定场景,省CPU
  • 在线加减速:边跑边算,适合实时场景,灵活但吃资源
  • 速度平滑处理:S曲线是主流,加加速度是关键参数
  • 选型建议:没有银弹,根据实际需求来

下一章我会讲梯形加减速与S形加减速的数学推导,到时候咱们把公式掰开了揉碎了讲。各位有什么问题,欢迎在评论区留言。我是老张,咱们下期见。

课后思考:如果你做一个桌面级3D打印机,你会选离线还是在线加减速?为什么?