Error-State Kalman Filter教程(一)


本文代码, 见github; 如果您有任何疑问或者建议,请在文后留言。谢谢!

第五章:ESKF推导

一、目标

使用error-state滤波方法优点

二、Error-State 卡尔曼滤波

把传统的状态量分为了三部分:(真实状态)true state, (名义状态)nominal state, (误差状态)error state.

ESKF主要的思想是:名义状态使用非线性的方式进行积分(无近似误差),误差状态使用线性的方式积分(有近似误差),但是和传统卡尔曼比起来,这个线性化误差会小一些。

三、系统运动学(连续)

系统涉及到的变量如下:

真实状态名义状态误差状态组合关系观测量噪声
全部状态 x t x_t xt x x x δ x \delta x δx x t = x ⊕ δ x x_t = x\oplus \delta x xt=xδx
位置P p t p_t pt p p p δ p \delta p δp p t = p + δ p p_t = p + \delta p pt=p+δp
速度v v t v_t vt v v v δ v \delta v δv v t = v + δ v v_t = v + \delta v vt=v+δv
加速度a a t a_t at a m = a t + a n a_m = a_t + a_n am=at+an a m a_m am a n a_n an

需要注意的是,在组合关系中,状态变量中的都是真值=名义状态+误差状态,而测量值中,测量值=真值+噪声,在实际使用过程中,不要弄混淆了。

1. 真实状态运动学

p t ˙ = v t v t ˙ = a t = a m − a n \dot{p_t} = v_t \\ \dot{v_t} = a_t = a_m - a_n pt˙=vtvt˙=at=aman

2. 名义状态运动学

在定义名义状态时,我们可以不考虑噪声与扰动

p ˙ = v v ˙ = a m \dot{p} = v \\ \dot{v} = a_m p˙=vv˙=am

从这里可以看出,这里直接使用了加速度的观测值。

3. 误差状态运动学

因为已经定义好了真实状态与名义状态,根据表中的关系,我们直接可以得到误差状态运动学

δ p ˙ = δ v δ v ˙ = − a n \dot{\delta p} = \delta v\\ \dot{\delta v} = -a_n δp˙=δvδv˙=an

四、系统运动学(离散)

1. 名义状态运动学

p ← p + v Δ t + 0.5 a m Δ t 2 v ← v + a m Δ t p \leftarrow p + v\Delta t+0.5a_m\Delta t^2 \\ v \leftarrow v + a_m\Delta t pp+vΔt+0.5amΔt2vv+amΔt

对于p来说,是根据连续状态下名义状态运动学公式来的,首先对v积分,因为v是变化的,还要对v的变化进行二次积分。用求面积的公式来举一个例子如下:

名义状态实际上就是测量状态,是包含噪声的 a m = a t + a n a_m = a_t + a_n am=at+an

2. 误差状态运动学

δ p ← δ p + δ v δ t δ v ← δ v + v i \delta p \leftarrow \delta p + \delta v \delta t \\ \delta v \leftarrow \delta v + v_i δpδp+δvδtδvδv+vi
可以看出名义状态运动学考虑了非线性部分,而误差状态运动学直接是线性关系。前面的 a n a_n an这里直接变成了 v i v_i vi., 也可以看出,名义状态考虑了二阶,而误差状态考虑了一阶。

3. 误差状态雅克比矩阵与扰动方程

这里写成紧凑形式 δ x = [ δ p ; δ v ] T \delta x = [\delta p; \delta v]^T δx=[δp;δv]T,然后利用误差运动学方程,得到线性化,得到状态转移函数。如上:

F = [ I Δ t 0 I ] F = \left[ \begin{matrix} I & \Delta t\\0&I \end{matrix}\right] F=[I0ΔtI]

第六章:IMU与其他传感器融合

在一个设计良好的系统中,当GPS信号过来的时候,应该要能修正IMU的bias. 主要步骤有三步:

  1. 误差状态的观测滤波
  2. 将误差状态赋值到名义状态
  3. 误差状态的重置

一、误差状态的观测

首先GPS的观测与状态的关系是: y = h ( x t ) + v y = h(x_t) + v y=h(xt)+v. 在这里y就是一个1维的观测。 x t x_t xt是真值状态。

然后卡尔曼增益与传统的一样,状态量的更新不太不一样:

δ x ← K ( y − h ( x t ) ) \delta x \leftarrow K(y-h(x_t)) δxK(yh(xt))

当然,上式符合直观理解,当真实状态与观测值一致时,误差状态的修正量就是0。当y较大时, δ x \delta x δx就会大于0。

通过位置观测的方差可知:

V = Σ s n V = \Sigma_{sn} V=Σsn

1、雅克比矩阵

通过真值状态、名义状态、误差状态定义可知:

h ( x t ) = x t = p + δ p h(x_t) = x_t = p + \delta p h(xt)=xt=p+δp

进一步可知:

H = [ 1 , 0 ] H = [1, 0] H=[1,0]

二、误差状态插入到名义状态

本质就是让名义状态等于真实状态,即名义状态的更新操作

x ← x ⊕ δ x ^ x \leftarrow x \oplus \hat{\delta x} xxδx^

三、ESKF重置

因为误差状态已经在前面插入到了名义状态中,这里肯定需要将误差状态置为0。同时,因此置零的原因,需要将协方差也更新一下。对于当前的位置估计来说,只需要将误差状态置为0,协方差矩阵不用更新了。

四、仿真

1. 仿真数据生成

假设运动物体沿着x轴运动:

s g t = s i n ( m ∗ t ) + c o s ( n ∗ t ) v g t = m ∗ c o s ( m ∗ t ) − n ∗ s i n ( n ∗ t ) a g t = − m 2 ∗ s i n ( m ∗ t ) − n 2 ∗ c o s ( n ∗ t ) s_{gt} = sin(m*t) + cos(n*t) \\ v_{gt} = m*cos(m*t) - n*sin(n*t) \\ a_{gt} = -m^2*sin(m*t) - n^2*cos(n*t) sgt=sin(mt)+cos(nt)vgt=mcos(mt)nsin(nt)agt=m2sin(mt)n2cos(nt)

这里用 a g t + a n a_{gt} + a_n agt+an来模拟实际测量的加速度值,其中 a n ∼ N ( 0 , Σ a n ) a_n \sim N(0, \Sigma_{an}) anN(0,Σan)设计为一个白噪声。用 s g t + s n s_{gt} + s_n sgt+sn来模拟绝对位置观测,其中 s n ∼ N ( 0 , Σ s n ) s_n \sim N(0, \Sigma_{sn}) snN(0,Σsn)也为一个白噪声。以下为纯积分推算:

如上图所示,依次为:位置、加速度、位置预测、速度预测。

2. ESKF滤波

代码实现了两个简单的滤波:ESKF与EKF,下图所示为ESKF滤波的结果与观测数据、真值数据的对比:

下图所示为EKF与ESKF之间的对比:

从目前的结果还并不能明显得出: ESKF比EKF好的这个结论;

参考

  1. Quaternion kinematics for the error-state Kalman filter.pdf 链接: https://pan.baidu.com/s/1pk5esPGVNSiSLyWdlXVBeA 提取码: vzcw
  2. MSCKF那些事(四)算法详解2:数学基础 这里面说了几种协方差更新的形式,对应着不同的正定状态。
  3. ESKF的一些理解
  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手持电烙铁的侠客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值