基于surfel的
使用稀疏方法追踪
全局一致的模型
动态处理策略:
通过建立不稳定的surfel,如果一定时间内被观测/融合次数不达标则作为离群值删除。
系统总览
我们的系统融合深度和强度(灰度)图像,到一个由surfels组成的全局一致的地图。其中使用Localization System(ORB-SLAM2)做定位、闭环优化、生成位姿图(pose graph)。系统的关键是1基于超像素的surfel,2基于位姿图的surfel融合,3在定位系统完成闭环优化后,对地图进行快速形变以满足全局一致。
记号
每一个surfel
S
=
[
S
p
,
S
n
,
S
c
,
S
w
,
S
r
,
S
t
,
S
i
]
T
S=\left[S_{\mathbf{p}}, S_{\mathbf{n}}, S_{c}, {S}_{w}, S_{r}, S_{t}, S_{i}\right]^{T}
S=[Sp,Sn,Sc,Sw,Sr,St,Si]T包含属性:
S
p
∈
R
3
S_{\mathbf{p}} \in \mathbb{R}^{3}
Sp∈R3 位置
S
c
∈
R
S_{c} \in \mathbb{R}
Sc∈R强度(颜色)
S
w
∈
R
+
S_{w} \in \mathbb{R}^{+}
Sw∈R+ 权
S
r
∈
R
+
S_{r} \in \mathbb{R}^{+}
Sr∈R+半径
S
t
∈
N
S_{t} \in \mathbb{N}
St∈N更新次数。
S
i
∈
N
S_{i} \in \mathbb{N}
Si∈N关联的关键帧索引
系统的输入包括
强度图像(灰度图)
深度图像
相机的运动估计和位姿图(pose graph) (来自与ORBSLAM2)
定位系统和位姿图
使用了ORBSLAM用于相机跟踪和闭环优化。
对于每个输入帧(当前帧),SLAM系统会输出相机位姿估计
T
w
,
i
∈
S
E
(
3
)
\mathbf{T}_{w, i} \in \mathbb{S} \mathbb{E}(\mathbf{3})
Tw,i∈SE(3),并给出当前帧的参考关键帧
F
r
e
f
F_{ref}
Fref(沿用了ORBSLAM2中的概念,是与当前帧共视程度最高的关键帧)。
位姿图,即ORBSLAM2中的共视图,顶点是关键帧,边是关键帧共享的特征点数量。
快速地图变形
如果SLAM系统中的位姿图进行了更新,那么我们也会变形所有的surfel(位姿和法向)以保证全局一致,在进行当前帧的surfel初始化和融合之前。
我们以surfel的参考帧作为依据进行变形。对每一个surfel
S
S
S,其参考帧为
F
F
F,我们使用变换
T
w
,
F
^
T
w
,
F
−
1
\mathbf{T}_{w, \hat{F}} \mathbf{T}_{w, F}^{-1}
Tw,F^Tw,F−1来对
S
S
S的法向和位姿进行处理,其中,
T
w
,
F
^
\mathbf{T}_{w, \hat{F}}
Tw,F^和
T
w
,
F
−
1
\mathbf{T}_{w, F}^{-1}
Tw,F−1分别为关键帧
F
F
F优化前后的位姿。
超像素提取
首先通过初始化聚类中心,然后在分配步骤和更新步骤之间交替,根据像素的强度,深度和空间位置对其进行聚类。
这种超像素分割适用于存在空缺深度的图像。
通过在图像上建立网格,初始化簇中心
C
i
=
[
x
i
,
y
i
,
d
i
,
c
i
,
r
i
]
T
C_{i}=\left[x_{i}, y_{i}, d_{i}, c_{i}, r_{i}\right]^{T}
Ci=[xi,yi,di,ci,ri]T。
x
i
,
y
i
x_{i}, y_{i}
xi,yi是该簇像素的平均位置,初始化为位置中心(网格中心)。
d
i
d_{i}
di是平均深度,初始化为[xi,yi]像素的深度,或者为NaN。
c
i
c_{i}
ci是平均强度值,初始化为[xi,yi]像素的强度。
r
i
r_{i}
ri超像素半径(定义为簇内点的最大距离)。
分配
我们定义像素
u
=
{
u
x
,
u
y
,
u
d
,
u
i
}
u=\{u_x, u_y,u_d,u_i\}
u={ux,uy,ud,ui}和一个候选簇中心
C
i
=
{
x
i
,
y
i
,
d
i
,
c
i
}
C_i=\{x_i,y_i,d_i,c_i\}
Ci={xi,yi,di,ci}之间的距离
D
=
(
x
i
−
u
x
)
2
+
(
y
i
−
u
y
)
2
N
s
2
+
(
c
i
−
u
i
)
2
N
c
2
D
d
=
D
+
(
1
/
d
i
−
1
/
u
d
)
2
N
d
2
\begin{array}{c} D=\frac{\left(x_{i}-\mathbf{u}_{x}\right)^{2}+\left(y_{i}-\mathbf{u}_{y}\right)^{2}}{N_{s}^{2}}+\frac{\left(c_{i}-\mathbf{u}_{i}\right)^{2}}{N_{c}^{2}} \\ D_{d}=D+\frac{\left(1 / d_{i}-1 / \mathbf{u}_{d}\right)^{2}}{N_{d}^{2}} \end{array}
D=Ns2(xi−ux)2+(yi−uy)2+Nc2(ci−ui)2Dd=D+Nd2(1/di−1/ud)2
D
D
D和
D
d
D_d
Dd分别是在当前像素无有效深度和有有效深度值时的距离值。
N
s
2
,
N
c
2
,
N
d
2
N_{s}^{2},N_{c}^{2},N_{d}^{2}
Ns2,Nc2,Nd2是为在求和之前标准化距离、强度和深度。
遍历图像的每个像素,每个像素寻访周围四个候选聚类中心,如果目标像素和候选簇中心具有有效的深度值,则基于
D
d
D_d
Dd进行比较并分配;否则采用
D
D
D。
更新
一旦所有像素得到分配,更新簇中心。
x
i
,
y
i
,
c
i
x_i,y_i,c_i
xi,yi,ci由属于该簇的所有像素均值获得。而深度
d
i
d_i
di可以通过最小化一个Huber误差获得:
E
d
=
∑
u
L
δ
(
u
d
−
d
i
)
E_{d}=\sum_{\mathbf{u}} L_{\delta}\left(\mathbf{u}_{d}-d_{i}\right)
Ed=u∑Lδ(ud−di)
u
u
u是属于该簇的像素,且拥有有效深度,
u
d
u_d
ud是其深度。
可以使用高斯牛顿迭代求解簇深度
d
i
d_i
di。
Surfel 初始化
对于一个拥有足够多像素的簇
C
i
=
{
x
i
,
y
i
,
d
i
,
c
i
}
C_i=\{x_i,y_i,d_i,c_i\}
Ci={xi,yi,di,ci},我们初始化surfel
S
=
[
S
p
,
S
n
,
S
c
,
S
w
,
S
r
,
S
t
,
S
i
]
T
S=\left[S_{\mathbf{p}}, S_{\mathbf{n}}, S_{c}, {S}_{w}, S_{r}, S_{t}, S_{i}\right]^{T}
S=[Sp,Sn,Sc,Sw,Sr,St,Si]T
S
c
S_c
Sc强度初始化为簇的平均强度
c
i
c_i
ci
S
i
S_i
Si是当前帧(当前图像)在ORB-SLAM2中跟踪线程获得的参考关键帧的索引。
S
t
S_t
St更新次数为0(代码里面为1)
S
n
S_n
Sn法向首先初始化为所有像素的平均的法向,然后再最小化下式获得最终法向:
E
S
=
∑
u
L
δ
(
S
n
⋅
(
p
u
−
p
‾
)
+
b
)
E_{S}=\sum_{\mathbf{u}} L_{\delta}\left(S_{\mathbf{n}} \cdot\left(\mathbf{p}_{\mathbf{u}}-\overline{\mathbf{p}}\right)+b\right)
ES=u∑Lδ(Sn⋅(pu−p)+b)
其中
p
u
\mathbf{p_u}
pu是像素
u
u
u在三维空间的投影,
p
‾
\overline{\mathbf{p}}
p是3D点的平均位置。
S
p
=
π
−
1
[
x
i
,
y
i
]
S_p=\pi^{-1}[x_i,y_i]
Sp=π−1[xi,yi]位置,满足以下方程:
S
n
⋅
(
S
p
−
p
‾
)
+
b
=
0
S_{\mathbf{n}} \cdot\left(S_{\mathbf{p}}-\overline{\mathbf{p}}\right)+b=0
Sn⋅(Sp−p)+b=0
可以由下式解得:
S
p
=
S
n
⋅
p
‾
−
b
S
n
⋅
(
K
−
1
[
x
i
,
y
i
,
1
]
T
)
K
−
1
[
x
i
,
y
i
,
1
]
T
S_{\mathbf{p}}=\frac{S_{\mathbf{n}} \cdot \overline{\mathbf{p}}-b}{S_{\mathbf{n}} \cdot\left(K^{-1}\left[x_{i}, y_{i}, 1\right]^{T}\right)} K^{-1}\left[x_{i}, y_{i}, 1\right]^{T}
Sp=Sn⋅(K−1[xi,yi,1]T)Sn⋅p−bK−1[xi,yi,1]T
其中,
K
K
K是相机内参。
S
r
S_r
Sr半径,需要能够覆盖超像素:
S
r
=
S
p
(
z
)
⋅
r
i
⋅
∥
K
−
1
⋅
[
x
i
,
y
i
,
1
]
T
∥
f
⋅
S
n
⋅
(
K
−
1
⋅
[
x
i
,
y
i
,
1
]
T
)
S_{r}=\frac{S_{\mathbf{p}}(z) \cdot r_{i} \cdot\left\|K^{-1} \cdot\left[x_{i}, y_{i}, 1\right]^{T}\right\|}{f \cdot S_{\mathbf{n}} \cdot\left(K^{-1} \cdot\left[x_{i}, y_{i}, 1\right]^{T}\right)}
Sr=f⋅Sn⋅(K−1⋅[xi,yi,1]T)Sp(z)⋅ri⋅∥∥∥K−1⋅[xi,yi,1]T∥∥∥
S
p
(
z
)
S_p(z)
Sp(z)是surfel的深度,
f
f
f是相机的focal length 焦距。
S
w
S_w
Sw权与surfel的深度有关:
S
w
=
b
2
f
2
S
p
(
z
)
4
σ
2
S_{w}=\frac{b^{2} f^{2}}{S_{\mathbf{p}}(z)^{4} \sigma^{2}}
Sw=Sp(z)4σ2b2f2
其中
σ
2
\sigma^2
σ2是variane of disparity estimation ,视差估计的方差。
局部地图提取
重建一个大规模的环境地图需要百万量级的surfel。但是,每次进行surfel融合时,只需要根据位姿图提取一小部分的surfels即可。
我们基于假设:the keyframes with the number of minimum edges to the current keyframe
F
r
e
f
F_{ref}
Fref below
G
δ
G_\delta
Gδ are locally consistent.我们提取这些keyframe关联的surfel作为lcoal map。局部一致的keyframes可以在位姿图上通过广度优先搜索获得。
Surfel融合
这一步,融合局部地图local map和通过当前图像新建的surfels。
我们将世界坐标系下的localmap中的surfel变换到当前相机坐标系下,并投影到像素平面上,获得一个像素位置
u
=
π
(
S
p
l
)
\mathbf{u}=\pi\left(S_{\mathbf{p}}^{l}\right)
u=π(Spl)。
因为任一一个新建surfel都由图像中的一个超像素创建,如果某超像素创建了surfel
S
n
S^n
Sn,且包含像素
u
u
u,那么将建立
S
n
S^n
Sn和
S
l
S^{l}
Sl的对应关系。
通过
∣
S
p
n
(
z
)
−
S
p
l
(
z
)
∣
<
S
p
l
(
z
)
2
/
(
b
f
)
⋅
2
σ
\left|S_{\mathbf{p}}^{n}(z)-S_{\mathbf{p}}^{l}(z)\right|<S_{\mathbf{p}}^{l}(z)^{2} /(b f) \cdot 2 \sigma
∣∣Spn(z)−Spl(z)∣∣<Spl(z)2/(bf)⋅2σ和
S
n
n
⋅
S
n
l
>
0.8
S_{\mathbf{n}}^{n} \cdot S_{\mathbf{n}}^{l}>0.8
Snn⋅Snl>0.8验证匹配的位置和法向关系。如果不满足则放弃该匹配关系。
如果满足匹配关系,那么更新surfel
S
l
S^l
Sl:
S
p
l
←
S
p
l
S
w
l
+
S
p
n
S
w
n
S
w
l
+
S
w
n
,
S
c
l
←
S
c
n
S
n
l
←
S
n
l
S
w
l
+
S
n
n
S
w
n
S
w
l
+
S
w
n
,
S
i
l
←
S
i
n
S
t
l
←
S
t
l
+
1
,
S
w
l
←
S
w
l
+
S
w
n
S
r
l
←
min
(
S
r
n
,
S
r
l
)
\begin{aligned} &\begin{array}{l} S_{\mathbf{p}}^{l} \leftarrow \frac{S_{\mathbf{p}}^{l} S_{w}^{l}+S_{\mathbf{p}}^{n} S_{w}^{n}}{S_{w}^{l}+S_{w}^{n}}, S_{c}^{l} \leftarrow S_{c}^{n} \\ S_{\mathbf{n}}^{l} \leftarrow \frac{S_{\mathbf{n}}^{l} S_{w}^{l}+S_{\mathbf{n}}^{n} S_{w}^{n}}{S_{w}^{l}+S_{w}^{n}}, S_{i}^{l} \leftarrow S_{i}^{n} \end{array}\\ &S_{t}^{l} \leftarrow S_{t}^{l}+1, \quad S_{w}^{l} \leftarrow S_{w}^{l}+S_{w}^{n}\\ &S_{r}^{l} \leftarrow \min \left(S_{r}^{n}, S_{r}^{l}\right) \end{aligned}
Spl←Swl+SwnSplSwl+SpnSwn,Scl←ScnSnl←Swl+SwnSnlSwl+SnnSwn,Sil←SinStl←Stl+1,Swl←Swl+SwnSrl←min(Srn,Srl)
那些没有被融合的新建surfel也填入地图中。为了处理离群值,我们剔除
∣
S
i
−
F
r
e
f
∣
>
10
\left|S_{i}-F_{r e f}\right|>10
∣Si−Fref∣>10(即当前时间距离surfel被创建时间,已经经过了10张关键帧),但是surfel的融合次数少于5此,删去该surfel。