• 滤波算法_标准卡尔曼滤波(SKF, Standard Kalman filter)_①基础铺垫


    学习卡尔曼滤波不能一蹴而就,特别是对于基础薄弱者而言,需要一步一步来,在推导kalman滤波算法之前,需要学习一些基础知识作为铺垫。

    1、递归算法

    卡尔曼滤波,它本质上是一种最优递归数字处理算法。卡尔曼滤波器的应用非常广泛,这是因为在实际的系统当中,存在许多的不确定性,主要包含以下三个方面:
    ① 不存在完美的数学模型
    ② 系统的扰动不可控,也很难建模
    ③ 测量传感器存在误差

    例子: 找不同的人测量一个硬币的直径(测量的人不同,尺子存在误差)

    在这里插入图片描述在这里插入图片描述

    测量结果: z k {z_k} zk表示第k次的测量结果。

    此时,如果我们要去估计真实数据 → 自然想到取平均值

    数学表达如下:
    x ^ k = 1 k ( z 1 + z 2 + ⋯ + z k ) , x ^ k 表示第 k 次的估计值。 {\hat x_k} = {1 \over k}\left( {{z_1} + {z_2} + \cdots + {z_k}} \right),{\hat x_k}表示第k次的估计值。 x^k=k1(z1+z2++zk)x^k表示第k次的估计值。

    将取平均推导成递归表达式:
    x ^ k = 1 k ( z 1 + z 2 + ⋯ + z k − 1 ) + 1 k z k = 1 k ⋅ k − 1 k − 1 ( z 1 + z 2 + ⋯ + z k − 1 ) + 1 k z k = k − 1 k ⋅ 1 k − 1 ( z 1 + z 2 + ⋯ + z k − 1 ) + 1 k z k = k − 1 k ⋅ x ^ k − 1 + 1 k z k = x ^ k − 1 − 1 k x ^ k − 1 + 1 k z k

    x^k=1k(z1+z2++zk1)+1kzk=1kk1k1(z1+z2++zk1)+1kzk=k1k1k1(z1+z2++zk1)+1kzk=k1kx^k1+1kzk=x^k11kx^k1+1kzk" role="presentation" style="position: relative;">x^k=1k(z1+z2++zk1)+1kzk=1kk1k1(z1+z2++zk1)+1kzk=k1k1k1(z1+z2++zk1)+1kzk=k1kx^k1+1kzk=x^k11kx^k1+1kzk
    x^k=k1(z1+z2++zk1)+k1zk=k1k1k1(z1+z2++zk1)+k1zk=kk1k11(z1+z2++zk1)+k1zk=kk1x^k1+k1zk=x^k1k1x^k1+k1zk

    整理可得:
    x ^ k = x ^ k − 1 + 1 k ( z k − x ^ k − 1 ) {\hat x_k} = {\hat x_{k - 1}} + \frac{1}{k}\left( {{z_k} - {{\hat x}_{k - 1}}} \right) x^k=x^k1+k1(zkx^k1)

    当k↑, 1 k → 0 \frac{1}{k} \to 0 k10 x ^ k → x ^ k − 1 {\hat x_k} \to {\hat x_{k - 1}} x^kx^k1 ,随着k增加,测量的结果 z k {z_k} zk就不重要了。

    理解: 当你有了大量的数据之后,测量了很多次
    对估计的结果很有信心了,所以以后的测量值就变得不那么重要了

    相反,当k小, 1 k \frac{1}{k} k1大, z k {z_k} zk的作用较大。

    当k↑, , ,随着k增加,测量的结果 就不重要了
    理解: 当你有了大量的数据之后,测量了很多次
    对估计的结果很有信心了,所以以后的测量值就变得不那么重要了
    相反,当k小, 大, 的作用较大。

    我们用 K k {K_k} Kk来代替 1 k \frac{1}{k} k1,就可以得到
    x ^ k = x ^ k − 1 + K k ( z k − x ^ k − 1 ) {\hat x_k} = {\hat x_{k - 1}} + {K_k}\left( {{z_k} - {{\hat x}_{k - 1}}} \right) x^k=x^k1+Kk(zkx^k1)

    当前的估计值 = 上一次的估计值 + 系数 × (当前的测量值 – 上一次的估计值)

    在Kalman滤波器里面这个 K k {K_k} Kk叫作: Kalman Gain 卡尔曼增益/因数。

    观察公式 x ^ k = x ^ k − 1 + K k ( z k − x ^ k − 1 ) {\hat x_k} = {\hat x_{k - 1}} + {K_k}\left( {{z_k} - {{\hat x}_{k - 1}}} \right) x^k=x^k1+Kk(zkx^k1),估计值 x ^ k {\hat x_k} x^k和上一次的估计值 x ^ k − 1 {\hat x_{k - 1}} x^k1有关,这就是递归的思想。


    下面对 K k {K_k} Kk做一个简单的讨论,做一个初步的认识。
    引入两个概念。
    估计误差,用 e E S T {e_{EST}} eEST表示,( e e e是error误差的缩写, E S T EST EST是estimate估计的缩写)
    测量误差,用 e M E A {e_{MEA}} eMEA表示,( M E A MEA MEA是measurement测量的缩写)
    K k = e E S T k − 1 e E S T k − 1 + e M E A k {K_k} = \frac{{{e_{ES{T_{k - 1}}}}}}{{{e_{ES{T_{k - 1}}}} + {e_{ME{A_k}}}}} Kk=eESTk1+eMEAkeESTk1

    讨论: 在k时刻
    e E S T k − 1 {e_{ES{T_{k - 1}}}} eESTk1 >> e M E A k {e_{ME{A_k}}} eMEAk , K k → 1 {K_k} \to 1 Kk1 , x ^ k = x ^ k − 1 + 1 ⋅ ( z k − x ^ k − 1 ) = z k {\hat x_k} = {\hat x_{k - 1}} + 1 \cdot \left( {{z_k} - {{\hat x}_{k - 1}}} \right) = {z_k} x^k=x^k1+1(zkx^k1)=zk 。当k-1的估计误差 远大于 k次的测量误差的时候,第k的估计就很趋近于测量值。
    e E S T k − 1 {e_{ES{T_{k - 1}}}} eESTk1 << e M E A k {e_{ME{A_k}}} eMEAk, K k → 0 {K_k} \to 0 Kk0 , x ^ k = x ^ k − 1 + 0 ⋅ ( z k − x ^ k − 1 ) = x ^ k − 1 {\hat x_k} = {\hat x_{k - 1}} + 0 \cdot \left( {{z_k} - {{\hat x}_{k - 1}}} \right) = {\hat x_{k - 1}} x^k=x^k1+0(zkx^k1)=x^k1。当测量误差很大的时候,我们去选择更多的相信估计值。


    下面用一个例子来简单体会一下上面学到的知识。
    Step1 计算Kalman Gain K k = e E S T k − 1 e E S T k − 1 + e M E A k {K_k} = \frac{{{e_{ES{T_{k - 1}}}}}}{{{e_{ES{T_{k - 1}}}} + {e_{ME{A_k}}}}} Kk=eESTk1+eMEAkeESTk1
    Step2 计算估计值 x ^ k = x ^ k − 1 + K k ( z k − x ^ k − 1 ) {\hat x_k} = {\hat x_{k - 1}} + {K_k}\left( {{z_k} - {{\hat x}_{k - 1}}} \right) x^k=x^k1+Kk(zkx^k1)
    Step3 更新估计误差 , e E S T k = ( 1 − K k ) e E S T k − 1 {e_{ES{T_k}}} = \left( {1 - {K_k}} \right){e_{ES{T_{k - 1}}}} eESTk=(1Kk)eESTk1,此部分会在后面详细推导。

    有了这三步以后,开始可以应用了。
    比如一个物体他实际的长度是 x = 50 m m x = 50mm x=50mm,我们第一次的估计值随便估计一个 x ^ 0 = 40 m m {\hat x_0} = 40mm x^0=40mm,第一次的估计误差随便给一个数字 e E S T 0 = 5 m m {e_{ES{T_0}}} = 5mm eEST0=5mm,假设我们的测量误差都是 e M E A = 3 m m {e_{MEA}} = 3mm eMEA=3mm
    下面给出Excel的计算结果
    在这里插入图片描述
    根据上面的内容,有没有体会到递归的味道呢?

    2、数据融合

    假设我们用两个称去称一个东西,得到了两个结果分别是

    z 1 = 30 g {z_1} = 30g z1=30g, δ 1 = 2 g {\delta _1} = 2g δ1=2g标准差
    z 2 = 32 g {z_2} = 32g z2=32g, δ 1 = 4 g {\delta _1} = 4g δ1=4g标准差
    假设它们都不准,符合正态分布
    如果我们现在需要去估算真实值 z ^ = ? \hat z = ? z^=?
    在这里插入图片描述

    利用上小节学到的内容,我们进行如下估计:
    z ^ = z 1 + k ( z 2 − z 1 ) \hat z = {z_1} + k\left( {{z_2} - {z_1}} \right) z^=z1+k(z2z1)
    k k k为kalman gain, k ∈ [ 0 , 1 ] k \in \left[ {0,1} \right] k[0,1],当 k = 0 k = 0 k=0时, z ^ = z 1 \hat z = {z_1} z^=z1,我们更相信称1的结果,当 k = 1 k = 1 k=1时, z ^ = z 2 \hat z = {z_2} z^=z2,我们更相信称2的结果。

    下面来求解最优的 k k k,使得估计值 z ^ \hat z z^的标准差 δ z ^ \delta \hat z δz^最小,标准差最小,即方差 v a r ( z ^ ) {\mathop{\rm var}} \left( {\hat z} \right) var(z^)最小(方差是标准差的平方)。
    δ z ^ 2 = v a r ( z ^ ) = v a r [ z 1 + k ( z 2 − z 1 ) ] = v a r [ ( 1 − k ) z 1 + k z 2 ] , 两个称是相互独立的,互不影响 = ( 1 − k ) 2 v a r ( z 1 ) + k 2 v a r ( z 2 ) = ( 1 − k ) 2 δ 1 2 + k 2 δ 2 2

    δz^2=var(z^)=var[z1+k(z2z1)]=var[(1k)z1+kz2],=(1k)2var(z1)+k2var(z2)=(1k)2δ12+k2δ22" role="presentation">δz^2=var(z^)=var[z1+k(z2z1)]=var[(1k)z1+kz2],=(1k)2var(z1)+k2var(z2)=(1k)2δ12+k2δ22
    δz^2=var(z^)=var[z1+k(z2z1)]=var[(1k)z1+kz2],两个称是相互独立的,互不影响=(1k)2var(z1)+k2var(z2)=(1k)2δ12+k2δ22
    要寻找一个合适的 k k k,使得 δ z ^ 2 \delta _{\hat z}^2 δz^2最小,那么就对 δ z ^ 2 \delta _{\hat z}^2 δz^2 k k k的导数,并令其 = 0 =0 =0

    d δ z ^ 2 d k = 2 ⋅ ( − 1 ) ⋅ ( 1 − k ) δ 1 2 + 2 k δ 2 2 = 0 ⇒ k ( δ 1 2 + δ 2 2 ) = δ 1 2 ⇒ k = δ 1 2 δ 1 2 + δ 2 2

    dδz^2dk=2(1)(1k)δ12+2kδ22=0k(δ12+δ22)=δ12k=δ12δ12+δ22" role="presentation" style="position: relative;">dδz^2dk=2(1)(1k)δ12+2kδ22=0k(δ12+δ22)=δ12k=δ12δ12+δ22
    dkdδz^2=2(1)(1k)δ12+2kδ22=0k(δ12+δ22)=δ12k=δ12+δ22δ12

    把实际的参数代入可得:
    k = δ 1 2 δ 1 2 + δ 2 2 = 2 2 2 2 + 4 2 = 0.2 , z ^ = z 1 + k ( z 2 − z 1 ) = 30 + 0.2 ( 32 − 30 ) = 30.4 g k = \frac{{\delta _1^2}}{{\delta _1^2 + \delta _2^2}} = \frac{{{2^2}}}{{{2^2} + {4^2}}} = 0.2, \hat z = {z_1} + k\left( {{z_2} - {z_1}} \right) = 30 + 0.2\left( {32 - 30} \right) = 30.4g k=δ12+δ22δ12=22+4222=0.2,z^=z1+k(z2z1)=30+0.2(3230)=30.4g

    另外,估计值的标准差也可以代入计算。
    δ z ^ 2 = ( 1 − k ) 2 δ 1 2 + k 2 δ 2 2 = ( 1 − 0.2 ) 2 2 2 + 0. 2 2 4 2 = 3.2 ⇒ δ z ^ = δ z ^ 2 = 1.79 g \delta _{\hat z}^2 = {\left( {1 - k} \right)^2}\delta _1^2 + {k^2}\delta _2^2 = {\left( {1 - 0.2} \right)^2}{2^2} + {0.2^2}{4^2} = 3.2 \Rightarrow \delta \hat z = \sqrt[{}]{{\delta _{\hat z}^2}} = 1.79g δz^2=(1k)2δ12+k2δ22=(10.2)222+0.2242=3.2δz^=δz^2 =1.79g

    下面分析一下上述的推导结果
    δ z ^ < δ z 1 \delta \hat z < \delta z_1 δz^<δz1 δ z ^ < δ z 2 \delta \hat z < \delta z_2 δz^<δz2,说明什么? 说明利用两个不太准确的的测量值对真实值进行估计计算,能够得到一个比两个都更准确的结果。这个过程,就叫做数据融合。

    夹带点私货: 那么如果我有三个称呢? 我先两个称融合,用结果再和第三称再融合。
    在卡尔曼滤波的时候,是用模型估计 和 测量估计进行数据融合, 如果我的系统存在多个同类型传感器可以得到测量值呢,那是否可以先多个传感器先进行数据融合,然后再进行 模型估计和测量估计的数据融合呢? 如果我的系统存在多个同类型传感器和多个不同类型的传感器可得到与状态向量相关的测量值呢? 那这时候应该如何利用这些去得到一个更准确的状态估计呢? 这是后续值得进一步学习的方向。

    感谢您的阅读,欢迎留言讨论、收藏、点赞、分享。

  • 相关阅读:
    基于JAVA社区养老服务管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    HTML动画效果技术指南:打造引人注目的网页悬浮体验
    Mysql 单行处理函数打字练习—— 让你熟悉必要的函数,提高查询效率
    进程调度的基本关系
    vue3.2的特性
    Linux 内核活动专题
    现代企业管理笔记——控制
    Euro-NCAP-2023 安全辅助避撞系统测试流程中文版
    【c++】虚函数,纯虚函数,抽象类
    Python 解决tkinter的Menu菜单command参数与bind方法共用触发事件
  • 原文地址:https://blog.csdn.net/heqiunong/article/details/126754506