zoukankan      html  css  js  c++  java
  • 卡尔曼滤波器原理之基本思想(二)

      在上一篇文章卡尔曼滤波器原理之基本思想中,我们分析并推导了基于卡尔曼一步预测的滤波器状态递推公式,接下来,我们将完成上一次的推导过程。首先,我们拿来上次的推导结果:

    [hat x(n + 1|{{f{Y}}_n}) = sumlimits_{k = 1}^{n - 1} {E[x(n + 1){alpha ^H}(k)]{{f{R}}^{ - 1}}(k)alpha (k)}  + E[x(n + 1){alpha ^H}(k)]{{f{R}}^{ - 1}}(k)alpha (k)]

      右侧的求和项由过程方程可改写为:

    [egin{array}{l}
     sumlimits_{k = 1}^{n - 1} {E[x(n + 1){alpha ^H}(k)]{{f{R}}^{ - 1}}(k)alpha (k)}  \
      = sumlimits_{k = 1}^{n - 1} {Eleft{ {left[ {{f{F}}(n + 1,n)x(n) + {v_1}} ight]{alpha ^H}(k)} ight}{{f{R}}^{ - 1}}(k)alpha (k)}  \
      = {f{F}}(n + 1,n)sumlimits_{k = 1}^{n - 1} {Eleft{ {left[ {x(n) + {v_1}} ight]{alpha ^H}(k)} ight}} {{f{R}}^{ - 1}}(k)alpha (k) \
      = {f{F}}(n + 1,n)sumlimits_{k = 1}^{n - 1} {Eleft[ {x(n){alpha ^H}(k)} ight]} {{f{R}}^{ - 1}}(k)alpha (k) \
      = {f{F}}(n + 1,n)hat x(n|{{f{Y}}_{n - 1}}) \
     end{array}]

      同时,如果我们定义矩阵:

    [{f{G}}(n) = E[x(n + 1){alpha ^H}(n)]{{f{R}}^{ - 1}}(n)]

      这里G(n)就是大名鼎鼎的卡尔曼增益。结合上面两个式子,系统状态的递推公式可以简写为

    [hat x(n + 1|{{f{Y}}_n}) = {f{F}}(n + 1,n)hat x(n|{{f{Y}}_{n - 1}}) + {f{G}}(n)alpha (n)]

       等式右侧第二项通常称为修正项,上式的物理意义是比较明确的,它表明:系统状态的最小均方估计可以由前一个估计再加上修正项得到。这样一来,观测值是已知的,说明新息是很容易求出来的,只要再有了卡尔曼增益G(n),我们就可以由当前状态预估下一个状态,这样不断的迭代更新...,慢着!好像忽略了一个问题,那就是第一个系统状态估计,也就是初始值。其实这个好解决,通常设为系统第一个状态的经验均值就可以,只要卡尔曼预测过程是收敛的,就不会有问题。至此,我们唯一剩下的问题是:要以什么样的方式来计算卡尔曼增益G(n)

      首先,我们计算

    [E[x(n + 1){alpha ^H}(n)] = {f{F}}(n + 1,n)E[x(n){alpha ^H}(n)] = {f{F}}(n + 1,n)E[x(n){[{f{C}}(n)varepsilon (n,n - 1) + {v_2}(n)]^H}]]

      因为状态x(n)与噪声v2(n)互不相关,所以

    [E[x(n + 1){alpha ^H}(n)] = {f{F}}(n + 1,n)E[x(n){varepsilon ^H}(n,n - 1)]{{f{C}}^H}(n) = {f{F}}(n + 1,n)E[(varepsilon (n,n - 1) + hat x(n|{{f{Y}}_{n - 1}})){varepsilon ^H}(n,n - 1)]{{f{C}}^H}(n)]

      又因为状态误差向量与其估计正交,因此

    [E[x(n + 1){alpha ^H}(n)] = {f{F}}(n + 1,n)E[varepsilon (n,n - 1){varepsilon ^H}(n,n - 1)]{{f{C}}^H}(n) = {f{F}}(n + 1,n){f{K}}(n,n - 1){{f{C}}^H}(n)]

      所以

    [{f{G}}(n) = E[x(n + 1){alpha ^H}(n)]{{f{R}}^{ - 1}}(n) = {f{F}}(n + 1,n){f{K}}(n,n - 1){{f{C}}^H}(n){{f{R}}^{ - 1}}(n)]

      看来,事情还没有完,又出现了一个新的变量,状态误差相关矩阵。看来,还是无法利索的得到卡尔曼增益。那么,我们试试看能不能导出状态误差相关矩阵的递归表示。这样,一切就都完美了!让我们开始吧,这一步耗死了我不少脑细胞。《自适应滤波器原理》这本书中详细的细节并没有给出,下面把详细过程给出来。先把状态误差展开:

    [egin{array}{l}
     varepsilon (n + 1,n) = x(n + 1) - hat x(n + 1|{{f{Y}}_n}) \
      = {f{F}}(n + 1,n)x(n) + {v_1} - left[ {{f{F}}(n + 1,n)hat x(n|{{f{Y}}_{n - 1}}) + {f{G}}(n)alpha (n)} ight] \
      = {f{F}}(n + 1,n)left[ {x(n) - hat x(n|{{f{Y}}_{n - 1}})} ight] - {f{G}}(n)alpha (n) + {v_1}(n) \
      = {f{F}}(n + 1,n)left[ {x(n) - hat x(n|{{f{Y}}_{n - 1}})} ight] - {f{G}}(n)left[ {y(n) - {f{C}}(n)hat x(n|{{f{Y}}_{n - 1}})} ight] + {v_1} \
      = {f{F}}(n + 1,n)left[ {x(n) - hat x(n|{{f{Y}}_{n - 1}})} ight] - {f{G}}(n)left[ {{f{C}}(n)x(n) + {v_2}(n) - {f{C}}(n)hat x(n|{{f{Y}}_{n - 1}})} ight] + {v_1}(n) \
      = {f{F}}(n + 1,n)left[ {x(n) - hat x(n|{{f{Y}}_{n - 1}})} ight] - {f{G}}(n){f{C}}(n)left[ {x(n) - hat x(n|{{f{Y}}_{n - 1}})} ight] + {f{G}}(n){v_2}(n) + {v_1}(n) \
      = left[ {{f{F}}(n + 1,n) - {f{G}}(n){f{C}}(n)} ight]varepsilon (n,n - 1) + {f{G}}(n){v_2}(n) + {v_1}(n) \
     end{array}]

      现在我们可以以此为依据把状态误差相关矩阵来计算,看看能推出什么。因为展开的过程中式子会比较长,为了公式排版更好,先简写一下符号,定义

    [egin{array}{l}
     {egin{array}{*{20}{c}}
       {{f{K}}(n,n - 1) = {{f{K}}_{n - 1}}} & {{f{G}}(n) = {{f{G}}_n}} & {{{f{Q}}_2}(n) = {{f{Q}}_2}} & {{{f{Q}}_1}(n) = {f{Q}}}  \
    end{array}_1} \
     egin{array}{*{20}{c}}
       {{f{C}}(n) = {{f{C}}_n}} & {{{f{C}}^H}(n) = {f{C}}_n^H}  \
    end{array} \
     egin{array}{*{20}{c}}
       {{f{R}}(n) = {{f{R}}_n}} & {{{f{R}}^{ - 1}}(n) = {f{R}}_n^{ - 1}}  \
    end{array} \
     egin{array}{*{20}{c}}
       {{f{F}}(n + 1,n) = {{f{F}}_n}} & {{f{F}}(n + 1,n){f{F}}(n,n + 1)}  \
    end{array} = {f{I}} \
     end{array}]

      好了,开始正式展开吧,状态误差相关矩阵展开可以表示为(以下推导过程中利用了状态误差相关矩阵与其共轭相等的性质):

    [egin{array}{l}
     {f{K}}(n + 1,n) = Eleft[ {varepsilon (n + 1,n){varepsilon ^H}(n + 1,n)} ight] \
      = left[ {{f{F}}(n + 1,n) - {f{G}}(n){f{C}}(n)} ight]{f{K}}(n,n - 1){left[ {{f{F}}(n + 1,n) - {f{G}}(n){f{C}}(n)} ight]^H} + {f{G}}(n){{f{Q}}_2}(n){{f{G}}^H}(n) + {{f{Q}}_1}(n) \
      = [{{f{F}}_n} - {{f{G}}_n}{{f{C}}_n}]{{f{K}}_{n - 1}}{[{{f{F}}_n} - {{f{G}}_n}{{f{C}}_n}]^H} + {{f{G}}_n}{{f{Q}}_2}{f{G}}_n^H + {{f{Q}}_1} \
      = [{{f{F}}_n} - {{f{F}}_n}{{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}]{{f{K}}_{n - 1}}{[{{f{F}}_n} - {{f{F}}_n}{{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}]^H} + {{f{G}}_n}{{f{Q}}_2}{f{G}}_n^H + {{f{Q}}_1} \
      = {{f{F}}_n}[{f{I}} - {{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}]{{f{K}}_{n - 1}}{[{f{I}} - {{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}]^H}{f{F}}_n^H + {{f{G}}_n}{{f{Q}}_2}{f{G}}_n^H + {{f{Q}}_1} \
      = {{f{F}}_n}left[ {{{f{K}}_{n - 1}} - {{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}{f{K}}_{n - 1}^H - {{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}{{f{K}}_{n - 1}} + {{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}{{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}{f{K}}_{n - 1}^H} ight]{f{F}}_n^H + {{f{G}}_n}{{f{Q}}_2}{f{G}}_n^H + {{f{Q}}_1} \
      = {{f{F}}_n}left[ {{{f{K}}_{n - 1}} - 2{{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}{{f{K}}_{n - 1}} + {{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}left( {{{f{R}}_n} - {{f{Q}}_2}} ight){f{R}}_n^{ - 1}{{f{C}}_n}{f{K}}_{n - 1}^H} ight]{f{F}}_n^H + {{f{G}}_n}{{f{Q}}_2}{f{G}}_n^H + {{f{Q}}_1} \
      = {{f{F}}_n}left[ {{{f{K}}_{n - 1}} - 2{{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}{{f{K}}_{n - 1}} + {{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{R}}_n}{f{R}}_n^{ - 1}{{f{C}}_n}{f{K}}_{n - 1}^H - {{f{F}}_{n + 1}}{{f{G}}_n}{{f{Q}}_2}{f{G}}_n^H{f{F}}_{n + 1}^H} ight]{f{F}}_n^H + {{f{G}}_n}{{f{Q}}_2}{f{G}}_n^H + {{f{Q}}_1} \
      = {{f{F}}_n}left[ {{{f{K}}_{n - 1}} - 2{{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}{{f{K}}_{n - 1}} + {{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}{f{K}}_{n - 1}^H} ight]{f{F}}_n^H - {{f{G}}_n}{{f{Q}}_2}{f{G}}_n^H + {{f{G}}_n}{{f{Q}}_2}{f{G}}_n^H + {{f{Q}}_1} \
      = {{f{F}}_n}left[ {{{f{K}}_{n - 1}} - {{f{K}}_{n - 1}}{f{C}}_n^H{f{R}}_n^{ - 1}{{f{C}}_n}{{f{K}}_{n - 1}}} ight]{f{F}}_n^H + {{f{Q}}_1} \
      = {{f{F}}_n}left[ {{{f{K}}_{n - 1}} - {{f{F}}_{n + 1}}{{f{G}}_n}{{f{C}}_n}{{f{K}}_{n - 1}}} ight]{f{F}}_n^H + {{f{Q}}_1} \
      = {f{F}}(n + 1,n)left[ {{f{K}}(n,n - 1) - {f{F}}(n,n + 1){f{G}}(n){f{C}}(n){f{K}}(n,n - 1)} ight]{{f{F}}^H}(n + 1,n) + {{f{Q}}_1}(n) \
      Rightarrow left{ {egin{array}{*{20}{c}}
       {{f{K}}(n + 1,n) = {f{F}}(n + 1,n){f{K}}(n){{f{F}}^H}(n + 1,n) + {{f{Q}}_1}(n)} hfill  \
       {{f{K}}(n) = {f{K}}(n,n - 1) - {f{F}}(n,n + 1){f{G}}(n){f{C}}(n){f{K}}(n,n - 1)} hfill  \
    end{array}} ight. \
     end{array}]

      上述就是著名的Riccati递归方程。不容易啊,至此,终于完成了线性卡尔曼滤波的推导过程。总结以上过程,线性卡尔曼滤波器主要步骤表示如下:

    [egin{array}{l}
     {f{G}}(n) = {f{F}}(n + 1,n){f{K}}(n,n - 1){{f{C}}^H}(n){[{f{C}}(n){f{K}}(n,n - 1){{f{C}}^H}(n) + {{f{Q}}_2}(n)]^{ - 1}} \
     alpha (n) = y(n) - {f{C}}(n)hat x(n|{{f{y}}_{n - 1}}) \
     hat x(n + 1|{{f{y}}_n}) = {f{F}}(n + 1,n)hat x(n|{{f{y}}_{n - 1}}) + {f{G}}(n)alpha (n) \
     {f{K}}(n) = {f{K}}(n,n - 1) - {f{F}}(n,n + 1){f{G}}(n){f{C}}(n){f{K}}(n,n - 1) \
     {f{K}}(n + 1,n) = {f{F}}(n + 1,n){f{K}}(n){{f{F}}^H}(n + 1,n) + {{f{Q}}_1}(n) \
     end{array}]

      现在,再回想这两篇博客的分析过程,不难看出,卡尔曼滤波器通过使用过程方程对系统的行为进行建模,再通过测量方程对观测行为进行建模。尽可能利用测量信息来得到准确的状态,也是说卡尔曼滤波器的核心是如何求解过程方程和测量方程,难点在于理解均值和协方差的传播过程。再往大了说,它教给了我们一整套如何去认识系统、观察分析系统的方法。可能分析到这里,可能很多朋友觉得终于理解了这个重要的滤波器。可事情并没有这么简单,应该还有以下疑问需要进一步的解决,不解决掉,很可能没有真正理解透彻。

      首先是过程方程,可以看到,过程方程对系统的建模是,系统的下一个状态只与前一个状态有关。可能在有的系统中是可以的,但不够通用化,也不符合很多情况。实际中最常见到的情景是系统的当状态不只应该与前面的状态有关,还与当前的输入有关,这方面可以去看下Lyapunov方程。

      其次,以上推导过程只是前人把理论摸透了,后人整理规整出来的,并不是正常思维下的人们解决问题的思考方法。也就是说,这里并没有解决滤波器的发明者是如何想到用这个方法去解决碰到的问题

      再次,卡尔曼滤波器还有很多变种,这些变种是出于什么目的,为了解决什么问题被发明出来,优劣如何,最好也要搞清楚。

      最后,这里理论分析太多了,没有给出一个或几个实际例子,真碰到问题,可能还是不会灵活的使用,甚至不会用。这几个问题先留着吧,后面逐步进行解答,不管怎么样,先把基本思想理解了。也是一件值得开心的事呢!

  • 相关阅读:
    怎样在黑窗口中查找各种端口
    [Selenium] 数字显示的月份转换为英文显示
    [Selenium] 根据预期的日期格式,获取昨天的日期
    [Selenium] 使用Javascript选中Input框里的内容,然后清空
    Java中for循环遍历List的两种方法
    [Selenium]点击Calendar控件后,Calendar dialog很快消失
    springboot @Slf4j 配置
    springboot线程中获取spring beans
    org.junit.Test 注解失效的问题The import org.junit cannot be resolved
    二叉树java遍历实现
  • 原文地址:https://www.cnblogs.com/icoolmedia/p/kalman_filter_analyze2.html
Copyright © 2011-2022 走看看