卡尔曼滤波算法原理(KF,EKF,AKF,UKF)

主要是KF、EKF、UKF算法公式推导,直接看公式会比较枯燥,建议推导一下。

新增文章卡尔曼运动模型公式推导CTRV+CTRA,主要是EKF的CTRV、CTRA两个运动模型的公式推导,以及困扰我很久的Q矩阵推导,一直不明白为什么要用Δt\Delta tΔt来设置Q矩阵

  • 滤波器

    • 主要运动模型
  • KF
    • CV
    • CA
  • EKF
    • CTRV
    • CTRA
  • UKF
    • CTRV
    • CTRA

参考文章及代码

  • Kalman-Python
    十分清晰的各种kalman原理和相应的Python代码,用来理解学习很方便,其实把这个项目跑一遍就差不多了。

  • CarND-EKF, CarND-UKF, SFND_UKF
    udacity的kalman的C++框架,具体实现要补充,可在github搜相应的项目,有别人完善好的,如:ukf实现

  • 从贝叶斯滤波到卡尔曼滤波
    从贝叶斯滤波理论直接推导

  • 卡尔曼滤波算法详细推导
    非常详细,公式推导写的很明白

  • 卡尔曼滤波-维基百科
    维基百科写的也非常好,有关于最优卡尔曼增益的简化推导

1 卡尔曼滤波KF

1.1 KF公式

x^k∣k−1=Fkx^k−1∣k−1\hat x_{k|k-1} = F_k \hat x_{k-1|k-1} x^k∣k−1​=Fk​x^k−1∣k−1​
Pk∣k−1=FkPk−1∣k−1FkT+QkP_{k|k-1} = F_k P_{k-1|k-1} F^T_k + Q_kPk∣k−1​=Fk​Pk−1∣k−1​FkT​+Qk​
Kk=Pk∣k−1HkT(HkPk∣k−1HkT+Rk)−1K_k = P_{k|k-1}H^T_k {(H_k P_{k|k-1} H^T_k + R_k)}^{-1}Kk​=Pk∣k−1​HkT​(Hk​Pk∣k−1​HkT​+Rk​)−1
x^k∣k=x^k∣k−1+Kk(zk−Hkx^k∣k−1)\hat x_{k|k} = \hat x_{k|k-1} + K_k (z_k - H_k \hat x_{k|k-1})x^k∣k​=x^k∣k−1​+Kk​(zk​−Hk​x^k∣k−1​)
Pk∣k=(I−KkHk)Pk∣k−1P_{k|k} = (I - K_k H_k) P_{k|k-1}Pk∣k​=(I−Kk​Hk​)Pk∣k−1​

1.2 已知假设

已知假设,卡尔曼滤波模型假设k时刻的真实状态是从(k − 1)时刻的状态演化而来,符合下式:

  • 状态估计方程
    xk=Fkxk−1+Bkuk+wkx_{k} = F_k x_{k-1} + B_ku_k + w_k xk​=Fk​xk−1​+Bk​uk​+wk​
    其中:FkF_kFk​为状态变换模型(矩阵/向量),运动学一般是矩阵(状态转移矩阵)。
    BkB_kBk​是作用在控制器向量uku_kuk​上的输入-控制模型。一般运动学中没有这项,因为对于检测的目标的是无法测量其内部的控制量,所以简化为0。
    wk∼N(0,Qk)w_k \sim N(0,Q_k)wk​∼N(0,Qk​)是过程噪声。均值为0。xkx_{k}xk​对应的就是高斯分布的均值,因此这项可简化为0。

  • 状态估计转移方程
    zk=Hk∗xk+vkz_k = H_k * x_k + v_kzk​=Hk​∗xk​+vk​
    表示k时刻真实状态xkx_kxk​的一个测量,其中:HkH_kHk​为观测模型(观测矩阵),它把真实状态空间映射成观测空间,vk∼N(0,Rk)v_k \sim N(0,R_k)vk​∼N(0,Rk​)是观测噪声。
    初始状态以及每一时刻的噪声x0,w1,...,wk,v1...vk{x_0, w_1, ..., w_k, v1 ... v_k}x0​,w1​,...,wk​,v1...vk​都认为是互相独立的

从已知假设出发,可以计算相应的协方差矩阵,这个也是公式推导的主要部分。后文在详细阐述KF的五个公式后进行推导各自的协方差矩阵,会介绍如何计算出最优卡尔曼增益K值。

1.3 预测:

x^k∣k−1=Fkx^k−1∣k−1\hat x_{k|k-1} = F_k \hat x_{k-1|k-1} x^k∣k−1​=Fk​x^k−1∣k−1​
为状态估计方程,表示预测下一步状态。其中:
x^k∣k−1\hat x_{k|k-1}x^k∣k−1​为k-1时刻对k时刻的状态预测。
x^k−1∣k−1\hat x_{k-1|k-1}x^k−1∣k−1​在时刻k-1的状态估计。
FkF_kFk​为状态转移矩阵。

Pk∣k−1=FkPk−1∣k−1FkT+QkP_{k|k-1} = F_k P_{k-1|k-1} F^T_k + Q_kPk∣k−1​=Fk​Pk−1∣k−1​FkT​+Qk​
为预测估计协方差方程,计算先验概率。其中:
Pk−1∣k−1P_{k-1|k-1}Pk−1∣k−1​为k-1时刻的后验估计误差协方差矩阵,度量估计值的精确程度。
Pk∣k−1P_{k|k-1}Pk∣k−1​为k-1时刻到k时刻的估计误差协方差矩阵。
QkQ_kQk​为过程噪声协方差矩阵,越大说明越不相信预测。实际工程中可自己调参,也可以自适应(AKF)。

