当前位置: 首页 > article >正文

卡尔曼滤波算法(Kalman Filter, KF)深入推导

卡尔曼滤波是一种基于贝叶斯估计最小均方误差(MMSE)的最优状态估计算法。它适用于线性高斯系统,其核心思想是对状态进行递归估计,在预测和测量之间动态调整,最小化估计误差。


1. 线性系统建模

考虑离散时间线性动态系统:

x k = F k − 1 x k − 1 + B k − 1 u k − 1 + w k − 1 \mathbf{x}_k = \mathbf{F}_{k-1} \mathbf{x}_{k-1} + \mathbf{B}_{k-1} \mathbf{u}_{k-1} + \mathbf{w}_{k-1} xk=Fk1xk1+Bk1uk1+wk1

z k = H k x k + v k \mathbf{z}_k = \mathbf{H}_k \mathbf{x}_k + \mathbf{v}_k zk=Hkxk+vk

其中:

  • x k ∈ R n \mathbf{x}_k \in \mathbb{R}^n xkRn 是系统的状态向量(例如物体位置、速度等)。
  • F k \mathbf{F}_k Fk状态转移矩阵,描述状态如何从 k − 1 k-1 k1 时刻演化到 k k k 时刻。
  • B k \mathbf{B}_k Bk控制矩阵,映射外部控制输入 u k \mathbf{u}_k uk 到状态空间。
  • w k ∼ N ( 0 , Q k ) \mathbf{w}_k \sim \mathcal{N}(0, \mathbf{Q}_k) wkN(0,Qk)过程噪声,其协方差矩阵为 Q k \mathbf{Q}_k Qk
  • z k ∈ R m \mathbf{z}_k \in \mathbb{R}^m zkRm测量值,通过测量矩阵 H k \mathbf{H}_k Hk 从状态 x k \mathbf{x}_k xk 映射而来。
  • v k ∼ N ( 0 , R k ) \mathbf{v}_k \sim \mathcal{N}(0, \mathbf{R}_k) vkN(0,Rk)测量噪声,其协方差矩阵为 R k \mathbf{R}_k Rk

假设:

  1. 状态噪声 w k \mathbf{w}_k wk 和测量噪声 v k \mathbf{v}_k vk 互不相关
    E [ w i v j T ] = 0 , ∀ i , j \mathbb{E}[\mathbf{w}_i \mathbf{v}_j^T] = 0, \quad \forall i,j E[wivjT]=0,i,j
  2. 初始状态 x 0 \mathbf{x}_0 x0 服从高斯分布:
    x 0 ∼ N ( x ^ 0 , P 0 ) \mathbf{x}_0 \sim \mathcal{N}(\hat{\mathbf{x}}_0, \mathbf{P}_0) x0N(x^0,P0)

2. 预测步骤(先验估计)

我们希望根据 k − 1 k-1 k1 时刻的状态估计 x ^ k − 1 \hat{\mathbf{x}}_{k-1} x^k1 和协方差 P k − 1 \mathbf{P}_{k-1} Pk1,预测当前状态 x k \mathbf{x}_k xk 的分布。

状态预测(State Prediction)

x ^ k ∣ k − 1 = F k − 1 x ^ k − 1 + B k − 1 u k − 1 \hat{\mathbf{x}}_{k|k-1} = \mathbf{F}_{k-1} \hat{\mathbf{x}}_{k-1} + \mathbf{B}_{k-1} \mathbf{u}_{k-1} x^kk1=Fk1x^k1+Bk1uk1

协方差预测(Covariance Prediction)

P k ∣ k − 1 = F k − 1 P k − 1 F k − 1 T + Q k − 1 \mathbf{P}_{k|k-1} = \mathbf{F}_{k-1} \mathbf{P}_{k-1} \mathbf{F}_{k-1}^T + \mathbf{Q}_{k-1} Pkk1=Fk1Pk1Fk1T+Qk1


3. 更新步骤(后验估计)

当新的测量 z k \mathbf{z}_k zk 到来后,我们需要结合预测值 x ^ k ∣ k − 1 \hat{\mathbf{x}}_{k|k-1} x^kk1 和测量值 z k \mathbf{z}_k zk 进行修正,使最终估计更加准确。

计算创新(Innovation)

y ~ k = z k − H k x ^ k ∣ k − 1 \tilde{\mathbf{y}}_k = \mathbf{z}_k - \mathbf{H}_k \hat{\mathbf{x}}_{k|k-1} y~k=zkHkx^kk1

