基于图搜索的路径规划算法主要用于低维度空间上的路径规划问题,它在这类问题中往往具有较好的完备性,但是需要对环境进行完整的建模工作,在高维度空间中往往会出现维数灾难。为了解决这些问题,本文将介绍基于随机采样的路径规划算法。这类算法适用于高维度空间,它们以概率完备性(当时间接近无限时一定有解)来代替完备性,从而提高搜索效率。
基于随机采样的路径规划算法又分为单查询算法(single-query path planning)以及渐近最优算法(asymptotically optimal path planning),前者只要找到可行路径即可,侧重快速性,后者还会对找到的路径进行逐步优化,慢慢达到最优,侧重最优性。本文介绍的单查询方法为概率路图算法(Probabilistic Road Map, PRM)、快速随机扩展树算法(Rapidly-exploring Random Tree, RRT)、RRT-Connect算法,渐近最优算法有RRT*算法。
PRM算法首先使用随机采样的方式在环境中建立路径网络图,将连续的空间转换为离散的空间,然后在路径网络图上进行路径规划,解决在高维空间中搜索效率低的问题。
算法流程如下:
采样:在地图中随机撒点,剔除落在障碍物上的点
生成概率路图:根据点与点间的距离和是否存在直线通路将上步中得到的采样点进行连接
搜索路径:使用图搜索算法(如Dijkstra算法)在上步得到的路图中搜索出一条从起点到终点的最短路径
其中采样点的数量和采样点间存在通路的最大距离是路径规划成功与否的关键。
采样点太少,可能会导致路径规划失败,下图(a)中不能生成完整的路图,导致规划失败;而通样是300个采样点,图(b)则能生成一个完整的路图
RRT算法是一种单查询(single-query)算法,目标是尽可能快的找到一条从起点到终点的可行路径。它的搜索过程类似于一棵树不断生长、向四周扩散的过程,它以起点作为根节点构建一棵搜索树
T
T
T。
它的算法流程用伪代码描述如下:
T . i n i t ( x i n i t ) T.init(x_{init}) T.init(xinit)
f o r for for i = 1 , . . . , n i = 1, ..., n i=1,...,n d o do do
x r a n d ← S a m p l e F r e e i x_{rand}←SampleFree_i xrand←SampleFreei;
x n e a r ← N e a r e s t ( T , x r a n d ) x_{near}←Nearest(T, x_{rand}) xnear←Nearest(T,xrand);
x n e w ← S t e e r ( x n e a r , x r a n d ) x_{new}←Steer(x_{near}, x_{rand}) xnew←Steer(xnear,xrand);
i f if if O b t a c l e F r e e ( X n e a r , x n e w ) ObtacleFree(X_{near}, x_{new}) ObtacleFree(Xnear,xnew) t h e n then then
T . a d d _ v e r t e x ( x n e w ) T.add\_vertex(x_{new}) T.add_vertex(xnew)
T . a d d _ e d g e ( x n e a r , x n e w ) T.add\_edge(x_{near}, x_{new}) T.add_edge(xnear,xnew)
V ← V ∪ { x n e w } ; E ← E ∪ { x n e a r , x n e w } V←V\cup\{x_{new}\}; E←E\cup\{x_{near}, x_{new}\} V←V∪{xnew};E←E∪{xnear,xnew};
r e t u r n return return G = ( V , E ) G=(V, E) G=(V,E);
其中 x i n i t x_{init} xinit表示起点, T T T表示随机树,在算法开始时,将起点 x i n i t x_{init} xinit加入到随机树。接下来使用 S a m p l e F r e e SampleFree SampleFree函数在自由空间中随机采样,获得一个采样点 x r a n d x_{rand} xrand,再使用 N e a r e s t Nearest Nearest函数获得随机树中距离 x r a n d x_{rand} xrand最近的一个节点 x n e a r x_{near} xnear;使用 S t e e r Steer Steer函数在 x n e a r x_{near} xnear和 x r a n d x_{rand} xrand的连线上距离 x n e a r x_{near} xnear步长 u u u的位置生成一个节点 x n e w x_{new} xnew,使用 O b t a c l e F r e e ObtacleFree ObtacleFree函数判断 x n e a r x_{near} xnear和 x n e w x_{new} xnew间是否存在直线通路,若存在则将 x n e w x_{new} xnew加入到随机树 T T T的节点集合中,同时将 x n e a r e s t x_{nearest} xnearest作为 x n e w x_{new} xnew的父节点,将边 ( x n e a r e s t , x n e w ) (x_{nearest}, x_{new}) (xnearest,xnew)加入到随机树 T T T的边集中
扩展流程如图:
RRT作为一种随机采样的规划算法,它的复杂度也不受地图的离散程度影响,在高维空间中仍具有很高的搜索效率。但是前面提到RRT是一种单查询算法,只管尽快地找到可行路径,所以最终路径并不是最优的,甚至会非常“绕”。
RRT-Connect在RRT的基础上引入了双树扩展环节,分别以起点和目标点为根节点生成两棵树进行双向扩展,当两棵树建立连接时可认为路径规划成功。通过一次采样得到一个采样点
x
r
a
n
d
x_{rand}
xrand,然后两棵搜索树同时向采样点
x
r
a
n
d
x_{rand}
xrand方向进行扩展,加快两棵树建立连接的速度。相较于单树扩展的RRT算法,RRT-Connect加入了启发式步骤,加快了搜索速度,对于狭窄通道也具有较好的效果。
但是RRT-Connect和RRT一样,都是单查询算法,最终路径并不是最优的。接下来介绍基于随机采样的渐近最优路径规划算法。
RRT*算法是一种渐近最优算法。
算法流程与RRT算法流程基本相同,不同之处就在于最后加入将 X n e w X_{new} Xnew加入搜索树 T T T时父节点的选择策略。
RRT*算法在选择父节点时会有一个**重连(Rewire)**过程,也就是在以
X
n
e
w
X_{new}
Xnew为圆心、半径为
r
r
r的邻域内,找到与
X
n
e
w
X_{new}
Xnew连接后路径代价(从起点移动到
X
n
e
w
X_{new}
Xnew的路径长度)最小的节点
X
m
i
n
X_{min}
Xmin,并重新选择
X
m
i
n
X_{min}
Xmin作为
X
n
e
w
X_{new}
Xnew的父节点,而不是
X
n
e
a
r
X_{near}
Xnear。重连过程的示意图如下:
Lavalle S M . Rapidly-Exploring Random Trees: A New Tool for Path Planning[J]. Research Report, 1999.
Jr J , Lavalle S M . RRT-Connect: An Efficient Approach to Single-Query Path Planning[C]// Proceedings of the 2000 IEEE International Conference on Robotics and Automation, ICRA 2000, April 24-28, 2000, San Francisco, CA, USA. IEEE, 2000.
Karaman S , Frazzoli E . Sampling-based Algorithms for Optimal Motion Planning[J]. The International Journal of Robotics Research, 2011, 30(7):846-894.
因篇幅问题不能全部显示,请点此查看更多更全内容