不变扩展卡尔曼滤波(二):原理与推导

文章同步更新于github pages,欢迎收藏关注。

文章目录

  • 扩展卡尔曼滤波的缺陷
    • 存在正反馈
    • 非一致性
  • 不变扩展卡尔曼滤波
    • 误差传递
    • 状态更新
  • References

扩展卡尔曼滤波的缺陷

存在正反馈

普通的扩展卡尔曼滤波(EKF),通过对动态方程的线性化,来估计状态与状态的协方差。比如有一个系统定义为

x ˙ t = f ( x t , u t ) + n t \begin{aligned} \dot{x}_{t}&=f(x_t, u_t) + n_t \end{aligned} x˙t=f(xt,ut)+nt

其中 x t x_t xt是系统状态, u t u_t ut是输入, n t n_t nt是系统噪声。假设某个时刻对状态的估计为 x ^ t \hat{x}_{t} x^t,并定义状态误差为 e t = x t − x ^ t e_{t}=x_{t}-\hat{x}_{t} et=xtx^t,则根据EKF,对 f f f x ^ t \hat{x}_{t} x^t处线性化(一阶泰勒展开),并注意到 f ( x ^ t n , u t ) = x ^ ˙ t n + 1 f(\hat{x}_{t_n}, u_t)=\dot{\hat{x}}_{t_{n+1}} f(x^tn,ut)=x^˙tn+1,有

e ˙ t = x ˙ t − x ^ ˙ t = f ( x t , u t ) − x ^ ˙ t + n t ≈ f ( x ^ t , u t ) + F x ^ t , u t ( x t − x ^ t ) − x ^ ˙ t + n t = F x ^ t , u t ( x t − x ^ t ) + n t = F x ^ t , u t e t + n t \begin{aligned} \dot{e}_{t}&=\dot{x}_{t}-\dot{\hat{x}}_{t} \\ &=f(x_t, u_t)-\dot{\hat{x}}_{t} + n_t\\ &\approx f(\hat{x}_{t}, u_t)+F_{\hat{x}_{t},u_t}(x_{t}-\hat{x}_{t}) - \dot{\hat{x}}_{t} + n_t\\ &=F_{\hat{x}_{t},u_t}(x_{t}-\hat{x}_{t}) + n_t\\ &=F_{\hat{x}_{t},u_t}e_t + n_t \end{aligned} e˙t=x˙tx^˙t=f(xt,ut)x^˙t+ntf(x^t,ut)+Fx^t,ut(xtx^t)x^˙t+nt=Fx^t,ut(xtx^t)+nt=Fx^t,utet+nt

上式是状态误差的线性传递方程,因此可以使用标准的卡尔曼滤波来估计协方差。

但是这里存在一个问题,上面误差传递方程中,系统矩阵 F F F依赖当前状态的估计量。在有噪声引入时,状态估计量是无法预测的,这就导致很难对上述系统方程做收敛性分析,实际上,任何EKF都没有收敛性保证。当状态估计值与真值差距较大时,直接导致依赖状态估计值的 F F F也有较大偏差,使用这样的 F F F继续传递误差后,又进一步放大误差,整个误差传递系统形成正反馈,最终导致滤波器发散。

实际上,在滤波器进行状态更新时也有类似问题。设系统的观测方程为

y t = h ( x t ) + s t y_t=h(x_t)+s_t yt=h(xt)+st

其中 s t s_t st是观测噪声。设实际观测与估计观测的误差为 z t = y t − y ^ t z_t=y_t-\hat{y}_t zt=yty^t,有

z t = y t − y ^ t = h ( x t ) − y ^ t + s t ≈ h ( x ^ t ) + H x ^ t ( x t − x ^ t ) − y ^ t + s t = H x ^ t e t + s t \begin{aligned} z_t&=y_t-\hat{y}_t \\ &=h(x_t)-\hat{y}_t + s_t \\ &\approx h(\hat{x}_t)+H_{\hat{x}_t}(x_t-\hat{x}_t) - \hat{y}_t + s_t \\ &=H_{\hat{x}_t}e_t + s_t \end{aligned} zt=yty^t=h(xt)y^t+sth(x^t)+Hx^t(xtx^t)y^t+st=Hx^tet+st

上式即观测误差与状态误差之间的线性近似关系。同样的, H x ^ t H_{\hat{x}_t} Hx^t与状态估计值有关,当真实状态与估计值差距较大时,利用上式进行更新可能起不到正面效果。

