First Estimate Jacobian (FEJ)经典论文中的EKF SLAM的error-state equation的推导过程
论文A First Estimate Jacobian EKF for Improving SLAM Consistency中首次提出了First Estimate Jacobian (FEJ),这篇论文是FEJ的经典论文了,值得深入研读。本文先贴出这篇论文中EKF SLAM的Error-State Equation的推导过程。感兴趣的同学,如果有需要讨论的地方,可以email联系[email protected]
在标准化的SLAM公式中,机器人的状态向量包括在全局参考坐标系下的机器人位姿和路标的位置。因此在时刻k的状态向量可以表示为(在这篇论文中,为了表示的简洁,状态向量中只包含了一个路标):
xTk=[pTRkϕRkpTL]=[xTRkpTL](1)
其中xTRk=[pTRkϕRk]表示机器人的位姿,pL表示路标的位置。
EKF-SLAM包含两个步骤:propagation和update。
EKF Propagation
EKF propagation公式如下:
p̂ Rk+1|kϕ̂ Rk+1|kp̂ Lk+1|k===p̂ Rk|k+C(ϕ̂ Rk|k)Rkp̂ Rk+1ϕ̂ Rk|k+Rkϕ̂ Rk+1p̂ Lk|k(2)(3)(4)
其中C(⋅)表示2×2的旋转矩阵,而Rkx̂ Rk+1=[Rkp̂ TRk+1Rkϕ̂ Rk+1]T是从基于里程计估计的从时刻k到时刻k+1机器人的运动。毫无疑问这个估计是含有均值为0的高斯白噪声wk=RkxRk+1−Rkx̂ Rk+1,其协方差矩阵为Qk。
除了上述的状态递推公式外,EKF还需要线性化的error-state递推公式,该公式由公式(5)给出
x˜k+1|k=[ΦRk02×303×2I2][x˜Rk|kx˜Lk|k]+[GRk02×2]wk=Φkx˜k|k+Gkwk(5)
其中ΦRk和GRk可以从状态递推公式得到
ΦRkGRk==[I201×2JC(ϕ̂ Rk|k)Rkp̂ Rk+11]=[I201×2J(p̂ Rk+1|K−p̂ Rk|k)1][C(ϕ̂ Rk|k)01×202×11](6)(7)
其中J=[01−10]。

state和error state
- x̂ 是状态向量x的估计;
- x˜=x−x̂ 是error state;
对于不包含噪声的机器人状态向量也满足
pRk+1|kϕRk+1|k==pRk|k+C(ϕRk|k)RkpRk+1ϕRk|k+RkϕRk+1(8)(9)
公式(8)和(2)的两边相减,可以得到
p˜Rk+1|k=p˜k|k+C(ϕRk|k)RkpRk+1−C(ϕ̂ Rk|k)Rkp̂ Rk+1
p˜Rk+1|k=p˜k|k+(C(ϕRk|k)−C(ϕ̂ Rk|k))RkpRk+1+C(ϕ̂ Rk|k)Rkp˜Rk+1
p˜Rk+1|k≈p˜k|k+(C(ϕRk|k)−C(ϕ̂ Rk|k))Rkp̂ Rk+1+C(ϕ̂ Rk|k)Rkp˜Rk+1(10)
显然ϕRk|k=ϕ̂ Rk|k+ϕ˜Rk|k,所以
C(ϕRk|k)−C(ϕ̂ Rk|k)=C(ϕ̂ Rk|k+ϕ˜Rk|k)−C(ϕ̂ Rk|k)(11)
对于这种2D旋转,我们可以将旋转矩阵C写成:
C(ϕ)=[cos(ϕ)sin(ϕ)−sin(ϕ)cos(ϕ)](12)
易得,其导数为
DϕC=J⋅C(13)
可以得到如下的一阶近似:
C(ϕ̂ Rk|k+ϕ˜Rk|k)−C(ϕ̂ Rk|k)=JC(ϕ̂ Rk|k)ϕ˜Rk|k(14)
所以,可以得到公式(10)为:
p˜Rk+1|k=p˜Rk|k+JC(ϕ̂ Rk|k)Rkp̂ Rk+1ϕ˜Rk|k+C(ϕ̂ Rk|k)Rkp˜Rk+1(15)
由公式(2)知C(ϕ̂ Rk|k)Rkp̂ Rk+1=p̂ Rk+1|k−p̂ Rk|k,所以
p˜Rk+1|k=p˜Rk|k+J(p̂ Rk+1|k−p̂ Rk|k)ϕ˜Rk|k+C(ϕ̂ Rk|k)Rkp˜Rk+1(16)
EKF Update
EKF SLAM的测量模型是关于路标相对机器人的位置的函数:
zk=h(RkpL)+vk(17)
其中RkpL=CT(ϕRk)(pL−pRk)是时刻k路标相对于机器人的位置,vk是均值为0,协方差为Rk的高斯测量噪声。
为了不失一般性,我们假定h是非线性函数。线性化的measurement-error equation为:
z˜k≈[HRkHLk][x˜Rk|k−1x˜Lk|k−1]+vk=Hkx˜k|k−1+vk(18)
其中HRk和HLk分别是h对机器人位姿和路标的Jacobian矩阵。

注意:和EKF Propagation不同, 是因为h是非线性的,我们要在x̂ k|k−1处线性化,并且采用链式法则。
首先计算HLk,HLk=Dh⋅DpLRkpL=(∇h)⋅DpLRkpL, 而
DpLRkpL(x̂ k|k−1)=(∇h)CT(ϕ̂ k|k−1)(19)
接下来计算HRk,可以把HRk写成分块矩阵的形式HRk=Dh⋅DxRkRkpL=(∇h)[G1G2],其中
G1G2==DpRkRkpL=−CT(ϕ̂ Rk|k−1)DϕRkRkpL=(DϕRkCT(ϕ̂ Rk|k−1))⋅(p̂ Lk|k−1−p̂ Rk|k−1)(20)(21)
又因为
DϕRkCT(ϕ̂ Rk|k−1)=(JCT(ϕ̂ Rk|k−1))T=CT(ϕ̂ Rk|k−1)JT=CT(ϕ̂ Rk|k−1)(−J)(22)
所以,
G2=DϕRkRkpL=CT(ϕ̂ Rk|k−1)(−J)(p̂ Lk|k−1−p̂ Rk|k−1)(23)