计算创新协方差(Innovation Covariance)

S k = H k P k ∣ k − 1 H k T + R k \mathbf{S}_k = \mathbf{H}_k \mathbf{P}_{k|k-1} \mathbf{H}_k^T + \mathbf{R}_k Sk=HkPkk1HkT+Rk

计算卡尔曼增益(Kalman Gain)

K k = P k ∣ k − 1 H k T S k − 1 \mathbf{K}_k = \mathbf{P}_{k|k-1} \mathbf{H}_k^T \mathbf{S}_k^{-1} Kk=Pkk1HkTSk1

更新状态估计

x ^ k = x ^ k ∣ k − 1 + K k y ~ k \hat{\mathbf{x}}_k = \hat{\mathbf{x}}_{k|k-1} + \mathbf{K}_k \tilde{\mathbf{y}}_k x^k=x^kk1+Kky~k

更新协方差估计

P k = ( I − K k H k ) P k ∣ k − 1 \mathbf{P}_k = (\mathbf{I} - \mathbf{K}_k \mathbf{H}_k) \mathbf{P}_{k|k-1} Pk=(IKkHk)Pkk1

3.1 卡尔曼增益的推导过程

  1. 创新(创新):
    创新是观测值与预测值之间的差异,表示为:
    y k = z k − H k x ^ k − \mathbf{y}_k = \mathbf{z}_k - \mathbf{H}_k \hat{\mathbf{x}}^-_k yk=zkHkx^k
    创新反映了新观测对当前估计的修正。

  2. 后验协方差的计算:
    后验协方差矩阵 ( P k ) (\mathbf{P}_k) (Pk)是基于预测协方差矩阵 ( P k − ) (\mathbf{P}^-_k) (Pk)、卡尔曼增益 ( K k ) (\mathbf{K}_k) (Kk) 和观测模型 ( H k ) (\mathbf{H}_k) (Hk) 计算的。根据误差传递公式,后验协方差矩阵为:
    P k = ( I − K k H k ) P k − \mathbf{P}_k = (I - \mathbf{K}_k \mathbf{H}_k) \mathbf{P}^-_k Pk=(IKkHk)Pk

  3. 卡尔曼增益的推导:
    为了最小化后验误差的协方差,我们要求 ( P k ) (\mathbf{P}_k) (Pk) 最小化,因此需要对卡尔曼增益进行选择。通过最小化估计误差协方差,可以得到最优的卡尔曼增益 ( K k ) (\mathbf{K}_k) (Kk)

    从最小化后验估计误差协方差的角度出发,我们要解决以下优化问题:
    K k = arg ⁡ min ⁡ K k E [ ( x k − x ^ k ) ( x k − x ^ k ) ⊤ ] \mathbf{K}_k = \arg\min_{\mathbf{K}_k} \mathbb{E}[(\mathbf{x}_k - \hat{\mathbf{x}}_k)(\mathbf{x}_k - \hat{\mathbf{x}}_k)^\top] Kk=argKkminE[(xkx^k)(xkx^k)]
    经过推导,卡尔曼增益的表达式为:
    K k = P k − H k ⊤ ( H k P k − H k ⊤ + R k ) − 1 \mathbf{K}_k = \mathbf{P}^-_k \mathbf{H}_k^\top (\mathbf{H}_k \mathbf{P}^-_k \mathbf{H}_k^\top + \mathbf{R}_k)^{-1} Kk=PkHk(HkPkHk+Rk)1

3.2. 卡尔曼增益的含义

  • ( P k − ) (\mathbf{P}^-_k) (Pk) 预测的协方差矩阵,表示了预测状态的不确定性。
  • ( H k ) (\mathbf{H}_k) (Hk) 观测矩阵,表示如何从状态向量生成观测值。
  • ( R k ) (\mathbf{R}_k) (Rk) 观测噪声的协方差矩阵,表示观测噪声的大小。

卡尔曼增益 ( K k ) (\mathbf{K}_k) (Kk) 的作用是平衡预测误差和观测误差的贡献。在更新过程中,卡尔曼增益越大,表明观测对状态估计的修正作用越大;反之,卡尔曼增益越小,则表示系统对预测的依赖越强。


4. Python 实现示例

以下是一个一维位置估计的卡尔曼滤波示例:

import numpy as np