从上面的分析可知,普通EKF对初值的准确性要求挺高的,如果状态初值设定得与实际情况差距较大,很难让滤波器收敛。

非一致性

EKF还会导致另外一个问题,即所谓的不一致性。每当新的观测到来时,EKF会更新当前状态的估计,但是用于计算新状态的量,都是通过旧状态的线性化得来的。使用EKF的更新方法会出现不一致性,导致本来不该观测到信息的方向上观测到信息,在SLAM问题中这种现象比较明显,表现为较大的drift,以及过于乐观的协方差估计。因此,有很多针对该问题的方法,比如OC(Observability Constrain),FEJ(First Estimateed Jacobian)以及Robocentric等,这些方法都是对现有EKF框架的修补,而且使用起来都不容易。最后引用一张[1]中的图更直观的描述这个问题。

不变扩展卡尔曼滤波(二):原理与推导_第1张图片

不变扩展卡尔曼滤波

不变扩展卡尔曼滤波(简写为InEKF),可以较好的解决上面EKF存在的两个问题,而且有严格的数学推导作为保证。这里不介绍InEKF的收敛性和一致性的推导(实在有点复杂*_*!),主要关注其思想和用法。

InEKF的想法还是比较简单的——通过改变状态误差的定义方法,实现误差传递矩阵 F F F与状态估计值的独立。在EKF中,我们的状态误差直接定义为两个状态的差,即 e t = x t − x ^ t e_{t}=x_{t}-\hat{x}_{t} et=xtx^t,这太过于粗暴了,我们面对的是非线性系统,误差怎么都不应该是线性的形式。

现在我们以一个简单的问题为例,说明InEKF的用法。假设我们有一架无人机,上面装了IMU以及双目相机等传感器,我们打算对无人机的位姿进行估计。假设IMU的bias为零(之后会讨论有bias的情况),则IMU的系统方程为

R ˙ t = R t [ w ~ t − n t w ] × v ˙ t = R t ( a ~ t − n t a ) + g p ˙ t = v t \begin{aligned} \dot{R}_t&=R_t[\tilde{w}_t-n_t^w]_\times \\ \dot{v}_t&=R_t(\tilde{a}_t-n_t^a)+g \\ \dot{p}_t&=v_t \end{aligned} R˙tv˙tp˙t=Rt[w~tntw]×=Rt(a~tnta)+g=vt

其中 w ~ t , a ~ t \tilde{w}_t, \tilde{a}_t w~t,a~t是IMU的测量值, n t w , n t a n_t^w,n_t^a ntw,nta分别是gyro和acc的噪声, g g g是重力设为已知,待估计的量就是 R , v , p R,v,p R,v,p,根据上一章李群的内容,我们发现这三个量刚好能构成一个 S E 2 ( 3 ) SE_2(3) SE2(3)群,于是我们将InEKF的状态量写为

χ t = ( R t v t p t 0 1 0 0 0 1 ) \chi_t= \begin{pmatrix} R_t & v_t & p_t \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} χt=Rt00vt10pt01

这里已经和EKF有很大不同了,一般EKF的状态量是个矢量,而InEKF的状态量是一个矩阵,而且构成群。既然是群,其误差也应该定义在群上,自然是不能再用减法了,设状态估计值为 χ ^ t \hat{\chi}_t χ^t,和真值的误差有两种形式

η t = χ t − 1 χ ^ t η t = χ ^ t χ t − 1 \begin{aligned} \eta_t&=\chi_t^{-1}\hat{\chi}_t \\ \eta_t&=\hat{\chi}_t\chi_t^{-1} \end{aligned} ηtηt=χt1χ^t=χ^tχt1

第一种称为左不变误差(left-invariant),因为对 χ t , χ t ^ \chi_t, \hat{\chi_t} χt,χt^都左乘一个相同的群元素后,误差不变。同理,第二种为右不变误差(right-invariant)。具体使用哪种误差,要看该误差能否实现状态传递矩阵与状态估计值的独立。在很多SLAM问题中,右不变误差可以满足要求,因此下文都使用右不变误差。

误差传递

仿照EKF,现在推导这个误差的系统方程。