1.4 更新:

Kk=Pk∣k−1HkT(HkPk∣k−1HkT+Rk)−1K_k = P_{k|k-1}H^T_k {(H_k P_{k|k-1} H^T_k + R_k)}^{-1}Kk​=Pk∣k−1​HkT​(Hk​Pk∣k−1​HkT​+Rk​)−1
为卡尔曼增益方程。KkK_kKk​为最优卡尔曼增益。
RkR_kRk​为测量噪声协方差矩阵,越大说明越不相信观测。实际工程中测量噪声由厂商提供,也可以自己调参,也可以自适应(AKF)。

x^k∣k=x^k∣k−1+Kk(zk−Hkx^k∣k−1)\hat x_{k|k} = \hat x_{k|k-1} + K_k (z_k - H_k \hat x_{k|k-1})x^k∣k​=x^k∣k−1​+Kk​(zk​−Hk​x^k∣k−1​)
为更新状态估计方程,也就是最终的滤波状态结果。
可以使用测量残差来简化表达公式y^=zk−Hkx^k∣k−1\hat y = z_k - H_k \hat x_{k|k-1}y^​=zk​−Hk​x^k∣k−1​,Sk=cov(y^)=HkPk∣k−1HkT+RkS_k = cov(\hat y) = H_k P_{k|k-1} H^T_k + R_kSk​=cov(y^​)=Hk​Pk∣k−1​HkT​+Rk​。
即卡尔曼增益可以简化为Kk=Pk∣k−1HkTSk−1K_k = P_{k|k-1}H^T_k S_k^{-1}Kk​=Pk∣k−1​HkT​Sk−1​,状态估计更新可以简化为x^k∣k=x^k∣k−1+Kky^\hat x_{k|k} = \hat x_{k|k-1} + K_k \hat yx^k∣k​=x^k∣k−1​+Kk​y^​

Pk∣k=(I−KkHk)Pk∣k−1P_{k|k} = (I - K_k H_k) P_{k|k-1}Pk∣k​=(I−Kk​Hk​)Pk∣k−1​
为更新估计协方差方程,计算得到后验概率。

1.5 公式推导

下文公式预警!!虽然多但是是很简单的!慢慢看!

已知:QkQ_kQk​和RkR_kRk​一般为固定值,高级卡尔曼滤波可以用自适应。

Qk=cov(wk)=E(wkwkT)Q_k = cov(w_k) = E(w_kw_k^T)Qk​=cov(wk​)=E(wk​wkT​)
Rk=cov(vk)=E(vkvkT)R_k = cov(v_k) = E(v_kv_k^T)Rk​=cov(vk​)=E(vk​vkT​)
Pk∣k−1=cov(xk−x^k∣k−1)=E((xk−x^k∣k−1)(xk−x^k∣k−1)T)P_{k|k-1} = cov(x_k - \hat x_{k|k-1}) = E((x_k - \hat x_{k|k-1})(x_k - \hat x_{k|k-1})^T)Pk∣k−1​=cov(xk​−x^k∣k−1​)=E((xk​−x^k∣k−1​)(xk​−x^k∣k−1​)T)
Pk∣k=cov(xk−x^k∣k)=E((xk−x^k∣k)(xk−x^k∣k)T)P_{k|k} = cov(x_k - \hat x_{k|k}) = E((x_k - \hat x_{k|k})(x_k - \hat x_{k|k})^T)Pk∣k​=cov(xk​−x^k∣k​)=E((xk​−x^k∣k​)(xk​−x^k∣k​)T)
Sk=cov(y^)=cov(zk−Hkx^k∣k−1)S_k = cov(\hat y) = cov(z_k - H_k \hat x_{k|k-1})Sk​=cov(y^​)=cov(zk​−Hk​x^k∣k−1​)

从状态估计方程推Pk∣k−1P_{k|k-1}Pk∣k−1​:

Pk∣k−1=cov(xk−x^k∣k−1)P_{k|k-1} = cov(x_k - \hat x_{k|k-1})Pk∣k−1​=cov(xk​−x^k∣k−1​)
=cov(Fkxk−1+wk−Fkx^k−1∣k−1)\qquad \quad = cov(F_k x_{k-1} + w_k - F_k \hat x_{k-1|k-1})=cov(Fk​xk−1​+wk​−Fk​x^k−1∣k−1​)
=cov(Fk(xk−1−x^k−1∣k−1))+cov(wk)\qquad \quad = cov(F_k (x_{k-1}-\hat x_{k-1|k-1})) + cov(w_k)=cov(Fk​(xk−1​−x^k−1∣k−1​))+cov(wk​)
=Fkcov(xk−1−x^k−1∣k−1)FkT+Qk\qquad \quad = F_k cov(x_{k-1}-\hat x_{k-1|k-1})F_k^T + Q_k=Fk​cov(xk−1​−x^k−1∣k−1​)FkT​+Qk​
=FkPk−1∣k−1FkT+Qk\qquad \quad = F_k P_{k-1|k-1} F_k^T + Q_k=Fk​Pk−1∣k−1​FkT​+Qk​

从状态估计更新方程推Pk∣kP_{k|k}Pk∣k​:

