[ESKF]系统总结-2021.11.01

目录

一. ESKF的流程

二. ESKF的好处

三. 结合VINS 和 文献[1],讨论两种获得误差状态递推方程的方法

 (0)基础数学知识

  (一)原理分析

      1. 微分形式获得误差递推方程

      2. 一阶泰勒展开获得误差递推方程

  (二)获得误差状态递推方程的小技巧

  (三)误差状态方程、标称状态方程离散化方法需要保持一致吗?

四. 一些实际应用中的技巧

五. 一些实践小例子

TODO


一. ESKF的流程

  对应正常状态的EKF流程,ESKF流程有如下改变:

  1. 误差状态预测:deltaX_k = 0 .  同时,进行正常状态预测(用于步骤4,和 后续的误差状态重置。)

      - 因为在上一次滤波结束后,k-1时刻的误差状态被重置为0,因此,k时刻的误差状态预测的结果也是0。

  2. 协方差更新:和EKF一样,不变。

      公式267 是 误差状态递推方程  -----  这是我们要求解的;

      公式268-269 分别是 误差状态预测;协方差更新 

  3. 计算卡尔曼增益:和EKF一样,不变。

  4. 利用观测量进行状态更新:如图1 公式275所示

      - 完整的公式应该是: deltaX_k =  deltaX_k + K(y-h(X))。因为误差状态的预测量 deltaX_k=0,所以省略了。

      - 公式275 中的 Xt = X + deltaX。 X 是步骤1之后的,当前时刻的状态预测量;deltaX 是当前时刻的误差状态预测量。

   5.  协方差更新:不变。

                 图1. 步骤3-5- 参考自《Quaternion kinematics for the error-state Kalman filter》

    - 关键的H计算。明确一点,H 是 函数 h(Xt) 对误差状态 deltaX的导数。利用链式法则:

图2. H 计算公式

            然后分别计算 Hx, X_deltax 即可。 详细的,参考 《Quaternion kinematics for the error-state Kalman filter》

     - 此外,还有最重要的更新。将误差状态量补偿到正常状态量上,同时,误差状态量和其协方差进行更新。如图3所示。当状态量中包含旋转R时,P' 并不严格的等于 P。我们近似认为 P'  = P 。详细的参考:《Quaternion kinematics for the error-state Kalman filter》P64 6.3 ESKF reset

图3. 协方差更新

二. ESKF的好处

参考文献[1] 5.1 P52

1. 旋转部分可以用李代数表示,避免过参数化;

2. 求解雅阁比时,线性化点一直是 deltaX=0

3. 二阶量视为无穷小,可以被忽略

4. 误差量的变化是缓慢的,因此,观测更新(步骤4)可以比预测(步骤1)慢。即: 观测量的频率可以低于IMU的频率。