# 初始化变量
x = 0  # 初始状态
P = 1  # 初始不确定性
F = 1  # 状态转移矩阵
H = 1  # 观测矩阵
R = 1  # 观测噪声
Q = 0.1  # 过程噪声

# 测量值
measurements = [1, 2, 3]

for z in measurements:
    # 预测
    x = F * x
    P = F * P * F + Q
    
    # 计算卡尔曼增益
    K = P * H / (H * P * H + R)
    
    # 更新
    x = x + K * (z - H * x)
    P = (1 - K * H) * P
    
    print(f'Updated State: {x}, Updated Covariance: {P}')

5. 卡尔曼滤波的优缺点

5.1 优点

  • 最优性: 在满足线性系统模型和高斯噪声假设时,卡尔曼滤波可以提供最优的状态估计。
  • 实时性: 卡尔曼滤波是一种递推算法,能够实时更新估计,不需要存储所有历史数据。
  • 计算效率高: 卡尔曼滤波不需要复杂的计算,且可以通过简单的矩阵运算实现。

5.2 缺点

  • 线性假设: 卡尔曼滤波假设系统是线性的,无法直接应用于非线性系统。如果系统具有非线性特征,需要使用扩展卡尔曼滤波(EKF)或无迹卡尔曼滤波(UKF)。
  • 高斯噪声假设: 卡尔曼滤波假设噪声是高斯分布的,在实际应用中,噪声可能不符合该假设,导致滤波效果不理想。
  • 参数选择: 卡尔曼滤波的性能对过程噪声
  • ( Q ) (\mathbf{Q}) (Q) 和观测噪声 ( R ) (\mathbf{R}) (R) 的选择非常敏感,需要根据具体问题进行调节。

6. 卡尔曼滤波的应用

卡尔曼滤波在实际中有广泛的应用,尤其是在动态系统、自动控制和传感器融合等领域:

  • 导航与定位: 在航天、汽车导航中,卡尔曼滤波用于GPS与惯性测量单元(IMU)融合,提供精确的位置信息。
  • 自动驾驶: 在自动驾驶系统中,卡尔曼滤波常用于多传感器融合(如雷达、激光雷达和摄像头),实现精确的物体检测与路径规划。
  • 机器人定位与路径规划: 卡尔曼滤波用于机器人中的定位、地图构建和自主导航。
  • 金融工程: 在金融市场中,卡尔曼滤波用于时间序列预测和模型估计,处理金融数据中的噪声和不确定性。

7. 扩展卡尔曼滤波(EKF)与无迹卡尔曼滤波(UKF)

7.1 扩展卡尔曼滤波(EKF)

对于非线性系统,扩展卡尔曼滤波(EKF)通过对非线性系统进行泰勒展开,将系统线性化,从而应用卡尔曼滤波方法。EKF的核心在于计算系统状态和观测方程的雅可比矩阵。

7.2 无迹卡尔曼滤波(UKF)

无迹卡尔曼滤波(UKF)是一种更为精确的卡尔曼滤波扩展方法,不需要对非线性方程进行线性化,而是通过采样点(Sigma Points)来传播状态的不确定性,从而提高估计精度。

通过这些方法,卡尔曼滤波能够在复杂的动态系统中提供有效的状态估计,尤其是在系统模型和观测数据具有非线性特征时。


http://www.kler.cn/a/571221.html

相关文章:

  • 面向对象三大特性:多态
  • Git安装部署
  • 力扣-动态规划-115 不同子序列
  • kubectl 运行脚本 kubernetes 部署springcloud微服务 yaml + Dockerfile+shell 脚本
  • 软件架构师日常工作和核心技能
  • 【Git原理与使用一】Git概念与基本操作
  • 人工智能 全部技术栈以及简单运用场景
  • GBT32960 协议编解码器的设计与实现
  • 概率论基础概念
  • leetcode 0018 四数之和-medium
  • 将 XML 文件转换为字典形式
  • AUTOSAR微控制器抽象层(MCAL)详解及综合实例
  • Docker安装Redpandata-console控制台
  • JavaWeb——MySQL-索引(3/3)-操作语法(索引操作语法概述、创建索引、查看索引、删除索引)
  • C++网络编程之Socket
  • 二分题目leetcode
  • 二百八十五、华为云PostgreSQL——建分区表并设置主键
  • 10.LED点阵实验
  • 安卓内存泄露之DMA-BUF异常增长:Android Studio镜像引起DMA内存泄露
  • Google chrome拦截某些下载内容