文章全名:SRVIO: Super Robust Visual Inertial Odometry for dynamic environments and challenging Loop-closure conditions
提出了一个基于“Vins-Mono”并结合了“DNN网络”的针对“动态场景”的“实时”SLAM系统。
文章的主要贡献:
1、最重要的贡献不是方法上的创新,而应该是给了一个好用的实时的完整的SLAM系统
2、每个部分都给了DNN网络的结合方法。Preprocessing结合了语义网络HRNet筛选特征点、自己训练的去IMU噪声网络处理IMU数据流;回环用了SuperPoints和SuperGlue。
SRVIO系统框架
主要分为预处理preprocessing、优化optimization和回环检测loop closure三部分。
A.预处理preprocessing
预处理的输入:照片流+IMU数据流
预处理的输出:
组成部分:视觉预处理+惯导预处理
视觉预处理
输入:照片流,输出:每帧的特征点矩阵和该帧的特征点质量权重(表示这个帧的好坏)
1、首先照片经过①,得到特征点位置和描述子
2、然后照片通过②经由HRNet处理,得到特征点属于moveable还是unmoveable
3、由于神经网络结果的语义信息的局限性,到☂这里用到一个三步的处理方法。
先用unmoveable的结果通过RANSAC计算位姿;(unmoveable结果给的位姿)
再用位姿通过Fundamental矩阵检验所有匹配的离群情况;(点的实际动、静情况)
最后对所有的inliner再RANSAC计算一次得到最终位姿;(取所有静态点再次计算位姿)
[
P
C
i
,
S
i
,
F
i
n
i
t
i
a
l
i
,
i
−
1
]
=
R
A
N
S
A
C
(
P
i
n
i
t
i
a
l
C
i
,
P
C
i
−
1
)
P
C
i
,
S
2
=
{
P
l
,
i
n
i
t
i
a
l
C
i
:
∣
P
l
,
i
n
i
t
i
a
l
C
i
.
F
i
n
i
t
i
a
l
i
,
i
−
1
.
P
l
C
i
−
1
∣
<
ϵ
}
[
P
C
i
,
F
a
c
c
u
r
a
t
e
i
,
i
−
1
]
=
R
A
N
S
A
C
(
P
C
i
,
2
,
P
C
i
−
1
)
\begin{aligned} &[P^{C_i, S_i}, F_{initial}^{i, i-1}] = RANSAC(P_{initial}^{C_i}, P^{C_i-1})\\ &P^{C_i, S_2} = \Big\{ P_{l, initial}^{C_i}: \Big|P_{l, initial}^{C_i}.F_{initial}^{i, i-1}.P_{l}^{C_i-1}\Big| < \epsilon\Big\}\\ &[P^{C_i}, F_{accurate}^{i, i-1}] = RANSAC(P^{C_i, _2}, P^{C_i-1}) \end{aligned}
[PCi,Si,Finitiali,i−1]=RANSAC(PinitialCi,PCi−1)PCi,S2={Pl,initialCi:
Pl,initialCi.Finitiali,i−1.PlCi−1
<ϵ}[PCi,Faccuratei,i−1]=RANSAC(PCi,2,PCi−1)
4、最后在④计算一个权重表示照片帧的质量,通过静态点占总匹配的比例计算,在优化阶段使用
Ψ
c
i
=
∣
P
C
i
∣
F
m
a
x
\Psi_{c_i} = \frac{|P^{C_i}|}{F_{max}}
Ψci=Fmax∣PCi∣
惯性预处理
输入:IMU数据流,输出:通过去噪声卷积神经网络DCNN的IMU数据,认为是没有噪声的(合理吗?凭什么)。共有两个卷积神经网络,一个是用于陀螺仪(角速度)去噪声,一个用于加速度去噪声
陀螺仪卷积网络:输入:从i-N到i-1的N个IMU数据序列,输出:经过修正的第i个imu角速度测量数据;
加速度卷积网络:输入:从i-N到i-1的N个IMU数据序列,输出:经过修正的第i个imu加速度测量数据;
网络结构:卷积和全连接两个部分
卷积部分用有标签的IMU数据训练用于预测误差,训练好固定住(使用到GELU策略(GELU activation)和余弦学习率(cosine schedulers))
全连接部分用带噪声的IMU数据训练,用于预测IMU数据质量
由于高频下IMU数据没有真实的值,则将网络给出的结果通过积分到有真实值的地方来定义训练误差:
δ
R
^
i
,
i
+
j
=
∑
k
=
i
i
+
j
−
1
e
x
p
(
w
k
^
)
δ
P
^
i
,
i
+
j
=
∫
∫
t
∈
[
i
,
i
+
j
]
e
x
p
(
w
t
^
)
a
t
^
d
t
2
L
j
ω
=
∑
i
ρ
(
l
o
g
(
δ
R
i
,
i
+
j
δ
R
^
i
,
i
+
j
T
)
)
L
j
a
=
∑
i
ρ
(
δ
P
i
,
i
+
j
−
δ
P
^
i
,
i
+
j
)
L
ω
=
L
16
ω
+
L
32
ω
L
a
=
L
16
a
=
L
32
a
\begin{aligned} & \delta{\hat{R}_{i, i+j}} = \sum_{k=i}^{i+j-1}exp(\hat{w_k}) \\ & \delta{\hat{P}_{i, i+j}} = \int\int_{t\in[i, i+j]} exp(\hat{w_{t}})\;\hat{a_{t}}\;dt^2 \\ & \mathcal{L}_{j}^{\omega} = \sum_{i}\rho \left(log\left(\delta R_{i, i+j} \delta \hat{R}_{i, i+j}^{T}\right)\right) \\ & \mathcal{L}_{j}^{a} = \sum_{i}\rho \left(\delta P_{i, i+j} - \delta \hat{P}_{i, i+j}\right) \\ & \mathcal{L}^{\omega} = \mathcal{L}_{16}^{\omega} + \mathcal{L}_{32}^{\omega} \\ & \mathcal{L}^{a} = \mathcal{L}_{16}^{a} = \mathcal{L}_{32}^{a} \end{aligned}
δR^i,i+j=k=i∑i+j−1exp(wk^)δP^i,i+j=∫∫t∈[i,i+j]exp(wt^)at^dt2Ljω=i∑ρ(log(δRi,i+jδR^i,i+jT))Lja=i∑ρ(δPi,i+j−δP^i,i+j)Lω=L16ω+L32ωLa=L16a=L32a
其中
δ
R
^
i
,
i
+
j
\delta{\hat{R}_{i, i+j}}
δR^i,i+j和
δ
P
^
i
,
i
+
j
\delta{\hat{P}_{i, i+j}}
δP^i,i+j表示真实的旋转和平移变换,网络给出的
δ
R
i
,
i
+
j
\delta{R_{i, i+j}}
δRi,i+j和
δ
P
i
,
i
+
j
\delta{P_{i, i+j}}
δPi,i+j与真实值作差并在一个时间跨度为j的窗口内求和,得到两个误差项
L
j
ω
\mathcal{L}_{j}^{\omega}
Ljω和
L
j
a
\mathcal{L}_{j}^{a}
Lja,16步和32步两种情况下的误差项求和得到最终的误差项。
1、经过①网络处理得到IMU去噪声序列
w
i
~
\tilde{w_i}
wi~和
a
i
~
\tilde{a_{i}}
ai~,用于计算后续的IMU数据权重的数据质量
ζ
i
ω
\zeta_{i}^{\omega}
ζiω和
ζ
i
a
\zeta_{i}^{a}
ζia
2、原始的IMU数据经过一个修正矩阵
C
^
(
.
)
\hat{C}_{(.)}
C^(.)后和
w
i
~
\tilde{w_i}
wi~以及
a
i
~
\tilde{a_{i}}
ai~相加得到矫正的角速度和加速度。PS:我猜测
C
^
(
.
)
\hat{C}_{(.)}
C^(.)是IMU坐标系转换到相机坐标系,网络输出的矫正序列是相对相机坐标系而言的。
C
^
(
.
)
=
S
(
.
)
^
M
(
.
)
^
ω
i
^
=
C
ω
^
w
i
I
M
U
+
w
i
~
a
i
^
=
C
a
^
a
i
I
M
U
+
a
i
~
ζ
i
=
ζ
i
ω
+
ζ
i
a
\begin{aligned} & \hat{C}_{(.)} = \hat{S_{(.)}} \hat{M_{(.)}} \\ & \hat{\omega_{i}} = \hat{C_{\omega}}w_{i}^{IMU} + \tilde{w_i} \\ & \hat{a_{i}} = \hat{C_{a}}a_{i}^{IMU}+\tilde{a_{i}}\\ & \zeta_{i} = \zeta_{i}^{\omega}+\zeta_{i}^{a} \end{aligned}
C^(.)=S(.)^M(.)^ωi^=Cω^wiIMU+wi~ai^=Ca^aiIMU+ai~ζi=ζiω+ζia
矫正后的数据在②进行预积分
3、最后在☂计算IMU数据权重
Ψ
b
i
=
∑
k
∈
M
l
,
j
ζ
k
m
\Psi_{b_i} = \frac{\sum_{k\in M_{l, j}} \zeta_k}{m}
Ψbi=m∑k∈Ml,jζk
B.优化Optimization
这部分就是在误差这里,用网络简化了IMU预积分过程+质量参数影响误差
IMU测量误差
IMU预积分
α
b
k
+
1
b
k
=
∫
∫
t
∈
[
t
k
,
t
k
+
1
]
R
t
b
k
(
a
^
t
)
d
t
2
β
b
k
+
1
b
k
=
∫
t
∈
[
t
k
,
t
k
+
1
]
R
t
b
k
(
a
^
t
)
d
t
γ
b
k
+
1
b
k
=
∫
t
∈
[
t
k
,
t
k
+
1
]
1
2
Ω
(
ω
^
)
γ
t
b
k
d
t
\begin{aligned} & \alpha_{b_{k+1}}^{b_k} = \int\int_{t\in [t_k, t_{k+1}]}R_{t}^{b_k}(\hat{a}_t)\ dt^{2} \\ & \beta_{b_{k+1}}^{b_k} = \int_{t\in [t_k, t_{k+1}]}R_t^{b_k}(\hat{a}_t)\ dt \\ & \gamma_{b_{k+1}}^{b_k} = \int_{t\in [t_k, t_{k+1}]}\frac{1}{2}\Omega(\hat{\omega})\gamma{_{t}^{b_k}}\ dt \end{aligned}
αbk+1bk=∫∫t∈[tk,tk+1]Rtbk(a^t) dt2βbk+1bk=∫t∈[tk,tk+1]Rtbk(a^t) dtγbk+1bk=∫t∈[tk,tk+1]21Ω(ω^)γtbk dt
其中
a
^
t
\hat{a}_t
a^t和
ω
^
\hat{\omega}
ω^是加速度和角速度,
Ω
\Omega
Ω表示一种矩阵变换。上式的第三行是四元数的积分计算,通过
Ω
\Omega
Ω将两个四元数运算转换成矩阵运算
Ω
(
ω
)
=
[
−
⌊
ω
⌋
×
ω
−
ω
T
0
]
−
⌊
ω
⌋
×
=
[
0
−
ω
z
ω
y
ω
z
0
−
ω
x
−
ω
y
ω
x
0
]
\begin{aligned} & \Omega(\omega) = \begin{bmatrix} -{\lfloor\omega \rfloor}_{\times} & \omega \\ -\omega^T & 0 \end{bmatrix} \\ & -{\lfloor\omega \rfloor}_{\times} = \begin{bmatrix} 0 & -\omega_z & \omega_y\\ \omega_z & 0 & -\omega_x\\ -\omega_y & \omega_x & 0 \end{bmatrix} \end{aligned}
Ω(ω)=[−⌊ω⌋×−ωTω0]−⌊ω⌋×=
0ωz−ωy−ωz0ωxωy−ωx0
此时我们得到IMU误差如下,基本表现就是“误差”=“两个时刻真实值表示的变换(减号左边部分)” - “IMU积分结果(减号右边部分)”:
r
B
(
z
^
b
k
+
1
b
k
,
χ
)
=
[
δ
α
b
k
+
1
b
k
δ
β
b
k
+
1
b
k
δ
θ
b
k
+
1
b
k
]
=
[
R
ω
b
k
(
p
b
k
+
1
ω
−
p
b
k
ω
+
1
2
g
ω
Δ
t
k
2
−
v
b
k
ω
)
−
α
^
b
k
+
1
k
R
ω
b
k
(
v
b
k
+
1
ω
+
g
ω
Δ
t
k
−
v
b
k
ω
)
−
β
^
b
k
+
1
b
k
2
[
q
b
k
ω
−
1
⊗
q
b
k
+
1
ω
⊗
(
γ
^
b
k
+
1
b
k
)
−
1
]
x
y
z
]
\begin{aligned} & \mathcal{r}_{\mathcal{B}}(\hat{z}_{b_{k+1}}^{b_k}, \chi) = \begin{bmatrix} \delta \alpha_{b_{k+1}}^{b_k} \\ \delta \beta_{b_{k+1}}^{b_k} \\ \delta \theta_{b_{k+1}}^{b_k} \end{bmatrix}\\ &=\begin{bmatrix} R_{\omega}^{b_k}(p_{b_{k+1}}^\omega - p_{b_k}^{\omega} + \frac{1}{2}g^{\omega}\Delta t_{k}^{2} - v_{b_k}^{\omega}) - \hat{\alpha}_{b_{k+1}}^{k} \\ R_{\omega}^{b_k}(v_{b_{k+1}}^{\omega} + g^{\omega}\Delta t_k - v_{b_k}^{\omega}) - \hat{\beta}_{b_{k+1}}^{b_k} \\ 2[q_{b_k}^{\omega -1}\otimes q_{b_{k+1}}^{\omega}\otimes(\hat{\gamma}_{b_{k+1}}^{b_k})^{-1}]_{xyz} \end{bmatrix} \end{aligned}
rB(z^bk+1bk,χ)=
δαbk+1bkδβbk+1bkδθbk+1bk
=
Rωbk(pbk+1ω−pbkω+21gωΔtk2−vbkω)−α^bk+1kRωbk(vbk+1ω+gωΔtk−vbkω)−β^bk+1bk2[qbkω−1⊗qbk+1ω⊗(γ^bk+1bk)−1]xyz
由于去噪声网络的存在,这里的积分结果应该极大地简化了
视觉测量误差
如下式给出
P
l
c
j
=
π
c
−
1
(
[
u
l
c
j
v
l
c
j
]
)
P
l
c
i
=
R
b
c
(
R
ω
b
j
(
R
b
i
ω
(
R
c
b
1
λ
l
π
c
−
1
(
[
u
l
c
i
v
l
c
i
]
)
+
p
c
b
)
+
p
b
i
ω
−
p
b
j
ω
)
−
p
c
b
)
r
c
(
z
^
l
c
j
,
χ
)
=
[
b
1
b
2
]
⋅
(
P
l
c
j
−
P
l
c
i
∣
∣
P
l
c
i
∣
∣
)
\begin{aligned} & \mathcal{P}_{l}^{c_j} = \pi_c^{-1}(\begin{bmatrix} u_l^{c_j} \\ v_l^{c_j}\end{bmatrix}) \\ & \mathcal{P}_{l}^{c_i} = R_b^c(R_\omega^{b_j}(R_{b_i}^{\omega}(R_c^b\frac{1}{\lambda_l}\pi_c^{-1}(\begin{bmatrix} u_l^{c_i} \\ v_l^{c_i}\end{bmatrix})+p_c^b)+p_{b_i}^\omega-p_{b_j}^\omega)-p_c^b) \\ & r_c(\hat{z}_l^{c_j}, \chi) = \begin{bmatrix} b_1 b_2\end{bmatrix} \cdot (\mathcal{P}_{l}^{c_j} - \frac{\mathcal{P}_{l}^{c_i}}{||\mathcal{P}_{l}^{c_i}||}) \end{aligned}
Plcj=πc−1([ulcjvlcj])Plci=Rbc(Rωbj(Rbiω(Rcbλl1πc−1([ulcivlci])+pcb)+pbiω−pbjω)−pcb)rc(z^lcj,χ)=[b1b2]⋅(Plcj−∣∣Plci∣∣Plci)
第一个式子将第j张图片的点反投影到归一化相机坐标系;
第二个式子将第i张图片的点反投影到相机坐标系(到
λ
l
\lambda_l
λl这),转换到IMU坐标系(到
R
c
b
R_c^b
Rcb这),转换到世界坐标系(到
R
b
i
ω
R_{b_i}^{\omega}
Rbiω这),转换到第j帧的IMU坐标系(到
R
ω
b
j
R_\omega^{b_j}
Rωbj这),转换到第j帧的相机坐标系(到
R
b
c
R_b^c
Rbc这)
第三个式子将在同一个世界坐标系下的两个坐标求差,
b
1
b_1
b1和
b
2
b_2
b2表示两个坐标所占的权重,作者说得高大上是投影到一个平面上,
b
1
b_1
b1和
b
2
b_2
b2是平面的基
第三个式子感觉有点问题,
P
l
c
j
\mathcal{P}_{l}^{c_j}
Plcj在归一化相机坐标系下,
P
l
c
i
\mathcal{P}_{l}^{c_i}
Plci在未归一化相机坐标系下,作者将
P
l
c
i
\mathcal{P}_{l}^{c_i}
Plci除自己的模应该是想让他们都在归一化后的坐标系下,这里的操作应该为除
P
l
c
i
\mathcal{P}_{l}^{c_i}
Plci的z坐标
结合误差
一个状态窗口内的数据有
χ
=
[
x
0
,
x
1
,
.
.
.
x
n
,
x
c
b
,
λ
1
,
.
.
.
,
λ
m
]
,
x
k
=
[
p
b
k
ω
,
v
b
k
ω
,
q
b
k
ω
]
,
∈
[
0
,
n
]
,
x
c
b
=
[
p
c
b
,
q
c
b
]
\begin{aligned} & \chi = [x_0, x_1, ... x_n, x_c^b, \lambda_1, ..., \lambda_m], \\ & x_k = [p_{b_k}^{\omega}, v_{b_k}^{\omega}, q_{b_k}^{\omega}], \in [0, n], \\ & x_c^b = [p_c^b, q_c^b] \end{aligned}
χ=[x0,x1,...xn,xcb,λ1,...,λm],xk=[pbkω,vbkω,qbkω],∈[0,n],xcb=[pcb,qcb]
x
k
x_k
xk表示IMU的状态:位置、速度、朝向;
x
c
b
x_c^b
xcb表示IMU和相机间的位姿变换;
λ
l
\lambda_l
λl表示第l个特征点在窗口内第一次被观测时的深度倒数
最终误差给出如下形式,误差=先验信息(不太懂怎么来的)+IMU误差(
Ψ
c
k
\Psi_{c_k}
Ψck修正)+相机误差(
Ψ
b
k
\Psi_{b_k}
Ψbk)修正:
R
=
∣
∣
r
p
−
H
p
χ
∣
∣
2
+
Ψ
c
k
∑
k
∈
B
∣
∣
r
B
(
z
^
b
k
+
1
b
k
,
χ
)
∣
∣
P
b
k
+
1
b
k
2
+
Ψ
b
k
∑
l
,
j
∈
C
ρ
(
∣
∣
r
C
(
z
^
l
C
j
,
χ
)
∣
∣
P
l
C
j
2
)
\mathcal{R} = ||r_p - H_p \chi||^2 + \Psi_{c_k}\sum_{k\in \mathcal{B}} || r_{\mathcal{B}}(\hat{z}_{b_{k+1}}^{b_k}, \chi)||_{P_{b_{k+1}}^{b_k}}^{2} + \Psi_{b_k}\sum_{l, j\in \mathcal{C}}\rho(||r_{\mathcal{C}}(\hat{z}_l^{\mathcal{C_j}}, \chi)||_{P_{l}^{\mathcal{C_j}}}^{2})
R=∣∣rp−Hpχ∣∣2+Ψckk∈B∑∣∣rB(z^bk+1bk,χ)∣∣Pbk+1bk2+Ψbkl,j∈C∑ρ(∣∣rC(z^lCj,χ)∣∣PlCj2)
C.回环检测Loop closure
其实没什么改变,就是把特征点换成了SuperPoint,把回环候选帧的特征点匹配换成了SuperGlue。先通过knn检测闭环,检测到之后用SuperGlue寻找特征点,并且没有用基础矩阵检查静止的会运动物体,因为他们在后续的时候会消失。
总结:
1、对动态语义的进一步处理
2、误差去噪声网络的应用,极大地简化了IMU融合
3、SuperGlue锦上添花