1. 概述
RRT是Steven M. LaValle和James J. Kuffner Jr.提出的一种通过随机构建Space Filling Tree实现对非凸高维空间快速搜索的算法。该算法可以很容易的处理包含障碍物和差分运动约束的场景,因而广泛的被应用在各种机器人的运动规划场景中。RRT算法及其变种包括Basic RRT、基于概率的RRT、RRT Connect和RRT*算法。本文主要介绍basic RRT、基于概率的RRT和RRT Connect算法,后续再介绍RRT*算法。
2. 算法详解
2.1 Basic RRT算法
原始的RRT算法,即basic RRT算法,将搜索的起点位置作为根节点,然后通过随机采样增加叶子节点的方式,生成一个随机扩展树,当随机树的叶子节点进入目标区域,就得到了从起点位置到目标位置的路径。相比较于PRM算法,RRT算法不需要区分学习和搜索阶段。算法伪代码如下图所示,其中M是地图环境,$X_{init}$是起始节点,$X_{goal}$是目标节点:
算法主要思想:
- 将起点初始化为搜索树T的根节点$X_{init}$
- 在空间中采样点$X_{rand}$,按照设定的随机采样概率进行随机采样,其余情况直接将目标点作为采样点
- 从搜索树T中取出距离采样点$X_{rand}$最近的节点$X_{near}$
- 沿着$X_{near}$到$X_{rand}$方向前进Step size,得到$X_{new}$,继而得到连边$(X_{new}, X_{near})$
- 利用CollisionFree方法检测该边是否与地图边界及其内障碍物碰撞
- 如果没有碰撞,则将成功完成一次空间搜索拓展
- 如果碰撞,重新构建
- 重复上述过程,直至达到目标位置
节点扩展过程如下图所示:
2.2 基于概率的RRT算法
基于概率的RRT算法,在随机树的扩展的步骤中引入一个概率概率p,根据概率p的值来选择树的生长方向是随机生长还是朝向目标位置生长。引入向目标生长的机制可以加速路径搜索的收敛速度。算法如下图所示:
基于概率的RRT算法和Basic RRT算法的主要区别在于引入向目标生长的机制,即ChooseTarget()函数。
2.3 RRT Connect算法
RRT-Connect分别以起点和目标点为根节点生成两棵树进行双向扩展,当两棵树建立连接时可认为路径规划成功。通过一次采样得到一个采样点,然后两棵搜索树同时向采样点方向进行扩展,加快两棵树建立连接的速度。如下图所示:
3. 代码实现
1 | from __future__ import division |
参考:https://github.com/hichenway/sampling-based-path-planning
4. 总结和讨论
- 优点
- 快,因为它是随机采样,不需要对空间中所有的点都进行搜索
- 不需要对障碍物空间进行精确建模,因为在碰撞检测时它只需要知道给定节点是否为障碍物就可以,而不需要知道障碍物的范围、形状、大小和精确的模型表示
- 在多维空间中更具优势,维数越高,节点状态就越多,对于传统路径规划方法,很容易导致维数灾难,而RRT为随机采样,只需要随机更多的维数,而不需要采样空间中的每一个状态,因此维数的升高对RRT的效率并不会有太大的影响
- 局限性
- 最显著的一点就是,因为RRT采样的随机性,其得到的路径有很多冗余的节点,增加了路径的长度。最常用也是最简单的优化方法就是剪枝,裁剪掉不必要的节点