• 状态估计和KalmanFilter公式的推导与应用


    状态估计的概率解释

    运动和观测方程:

    (1.1){xk=f(xk1,uk)+wkzk=h(yj,xk)+vk,jk=1,,N,j=1,,M" role="presentation">(1.1){xk=f(xk1,uk)+wkzk=h(yj,xk)+vk,jk=1,,N,j=1,,M

    其中,各个参数的含义如下:

    • xk" role="presentation">xk :机器人的位姿。

    • uk" role="presentation">uk :系统在k时刻的输入量。

    • wk" role="presentation">wk:位姿变化的随机噪声。

    • zk" role="presentation">zk :系统的观测值,传感器采集的观测数据。

    • yj" role="presentation">yj :路标,或者说是观测点。

    • vk,j" role="presentation">vk,j:观测过程中的随机噪声。

    我们的目标则是利用系统在k时刻的输入量uk" role="presentation">uk和系统的观测量zk" role="presentation">zk,估计机器的位姿xk" role="presentation">xk和路标点yj" role="presentation">yj的概率分布。

    在比较常见且合理的情况下,我们可以假设状态量和噪声项服从高斯分布——这意味这我们在程序中只需要存储他们的均值和协方差矩阵即可。均值可以看作变量的最最优估计,协方差则可以度量变量的不确定性。

    由于位姿xk" role="presentation">xk和路标点yj" role="presentation">yj都是需要我们估计的变量,这里我们改变符号的意义。令xk" role="presentation">xk为k时刻所有的未知量,记作:

    (1.2)xk=def{xk,y1,,ym}" role="presentation">(1.2)xk=def{xk,y1,,ym}

    根据上述(1.1)和(1.2)可以将运动方程和观测方程写成如下形式:

    (1.3){xk=f(xk1,uk)+wkzk=h(xk)+vk,jk=1,,N" role="presentation">(1.3){xk=f(xk1,uk)+wkzk=h(xk)+vk,jk=1,,N

    现在考虑第k时刻的情况,我们希望使用过去0到时刻的数据来估计现在的状态分布:

    (1.4)P(xk|x0,u1:k,z1:k)" role="presentation">(1.4)P(xk|x0,u1:k,z1:k)

    根据贝叶斯公式,可以得到如下公式:

    (1.5)P(xk|x0,u1:k,z1:k)P(zk|xk)P(xk|x0,u1:k,z1:k1)" role="presentation">(1.5)P(xk|x0,u1:k,z1:k)P(zk|xk)P(xk|x0,u1:k,z1:k1)

    这里的第一项称为似然,第二项称为先验。似然由观测方程给定,而先验部分,xk" role="presentation">xk是基于过去所有状态估计而来的。至少,它会受到xk1" role="presentation">xk1的影响,于是我们以xk1" role="presentation">xk1时刻为条件概率展开:

    (1.6)P(xk|x0,u1:k,z1:k1)=P(xk|xk1,x0,u1:k,z1:k1)P(xk1|x0,u1:k,z1:k1)dxk1" role="presentation">(1.6)P(xk|x0,u1:k,z1:k1)=P(xk|xk1,x0,u1:k,z1:k1)P(xk1|x0,u1:k,z1:k1)dxk1

    对于后续的操作,有很多的方法。

    • 其中一种方法就是假设马尔可夫性

      一阶马尔可夫性: k时刻的状态只和k-1时刻的状态有关,而与再之前的无关。

      如果这样假设,我们得到的是以扩展卡尔曼滤波EKF)为代表的滤波器方法。

    • 另一种方法是依然考虑k时刻和之前所有状态的关系,此时得到的是非线性优化为主体的优化框架。

    在这里,我们先了解卡尔曼滤波的原理和应用。

    线性系统和卡尔曼滤波

    根据上文,我们假设了这个系统符合马尔可夫性,我们可以对公式(1.6)做出一些简化。

    • 公式右侧第一部分可以简化成如下形式:

      (2.1)P(xk|xk1,x0,u1:k,z1:k1)=P(xk|xk1,u1:k)" role="presentation">(2.1)P(xk|xk1,x0,u1:k,z1:k1)=P(xk|xk1,u1:k)

    • 公式右侧第二部分:(已知k时刻只和k-1时刻的状态相关)

      (2.2)P(xk1|x0,u1:k,z1:k1)=P(xk1|x0,u1:k1,z1:k1)" role="presentation">(2.2)P(xk1|x0,u1:k,z1:k1)=P(xk1|x0,u1:k1,z1:k1)

    观察上述公式,我们可以知道,我们实际上在做“如何把k-1时刻的状态分布推导至k时刻”这一件事请。

    我们假设状态量服从高斯分布,从最简单的线性高斯系统开始,得到如下公式:

    (2.3){xk=Akxk1+uk+wkzk=Ckxk+vk,jk=1,,N" role="presentation">(2.3){xk=Akxk1+uk+wkzk=Ckxk+vk,jk=1,,N

    假设所有的状态和噪声都符合高斯分布,这里的噪声可以记作:(这里省略了R和Q的下标)

    (2.4)wkN(0,R)vkN(0,Q)" role="presentation">(2.4)wkN(0,R)vkN(0,Q)

    利用马尔可夫性,假设我们已知k-1时刻的状态,也就是k-1时刻的后验状态估计x^k1" role="presentation">x^k1及其协方差P^k1" role="presentation">P^k1,现在要根据k时刻的输入,确认xk" role="presentation">xk的后验。

    这里我们使用x^k" role="presentation">x^k表示后验分布,使用x~k" role="presentation">x~k表示先验分布。

    卡尔曼滤波第一步: 通过运动方程确认xk" role="presentation">xk的先验分布。这一步是线性的,高斯分布的线性变换依然是高斯分布,所以可以得到如下公式:

    (2.5)P(xk|xk1,x0,u1:k,z1:k1)=N(Akx^k1+uk,AkP^k1AkT+R)" role="presentation">(2.5)P(xk|xk1,x0,u1:k,z1:k1)=N(Akx^k1+uk,AkP^k1AkT+R)

    这里协方差的推导可以参考《概率论与数理统计》的P112页,关于n维正态随机变量的协方差矩阵。

    这一步称为预测。可以记作:

    (2.6)x~k=Akx^k1+uk,P~k=AkP^k1AkT+R" role="presentation">(2.6)x~k=Akx^k1+uk,P~k=AkP^k1AkT+R

    卡尔曼滤波第二步: 根据观测方程,我们可以计算莫格时刻应该产生怎样的观测数据:

    (2.7)P(zk|xk)=N(Ckxk,Q)" role="presentation">(2.7)P(zk|xk)=N(Ckxk,Q)

    我们已经假设状态量符合高斯分布,根据贝叶斯公式,可以得到如下公式:

    (2.8)N(x^k,P^k)=ηN(Ckxk,Q)N(x~k,P~k)" role="presentation">(2.8)N(x^k,P^k)=ηN(Ckxk,Q)N(x~k,P~k)

    两侧都是高斯分布,我们带入高斯分布的公式,只需要保证指数部分相同,无需理会前面的因子部分。可以得到如下公式:

    (2.9)(xkx^k)TP^1k(xkx^k)=(zkCkxk)TQ^k1(zkCkxk)+(xkx~k)TP~k1(xkx~k)" role="presentation">(2.9)(xkx^k)TP^1k(xkx^k)=(zkCkxk)TQ^k1(zkCkxk)+(xkx~k)TP~k1(xkx~k)

    我们需要根据上述这个公式推导出x^k" role="presentation">x^kP^k" role="presentation">P^k

    这里是通过系数相等进行了化简,我在这里简写一下:

    (2.10){P^k1=CkTQ1Ck+P~k12x^kTP^k1xk=2zkTQ1Ckxk2x~kTP~k1xk" role="presentation">(2.10){P^k1=CkTQ1Ck+P~k12x^kTP^k1xk=2zkTQ1Ckxk2x~kTP~k1xk

    我们记作K=P^kCkTQ1" role="presentation">K=P^kCkTQ1得到如下公式:

    (2.11){P^k=(IKCk)P~kx^k=x~k+K(zkCkx^k)" role="presentation">(2.11){P^k=(IKCk)P~kx^k=x~k+K(zkCkx^k)

    这个部称为更新

    总结kalmanFilter的用法

    1. 预测

      (2.12)x~k=Akx^k1+uk,P~k=AkP^k1AkT+R" role="presentation">(2.12)x~k=Akx^k1+uk,P~k=AkP^k1AkT+R

    2. 更新:先计算K(卡尔曼增益), 然后更新后验概率的分布。

      (2.13)K=P^kCkT(CkP~kCkT+Qk)1P^k=(IKCk)P~kx^k=x~k+K(zkCkx^k)" role="presentation">(2.13)K=P^kCkT(CkP~kCkT+Qk)1P^k=(IKCk)P~kx^k=x~k+K(zkCkx^k)

  • 相关阅读:
    1.3 消息队列(7-8)
    Vue —— vue相关面试题分享
    ViewPager 异常状态之 无法切换、循环切换
    实验2.1.2 交换机的常用配置
    长难句5.15
    Web安全知识
    hdu3549--Flow Problem(初识最大流)
    垃圾分类解决方案-最新全套文件
    Vue开发中cnpm,yarn,npm,nodejs 区别与关系
    [SDR] GNU Radio 系列教程(十五)—— GNU Radio GFSK 模块
  • 原文地址:https://www.cnblogs.com/qi-xmu/p/16857417.html