18、加减速控制:离线加减速与在线加减速、速度平滑处理
各位好,我是老张。今天咱们聊聊加减速控制。说实话,这个主题在运动控制里属于「看着简单,做起来全是坑」的那种。我入行头三年,至少有两回因为加减速没处理好,导致设备在客户现场「跳舞」——嗯,就是那种高频抖动,看着都心疼。
加减速控制,说白了就是解决一个问题:电机怎么从A点跑到B点,既快又稳。你想想看,如果直接给电机发一个阶跃速度指令,它会怎么样?轻则丢步,重则机械冲击。所以我们需要一套策略,让速度平滑地变化。
核心观点:加减速控制不是「要不要做」的问题,而是「怎么做才够好」的问题。离线加减速保下限,在线加减速冲上限,速度平滑处理则是两者的粘合剂。
18.1 离线加减速:先算好,再执行
离线加减速,我的理解就是「预计算」。在运动开始之前,我们已经把整条速度曲线算好了。控制器只管按时间戳查表输出就行。
我记得第一次做离线加减速,是在一个点胶机上。当时要求轨迹精度很高,但计算资源有限。我选择了离线方式——先把S曲线算好,存成数组,运行时直接查表。效果还不错,CPU占用率降了40%。
离线加减速的典型流程是这样的:
- 输入参数:起始速度、目标速度、加速度、加加速度
- 计算阶段:划分加速段、匀速段、减速段
- 生成表格:按固定时间间隔生成速度/位置序列
- 存储:存入RAM或Flash
- 执行:运行时按周期查表输出
它的优点很明显:
- 计算量小,适合低性能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打印机,你会选离线还是在线加减速?为什么?