Pk∣k=cov(xk−x^k∣k)P_{k|k} = cov(x_k - \hat x_{k|k})Pk∣k​=cov(xk​−x^k∣k​)
=cov(xk−x^k∣k−1−Kk(zk−Hkx^k∣k−1))\qquad = cov(x_k - \hat x_{k|k-1} - K_k (z_k - H_k \hat x_{k|k-1}))=cov(xk​−x^k∣k−1​−Kk​(zk​−Hk​x^k∣k−1​))
=cov(xk−x^k∣k−1−Kk(Hkxk+vk−Hkx^k∣k−1))\qquad = cov(x_k - \hat x_{k|k-1} - K_k (H_k x_k + v_k - H_k \hat x_{k|k-1}))=cov(xk​−x^k∣k−1​−Kk​(Hk​xk​+vk​−Hk​x^k∣k−1​))
=cov(xk−x^k∣k−1−KkHk(xk−x^k∣k−1)−Kkvk)\qquad = cov(x_k - \hat x_{k|k-1} - K_k H_k( x_k - \hat x_{k|k-1}) - K_k v_k)=cov(xk​−x^k∣k−1​−Kk​Hk​(xk​−x^k∣k−1​)−Kk​vk​)
=cov((I−KkHk)(xk−x^k∣k−1)−Kkvk)\qquad = cov((I - K_k H_k)( x_k - \hat x_{k|k-1}) - K_k v_k)=cov((I−Kk​Hk​)(xk​−x^k∣k−1​)−Kk​vk​)
=cov((I−KkHk)(xk−x^k∣k−1))+cov(Kkvk)\qquad = cov((I - K_k H_k)( x_k - \hat x_{k|k-1})) + cov(K_k v_k)=cov((I−Kk​Hk​)(xk​−x^k∣k−1​))+cov(Kk​vk​)
=(I−KkHk)cov(xk−x^k∣k−1)(I−KkHk)T+Kkcov(vk)KkT\qquad = (I - K_k H_k)cov( x_k - \hat x_{k|k-1})(I - K_k H_k)^T + K_k cov(v_k) K_k^T=(I−Kk​Hk​)cov(xk​−x^k∣k−1​)(I−Kk​Hk​)T+Kk​cov(vk​)KkT​
=(I−KkHk)Pk∣k−1(I−KkHk)T+KkRkKkT\qquad = (I - K_k H_k) P_{k|k-1} (I - K_k H_k)^T + K_k R_k K_k^T=(I−Kk​Hk​)Pk∣k−1​(I−Kk​Hk​)T+Kk​Rk​KkT​

这一公式对于任何卡尔曼增益Kk{K_k}Kk​都成立。如果Kk{K_k}Kk​是最优卡尔曼增益,则可以进一步简化

基于上式推导最优卡尔曼增益Kk{K_k}Kk​:

卡尔曼滤波器是最小均方误差估计器,后验状态误差估计是指Pk∣k=cov(xk−x^k∣k)P_{k|k} = cov(x_k - \hat x_{k|k})Pk∣k​=cov(xk​−x^k∣k​),当Pk∣kP_{k|k}Pk∣k​矩阵的均方误差为最小时,即可求出最优卡尔曼增益。

矩阵的均方误差为矩阵的迹。求矩阵的最小均方误差,即是求矩阵的迹的最小值,对矩阵的迹求导,导数为0时,迹最小。矩阵的迹求导有相关公式,可参考该文章。协方差Pk∣kP_{k|k}Pk∣k​是对称矩阵

Pk∣k=(I−KkHk)Pk∣k−1(I−KkHk)T+KkRkKkTP_{k|k} = (I - K_k H_k) P_{k|k-1} (I - K_k H_k)^T + K_k R_k K_k^TPk∣k​=(I−Kk​Hk​)Pk∣k−1​(I−Kk​Hk​)T+Kk​Rk​KkT​
=(Pk∣k−1−KkHkPk∣k−1)(I−(KkHk)T)+KkRkKkT\qquad = (P_{k|k-1} - K_k H_k P_{k|k-1})(I - (K_k H_k)^T) + K_k R_k K_k^T=(Pk∣k−1​−Kk​Hk​Pk∣k−1​)(I−(Kk​Hk​)T)+Kk​Rk​KkT​
=Pk∣k−1−KkHkPk∣k−1−Pk∣k−1(KkHk)T+KkHkPk∣k−1(KkHk)T+KkRkKkT\qquad = P_{k|k-1} - K_k H_k P_{k|k-1} - P_{k|k-1} (K_k H_k)^T + K_k H_k P_{k|k-1}(K_k H_k)^T + K_k R_k K_k^T=Pk∣k−1​−Kk​Hk​Pk∣k−1​−Pk∣k−1​(Kk​Hk​)T+Kk​Hk​Pk∣k−1​(Kk​Hk​)T+Kk​Rk​KkT​
=Pk∣k−1−KkHkPk∣k−1−Pk∣k−1(KkHk)T+Kk(HkPk∣k−1HkT+Rk)KkT\qquad = P_{k|k-1} - K_k H_k P_{k|k-1} - P_{k|k-1} (K_k H_k)^T + K_k (H_k P_{k|k-1} H^T_k + R_k )K_k^T=Pk∣k−1​−Kk​Hk​Pk∣k−1​−Pk∣k−1​(Kk​Hk​)T+Kk​(Hk​Pk∣k−1​HkT​+Rk​)KkT​

