3、传感器模型与噪声:高斯噪声模型、卡尔曼滤波基础、传感器标定

做目标点跟踪,传感器就是我们的眼睛。但说实话,没有哪双眼睛是完美的。我做了这么多年控制,见过太多因为传感器噪声没处理好,导致整个系统崩溃的案例。今天咱们就来聊聊,怎么跟这些噪声打交道。

3.1 高斯噪声模型——最常用的噪声假设

为什么几乎所有传感器模型都假设噪声是高斯分布?说白了,就是中心极限定理在撑腰。多个独立随机因素叠加,最终都会趋向正态分布。

高斯噪声的数学表达很简单:

# 一维高斯噪声
import numpy as np
import matplotlib.pyplot as plt

# 生成1000个高斯噪声样本
mu = 0.0      # 均值
sigma = 0.1   # 标准差
noise = np.random.normal(mu, sigma, 1000)

# 看看分布长什么样
plt.hist(noise, bins=30, density=True)
plt.title('高斯噪声分布')
plt.show()

嗯,这里要注意:高斯噪声有两个关键参数——均值 μ 和标准差 σ。均值代表系统偏差,标准差代表噪声强度。

核心要点:

  • 均值 μ = 0:说明传感器没有系统性偏差
  • 标准差 σ:决定了噪声的波动幅度
  • 68-95-99.7 法则:±1σ 内占68%,±2σ 内占95%

我在项目中遇到过一件事:有个激光雷达,厂家标称精度 ±2cm。我们直接用了,结果跟踪误差一直下不去。后来一测,实际噪声标准差是 3.5cm。你想想看,这差了快一倍。所以拿到传感器,第一件事就是实测噪声参数。

3.2 卡尔曼滤波基础——从噪声中提取真相

卡尔曼滤波,说白了就是一个「预测+修正」的循环。我刚开始学的时候觉得它很玄乎,其实核心就五个公式。

先看预测阶段:

# 卡尔曼滤波预测步骤
def predict(x, P, F, Q):
    """
    x: 状态估计
    P: 协方差矩阵
    F: 状态转移矩阵
    Q: 过程噪声协方差
    """
    x_pred = F @ x                    # 状态预测
    P_pred = F @ P @ F.T + Q          # 协方差预测
    return x_pred, P_pred

再看更新阶段:

# 卡尔曼滤波更新步骤
def update(x_pred, P_pred, z, H, R):
    """
    z: 测量值
    H: 观测矩阵
    R: 测量噪声协方差
    """
    y = z - H @ x_pred                # 残差计算
    S = H @ P_pred @ H.T + R          # 残差协方差
    K = P_pred @ H.T @ np.linalg.inv(S)  # 卡尔曼增益
    x = x_pred + K @ y                # 状态更新
    P = (np.eye(len(x)) - K @ H) @ P_pred  # 协方差更新
    return x, P

我的经验:卡尔曼增益 K 是灵魂。K 大,说明更相信测量;K 小,说明更相信预测。实际调参时,我一般先固定 R(测量噪声),再调 Q(过程噪声)。

为什么会这样?因为 R 可以从传感器标定中得到,而 Q 更多是凭经验。我曾经在一个无人机项目中,Q 设得太小,结果滤波器反应迟钝,目标跟丢了。后来把 Q 放大两倍,效果立竿见影。

3.3 传感器标定——消除系统性偏差

传感器标定,说白了就是给传感器「校零」。我见过太多人跳过这步,直接拿原始数据用,结果可想而知。

标定的核心流程:

  1. 静态标定:传感器固定不动,采集大量数据
  2. 偏差计算:计算均值,这就是零偏
  3. 噪声分析:计算标准差,这就是噪声水平
  4. 动态标定:让传感器运动,测试响应特性

来看一个实际的标定代码:

# 传感器标定示例
def calibrate_sensor(raw_data, true_value):
    """
    raw_data: 传感器原始读数
    true_value: 真实值(由高精度设备提供)
    """
    # 计算偏差
    bias = np.mean(raw_data - true_value)
    
    # 计算噪声标准差
    noise_std = np.std(raw_data - true_value)
    
    # 标定后的数据
    calibrated = raw_data - bias
    
    return calibrated, bias, noise_std

# 使用示例
raw_measurements = np.array([1.02, 1.05, 0.98, 1.01, 1.03])
true_position = 1.00

calibrated, bias, noise_std = calibrate_sensor(raw_measurements, true_position)
print(f"偏差: {bias:.3f}")
print(f"噪声标准差: {noise_std:.3f}")

避坑指南:我曾经犯过一个低级错误——标定时用的参考设备精度不够。结果标定完,误差反而更大了。记住:参考设备的精度至少要比被标定传感器高一个数量级。

3.4 知识体系总览

下面这张图,是我自己总结的传感器噪声处理框架。你把它记在心里,做目标跟踪时就不会乱:

传感器噪声处理知识体系 高斯噪声模型 卡尔曼滤波 传感器标定 均值 μ 标准差 σ 68-95-99.7法则 预测阶段 更新阶段 卡尔曼增益 K 静态标定 动态标定 偏差补偿 目标:从含噪声的测量中,提取最接近真实值的位置估计

这张图把三个模块串起来了。高斯噪声模型是理论基础,卡尔曼滤波是核心算法,传感器标定是前置条件。三者缺一不可。

本章小结:

  • 高斯噪声模型:用 μ 和 σ 描述传感器噪声特性
  • 卡尔曼滤波:预测+修正的迭代过程,核心是卡尔曼增益
  • 传感器标定:消除系统性偏差,获取真实噪声参数

说实话,这三个知识点看起来各自独立,但在实际项目中是环环相扣的。标定做不好,卡尔曼滤波的参数就设不准;噪声模型搞错了,滤波器性能就上不去。我建议你动手跑一遍上面的代码,把每个参数都调一调,感受一下它们之间的相互作用。

可可精品资料库