目标追踪中的卡尔曼滤波公式的推导总结

介绍

卡尔曼滤波主要有两个过程

  • 预测:根据上一个状态对当前状态进行预测
  • 更新:根据传感器的观测值,来修正当前状态的估计值

预测的过程

假设一台机器小车在 k − 1 k-1 k1时刻的状态为 x ^ k − 1 \hat{x}_{k-1} x^k1

假设这个状态包含两个参数

  • 当前的位置参数 p ^ k − 1 \hat{p}_{k-1} p^k1
  • 当前的速度参数 v ^ k − 1 \hat{v}_{k-1} v^k1

根据这些参数,可以推断 k k k时刻的小车状态,假设小车为匀速直线运动,则 k k k时刻的预测为

  • p k ^ = p ^ k − 1 + v ^ k − 1 ⋅ Δ t \hat{p_k}=\hat{p}_{k-1}+\hat{v}_{k-1} \cdot \Delta t pk^=p^k1+v^k1Δt
  • v k ^ = v ^ k − 1 \hat{v_k}=\hat{v}_{k-1} vk^=v^k1

那么 k k k时刻的状态就是 x k ^ = ( p k ^ , v k ^ ) \hat{x_k}=(\hat{p_k},\hat{v_k}) xk^=(pk^,vk^)

由于状态信息中,每个变量之间可能存在一定的相关性,所以存在一个描述相关性的协方差矩阵 P K − 1 P_{K-1} PK1,这个协方差矩阵会随着状态的预测而调整

卡尔曼滤波的计算过程中,需要一个协方差矩阵 P k P_k Pk 是因为它表示了状态估计的不确定性或者误差。 P k P_k Pk 的大小反映了状态估计的精度, P k P_k Pk 的形状反映了状态变量之间的相关性。卡尔曼滤波的目标是通过预测和更新,使得 P k P_k Pk 尽可能地减小,从而提高状态估计的准确性。

上述的过程可以修改为
x ^ k = ∣ 1 Δ t 0 1 ∣ x ^ k − 1 = F k x ^ k − 1 \hat{x}_k=\begin{vmatrix} 1&\Delta t \\ 0&1 \end{vmatrix} \hat{x}_{k-1} =F_k\hat{x}_{k-1} x^k= 10Δt1 x^k1=Fkx^k1

协方差矩阵

已知:
C o v ( x ) = Σ Cov(x)=\Sigma Cov(x)=Σ

C o v ( A x ) = A Σ A T Cov(Ax)=A\Sigma A^T Cov(Ax)=AΣAT

P k = F k P k − 1 F k T P_k=F_kP_{k-1}F_k^T Pk=FkPk1FkT

外部影响

除了速度和位置,外因也会对系统造成影响,比如模拟火车运动,除了列车自驾系统,列车的操作员可能会手动速度,对于这些信息,我们把它看作一个向量 u ⃗ k \vec{u}_k u k,假设油门控制带来的加速度为 a a a,则
p k = p k − 1 + Δ t v k − 1 + 1 2 a Δ t 2 p_k=p_{k-1}+\Delta t v_{k-1}+\frac{1}{2}a\Delta t^2 pk=pk1+Δtvk1+21aΔt2

v k = v k − 1 + a Δ t v_k=v_{k-1}+a \Delta t vk=vk1+aΔt

转换为矩阵的形式为为:

x ^ k = F k x ^ k − 1 + ∣ Δ t 2 2 Δ t ∣ a = F k x ^ k + B k u ⃗ k \hat{x}_k=F_k \hat{x}_{k-1}+ \begin{vmatrix} \frac{\Delta t^2}{2} \\ \Delta t \end{vmatrix} a = F_k \hat{x}_k+B_k \vec{u}_k x^k=Fkx^k1+ 2Δt2Δt a=Fkx^k+Bku k

其中 B k B_k Bk是控制矩阵, u ⃗ k \vec{u}_k u k是控制向量,如果外部环境异常简单,则可以忽略这部分

外部不确定性

如果存在我们不知道的力量呢?当我们监控无人机时,它可能会受到风的影响;当我们跟踪轮式机器人时,它的轮胎可能会打滑,或者粗糙地面会降低它的移速。这些因素是难以掌握的,如果出现其中的任意一种情况,预测结果就难以保障。

这要求我们在每个预测步骤后再加上一些新的不确定性,来模拟和“世界”相关的所有不确定性,这些不确定性视为协方差的噪音 Q k Q_k Qk