tr(Pk∣k)=tr(Pk∣k−1−KkHkPk∣k−1−Pk∣k−1(KkHk)T++Kk(HkPk∣k−1HkT+Rk)KkT)tr(P_{k|k}) = tr(P_{k|k-1} - K_k H_k P_{k|k-1} - P_{k|k-1} (K_k H_k)^T + + K_k (H_k P_{k|k-1} H^T_k + R_k )K_k^T)tr(Pk∣k​)=tr(Pk∣k−1​−Kk​Hk​Pk∣k−1​−Pk∣k−1​(Kk​Hk​)T++Kk​(Hk​Pk∣k−1​HkT​+Rk​)KkT​)
=tr(Pk∣k−1)−tr(KkHkPk∣k−1)−tr(Pk∣k−1(KkHk)T)+tr(Kk(HkPk∣k−1HkT+Rk)KkT)\qquad = tr(P_{k|k-1} )- tr(K_k H_k P_{k|k-1}) -tr( P_{k|k-1} (K_k H_k)^T) + tr( K_k (H_k P_{k|k-1} H^T_k + R_k )K_k^T)=tr(Pk∣k−1​)−tr(Kk​Hk​Pk∣k−1​)−tr(Pk∣k−1​(Kk​Hk​)T)+tr(Kk​(Hk​Pk∣k−1​HkT​+Rk​)KkT​)
=tr(Pk∣k−1)−2tr(KkHkPk∣k−1)+tr(Kk(HkPk∣k−1HkT+Rk)KkT)\qquad = tr(P_{k|k-1} )- 2tr(K_k H_k P_{k|k-1})+ tr( K_k (H_k P_{k|k-1} H^T_k + R_k )K_k^T)=tr(Pk∣k−1​)−2tr(Kk​Hk​Pk∣k−1​)+tr(Kk​(Hk​Pk∣k−1​HkT​+Rk​)KkT​)

dtr(Pk∣k)dKk=d[tr(Pk∣k−1)−2tr(KkHkPk∣k−1)+tr(Kk(HkPk∣k−1HkT+Rk)KkT)]dKk\frac {d \ tr(P_{k|k})} {d\ K_k} =\frac {d\ {[tr(P_{k|k-1}) - 2tr(K_k H_k P_{k|k-1}) + tr(K_k (H_k P_{k|k-1} H^T_k + R_k )K_k^T)]}} {d\ K_k}d Kk​d tr(Pk∣k​)​=d Kk​d [tr(Pk∣k−1​)−2tr(Kk​Hk​Pk∣k−1​)+tr(Kk​(Hk​Pk∣k−1​HkT​+Rk​)KkT​)]​
=−2(HkPk∣k−1)T+2Kk(HkPk∣k−1HkT+Rk)\qquad \quad =-2 (H_k P_{k|k-1})^T + 2K_k(H_k P_{k|k-1} H^T_k + R_k)=−2(Hk​Pk∣k−1​)T+2Kk​(Hk​Pk∣k−1​HkT​+Rk​)

当矩阵导数是0的时候得到Pk∣kP_{k|k}Pk∣k​的迹(trace)的最小值:
tr(Pk∣k)dKk=−2(HkPk∣k−1)T+2Kk(HkPk∣k−1HkT+Rk)=0\frac {tr(P_{k|k})} {dK_k} =-2 (H_k P_{k|k-1})^T + 2K_k(H_k P_{k|k-1} H^T_k + R_k) = 0dKk​tr(Pk∣k​)​=−2(Hk​Pk∣k−1​)T+2Kk​(Hk​Pk∣k−1​HkT​+Rk​)=0

Kk=Pk∣k−1HkT(HkPk∣k−1HkT+Rk)−1=Pk∣k−1HkTSk−1K_k = P_{k|k-1}H^T_k {(H_k P_{k|k-1} H^T_k + R_k)}^{-1} = P_{k|k-1}H^T_k S_k^{-1}Kk​=Pk∣k−1​HkT​(Hk​Pk∣k−1​HkT​+Rk​)−1=Pk∣k−1​HkT​Sk−1​

最优卡尔曼增益化简Pk∣kP_{k|k}Pk∣k​

KkSk=(HkPk∣k−1)TK_kS_k = (H_k P_{k|k-1})^TKk​Sk​=(Hk​Pk∣k−1​)T

KkSkKkT=(HkPk∣k−1)TKkT=Pk∣k−1(KkHk)TK_k S_k K^T_k = (H_k P_{k|k-1})^T K^T_k = P_{k|k-1} (K_k H_k)^TKk​Sk​KkT​=(Hk​Pk∣k−1​)TKkT​=Pk∣k−1​(Kk​Hk​)T

Pk∣k=Pk∣k−1−KkHkPk∣k−1−Pk∣k−1(KkHk)T+Kk(HkPk∣k−1HkT+Rk)KkTP_{k|k} = P_{k|k-1} - K_k H_k P_{k|k-1} - P_{k|k-1} (K_k H_k)^T + K_k (H_k P_{k|k-1} H^T_k + R_k )K_k^TPk∣k​=Pk∣k−1​−Kk​Hk​Pk∣k−1​−Pk∣k−1​(Kk​Hk​)T+Kk​(Hk​Pk∣k−1​HkT​+Rk​)KkT​
=Pk∣k−1−KkHkPk∣k−1−Pk∣k−1(KkHk)T+KkSkKkT\qquad = P_{k|k-1} - K_k H_k P_{k|k-1} - P_{k|k-1} (K_k H_k)^T + K_k S_k K^T_k=Pk∣k−1​−Kk​Hk​Pk∣k−1​−Pk∣k−1​(Kk​Hk​)T+Kk​Sk​KkT​
=Pk∣k−1−KkHkPk∣k−1−Pk∣k−1(KkHk)T+Pk∣k−1(KkHk)T\qquad = P_{k|k-1} - K_k H_k P_{k|k-1} - P_{k|k-1} (K_k H_k)^T + P_{k|k-1} (K_k H_k)^T=Pk∣k−1​−Kk​Hk​Pk∣k−1​−Pk∣k−1​(Kk​Hk​)T+Pk∣k−1​(Kk​Hk​)T
=Pk∣k−1−KkHkPk∣k−1\qquad = P_{k|k-1} - K_k H_k P_{k|k-1}=Pk∣k−1​−Kk​Hk​Pk∣k−1​
=(I−KkHk)Pk∣k−1\qquad = (I - K_k H_k )P_{k|k-1}=(I−Kk​Hk​)Pk∣k−1​