η t = χ ^ t χ t − 1 = ( R ^ t R t T v ^ t − R ^ t R t T v t p ^ t − R ^ t R t T p t 0 1 0 0 0 1 ) \eta_t=\hat{\chi}_t\chi_t^{-1}= \begin{pmatrix} \hat{R}_tR_t^T & \hat{v}_t-\hat{R}_tR_t^Tv_t & \hat{p}_t-\hat{R}_tR_t^Tp_t \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} ηt=χ^tχt1=R^tRtT00v^tR^tRtTvt10p^tR^tRtTpt01

R ^ t R t T = η R t v ^ t − R ^ t R t T v t = ξ v t p ^ t − R ^ t R t T p t = ξ p t \begin{aligned} \hat{R}_tR_t^T&=\eta_{R_t} \\ \hat{v}_t-\hat{R}_tR_t^Tv_t&=\xi_{v_t} \\ \hat{p}_t-\hat{R}_tR_t^Tp_t&=\xi_{p_t} \end{aligned} R^tRtTv^tR^tRtTvtp^tR^tRtTpt=ηRt=ξvt=ξpt

η R t \eta_{R_t} ηRt对应的李代数为 ξ R t \xi_{R_t} ξRt,即 η R t = Exp ( ξ R t ) \eta_{R_t}=\text{Exp}(\xi_{R_t}) ηRt=Exp(ξRt),由于 η R t \eta_{R_t} ηRt是小量,用指数函数的一阶泰勒近似为 η R t ≈ I + [ ξ R t ] × \eta_{R_t}\approx I+[\xi_{R_t}]_\times ηRtI+[ξRt]×,则

η t ˙ ≈ ( [ ξ ˙ R t ] × ξ ˙ v t ξ ˙ p t 0 0 0 0 0 0 ) = d d t Λ ( ξ R t ξ v t ξ p t ) \dot{\eta_t}\approx \begin{pmatrix} [\dot{\xi}_{R_t}]_\times & \dot{\xi}_{v_t} & \dot{\xi}_{p_t} \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{pmatrix} = \frac{d}{dt}\Lambda \begin{pmatrix} \xi_{R_t} \\ \xi_{v_t} \\ \xi_{p_t} \end{pmatrix} ηt˙[ξ˙Rt]×00ξ˙vt00ξ˙pt00=dtdΛξRtξvtξpt

η ˙ t \dot{\eta}_t η˙t就是群 S E 2 ( 3 ) SE_2(3) SE2(3)在幺元处的切空间,其中

[ ξ ˙ R t ] × ≈ η ˙ R t = R ^ ˙ t R t T + R ^ t R ˙ t T = R ^ t [ w ~ t ] × R t T − R ^ t [ w ] × R t T = R ^ t [ w ~ t − w t ] × R t T = R ^ t [ n t w ] × R t T = R ^ t [ n t w ] × R ^ t T R ^ t R t T = [ R ^ t n t w ] × η R t ≈ [ R ^ t n t w ] × ( I + [ ξ R t ] × ) ≈ [ R ^ t n t w ] × \begin{aligned} [\dot{\xi}_{R_t}]_\times\approx\dot{\eta}_{R_t}&=\dot{\hat{R}}_tR_t^T+\hat{R}_t\dot{R}_t^T \\ &=\hat{R}_t[\tilde{w}_t]_\times R_t^T-\hat{R}_t[w]_\times R_t^T \\ &=\hat{R}_t[\tilde{w}_t-w_t]_\times R_t^T \\ &=\hat{R}_t[n_t^w]_\times R_t^T \\ &=\hat{R}_t[n_t^w]_\times \hat{R}_t^T \hat{R}_tR_t^T \\ &=[\hat{R}_t n_t^w]_\times \eta_{R_t} \\ &\approx [\hat{R}_t n_t^w]_\times ( I+[\xi_{R_t}]_\times) \\ &\approx [\hat{R}_t n_t^w]_\times \end{aligned} [ξ˙Rt]×η˙Rt=R^˙tRtT+R^tR˙tT=R^t[w~t]×RtTR^t[w]×RtT=R^t[w~twt]×RtT=R^t[ntw]×RtT=R^t[ntw]×R^tTR^tRtT=[R^tntw]×ηRt[R^tntw]×(I+[ξRt]×)[R^tntw]×

上面最后一步忽略了高阶小量 [ R ^ t n t w ] × [ ξ R t ] × [\hat{R}_t n_t^w]_\times [\xi_{R_t}]_\times [R^tntw]×[ξRt]×

同理有

