2. 传感器噪声模型:高斯噪声、量化噪声、有色噪声对轨迹的影响,以及如何建模
做轨迹优化的人,最怕什么?
不是算法不收敛,而是传感器给你“假数据”。我早年调试一个移动机器人,明明地面是平的,IMU 读数却像坐过山车。后来才发现,我根本没搞清楚噪声长什么样。
这一节,咱们就把三种最常见的噪声——高斯噪声、量化噪声、有色噪声——掰开揉碎。我会告诉你它们怎么影响轨迹,以及怎么在代码里建模。
2.1 高斯噪声:最基础的假设,也是最常见的坑
高斯噪声,说白了就是“随机误差”。它服从正态分布,均值是 0,方差是 σ²。你想想看,温度波动、电路热噪声、AD 转换的随机抖动,最后都近似成高斯噪声。
核心公式:
w ~ N(0, Q)
其中 Q 是协方差矩阵。对于一维传感器,Q = σ²;对于多维(比如 IMU 的加速度计),Q 是一个对角矩阵。
我在项目中遇到过一个问题:用卡尔曼滤波做状态估计,明明模型没错,但轨迹就是抖。查了两天,发现是 Q 矩阵设得太小——我太相信传感器了。实际上,低成本 MEMS 陀螺仪的噪声方差,比 datasheet 上写的要大 3-5 倍。
我的习惯: 拿到新传感器,先做静态采集。把传感器放平,录 10 分钟数据,算标准差。这个值,才是你建模用的 σ。
2.2 量化噪声:数字世界的“锯齿”
模拟信号转成数字,必然有量化误差。比如一个 12 位 ADC,量程 0-3.3V,分辨率是 3.3 / 4096 ≈ 0.8 mV。这个 0.8 mV 的台阶,就是量化噪声的来源。
量化噪声不是高斯分布——它是均匀分布。为什么?因为量化误差在 ±½ LSB 之间等概率出现。
| 噪声类型 | 分布 | 均值 | 方差 |
|---|---|---|---|
| 高斯噪声 | 正态分布 | 0 | σ² |
| 量化噪声 | 均匀分布 | 0 | Δ² / 12 |
Δ 是量化步长。对于 12 位 ADC,Δ = 0.8 mV,方差就是 (0.8²)/12 ≈ 0.053 mV²。
量化噪声对轨迹的影响很隐蔽。它不会让轨迹剧烈抖动,而是引入一种“锯齿状”的微小波动。尤其是在低速运动时,这种波动会被微分放大——你算速度的时候,一阶差分会把量化噪声放大。
我曾经踩过的坑: 用编码器测位置,分辨率 0.1 mm,觉得够用了。结果做轨迹跟踪时,速度估计抖得像筛子。后来在速度观测器里显式建模了量化噪声方差,才压住抖动。
2.3 有色噪声:真正的“隐形杀手”
高斯噪声和量化噪声都是白噪声——当前时刻的噪声与过去无关。但有色噪声不一样:它有“记忆”。
举个例子:IMU 的零偏稳定性。陀螺仪开机时有一个固定偏置,但这个偏置会缓慢漂移。这种漂移,就是一阶有色噪声(也叫随机游走)。
有色噪声的数学模型通常用一阶马尔可夫过程:
x_k = α * x_{k-1} + w_k
其中 α 是相关系数(0 < α < 1),w_k 是高斯白噪声。α 越接近 1,噪声的“记忆”越长,低频成分越强。
为什么说有色噪声是隐形杀手?因为它在频域上能量集中在低频。低频噪声很难被滤波器滤掉——你想想看,低通滤波器会把高频噪声干掉,但低频噪声和真实信号混在一起,你分不清。
关键认知: 轨迹抖动优化,本质上是在和有色噪声作斗争。高斯噪声可以用滤波平滑掉,量化噪声可以通过提高分辨率缓解,但有色噪声——你必须建模它,否则它永远在那里。
2.4 三种噪声对轨迹的影响对比
我整理了一个表格,方便你直观对比:
| 噪声类型 | 时域表现 | 频域特征 | 对轨迹的影响 | 建模难度 |
|---|---|---|---|---|
| 高斯噪声 | 随机毛刺 | 全频段均匀 | 位置抖动,速度毛刺 | 低 |
| 量化噪声 | 微小锯齿 | 高频为主 | 低速时速度估计抖动 | 中 |
| 有色噪声 | 缓慢漂移 | 低频集中 | 轨迹长期偏移,稳态误差 | 高 |
2.5 如何在代码中建模?
直接上代码。我习惯用 Python + NumPy 来仿真噪声模型,验证算法效果。
import numpy as np
def gaussian_noise(size, sigma=0.1):
"""高斯噪声"""
return np.random.normal(0, sigma, size)
def quantization_noise(size, delta=0.01):
"""量化噪声:均匀分布"""
return np.random.uniform(-delta/2, delta/2, size)
def colored_noise(size, alpha=0.9, sigma=0.1):
"""一阶有色噪声(马尔可夫过程)"""
x = np.zeros(size)
w = np.random.normal(0, sigma, size)
for k in range(1, size):
x[k] = alpha * x[k-1] + w[k]
return x
# 示例:生成 1000 个点
n = 1000
g = gaussian_noise(n, sigma=0.1)
q = quantization_noise(n, delta=0.02)
c = colored_noise(n, alpha=0.95, sigma=0.05)
注意: 有色噪声的 α 参数很敏感。α=0.9 和 α=0.99 的噪声特性完全不同。我建议你画一下功率谱密度(PSD),看看低频能量占比。如果 PSD 在低频段明显高于高频段,那就是有色噪声。
2.6 知识体系:一张图看懂
下面这张 SVG 图,把三种噪声的来源、特性、建模方法和影响串起来了。你可以把它当作本章的“思维导图”。
2.7 实战建议:怎么选模型?
你可能会问:我到底该用哪种噪声模型?
我的建议是三步走:
- 先做静态测试。 把传感器固定,采集 1 分钟数据。看直方图——如果是钟形,高斯噪声为主;如果是平顶,量化噪声占主导。
- 再算自相关。 如果自相关函数在 lag=0 之外还有明显值,那就是有色噪声。我一般用 np.correlate 快速验证。
- 最后做频域分析。 画功率谱密度。低频能量高,必须建模有色噪声;全频段平坦,高斯噪声就够了。
避坑指南: 不要默认所有传感器噪声都是高斯白噪声。我见过太多人直接把 IMU 噪声设成高斯,结果轨迹发散。尤其是低成本传感器,有色噪声占比很大。你建模的时候,至少留一个 α 参数给有色噪声,哪怕 α=0.5,也比没有强。
嗯,这一节的内容就到这儿。噪声模型搞清楚了,后面讲滤波和优化才有根基。你先把这三种噪声的代码跑一遍,感受一下它们的区别——动手永远比看书来得快。