该简化式Pk∣k=(I−KkHk)Pk∣k−1P_{k|k} = (I - K_k H_k )P_{k|k-1}Pk∣k​=(I−Kk​Hk​)Pk∣k−1​只能在最优卡尔曼增益时才成立。如果算术精度总是很低而导致数值稳定性出现问题,或者特意使用非最优卡尔曼增益,则必须使用上面未简化后的后验误差协方差公式Pk∣k=(I−KkHk)Pk∣k−1(I−KkHk)T+KkRkKkTP_{k|k} = (I - K_k H_k) P_{k|k-1} (I - K_k H_k)^T + K_k R_k K_k^TPk∣k​=(I−Kk​Hk​)Pk∣k−1​(I−Kk​Hk​)T+Kk​Rk​KkT​。

2 自适应卡尔曼滤波AKF

平时不用,暂时附上别人的文章
自动驾驶-自适应卡尔曼滤波AKF
Sage-Husa自适应卡尔曼滤波
主要是使用历史固定帧的数据去更新R和Q矩阵,只更新R矩阵的做法比较多,并且只用了加权求和的方法,动态调节参数没有使用。

3 扩展卡尔曼滤波EKF

解决非线性问题,如极坐标系的雷达,观测到的是径向距离和角度,这个时候的观测矩阵HHH就是非线性的函数。(极坐标系可以转笛卡尔坐标系,Apollo融合跟踪里面对雷达物体用的是笛卡尔坐标系做KF)
EKF和KF的区别主要是状态转换模型和观测模型可以是非线性的,可以使用泰勒展开式替换为线性函数,两个协方差矩阵PPP和HHH要使用雅各比矩阵计算每个状态量的一阶偏导。

因为主要是状态估计方程和状态估计转移方程的两个地方有些区别,所以EKF协方差矩阵的公式推导还是跟KF一样的。

3.1预测

x^k∣k−1=f(xk−1,uk,0)\hat x_{k|k-1} = f(x_{k-1},u_k,0)x^k∣k−1​=f(xk−1​,uk​,0)

Pk∣k−1=JFPk−1∣k−1JFT+QkP_{k|k-1} = J_FP_{k-1|k-1}J^T_F + Q_kPk∣k−1​=JF​Pk−1∣k−1​JFT​+Qk​

3.2 使用Jacobians矩阵更新模型

主要是下面两个矩阵会和KF有区别,也就是过程模型(矩阵)和测量模型(矩阵),需要进行雅各比矩阵求导计算。
因为每个运动模型的雅各比矩阵求导是不一样的,所以新增了关于不同运动模型求导雅各比矩阵的文章:卡尔曼运动模型公式推导CTRV+CTRA

JF=∂f∂x∣x^k−1∣k−1,ukJ_F = \frac {\partial f}{\partial x} |_{\hat x_{k-1|k-1}, u_k}JF​=∂x∂f​∣x^k−1∣k−1​,uk​​

JH=∂h∂x∣x^k∣k−1J_H = \frac {\partial h}{\partial x} |_{\hat x_{k|k-1}}JH​=∂x∂h​∣x^k∣k−1​​

3.3 更新

y^k=zk−h(x^k∣k−1,0)\hat y_k = z_k - h(\hat x_{k|k-1},0)y^​k​=zk​−h(x^k∣k−1​,0)

Sk=JHPk∣k−1HkT+RkS_k = J_H P_{k|k-1} H^T_k + R_kSk​=JH​Pk∣k−1​HkT​+Rk​

Kk=Pk∣k−1JHTSk−1K_k = P_{k|k-1}J^T_H S_k^{-1}Kk​=Pk∣k−1​JHT​Sk−1​

x^k∣k=x^k∣k−1+Kky^\hat x_{k|k} = \hat x_{k|k-1} + K_k \hat yx^k∣k​=x^k∣k−1​+Kk​y^​

Pk∣k=(I−KkJH)Pk∣k−1P_{k|k} = (I - K_k J_H) P_{k|k-1}Pk∣k​=(I−Kk​JH​)Pk∣k−1​

4 无迹卡尔曼滤波UKF

对于非线性问题的处理,过程模型F和测量模型H是非线性的,EKF是求一阶全导数得到线性模型,来近似非线性模型;而UKF是直接寻找一个与真实分布近似的高斯分布,没有用线性表征。

4.1 参考文章及代码

概率机器人——扩展卡尔曼滤波、无迹卡尔曼滤波

无人驾驶汽车系统入门(三)——无损卡尔曼滤波,目标追踪,C++

自动驾驶感知融合-无迹卡尔曼滤波(Lidar&Radar)