ξ ˙ v t = v ^ ˙ t − η ˙ R t v t − η R t v ˙ t = R ^ t a ~ t + g − [ R ^ t n t w ] × v t − R ^ t R t T ( R t a t + g ) = R ^ t ( a ~ t − a t ) + g − [ R ^ t n t w ] × v t − R ^ t R t T g ≈ R ^ t n t a + g − [ R ^ t n t w ] × v t − ( I + [ ξ R t ] × ) g = [ g ] × ξ R t + ( [ v t ] × R ^ t ) n t w + R ^ t n t a \begin{aligned} \dot{\xi}_{v_t} &= \dot{\hat{v}}_t - \dot{\eta}_{R_t}v_t-\eta_{R_t}\dot{v}_t \\ &=\hat{R}_t\tilde{a}_t+g-[\hat{R}_t n_t^w]_\times v_t-\hat{R}_tR_t^T(R_ta_t+g) \\ &=\hat{R}_t(\tilde{a}_t-a_t) + g-[\hat{R}_t n_t^w]_\times v_t-\hat{R}_tR_t^Tg \\ &\approx \hat{R}_tn_t^a+g-[\hat{R}_t n_t^w]_\times v_t-(I+[\xi_{R_t}]_\times)g \\ &=[g]_\times \xi_{R_t}+([v_t]_\times \hat{R}_t) n_t^w+\hat{R}_tn_t^a \end{aligned} ξ˙vt=v^˙tη˙RtvtηRtv˙t=R^ta~t+g[R^tntw]×vtR^tRtT(Rtat+g)=R^t(a~tat)+g[R^tntw]×vtR^tRtTgR^tnta+g[R^tntw]×vt(I+[ξRt]×)g=[g]×ξRt+([vt]×R^t)ntw+R^tnta

以及

ξ ˙ p t = p ^ ˙ t − η ˙ R t p t − η R t p ˙ t = v ^ t − [ R ^ t n t w ] × p t − R ^ t R t T v t = ( v ^ t − R ^ t R t T v t ) − [ R ^ t n t w ] × p t = ξ v t + ( [ p t ] × R ^ t ) n t w \begin{aligned} \dot{\xi}_{p_t} &= \dot{\hat{p}}_t - \dot{\eta}_{R_t}p_t-\eta_{R_t}\dot{p}_t \\ &=\hat{v}_t-[\hat{R}_t n_t^w]_\times p_t - \hat{R}_tR_t^Tv_t \\ &=(\hat{v}_t-\hat{R}_tR_t^Tv_t)-[\hat{R}_t n_t^w]_\times p_t \\ &=\xi_{v_t}+([p_t]_\times \hat{R}_t) n_t^w \end{aligned} ξ˙pt=p^˙tη˙RtptηRtp˙t=v^t[R^tntw]×ptR^tRtTvt=(v^tR^tRtTvt)[R^tntw]×pt=ξvt+([pt]×R^t)ntw

综上有