x ^ k = F k x ^ k − 1 + B k u ⃗ k \hat{x}_k=F_k\hat{x}_{k-1}+B_k \vec{u}_k x^k=Fkx^k1+Bku k
P k = F k P k − 1 F k T + Q k P_k=F_kP_{k-1}F_k^T+Q_k Pk=FkPk1FkT+Qk

简而言之,可以总结如下:

新的最佳估计是基于原最佳估计已知外部影响矫正后得到的预测

新的不确定性是基于原不确定性外部环境的不确定性得到的预测

通过测量来细化估计值

我们可能有好几个传感器,他们一起提供了有关系统状态的信息。传感器的作用不是重点,重点是它可以告诉我们关于状态的间接信息。传感器给出的是系统输出或者测量值 z ⃗ k \vec{z}_k z k ,它们通常包含一些噪声和误差,并且可能只能反映状态信息的一部分或者间接的信息。我们需要知道每个传感器测量的是什么,以及它们和状态信息之间的关系。这个关系可以用一个矩阵 H k H_k Hk 来表示输出或者测量函数,即

z ⃗ k = H k x ^ k + ϵ ⃗ k \vec{z}_k=H_k\hat{x}_k+\vec{\epsilon}_k z k=Hkx^k+ϵ k

其中 ϵ ⃗ k \vec{\epsilon}_k ϵ k 是一个表示测量噪声或者误差的向量。根据状态信息预测得到的输出或者测量值为 H k ⋅ x ^ k H_k \cdot \hat{x}_k Hkx^k ,它表示传感器期望得到的读数。根据状态信息得到的测量值期望和协方差为

μ ⃗ e x p e c t e d = H k x ^ k \vec{\mu}_{expected}=H_k\hat{x}_k μ expected=Hkx^k

Σ e x p e c t e d = H k P k H k T + R k \Sigma_{expected}=H_kP_kH_k^T+R_k Σexpected=HkPkHkT+Rk

其中 R k R_k Rk 是一个表示测量噪声 ϵ ⃗ k \vec{\epsilon}_k ϵ k的协方差矩阵。

现在我们得到了两块高斯分布,一块围绕预测输出或者测量值 μ ⃗ e x p e c t e d \vec{\mu}_{expected} μ expected ,另一块围绕实际输出或者测量值 z ⃗ k \vec{z}_k z k

如果要生成靠谱预测,模型必须调和这两个信息。也就是说,对于任何可能的输出或者测量值 ( z 1 , z 2 , . . . , z n ) (z_1,z_2,...,z_n) (z1,z2,...,zn) ,这两种方法预测的状态都有可能是准确的,也都有可能是不准确的。重点是我们怎么找到这两个准确率。

最简单的方法是两者相乘,两块高斯分布相乘后,我们可以得到它们的重叠部分,这也是会出现最佳估计的区域。换个角度看,它看起来也符合高斯分布

事实证明,当你把两个高斯分布和它们各自的均值和协方差矩阵相乘时,你会得到一个拥有独立均值和协方差矩阵的新高斯分布。最后剩下的问题就不难解决了:我们必须有一个公式来从旧的参数中获取这些新参数!

N ( x , μ 0 , σ 0 ) ∗ N ( x , μ 1 , σ 1 ) = N ( x , μ ′ , σ ′ ) N(x,\mu_0,\sigma_0)*N(x,\mu_1,\sigma_1)=N(x,\mu^{'},\sigma^{'}) N(x,μ0,σ0)N(x,μ1,σ1)=N(x,μ,σ)

