大部分基于滤波器的 LIO 或 VIO 实现中,都使用 ESKF 作为状态估计方法。本文则结合网络资源对 ESKF 进行整理。
Error State Kalman Filter
1 ESKF 原理
大部分基于滤波器的 LIO 或 VIO 实现中,都使用 ESKF 作为状态估计方法。相比于传统 KF,ESKF 的优点可以如下:
- 在旋转的处理上,ESKF 的状态变量可以采用三维变量来表达旋转的增量。而传统 KF 需要用到四元数或者更高维的表达。
- ESKF 总是在原点附近,离奇异点较远。
- ESKF 的状态量为小量,其二阶变量相对来说可以忽略。同时,大多数雅可比矩阵在小量情况下变得非常简单,甚至可以用单位阵代替。
- 误差状态的运动学也相比原状态变量要来得更小,因为可以把大量更新部分放到原状态变量中。
在 ESKF 中,把原状态变量称为名义状态变量(nominal state),然后把 ESKF 里的状态变量称为误差状态变量(error state)。ESKF 整体流程如下:
- 当 IMU 测量数据到达时,把它积分后,放入名义状态变量中。由于这种做法没有考虑噪声,会很快产生漂移,于是希望把误差部分作为误差变量,放在 ESKF 中。
- ESKF 内部会考虑各种噪声和零偏的影响,并且给出误差状态的一个高斯分布描述。同时,ESKF 本身作为一种卡尔曼滤波器,也具有预测过程和修正过程,其中修正过程需要依赖 IMU 以外的传感器观测。
- 在修正之后,ESKF 可以给出后验的误差高斯分布,随后可以把这部分误差放入名义状态变量中,并把 ESKF 置零,这样就完成了一次循环。
2 直接法和间接法
假设存在待优化目标函数:
xminF(x)(2-1)
x 为 n 维向量。使用直接法,求解方式为直接求导:
dxdF=0(2-2)
求该式的所有解,并依次带入 F(x),其中最小的值对应的 x 即为解。
当 F(x) 比较简单时,可以很快速得到最优解,但当 F(x) 很复杂时,直接对状态量的一阶导数表达式可能同样很复杂,对上式的求解将变得极为困难甚至不可能,为了在复杂系统中解决这个问题,就诞生牛顿法这样的间接法,假设存在初值 x0,可以在该值附近对 F(x) 进行一到二阶泰勒展开:
F(x0+Δx)=F(x0)+dΔxdF∣∣∣∣x0Δx+dΔx2d2F∣∣∣∣x0Δx2
此时的问题变成了,求解使 F(x) 为极值的 Δx,并更新 x,再继续上述过程,直到收敛。
直接法中,直接求解目标函数对状态量的导数;间接法中,求解目标函数对于一个小值 Δx 的导数。正是基于 Δx 很小的假设,可以认为其高阶导数值都非常小,可以忽略,因此可以在局部区域对目标函数线性化,由此简化计算。
3 ESKF 公式推导
ESKF 核心在于将系统状态分解为两个部分:
Xt=X⊕δX(3-1)
其中 Xt 为系统状态真值,X 为名义状态变量,δX 为误差状态变量。
3.1 ESKF Predict
根据 IMU 中值积分模型,可直接得到 Xt 的一阶导数:
X˙t=Ut(Xt,um,i)(3-2)
um,i 为 IMU 的测量值和各类噪声。
提取所有状态量主成分,构建名义状态的动力学模型:
X˙=U(X,um)(3-3)
这个模型是完全不受噪声分量影响的,因为噪声分量的影响都放到了误差状态的动力学模型中。
根据 (3-1, 2, 3) 可以推导得到误差状态的动力学模型:是对 (3-1) 进行求导,将 (3-2, 3) 带入求解。此时得到:
δX˙=Uδ(X,δx,um,i)(3-4)
对 (3-3, 4) 积分得到离散时间下的递推方程:
Xk+1=f(Xk,um)δXk+1=fδ(Xk,δXk,um,i)(3-5)
有了系统递推方程后,剩下的部分与 EKF 基本相似,将误差状态方程线性化为:
δXk+1=Fδ(X,um)δXk+Fii(3-6)
Fδ,Fi 为 fδ 对 δX,i 的雅可比矩阵。有了这个线性模型,predict 部分就退化为一般针对误差状态的 EKF,套用 EKF 的 predict 公式即可:
δX^x+1=Fδ(X,um)δX^kP^k+1=FδPˇkFδT+FiQiFiT(3-7)
3.2 ESKF Update
假设观测方程:
Y=h(Xt)+v(3-8)
套用 EKF 的 update 公式:
K=P^k+1HT(HP^k+1HT+V)−1δXˇk+1=H(Y−h(X^t,k+1))Pˇk+1=(I−KH)P^k+1(3-9)
整个过程其实跟 EKF 完全一样,唯一不同是,式子中的 H 矩阵是 h 相对于误差状态的雅可比矩阵。对于 H 的求解则采用链式法则:
H≜dXtdh∣∣∣∣X=dδXdXt∣∣∣∣X(3-10)
3.3 ESKF Reset
之后将融合得到的误差状态注入名义状态用于修正误差:
Xk+1←Xk+1+δXˇk+1(3-11)
因为误差状态主成分已经注入名义状态了,最后需要执行一个针对误差状态的充值操作:
δXk+1=g(δXk+1)=δXk+1⊖δXˇk+1(3-12)
4 ESKF 在 SLAM 中的使用
设真值状态为 xt=[pt,vt,Rt,bat,bgt,gt]T,状态随时间变化,可以记为 x(t)。在连续时间上记 IMU 读数 ω~,a~,则状态变量导数相对于观测量之间的关系:
p˙tv˙tR˙tb˙gtb˙atg˙t=vt=Rt(a~−bat−ηa)+g=Rt(ω~−bgt−ηg)∧=ηbg=ηba=0(4-1)
定义误差状态变量为:
ptvtRtbgtbatgt=p+δp=v+δv=RδRorqt=qδq=bg+δbg=ba+δba=g+δg(4-2)
不带下标的是名义状态变量。名义状态变量的运动学方程式与真值相同,只是必考虑噪声(因为噪声在误差状态方程中考虑了)。其中旋转部分的 δR 可以用它的李代数 Exp(δθ) 来表示。
关于误差变量的平移、零偏和重力公式,都很容易得出对应的时间导数表达式,只需在等式两侧分别对时间求导即可:
δp˙δbg˙δb˙aδg=δv=ηg=ηa=0(4-3)
4.1 旋转和速度的求导展开
(1)对旋转的求导
对旋转式两侧对时间求导:
R˙t=R˙Exp(δθ)+RExp(δθ)˙=Rt(ω~−bgt−ηg)∧(4-4)
其中,式子右边满足:
Exp(δθ)˙=Exp(δθ)δθ˙∧(4-5)
从而 (4-4) 式改写为:
R˙t=R˙Exp(δθ)+RExp(δθ)˙=R(ω~−bg)∧Exp(δθ)+RExp(δθ)δθ˙∧=Rt(ω~−bgt−ηg)∧=RExp(δθ)(ω~−bgt−ηg)∧(4-6)
对于 (4-6),整理式子,得到:
Exp(δθ)δθ˙∧=Exp(δθ)(ω~−bgt−ηg)∧−(ω~−bg)∧Exp(δθ)(4-7)
由于 Exp(δθ)∈SO(3),利用伴随性质 ϕ∧R=R(RTϕ)T,替换 (4-7):
Exp(δθ)δθ˙∧=Exp(δθ)(ω~−bgt−ηg)∧−Exp(δθ)(Exp(−δθ)(ω~−bg))∧=Exp(δθ)[(ω~−bgt−ηg)∧−(Exp(−δθ)(ω~−bg))∧]≈Exp(δθ)[(ω~−bgt−ηg)∧−((I−δθ∧)(ω~−bg))∧]=Exp(δθ)[bg−bgt−ηg+δθ∧ω~−δθ∧bg]∧=Exp(δθ)[(−ω~+bg)∧δθ−δbg−ηg]∧(4-8)
约分得到:
δθ˙≈−(ω~−bg)∧δθ−δbg−ηg(4-9)
(2)对速度的求导
对 (4-2) 速度式子两侧求时间导数,得到 δv˙ 对表达式。(4-2) 左侧为:
v˙t=Rt(a~−bat−ηa)+gt=RExp(δθ)(a~−ba−δba−ηa)+g+δg≈R(I+δθ∧)(a~−ba−δba−ηa)+g+δg≈Ra~−Rba−Rδba−Rηa+Rδθ∧a−Rδθ∧ba+g+δg=Ra~−Rba−Rδba−Rηa−Ra~∧δθ+Rba∧δθ+g+δg(4-10)
(4-2) 右侧为:
v˙+δv˙=R(a~−ba)+g+δv˙(4-11)
由于 (4-10) 和 (4-11) 相等,联合两式得到:
δv˙=−R(a~−ba)∧δθ−Rδba−Rηa+δg=−R(a~−ba)∧δθ−Rδba−ηa+δg(4-12)
由于 ηa 为零均值白噪声,其乘于旋转矩阵仍然为零均值白噪声,且 RTR=I,其协方差矩阵也不变,因此有 (4-12) 的第二行。
至此,把误差变量的运动学方程整理如下:
δp˙δv˙δθ˙δbg˙δba˙δg˙=δv=−R(a~−ba)∧δθ−δba−ηa+δg=−(ω~−bg)∧δθ−δbg−ηg=ηbg=ηba=0(4-13)
4.2 离散时间下的运动学方程
名义状态变量的离散时间运动学方程可以写为:
p(t+Δt)v(t+Δt)R(t+Δt)bg(t+Δt)ba(t+Δt)g(t+Δt)=p(t)+vΔt+21(R(a~−ba))Δt2+21gΔt2=v(t)+R(a~−ba)Δt+gΔt=R(t)Exp((ω~−bg)Δt)=bg(t)=ba(t)=g(t)(4-14)
误差状态的离散形式只需要处理连续形式中的旋转部分。参考角速度的积分公式,可以将误差状态方程写为:
δp(t+Δt)δv(t+Δt)δθ(t+Δt)δbg(t+Δt)δba(t+Δt)δg(t+Δt)=δp+δvΔt=δv+(−R(a~−ba)∧δθ−Rδba+δg)Δt+ηv=Exp(−(ω~−bg)Δt)δθ−δbgΔt−ηθ=δbg+ηg=δba+ηa=δg(4-15)
噪声项并不参与递推,需要把它们单独归入噪声部分中。这些噪声随机变量的标准差可以列写如下:
σ(ηv)=Δtσa,σ(ηθ)=Δtσg,σ(ηg)=Δtσbg,σ(ηa)=Δtσba(4-16)
4.3 ESKF 预测过程
误差状态变量 δx 的式子可以写为:
δx=f(δx)+w,w∼N(0,Q)(4-17)
其中有:
Q=diag(03,Cov(ηv),Cov(ηθ),Cov(ηg),Cov(ηa),03)(4-18)
为了保持与 EKF 的符号统一,计算运动方程的线性化形式:
δx=Fδx+w(4-19)
其中为线性化后的雅可比矩阵:
F=⎣⎢⎢⎢⎢⎢⎢⎡I00000IΔtI00000−R(a~−ba)∧ΔtExp(−(ω~−bg)Δt)0000−RΔt0I0000−IΔt0I00IΔt000I⎦⎥⎥⎥⎥⎥⎥⎤(4-20)
执行ESKF的预测过程。预测过程包括对名义状态的预测(IMU 积分)以及对误差状态的预测:
δxpred=FδxPpred=FPFT+Q(4-21)
4.4 ESKF 更新过程
假设观测方程为:
z=h(x)+v,v∼N(0,V)(4-22)
在 ESKF 中,当前拥有名义状态 x 的估计以及误差状态 δx 的估计,且希望更新的是误差状态,因此要计算观测方程相比于误差状态的雅可比矩阵:
H=∂δx∂h=∂x∂h∂δx∂x(4-23)
其中第一项只需对观测方程进行线性化,第二项根据之前对状态变量的定义,可以得到:
∂δx∂x=diag(I3,I3,∂δθ∂Log(R(Exp(δθ))),I3,I3,I3)(4-24)
其他部分是平凡的,对于旋转部分,使用 BCH 得到:
∂δθ∂Log(R(Exp(δθ)))=Jr−1(R)(4-25)
最后再计算卡尔曼增益,进而计算误差状态的更新过程:
KδxP=Ppred HT(HPpred HT+V)−1=K(z−h(xt))=(I−KH)Ppred (4-26)
4.5 ESKF 状态重置
预测和更新过程修正了误差状态的估计。接下来,把误差状态归入名义状态,然后重置 ESKF。归入部分可以简单地写为:
pk+1vk+1Rk+1bg,k+1ba,k+1gk+1=pk+δpk=vk+δvk=RkExp(δθk)=bg,k+δbg,k=ba,k+δba,k=gk+δgk(4-27)
ESKF 的重置分为均值部分和协方差部分。均值部分可以简单地表示为:
δx=0(4-28)
由于均值被重置了,之前描述的是关于 xk 切空间中的协方差,而现在描述的是 xk+1 中的协方差。重置会带来微小的差异,主要影响旋转部分。事实上,在重置前,卡尔曼滤波器刻画了 xpred 切空间处的一个高斯分布 N(δx,P), 而重置之后, 应该刻画 xpred⊞δx 处的一个 N(0,Preset ) 。
设重置前的名义旋转估计为 Rk,误差状态为 δθ,卡尔曼滤波的增量计算结果为 δθk,注意此处 δθk 已知,而 δθ 是随机变量。重置之后的名义旋转部分为
RkExp(δθk)=R+,误差状态为 δθ+。由于误差状态被重置了,显然此时 δθ+=0。但关心的并不是它们直接的取值,而是 δθ+与 δθ 的线性化关系。把实际的重置过程写出来:
R+Exp(δθ+)=RkExp(δθk)Exp(δθ+)=RkExp(δθ)(4-29)
不难得到:
Exp(δθ+)=Exp(−δθk)Exp(δθ)(4-30)
注意这里 δθ 为小量, 利用线性化后的 BCH 公式, 可以得到:
δθ+=−δθk+δθ−21δθk∧δθ+o((δθ)2)(4-31)
从而:
Jθ=∂δθ∂δθ+≈I−21δθk∧(4-32)
该式表明重置前后的误差状态相差一个旋转方面的小雅可比矩阵,记作 Jθ。 把这个小雅可比阵放到整个状态变量维度下,并保持其他部分为单位矩阵,可以得到一个完整的雅可比阵:
Jk=diag(I3,I3,Jθ,I3,I3,I3)(4-34)
因此,在把误差状态的均值归零同时,它们的协方差矩阵也应该进行线性变换:
Preset=JkPJkT(4-35)
参考