d d t Λ ( ξ R t ξ v t ξ p t ) = ( [ R ^ t n t w ] × [ g ] × ξ R t + ( [ v t ] × R ^ t ) n t w + R ^ t n t a ξ v t + ( [ p t ] × R ^ t ) n t w 0 0 0 0 0 0 ) = Λ [ ( 0 0 0 [ g ] × 0 0 0 I 0 ) ( ξ R t ξ v t ξ p t ) + ( R ^ t n t w ( [ v t ] × R ^ t ) n t w + R ^ t n t a ( [ p t ] × R ^ t ) n t w ) ]     分离状态项和噪声项 = Λ [ ( 0 0 0 [ g ] × 0 0 0 I 0 ) ( ξ R t ξ v t ξ p t ) + ( R ^ t 0 0 [ v ^ t ] × R ^ t R ^ t 0 [ p ^ t ] × R ^ t 0 R ^ t ) ( n t w n t a 0 ) ] \begin{aligned} \frac{d}{dt}\Lambda \begin{pmatrix} \xi_{R_t} \\ \xi_{v_t} \\ \xi_{p_t} \end{pmatrix}&= \begin{pmatrix} [\hat{R}_t n_t^w]_\times & [g]_\times \xi_{R_t}+([v_t]_\times \hat{R}_t) n_t^w+\hat{R}_tn_t^a & \xi_{v_t}+([p_t]_\times \hat{R}_t) n_t^w \\ 0 & 0 & 0 \\ 0 & 0 & 0 \end{pmatrix} \\ &=\Lambda\Bigg[ \begin{pmatrix} 0 & 0 & 0 \\ [g]_\times & 0 & 0 \\ 0 & I & 0 \end{pmatrix} \begin{pmatrix} \xi_{R_t} \\ \xi_{v_t} \\ \xi_{p_t} \end{pmatrix}+ \begin{pmatrix} \hat{R}_tn_t^w \\ ([v_t]_\times \hat{R}_t) n_t^w+\hat{R}_tn_t^a \\ ([p_t]_\times \hat{R}_t) n_t^w \end{pmatrix} \Bigg] \ \ \ \ \text{分离状态项和噪声项} \\ &=\Lambda\Bigg[ \begin{pmatrix} 0 & 0 & 0 \\ [g]_\times & 0 & 0 \\ 0 & I & 0 \end{pmatrix} \begin{pmatrix} \xi_{R_t} \\ \xi_{v_t} \\ \xi_{p_t} \end{pmatrix}+ \begin{pmatrix} \hat{R}_t & 0 & 0 \\ [\hat{v}_t]_\times\hat{R}_t & \hat{R}_t & 0 \\ [\hat{p}_t]_\times\hat{R}_t & 0 & \hat{R}_t \end{pmatrix} \begin{pmatrix} n_t^w \\ n_t^a \\ 0 \end{pmatrix} \Bigg] \end{aligned} dtdΛξRtξvtξpt=[R^tntw]×00[g]×ξRt+([vt]×R^t)ntw+R^tnta00ξvt+([pt]×R^t)ntw00=Λ[0[g]×000I000ξRtξvtξpt+R^tntw([vt]×R^t)ntw+R^tnta([pt]×R^t)ntw]    分离状态项和噪声项=Λ[0[g]×000I000ξRtξvtξpt+R^t[v^t]×R^t[p^t]×R^t0R^t000R^tntwnta0]

ξ t = ( ξ R t T , ξ v t T , ξ p t T ) T \xi_t=(\xi_{R_t}^T, \xi_{v_t}^T, \xi_{p_t}^T)^T ξt=(ξRtT,ξvtT,ξptT)T,以及 n t = ( n t w , n t a , 0 ) n_t=(n_t^w, n_t^a, 0) nt=(ntw,nta,0),可得误差的线性系统方程

ξ ˙ t = F t ξ t + A d χ ^ t n t \dot{\xi}_t=F_t\xi_t+Ad_{\hat{\chi}_t}n_t ξ˙t=Ftξt+Adχ^tnt

其中

F t = ( 0 0 0 [ g ] × 0 0 0 I 0 ) A d χ ^ t = ( R ^ t 0 0 [ v ^ t ] × R ^ t R ^ t 0 [ p ^ t ] × R ^ t 0 R ^ t ) \begin{aligned} F_t&= \begin{pmatrix} 0 & 0 & 0 \\ [g]_\times & 0 & 0 \\ 0 & I & 0 \end{pmatrix} \\ Ad_{\hat{\chi}_t}&= \begin{pmatrix} \hat{R}_t & 0 & 0 \\ [\hat{v}_t]_\times\hat{R}_t & \hat{R}_t & 0 \\ [\hat{p}_t]_\times\hat{R}_t & 0 & \hat{R}_t \end{pmatrix} \end{aligned} FtAdχ^t=0[g]×000I000=R^t[v^t]×R^t[p^t]×R^t0R^t000R^t

与普通EKF的误差系统方程相比,最大不同就是系统矩阵 F t F_t Ft是一个常量!和输入以及状态估计值均无关!而噪声项前面的矩阵,刚好是当前状态矩阵的伴随。基于这样的系统方程,可以证明其收敛性还有一致性都有较好的保证。

后面的事情就和普通EKF一样了,根据系统方程估计下一时刻的状态(使用RK4积分等方法),然后对误差系统方程积分,得到状态转移矩阵,并传递协方差矩阵,即

P t = Φ t P t − 1 Φ t T + A d χ ^ t Q t A d χ ^ t T P_t=\Phi_tP_{t-1}\Phi_t^T + Ad_{\hat{\chi}_t}Q_tAd_{\hat{\chi}_t}^T Pt=ΦtPt1ΦtT+Adχ^tQtAdχ^tT