三. 结合VINS 和 文献[1],讨论两种获得误差状态递推方程的方法

 (0)基础数学知识

      1. 姿态对时间的导数

      

 此外,还有常用的:

 

        2. 伴随性质

            参考文献[2]

          

            以及一个变种:   R*[w]x*R-1 = [Rw]x

  (一)原理分析

      为什么要获得误差递推方程?

      - 在ESKF中,显然,误差递推方程是必须的,即步骤1;

      - 在VIO中,需要计算预积分的协方差,协方差的传播过程,需要知道误差递推方程。

      如何获得误差递推方程?有哪些方法?

      - 通过微分形式获得(滤波通常采用)

      - 一阶泰勒展开获得 (VIO通常采用)

      下面分别解析两种方法:

      1. 微分形式获得误差递推方程

       声明:这里只是简单介绍思路,详细过程参考文献[1]

        1) 获得误差状态微分方程

            已知 真实状态 = 标称状态+误差状态。可以很容易写出真实状态和标称状态的微分方程,因此获得误差状态微分方程。参考文献[1] 5.3节。

            推导过程中有如下技巧: 详见(二)

             zm_ekf 中使用的技巧:详见(二)

         2)标称状态微分方程离散化,获得标称状态方程

          - 具体方法有: 欧拉,中值积分,RK4。参考文献[1]附录A

         3)误差微分方程获得误差状态递推方程

               要做什么事情呢?已知误差微分方程  

             最终要获得离散时间下的误差递推方程:       

             首先,讨论闭式解。参考文献[1]附录B。有一点要注意,如何由公式342 得到 公式343?参考:我的这篇阅读笔记

            然后,讨论近似解。参考文献[1]附录C。(至于为啥要采用近似解,文献[1]给出了理由,但是没理解)。结论是: 

            a) 采用2阶近似的公式402比较好,会考虑加速度的影响。采用一阶近似公式401也没问题,即 公式343中的 fai  = I + A * δT。

            b)使用一阶泰勒展开的计算结果 与 公式402 形式统一,但是略微有些差别。我认为可以忽略。

            重点需要说明: 一阶近似 公式401 也正确。为啥形式和 一阶泰勒展开的结果不统一?因为只做了一阶近似嘛。

            c)虽然 附录C.2 Block-wise truncation 中公式402 的近似结果比较好,但是我们需要先写出闭式解,才可以做近似。实际操作时,不方便。因此,通常采用C.1 System-wise truncation, 且进行一阶近似。这也就是滤波中最常见的形式:

                                          Xn+1 = (I + A * deltaT)* Xn

           4) 误差微分方程获得误差状态递推方程 ---- 噪声部分

                                                 

      2. 一阶泰勒展开获得误差递推方程

       先上一个结论:

            我们已知:离散后的状态递推方程,我们的目的是:求解 误差递推方程,即公式 36。

        

       为什么 F , G 是上图所说的结果呢?(注意: 离散后并不一定线性,这是两个不同的概念)

       证明如下:

  

      实际中,如何求解 F G?

      很简单啦,就是求导嘛! 已知 y= f(x) , 则y' = deltaY/deltaX = f(x+deltaX)-f(x)/deltaX

      例如:

              a. 计算得到deltaY

    

              b. 计算 deltaY/deltaX

                 

         很重要一点在 P V Q 的方程中,bg ba 并不算输入量,因此矩阵G中,不应该出现PVQ对ba bg的导数。 (ba, bg的导数服从高斯分布)

      总结:

      - 滤波中:需要根据真实状态微分方程、标称状态微分方程,获得误差状态微分方程(连续时间的) :

                                          deltaX的导数 = A*deltaX+G*n  ; n 为 噪声

                      然后就可以直接写出 误差状态递推方程:

                          deltaXk = (I + A* deltaT )* deltaXk-1 + G*deltaT * n

        - VIO 中: 先写出离散的状态递推方程,然后分别计算 F (Xk 对 Xk-1 的导数) ,G(Xk 对 输入量的导数), 然后得到误差状态递推方程:

                                                     deltaXk = F * deltaXk-1 + G * n

      问题: 参考文献[1],上述总结中,滤波的  I + A* deltaT  并不等于 VIO 的 F 。但是,VIO课程中却说两者相等,why ? 因为 P 中含有二次项 加速度。 如果都是一次关系,那么VIO课程中说的没错。

      

  (二)获得误差状态递推方程的小技巧

      以(一)1. 微分形式获得误差递推方程微分 方法为例,总结如下:

      首先声明思路:Xt = X + deltaX .  Xt 的导数既等于 “先求导,再拆分”, 又等于“先拆分,再求导”

     

     备注:指出上图推导中的一个小错误:hat(w) 是标称方程中的角速度,hat_w = w_m-bg; w_m 是角速度测量值。正确的 : wt = hat_w+nw+deltaBg。虽然上图写错了,但是不影响结果。

    注意: wt 中并不包含 n_bg ; 因为 n_bg 是随机游走噪声。

    bg_t 的导数 = n_bg ---- 随机游走噪声的定义

   bg_t = bg_hat + delta_bg

   bg_hat 对时间的导数 = 0

   所以 delta_bg 对时间的导数 = n_bg

      1. 在计算deltaP 的微分方程时,省略了高阶无穷小项

       2. 上面 deltaR 的微分方程中使用的是左扰动,下面给出右扰动的:

  (三)误差状态方程、标称状态方程离散化方法需要保持一致吗?

      结论:暂时不知道。不过,可以保证如下的操作是正确的:

      1. 滤波中,标称状态采用euler积分进行离散化,误差状态 F ≈ I + A×δT

      1. 滤波

            a. 先写出 真实微分方程、标称微分方程,然后两者相减,得到误差微分方程 delta_X对时间的导数 = A*delta_X; 注意这都是在连续时间下。

            b. 得到误差状态方程 deltaX = F * delta_X-1 ;F ≈ I + A×δT

            c. 此外,还需要知道离散标称状态递推方程,因为要进行状态预测。

      2. VIO中,先euler积分或者假中值积分 进行标称状态方程离散化,然后一阶泰勒展开计算误差状态方程。

      有两个需要离散化的步骤:标称状态方程 , 误差状态方程

       前面(一)中提供了两个方法,从方法1. 微分形式获得误差递推方程 的角度分析,误差状态方程的离散化 和 标称方程的离散化没有关系

        但是,从方法2. 一阶泰勒展开获得误差递推方程的角度分析,误差状态递推方程是根据离散化的标称方程获得的,因此,误差状态方程与标称方程离散化有关系。参考:文献[1] 附录D;张腾ORB_VIO_RK4

备注:张腾代码中,预积分协方差的计算与euler积分时一致,K时刻预积分量对于K-1时刻的预积分量的导数与euler积分不一致,因为是按照RK4离散得到的误差方程计算而来。

四. 一些实际应用中的技巧

  (一)多个观测时,每次只使用一个观测进行更新。预测的频率通常要高于观测的频率

  (二)观测量有延迟:在观测量所在时刻进行滤波操作,然后传递至最新的预测状态

  (三)协方差如何调整?

五. 一些实践小例子

1. IMU+GPS

TODO

1. MSCKF 通读源码+测试

2. zm_ekf 通读源码+测试

参考:

[1] 《Quaternion kinematics for the error-state Kalman filter》

[2]  《Lie Groups for 2D and 3D Transformations》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值