从贝叶斯滤波到无迹卡尔曼滤波

https://www.cse.sc.edu/~terejanu/files/tutorialUKF.pdf

http://ais.informatik.uni-freiburg.de/teaching/ws13/mapping/pdf/slam06-ukf-4.pdf

https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python

https://github.com/ndrplz/self-driving-car

4.2 关于无迹变换

无迹变换的步骤如下图,在原高斯分布中按规则采样固定点;采样完后进行非线性变换;对非线性后的结果加权求和,得到加权后的均值和方差。


1.原高斯分布中按一定规则采样


2.采样点经过非线性变换


3.加权统计变换结果

4.2.1 原高斯分布中按一定规则采样

无迹变换主要包括两种形式:一般形式的无迹变换比例无迹变换。两种无迹变换的区别主要体现在采样规则和权重计算上。比例无迹变换是对前者做出的改进,但在代码中一般使用一般形式的无迹变换。两者的区别该文章(从贝叶斯滤波到无迹卡尔曼滤波)有详细介绍,以下内容就简单介绍一般形式的无迹变换

设μ\muμ为原始状态量,χ\chiχ为采样扩展后的状态量,n维随机向量χ∼(μ,P)\chi \sim (\mu , P)χ∼(μ,P),一般是采取2n+1个点,n和状态量的个数有关。

  • 关于权重
    总和为1

w[i]={kk+ni=112(k+n)i=2,...,2n+1w^{[i]} = \begin{cases} \frac {k}{k + n}& \ i=1\\ \frac {1}{2(k + n)} & \ i=2,...,2n+1 \end{cases} w[i]={k+nk​2(k+n)1​​ i=1 i=2,...,2n+1​

  • 计算sigma point
    关于sigma point的采样,可以理解为是在高斯分布的周围左右采点。状态量n个,采样点2n+1个。

χ[i]={μi=1μ+((n+k)P)ii=2,...,n+1μ−((n+k)P)i−ni=n+2,...,2n+1\chi^{[i]} = \begin{cases} \mu& \ i=1\\ \mu + (\sqrt{(n+k)P})_i & \ i=2,...,n+1 \\ \mu - (\sqrt{(n+k)P})_{i-n} & \ i=n+2,...,2n+1 \end{cases} χ[i]=⎩⎪⎨⎪⎧​μμ+((n+k)P​)i​μ−((n+k)P​)i−n​​ i=1 i=2,...,n+1 i=n+2,...,2n+1​

其中:
kkk表示采样点距离均值μ\muμ多远,越远权重越小。对于高斯问题一般取n+k=3n+k=3n+k=3,所以关于运动模型基本取这个值。

χ[i]\chi^{[i]}χ[i]表示第i列,是n*(2n+1)的矩阵。

PPP矩阵是方差矩阵,开根号求解可以使用Cholesky分解。

4.2.2 采样点经过非线性变换

对采样点的每一列进行非线性变换,比如在CTRV运动模型中,使用xk+1=xk+vkw[sin(wΔt+θ)−sin(θ)]x_{k+1} = x_k + \frac {v_k} {w} {[sin(w \Delta t + \theta) - sin(\theta)]}xk+1​=xk​+wvk​​[sin(wΔt+θ)−sin(θ)]来进行变换。当然其他模型的线性变换也是适用的。相当于KF里的状态转移方程,一步预测。

χ′[i]=g(χ[i])\chi^{'[i]} = g(\chi^{[i]}) χ′[i]=g(χ[i])

4.2.3 加权统计变换结果

μ′=∑i=12n+1w[i]χ′[i]\mu' = \sum^{2n+1}_{i=1}{w^{[i]} \chi^{'[i]}}μ′=i=1∑2n+1​w[i]χ′[i]

P′=∑i=12n+1w[i](χ′[i]−μ′)(χ′[i]−μ′)TP'= \sum^{2n+1}_{i=1} w^{[i]} ({\chi^{'[i]} -\mu')(\chi^{'[i]}-\mu')^T}P′=i=1∑2n+1​w[i](χ′[i]−μ′)(χ′[i]−μ′)T

4.3 预测

对原始状态量做一遍无迹变换

  • 预测sigma point
    设μ\muμ为原始状态量,也就是均值,χ\chiχ为采样扩展后的状态量。在UKF的CTRV运动模型中,一般会加入过程噪声aa,aw=0a_a,a_w = 0aa​,aw​=0。

χk−1=(μk−1μk−1+((n+k)Pk−1)iμk−1−((n+k)Pk−1)i−n)(4.1)\chi_{k-1} = (\mu_{k-1} \quad \mu_{k-1}+(\sqrt{(n+k)P_{k-1}})_i \quad \mu_{k-1}- (\sqrt{(n+k)P_{k-1}})_{i-n} ) \tag{4.1} χk−1​=(μk−1​μk−1​+((n+k)Pk−1​​)i​μk−1​−((n+k)Pk−1​​)i−n​)(4.1)

χk∣k−1∗[i]=g(χk−1[i])(4.2)\chi_{k|k-1}^{*[i]} = g(\chi_{k-1}^{[i]}) \tag{4.2}χk∣k−1∗[i]​=g(χk−1[i]​)(4.2)

  • 加权均值和方差
    计算状态空间下的加权均值μk∣k−1\mu_{k|k-1}μk∣k−1​和加权方差Pk∣k−1P_{k|k-1}Pk∣k−1​。

