TARE: A Hierarchical Framework for Efficiently Exploring Complex 3D Environments
论文地址:https://www.ri.cmu.edu/wp-content/uploads/2021/06/RSS_2021.pdf
github:https://github.com/caochao39/tare_planner
我们的方法的好处是,它可以比目前的最先进的算法更快地探索3D空间。该方法的优点是基于分层框架,将处理分离为两个级别。
第一层保持机器人周围环境的高分辨率表示,即局部规划范围(图中的绿框)。在该范围内,生成一个满足运动学约束的可行路径供机器人跟随。
第二层保持低分辨率表示,并计算连接全局环境中遥远区域的路径,即子空间(图1中的绿色立方体)。
这种框架的意义在于,在机器人附近的精细处理是最高效的,而在远离机器人的地方有限的处理也足够满足。该框架在本地规划范围内执行大量处理,并权衡细节以实现全局范围内的快速处理。
该算法首先规划出一条全局路径,该全局路径表明了机器人自由空间中需要详细探索的区域,接着需要一个详细的路径来引导机器人进行局部探索。这种方法使用全局路径在自由空间内进行大范围距离的移动。两层路径的组合使机器人能够在由局部和全局共同确定的序列中探索区域。
定义
Q
⊂
R
3
\mathcal{Q} \subset \mathbb{R}^3
Q⊂R3作为自探索的工作区域,
Q
t
r
a
v
⊂
Q
\mathcal{Q}_{trav} \subset \mathcal{Q}
Qtrav⊂Q是可通过的子空间。定义
v
∈
S
E
(
3
)
v \in SE(3)
v∈SE(3)描述机器人上传感器的姿态,
v
=
[
p
v
,
q
v
]
v=[p_v,q_v]
v=[pv,qv],其中
p
v
∈
Q
t
r
a
v
p_v \in \mathcal{Q}_{trav}
pv∈Qtrav,
q
v
∈
S
O
(
3
)
q_v \in SO(3)
qv∈SO(3)代表位置和方向。定义
L
⊂
S
E
(
3
)
\mathcal{L}\subset SE(3)
L⊂SE(3)代表车辆轨迹中的视角集合。我们使用面来代表自由空间和非自由空间之间的边界,后者代表占据区域和未知区域。
S
v
⊂
Q
S_v\subset \mathcal{Q}
Sv⊂Q的意思是传感器在
v
v
v视角下所看到的面。同一个面可以在不同的视角下所观测到。目前为止所观测到的面是
S
=
∪
v
⊂
L
S
v
(1)
S=\underset{v\subset \mathcal{L}}{\cup}S_v \tag{1}
S=v⊂L∪Sv(1)
这里,
S
S
S包括已经覆盖的面,定义为
S
c
o
v
⊂
S
S_{cov}\subset S
Scov⊂S,和还未覆盖到的面,定义为
S
−
=
S
\
S
c
o
v
\overset{-}{S}=S\backslash S_{cov}
S−=S\Scov。当去未覆盖的区域
S
−
\overset{-}{S}
S−时,我们应该寻找最短路径,这个路径必须满足运动学约束。设
v
c
u
r
r
e
n
t
v_{current}
vcurrent为当前车辆的传感器位姿下的视角。我们的问题可以如下定义。
问题1: 给出 S − \overset{-}{S} S−和 v c u r r e n t v_{current} vcurrent,寻找由视角 v 1 , v 2 , . . . , v_1,v_2,..., v1,v2,...,生成的最短路径 T ∗ \mathcal{T}^* T∗,其中在使得车辆去未覆盖的区域 S − \overset{-}{S} S−时,必须使得 v c u r r e n t ∈ T ∗ v_{current}\in \mathcal{T}^* vcurrent∈T∗,其中 T ∗ \mathcal{T}^* T∗是满足运动学约束的。
问题1在每个规划周期重复求解。我们使用 S − \overset{-}{S} S−去计算探索的路径,当执行路径时,通过传感器当前所读取到的信息及时的更新 S S S,处理位移和新观测到的面。然后将未覆盖的面变成覆盖的面,接着使用 S − \overset{-}{S} S−去进行下一次的规划。
A.Viewpoint Sampling
我们定义了一个表面点被覆盖的标准,认为一个表面
p
a
t
c
h
patch
patch的中心
p
s
∈
Q
p_s \in \mathcal{Q}
ps∈Q,其法线
n
s
∈
R
3
n_s \in \mathbb{R}^3
ns∈R3指向自由空间的一边,表面
p
a
t
c
h
patch
patch上的中心点被视点
v
v
v覆盖,如果
∣
p
s
−
p
v
∣
≤
D
(2)
|p_s - p_v|\leq D \tag{2}
∣ps−pv∣≤D(2)
n
s
⋅
(
p
v
−
p
s
)
∣
n
s
∣
∣
p
v
−
p
s
∣
≥
T
(3)
{n_s\cdot(p_v-p_s)\over |n_s||p_v-p_s|}\geq T\tag{3}
∣ns∣∣pv−ps∣ns⋅(pv−ps)≥T(3)
这里
D
D
D和
T
T
T是两个常量,限制了表面
p
a
t
c
h
patch
patch关于视角的相对的距离和转角。这样的标准可以使得表面被更好的感知,在实践中设置
D
D
D小于传感器范围。
定义
H
⊂
Q
\mathcal{H} \subset \mathcal{Q}
H⊂Q作为局部规划的范围。
H
t
r
a
v
⊂
H
\mathcal{H}_{trav} \subset\mathcal{H}
Htrav⊂H为考虑障碍物和连通性后可通过的子空间,
C
t
r
a
v
H
\mathcal{C}^\mathcal{H}_{trav}
CtravH为考虑旋转和平移所对应配置的空间。定义
S
−
H
\overset{-}{S}_{\mathcal{H}}
S−H为在空间
C
t
r
a
v
H
\mathcal{C}^\mathcal{H}_{trav}
CtravH中的视角所能看到的未被覆盖的面。视角抽样的问题是在空间
C
t
r
a
v
H
\mathcal{C}^\mathcal{H}_{trav}
CtravH中选择一个最少的视角集合去覆盖
S
−
H
\overset{-}{S}_{\mathcal{H}}
S−H,使用
S
−
v
⊂
S
−
H
\overset{-}{S}_v \subset \overset{-}{S}_{\mathcal{H}}
S−v⊂S−H去定义从视角
v
∈
C
t
r
a
v
H
v \in\mathcal{C}^\mathcal{H}_{trav}
v∈CtravH中会被看到的未覆盖区域。这个视角
v
v
v的奖励定义为
S
−
v
\overset{-}{S}_v
S−v的面积,定义为
A
v
A_v
Av。
请注意,这个问题展示了子模块性,即选择了更多的视点,选择一个额外视点的回报会减少。这是因为附近的视点有重叠的视场,同一表面可以从多个视点感知。因此,一个视角的回报取决于之前选择的视角。设
v
i
,
i
∈
Z
+
v_i,i\in\mathbb{Z}^+
vi,i∈Z+为第
i
i
i次选择的视角。对于一个在
v
i
v_i
vi视角下未被覆盖的表面
S
−
v
i
\overset{-}{S}_{v_i}
S−vi,需要被调整为
S
−
v
i
−
∪
j
=
1
i
−
1
(
S
v
i
−
∩
S
v
j
−
)
\overset{-}{S}_{v_i}-\cup^{i-1}_{j=1}(\overset{-}{S_{v_i}}\cap \overset{-}{S_{v_j}})
S−vi−∪j=1i−1(Svi−∩Svj−),然后对
A
v
i
A_{v_i}
Avi进行相应的调整。
算法1给出了视点采样的过程,该算法首先均匀的从
H
t
r
a
v
\mathcal{H}_{trav}
Htrav点阵中产生一系列的视角候选点
V
\mathcal{V}
V。其次,通过使用更新后的环境表示估计其覆盖范围
S
v
−
\overset{-}{S_v}
Sv−,计算所有视点候选
v
∈
V
v∈\mathcal{V}
v∈V的奖励
A
v
A_v
Av(第3行)。然后,一个过程迭代
K
K
K次以确定这些视点。在每次迭代中,算法从覆盖
S
−
H
\overset{-}{S}_{\mathcal{H}}
S−H的
V
\mathcal{V}
V中随机抽取一个视点子集。三个视点是预先选择的(第6行),一个作为当前的视点
v
c
u
r
r
e
n
t
v_{current}
vcurrent,另外两个作为
H
\mathcal{H}
H边界上的视点
v
b
o
u
n
d
a
r
y
1
,
v
b
o
u
n
d
a
r
y
2
v^1_{boundary},v^2_{boundary}
vboundary1,vboundary2。连接局部路径和全局路径。优先级队列
Q
′
\mathcal{Q}'
Q′用于管理候选视点,视点
v
v
v的优先级被设置为它的奖励
A
v
A_v
Av。:视角是从优先队列中选择的,其概率与奖励成比例。由于这种子模块性,考虑到重叠的视场,在选择一个视点后,优先队列中剩余视点的奖励相应减少。当优先级队列为空或添加新视点的微不足道的奖励可以忽略时,视点采样过程结束。该算法调用算法2来生成经过采样视点的路径,通过迭代,找到成本较低的路径,并返回成本最低的路径作为局部路径,记为
T
l
o
c
a
l
\mathcal{T}_{local}
Tlocal。
B. Path Generation and Smoothing
给定一组采样视点
V
′
\mathcal{V}'
V′,我们希望生成通过每个视点的路径,理想情况下,我们希望这条路径在运动学上是可行的,可以被高速行驶的车辆跟随。在这里,我们关注曲率约束,当以期望的速度移动时,使路径的最大曲率取决于车辆的最小转弯半径。由于视点
V
′
\mathcal{V}'
V′的分布以及环境的结构,满足曲率约束的连续路径是不可能的,该方法以平滑分段计算路径,如下图所示:
车辆停在每段的结束,然后向不同的方向移动到下一段。这就要求车辆可以在一个地方转弯,考虑到本文的重点不是利用复杂的运动模型进行路径规划,我们采用通用的微分运动模型,对于飞行器,具有独立的高度控制。 我们把这条路径表示为
T
s
m
o
o
t
h
′
=
[
v
1
1
,
v
2
1
,
.
.
.
]
[
v
1
2
,
v
2
2
,
.
.
.
]
\mathcal{T}'_{smooth}=[v_1^1,v_2^1,...][v_1^2,v_2^2,...]
Tsmooth′=[v11,v21,...][v12,v22,...],其中
[
⋅
]
[·]
[⋅]表示一个分段,
v
k
j
v^j_k
vkj是第
j
j
j段上的第
k
k
k个视点。注意,一个段的最后一个视点和接下来的段的第一个视点共享相同的视点,设
n
∽
\overset{\backsim}{n}
n∽是线段的数量,定义
l
j
l_j
lj为第
j
j
j段的长度,我们在每一次停止都加一个惩罚
p
p
p,以此来阻止太频繁停车。
T
s
m
o
o
t
h
′
\mathcal{T}'_{smooth}
Tsmooth′的成本被定义为:
c
s
m
o
o
t
h
′
=
∑
j
=
1
n
∽
l
j
+
p
(
n
∽
−
1
)
(4)
c'_{smooth}=\sum^{\overset{\backsim}{n}}_{j=1}{l_j+p(\overset{\backsim}{n}-1)} \tag{4}
csmooth′=j=1∑n∽lj+p(n∽−1)(4)
计算路径的问题可以表述如下。
问题2: 给出一些视点
V
′
\mathcal{V}'
V′,找到一条
T
s
m
o
o
t
h
′
\mathcal{T}'_{smooth}
Tsmooth′的成本
c
s
m
o
o
t
h
′
c'_{smooth}
csmooth′最低的路径。该条路径可以逐个的访问在
V
′
\mathcal{V}'
V′中的视点,且每一段都满足曲率约束。
我们用近似算法分两步求解,而不是试图找到精确解,首先,我们用标准TSP解决视点的顺序,其次,我们按照顺序将视点划分为几个部分,这是为了确定一个视点(除了第一个和最后一个)是段中的内点还是两个段之间的断点。
旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
定义 n ′ n' n′为在 V ′ \mathcal{V}' V′中的视点数,定义 x = [ x 1 , x 2 , . . . , x n ′ − 2 ] x=[x_1,x_2,...,x_{n'-2}] x=[x1,x2,...,xn′−2]作为一系列的布尔变量,用于描述 n ′ − 2 n'-2 n′−2个视点(除了第一个和最后一个),还有一个函数 f ( x ) = c s m o o t h ′ f(x)=c'_{smooth} f(x)=csmooth′。
确定视点状态的问题可以表述为:
问题3: 给定一个布尔变量序列
x
x
x和一个函数
f
(
x
)
=
c
s
m
o
o
t
h
′
f(x)=c'_{smooth}
f(x)=csmooth′,找到这样一个
x
∗
x^*
x∗:
x
∗
=
a
r
g
m
i
n
x
c
s
m
o
o
t
h
′
(5)
x^*=\underset{x}{argmin }\ c'_{smooth} \tag{5}
x∗=xargmin csmooth′(5)
问题3是一个非线性整数规划问题,并且是NP-hard。特别是,寻找平滑路径涉及耗时的轨迹优化。我们的方法采用贪心策略,每个视点只检查一次,最大限度地减少了运行时间。
算法2给出了从 V ′ \mathcal{V}' V′点集中计算 T s m o o t h ′ \mathcal{T}'_{smooth} Tsmooth′的过程,该算法在 V ′ \mathcal{V}' V′中使用 A ∗ A^* A∗算法找到每两个视点之间的无碰撞最短路径,并构造包含路径长度的距离矩阵 D ′ D' D′。接下来,算法为视点的遍历顺序求解一个TSP。在确定 T s m o o t h ′ \mathcal{T}'_{smooth} Tsmooth′的分段前,该算法初始化所有的 n ′ − 2 n'-2 n′−2个视点全为断点。然后该算法试图通过按序的设置每一个视点 v i v_i vi为内点降低成本 c s m o o t h ′ c'_{smooth} csmooth′,然后重新平滑该段。在视点处应用边界条件,曲线的控制点被放置在A*搜索给出的初始路径上,并由非线性优化求解器调整,以考虑碰撞间隙和路径光滑性。为了加快处理速度,非线性优化被边缘化,只对 v i v_i vi的两个相邻视点之间的曲线进行优化,该算法返回 T s m o o t h ′ \mathcal{T}'_{smooth} Tsmooth′以及 c s m o o t h ′ c'_{smooth} csmooth′。
C. Global Planning
我们把
H
\mathcal{H}
H外的空间分成偶数立方体子空间。每个子空间存储在探索过程中发现的覆盖表面和未覆盖表面。请注意,数据保存在子空间中只是为了存储,而
H
\mathcal{H}
H中的数据则会随着勘探的进行而及时更新。每个子空间保存“未探索”、“探索”和“已探索”三个状态。 如果子空间不包含任何覆盖或未覆盖的表面,状态是“未探索”。如果一个子空间只包含被覆盖的表面,则状态为“探索”。如果一个子空间包含任何未覆盖的表面,则状态为“探索”。我们只在全局规划中探索子空间。定义
G
h
⊂
Q
,
h
∈
Z
+
\mathcal{G}_h \subset Q,h\in \mathbb{Z}^+
Gh⊂Q,h∈Z+作为一个探索子空间,
G
^
\hat{\mathcal{G}}
G^作为探索子空间的集合。全局规划问题是找到一个经过当前视点
v
c
u
r
r
e
n
t
v_{current}
vcurrent的全局路径
T
g
l
o
b
a
l
\mathcal{T}_{global}
Tglobal和
G
^
\hat{\mathcal{G}}
G^中每一个子空间的形心。在探索过程中,我们从过去的轨迹扩展成为可通行的区域,构建稀疏随机路线图。与局部规划类似,我们在路线图上使用
A
∗
A^*
A∗搜索子空间之间的最短路径,然后求解一个TSP。算法3给出了计算探索路径的全部过程。
该算法构造一个距离矩阵,其中包含在路线图上找到的路径的长度(第1行)并解决一个TSP(第2行)。全局路径
T
g
l
o
b
a
l
\mathcal{T}_{global}
Tglobal与
H
\mathcal{H}
H的边界相交的两个点被提出作为
v
b
o
u
n
d
a
r
y
1
,
v
b
o
u
n
d
a
r
y
2
v^1_{boundary},v^2_{boundary}
vboundary1,vboundary2。然后使用算法1计算
T
l
o
c
a
l
\mathcal{T}_{local}
Tlocal,最后,通过将
H
\mathcal{H}
H内的
T
g
l
o
b
a
l
\mathcal{T}_{global}
Tglobal部分替换为
T
l
o
c
a
l
\mathcal{T}_{local}
Tlocal,将
T
l
o
c
a
l
T_{local}
Tlocal和
T
g
l
o
b
a
l
\mathcal{T}_{global}
Tglobal连接起来。
下图显示了一个探索的例子,其中深蓝色和浅蓝色的路径表示
T
l
o
c
a
l
\mathcal{T}_{local}
Tlocal和
T
g
l
o
b
a
l
\mathcal{T}_{global}
Tglobal。
当
H
\mathcal{H}
H区勘探结束时(
S
−
H
=
∅
\overset{-}{S}_{\mathcal{H}}=\emptyset
S−H=∅),
T
l
o
c
a
l
\mathcal{T}_{local}
Tlocal简化为连接从
v
c
u
r
r
e
n
t
v_{current}
vcurrent到
v
b
o
u
n
d
a
r
y
1
v^1_{boundary}
vboundary1和
v
b
o
u
n
d
a
r
y
2
v^2_{boundary}
vboundary2的最短路径,然后进一步连接到
T
g
l
o
b
a
l
\mathcal{T}_{global}
Tglobal邻近探索的子空间。车辆沿着路径转移到一个探索子空间继续探索,如果
S
−
H
=
∅
\overset{-}{S}_{\mathcal{H}}=\emptyset
S−H=∅(局部空间
H
\mathcal{H}
H内没有未覆盖区域),
G
h
=
∅
\mathcal{G}_h=\emptyset
Gh=∅(
H
\mathcal{H}
H外的子空间也没有未探索的区域),则探索结束。