Configuration Space(配置空间)Robot configurationRobot degree of freedom (DOF)Robot configuration spaceC-SpaceC-space 中就是一个点而已。C-space ObstaclePlanning in workspaceworkspace,简单来说其实就是机器人真实的一个工作空间,就是我们所处的物理世界。如果在物理世界中进行机器人的一个路径规划,其实是一个比较麻烦的事情,有如下两个原因:
C-space 这一概念Planning in C-space
C-space 中,机器人被抽象为了一个 C-space 中的一个点,例如三维空间中机器人可以由 position(a point in
R
3
R^3
R3),pose (a point in
S
O
(
3
)
SO(3)
SO(3))C-space 中去,是一个在规划前要完成的工作,我们称这些障碍物为 C-space 中的障碍物,或者称为 C-obstacleC-free 中找一个连接
q
s
t
a
r
t
q_{start}
qstart 和
q
g
o
a
l
q_{goal}
qgoal 的路径C-space 中去,其实严格上来说也不算是加入,只是以某种方式对规划时使用的地图进行了一定方式的变动,使得在后续的路径规划中可以忽略机器人的一个形状和大小的约束,从而简化规划问题的难度。C-space 表示障碍物可能非常复杂。 因此在实践中使用了近似(但更保守)的表示,例如下图所示是将机器人通建模为一个半径为
r
r
r 的球形:
首先图这个概念相信大家或多或少的在本科学习中都会接触到图论相关的内容,简单来说图是由节点和边构成的。根据节点和边的不同形式还可以分成无向图,有向图,赋权图等等。下面是一些例子。
无向图


赋权图

状态空间图 (state sapce graph)
搜索算法的数学表示,即将一张图抽象成数学上的表达形式
state space graphstate space graph

一个基于图搜索的大致流程可以归结为如下步骤
score function
\quad 显而易见,问题3则是解决图搜索问题或者说基于搜索的路径规划问题的核心问题,起初,我们并不知道目标点在图中的哪个位置,因此我们只能尝试去遍历图中的所有节点,当到达目标节点的时候则停止遍历即可,那么下面的一个问题则变成了如何高效的进行图的遍历,从而快速的找到目标点。
\quad
学过一点关于图论的同学可能知道,图的遍历遍历一般是基于两种方法,即我们通常所说的深度优先遍历(DFS)和广度优先遍历(BFS),两者的遍历方式有一定的区别,首先在编程实现的时候,所对应的数据结构一个对应的是堆,一个对应的则是栈,具体如下图所示:


\quad
策略:移除/扩展容器中深度最大的节点,若深度一样,则根据自定义的策略进行选择移除(即后文所说的 Heuristic Function)
\quad
具体的实现如下图所示,维护一个 last in first output container (i.e. statck)

\quad
下面通过一个动图来展示这一过程,根据图中的编号,节点会依次的进行扩展和遍历。

\quad
广度优先搜索的策略:移除/扩展容器中最浅层的节点。
\quad
实现方式:维护一个 first in first output container (i.e. queue)

\quad
下面通过一个动图来展示这一过程,根据图中的编号,节点会依次的进行扩展和遍历。


\quad 从图中可以明显的看到虽然两个方法都可以找到最终的目标点,但是 DFS 明显找到的不是最优解,即并不是最短路。这里我们只是直观上说明 DFS 不能找到最优路径,事实上也确实不行因此在后面的讨论中,我们值讨论基于 BFS 的遍历方式。
\quad BFS 和 DFS 在选择下一个节点的时候,仅仅是依靠当前 container 中谁是 “first in” 或者谁是 last in 进行判断。
\quad 贪心算法进行搜索则是根据一种 heuristic function 进行选择,从而选择认为(最好的节点)
Heuristic Definition:
A heuristic is a guess of how close to you are to the target。即启发式是一个对当前点距离目标点多远的猜测,那么我们自然就可以使用两点之间的一个范式距离来判断猜测了,下图就表示了利用欧式距离和曼哈顿距离当作 heuristic 时所猜测的距离。

heuristic 应当满足以下两点:
启发式搜索可以指导你朝着一个尽可能正确的方向向目标点靠近。
启发式函数应当是非常简单进行计算的,因为本身我们在不使用启发式搜索时,单单通过广度优先遍历是可以找到一个起点到目标点的最有解的,但是其速度比较慢,因此才加入启发式搜索,但如果启发式函数计算较为复杂,反而会增加计算时间,得不偿失,启发式搜索也就是去了意义。
\quad 下面对 BFS 和 Greedy Best-First Search 通过一张动图进行简单对比(环境过于简单,起点和终点之间没有障碍物)。

\quad 看起来贪心搜索的表现确实不错。接下来看看如果在图中加入障碍物会怎么样。

\quad 很遗憾,贪心搜索失败了,并没有找到最优路径,太过于注重眼前利益。
\quad 导致这种问题i的原因是什么呢?在接下来的讨论中揭晓。