其中 Φ t \Phi_t Φt是通过 F t F_t Ft积分后得到的状态转移矩阵, Q t = E ( n t n t T ) Q_t=E(n_tn_t^T) Qt=E(ntntT)是系统噪声的协方差矩阵。由于系统矩阵是常量,积分可以变得非常简单,甚至直接写出解析式。这也算是InEKF的另一个优点吧。

状态更新

假设地图中有很多landmark,用 m 1 , m 2 , . . . , m k m_1, m_2, ..., m_k m1,m2,...,mk表示,无人机上的传感器可以观测到这些landmark相对于自身的位置,分别用 y t 1 , y t 2 , . . . , y t k y_t^1, y_t^2, ..., y_t^k yt1,yt2,...,ytk表示,设每个观测的噪声为 s t 1 , s t 2 , . . . , s t k s_t^1, s_t^2, ..., s_t^k st1,st2,...,stk,则观测方程就是

y t 1 = R t T ( m 1 − p t ) + s t 1 y t 2 = R t T ( m 2 − p t ) + s t 2 ⋮ y t k = R t T ( m k − p t ) + s t k \begin{aligned} y_t^1 &= R_t^T(m_1-p_t) + s_t^1\\ y_t^2 &= R_t^T(m_2-p_t) + s_t^2\\ &\vdots \\ y_t^k &= R_t^T(m_k-p_t) + s_t^k \end{aligned} yt1yt2ytk=RtT(m1pt)+st1=RtT(m2pt)+st2=RtT(mkpt)+stk

拿其中一个观测来举例,我们可以发现观测方程可以写为如下形式

( y i 0 1 ) = ( R t T − R t T v t − R t T p t 0 1 0 0 0 1 ) ( m i 0 1 ) + ( s t i 0 0 ) \begin{aligned} \begin{pmatrix} y_i \\ 0 \\ 1 \end{pmatrix}&= \begin{pmatrix} R_t^T & -R_t^Tv_t & -R_t^Tp_t \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} m_i \\ 0 \\ 1 \end{pmatrix}+ \begin{pmatrix} s_t^i \\ 0 \\ 0 \end{pmatrix} \end{aligned} yi01=RtT00RtTvt10RtTpt01mi01+sti00

注意等号右边第一项的矩阵是状态矩阵的逆,令 Y t i = ( y t i , 0 , 1 ) , M i = ( m i , 0 , 1 ) , S t i = ( s t i , 0 , 0 ) Y_t^i=(y_t^i, 0, 1), M^i=(m_i, 0, 1), S_t^i=(s_t^i, 0, 0) Yti=(yti,0,1),Mi=(mi,0,1),Sti=(sti,0,0)(由于不方便书写,所以都写为行向量的形式,实际上它们都是列向量),有

Y t i = χ t − 1 M i + S t i Y_t^i=\chi_t^{-1}M^i+S_t^i Yti=χt1Mi+Sti

现在我们定义观测误差。如果定义为

Z t i = Y t i − χ ^ t − 1 M i Z_t^i=Y_t^i-\hat{\chi}_t^{-1}M^i Zti=Ytiχ^t1Mi

那么就与普通的EKF无异。考虑到我们的状态量是一个群元素,可以定义观测误差为(这样定义的目的在后面的推导中会变清晰)

Z t i = χ ^ t Y t i − M i Z_t^i=\hat{\chi}_tY_t^i-M^i Zti=χ^tYtiMi

这样就可以得到

Z t i = χ ^ t ( χ t − 1 M i + S t i ) − M i = χ ^ t χ t − 1 M i − M i + χ ^ t S t i = η t M i − M i + χ ^ t S t i \begin{aligned} Z_t^i&=\hat{\chi}_t (\chi_t^{-1}M^i+S_t^i) - M^i \\ &=\hat{\chi}_t\chi_t^{-1}M^i - M^i + \hat{\chi}_tS_t^i \\ &=\eta_t M^i - M^i + \hat{\chi}_tS_t^i \end{aligned} Zti=χ^t(χt1Mi+Sti)Mi=χ^tχt1MiMi+χ^tSti=ηtMiMi+χ^tSti

将所有的观测误差按照列向量的方式堆叠起来,有

z t = ( η t M 1 − M 1 + χ ^ t S t 1 ⋮ η t M k − M k + χ ^ t S t k ) z_t= \begin{pmatrix} \eta_t M^1 - M^1 + \hat{\chi}_tS_t^1 \\ \vdots \\ \eta_t M^k - M^k + \hat{\chi}_tS_t^k \end{pmatrix} zt=ηtM1M1+χ^tSt1ηtMkMk+χ^tStk

