基础概念
配置空间、工作空间
- 机器人配置(Robot Configuration):对机器人上所有点的位姿描述
- 机器人自由度(Robot Degree Of Freedom, DOF):描述机器人路径规划的最少坐标数量 n n n。
- 机器人配置空间(Robot Configuration Space, C-Space):包含机器人所有可能位姿的 n n n维空间
- 机器人位姿在配置空间中假定为一个点
- 机器人工作空间(Robot Workspace):机器人实际工作的复杂环境
障碍物、运动规划
机器人具有不同的形状、尺寸大小,障碍物(Obstacle)的碰撞检测需要了解机器人的形状、大小等属性,较为复杂:
故而,一般在配置空间中做机器人的路径规划问题。已知机器人位姿在配置空间C-space中假定为一个点,例如欧氏空间下的机器人位姿可使用 ℜ 3 × 3 ∈ S O ( 3 ) \Re^{3\times3}\in SO(3) ℜ3×3∈SO(3)进行表示。则可将障碍物进行膨胀得到配置空间中的障碍物(C-Obstacle),若机器人所在点不落在C-Obstacle范围内,则判定机器人处于自由状态下,不会被碰撞:C-Free。
配置空间由障碍物及自由空间组成: ( C − S p a c e ) = ( C − O b s t a c l e ) ∪ ( C − F r e e ) (C-Space)=(C-Obstacle)\cup(C-Free) (C−Space)=(C−Obstacle)∪(C−Free)
移动机器人的运动规划是在机器人的起点 q s t a r t q_{start} qstart到机器人的目标点 q g o a l q_{goal} qgoal之间,处于 C − F r e e C-Free C−Free空间中的规划。
图搜索(Graph Search Basis)
图(Graphs)
图是一种由节点(Nodes)和边(Edges)构成的抽象网络,网络中各个节点由边进行连接,表明两节点存在关系。
节点(Node)
节点表示某个事物或对象,如上图中各个带字母的点。
边(Edge)
边表示事物与事物间的逻辑关系,如上图中两节点间的绿线。
同构(Isomorphism)
同构的两张图具有相同的节点及节点间连接的边,同构图仅存在画法的不同,但包含的逻辑关系不变。
有向图(Directed Graph)、无向图(Undirected Graph)
无向图的边没有方向,而有向图的边具有方向性。
如上图,有向图的方向如下: D → A → G D\to A\to G D→A→G、 D → C → E D\to C\to E D→C→E、 B → A → G B\to A\to G B→A→G、 B → C → E B\to C\to E B→C→E、 B → F → E B\to F\to E B→F→E
权重(Weight)
图上的边具有权重值,每条边的权重可以不同,表示由一个节点至另一个节点的代价值。如下图由节点 A A A到节点 G G G的权重值为4。
路径(Path)、最优路径(Shortest Path)
图上任取两点作为起点与目标点,由起点到目标点,不经过重复节点和边的路线称为路径。由起点到目标点最短的路径称为最优路径,在选择最优路径时往往需要考虑边的权值。
图搜索(Search-based Method )
对图结构进行搜索,从起始节点 S S S到目标节点 G G G,将生成一个搜索树:
通常,构建一个完整的搜索树结构,所需要的代价很高。图搜索算法的基本逻辑如下:
1
:
维
护
一
个
用
于
存
储
所
有
被
访
问
节
点
的
容
器
2
:
容
器
内
初
始
值
为
起
点
X
s
3
:
开
始
循
环
L
o
o
p
4
:
访
问
节
点
:
根
据
预
先
定
义
的
评
分
函
数
(
S
c
o
r
e
F
u
n
c
t
i
o
n
)
从
容
器
中
取
出
一
个
节
点
5
:
扩
展
节
点
:
获
得
该
节
点
的
所
有
邻
居
节
点
6
:
置
入
节
点
:
将
获
得
的
邻
居
节
点
置
入
容
器
7
:
结
束
循
环
E
n
d
\begin{aligned} &1:维护一个用于存储所有被访问节点的容器\\ &2:容器内初始值为起点X_s\\ &3:开始循环Loop\\ &4:\qquad访问节点:根据预先定义的评分函数(Score\:Function)从容器中取出一个节点\\ &5:\qquad扩展节点:获得该节点的所有邻居节点\\ &6:\qquad置入节点:将获得的邻居节点置入容器\\ &7:结束循环End \end{aligned}
1:维护一个用于存储所有被访问节点的容器2:容器内初始值为起点Xs3:开始循环Loop4:访问节点:根据预先定义的评分函数(ScoreFunction)从容器中取出一个节点5:扩展节点:获得该节点的所有邻居节点6:置入节点:将获得的邻居节点置入容器7:结束循环End
循环结束条件一般置为抵达目标节点,或容器中所有节点被弹出,容器为空。
广度优先搜索(Breadth First Search, BFS)
广度优先算法基于队列(Queue)进行,遵从于先进先出的原则进行:
举例说明如下:
广度优先搜索搜先从起点节点 s s s开始,首先弹出节点 s s s,得到三个邻居节点 d 、 e 、 p d、e、p d、e、p并置入容器中;随后弹出其中一个节点 p p p,得到其邻居节点 q q q置入容器;其次,再弹出一个节点 e e e并将其邻居节点 h 、 r h、r h、r置入容器;周而复始,弹出 d d d并将其邻居节点 b 、 c 、 e b、c、e b、c、e置入容器……知道搜索到目标为止。
应注意,对于邻居节点置入容器的顺序需要被确立,如从左到右置入、顺时针置入等方式。
深度优先搜索(Depth First Search, DFS)
深度优先搜索基于堆栈(Stack)进行,遵从于后进先出原则进行:
举例说明如下:
首先,从起点节点 s s s开始搜索,弹出节点 s s s后,得到邻居节点 d 、 e 、 p d、e、p d、e、p并将其置入容器;随后,弹出节点 d d d得到其邻居节点 b 、 c 、 e b、c、e b、c、e置入容器;周而复始,弹出 b b b得到邻居节点 a a a置入容器后,发现对 a a a进行搜索无邻居节点,故而再一次弹出节点 c c c得到其邻居节点 a a a,同样无邻居节点并再次弹出 e e e……直到抵达目标节点 G G G时离开循环。
同样应注意,对于邻居节点置入容器的顺序需要被确立。
效果对比
如下图所示,左侧为BFS右侧为DFS。一般深度优先搜索所得并非最短路径,故而实际在最优路径规划中,采用BFS进行:
贪心算法(Greedy Best First Search)
BFS和DFS算法弹出的下一个节点顺序按照先入先出、后入先出的规则进行,而贪心算法则通过人为指定的规则进行弹出对应节点,称为启发(heuristic)
启发(heuristic)
一个heuristic被定义为:当前点到目标点距离的猜测(Guess),此距离忽略地图中的障碍物,可采用欧氏距离(Euclidean Distance)或曼哈顿距离(Manhattan Distance)进行猜测。
一个heuristic应该易于计算,同时它将给予我们搜索图的方向。
效果对比
在理想环境中,不存在障碍物。与BFS算法相比,贪心算法能够在更短时间内找到最短路径(下图一)。而在效果上,两者规划得到的最优路径相同(下图二):
然而在实际地图环境下,存在大量的障碍物。此时,虽然贪心算法依旧能够较快得到规划路径(下图一),但是所得的路径并非实际上的最优路径(下图二):