本文亮点
本文中作者提出了一种基于RGB-D相机的稠密视觉slam方法,可以同时最小化全体像素点的光测和深度误差。和稀疏,基于特征点的slam方法相比,可以取得更加准确的位姿估计。进一步,作者在文章中还针对关键帧选取和闭环检测提出了基于熵的相似度测量方法,通过g2o框架优化后,取得了明显小于同类方法的轨迹误差,并且在弱纹理和弱结构的情况下,依然可以获得良好的效果。
一、研究目标和贡献
论文首先指出通过选取关键帧进行特征匹配的方法会丢失部分重要的图像信息,因此,论文通过构建稠密的slam方法,希望完成下述三个目标:
1、更加充分的利用从传感器中获得的可用数据信息
2、可以实时运行
3、可以有效消除漂移并且通过全局图优化纠正累计误差
该论文的主要贡献在于:
1、一个快速的帧到帧的配准方法,从而优化强度和深度误差
2、一种基于熵的特征点挑选方法,可以显著降低漂移
3、一种同样基于熵尺度的的闭环检测验证方法
4、整合上述全部方法,提出一种通用的slam图解决器,进一步降低漂移
二、具体细节
1.稠密的视觉里程计
首先,记
t
t
t时的强度图为
I
t
I_{t}
It,深度图为
Z
t
Z_{t}
Zt,相机的刚体运动为
g
g
g。
图像连续性定理:记场景中的3D点坐标为
p
p
p,相机真实移动为
g
∗
g^{*}
g∗,
p
p
p在第一张图片以及第二张图片中对应的像素点分别为
x
1
x_{1}
x1和
x
2
x_{2}
x2,在场景稳定并且忽略噪声和光照影响的情况下,有
I
1
(
x
)
=
I
2
(
x
)
I_{1}(x)=I_{2}(x)
I1(x)=I2(x),即
x
1
x_{1}
x1和
x
2
x_{2}
x2像素点的强度相同。
假设强度图和深度图均满足图像连续性定理,然后有下述推导:
3D点坐标为
p
p
p可具体表示为
(
X
,
Y
,
Z
,
1
)
T
(X,Y,Z,1)^{T}
(X,Y,Z,1)T,像素点
x
x
x的坐标可表示为
(
x
,
y
)
T
(x,y)^T
(x,y)T,记深度测量
Z
=
Z
(
x
)
Z=Z(x)
Z=Z(x),定义反投影函数
π
−
1
\pi^{-1}
π−1为:
p
=
π
−
1
(
x
,
Z
)
=
(
x
−
o
x
f
x
Z
,
y
−
o
y
f
y
Z
,
Z
,
1
)
T
p=\pi^{-1}(x,Z)=(\dfrac{x-o_x}{f_x}Z,\dfrac{y-o_y}{f_y}Z,Z,1)^T
p=π−1(x,Z)=(fxx−oxZ,fyy−oyZ,Z,1)T
其中,
f
x
f_x
fx和
f
y
f_y
fy是焦距,
o
x
o_x
ox和
o
y
o_y
oy是标准针孔相机模型下相机中心点的坐标。
空间3D点的可以用投影函数
π
\pi
π定义为:
x
=
π
(
p
)
=
(
X
f
x
Z
+
o
x
,
Y
f
y
Z
+
o
y
)
T
x=\pi(p)=(\dfrac{Xf_x}{Z}+o_x,\dfrac{Yf_y}{Z}+o_y)^T
x=π(p)=(ZXfx+ox,ZYfy+oy)T
相机的刚体运动
g
g
g可以用变换矩阵
T
T
T来表示:
T
4
×
4
=
[
R
3
×
3
t
3
×
1
0
1
]
T_{4×4}=\left[ \begin{matrix} R_{3×3} & t_{3×1} \\ 0 & 1 \\ \end{matrix} \right]
T4×4=[R3×30t3×11]
T
4
×
4
T_{4×4}
T4×4中包含了一个旋转矩阵和一个平移向量,
p
p
p点关于
g
g
g的运动变换可以表示为:
g
(
p
)
=
p
′
=
T
p
g(p)=p'=Tp
g(p)=p′=Tp
注意到
T
T
T中包含了12个参数,而
g
g
g中只有六个自由度,根据李代数
s
e
(
3
)
se(3)
se(3)和李群
S
E
(
3
)
SE(3)
SE(3),定义坐标
ξ
\xi
ξ,
ξ
\xi
ξ是六维向量,
T
T
T和
ξ
\xi
ξ间存在如下转换关系:
T
=
e
x
p
(
ξ
^
)
T=exp(\hat{\xi})
T=exp(ξ^)
继续定义函数
τ
\tau
τ,用来计算第一张图中的像素点
x
x
x对应到第二张图中的像素点坐标
x
′
x'
x′:
x
′
=
τ
(
x
,
X
)
=
π
(
T
π
−
1
(
x
,
Z
1
(
x
)
)
)
.
x'=\tau(x,X)=\pi(T\pi^{-1}(x,Z_1(x))).
x′=τ(x,X)=π(Tπ−1(x,Z1(x))).
有了第一张图和第二张图对应的像素坐标,进而可以构造光度的误差函数
r
I
r_I
rI:
r
I
=
I
2
(
τ
(
x
,
T
)
)
−
I
1
(
x
)
r_I=I_2(\tau(x,T))-I_1(x)
rI=I2(τ(x,T))−I1(x)
类似的,深度的误差函数可以定义为:
r
Z
=
Z
2
(
τ
(
x
,
T
)
)
−
[
T
π
−
1
(
x
,
Z
1
(
x
)
)
]
Z
r_Z=Z_2(\tau(x,T))-[T\pi^{-1}(x,Z_1(x))]_Z
rZ=Z2(τ(x,T))−[Tπ−1(x,Z1(x))]Z
这里,
[
⋅
]
Z
[·]_Z
[⋅]Z返回三维点的
Z
Z
Z坐标。
基于
ξ
\xi
ξ和
r
I
r_I
rI在考虑像素级误差的情况下,通过最大似然估计来得出相机的真实运动
ξ
∗
\xi^*
ξ∗:
ξ
∗
=
a
r
g
m
a
x
ξ
p
(
ξ
∣
r
I
)
\xi^*=arg\underset{\xi}{\,max}\,p(\xi|r_I)
ξ∗=argξmaxp(ξ∣rI)
在采用贝叶斯法则之后,假设所有的误差都是独立的并且一致分布的,运用负对数可能性,可以得到:
ξ
∗
=
a
r
g
m
i
n
ξ
−
∑
i
n
l
o
g
(
p
(
r
I
,
i
∣
ξ
)
)
−
l
o
g
(
p
(
ξ
)
)
\xi^*=arg\underset{\xi}{\,min}-\sum_{i}^nlog(p(r_{I,i}|\xi))-log(p(\xi))
ξ∗=argξmin−i∑nlog(p(rI,i∣ξ))−log(p(ξ))
作者发现可以用
t
t
t分布很好的拟合
p
(
r
I
,
i
∣
ξ
)
p(r_{I,i}|\xi)
p(rI,i∣ξ),进一步的,
ξ
∗
\xi^*
ξ∗可以写成:
ξ
∗
=
a
r
g
m
i
n
ξ
∑
i
n
w
i
r
I
,
i
2
\xi^*=arg\underset{\xi}{\,min}\sum_{i}^nw_ir_{I,i}^2
ξ∗=argξmini∑nwirI,i2
为了同时优化光度和深度误差,定义
r
\pmb r
rrr为一个含有二个变量元素的变量,
r
=
(
r
I
,
r
Z
)
T
\pmb r=(r_I,r_Z)^T
rrr=(rI,rZ)T,并且
r
\pmb r
rrr满足
t
t
t分布
p
t
(
0
,
Σ
,
v
)
p_t(\pmb 0,\pmb\Sigma,v)
pt(000,ΣΣΣ,v),然后
ξ
∗
\xi^*
ξ∗可以写成:
ξ
∗
=
a
r
g
m
i
n
ξ
∑
i
n
w
i
r
i
T
Σ
−
1
r
i
\xi^*=arg\underset{\xi}{\,min}\sum_{i}^nw_i\pmb r_i^T\pmb \Sigma ^{-1} \pmb r_i
ξ∗=argξmini∑nwirrriTΣΣΣ−1rrri
其中,
w
i
w_i
wi表示为
v
+
1
v
+
r
i
T
Σ
−
1
r
i
\dfrac{v+1}{v+\pmb r_i^T\pmb \Sigma ^{-1} \pmb r_i}
v+rrriTΣΣΣ−1rrriv+1
通过此误差函数,可以同时优化光度和深度误差,同时
Σ
\pmb \Sigma
ΣΣΣ使得误差项可以实现自适应。
然后运行非线性优化方法进行优化:
∑
i
n
w
i
J
i
T
Σ
−
1
J
i
Δ
ξ
=
−
∑
i
n
w
i
J
i
T
Σ
−
1
r
i
\sum_{i}^nw_i\pmb J_i^T\pmb \Sigma ^{-1} \pmb J_i\Delta \pmb \xi=-\sum_{i}^nw_i\pmb J_i^T\pmb \Sigma ^{-1} \pmb r_i
i∑nwiJJJiTΣΣΣ−1JJJiΔξξξ=−i∑nwiJJJiTΣΣΣ−1rrri
其中,
J
i
\pmb J_i
JJJi是2×6的雅可比矩阵(
r
i
\pmb r_i
rrri对
ξ
\pmb \xi
ξξξ求偏导,
r
i
\pmb r_i
rrri包含光度和深度两个维度,
ξ
\pmb \xi
ξξξ为六维向量,三个维度旋转,三个维度平移),
n
n
n为像素点数量。
2.基于关键帧的视觉slam
关键真的选择基于微分熵,满足正态分布
N
(
μ
,
Σ
)
N(\mu,\Sigma)
N(μ,Σ)的m维点
x
\pmb x
xxx的微分熵
H
H
H定义为:
H
(
x
)
=
0.5
m
(
1
+
ln
(
2
π
)
)
+
0.5
ln
(
∣
Σ
∣
)
H(\pmb x)=0.5m(1+ \ln (2\pi))+0.5\ln (|\pmb {\Sigma}|)
H(xxx)=0.5m(1+ln(2π))+0.5ln(∣ΣΣΣ∣)
ξ
k
:
k
+
j
\xi_{k:k+j}
ξk:k+j表示第
k
k
k帧到第
k
+
j
k+j
k+j的运动,
ξ
k
:
k
+
1
\xi_{k:k+1}
ξk:k+1表示第
k
k
k帧到第
k
+
1
k+1
k+1的运动,定义熵比例
α
\alpha
α:
α
=
H
(
ξ
k
:
k
+
j
)
H
(
ξ
k
:
k
+
1
)
\alpha=\frac{H(\pmb \xi_{k:k+j})}{H(\pmb \xi_{k:k+1})}
α=H(ξξξk:k+1)H(ξξξk:k+j)
当
α
\alpha
α小于所设置阈值时,设置新的关键帧。
回环检测采取最近邻域搜索的方法,最后采用g2o进行全局优化。