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 图,把三种噪声的来源、特性、建模方法和影响串起来了。你可以把它当作本章的“思维导图”。

传感器噪声模型知识体系 传感器噪声模型知识体系 高斯噪声 量化噪声 有色噪声 正态分布,白噪声 均匀分布,白噪声 马尔可夫过程,有色 位置抖动,速度毛刺 低速速度估计抖动 轨迹长期偏移 Q矩阵,卡尔曼滤波 Δ²/12,提高分辨率 一阶马尔可夫,α参数 核心:噪声建模是轨迹优化的第一步,模型错了,后面全白费

2.7 实战建议:怎么选模型?

你可能会问:我到底该用哪种噪声模型?

我的建议是三步走:

  1. 先做静态测试。 把传感器固定,采集 1 分钟数据。看直方图——如果是钟形,高斯噪声为主;如果是平顶,量化噪声占主导。
  2. 再算自相关。 如果自相关函数在 lag=0 之外还有明显值,那就是有色噪声。我一般用 np.correlate 快速验证。
  3. 最后做频域分析。 画功率谱密度。低频能量高,必须建模有色噪声;全频段平坦,高斯噪声就够了。

避坑指南: 不要默认所有传感器噪声都是高斯白噪声。我见过太多人直接把 IMU 噪声设成高斯,结果轨迹发散。尤其是低成本传感器,有色噪声占比很大。你建模的时候,至少留一个 α 参数给有色噪声,哪怕 α=0.5,也比没有强。

嗯,这一节的内容就到这儿。噪声模型搞清楚了,后面讲滤波和优化才有根基。你先把这三种噪声的代码跑一遍,感受一下它们的区别——动手永远比看书来得快。