状态是系统内部用于预测未来的量,观测是传感器实际读到的量。编码器速度、相机位姿、IMU与运动模型各有误差;状态估计需要说明它们在什么假设下组合,以及组合后还有多少不确定性。
预测与更新
线性高斯模型下,Kalman滤波维护状态均值m和协方差P。运动模型为x_next=A x+w,观测为z=H x+v,噪声协方差分别是Q、R:
预测:m_minus = A m
P_minus = A P Aᵀ + Q
创新:r = z - H m_minus
S = H P_minus Hᵀ + R
增益:K = P_minus Hᵀ S⁻¹
更新:m = m_minus + K r
R越大,代表这一路测量在模型中越不可靠,更新通常更信任预测;Q越大,代表模型预测的不确定性增长越快。不要把Q、R当作随意的“平滑按钮”。传感器偏置、未建模加速或时间错位可能形成有结构的误差,应修正模型而不只调噪声。
协方差必须保持对称、半正定。实际计算常解线性方程而非显式求逆,并用Joseph形式更新协方差。缺测时只预测,不应把“没有读数”当成零测量。观测延迟时,当前状态和观测对应的时刻不同,也不能直接更新。
什么时候需要EKF或粒子滤波
EKF把非线性运动与观测在当前估计附近线性化,使用雅可比传播。它的单个高斯近似可能无法表示“机器人在两条相似走廊中任意一条”的多峰信念;较差初值和强非线性也可能使它不一致。
粒子滤波用一组带权样本表示信念,适合多峰分布,但在高维状态中维持有效覆盖很昂贵。权重退化时要检查有效样本数、重采样与提议分布。重复重采样会减少多样性,并不能凭空产生传感器没有提供的信息。定位的贝叶斯建模与示例见Georgia Tech教材的定位章节。
有缺测的数值实验
estimation_lab.py用常速度状态[位置,速度]、0.1秒步长、随机加速度过程噪声和标准差0.3米的位置测量;每十帧缺失两帧观测。它需要NumPy,不读取真实传感器。
python estimation_lab.py
2026-10-24以Python 3.12.14、NumPy 2.3.5、种子7执行,240个有观测帧上,原始位置RMSE约0.2853米,滤波约0.1055米;缺测帧预测RMSE约0.1046米。检查记录保留完整数值。两种观测RMSE使用同一组帧,避免把缺测或起始误差混进不公平比较;这个生成数据实验不能代表真实定位精度。
诊断与练习
创新应结合其协方差S查看。持续同号的大创新可能来自偏置或运动模型错误;创新很小也可能是Q、R设得不合理。评估还应检查置信区间覆盖与一致性,而非仅看轨迹光滑程度。
给观测加入0.5米固定偏置,观察滤波是否仍“自信”,解释为什么白噪声假设失效。再加入一个偏置状态,思考仅靠同一路位置测量是否足以把真实位置和偏置分开。面试自查:滤波与平滑有什么区别?来自同一原始传感器的两个估计为何不能总当成独立测量重复融合?