μk∣k−1=∑i=12n+1w[i]χk∣k−1∗[i](4.3)\mu_{k|k-1} = \sum^{2n+1}_{i=1}{w^{[i]} \chi^{*[i]}_{k|k-1}} \tag{4.3}μk∣k−1​=i=1∑2n+1​w[i]χk∣k−1∗[i]​(4.3)

Pk∣k−1=∑i=12n+1w[i](χk∣k−1∗[i]−μk∣k−1)(χk∣k−1∗[i]−μk∣k−1)T+Q(4.4)P_{k|k-1}= \sum^{2n+1}_{i=1} w^{[i]} {(\chi^{*[i]}_{k|k-1} -\mu_{k|k-1} )(\chi^{*[i]}_{k|k-1} - \mu_{k|k-1} )^T} + Q \tag{4.4} Pk∣k−1​=i=1∑2n+1​w[i](χk∣k−1∗[i]​−μk∣k−1​)(χk∣k−1∗[i]​−μk∣k−1​)T+Q(4.4)

4.4 更新

  • 预测更新
    对预测估计的状态量再做一遍无迹变换,映射到测量空间,一般会为降低计算量忽略采样这步(4.5),直接使用χk∣k−1=χk∣k−1∗\chi_{k|k-1} = \chi^{*}_{k|k-1}χk∣k−1​=χk∣k−1∗​,一定程度上会降低精度。
    χk∣k−1=(μk∣k−1μk∣k−1+((n+k)Pk∣k−1)iμk∣k−1−((n+k)Pk∣k−1)i−n)(4.5)\chi_{k|k-1} = (\mu_{k|k-1} \quad \mu_{k|k-1}+(\sqrt{(n+k)P_{k|k-1}})_i \quad \mu_{k|k-1}- (\sqrt{(n+k)P_{k|k-1}})_{i-n} ) \tag{4.5}χk∣k−1​=(μk∣k−1​μk∣k−1​+((n+k)Pk∣k−1​​)i​μk∣k−1​−((n+k)Pk∣k−1​​)i−n​)(4.5)

Zk∣k−1∗[i]=h(χk∣k−1[i])(4.6)Z_{k|k-1}^{*[i]} = h(\chi_{k|k-1}^{[i]}) \tag{4.6}Zk∣k−1∗[i]​=h(χk∣k−1[i]​)(4.6)

zk∣k−1=∑i=12n+1w[i]Zk∣k−1[i](4.7)z_{k|k-1} = \sum^{2n+1}_{i=1} {w^{[i]} Z^{[i]}_{k|k-1}} \tag{4.7}zk∣k−1​=i=1∑2n+1​w[i]Zk∣k−1[i]​(4.7)

Sk∣k−1=∑i=12n+1w[i](Zk∣k−1[i]−zk∣k−1)(Zk∣k−1[i]−zk∣k−1)T+R(4.8)S_{k|k-1} = \sum^{2n+1}_{i=1} w^{[i]}{ (Z^{[i]}_{k|k-1} - z_{k|k-1}) (Z^{[i]}_{k|k-1} - z_{k|k-1})^T + R} \tag{4.8}Sk∣k−1​=i=1∑2n+1​w[i](Zk∣k−1[i]​−zk∣k−1​)(Zk∣k−1[i]​−zk∣k−1​)T+R(4.8)

  • 计算sigma point在状态空间和测量空间的互相关函数(矩阵)
    Tk∣k−1=∑i=12n+1w[i](χk∣k−1[i]−μk∣k−1)(Zk∣k−1[i]−zk∣k−1)T(4.9)T_{k|k-1} = \sum^{2n+1}_{i=1} w^{[i]} {(\chi^{[i]}_{k|k-1} - \mu_{k|k-1}) (Z^{[i]}_{k|k-1} - z_{k|k-1})^T } \tag{4.9}Tk∣k−1​=i=1∑2n+1​w[i](χk∣k−1[i]​−μk∣k−1​)(Zk∣k−1[i]​−zk∣k−1​)T(4.9)

  • 计算卡尔曼增益
    Kk=Tk∣k−1Sk∣k−1−1(4.10)K_{k} = T_{k|k-1} S_{k|k-1}^{-1} \tag{4.10}Kk​=Tk∣k−1​Sk∣k−1−1​(4.10)

  • 更新状态估计
    其中zk+1z_{k+1}zk+1​是当前的观测量,zk∣k−1z_{k|k-1}zk∣k−1​是预测映射在观测空间的伪观测量
    μk=μk∣k−1+Kk(zk+1−zk∣k−1)(4.11)\mu_{k} = \mu_{k|k-1} + K_{k} (z_{k+1} - z_{k|k-1}) \tag{4.11}μk​=μk∣k−1​+Kk​(zk+1​−zk∣k−1​)(4.11)

  • 更新状态协方差矩阵
    Pk=Pk∣k−1+KkSk∣k−1KkT(4.12)P_{k} = P_{k|k-1} + K_{k} S_{k|k-1} K_{k}^T \tag{4.12}Pk​=Pk∣k−1​+Kk​Sk∣k−1​KkT​(4.12)

4.5 总结

总的来看,就是两步无迹变换+计算卡尔曼增益+状态更新,一共十二个公式。
UKF精度优于EKF,相当于二阶泰勒展开,但速度相对略慢一些。
UKF不需要计算雅各比矩阵,省去了求导的过程。
UKF和PF很相似,区别是无迹变换的粒子是固定的,而粒子滤波的粒子是随机的。

附上源码:
UKF_C++
UKF_python

