地图分割
垂直单元分割可以解决 C o b s {C}_{obs} Cobs为多边形时的运动规划问题。然而,重要的是要理解,这只是众多分割算法中的一个。这些分割算法在2D中可能并不可取;但是,它们却可以更好地推广到更高的维度。
定义
complex(复形)指的是一组cell(单元)及其边界。单元的可以从复形派生,但复形包含描述多个单元如何组合在一起的附加信息。cell decomposition(单元分割)仍然指的是将空间划分成若干单元,这是从一个复形派生出来的。
以一种通用方式定义复形和单元分割是很有诱惑力的。假设
C
f
r
e
e
{C}_{free}
Cfree的任何分区都可以称为单元分割。会使一个单元可能非常复杂,以至于这个概念毫无用处。甚至
C
f
r
e
e
{C}_{free}
Cfree本身也可以声明为一个大单元。用更简单的单元(例如不包含洞的单元)构建分割更有用。这就要求每
k
k
k-单元都与一个开放的
k
k
k维单位球体
B
k
⊂
R
k
B^k\subset{\mathbb{R}}^k
Bk⊂Rk在同一单元。从运动规划的角度来看,这仍然会产生相当复杂的单元,这将取决于特定的单元分割方法来实施进一步的约束,从而产生一个完整的规划算法。
将引入两种不同的复形。简单复形之所以被解释是因为它是最容易理解的复形之一。尽管它在许多应用中都很有用,但它的功能还不足以表示运动规划中出现的所有复杂情况。因此,还引入了奇异复形。尽管定义起来更复杂,但它包含了规划中所有感兴趣的单元复形,还提供了一种表示拓扑空间的优雅方法。
Simplicial Complex 单复形
假设
X
=
R
n
X={\mathbb{R}}^n
X=Rn,令
p
1
p_1
p1,
p
2
p_2
p2,
…
\ldots
…,
p
k
+
1
p_{k+1}
pk+1在
R
k
{\mathbb{R}}^k
Rk内
k
+
1
k+1
k+1线性无关。一个
k
−
s
i
m
p
l
e
k-simple
k−simple(k单形)即
[
p
1
,
…
,
p
k
+
1
]
[p_1,\ldots,p_{k+1}]
[p1,…,pk+1],是由以下点构成的:
[
p
1
,
…
,
p
k
+
1
]
=
{
∑
i
=
1
k
+
1
α
i
p
i
∈
R
∣
α
i
≥
0
,
f
o
r
a
a
l
l
a
i
a
a
n
d
a
∑
i
=
1
k
+
1
α
i
=
1
}
\left[ p_1,\ldots,p_{k+1}\right] = \bigg\{ \sum_{i=1}^{k+1}\alpha_i p_i \in \mathbb{R} \bigg| \alpha_i \ge 0 ,\mathrm{for\hphantom{a} all\hphantom{a}} i \mathrm{\hphantom{a}and \hphantom{a}}\sum_{i=1}^{k+1}\alpha_i =1 \bigg\}
[p1,…,pk+1]={i=1∑k+1αipi∈R∣∣∣∣αi≥0,foraallaiaandai=1∑k+1αi=1}其中,
α
i
p
i
\alpha_ip_i
αipi是标量乘以点坐标,另一种查看简单复形的方法是将
k
+
1
k+1
k+1点作为凸包(即所有在它们之间进行线性插值的方法)(对于给定集合X,所有包含X的凸集的交集S被称为X的凸包——计算几何)如果
k
=
2
k=2
k=2,则获得三角形区域。对于
k
=
3
k=3
k=3,生成四面体。
对于任意
k
k
k维单形和任意
1
≤
i
≤
k
+
1
1 \leq i \leq k+1
1≤i≤k+1中的
i
i
i,令
α
i
=
0
\alpha_i =0
αi=0。这产生一个
k
−
1
k-1
k−1维的单形,也被称为原始单形的一个face(面)。一个2维单形有三个面,其每一个面都是被称为edge边的一个1维的单形;每一个1维单形(即边)有两个被称为vertices(点)的面。
为了形成一个复形,这些单形必须以一种很好的方式组合在一起。这就产生了叫triangulation(三角剖分)的一种高维概念,在
R
2
{\mathbb{R}}^2
R2中,三角剖分是由三角形区域平铺组成的。一个simplicial complex(单复形)
K
\mathcal{K}
K是满足以下条件的有限单形集:
- K \mathcal{K} K中的任意面也在 K {\mathcal{K}} K中。
- K \mathcal{K} K中的任意两个单形的交集要么是它们的公共面,要么是空集。
上图说明了这些要求。对于
k
>
0
k>0
k>0,
K
\mathcal{K}
K中的一个
k
k
k-cell被定义为
int
(
[
p
1
,
…
,
p
k
+
1
]
)
\operatorname{int}([p_1,\ldots,p_{k+1}])
int([p1,…,pk+1])的内部任意
k
k
k-单形。对于
k
=
0
k=0
k=0,每个0-单形都是一个0-单元。所有单元格的并集构成由
K
\mathcal{K}
K覆盖的点集的分区。要成为一个单复形,这些单形的面必须很好地结合在一起。
Singular complex 奇异复形
单复形在几何建模和计算机图形学等计算模型拓扑的应用中非常有用。由于运动规划中存在复杂的拓扑空间、隐式、非线性模型和分解算法,它们不足以解决最一般的问题。singular complex奇异复形是simplicial complex单复形的推广。不局限于
R
n
{\mathbb{R}}^n
Rn,一个奇异复数可以定义在任意流形上,
X
X
X(它甚至可以定义在任意Hausdorff拓扑空间上)。主要的区别是,对于一个单复形,每个单形是
R
n
{\mathbb{R}}^n
Rn的子集;然而,对于一个奇异复形,每个单形实际上都是从
R
n
{\mathbb{R}}^n
Rn中单形到
X
X
X的子集的同胚(在拓扑学中,同胚是两个拓扑空间之间的双连续函数。同胚是拓扑空间范畴中的同构)。
为了帮助理解这个概念,首先考虑一个一维奇异复形,它恰好是一个拓扑图。区间
[
0
,
1
]
[0,1]
[0,1]是一个
1
1
1-单形,而连续路径
τ
:
[
0
,
1
]
→
X
\tau : [0,1] \rightarrow X
τ:[0,1]→X 是一个奇异
1
1
1-单形,因为它是
[
0
,
1
]
[0,1]
[0,1]到
X
X
X中
τ
\tau
τ的同胚。假设
G
(
V
,
E
)
{G}(V,E)
G(V,E)是一个拓扑图。cell单元是遵循如下定义的
X
X
X的子集,在
X
X
X中的每个点
v
∈
V
v \in V
v∈V都是0-单元。为了遵循这种形式,每个单元都被看作是一个函数
f
:
0
→
X
f:{0}\rightarrow X
f:0→X,这使得它是singular 0-simplex一个奇异0-单形,因为
0
{0}
0是一个0-单形。对于E
中
的
每
个
路
径
中的每个路径
中的每个路径\tau\,对应的
1
1
1-cell是:
{
x
∈
X
∣
τ
(
x
)
=
x
,
f
o
r
a
s
o
m
e
a
s
∈
(
0
,
1
)
}
\bigg\{ {{x} \in {X}} \big| \tau(x) = x, \mathrm{for\hphantom{a} some\hphantom{a}} {{s} \in {(0, 1)}} \bigg\}
{x∈X∣∣τ(x)=x,forasomeas∈(0,1)}另一种表述方式是
τ
(
(
0
,
1
)
)
\tau((0,1))
τ((0,1)),即路径
τ
\tau
τ的像,只是端点已被0-单元覆盖而被移除(单元必须形成分区)。将这些原则推广到更高的维度,由于同一维的所有球和单形都是同胚的,因此在单形的定义中可以用球代替单形。设
B
k
⊂
R
k
B^k\subset{\mathbb{R}}^k
Bk⊂Rk表示一个闭合的
k
k
k维单位球,
D
k
=
{
x
∈
R
n
∣
a
∥
x
∥
≤
1
}
D^k=\big\{ {{x} \in {\mathbb{R}}^n} \big| \hphantom{a} \left \| x \right \|\leq1\big\}
Dk={x∈Rn∣∣a∥x∥≤1}其中
∥
⋅
∥
\Vert\cdot\Vert
∥⋅∥是欧几里德范数。singular
k
k
k-simplex是
σ
:
D
k
→
X
{\sigma}:D^k\rightarrow X
σ:Dk→X的连续映射。令
int
(
D
k
)
\operatorname{int}(D^k)
int(Dk)表示为
D
k
D^k
Dk内部(interior)。对于
k
≥
1
k\geq 1
k≥1, 一个
k
k
k-单元
C
C
C对应一个奇异
k
k
k-单形
σ
{\sigma}
σ,
C
=
σ
(
int
(
D
k
)
)
⊆
X
C = {\sigma}(\operatorname{int}(D^k)) \subseteq X
C=σ(int(Dk))⊆X。0-单元作为0 奇异单形可以直接获得。每一个奇异的0-单形映射于
X
X
X中的0-单元。 如果
σ
{\sigma}
σ被限制为
int
(
D
k
)
\operatorname{int}(D^k)
int(Dk),那么它实际上定义了一个介于
D
k
D^k
Dk和
C
C
C之间的同胚。注意,如果
k
>
0
k>0
k>0,这两个都是开集。
一个单复形需要其单形很好地结合在一起。这里也应用了同样的概念,但是使用拓扑概念是因为它们更通用。设
K
\mathcal{K}
K为一组不同维数的奇异复形。设
S
k
S_k
Sk表示所有满足
i
≤
k
i \leq k
i≤k的奇异
i
i
i-单形的并集。
映射到拓扑空间
X
X
X满足下列条件的奇异单形集合称为奇异复形(singular complex):
- 对于每个维度 k k k,集合 S k ⊆ X S_k\subseteq X Sk⊆X必须是闭合的。这意味着各单元必须很好地结合在一起。
- 每个 k k k-单元是拓扑子空间 S k S_k Sk中的一个开集。请注意,0-单元在 S 0 S_0 S0中是开集,即使它们通常在 X X X中闭合。
垂直分解是奇异复数的一个很好的例子,它不是单形,因为它包含梯形。每个梯形和三角形的内部形成一个
2
2
2-单元,这是一个开集。对于每对相邻的
2
2
2-单元,它们的公共边界上都有一个
1
1
1-单元。没有0单元,因为顶点位于
C
o
b
s
C_{obs}
Cobs,而不是
C
f
r
e
e
C_{free}
Cfree。通过将所有
2
2
2-单元和
1
1
1-单元合并得到子空间
S
2
=
C
f
r
e
e
S_2=C_{free}
S2=Cfree。这满足了闭合要求,因为复形只构建于
C
f
r
e
e
C_{free}
Cfree中;因此,拓扑空间是
C
f
r
e
e
C_{free}
Cfree。集合
S
2
=
C
f
r
e
e
S_2=C_{free}
S2=Cfree既是打开的也是闭合的。集合
S
1
S_1
S1是所有
1
1
1-单元的并集。其也是闭合的,因为
1
1
1-单元终点都位于
C
o
b
s
C_{obs}
Cobs。每个
1
1
1-单元也是一个开集。
避免这些来自
C
f
r
e
e
C_{free}
Cfree拓扑的奇怪结论的一种方法是在
cl
C
f
r
e
e
\operatorname{cl}C_{free}
clCfree(即
C
f
r
e
e
C_{free}
Cfree的闭集)中构建垂直分解。这可以从前面定义的垂直分解开始,为
C
o
b
s
C_{obs}
Cobs的每个边添加一个新的
1
1
1-单元,并为
C
o
b
s
C_{obs}
Cobs的每个顶点添加一个0-单元。现在
S
3
=
cl
(
C
f
r
e
e
)
S_3=\operatorname{cl}(C_{free})
S3=cl(Cfree),它在
R
2
{\mathbb{R}}^2
R2中闭合。同样,
S
2
S_2
S2、
S
1
S_1
S1和
S
0
S_0
S0正常闭合。然而,每个单独的
k
k
k-单元在拓扑空间
S
k
S_k
Sk中是开放的。唯一奇怪的情况是,0-单元被认为是开集,但这在离散拓扑空间
S
0
S_0
S0中是正确的。
二维分割
垂直分解只是许多单元分解方法中解决 C o b s C_{obs} Cobs为多边形时问题的一种。它在单元数量、计算效率和实现容易性之间提供了很好的平衡。通常可以将 C o b s C_{obs} Cobs分解为更少的凸单元。因为路线图会更小,所以适用于多重查询应用。不幸的是其很难优化单元的数量。使用最小数量凸单元来确定带空洞多边形 C o b s C_{obs} Cobs的分解方法是NP难的。因此,我们愿意容忍非最优分解。
Triangulation Decomposition 三角分割
垂直分解的另一种选择是执行triangulation(三角分解),这将产生一个覆盖
C
f
r
e
e
C_{free}
Cfree的单复形。由于
C
f
r
e
e
C_{free}
Cfree是一个开集,因此没有0-单元。每个
2
2
2-单形(三角形)有一个、两个或三个面,这取决于它的边界有多少是与
C
o
b
s
C_{obs}
Cobs共享的。如图所示,可以通过连接
1
1
1-cells和
2
2
2-cells来规划路径。请注意,对于给定的问题,有很多方法可以三角化
C
f
r
e
e
C_{free}
Cfree。在计算几何中,寻找好的三角剖分(例如,这意味着尽量避免细三角形)受到了相当大的关注。
如何计算三角分解?运行垂直分解算法并将每个梯形分割为两个三角形似乎很有诱惑力。即使这导致了三角形单元,它也不会产生一个单复形(两个三角形可以邻接三角形边的同一侧)。一种简单的方法是通过尝试用一条线段连接一个面的两个顶点来逐步分割面,如果此线段与其他线段不相交,则可以进行拆分(以所有顶点连线互不相交线段的分割)。将这个过程持续地在所有有三个以上顶点的面上执行,直到最终获得三角剖分。不幸的是,这会导致
O
(
n
3
)
O(n^3)
O(n3)的时间复杂度,因为在最坏的情况下必须检查
O
(
n
2
)
O(n^2)
O(n2)对,并且每次检查都需要
O
(
n
)
O(n)
O(n)来确定是否与其他线段相交。通过执行径向扫描,可以很容易地将其降低到
O
(
n
2
lg
n
)
O(n^2 \lg n)
O(n2lgn)。一种算法首先将
C
f
r
e
e
C_{free}
Cfree划分成单调多边形(如果一个多边形基于它y 坐标值最大和最小的两个顶点可以将它的边分成两个单调边序列,则该多边形称为Y 单调多边形,即单调多边),然后对每个单调多边形进行有效的三角剖分。如果
C
f
r
e
e
C_{free}
Cfree是简单连接的,三角剖分竟可以在线性时间内计算。不幸的是,该算法过于复杂,在实践中使用。
Cylindrical Decomposition 柱面分解
柱形分解与垂直分解非常相似,只是垂直线会从
y
=
−
∞
y=-\infty
y=−∞到
y
=
∞
y=\infty
y=∞一路穿过所有面。结果如左图所示,可视为一个奇异复形。与垂直分解相比,这可能显得非常低效;然而,这里提出它是因为它可以很好地推广到任何维度、任何C-空间拓扑和任何半代数模型。因此,这里提出它是为了简化向更一般分解的过渡。圆柱分解的最重要性质如右图所示。考虑两个事件之间的每个垂直条带。从
y
=
−
∞
y=-\infty
y=−∞到
y
=
∞
y=\infty
y=∞遍历条带时,点在
C
o
b
s
C_{obs}
Cobs和
C
f
r
e
e
C_{free}
Cfree之间交替。例如,在事件
4
4
4和
5
5
5之间,边缘
f
f
f下的点位于
C
f
r
e
e
C_{free}
Cfree。
f
f
f和
g
g
g之间的点位于
C
o
b
s
C_{obs}
Cobs。
g
g
g和
h
h
h之间的点位于
C
f
r
e
e
C_{free}
Cfree中,以此类推。可以定义单元分解,以便在
C
o
b
s
C_{obs}
Cobs中创建二维单元。让
S
(
x
,
y
)
S(x,y)
S(x,y)表示逻辑判定。当遍历条带时,
S
(
x
,
y
)
S(x,y)
S(x,y)的值也会交替出现。每个垂直条实际上被认为是一个圆柱,因此,圆柱分解的名称(即,在三维几何意义上不一定有任何圆柱)。