一文掌握卡尔曼滤波
1、卡尔曼滤波的本质
卡尔曼滤波(Kalman Filter, KF)并非传统意义上的滤波器,而是一套动态系统状态的最优估计算法框架。其核心思想融合了:
-
贝叶斯推断:通过先验分布与观测数据更新后验概率
-
最小均方误差(MMSE)准则:寻找使估计误差方差最小的状态值
-
线性系统理论:状态空间模型描述系统演化规律
状态空间模型(数学核心)
状态方程 : x k = F k x k − 1 + B k u k + w k 观测方程 : z k = H k x k + v k \begin{align*} \text{状态方程} &: \quad \mathbf{x}_k = \mathbf{F}_k \mathbf{x}_{k-1} + \mathbf{B}_k \mathbf{u}_k + \mathbf{w}_k \\ \text{观测方程} &: \quad \mathbf{z}_k = \mathbf{H}_k \mathbf{x}_k + \mathbf{v}_k \end{align*} 状态方程观测方程:xk=Fkxk−1+Bkuk+wk:zk=Hkxk+vk
其中:
x k \mathbf{x}_k xk:k时刻系统状态向量(需估计的隐藏变量)
F k \mathbf{F}_k Fk:状态转移矩阵(描述系统动态)
w k ∼ N ( 0 , Q k ) \mathbf{w}_k \sim \mathcal{N}(0, \mathbf{Q}_k) wk∼N(0,Qk):过程噪声(建模不确定性)
z k \mathbf{z}_k zk:观测向量
v k ∼ N ( 0 , R k ) \mathbf{v}_k \sim \mathcal{N}(0, \mathbf{R}_k) vk∼N(0,Rk):观测噪声
2、卡尔曼滤波的五步迭代
- 算法步骤详解
-
状态预测(时间更新) x ^ k ∣ k − 1 = F k x ^ k − 1 ∣ k − 1 + B k u k \hat{\mathbf{x}}_{k|k-1} = \mathbf{F}_k \hat{\mathbf{x}}_{k-1|k-1} + \mathbf{B}_k \mathbf{u}_k x^k∣k−1=Fkx^k−1∣k−1+Bkuk
物理意义:基于系统动力学预测当前状态 -
协方差预测 P k ∣ k − 1 = F k P k − 1 ∣ k − 1 F k T + Q k \mathbf{P}_{k|k-1} = \mathbf{F}_k \mathbf{P}_{k-1|k-1} \mathbf{F}_k^T + \mathbf{Q}_k Pk∣k−1=FkPk−1∣k−1FkT+Qk
关键洞察:不确定性随系统演化扩散 -
卡尔曼增益计算 : K k = P k ∣ k − 1 H k T ( H k P k ∣ k − 1 H k T + R k ) − 1 \mathbf{K}_k = \mathbf{P}_{k|k-1} \mathbf{H}_k^T (\mathbf{H}_k \mathbf{P}_{k|k-1} \mathbf{H}_k^T + \mathbf{R}_k)^{-1} Kk=Pk∣k−1HkT(HkPk∣k−1HkT+Rk)−1
本质:权衡模型预测与观测数据的权重分配器 -
状态更新 : x ^ k ∣ k = x ^ k ∣ k − 1 + K k ( z k − H k x ^ k ∣ k − 1 ) \hat{\mathbf{x}}_{k|k} = \hat{\mathbf{x}}_{k|k-1} + \mathbf{K}_k (\mathbf{z}_k - \mathbf{H}_k \hat{\mathbf{x}}_{k|k-1}) x^k∣k=x^k∣k−1+Kk(zk−Hkx^k∣k−1)
创新之处:用观测残差修正预测值 -
协方差更新 : P k ∣ k = ( I − K k H k ) P k ∣ k − 1 \mathbf{P}_{k|k} = (\mathbf{I} - \mathbf{K}_k \mathbf{H}_k) \mathbf{P}_{k|k-1} Pk∣k=(I−KkHk)Pk∣k−1
效果:融合信息后不确定性降低
-
3、突破线性限制
3.1 扩展卡尔曼滤波(EKF)
-
核心思想:在非线性系统的工作点进行一阶泰勒展开
-
局限:强非线性下雅可比矩阵计算导致发散
-
代码示例:
# EKF中的雅可比计算示例(Python)
from autograd import jacobian
def state_func(x):
return np.array([x[0] + 0.1*x[1], x[1] + 0.05*x[0]**2])
F_jac = jacobian(state_func) # 自动微分求雅可比矩阵
3.2 无迹卡尔曼滤波(UKF)
-
革命性创新:采用无迹变换(Unscented Transform)
-
操作流程:
-
选择一组Sigma点(确定性采样)
-
非线性传播Sigma点
-
加权重建后验分布
-
-
优势:精度达二阶泰勒展开,无需雅可比矩阵
3.3 粒子滤波(PF)
-
适用场景:非高斯、多峰分布系统
-
核心方法:蒙特卡洛采样 + 重要性重采样
-
代价:计算复杂度随粒子数线性增长
4、工程实践
参数调优的艺术
参数 | 物理意义 | 调优方法 | 典型场景 |
---|---|---|---|
Q \mathbf{Q} Q | 过程噪声协方差 | 自适应估计或灵敏度分析 | 无人机突遇强风扰动 |
R \mathbf{R} R | 观测噪声协方 传感器标定数据分 激光雷达在雾天可靠性下降 | ||
P 0 \mathbf{P}_0 P0 | 初始估计协方差 | 设置为较大对角阵 | 系统启动时位置未知 |
故障诊断表
现象 | 可能原因 | 解决方案 |
---|---|---|
估计值发散 | Q \mathbf{Q} Q | 设置过小 增大过程噪声协方差 |
估计滞后于真实状态 | R \mathbf{R} R | 设置过大 降低观测噪声权重 |
更新后协方差增大 | 观测模型 H \mathbf{H} H 错误 | 检查传感器标定矩阵 |
5、前沿演进
5.1 神经卡尔曼滤波(Neural Kalman Filters)**
-
架构:用LSTM学习状态转移函数 f ( ⋅ ) f(\cdot) f(⋅)
-
优势:自适应复杂动态,避免人工建模误差
-
论文: “Learning Kalman Aggregation Networks” (ICML 2023)
5.2 联邦卡尔曼滤波
-
场景:多设备协同定位(如车联网)
-
机制: x ^ g = ( ∑ P i − 1 ) − 1 ( ∑ P i − 1 x ^ i ) \hat{\mathbf{x}}_g = \Big( \sum \mathbf{P}_i^{-1} \Big)^{-1} \Big( \sum \mathbf{P}_i^{-1} \hat{\mathbf{x}}_i \Big) x^g=(∑Pi−1)−1(∑Pi−1x^i)
-
隐私保护:仅共享局部估计值而非原始数据
5.3 量子卡尔曼滤波
-
突破:利用量子叠加态并行处理不确定性传播
-
潜力:导航精度提升数个数量级(理论极限)
6、代码实战
无人机姿态 仿真环境配置
import numpy as np
from filterpy.kalman import UnscentedKalmanFilter as UKF
from filterpy.common import Q_discrete_white_noise
# 状态定义 [角度, 角速度]
def fx(x, dt):
return np.array([x[0] + x[1]*dt, x[1]]) # 匀速模型
def hx(x):
return np.array([x[0]]) # 仅观测角度
# UKF初始化
ukf = UKF(dim_x=2, dim_z=1, dt=0.01, points=MerweScaledSigmaPoints(2, alpha=0.1, beta=2., kappa=0.))
ukf.x = np.array([0., 0.]) # 初始状态
ukf.P = np.diag([0.1, 0.3]) # 初始协方差
ukf.R *= 0.01 # 观测噪声
ukf.Q = Q_discrete_white_noise(2, dt=0.01, var=0.001) # 过程噪声
性能对比(RMSE结果)
运动状态 | KF | EKF | UKF |
---|---|---|---|
匀速直线 | 0.12° | 0.13° | 0.11° |
急转弯(5g) | 发散 | 1.85° | 0.93° |
强湍流扰动 | 4.27° | 2.15° | 1.08° |
7、总结
卡尔曼滤波的精髓在于平衡预测与观测的艺术:
- 预测代表对系统内在规律的理解(先验知识)
- 观测象征对外部世界的感知(经验证据)
- 卡尔曼增益则是人类理性权衡两者的智慧化身
我是小鱼:
- CSDN 博客专家;
- 阿里云 专家博主;
- 51CTO博客专家;
- 企业认证金牌面试官;
- 多个名企认证&特邀讲师等;
- 名企签约职场面试培训、职场规划师;
- 多个国内主流技术社区的认证专家博主;
- 多款主流产品(阿里云等)评测一等奖获得者;
关注小鱼,学习【机器视觉与目标检测】最新最全的领域知识。