赞
踩
原代码对新手似乎不是很友好,所以用Eigen重新实现了Fast-LIO的核心功能:Github链接 Gitee链接
本文中变量命名与Fast-LIO论文中不尽相同,比如为了便于阅读而忽略了很多上下标,如有误解之处,敬请指正。
通过指数/对数映射可以实现李群和李代数之间的映射,定义
⊞
\boxplus
⊞和
⊟
\boxminus
⊟运算符,如下:
R
⊞
r
=
R
E
x
p
(
r
)
R
1
⊟
R
2
=
L
o
g
(
R
2
T
R
1
)
a
⊞
b
=
a
+
b
a
⊟
b
=
a
−
b
R\boxplus r=RExp(r)\\ R_1\boxminus R_2=Log(R_2^TR_1)\\ a\boxplus b=a+b\\ a\boxminus b=a-b
R⊞r=RExp(r)R1⊟R2=Log(R2TR1)a⊞b=a+ba⊟b=a−b
其中
R
,
R
1
,
R
2
∈
S
O
(
3
)
R,R_1,R_2\in SO(3)
R,R1,R2∈SO(3),
a
,
b
∈
R
n
a,b\in \R^n
a,b∈Rn。指数映射为:
E
x
p
(
r
)
=
I
+
r
∣
∣
r
∣
∣
s
i
n
(
∣
∣
r
∣
∣
)
+
r
2
∣
∣
r
∣
∣
2
(
1
−
c
o
s
(
∣
∣
r
∣
∣
)
)
Exp(r)=I+\frac{r}{||r||}sin(||r||)+\frac{r^2}{||r||^2}(1-cos(||r||))
Exp(r)=I+∣∣r∣∣rsin(∣∣r∣∣)+∣∣r∣∣2r2(1−cos(∣∣r∣∣))
上式也就是罗德里格斯公式,对数映射是它的逆映射。对应的程序如下:
// 指数映射 static Eigen::Matrix3d Exp(const Eigen::Vector3d& r){ Eigen::Matrix3d expr; double theta = r.norm(); if(theta < 1e-7){ expr = Eigen::Matrix3d::Identity(); } else{ Eigen::Matrix3d skew = get_skew_symmetric(r / theta); expr = Eigen::Matrix3d::Identity() + sin(theta) * skew + (1 - cos(theta)) * skew * skew; } return expr; } // 对数映射 static Eigen::Vector3d Log(const Eigen::Matrix3d& R){ double theta = (R.trace() > 3 - 1e-6) ? 0 : acos((R.trace() - 1) / 2); Eigen::Vector3d r(R(2,1) - R(1,2), R(0,2) - R(2,0), R(1,0) - R(0,1)); return fabs(theta) < 0.001 ? (0.5 * r) : (0.5 * theta / sin(theta) * r); }
因为fastlio论文看着有些晦涩,这里的推导主要参考高翔的博文简明ESKF推导
定义状态向量
x
x
x:
x
=
[
p
T
v
T
R
T
b
g
T
b
a
T
g
T
]
T
x=[pTvTRTbTgbTagT]^T
x=[pTvTRTbgTbaTgT]T
状态的连续时间微分方程为:
p
˙
=
v
v
˙
=
R
(
f
b
−
b
a
−
n
a
)
−
g
R
˙
=
R
(
ω
b
−
b
g
−
n
g
)
×
b
g
˙
=
n
b
g
b
a
˙
=
n
b
a
g
˙
=
0
\dot{p}=v\\ \dot{v}=R(f^b-b_a-n_a)-g\\ \dot{R}=R(\omega^b-b_g-n_g)\times\\ \dot{b_g}=n_{bg}\\ \dot{b_a}=n_{ba}\\ \dot g=0
p˙=vv˙=R(fb−ba−na)−gR˙=R(ωb−bg−ng)×bg˙=nbgba˙=nbag˙=0
其中
f
b
f^b
fb和
ω
b
\omega^b
ωb分别为加速度计和陀螺仪测量值。
状态向量的估计值
x
^
\hat x
x^,表示为:
x
^
=
[
p
^
T
v
^
T
R
^
T
b
^
g
T
b
^
a
T
g
^
T
]
T
\hat x=[ˆpTˆvTˆRTˆbTgˆbTaˆgT]^T
x^=[p^Tv^TR^Tb^gTb^aTg^T]T
它的微分方程与真实值的微分方程相同,不过要忽略噪声。接下来推导误差状态向量
δ
x
\delta x
δx,定义误差状态变量如下:
p
=
p
^
+
δ
p
v
=
v
^
+
δ
v
R
=
R
δ
R
b
g
=
b
^
g
+
δ
b
g
b
a
=
b
^
a
+
δ
b
a
g
=
g
^
+
δ
g
p=\hat p+\delta p\\ v=\hat v+\delta v\\ R=R\delta R\\ b_g=\hat b_g+\delta b_g\\ b_a=\hat b_a+\delta b_a\\ g=\hat g+\delta g
p=p^+δpv=v^+δvR=RδRbg=b^g+δbgba=b^a+δbag=g^+δg
姿态部分的误差
δ
R
\delta R
δR对应的李代数为
δ
θ
\delta\theta
δθ,即
δ
R
=
E
x
p
(
δ
θ
)
\delta R=Exp(\delta\theta)
δR=Exp(δθ)。因此真实状态、估计状态、误差状态三者的关系可以表述为:
x
=
x
^
⊞
δ
x
x=\hat x\boxplus\delta x
x=x^⊞δx
其中误差状态向量
δ
x
=
[
δ
p
T
δ
v
T
δ
θ
T
δ
b
g
T
δ
b
a
T
δ
g
T
]
T
\delta x=[δpTδvTδθTδbTgδbTaδgT]^T
δx=[δpTδvTδθTδbgTδbaTδgT]T
误差状态中的位置、零偏和重力项都可以很容易的得到微分方程:
δ
p
˙
=
δ
v
δ
b
g
˙
=
n
b
g
δ
b
a
˙
=
n
b
a
δ
g
˙
=
0
\delta\dot{p}=\delta v\\ \delta\dot{b_g}=n_{bg}\\ \delta\dot{b_a}=n_{ba}\\ \delta\dot g=0
δp˙=δvδbg˙=nbgδba˙=nbaδg˙=0
速度、姿态均与
δ
R
\delta R
δR相关,以下进行单独求导。
姿态真实值的微分方程:
R
˙
=
R
(
ω
b
−
b
g
−
n
g
)
×
(1)
\dot{R}=R(\omega^b-b_g-n_g)\times\tag{1}
R˙=R(ωb−bg−ng)×(1)
姿态估计值的微分方程:
R
^
˙
=
R
^
(
ω
b
−
b
^
g
)
×
(2)
\dot{\hat{R}}=\hat R(\omega^b-\hat b_g)\times\tag{2}
R^˙=R^(ωb−b^g)×(2)
姿态真实值、估计值、误差值三者的关系
R
=
R
^
E
x
p
(
δ
θ
)
(3)
R=\hat RExp(\delta\theta)\tag{3}
R=R^Exp(δθ)(3)
对
(
3
)
(3)
(3)式两侧分别求时间导数,得到:
R
˙
=
R
^
˙
E
x
p
(
δ
θ
)
+
R
^
E
x
p
(
δ
θ
)
˙
=
R
^
˙
E
x
p
(
δ
θ
)
+
R
^
E
x
p
(
δ
θ
)
(
δ
θ
˙
×
)
(4)
˙R=˙ˆRExp(δθ)+ˆR˙Exp(δθ)=˙ˆRExp(δθ)+ˆRExp(δθ)(˙δθ×)\tag{4}
R˙=R^˙Exp(δθ)+R^Exp(δθ)˙=R^˙Exp(δθ)+R^Exp(δθ)(δθ˙×)(4)
将
(
3
)
(3)
(3)式代入
(
1
)
(1)
(1),得到:
R
˙
=
R
^
E
x
p
(
δ
θ
)
(
ω
b
−
b
g
−
n
g
)
×
(5)
˙R=ˆRExp(δθ)(ωb−bg−ng)×\tag{5}
R˙=R^Exp(δθ)(ωb−bg−ng)×(5)
联立
(
2
)
(
4
)
(
5
)
(2)(4)(5)
(2)(4)(5),得到:
R
^
(
ω
b
−
b
^
g
)
×
E
x
p
(
δ
θ
)
+
R
^
E
x
p
(
δ
θ
)
(
δ
θ
˙
×
)
=
R
^
E
x
p
(
δ
θ
)
(
ω
b
−
b
g
−
n
g
)
×
\hat R(\omega^b-\hat b_g)\times Exp(\delta\theta)+\hat RExp(\delta\theta)(\dot{\delta\theta}\times)=\hat RExp(\delta\theta)(\omega^b-b_g-n_g)\times
R^(ωb−b^g)×Exp(δθ)+R^Exp(δθ)(δθ˙×)=R^Exp(δθ)(ωb−bg−ng)×
消掉
R
^
\hat R
R^,再利用
S
O
(
3
)
SO(3)
SO(3)的伴随性质
ϕ
×
R
=
R
(
R
T
ϕ
)
×
\phi\times R=R(R^T\phi)\times
ϕ×R=R(RTϕ)×,得到:
E
x
p
(
δ
θ
)
(
δ
θ
˙
×
)
=
E
x
p
(
δ
θ
)
(
ω
b
−
b
g
−
n
g
)
×
−
E
x
p
(
δ
θ
)
(
E
x
p
(
−
δ
θ
)
(
ω
b
−
b
^
g
)
)
×
Exp(\delta\theta)(\dot{\delta\theta}\times)=Exp(\delta\theta)(\omega^b-b_g-n_g)\times-Exp(\delta\theta)(Exp(-\delta\theta)(\omega^b-\hat b_g))\times
Exp(δθ)(δθ˙×)=Exp(δθ)(ωb−bg−ng)×−Exp(δθ)(Exp(−δθ)(ωb−b^g))×
消掉
E
x
p
(
δ
θ
)
Exp(\delta\theta)
Exp(δθ)以及
×
\times
×符号,得到:
δ
θ
˙
=
(
ω
b
−
b
g
−
n
g
)
−
E
x
p
(
−
δ
θ
)
(
ω
b
−
b
^
g
)
≈
(
ω
b
−
b
g
−
n
g
)
−
(
I
−
δ
θ
×
)
(
ω
b
−
b
^
g
)
=
(
ω
b
−
(
b
^
g
+
δ
b
g
)
−
n
g
)
−
(
I
−
δ
θ
×
)
(
ω
b
−
b
^
g
)
=
−
(
ω
b
−
b
g
)
×
δ
θ
−
δ
b
g
−
n
g
˙δθ=(ωb−bg−ng)−Exp(−δθ)(ωb−ˆbg)≈(ωb−bg−ng)−(I−δθ×)(ωb−ˆbg)=(ωb−(ˆbg+δbg)−ng)−(I−δθ×)(ωb−ˆbg)=−(ωb−bg)×δθ−δbg−ng
δθ˙=(ωb−bg−ng)−Exp(−δθ)(ωb−b^g)≈(ωb−bg−ng)−(I−δθ×)(ωb−b^g)=(ωb−(b^g+δbg)−ng)−(I−δθ×)(ωb−b^g)=−(ωb−bg)×δθ−δbg−ng
速度真实值的微分方程:
v
˙
=
R
(
f
b
−
b
a
−
n
a
)
−
g
(1)
\dot{v}=R(f^b-b_a-n_a)-g\tag{1}
v˙=R(fb−ba−na)−g(1)
估计值的微分方程:
v
^
˙
=
R
^
(
f
b
−
b
^
a
)
−
g
^
(2)
\dot{\hat {v}}=\hat R(f^b-\hat b_a)-\hat g\tag{2}
v^˙=R^(fb−b^a)−g^(2)
真实值、估计值、误差值的关系:
v
=
v
^
+
δ
v
(3)
v=\hat v+\delta v\tag{3}
v=v^+δv(3)
分别对
(
3
)
(3)
(3)式两侧求导,得到:
v
˙
=
v
^
˙
+
δ
v
˙
(4)
\dot v=\dot{\hat v}+\dot{\delta v}\tag{4}
v˙=v^˙+δv˙(4)
联立
(
1
)
(
2
)
(
4
)
(1)(2)(4)
(1)(2)(4),得到
R
^
(
f
b
−
b
^
a
)
−
g
^
+
δ
v
˙
=
R
(
f
b
−
b
a
−
n
a
)
−
g
=
R
^
E
x
p
(
δ
θ
)
(
f
b
−
b
a
−
n
a
)
−
g
≈
R
^
(
I
+
δ
θ
×
)
(
f
b
−
b
a
−
n
a
)
−
g
ˆR(fb−ˆba)−ˆg+˙δv=R(fb−ba−na)−g=ˆRExp(δθ)(fb−ba−na)−g≈ˆR(I+δθ×)(fb−ba−na)−g
R^(fb−b^a)−g^+δv˙=R(fb−ba−na)−g=R^Exp(δθ)(fb−ba−na)−g≈R^(I+δθ×)(fb−ba−na)−g
化简得到:
δ
v
˙
=
R
^
(
−
δ
b
a
−
n
a
−
(
f
b
−
b
a
+
δ
b
a
−
n
a
)
×
δ
θ
)
−
δ
g
\dot{\delta v}=\hat R(-\delta b_a-n_a-(f^b-b_a+\delta b_a-n_a)\times\delta\theta)-\delta g
δv˙=R^(−δba−na−(fb−ba+δba−na)×δθ)−δg
忽略二次小量,得到:
δ
v
˙
=
−
R
^
δ
b
a
−
R
^
(
f
b
−
b
a
)
×
δ
θ
−
δ
g
−
R
^
n
a
=
−
R
^
δ
b
a
−
R
^
(
f
b
−
b
a
)
×
δ
θ
−
δ
g
−
n
a
˙δv=−ˆRδba−ˆR(fb−ba)×δθ−δg−ˆRna=−ˆRδba−ˆR(fb−ba)×δθ−δg−na
δv˙=−R^δba−R^(fb−ba)×δθ−δg−R^na=−R^δba−R^(fb−ba)×δθ−δg−na
综上,误差状态的连续时间微分方程如下:
δ
p
˙
=
δ
v
δ
v
˙
=
−
R
^
δ
b
a
−
R
^
(
f
b
−
b
a
)
×
δ
θ
−
δ
g
−
n
a
δ
θ
˙
=
−
(
ω
b
−
b
g
)
×
δ
θ
−
δ
b
g
−
n
g
δ
b
g
˙
=
n
b
g
δ
b
a
˙
=
n
b
a
δ
g
˙
=
0
\delta\dot{p}=\delta v\\ \dot{\delta v}=-\hat R\delta b_a-\hat R(f^b-b_a)\times\delta\theta-\delta g-n_a\\ \dot{\delta\theta}=-(\omega^b-b_g)\times\delta\theta-\delta b_g-n_g \\ \delta\dot{b_g}=n_{bg}\\ \delta\dot{b_a}=n_{ba}\\ \delta\dot g=0
δp˙=δvδv˙=−R^δba−R^(fb−ba)×δθ−δg−naδθ˙=−(ωb−bg)×δθ−δbg−ngδbg˙=nbgδba˙=nbaδg˙=0
离散后的微分方程如下::
δ
p
k
+
1
=
δ
p
k
+
δ
v
△
t
δ
v
k
+
1
=
v
k
−
R
^
△
t
δ
b
a
−
R
^
(
f
b
−
b
a
)
△
t
×
δ
θ
−
δ
g
△
t
−
n
v
δ
θ
k
+
1
=
E
x
p
(
−
(
ω
b
−
b
g
)
△
t
)
δ
θ
k
−
δ
b
g
△
t
−
n
θ
δ
b
g
k
+
1
=
δ
b
g
k
+
n
g
δ
b
a
k
+
1
=
δ
b
a
k
+
n
a
δ
g
k
+
1
=
g
k
\delta{p}_{k+1}=\delta p_k+\delta v\triangle t\\ {\delta v_{k+1}}=v_k-\hat R\triangle t\delta b_a-\hat R(f^b-b_a)\triangle t\times\delta\theta-\delta g\triangle t-n_v\\ {\delta\theta}_{k+1}=Exp(-(\omega^b-b_g)\triangle t)\delta\theta_k-\delta b_g\triangle t-n_\theta\\ \delta{b_g}_{k+1}=\delta{b_g}_k+n_{g}\\ \delta{b_a}_{k+1}=\delta{b_a}_k+n_{a}\\ \delta g_{k+1}=g_k
δpk+1=δpk+δv△tδvk+1=vk−R^△tδba−R^(fb−ba)△t×δθ−δg△t−nvδθk+1=Exp(−(ωb−bg)△t)δθk−δbg△t−nθδbgk+1=δbgk+ngδbak+1=δbak+naδgk+1=gk
上式可以记为:
δ
x
k
+
1
=
F
x
δ
x
k
+
F
w
w
\delta x_{k+1}=F_x\delta x_k+F_ww
δxk+1=Fxδxk+Fww
其中:
w
=
[
n
v
T
n
θ
T
n
g
T
n
a
T
]
T
∼
N
(
0
,
Q
)
F
x
=
[
I
I
△
t
0
0
0
0
0
I
−
R
^
(
f
b
−
b
a
)
△
t
×
0
−
R
^
△
t
I
△
t
0
0
E
x
p
(
−
(
ω
b
−
b
g
)
△
t
)
−
I
△
t
0
0
0
0
0
I
0
0
0
0
0
0
I
0
0
0
0
0
0
I
]
F
w
=
[
0
0
0
0
−
I
△
t
0
0
0
0
−
I
△
t
0
0
0
0
I
△
t
0
0
0
0
I
△
t
0
0
0
0
]
w=[nTvnTθnTgnTa]T∼N(0,Q)Fx=[II△t00000I−ˆR(fb−ba)△t×0−ˆR△tI△t00Exp(−(ωb−bg)△t)−I△t00000I000000I000000I]Fw=[0000−I△t0000−I△t0000I△t0000I△t0000]
wFxFw=[nvTnθTngTnaT]T∼N(0,Q)=
I00000I△tI00000−R^(fb−ba)△t×Exp(−(ωb−bg)△t)00000−I△tI000−R^△t00I00I△t000I
=
0−I△t000000−I△t000000I△t000000I△t0
所以误差状态卡尔曼滤波的预测部分可以表述为:
δ
x
k
+
1
=
F
x
δ
x
k
P
k
+
1
=
F
x
P
k
F
x
T
+
F
w
Q
F
w
T
\delta x_{k+1}=F_x\delta x_k\\ P_{k+1}=F_xP_kF_x^T+F_wQF_w^T
δxk+1=FxδxkPk+1=FxPkFxT+FwQFwT
δ
x
\delta x
δx在更新后都会被重置为0,因此可以不进行计算。
以平面特征点的观测方程为例,首先使用下式将lidar系下的平面特征点
p
l
p_l
pl转换到world系下,其中忽略了lidar和imu的外参以及运动补偿。
p
w
=
R
p
l
+
t
p_w=Rp_l+t
pw=Rpl+t
然后从地图中找到5个与
p
w
p_w
pw对应的平面特征点,用这些点拟合平面
A
x
+
B
y
+
C
z
+
D
=
0
Ax+By+Cz+D=0
Ax+By+Cz+D=0,也即
A
D
x
+
B
D
y
+
C
D
z
=
−
1
\frac{A}{D}x+\frac{B}{D}y+\frac{C}{D}z=-1
DAx+DBy+DCz=−1。求解得到平面的归一化法向量
u
=
[
A
,
B
,
C
]
T
u=[A,B,C]^T
u=[A,B,C]T和截距
D
D
D。然后计算点到平面的距离
z
=
A
x
+
B
y
+
C
z
+
D
z=Ax+By+Cz+D
z=Ax+By+Cz+D。
如果使用真实的参数
x
x
x,计算得到的点到平面的距离应该为0,也就是说:
h
(
x
)
=
h
(
x
^
⊞
δ
x
)
=
u
T
(
R
p
l
+
t
−
q
)
=
u
T
(
(
R
^
⊞
δ
R
)
p
l
+
t
^
+
t
~
−
q
)
=
0
h(x)=h(ˆx⊞
h(x)=h(x^⊞δx)=uT(Rpl+t−q)=uT((R^⊞δR)pl+t^+t
−q)=0
但是真实的参数无法获得,使用估计值
x
^
\hat x
x^计算出的距离为:
h
(
x
^
)
=
u
T
(
R
^
p
l
+
t
^
−
q
)
h(x^)=uT(R^pl+t^−q)
两者的偏差由姿态误差
δ
R
\delta{R}
δR、平移误差
δ
t
\delta{t}
δt和观测噪声引起。在
δ
x
=
0
\delta x=0
δx=0处进行一阶泰勒展开
h
(
x
)
=
h
(
x
^
⊞
δ
x
)
+
v
≈
h
(
x
^
)
+
H
δ
x
+
v
h(x)=h(\hat x\boxplus\delta x)+v≈h(\hat x)+H\delta x+v
h(x)=h(x^⊞δx)+v≈h(x^)+Hδx+v
H
H
H是
h
(
x
)
h(x)
h(x)在
δ
x
=
0
\delta x=0
δx=0处的雅克比矩阵,变换上式得到:
H
δ
x
=
h
(
x
^
⊞
δ
x
)
−
h
(
x
^
)
H\delta x=h(\hat x\boxplus\delta x)-h(\hat x)
Hδx=h(x^⊞δx)−h(x^)
对等式两侧分别求偏导,得到
H
=
∂
H
δ
x
∂
δ
x
=
∂
(
h
(
x
^
⊞
δ
x
)
−
h
(
x
^
)
)
∂
δ
x
=
l
i
m
δ
x
→
0
u
T
(
R
^
E
x
p
(
δ
θ
)
p
l
+
t
^
+
δ
t
)
−
u
T
(
R
^
p
l
+
t
^
)
δ
x
H=∂δx∂Hδx=∂δx∂(h(x^⊞δx)−h(x^))=limδx→0δxuT(R^Exp(δθ)pl+t^+δt)−uT(R^pl+t^)
分别求偏导
∂
H
δ
x
∂
δ
θ
\frac{\partial H\delta x}{\partial\delta \theta}
∂δθ∂Hδx和
∂
H
δ
x
∂
δ
t
\frac{\partial H\delta x}{\partial\delta t}
∂δt∂Hδx:
∂
H
δ
x
∂
δ
θ
=
l
i
m
δ
θ
→
0
u
T
(
R
^
E
x
p
(
δ
θ
)
p
l
+
t
^
)
−
u
T
(
R
^
p
l
+
t
^
)
δ
θ
=
l
i
m
δ
θ
→
0
u
T
(
R
^
E
x
p
(
δ
θ
)
−
R
^
)
p
l
δ
θ
≈
l
i
m
δ
θ
→
0
u
T
(
R
^
(
I
+
δ
θ
×
)
−
R
^
)
p
l
δ
θ
=
l
i
m
δ
θ
→
0
u
T
R
^
δ
θ
×
p
l
δ
θ
=
l
i
m
δ
θ
→
0
−
u
T
R
^
p
l
×
δ
θ
δ
θ
=
−
u
T
R
^
(
p
l
×
)
∂
H
δ
x
∂
δ
t
=
u
T
∂δθ∂Hδx∂δt∂Hδx=limδθ→0δθuT(R^Exp(δθ)pl+t^)−uT(R^pl+t^)=limδθ→0δθuT(R^Exp(δθ)−R^)pl≈limδθ→0δθuT(R^(I+δθ×)−R^)pl=limδθ→0δθuTR^δθ×pl=limδθ→0δθ−uTR^pl×δθ=−uTR^(pl×)=uT
因此观测方程的雅克比矩阵表示为:
h
i
=
[
u
i
T
0
−
u
i
T
R
^
(
p
l
i
×
)
0
0
0
]
H
=
[
h
1
h
2
⋮
h
M
]
h_i=\\ H=
hi=[uiT0−uiTR^(pli×)000]H=
h1h2⋮hM
迭代卡尔曼滤波中的状态更新过程可以看做优化问题。
上一节中,有
h
(
x
)
=
h
(
x
^
)
+
H
δ
x
+
v
=
0
h(x)=h(x^)+Hδx+v=0
其中
v
∼
N
(
0
,
R
)
v\sim N(0,R)
v∼N(0,R),因此有
−
v
=
h
(
x
^
)
+
H
δ
x
∼
N
(
0
,
R
)
−v=h(x^)+Hδx∼N(0,R)
以上是观测残差 δ z \delta z δz在先验 δ x \delta x δx下的条件分布
真实的误差状态
δ
x
\delta x
δx与第
k
k
k次迭代得到的误差状态
δ
x
k
\delta x_k
δxk之间的关系为
δ
x
=
x
⊟
x
^
=
x
^
k
⊞
δ
x
k
⊟
x
^
\delta x = x\boxminus\hat x=\hat x_k\boxplus\delta x_k\boxminus \hat x
δx=x⊟x^=x^k⊞δxk⊟x^
其中
x
^
k
\hat x_k
x^k是第
k
k
k次迭代得到的状态向量,在
δ
x
k
=
0
\delta x_k=0
δxk=0处进行一阶泰勒展开,得到:
δ
x
≈
x
^
k
⊟
x
^
+
J
k
δ
x
k
\delta x≈\hat x_k\boxminus\hat x+J_k\delta x_k
δx≈x^k⊟x^+Jkδxk
J
k
J_k
Jk是
δ
x
\delta x
δx在
δ
x
k
=
0
\delta x_k=0
δxk=0处的雅克比矩阵。可以轻易地得到,除了姿态误差外,其余项均为单位矩阵,以下求解姿态误差的雅克比矩阵
δ
θ
δ
θ
k
\frac{\delta \theta}{\delta\theta_k}
δθkδθ。
令真实值为
R
R
R,对应的李代数为
ϕ
\phi
ϕ;预测值为
R
^
\hat{R}
R^,对应的李代数为
ϕ
^
\hat\phi
ϕ^;误差状态为
δ
R
\delta R
δR,对应的李代数为
δ
θ
\delta\theta
δθ;第
k
k
k次迭代的预测值为
R
^
k
\hat R_k
R^k,对应的李代数为
ϕ
^
k
\hat\phi_k
ϕ^k;误差为
δ
θ
k
\delta\theta_k
δθk。满足:
δ
θ
=
R
⊟
R
^
=
R
^
k
⊞
δ
θ
k
⊟
R
^
=
L
o
g
(
R
^
T
R
^
k
E
x
p
(
δ
θ
k
)
)
=
L
o
g
(
E
x
p
(
−
ϕ
^
)
E
x
p
(
ϕ
^
k
)
E
x
p
(
δ
θ
k
)
)
δθ=R⊟R^=R^k⊞δθk⊟R^=Log(R^TR^kExp(δθk))=Log(Exp(−ϕ^)Exp(ϕ^k)Exp(δθk))
由右乘BCH近似得到:
δ
θ
≈
A
−
1
(
ϕ
^
k
⊟
ϕ
^
)
δ
θ
k
+
ϕ
^
k
⊟
ϕ
^
\delta\theta≈A^{-1}(\hat\phi_k\boxminus\hat\phi)\delta\theta_k+\hat\phi_k\boxminus\hat\phi
δθ≈A−1(ϕ^k⊟ϕ^)δθk+ϕ^k⊟ϕ^
右乘BCH公式:
L o g ( E x p ( ϕ 1 ) E x p ( ϕ 2 ) ) ≈ A − 1 ( ϕ 1 ) ϕ 2 + ϕ 1 , ϕ 2 为小量 A ( ϕ ) = I + s i n ( ∣ ∣ ϕ ∣ ∣ ) ∣ ∣ ϕ ∣ ∣ ( ϕ × ) 2 ∣ ∣ ϕ ∣ ∣ 2 − 1 − c o s ( ∣ ∣ ϕ ∣ ∣ ) ∣ ∣ ϕ ∣ ∣ ϕ × ∣ ∣ ϕ ∣ ∣ Log(Exp(\phi_1)Exp(\phi_2))≈A^{-1}(\phi_1)\phi_2+\phi_1,\phi_2为小量\\ A(\phi)=I+\frac{sin(||\phi||)}{||\phi||}\frac{(\phi\times)^2}{||\phi||^2}-\frac{1-cos(||\phi||)}{||\phi||}\frac{\phi\times}{||\phi||} Log(Exp(ϕ1)Exp(ϕ2))≈A−1(ϕ1)ϕ2+ϕ1,ϕ2为小量A(ϕ)=I+∣∣ϕ∣∣sin(∣∣ϕ∣∣)∣∣ϕ∣∣2(ϕ×)2−∣∣ϕ∣∣1−cos(∣∣ϕ∣∣)∣∣ϕ∣∣ϕ×
注:Fast-LIO中给出的A阵是左乘BCH近似雅克比矩阵,右乘雅克比矩阵自变量取负数或者转置即可得到左乘雅克比矩阵(所以论文里的A阵都进行了转置)
A l ( ϕ ) = A r ( − ϕ ) 或者 A l ( ϕ ) = A r T ( ϕ ) A_l(\phi)=A_r(-\phi)\\ 或者A_l(\phi)=A_r^T(\phi) Al(ϕ)=Ar(−ϕ)或者Al(ϕ)=ArT(ϕ)
(14讲4.3.1)
因此
δ
θ
δ
θ
k
=
A
−
1
(
ϕ
^
k
⊟
ϕ
^
)
\frac{\delta \theta}{\delta\theta_k}=A^{-1}(\hat\phi_k\boxminus\hat\phi)
δθkδθ=A−1(ϕ^k⊟ϕ^)。令
{
J
k
=
d
i
a
g
{
I
,
I
,
A
−
1
(
ϕ
^
k
⊟
ϕ
^
)
,
I
,
I
,
I
}
d
=
x
^
k
⊟
x
^
{Jk=diag{I,I,A−1(ϕ^k⊟ϕ^),I,I,I}d=x^k⊟x^,则:
δ
x
=
d
+
J
k
δ
x
k
∼
N
(
0
,
P
)
δx=d+Jkδxk∼N(0,P)
已知条件概率密度函数
p
(
δ
z
∣
δ
x
)
p(\delta z|\delta x)
p(δz∣δx)和先验概率密度函数
p
(
δ
x
)
p(\delta x)
p(δx),条件概率分布和先验分布
{
z
+
H
δ
x
k
∼
N
(
0
,
R
)
d
+
J
k
δ
x
k
∼
N
(
0
,
P
)
{z+Hδxk∼N(0,R)d+Jkδxk∼N(0,P)均服从高斯分布,后验概率密度函数为:
p
(
δ
x
∣
δ
z
)
=
p
(
δ
z
∣
δ
x
)
p
(
δ
x
)
p
(
δ
z
)
p(δx∣δz)=p(δz)p(δz∣δx)p(δx)
最大后验估计定义为:求解
δ
x
k
\delta x_k
δxk,使得
p
(
δ
x
∣
δ
z
)
p(\delta x|\delta z)
p(δx∣δz)最大,即
m
a
x
δ
x
k
p
(
δ
x
∣
δ
z
)
∝
m
a
x
δ
x
k
p
(
δ
z
∣
δ
x
)
p
(
δ
x
)
∝
m
a
x
δ
x
k
e
x
p
{
−
1
2
(
z
k
+
H
δ
x
k
)
T
R
−
1
(
z
k
+
H
δ
x
k
)
−
1
2
(
d
+
J
k
δ
x
k
)
T
P
−
1
(
d
+
J
k
δ
x
k
)
}
∝
m
i
n
δ
x
k
{
1
2
(
z
k
+
H
δ
x
k
)
T
R
−
1
(
z
k
+
H
δ
x
k
)
+
1
2
(
d
+
J
k
δ
x
k
)
T
P
−
1
(
d
+
J
k
δ
x
k
)
}
∝
m
i
n
δ
x
k
∣
∣
d
+
J
k
δ
x
k
∣
∣
P
−
1
2
+
∣
∣
z
k
+
H
δ
x
k
∣
∣
R
−
1
2
maxδxk p(δx∣δz)∝maxδxk p(δz∣δx)p(δx)∝maxδxk exp{−21(zk+Hδxk)TR−1(zk+Hδxk)−21(d+Jkδxk)TP−1(d+Jkδxk)}∝ minδxk{21(zk+Hδxk)TR−1(zk+Hδxk)+21(d+Jkδxk)TP−1(d+Jkδxk)}∝ minδxk∣∣d+Jkδxk∣∣P−12+∣∣zk+Hδxk∣∣R−12
将目标函数
ϵ
\epsilon
ϵ表示如下:
ϵ
=
1
2
∣
∣
d
+
J
k
δ
x
k
∣
∣
P
−
1
2
+
1
2
∣
∣
z
k
+
H
δ
x
k
∣
∣
R
−
1
2
=
1
2
(
d
+
J
k
δ
x
k
)
T
P
−
1
(
d
+
J
k
δ
x
k
)
+
1
2
(
z
k
+
H
δ
x
k
)
T
R
−
1
(
z
k
+
H
δ
x
k
)
ϵ=21∣∣d+Jkδxk∣∣P−12+21∣∣zk+Hδxk∣∣R−12=21(d+Jkδxk)TP−1(d+Jkδxk)+21(zk+Hδxk)TR−1(zk+Hδxk)
求
δ
x
k
\delta x_k
δxk的偏导,得到:
∂
ϵ
∂
δ
x
k
=
(
J
T
P
−
1
J
+
H
T
R
−
1
H
)
δ
x
k
+
J
T
P
−
1
d
+
H
T
R
−
1
z
∂δxk∂ϵ=(JTP−1J+HTR−1H)δxk+JTP−1d+HTR−1z
令
∂
ϵ
∂
δ
x
k
=
0
\frac{\partial\epsilon}{\partial\delta x_k}=0
∂δxk∂ϵ=0,得到:
δ
x
k
=
(
J
T
P
−
1
J
+
H
T
R
−
1
H
)
−
1
(
−
J
T
P
−
1
d
−
H
T
R
−
1
z
)
(1)
\tag{1}
δxk=(JTP−1J+HTR−1H)−1(−JTP−1d−HTR−1z)(1)
令
Q
=
(
J
T
P
−
1
J
+
H
T
R
−
1
H
)
−
1
Q=(J^TP^{-1}J+H^TR^{-1}H)^{-1}
Q=(JTP−1J+HTR−1H)−1,由矩阵求逆定理,即
(
A
−
1
+
B
D
−
1
C
)
−
1
=
A
−
A
B
(
D
+
C
A
B
)
−
1
C
A
(A^{-1}+BD^{-1}C)^{-1}=A-AB(D+CAB)^{-1}CA
(A−1+BD−1C)−1=A−AB(D+CAB)−1CA,得到:
Q
=
(
I
−
(
J
T
P
−
1
J
)
−
1
H
T
(
H
(
J
T
P
−
1
J
)
−
1
H
T
+
R
)
−
1
H
)
(
J
T
P
−
1
J
)
−
1
Q=(I-(J^TP^{-1}J)^{-1}H^T(H(J^TP^{-1}J)^{-1}H^T+R)^{-1}H)(J^TP^{-1}J)^{-1}
Q=(I−(JTP−1J)−1HT(H(JTP−1J)−1HT+R)−1H)(JTP−1J)−1
令
K
=
(
J
T
P
−
1
J
)
−
1
H
T
(
H
(
J
T
P
−
1
J
)
−
1
H
T
+
R
)
−
1
K=(J^TP^{-1}J)^{-1}H^T(H(J^TP^{-1}J)^{-1}H^T+R)^{-1}
K=(JTP−1J)−1HT(H(JTP−1J)−1HT+R)−1,此即卡尔曼增益。
Q
Q
Q可表示为:
Q
=
(
I
−
K
H
)
(
J
T
P
−
1
J
)
−
1
(2)
Q=(I-KH)(J^TP^{-1}J)^{-1}\tag{2}
Q=(I−KH)(JTP−1J)−1(2)
令
U
=
(
J
T
P
−
1
J
)
−
1
U=(J^TP^{-1}J)^{-1}
U=(JTP−1J)−1,联立
{
K
=
U
H
T
(
H
U
H
T
+
R
)
−
1
Q
=
(
I
−
K
H
)
U
{K=UHT(HUHT+R)−1Q=(I−KH)U,得到:
Q
H
T
=
K
R
(3)
QH^T=KR\tag{3}
QHT=KR(3)
公式(3)推导过程如下:
对于公式
K
=
U
H
T
(
H
U
H
T
+
R
)
−
1
K=UH^T(HUH^T+R)^{-1}
K=UHT(HUHT+R)−1,两侧同时右乘
H
U
H
T
+
R
HUH^T+R
HUHT+R,得到:
K
H
U
H
T
+
K
R
=
U
H
T
KHUH^T+KR=UH^T
KHUHT+KR=UHT两侧同时减掉
K
H
U
H
T
KHUH^T
KHUHT,得到:
K
R
=
U
H
T
−
K
H
U
H
T
=
(
I
−
K
H
)
U
H
T
KR=UHT−KHUHT=(I−KH)UHT将
Q
=
(
I
−
K
H
)
U
Q=(I-KH)U
Q=(I−KH)U带入上式,即可得到公式(3)
将
{
Q
=
(
I
−
K
H
)
(
J
T
P
−
1
J
)
−
1
Q
H
T
=
K
R
{Q=(I−KH)(JTP−1J)−1QHT=KR带入
(
1
)
(1)
(1)式,得到
δ
x
k
=
(
J
T
P
−
1
J
+
H
T
R
−
1
H
)
−
1
(
−
J
T
P
−
1
d
−
H
T
R
−
1
z
)
=
Q
(
−
J
T
P
−
1
d
−
H
T
R
−
1
z
)
=
(
I
−
K
H
)
(
J
T
P
−
1
J
)
−
1
(
−
J
T
P
−
1
d
)
−
K
R
R
−
1
z
=
−
K
z
−
(
I
−
K
H
)
J
−
1
d
δxk=(JTP−1J+HTR−1H)−1(−JTP−1d−HTR−1z)=Q(−JTP−1d−HTR−1z)=(I−KH)(JTP−1J)−1(−JTP−1d)−KRR−1z=−Kz−(I−KH)J−1d
更新当前迭代次数的状态
x
^
k
+
1
\hat x_{k+1}
x^k+1:
x
^
k
+
1
=
x
^
k
⊞
δ
x
k
\hat x_{k+1}=\hat x_k\boxplus\delta x_{k}
x^k+1=x^k⊞δxk
所有迭代完成后,更新状态:
x
‾
=
x
^
k
+
1
P
‾
=
(
I
−
K
H
)
P
\overline x=\hat x_{k+1}\\ \overline P=(I-KH)P
x=x^k+1P=(I−KH)P
Fast-LIO利用矩阵求逆定理推导了一种新的卡尔曼增益计算形式
K
=
(
P
−
1
+
H
T
R
−
1
H
)
−
1
H
T
R
−
1
K=(P^{-1}+H^TR^{-1}H)^{-1}H^TR^{-1}
K=(P−1+HTR−1H)−1HTR−1
该方法将矩阵求逆运算的维数限制为状态的维数,而不是观测点云的数量,减少求逆的计算耗时。以下是推导过程。
由矩阵求逆定理:
(
H
P
H
T
+
R
)
−
1
=
R
−
1
−
R
−
1
H
(
P
−
1
+
H
T
R
−
1
H
)
−
1
H
T
R
−
1
(HPH^T+R)^{-1}=R^{-1}-R^{-1}H(P^{-1}+H^TR^{-1}H)^{-1}H^TR^{-1}
(HPHT+R)−1=R−1−R−1H(P−1+HTR−1H)−1HTR−1
将上式代入到原始卡尔曼增益计算公式,得到:
K = P H T ( H P H T + R ) − 1 ⏟ 矩阵求逆定理 = P H T ( R − 1 − R − 1 H ( P − 1 + H T R − 1 H ) − 1 H T R − 1 ) = ( P H T − P H T R − 1 H ⏟ P ( P − 1 + H T R − 1 H ) − I ) ( P − 1 + H T R − 1 H ) − 1 H T ) R − 1 = ( P H T − P H T + ( P − 1 + H T R − 1 H ) − 1 H T ) R − 1 = ( P − 1 + H T R − 1 H ) − 1 H T R − 1 K=PHT矩阵求逆定理 (HPHT+R)−1=PHT(R−1−R−1H(P−1+HTR−1H)−1HTR−1)=(PHT−P(P−1+HTR−1H)−I) PHTR−1H(P−1+HTR−1H)−1HT)R−1=(PHT−PHT+(P−1+HTR−1H)−1HT)R−1=(P−1+HTR−1H)−1HTR−1
FAST-LIO: A Fast, Robust LiDAR-inertial Odometry Package by Tightly-Coupled Iterated Kalman Filter
LINS: A Lidar-Inertial State Estimator for Robust and Efficient Navigation
IEKF-based Visual-Inertial Odometry using Direct Photometric Feedback
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。