问题描述
SLAM系统在运行是会不断创建新的视图用于全局定位和回环检测。如果视图数量不断增加,会破坏SLAM算法的实时性。为了满足终身定位的需要,本文提出了一种修剪视图的方法,来保持视图数量在限制数量以下。
去除原理
Algorithm 1 Find views for deletion
Require: Set
V
of all the views
1: if
∣
V
∣
≤
M
I
N
−
VIEWS then
2: return
3:
V
keep
←
newlyCreatedViews()
4: for
v
in
(
V
\
V
keep
)
do
5:
score
[
v
]
←
(
W
1
×
r
e
l
o
c
+
W
2
×
n
−
o
b
s
−
c
u
r
m
a
x
−
o
b
s
+
W
3
×
n
−
o
b
s
−
r
u
n
s
n
−
r
u
n
s
)
6: if score
[
v
]
>
SCORE_THRESHOLD then
7:
V
keep
←
V
keep
∪
{
v
}
8:
V
delete
←
V
\
V
keep
9: sort
(
V
delete
,
score
)
# Sort by score
10:
D
←
∅
11: for
v
in
V
delete
do
12: if numNearestNeighbors
(
v
,
D
)
<
NN.THRESHOLD
then
13:
V
keep
←
V
keep
∪
{
v
}
14: else
15:
D
←
D
∪
{
v
}
16:
V
delete
←
V
\
V
keep
17: return
V
delete
\begin{aligned} &\begin{array}{l} \text { Algorithm 1 Find views for deletion } \\ \hline \text { Require: Set } \mathscr{V} \text { of all the views } \\ \text { 1: if }|\mathscr{V}| \leq \mathrm{MIN}_{-} \text {VIEWS then } \\ \text { 2: return } \\ \text { 3: } \mathscr{V}_{\text {keep }} \leftarrow \text { newlyCreatedViews() } \\ \text { 4: for } v \text { in }\left(\mathscr{V} \backslash \mathscr{V}_{\text {keep }}\right) \text { do } \\ \text { 5: } \operatorname{score}[v] \leftarrow \left(W_{1} \times r e l o c+W_{2} \times \frac{n_{-} o b s_{-} c u r}{m a x_{-} o b s}+W_{3} \times \frac{n_{-} o b s_{-} r u n s}{n_{-} r u n s}\right) \\ \text { 6: if score}[ v]>\text { SCORE\_THRESHOLD then } \\ \text { 7: } \mathscr{V}_{\text {keep }} \leftarrow \mathscr{V}_{\text {keep }} \cup\{v\} \\ \text { 8: } \mathscr{V}_{\text {delete }} \leftarrow \mathscr{V} \backslash \mathscr{V}_{\text {keep }}\\ \text { 9: } \text { sort }\left(\mathscr{V}_{\text {delete }}, \text { score }\right) \text { \# Sort by score } \\ \text { 10: } D \leftarrow \varnothing \\ \text { 11: for } v \text { in } \mathscr{V}_{\text {delete }} \text { do } \\ \text { 12: } \text { if numNearestNeighbors }(v, D)<\text { NN.THRESHOLD } \\ \text { then } \\ \text { 13: } \mathscr{V}_{\text {keep }} \leftarrow \mathscr{V}_{\text {keep }} \cup\{v\} \\ \text { 14: else } \\ \text { 15: } D \leftarrow D \cup\{v\} \\ \text { 16: } \mathscr{V}_{\text {delete }} \leftarrow \mathscr{V} \backslash \mathscr{V}_{\text {keep }} \\ \text { 17: return } \mathscr{V}_{\text {delete }} \\ \hline \end{array} \end{aligned}
Algorithm 1 Find views for deletion Require: Set V of all the views 1: if ∣V∣≤MIN−VIEWS then 2: return 3: Vkeep ← newlyCreatedViews() 4: for v in (V\Vkeep ) do 5: score[v]←(W1×reloc+W2×max−obsn−obs−cur+W3×n−runsn−obs−runs) 6: if score[v]> SCORE_THRESHOLD then 7: Vkeep ←Vkeep ∪{v} 8: Vdelete ←V\Vkeep 9: sort (Vdelete , score ) # Sort by score 10: D←∅ 11: for v in Vdelete do 12: if numNearestNeighbors (v,D)< NN.THRESHOLD then 13: Vkeep ←Vkeep ∪{v} 14: else 15: D←D∪{v} 16: Vdelete ←V\Vkeep 17: return Vdelete
去除视图的代码如上,
V
keep
\mathscr{V}_{\text {keep }}
Vkeep 为应保留的视图子集,
V
\mathscr{V}
V为所有视图的集合。 得分超过阈值的视图会加入
V
keep
\mathscr{V}_{\text {keep }}
Vkeep 中。得分计算中,
W
1
W_{1}
W1,
W
2
W_{2}
W2,
W
3
W_{3}
W3为三个部分的权重,如果视图用于重定位,
r
e
l
o
c
r e l o c
reloc为1,否则为0。
n
−
r
u
n
s
n_{-} r u n s
n−runs是总视图数,
n
−
o
b
s
−
r
u
n
s
n_{-} o b s_{-} runs
n−obs−runs是能观测到当前视图的视图数。
n
−
o
b
s
−
c
u
r
n_{-} o b s_{-} c u r
n−obs−cur是当前能观测到的视图数,
m
a
x
−
o
b
s
max_{-}obs
max−obs是最多观测到的视图数。
V
delete
\mathscr{V}_{\text {delete}}
Vdelete中视图周围的视图数小于
N
N
.
T
H
R
E
S
H
O
L
D
NN.THRESHOLD
NN.THRESHOLD,将该视图加回
V
keep
\mathscr{V}_{\text {keep }}
Vkeep 。