一、课程导论:什么是运动控制滤波?为什么需要滤波?滤波算法的分类与选型指南

1.1 先聊聊我为什么开这门课

做运动控制这些年,我踩过不少坑。

记得刚入行那会儿,调试一台伺服电机。编码器反馈回来的速度信号,跳得跟心电图似的。我以为是硬件坏了,换了好几个编码器,问题依旧。后来一位老工程师看了一眼,淡淡说了句:「你滤波了吗?」

嗯,就是这句话,让我跟运动控制滤波结下了不解之缘。

说白了,运动控制滤波不是什么高深莫测的东西。它就是帮你把传感器信号里的「脏东西」去掉,让控制器看到真实的世界。你想想看,电机在转,编码器在测,但机械振动、电磁干扰、量化噪声……这些乱七八糟的东西全混在信号里。你不滤掉它们,控制器就会做出错误判断。

核心定义:运动控制滤波,是指对位置、速度、加速度、电流等运动相关信号进行数字处理,去除噪声、提取有用信息的过程。它是运动控制系统稳定运行的基础。

1.2 为什么需要滤波?我拿实际案例说

我做过一个项目,是给一台精密雕刻机做控制。刀具在高速旋转,主轴振动频率大概在200Hz左右。编码器反馈的位置信号里,混入了这个振动分量。结果呢?控制器以为刀具在来回抖动,拼命调整电机输出。电机越调越抖,最后工件表面全是振纹。

这就是典型的「噪声导致误动作」。

滤波要解决的核心问题,其实就三个:

  • 去除传感器噪声:编码器量化误差、ADC采样噪声、电磁干扰等。这些噪声频率高、幅度小,但足以让微分项(速度、加速度)剧烈跳动。
  • 抑制机械谐振:电机带动负载,中间有联轴器、皮带、丝杠。这些机械结构有固有频率,一旦激励起来,信号里就会出现谐振分量。不滤掉它,系统会震荡。
  • 平滑控制输出:你想想看,如果速度指令每毫秒都在跳变,电机受得了吗?电流环受得了吗?滤波能让指令变得平滑,减少机械磨损和发热。

我的经验:判断一个系统是否需要滤波,有个简单方法——把示波器探头接到编码器输出端,看位置信号的差分(也就是速度)。如果速度信号毛刺超过额定值的5%,你就该考虑滤波了。

1.3 滤波算法的分类——一张图讲清楚

滤波算法种类很多,但万变不离其宗。我个人习惯把它们分成三大类:

运动控制滤波算法 经典数字滤波 低通滤波 高通滤波 带通/带阻 陷波滤波 状态估计滤波 卡尔曼滤波 扩展卡尔曼 粒子滤波 互补滤波 智能/自适应滤波 自适应滤波 小波滤波 神经网络 模糊滤波 选型核心原则 实时性要求高 → 经典滤波(计算量小) 精度要求高、噪声复杂 → 状态估计滤波 噪声特性时变 → 智能/自适应滤波

1.4 各类滤波的适用场景——我帮你梳理

光分类还不够,你得知道什么时候用哪种。我直接上表格,一目了然:

算法类别 典型算法 计算量 延迟 适用场景
经典数字滤波 一阶低通、滑动平均、IIR/FIR 极低 编码器速度平滑、电流环滤波、简单噪声抑制
状态估计滤波 卡尔曼滤波、互补滤波 中等 中等 IMU姿态估计、多传感器融合、高精度位置跟踪
智能/自适应滤波 LMS自适应、小波去噪 较高 较高 噪声特性变化的环境、非平稳信号处理

我曾经踩过的坑:有一次在伺服驱动器上用卡尔曼滤波做速度估计,理论上精度很高。但没注意计算周期,卡尔曼滤波的矩阵运算在低端MCU上跑了2ms,而速度环周期只有1ms。结果滤波器还没算完,控制周期已经过了。嗯,从那以后我养成了一个习惯——先评估计算资源,再选滤波算法。

1.5 选型指南——我的四步法

选滤波算法,说白了就是做权衡。我总结了一个四步法,分享给你:

  1. 先看实时性要求:电流环通常需要10-20kHz的更新率,只能用一阶低通或滑动平均这种计算量极小的算法。位置环1kHz左右,可以用IIR或卡尔曼。
  2. 再看噪声特性:如果噪声是高频白噪声,一阶低通就够了。如果是特定频率的谐振,得用陷波滤波器。我做过一个项目,机械谐振在150Hz,用陷波滤波器一滤,世界清净了。
  3. 然后看精度需求:普通工业应用,位置精度0.1mm,经典滤波完全够。但如果是光刻机、精密测量,那就得上卡尔曼滤波甚至粒子滤波。
  4. 最后看硬件资源:MCU主频多少?RAM多大?浮点运算单元有没有?这些直接决定了你能跑什么算法。我见过有人在Cortex-M0上跑卡尔曼滤波,结果RAM爆了。

我的个人习惯:做原型验证时,先用一阶低通滤波把系统跑通。如果效果不理想,再逐步升级算法。别一上来就上卡尔曼滤波,调试起来够你喝一壶的。

1.6 一个简单的代码示例——一阶低通滤波

说了这么多,来点实际的。一阶低通滤波是运动控制里最常用的算法,没有之一。它的原理很简单:

// 一阶低通滤波实现
// y[n] = alpha * x[n] + (1 - alpha) * y[n-1]
// alpha = T / (T + RC),T为采样周期,RC为时间常数

float lowpass_filter(float input, float prev_output, float alpha)
{
    return alpha * input + (1.0f - alpha) * prev_output;
}

// 使用示例
float speed_filtered = 0.0f;  // 滤波后的速度
float alpha = 0.2f;           // 滤波系数,越小越平滑

// 在速度环中断中调用
speed_filtered = lowpass_filter(raw_speed, speed_filtered, alpha);

alpha的取值很关键。alpha越大,滤波越弱,响应越快;alpha越小,滤波越强,但延迟越大。我一般从0.2开始调,根据实际效果微调。

记住:滤波的本质是用延迟换平滑。你不可能既要响应快又要噪声小,这是物理规律。选型就是在延迟和噪声之间找到平衡点。

好了,这一章的内容就到这里。滤波算法的大门已经为你打开,后面我们会深入每一种算法的原理和实现。你准备好了吗?


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