μ ′ = μ 0 + σ 0 2 ( μ 1 − μ 0 ) σ 0 2 + σ 1 2 \mu^{'}=\mu_0+\frac{\sigma_0^{2}(\mu_1-\mu_0)}{\sigma_0^2+\sigma_1^2} μ=μ0+σ02+σ12σ02(μ1μ0)

σ ′ 2 = σ 0 2 − σ 0 4 σ 0 2 + σ 1 2 {\sigma^{'}}^{2}=\sigma_0^2-\frac{\sigma_0^4}{\sigma_0^2+\sigma_1^2} σ2=σ02σ02+σ12σ04

k = σ 0 2 σ 0 2 + σ 1 2 k=\frac{\sigma_0^2}{\sigma_0^2+\sigma_1^2} k=σ02+σ12σ02,则:

μ ′ = μ 0 + k ( μ 1 − μ 0 ) \mu^{'}=\mu_0+k(\mu_1-\mu_0) μ=μ0+k(μ1μ0)

σ ′ 2 = σ 0 2 − k σ 0 2 {\sigma^{'}}^{2}=\sigma_0^2-k\sigma_0^2 σ2=σ02kσ02

扩展到多维的内容,则如下表达:

K = Σ 0 ( Σ 0 + Σ 1 ) − 1 K=\Sigma_0(\Sigma_0+\Sigma_1)^{-1} K=Σ0(Σ0+Σ1)1

μ ⃗ ′ = μ 0 ⃗ + K ( μ 1 ⃗ − μ ⃗ 0 ) \vec{\mu}'=\vec{\mu_0}+K(\vec{\mu_1}-\vec{\mu}_0) μ =μ0 +K(μ1 μ 0)

Σ ′ = Σ 0 − K Σ 0 \Sigma'=\Sigma_0-K\Sigma_0 Σ=Σ0KΣ0

其中 K K K称之为卡尔曼增益

把他们俩结合起来

截至目前,我们有用矩阵 ( μ 0 , Σ 0 ) = ( H k x ^ k , H k P k H k T ) (\mu_0,\Sigma_0)=(H_k\hat{x}_k,H_kP_kH_k^T) (μ0,Σ0)=(Hkx^k,HkPkHkT)的传感器读数预测分布,也有传感器读数 ( μ 1 , Σ 1 ) = ( z ⃗ k , R k ) (\mu_1,\Sigma_1)=(\vec{z}_k,R_k) (μ1,Σ1)=(z k,Rk)的传感器实际读数(测量值)分布,带入上式的矩阵等式中可以得到:

H k x ^ k ′ = H k x ^ k + K ( z k ⃗ − H k x ^ k ) H_k\hat{x}^{'}_k=H_k\hat{x}_k+K(\vec{z_k}-H_k\hat{x}_k) Hkx^k=Hkx^k+K(zk Hkx^k)

H k P k ′ H k T = H k P k H k T − K H k P k H k T H_kP^{'}_kH_k^T=H_kP_kH_k^T-KH_kP_kH_k^T HkPkHkT=HkPkHkTKHkPkHkT

K = H k P k H k T ( H k P k H k T + R k ) − 1 K=H_kP_kH_k^T(H_kP_kH_k^T+R_k)^{-1} K=HkPkHkT(HkPkHkT+Rk)1

上述式子还包含一个 H k H_k Hk,化简得到:

x ^ k ′ = x ^ k + K ′ ( z k ⃗ − H k x ^ k ) \hat{x}^{'}_k=\hat{x}_k+K'(\vec{z_k}-H_k\hat{x}_k) x^k=x^k+K(zk Hkx^k)

P k ′ = P k − K ′ H k P k P^{'}_k=P_k-K'H_kP_k Pk=PkKHkPk

K ′ = P k H k T ( H k P k H k T + R k ) − 1 K'=P_kH_k^T(H_kP_kH_k^T+R_k)^{-1} K=PkHkT(HkPkHkT+Rk)1

最后, x k ′ x^{'}_k xk就是我们的最佳估计,可以继续把他放入公式做下一轮预测

总结

文字总结

卡尔曼滤波是一种迭代的过程,它不断地交替进行预测和更新,以利用系统模型和传感器数据来估计系统状态。它的基本步骤如下:

  • 预测:根据上一时刻的状态估计和控制输入,预测当前时刻的状态和协方差
  • 更新:根据当前时刻的输出或者测量值,计算卡尔曼增益,并用它来修正预测状态和协方差,得到最佳状态估计
  • 本质:卡尔曼滤波就是利用传感器读数和状态预测来融合得到一个更加准确的状态估计,然后用这个状态估计来预测下一个状态。卡尔曼滤波的核心思想是利用两个高斯分布的乘积来得到一个方差更小的高斯分布,这个方差更小的高斯分布就是最佳状态估计的分布。

卡尔曼滤波的优点是它可以有效地处理不确定性和噪声,以及融合多个传感器数据。它的缺点是它需要知道系统模型和噪声模型,并且假设状态和输出或者测量之间是线性关系。如果这些假设不成立,那么就需要使用非线性卡尔曼滤波,例如扩展卡尔曼滤波或者无迹卡尔曼滤波。

计算公式总结

根据上一个状态估计当前状态

x ^ k = F k x ^ k − 1 + B k u ⃗ k \hat{x}_k=F_k\hat{x}_{k-1}+B_k \vec{u}_k x^k=Fkx^k1+Bku k

P k = F k P k − 1 F k T + Q k P_k=F_kP_{k-1}F_k^T+Q_k Pk=FkPk1FkT+Qk

  • x ^ k \hat{x}_k x^k 是当前时刻的状态估计向量,包含了系统内部的变量
  • F k F_k Fk 是状态转移矩阵,包含了系统动力学模型,描述了状态之间的关系;
  • B k B_k Bk 是控制矩阵,包含了控制模型,描述了控制输入对状态的影响;
  • u ⃗ k \vec{u}_k u k 是控制输入向量,表示外部对系统施加的作用力或者操作;
  • P k P_k Pk 是协方差矩阵,表示状态估计的不确定性或者误差;
  • Q k Q_k Qk 是过程噪声协方差矩阵,表示外部环境的不确定性或者干扰。

根据观测值修正当前状态的估计

x ^ k ′ = x ^ k + K ′ ( z k ⃗ − H k x ^ k ) \hat{x}^{'}_k=\hat{x}_k+K'(\vec{z_k}-H_k\hat{x}_k) x^k=x^k+K(zk Hkx^k)

P k ′ = P k − K ′ H k P k P^{'}_k=P_k-K'H_kP_k Pk=PkKHkPk

K ′ = P k H k T ( H k P k H k T + R k ) − 1 K'=P_kH_k^T(H_kP_kH_k^T+R_k)^{-1} K=PkHkT(HkPkHkT+Rk)1

  • x ^ k ′ \hat{x}^{'}_k x^k 是修正后的状态估计向量,是最佳状态估计;
  • z ⃗ k \vec{z}_k z k 是观测值或者测量值向量,表示传感器给出的系统输出;
  • H k H_k Hk 是输出或者测量函数矩阵,描述了状态值和测量值之间的关系;
  • K ′ K' K 是卡尔曼增益矩阵,表示预测输出或者测量值和实际输出或者测量值之间的权重分配;
  • P k ′ P^{'}_k Pk 是修正后的协方差矩阵,表示最佳状态估计的不确定性或者误差;
  • R k R_k Rk 是测量噪声协方差矩阵,表示传感器的不确定性或者误差。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
卡尔滤波是一种用于估计系统状态的递归滤波器。它通过结合系统动态模型和观测数据来提供对状态的最优估计。下面是卡尔滤波公式推导过程: 1. 系统模型: 状态方程:x_k = F_k * x_{k-1} + B_k * u_k + w_k 观测方程:z_k = H_k * x_k + v_k 其,x_k表示系统在时间步k时的状态向量,u_k表示控制输入,z_k表示观测向量。 F_k是状态转移矩阵,描述系统状态从时间步k-1到时间步k的演化关系。 B_k是控制输入矩阵,描述控制输入对系统状态的影响。 w_k是系统过程噪声,假设其均值为0,协方差矩阵为Q_k。 H_k是观测矩阵,描述观测向量与系统状态之间的关系。 v_k是观测噪声,假设其均值为0,协方差矩阵为R_k。 2. 预测步骤(时间更新): 根据上一时刻的状态估计x_{k-1}和控制输入u_{k-1},通过状态转移矩阵F_k和控制输入矩阵B_k进行状态预测: x_{k}^- = F_k * x_{k-1} + B_k * u_{k-1} 同时,计算预测误差协方差矩阵P_{k}^-: P_{k}^- = F_k * P_{k-1} * F_k^T + Q_k 3. 更新步骤(测量更新): 根据当前观测向量z_k,通过观测矩阵H_k对预测状态进行观测估计: y_k = z_k - H_k * x_{k}^- 计算观测残差协方差矩阵S_k: S_k = H_k * P_{k}^- * H_k^T + R_k 计算卡尔增益K_k: K_k = P_{k}^- * H_k^T * S_k^{-1} 更新状态估计值: x_{k} = x_{k}^- + K_k * y_k 更新误差协方差矩阵: P_{k} = (I - K_k * H_k) * P_{k}^- 其,^-表示预测值,而没有^-表示更新值。 以上就是卡尔滤波公式推导过程。通过递归地进行预测和更新步骤,卡尔滤波能够对系统状态进行最优估计。请注意,以上推导过程是基于线性系统和高斯噪声的情况,对于非线性系统还需要进行扩展,例如使用扩展卡尔滤波(Extended Kalman Filter)或无迹卡尔滤波(Unscented Kalman Filter)等方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值