因子图结构
VIO在纯视觉的基础上添加了IMU约束,因子图如下:
状态变量
VIO中,待估计的状态变量为
θ
i
=
(
R
W
B
i
,
W
p
B
i
,
W
v
B
i
,
b
i
g
,
b
i
a
)
\theta^i=(R_{WB}^i,_Wp_B^i,_Wv_B^i,b_i^g,b_i^a)
θi=(RWBi,WpBi,WvBi,big,bia)*注意不是
T
W
C
T_{WC}
TWC
观测量为
z
i
l
∈
C
i
z_{il}\in C_i
zil∈Ci,表示第i帧看到的第j个路标点,输入
(
ω
i
~
,
a
i
~
)
∈
I
i
j
(\tilde{\omega_i},\tilde{a_i})\in I_{ij}
(ωi~,ai~)∈Iij,第i、j准帧间惯导信息,其中
(
i
,
j
)
∈
K
k
(i,j)\in K_k
(i,j)∈Kk,为关键帧的集合。
误差优化函数
θ
∗
=
arg
min
θ
∑
k
[
E
p
r
o
j
(
k
,
j
)
+
E
I
M
U
(
i
,
j
)
]
,
k
∈
K
k
\theta^*=\arg\min_\theta \sum_k[E_{proj}(k,j)+E_{IMU}(i,j)],k\in K_k
θ∗=argθmink∑[Eproj(k,j)+EIMU(i,j)],k∈Kk包括重投影误差项及IMU误差项。
重投影误差项:
E
p
r
o
j
(
k
,
j
)
=
ρ
(
(
x
k
−
π
(
X
c
k
)
)
T
Σ
k
(
x
k
−
π
(
X
c
k
)
)
)
π
(
X
c
)
=
[
f
u
X
c
Z
c
+
c
u
f
v
Y
c
Z
c
+
c
v
]
,
X
c
=
[
X
c
Y
c
Z
c
]
T
X
c
=
T
C
W
P
W
=
(
T
W
B
T
B
C
)
T
P
W
=
T
C
B
T
W
B
T
P
W
,
T
W
B
T
=
[
R
W
B
T
−
R
W
B
T
W
p
B
0
T
1
]
X
c
k
=
R
C
B
R
W
B
T
(
X
W
k
−
W
p
B
j
)
+
c
p
B
E_{proj}(k,j)=\rho((x^k-\pi(X_c^k))^T\Sigma_k(x^k-\pi(X_c^k))) \\ \pi(X_c)=\left[ \begin{matrix} f_u \frac{X_c}{Z_c}+c_u \\ f_v \frac{Y_c}{Z_c}+c_v \end{matrix} \right],X_c=\left[ \begin{matrix}X_c&Y_c&Z_c \end{matrix} \right]^T \\ Xc=T_{CW}P_W=(T_{WB}T_{BC})^TP_W=T_{CB}T_{WB}^TP_W,T_{WB}^T=\left[ \begin{matrix} R_{WB}^T &-R_{WB}^T {_Wp_B} \\ 0^T&1 \end{matrix} \right] \\ X_c^k=R_{CB}R_{WB}^T(X_W^k-_Wp_B^j)+_cp_B
Eproj(k,j)=ρ((xk−π(Xck))TΣk(xk−π(Xck)))π(Xc)=[fuZcXc+cufvZcYc+cv],Xc=[XcYcZc]TXc=TCWPW=(TWBTBC)TPW=TCBTWBTPW,TWBT=[RWBT0T−RWBTWpB1]Xck=RCBRWBT(XWk−WpBj)+cpBIMU误差
E
I
M
U
(
i
,
j
)
=
ρ
(
[
e
R
e
v
e
p
]
T
Σ
I
[
e
R
e
v
e
p
]
)
+
ρ
(
e
b
T
Σ
R
e
b
)
e
R
=
L
o
g
(
Δ
R
i
j
E
x
p
(
J
Δ
R
g
δ
b
i
g
)
R
B
W
i
R
W
B
j
)
e
v
=
R
B
W
i
(
W
v
B
j
−
W
v
B
i
−
g
W
Δ
t
i
j
)
−
(
Δ
v
i
j
+
J
Δ
v
g
δ
b
i
g
+
J
Δ
v
a
δ
b
i
a
)
e
p
=
R
B
W
i
(
W
p
B
j
−
W
p
B
i
−
W
v
B
i
Δ
t
i
j
−
1
2
g
W
Δ
t
i
j
2
)
−
(
Δ
p
i
j
+
J
Δ
p
g
δ
b
i
g
+
J
Δ
p
a
δ
b
i
a
)
e
b
=
[
b
j
g
−
b
i
g
b
j
a
−
b
i
a
]
E_{IMU}(i,j)=\rho(\left[\begin{matrix}e_R&e_v&e_p\end{matrix}\right]^T\Sigma_I\left[\begin{matrix}e_R&e_v&e_p\end{matrix} \right])+\rho(e_b^T\Sigma_Re_b) \\ e_R=Log(\Delta R_{ij}Exp(J_{\Delta R}^g\delta b_i^g)R_{BW}^iR_{WB}^j) \\ e_v=R_{BW}^i(_Wv_B^j-_Wv_B^i-g_W\Delta t_{ij})-(\Delta v_{ij}+J_{\Delta v}^g\delta b_i^g+J_{\Delta v}^a\delta b_i^a) \\ e_p=R_{BW}^i(_Wp_B^j-_Wp_B^i-_Wv_B^i\Delta t_{ij}-\frac12g_W\Delta t_{ij}^2)-(\Delta p_{ij}+J_{\Delta p}^g\delta b_i^g+J_{\Delta p}^a\delta b_i^a) \\ e_b=\left[ \begin{matrix}b_j^g-b_i^g \\ b_j^a-b_i^a \end{matrix} \right]
EIMU(i,j)=ρ([eRevep]TΣI[eRevep])+ρ(ebTΣReb)eR=Log(ΔRijExp(JΔRgδbig)RBWiRWBj)ev=RBWi(WvBj−WvBi−gWΔtij)−(Δvij+JΔvgδbig+JΔvaδbia)ep=RBWi(WpBj−WpBi−WvBiΔtij−21gWΔtij2)−(Δpij+JΔpgδbig+JΔpaδbia)eb=[bjg−bigbja−bia]
图优化模型节点及边
在ORB-SLAM2中,图优化存在于三个线程:Tracking、Local Mapping、Loop Closing。分别处理局部共视区域中的非线性优化,地图更新时的优化、位姿图优化检测闭环。
Tracking
- 地图更新后第j个帧到达时(非关键帧),将其与最近的一个关键帧i建立联系,第i帧作为先验且固定,优化重投影及IMU误差估计第j帧状态
- 优化结束,将得到的第j帧状态变量及Hessian矩阵传递至下次优化作为先验
- 第j+1帧到达,使用第j帧的优化结果作为第j帧的初值和此次优化先验,联合优化第j、j+1帧,此时待优化的状态变量为
θ
=
(
R
W
B
j
,
W
p
B
j
,
W
v
B
j
,
b
j
g
,
b
j
a
,
R
W
B
j
+
1
,
W
p
B
j
+
1
,
W
v
B
j
+
1
,
b
j
+
1
g
,
b
j
+
1
a
)
\theta=(R_{WB}^j,_Wp_B^j,_Wv_B^j,b_j^g,b_j^a,R_{WB}^{j+1},_Wp_B^{j+1},_Wv_B^{j+1},b_{j+1}^g,b_{j+1}^a)
θ=(RWBj,WpBj,WvBj,bjg,bja,RWBj+1,WpBj+1,WvBj+1,bj+1g,bj+1a),误差函数为
θ
∗
=
arg
min
θ
∑
k
[
E
p
r
o
j
(
k
,
j
+
1
)
+
E
I
M
U
(
j
,
j
+
1
)
+
E
p
r
i
o
r
(
j
)
]
\theta^*=\arg\min_\theta \sum_k[E_{proj}(k,j+1)+E_{IMU}(j,j+1)+E_{prior}(j)]
θ∗=argminθ∑k[Eproj(k,j+1)+EIMU(j,j+1)+Eprior(j)],增加了先验误差项.
E
p
r
i
o
r
(
j
)
=
ρ
(
[
e
R
e
v
e
p
e
b
]
T
Σ
p
[
e
R
e
v
e
p
e
b
]
)
e
R
=
L
o
g
(
R
ˉ
W
B
j
R
W
B
j
)
,
e
v
=
W
v
ˉ
B
j
−
W
v
B
j
,
e
p
=
W
p
ˉ
B
j
−
W
p
B
j
,
e
b
=
b
ˉ
j
−
b
j
E_{prior}(j)=\rho([e_Re_ve_pe_b]^T\Sigma_p[e_Re_ve_pe_b])\\e_R=Log(\bar{R}_{WB}^j{R}_{WB}^j), \ e_v=_W\bar{v}^{j}_{B}-_Wv^{j}_{B}, \ e_p=_W\bar{p}^{j}_{B}-_Wp^j_{B}, \ e_b=\bar{b}_j-b_j
Eprior(j)=ρ([eRevepeb]TΣp[eRevepeb])eR=Log(RˉWBjRWBj), ev=WvˉBj−WvBj, ep=WpˉBj−WpBj, eb=bˉj−bj带横线的为先验。
- 联合优化结束后,边缘化掉第j帧,重复步骤2、3,直到地图有更新(出现新的关键帧),重新执行1开始
该过程对应的图模型
一、LocalBAPRVIDP对应Tracking中的步骤一:
节点:
- 外点:vTcb 类型:VertexNavStatePR;ID:ExtrinsicVertexId = KeyFrame::nNextId*3 + MapPoint::nNextId + 1(每一个关键帧三个节点,每一个路标点一个节点,一个外部节点);固定不优化
- LocalKeyFrame帧节点pKF0:
1)PR节点(位姿)vNSPR 类型:VertexNavStatePR;
2)V节点(速度)vNSV 类型:VertexNavStateV
3)Bias节点 vNSBias 类型:VertexNavStateBias - FixedCameras 节点(固定)pKF1:
1)PR节点(位姿)vNSPR 类型:VertexNavStatePR;对于常规的关键帧,只添加该节点。
2)对于划窗前最近的关键帧,添加V和Bias节点
V节点(速度)vNSV 类型:VertexNavStateV
Bias节点 vNSBias 类型:VertexNavStateBias - MapPoint节点 vPoint:类型:VertexIDP
边:
- 名称:epvr:连接PR0, PR1, V0, V1, B0
类型:EdgeNavStatePRV - 名称:ebias:连接B0,B1
类型:EdgeNavStateBias - 名称: e:连接vPoint(idp),refPR,curPR,TcbPR
类型:EdgePRIDP
图模型:
二、GlobalBundleAdjustmentNavStatePRV
节点:
- PR节点(位姿)vNSPR 类型:VertexNavStatePR;
- V节点(速度)vNSV 类型:VertexNavStateV
- Bias节点 vNSBias 类型:VertexNavStateBias
- MapPoint节点 vPoint 类型:VertexSBAPointXYZ
边:
- 名称: epvr:连接PR0, PR1, V0, V1, B0
类型:EdgeNavStatePRV - 名称: ebias:连接B0,B1
类型:EdgeNavStateBias - 名称: e:连接vPoint,vPR
类型:EdgeNavStatePRPointXYZ
图模型:
三、LocalBundleAdjustmentNavStatePRV同上
四、GlobalBundleAdjustmentNavState
节点
- PVR节点 vNSPVR:类型:VertexNavStatePVR
- Bias节点 vBias: 类型:VertexNavStateBias
- MapPoint节点 vPoint :类型:VertexSBAPointXYZ
边
- 名称:epvr:连接PVR0,PVR1,B0
类型:EdgeNavStatePVR - 名称: ebias:连接B0,B1
类型:EdgeNavStateBias - 名称:e:连接vPoint,vNSPVR
类型:EdgeNavStatePVRPointXYZ
图模型
五、PoseOptimization对应Tracking中的步骤二、三:
节点
- PVR节点 vNSPVR/ vNSFPVRlast:类型:VertexNavStatePVR
- Bias节点 vNSFBias/ vNSFBiaslast: 类型:VertexNavStateBias
边
- 名称:eNSPrior:连接vNSFPVRlast,vNSFBiaslast先验误差
类型:EdgeNavStatePriorPVRBias - 名称:eNSPVR:连接vNSFPVRlast,vNSPVR,vNSFBiaslast IMU误差
类型:EdgeNavStatePVR - 名称:eNSBias:连接vNSFBiaslast,vNSFBias
类型:EdgeNavStateBias - 名称: e:连接vNSFPVRlast;连接vNSFPVR
类型:EdgeNavStatePVRPointXYZOnlyPose
图模型
六、PoseOptimization
去掉了eNSPrior和只连接vPVRLast的边e
七、LocalBundleAdjustmentNavState同上相同?
八、OptimizeInitialGyroBias
该优化函数用于陀螺仪偏置初始化
节点
- GyrBias节点:vBiasg:类型VertexGyrBias
边
- 名称:eBiasg:连接vBiasg陀螺仪偏置一元边
类型:EdgeGyrBias
九、LocalBundleAdjustment
节点
- 位姿节点:vSE3:类型VertexSE3Expmap
- MapPoint节点: vPoint:类型VertexSBAPointXYZ
边
- 名称:e:连接vSE3,vPoint
类型:EdgeStereoSE3ProjectXYZ
图模型
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)