和EKF一样,现在需要求出观测误差与状态误差之间的线性关系。利用状态误差的一阶近似 η t ≈ I + Λ ( ξ t ) \eta_t\approx I+\Lambda(\xi_t) ηtI+Λ(ξt),有

z t ≈ ( ( I + Λ ( ξ t ) ) M 1 − M 1 + χ ^ t S t 1 ⋮ ( I + Λ ( ξ t ) ) M k − M k + χ ^ t S t k ) = ( Λ ( ξ t ) M 1 + χ ^ t S t 1 ⋮ Λ ( ξ t ) M k + χ ^ t S t k ) \begin{aligned} z_t &\approx \begin{pmatrix} (I+\Lambda(\xi_t)) M^1 - M^1 + \hat{\chi}_tS_t^1 \\ \vdots \\ (I+\Lambda(\xi_t)) M^k - M^k + \hat{\chi}_tS_t^k \end{pmatrix} \\ &= \begin{pmatrix} \Lambda(\xi_t)M^1 + \hat{\chi}_tS_t^1 \\ \vdots \\ \Lambda(\xi_t)M^k + \hat{\chi}_tS_t^k \end{pmatrix} \\ \end{aligned} zt(I+Λ(ξt))M1M1+χ^tSt1(I+Λ(ξt))MkMk+χ^tStk=Λ(ξt)M1+χ^tSt1Λ(ξt)Mk+χ^tStk

M k , S t k , χ ^ t , ξ t M^k, S_t^k, \hat{\chi}_t,\xi_t Mk,Stk,χ^t,ξt的具体表达式带入上式计算后,每三行就有两行是全零,为了使计算和书写更紧凑,可以将 z t z_t zt中全是零的行去掉,得到 z ~ t \tilde{z}_t z~t,即

z ~ t = ( [ ξ R t ] × m 1 + ξ p t + R ^ t s t 1 ⋮ [ ξ R t ] × m k + ξ p t + R ^ t s t k ) = ( − [ m 1 ] × 0 3 × 3 I 3 × 3 ⋮ − [ m k ] × 0 3 × 3 I 3 × 3 ) ( ξ R t ξ v t ξ p t ) + ( R ^ t s t 1 ⋮ R ^ t s t k ) = H t ξ t + s t \begin{aligned} \tilde{z}_t&= \begin{pmatrix} [\xi_{R_t}]_\times m_1 + \xi_{p_t} + \hat{R}_t s_t^1 \\ \vdots \\ [\xi_{R_t}]_\times m_k + \xi_{p_t} + \hat{R}_t s_t^k \end{pmatrix}\\ &= \begin{pmatrix} -[m_1]_\times & 0_{3\times3} & I_{3\times3} \\ \vdots \\ -[m_k]_\times & 0_{3\times3} & I_{3\times3} \end{pmatrix} \begin{pmatrix} \xi_{R_t} \\ \xi_{v_t} \\ \xi_{p_t} \end{pmatrix} + \begin{pmatrix} \hat{R}_t s_t^1 \\ \vdots \\ \hat{R}_t s_t^k \end{pmatrix} \\ &=H_t\xi_t+s_t \end{aligned} z~t=[ξRt]×m1+ξpt+R^tst1[ξRt]×mk+ξpt+R^tstk=[m1]×[mk]×03×303×3I3×3I3×3ξRtξvtξpt+R^tst1R^tstk=Htξt+st

下面考虑怎么根据观测误差更新InEKF的状态。回想一下普通EKF的更新方式

x ^ t + = x ^ t + K t [ y t − h ( x ^ t ) ] = x ^ t + K t z t \hat{x}_t^+=\hat{x}_t+K_t[y_t-h(\hat{x}_t)]=\hat{x}_t+K_tz_t x^t+=x^t+Kt[yth(x^t)]=x^t+Ktzt

