回环检测是指检测传感器的两次测量(如图像、激光雷达扫描)是否发生在同一场景,它是对于SLAM问题至关重要。基于激光雷达的回环检测应该满足如下要求:
STD-LCD可以高效地检测闭环,并提供可靠的闭环几何变换。此外,它可以处理小重叠回环检测的挑战情况。与其他描述符中使用的多边形相比,三角形更稳定,因为三角形的形状是给定边长(或夹角)唯一确定的。此外,三角形的形状对于刚性变换是完全不变的。与关键点附近的的局部描述符相比,三角形的形状是旋转和平移不变的。基于这一性质,STD设计了一种算法,从三维点云中高效地提取局部关键点,并将这些关键点编码为三角形描述符。然后,通过匹配点云之间描述符的边长(和一些其他信息)来实现回环检测。从描述符匹配得到的点对关系可以进一步用于几何验证,这大大提高了回环检测的准确率。
当接收到累积子图后,STD-LCD对子图进行体素化,对体素中的点
p
i
(
i
=
1
,
…
,
N
)
\mathbf{p}_i(i=1,\ldots,N)
pi?(i=1,…,N)求协方差矩
Σ
\bm \Sigma
Σ。
p
ˉ
=
1
N
∑
i
=
1
N
p
i
;
Σ
=
1
N
(
p
i
?
p
ˉ
)
(
p
i
?
p
ˉ
)
T
\bar{\mathbf{p}}=\frac{1}{N}\sum_{i=1}^{N}\mathbf{p}_i;\quad\boldsymbol{\Sigma}=\frac{1}{N}(\mathbf{p}_i-\bar{\mathbf{p}})(\mathbf{p}_i-\bar{\mathbf{p}})^T
pˉ?=N1?i=1∑N?pi?;Σ=N1?(pi??pˉ?)(pi??pˉ?)T
令 λ k \lambda_k λk?为 Σ \bm{\Sigma} Σ第 k k k大特征值,平面判定准则为 λ 3 < σ 1 , λ 2 > σ 2 \lambda_3<\sigma_1,\lambda_2>\sigma_2 λ3?<σ1?,λ2?>σ2?,其中 σ 1 \sigma_1 σ1?和 σ 2 \sigma_2 σ2?是预设超参数,一般 σ 1 \sigma_1 σ1?为一个较小的值, σ 2 \sigma_2 σ2?为一个较大的值。将满足平面判定准则的体素定义为平面体素,否则为非平面体素。
通过区域生长的方法将平面体素合并为更大的平面,即从一个随机的平面体素开始,如果其相邻体素有相同的平面法向量且平面距离小于阈值,则将其加入到当前正在生长的平面中。否则,如果相邻体素并不在同一平面上,则将其加入到当前正在生长的平面的边界体素表中。重复以上操作直到所有添加进来的体素都已经被扩展或者达到边界体素。
以生长得到的平面为图像平面,将边界体素的点投影到相邻平面上,以边界体素中的点到平面的最大距离为像素值。对于图像,将具有局部最大点到平面距离的像素中距离最大的点设置为关键点。将提取到的关键点构建成一个kd树,并对每一个关键点搜索其最近邻的20个关键点构建三角描述符。进行空间非极大值抑制,将具有相同边长的描述符去重,以增强提取的非重复性。
每个三角形描述符 Δ \bm{\Delta} Δ包含的元素如下
除了描述符,我们还将保存从这个子图中提取的所有 n n n个平面 Π = ( π 1 , π 2 , … , π n ) \bm \Pi = (\bm \pi_1,\bm \pi_2,\ldots,\bm \pi_n) Π=(π1?,π2?,…,πn?),用于之后的几何验证步骤。
回环检测与验证包括三部分:粗回环检测、细回环检测和几何验证。粗循环检测通过在描述符数据库的哈希表中搜索匹配的历史描述符,可以快速地提取出N个可能的候选。精细回环检测通过计算配对三角形之间的所有变换矩阵,并对变换进行聚类,将包含变换数最多的聚类簇的中心作为优秀候选。最后,计算当前帧到优秀候选者的平面重合度筛选误检,选择点到平面距离最小的候选作为最佳候选。由于精细回环检测提供了一个较好的初始猜测,使得之后的ICP配准更快收敛。
由于一个子图可以提取上百个描述符,为了快速查询和匹配描述符,我们使用哈希表存储所有描述符。我们使用描述子中具有旋转和平移不变性的6个属性来计算哈希密钥,分别为边长 l 12 , l 23 , l 13 l_{12},l_{23},l_{13} l12?,l23?,l13?和投影法向量的点积 n 1 ? n 2 , n 2 ? n 3 , n 1 ? n 3 \mathbf{n}_1\cdot\mathbf{n}_2,\mathbf{n}_2\cdot\mathbf{n}_3,\mathbf{n}_1\cdot\mathbf{n}_3 n1??n2?,n2??n3?,n1??n3?。具有6个相似属性的描述符将具有相同的哈希密钥,因此存储在同一个容器中。对于一个查询帧,我们提取其所有描述符。对于每个描述符 Δ i \bm{\Delta}_i Δi?,计算其哈希密钥,将其定位到哈希表中对应的容器中,并对该容器中存在的所有描述符的关键帧进行投票。当查询帧中的所有描述符 Δ i \bm \Delta_i Δi?都被处理后,匹配过程结束。投票数前十多的关键帧将被选为描述符的候选关键帧,用于回环检测。
当给定一个候选回环关键帧时,我们进行几何验证以消除由于描述符匹配不正确而导致的误检。由于边长确定后三角形的形状是唯一确定的,一旦
Δ
a
\bm\Delta_a
Δa?匹配到
Δ
b
\bm\Delta_b
Δb?,它们的顶点
(
p
a
1
,
p
a
2
,
p
a
3
)
(\mathbf{p}_{a1},\mathbf{p}_{a2},\mathbf{p}_{a3})
(pa1?,pa2?,pa3?)和
(
p
b
1
,
p
b
2
,
p
b
3
)
(\mathbf{p}_{b1},\mathbf{p}_{b2},\mathbf{p}_{b3})
(pb1?,pb2?,pb3?)将自然匹配。然后利用这个对应关系,根据\ref{pt2ptICP}节,通过奇异值分解(Singular Value Decomposition,SVD)很容易计算出这两个关键帧之间的相对变换
T
=
(
R
,
t
)
\boldsymbol{T}=(\boldsymbol{R},\boldsymbol{t})
T=(R,t):
W
=
∑
i
=
1
3
(
p
a
i
?
q
a
)
(
p
b
i
?
q
b
)
[
U
,
S
,
V
]
=
S
V
D
(
W
)
R
=
V
U
T
,
t
=
?
R
?
q
a
+
q
b
.
\begin{aligned} &\mathbf{W}=\sum_{i=1}^3(\mathbf{p}_{a_i}-\mathbf{q}_a)(\mathbf{p}_{b_i}-\mathbf{q}_b) \\ &[\mathbf{U},\mathbf{S},\mathbf{V}]=\mathbf{SVD}(\mathbf{W}) \\ &\bm{R}=\mathbf{V}\mathbf{U}^T,\bm{t}=-\bm{R}*\mathbf{q}_a+\mathbf{q}_b. \end{aligned}
?W=i=1∑3?(pai???qa?)(pbi???qb?)[U,S,V]=SVD(W)R=VUT,t=?R?qa?+qb?.?
为了增加鲁棒性,使用RANSAC方法来寻找最大化正确匹配描述符数量的刚体变换。
基于此刚体变换,我们计算当前帧与候选帧之间的平面重叠度来进行几何验证。
用中心点
q
\mathbf{q}
q和法向量
u
\mathbf{u}
u 表示的平面
π
\bm\pi
π。记当前帧的平面集为
B
Π
=
[
(
B
q
1
,
B
u
1
)
,
…
(
B
q
n
,
B
u
n
)
]
^{B}\Pi = [(^{B}\mathbf{q}_1,{}^{B}\mathbf{u}_1),\ldots(^{B}\mathbf{q}_n,{}^{B}\mathbf{u}_n)]
BΠ=[(Bq1?,Bu1?),…(Bqn?,Bun?)],候选帧的平面集为
C
Π
=
[
(
C
q
1
,
C
u
1
)
,
…
(
C
q
n
,
C
u
n
)
]
^{C}\Pi = [(^{C}\mathbf{q}_1,{}^{C}\mathbf{u}_1),\ldots(^{C}\mathbf{q}_n,{}^{C}\mathbf{u}_n)]
CΠ=[(Cq1?,Cu1?),…(Cqn?,Cun?)],刚体变换为
C
T
B
=
(
C
R
B
,
C
t
B
)
∈
S
E
(
3
)
{}^{C}\bm{T}_B= ( {}^C\bm{R}_B,{}^C\bm{t}_B)\in SE(3)
CTB?=(CRB?,CtB?)∈SE(3),其中
n
n
n为当前帧的平面数,
m
m
m为候选框的平面数。我们以
C
Π
{}^C\Pi
CΠ的中心点
(
C
q
1
,
C
q
2
,
…
,
C
q
m
)
({}^C\mathbf{q}_1,{}^C\mathbf{q}_2,\ldots,{}^C\mathbf{q}_m)
(Cq1?,Cq2?,…,Cqm?)构建一个kd树(k=3)。则对于每个平面中心点
B
q
i
(
i
=
1
,
2
,
…
,
n
)
∈
B
Π
{}^B\mathbf{q}_i(i=1,2,\ldots,n)\in{}^B\Pi
Bqi?(i=1,2,…,n)∈BΠ,首先用
C
T
B
{}^C\mathbf{T}_B
CTB?对
B
q
i
{}^B\mathbf{q}_i
Bqi?进行变换,然后在kd树中搜索一个最近的点
C
q
j
{}^C\mathbf{q}_j
Cqj?,通过法向量差和点到平面的距离判断两个平面是否重合:
∥
C
R
B
B
u
i
?
C
u
j
∥
2
<
σ
n
C
u
j
T
(
C
T
B
B
q
i
?
C
q
j
)
<
σ
d
\begin{aligned} \|{}^C\bm{R}_B{}^B\mathbf{u}_i-{}^C\mathbf{u}_j\|_2<\sigma_n \\[0.3em] {}^C\mathbf{u}_j^T(^C\bm{T}_B{}^B\mathbf{q}_i-{}^C\mathbf{q}_j)<\sigma_d \end{aligned}
∥CRB?Bui??Cuj?∥2?<σn?CujT?(CTB?Bqi??Cqj?)<σd??
其中
σ
n
\sigma_n
σn?和
σ
d
\sigma_d
σd?是用来判断平面重合的预设参数。
计算当前帧满足式\ref{plane_overlap}的平面占所有平面的比例:
N
c
=
N
coincide
N
sum
×
100
%
,
N_c=\frac{N_{\textsf{coincide}}}{N_{\textsf{sum}}}\times100\%,
Nc?=Nsum?Ncoincide??×100%,
其中
N
coincide
N_{\textsf{coincide}}
Ncoincide?为当前帧所有满足约束的平面数,
N
sum
N_{\textsf{sum}}
Nsum?为当前帧所有平面的数量。
如果 N c N_c Nc?超过阈值 σ p c \sigma_{pc} σpc?,我们就认为这是一个可靠的回环检测。由于平面的数量远远少于点云的数量,基于平面的几何验证比基于ICP的验证方法效率更高。按照式\ref{STD-ICP}优化点面距离和法向量差异可以得到回环的精确刚体变换。
min ? C T B ∥ C R B B u i ? C u j ∥ 2 2 + ( C u j T ( C T B B q i ? C q j ) ) 2 \min_{^C\bm{T}_B}\|{}^C\bm{R}_B{}^B\mathbf{u}_i-{}^C\mathbf{u}_j\|_2^2+\left({}^C\mathbf{u}_j^T(^C\bm{T}_B{}^B\mathbf{q}_i-{}^C\mathbf{q}_j)\right)^2 CTB?min?∥CRB?Bui??Cuj?∥22?+(CujT?(CTB?Bqi??Cqj?))2
STD-LCD回环检测通过求解如式所示的优化问题可以直接得到查询帧 i i i与回环帧 j j j之间的相对位姿约束 Δ T i j \Delta \mathbf{T}_{ij} ΔTij?,构造回环因子并加入到因子图中:
F
L
=
∑
(
i
,
j
)
∈
L
∥
L
o
g
(
Δ
T
i
j
?
1
(
X
i
?
1
X
j
)
)
∥
Σ
L
i
j
2
F_{\mathcal{L}} = \sum_{{(i,j)}\in\mathcal{L}}\left\|\mathrm{Log}\left(\Delta \mathbf{T}_{ij}^{-1} \left({\bm{X}_{i}^{-1} }\bm{X}_{j}\right)\right)\right\|^2_{\bm \Sigma_{\mathcal{L}_{ij}}}
FL?=(i,j)∈L∑?
?Log(ΔTij?1?(Xi?1?Xj?))
?ΣLij??2?
其中
X
i
\bm{X}_{i}
Xi?为查询帧全局位姿变量,
X
j
\bm{X}_{j}
Xj?为回环帧全局位姿变量,
Σ
L
i
j
\Sigma_{\mathcal{L}_{ij}}
ΣLij??为对应的信息矩阵,
L
\mathcal{L}
L为回环约束帧索引集合。