卡尔曼滤波算法原理(KF,EKF,AKF,UKF)相关推荐

  1. 始卡尔曼滤波算法(KF)、扩展卡尔曼滤波算法(EKF)以及无迹卡尔曼滤波算法(UKF)三者之间的区别?

    原始卡尔曼滤波算法(KF).扩展卡尔曼滤波算法(EKF)以及无迹卡尔曼滤波算法(UKF)三者之间的区别? 原文:https://www.zhihu.com/question/22714163/answ ...

  2. 滤波系列(一)卡尔曼滤波算法(KF):详细数学推导

    滤波系列(一)卡尔曼滤波算法(KF) 在本文,将给出卡尔曼滤波算法的详细数学推导过程,如果想直接了解卡尔曼滤波算法的应用,请看博客:卡尔曼滤波算法的应用(python代码)或者直接可以调用Python ...

  3. INS/GNSS组合导航(四)卡尔曼滤波比较之KF/EKF/UKF/PF

    1.摘要 卡尔曼滤波自1960年代发表至今,在各个时间序列估计领域尤其是位置估计.惯性导航等得到了广泛的应用,后续逐渐演化出EKF.UKF以及PF,本文重点对比KF.EKF与UKF及PF的差异及演化来 ...

  4. 世界上应用最广泛的算法之一的卡尔曼滤波算法原理-从放弃到精通-无人机/机器人应用

    导读:随着传感技术.机器人.自动驾驶以及航空航天等技术的不断发展,对控制系统的精度及稳定性的要求也越来越高.卡尔曼滤波作为一种状态最优估计的方法,其应用也越来越普遍,如在无人机.机器人等领域均得到了广 ...

  5. math: 卡尔曼滤波算法原理以及python实例

    文章来源维基百科 卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器),它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态. 卡尔曼滤波的一个典型实例是从一组有限的,包含噪声的,通过对物体位置 ...

  6. 高斯滤波知识点总结——KF、EKF、UKF以及IF、EIF等

    高斯滤波知识点总结--KF.EKF.UKF以及IF.EIF等 1 引言 本文是我在学习<Probabilistic Robotics >这本书中第三章--高斯滤波过程中的一些知识总结.本文 ...

  7. 几种经典非线性滤波算法简单概括(EKF,UKF,CKF,PF)

    几种经典非线性滤波算法概括(EKF,UKF,CKF,PF) 上一篇文章阐述了Kalman滤波算法,该算法是在线性高斯下的最优滤波估计算法.但是在实际控制系统中,系统的动态过程和测量过程很多情况都是非线 ...

  8. 皮带秤 算法_改进型卡尔曼滤波算法在电子皮带秤动态称重中的应用.PDF

    改进型卡尔曼滤波算法在电子皮带秤动态称重中的应用.PDF 改进型卡尔曼滤波算法在电子皮带秤动态称重中的应用 江苏省计量科学研究院 李冰莹,马宇明,王海涛 南京理工大学 机械工程学院 李永新,葛方丽 [ ...

  9. 自动驾驶算法-滤波器系列(二)—— 卡尔曼滤波简介及其变种(EKF、UKF、PF)介绍

    KF&EKF&UKF&PF 1. 基础知识概要 协方差矩阵 多维高斯分布 状态空间表达式 2. 什么是卡尔曼滤波器 3. 五个重要的公式 公式介绍 公式推导过程 4. 卡尔曼滤 ...

最新文章

  1. 一.Linq to JSON是用来干什么的?
  2. C#利用Graphics类绘制进阶--根据文字内容自动生成指定旋转角度图片
  3. linux获取url中文内容_Chrome OS 似乎将在Linux 的方向上更进一步
  4. 报班学python到底怎么样-你们都是怎么学 Python 的?
  5. 洛谷 - P3246 [HNOI2016]序列(莫队+单调栈)
  6. 推荐美加版S3好用的两个ROM
  7. 隐式反馈的去噪,模型取得巨大提升!
  8. FR算法(Fruchterman-Reingold)Python实现
  9. 讲解wpe抓包,封包
  10. 解除诺顿企业版的 liveupdate 旁边小锁,解除限制 手动 更新诺顿的方法
  11. 计算机控制总线传输的是,总线,地址总线,数据总线和控制总线
  12. 细说 MySQL登录
  13. 偏差(bias)和方差(variance)区别:
  14. Android:执行exec app_process启动jar失败原因
  15. 亚马逊Amazon Vendor Central EDI对接流程
  16. BigBrother:UCloud 全链路大规模网络连通性检测系统详解
  17. Learning English From Android Source Code:1
  18. 美团/饿了么外卖劵系统开发(现成系统源码)
  19. C# 将所有的DLL文件 打包到 exe里面,就是说整个项目只有一个exe
  20. 音频Codec标准组织

热门文章

  1. P型MOS管常用型号表,电子工程师选型必备!
  2. SIMM300的一些知识(转)
  3. 三种监控服务器的搭建(Cacti,Nagios,Zabbix)
  4. 计算机二级C语言公共基础知识,以及习题总结(六)数据模型
  5. 我们来找茬外挂思路之一
  6. 将文件复制到FTP服务器时发生错误。请检查是否有权限访问该文件夹 问题解决
  7. 基于Java的宿舍管理系统
  8. 基于 Qt Quick+websocket 的Web扫描仪驱动开发
  9. 西邮Linux兴趣小组2021纳新面试题
  10. php框架实现原理,Ylmf-PHP框架基本原理