等价于状态误差的更新(上式两边减去 x t x_t xt

e t + = e t + K t z t e_t^+=e_t+K_tz_t et+=et+Ktzt

其中 K t K_t Kt是卡尔曼增益。

同理,根据InEKF的误差定义,更新后的误差

η t + = χ ^ t + χ t − 1 = χ ^ t + χ ^ t − 1 χ ^ t χ t − 1 = χ ^ t + χ ^ t − 1 η t \begin{aligned} \eta_t^+&=\hat{\chi}_t^+\chi_t^{-1} \\ &=\hat{\chi}_t^+\hat{\chi}_t^{-1}\hat{\chi}_t\chi_t^{-1} \\ &=\hat{\chi}_t^+\hat{\chi}_t^{-1}\eta_t \end{aligned} ηt+=χ^t+χt1=χ^t+χ^t1χ^tχt1=χ^t+χ^t1ηt

其中 χ ^ t + χ ^ t − 1 \hat{\chi}_t^+\hat{\chi}_t^{-1} χ^t+χ^t1就是更新前后状态的差异,可以设

χ ^ t + χ ^ t − 1 = Exp ( K t z t ) \hat{\chi}_t^+\hat{\chi}_t^{-1}=\text{Exp}(K_tz_t) χ^t+χ^t1=Exp(Ktzt)

就得InEKF的状态误差的更新方程

η t + = Exp ( K t z t ) η t \eta_t^+=\text{Exp}(K_tz_t)\eta_t ηt+=Exp(Ktzt)ηt

以及状态的更新方程

χ ^ t + = Exp ( K t z t ) χ ^ t \hat{\chi}_t^+=\text{Exp}(K_tz_t)\hat{\chi}_t χ^t+=Exp(Ktzt)χ^t

即InEKF采用的是“指数更新”。最后来看看增益 K t K_t Kt怎么算,由误差的更新方程以及观测误差的定义可得

η t + = Exp ( K t z t ) η t \begin{aligned} \eta_t^+ &= \text{Exp}(K_tz_t)\eta_t \end{aligned} ηt+=Exp(Ktzt)ηt

利用指数函数的一阶近似 Exp ( ξ ) ≈ I + Λ ( ξ ) \text{Exp}(\xi)\approx I+\Lambda(\xi) Exp(ξ)I+Λ(ξ),有

I + Λ ( ξ t + ) = [ I + Λ ( K t z t ) ] [ I + Λ ( ξ t ) ] I+\Lambda(\xi_t^+)=[I + \Lambda(K_tz_t)][I+\Lambda(\xi_t)] I+Λ(ξt+)=[I+Λ(Ktzt)][I+Λ(ξt)]

忽略高阶小量 Λ ( ) ⋅ Λ ( ) \Lambda()\cdot\Lambda() Λ()Λ(),有

ξ t + = ξ t + K t z t \begin{aligned} \xi_t^+ &= \xi_t+K_t z_t \end{aligned} ξt+=ξt+Ktzt

上式与普通EKF中的误差更新方程 e t + = e t + K t z t e_t^+=e_t+K_tz_t et+=et+Ktzt有相同的形式,所以增益 K t K_t Kt的计算和普通的EKF完全相同。上式也可以用更紧凑的 z ~ t \tilde{z}_t z~t代替,对应的更紧凑的增益记为 K ~ t \tilde{K}_t K~t,则

K ~ t = P t H t T ( H t P t H t T + V t ) − 1 \tilde{K}_t = P_tH_t^T(H_tP_tH_t^T+V_t)^{-1} K~t=PtHtT(HtPtHtT+Vt)1

其中, P t P_t Pt是状态误差 ξ t \xi_t ξt的协方差矩阵, H t H_t Ht是之前推出的 z ~ t \tilde{z}_t z~t ξ t \xi_t ξt之间的观测矩阵, V t = E ( s t s t T ) V_t=E(s_ts_t^T) Vt=E(ststT)是观测误差的协方差矩阵(注意, s t s_t st中的每一项噪声都被 R ^ t \hat{R}_t R^t旋转过)。状态的更新自然就是

χ ^ t + = Exp ( K ~ t z ~ t ) χ ^ t P t + = ( I − K ~ t H t ) P t \begin{aligned} \hat{\chi}_t^+&=\text{Exp}(\tilde{K}_t\tilde{z}_t)\hat{\chi}_t \\ P_t^+&=(I-\tilde{K}_tH_t)P_t \end{aligned} χ^t+Pt+=Exp(K~tz~t)χ^t=(IK~tHt)Pt

References

  1. Non-linear state error based extended Kalman flters with applications to navigation
  2. Contact-Aided Invariant Extended Kalman Filtering for Legged Robot State Estimation
  3. Invariant Kalman Filtering for Visual Inertial SLAM

你可能感兴趣的:(Robotics)