4. 加速度平滑的数学基础:滤波器的基本原理
做纵向控制这些年,我踩过最大的坑就是——加速度信号太「脏」了。
你想想看,车辆在真实道路上跑,传感器采集到的加速度信号,那叫一个「毛刺丛生」。直接拿这个信号去控制油门刹车,结果就是车辆一顿一顿的,乘客晕车,司机骂娘。
所以,加速度平滑,说白了就是给信号「洗个澡」。怎么洗?用滤波器。
4.1 为什么需要滤波器?
先看一个真实场景。我当年做ACC(自适应巡航)标定时,遇到过这么个情况:
前车轻微颠簸了一下,我的加速度信号瞬间跳变。控制器以为前车急加速,立马跟着猛踩油门。结果呢?前车根本没加速,我的车却窜了出去。
这就是典型的「信号噪声引发误动作」。
加速度信号里的噪声来源很多:
- 传感器噪声:IMU本身就有高频抖动
- 路面激励:减速带、坑洼路面带来的机械振动
- 量化误差:ADC采样时的精度损失
- 通信干扰:CAN总线上的电磁干扰
这些噪声叠加在一起,加速度信号就变成了「锯齿状」。直接用它做控制,后果就是:
- 油门/刹车频繁动作,执行器寿命缩短
- 车辆纵向冲击度(Jerk)过大,舒适性极差
- 控制闭环不稳定,甚至引发震荡
核心结论:滤波不是可选项,而是纵向控制系统的必选项。没有滤波的加速度信号,就像没经过滤的咖啡——又苦又涩。
4.2 低通滤波:最经典的平滑工具
低通滤波,说白了就是「放慢信号的变化速度」。高频噪声被滤掉,低频的「真信号」保留下来。
我习惯用一阶低通滤波器,因为它简单、计算量小、实时性好。在嵌入式系统里跑起来毫无压力。
一阶低通滤波的数学公式:
y[n] = α * x[n] + (1 - α) * y[n-1]
其中:
y[n]:当前滤波后的值x[n]:当前原始采样值y[n-1]:上一次滤波后的值α:滤波系数,取值范围0~1
α 越大,滤波效果越弱,响应越快;α 越小,滤波效果越强,响应越慢。
α 怎么选?我一般用这个经验公式:
α = 2π * fc * Ts
其中:
fc:截止频率(Hz),决定了哪些频率被保留Ts:采样周期(秒)
我的经验:在纵向控制中,加速度信号的截止频率一般设在 2~5 Hz。低于这个频率的视为有效信号,高于这个频率的视为噪声。我曾经试过设到10Hz,结果路面振动全进来了,车抖得跟筛子似的。
来看一个实际代码示例:
// 一阶低通滤波器实现
float lowpass_filter(float input, float prev_output, float alpha) {
return alpha * input + (1.0f - alpha) * prev_output;
}
// 使用示例
float accel_raw = get_imu_accel(); // 原始加速度
float accel_filtered = lowpass_filter(accel_raw, accel_prev, 0.1f);
accel_prev = accel_filtered; // 保存上一次值
这段代码看着简单,但有个坑——α 的取值要和采样频率匹配。如果采样频率变了,α 必须跟着调。我当年就因为这个吃过亏,换了传感器后忘了改参数,结果滤波效果完全不对。
4.3 移动平均滤波:另一种思路
低通滤波是「递归」的,每次只依赖上一次的结果。移动平均滤波则是「非递归」的,它取最近 N 个点的平均值。
公式也很直观:
y[n] = (x[n] + x[n-1] + ... + x[n-N+1]) / N
N 是窗口大小。N 越大,平滑效果越好,但延迟也越大。
移动平均滤波的好处:
- 实现简单:不需要调参,设个窗口大小就行
- 相位线性:不会像低通滤波那样引入相位畸变
- 对周期性噪声效果好:比如发动机的振动频率
但缺点也很明显:
- 延迟大:窗口 N 越大,延迟越明显
- 内存占用:需要缓存 N 个历史数据
- 对突变不敏感:真正的急加速信号也会被平滑掉
注意:移动平均滤波不适合用在需要快速响应的场景。比如紧急制动时,你希望加速度信号立刻反映出来,但移动平均滤波会「拖后腿」,导致制动响应变慢。我曾经在AEB(自动紧急制动)系统里试过,差点没刹住车。
代码实现:
// 移动平均滤波器
#define WINDOW_SIZE 10
float buffer[WINDOW_SIZE] = {0};
int buffer_index = 0;
float sum = 0.0f;
float moving_average_filter(float input) {
// 减去最旧的值
sum -= buffer[buffer_index];
// 存入新值
buffer[buffer_index] = input;
// 加上新值
sum += input;
// 更新索引
buffer_index = (buffer_index + 1) % WINDOW_SIZE;
// 返回平均值
return sum / WINDOW_SIZE;
}
4.4 两种滤波器的对比
我整理了一个对比表,方便你根据场景选择:
| 特性 | 一阶低通滤波 | 移动平均滤波 |
|---|---|---|
| 计算复杂度 | 低(1次乘加) | 中(N次加法+1次除法) |
| 内存需求 | 低(1个变量) | 高(N个变量) |
| 延迟 | 低(取决于α) | 高(N/2个采样周期) |
| 调参难度 | 中(需要理解截止频率) | 低(设窗口大小即可) |
| 对突变响应 | 快(指数衰减) | 慢(线性过渡) |
| 适用场景 | 实时控制、快速响应 | 数据后处理、离线分析 |
我个人习惯:在纵向控制的实时控制回路里,用一阶低通滤波。在数据后处理和诊断分析时,用移动平均滤波。两者互补,不冲突。
4.5 核心知识体系
下面这张图,是我梳理的本章知识结构。你看一眼就能明白滤波在纵向控制中的位置:
从这张图能看出来,滤波器的选择不是孤立的。它和你的控制目标、硬件能力、实时性要求都有关。没有「最好」的滤波器,只有「最合适」的滤波器。
避坑指南:我曾经在一个项目里,为了追求极致的平滑效果,把低通滤波的α设得特别小。结果加速度信号是平滑了,但控制响应慢得像「老年痴呆」。前车都刹停了,我的车还在慢慢减速。所以,滤波和平滑之间,永远是个trade-off。
好了,这一章我们聊了滤波器的基本原理。低通滤波和移动平均滤波,是纵向控制里最常用的两种工具。下一章,我们会深入讨论如何在实际工程中调参,以及如何应对各种边界情况。
公众号:蓝海资料掘金营,微信deep3321