一、机器人未知测量噪声的扩展卡尔曼滤波同时定位与地图绘制
1 扩展卡尔曼滤波(EKF-SLAM)概述 扩展卡尔曼滤波(EKF)是解决同时定位与地图绘制(SLAM)问题的经典方法。EKF-SLAM 通过非线性系统的高斯近似,将机器人位姿和地图特征的状态估计联合在一个概率框架中。当测量噪声未知时,需采用自适应或鲁棒方法增强滤波器性能。
2 未知测量噪声的挑战 测量噪声的统计特性(如协方差矩阵)通常假设为已知。若噪声统计不准确或未知,可能导致 EKF-SLAM 估计偏差甚至发散。解决方法包括噪声协方差自适应估计、鲁棒滤波设计或多模型滤波。
3 自适应 EKF-SLAM 方法 噪声协方差在线估计 通过滑动窗口或指数加权方法实时更新测量噪声协方差矩阵。例如,利用新息序列(innovation sequence)的统计特性调整噪声参数: [ \hat{R}k = \frac{1}{N}\sum{i=k-N+1}^k \nu_i \nu_i^T - H_k P_{k|k-1} H_k^T ] 其中 $\nu_i$ 为新息,$H_k$ 为观测矩阵,$P_{k|k-1}$ 为预测协方差。
鲁棒 EKF-SLAM 引入鲁棒代价函数(如 Huber 或 Tukey 权重)降低异常测量影响。通过调整新息的权重函数,抑制噪声统计不确定性带来的误差: [ \rho(\nu) = \begin{cases} \frac{1}{2}\nu^2 & |\nu| \leq c \ c|\nu| - \frac{1}{2}c^2 & |\nu| > c \end{cases} ]
4 多模型滤波方法 采用交互多模型(IMM)框架,并行运行多个 EKF 滤波器,每个滤波器对应不同的噪声假设。通过模型概率加权融合各滤波器输出,动态适应未知噪声环境。
5 实现步骤
- 状态预测 根据运动模型预测机器人位姿和地图特征状态: [ \hat{x}{k|k-1} = f(x{k-1}, u_k) ] [ P_{k|k-1} = F_k P_{k-1} F_k^T + Q_k ] 其中 $F_k$ 为状态转移雅可比矩阵,$Q_k$ 为过程噪声协方差。
- 观测更新 若噪声协方差未知,先通过新息序列估计 $\hat{R}k$,再计算卡尔曼增益: [ K_k = P{k|k-1} H_k^T (H_k P_{k|k-1} H_k^T + \hat{R}_k)^{-1} ]
- 状态修正 使用实际观测 $z_k$ 更新状态和协方差: [ \hat{x}k = \hat{x}{k|k-1} + K_k (z_k - h(\hat{x}{k|k-1})) ] [ P_k = (I - K_k H_k) P{k|k-1} ]
6 代码示例(Python 片段)
import numpy as np
def adaptive_ekf_slam(x_prev, P_prev, u, z, Q, R_initial, window_size=10):
# 状态预测
x_pred = motion_model(x_prev, u)
F = jacobian_motion(x_prev, u)
P_pred = F @ P_prev @ F.T + Q
# 观测预测与新息计算
z_pred = observation_model(x_pred)
H = jacobian_observation(x_pred)
nu = z - z_pred
# 滑动窗口估计噪声协方差
if len(innovation_buffer) >= window_size:
innovation_buffer.pop(0)
innovation_buffer.append(nu)
R_adapted = np.cov(innovation_buffer, rowvar=False) - H @ P_pred @ H.T
# 卡尔曼增益与更新
S = H @ P_pred @ H.T + R_adapted
K = P_pred @ H.T @ np.linalg.inv(S)
x_new = x_pred + K @ nu
P_new = (np.eye(len(x_pred)) - K @ H) @ P_pred
return x_new, P_new, R_adapted
7 注意事项
- 噪声自适应方法需平衡实时性与估计精度,窗口大小或遗忘因子需调参。
- 鲁棒方法可能增加计算复杂度,需在嵌入式系统中优化实现。
- 多模型方法对计算资源要求较高,适合噪声统计变化显著的场景。
三、运行结果
四、MATLAB 版本及参考文献
1 MATLAB 版本 2019b
2 参考文献 [1] 彭力,徐壮。带非线性约束的自适应高斯和卡尔曼滤波目标跟踪算法 [J].计算机测量与控制。2019


