3. 力信号处理:低通滤波、滑动平均滤波、卡尔曼滤波在力信号中的应用
力信号这东西,说实话,比位置信号难伺候多了。
我做机器人力控这些年,最头疼的往往不是控制算法本身,而是传感器传回来的那堆「毛刺」。你想想看,电机一转,振动就来了;机器人一加速,噪声就冒出来了。如果不做滤波,力控根本没法用——系统会抖得像筛糠一样。
今天咱们就聊聊三种最常用的力信号滤波方法。我个人习惯把它们分成三类:简单粗暴型、稳扎稳打型、聪明自适应型。分别对应低通滤波、滑动平均滤波和卡尔曼滤波。
3.1 低通滤波:最基础的「削峰填谷」
低通滤波,说白了就是让低频信号通过,把高频噪声拦在外面。力信号里的噪声大多是高频的,比如电机换向时的尖峰、机械振动带来的波动。低通滤波正好对症下药。
最常用的一阶RC低通滤波,离散化之后长这样:
y[k] = α * x[k] + (1 - α) * y[k-1]
其中 α = T / (T + τ),T 是采样周期,τ 是时间常数。
α 越小,滤波越狠,但延迟也越大。我在项目中遇到过这种情况:为了把噪声压干净,把 α 调到了 0.01,结果力信号滞后了将近 100 毫秒。机器人抓取时,明明已经碰到物体了,力反馈还在说「没碰到」。嗯,这就是典型的过犹不及。
低通滤波的优点是简单、计算量小。缺点也很明显——它不分青红皂白,把有用的高频力信号也一起滤掉了。比如你快速敲击一个物体,力信号里那个陡峭的上升沿,低通滤波会把它磨圆了。
3.2 滑动平均滤波:用「平均」换「平滑」
滑动平均滤波的思路更直观:取最近 N 个采样点的平均值,作为当前输出。
y[k] = (x[k] + x[k-1] + ... + x[k-N+1]) / N
N 越大,平滑效果越好,但延迟也越大。这跟低通滤波有点像,但滑动平均有个好处——它对周期性噪声的抑制效果特别好。比如 50Hz 的工频干扰,如果你把窗口长度设成 20ms 的整数倍,理论上能完全滤掉。
我曾经在一个协作机器人项目里用过滑动平均。当时力传感器上有明显的 100Hz 振动,是电机 PWM 频率带来的。我试了低通滤波,效果一般,因为截止频率设低了会丢信号,设高了又滤不干净。后来换成滑动平均,窗口长度取 10ms(采样率 1kHz 时 N=10),效果立竿见影。
滑动平均还有一个变种叫「加权滑动平均」,给最近的采样点更大的权重。我个人不太常用,因为参数调起来比较麻烦,而且效果提升有限。
3.3 卡尔曼滤波:聪明但「贵」
卡尔曼滤波,很多人一听就头大。其实它的核心思想很简单:用模型预测 + 测量修正,得到一个比单纯测量更准的估计值。
对于力信号,我们可以把力建模成一个「缓慢变化 + 随机扰动」的过程。卡尔曼滤波会同时考虑「模型预测的力」和「传感器测到的力」,然后根据两者的置信度做加权平均。
卡尔曼滤波的五个核心公式,我直接贴出来:
// 预测
x_pred = A * x_est + B * u
P_pred = A * P_est * A^T + Q
// 更新
K = P_pred * H^T * (H * P_pred * H^T + R)^(-1)
x_est = x_pred + K * (z - H * x_pred)
P_est = (I - K * H) * P_pred
看着复杂,但实际用起来,大部分参数都是固定的。你需要调的其实就两个:过程噪声协方差 Q 和 测量噪声协方差 R。
Q 越大,说明你越不相信模型,卡尔曼滤波会更依赖测量值。R 越大,说明你越不相信传感器,滤波会更依赖模型预测。
我在做力控打磨机器人时用过卡尔曼滤波。当时的情况是:力传感器本身噪声不大,但机器人运动时会产生很大的惯性力干扰。我用了一个简单的力模型(把力当成常数 + 随机游走),Q 设得很小,R 设得适中。结果卡尔曼滤波不仅滤掉了噪声,还自动补偿了一部分惯性力。效果比低通滤波好太多了。
但卡尔曼滤波也有缺点:计算量大,参数调起来费劲。如果你只是做个简单的力控演示,用低通滤波就够了。但如果你要做高精度的力控应用,比如精密装配、力控打磨,那卡尔曼滤波值得你花时间去调。
3.4 三种滤波方法的对比
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 低通滤波 | 简单、计算量小、实时性好 | 延迟随滤波强度增加、会丢失高频信号 | 噪声频率固定、对延迟不敏感的场景 |
| 滑动平均滤波 | 对周期性噪声效果好、实现简单 | 固定延迟、需要存储 N 个数据 | 有明确周期噪声、采样率较高的场景 |
| 卡尔曼滤波 | 自适应、响应快、精度高 | 计算量大、参数调优复杂 | 高精度力控、信号模型已知的场景 |
3.5 我的选择建议
如果你刚开始做力控,我建议先从低通滤波入手。把 α 调好,看看效果。如果发现延迟太大,再试试滑动平均。如果这两个都不满意,再上卡尔曼滤波。
千万别一上来就搞卡尔曼滤波。我曾经见过一个新手,花了三天调卡尔曼参数,最后发现用低通滤波效果差不多。嗯,这就是典型的「杀鸡用牛刀」。
另外,不管你用哪种滤波,都要记住一点:滤波后的信号一定要做零偏校准。力传感器在静止时输出不一定为零,这个偏差如果不消除,会直接影响力控的精度。我一般会在机器人上电后,让机器人保持静止 1 秒钟,取这段时间的力信号平均值作为零偏,然后在后续的每个力信号里减去这个值。
好了,力信号处理就聊到这儿。这三种方法各有千秋,关键是根据你的应用场景选合适的。下一节咱们会聊力控的另一个核心问题——如何把处理好的力信号用起来。