快速扩展随机树(RRT)算法

article/2025/10/4 8:23:06

RRT是Steven M. LaValle和James J. Kuffner Jr.提出的一种通过随机构建Space Filling Tree实现对非凸高维空间快速搜索的算法。该算法可以很容易的处理包含障碍物和差分运动约束的场景,因而广泛的被应用在各种机器人的运动规划场景中。

1. Basic RRT算法

原始的RRT算法中将搜索的起点位置作为根节点,然后通过随机采样增加叶子节点的方式,生成一个随机扩展树,当随机树的叶子节点进入目标区域,就得到了从起点位置到目标位置的路径。

伪代码如下:

上述伪代码中,M是地图环境,x_{init}是起始位置,x_{goal}是目标位置。路径空间搜索的过程从起点开始,先随机撒点x_{rand};然后查找距离x_{rand}最近的节点x_{near};然后沿着到方向前进stepsize的距离得到x_{new}CollisionFree(M, E_i)方法检测Edge(x_{new}, x_{near})是否与地图环境中的障碍物有碰撞,如果没有碰撞,则将成功完成一次空间搜索拓展。重复上述过程,直至达到目标位置。

2. 基于概率的RRT算法

为了加快随机树收敛到目标位置的速度,基于概率的RRT算法在随机树的扩展的步骤中引入一个概率概率p,根据概率p的值来选择树的生长方向是随机生长(x_{rand})还是朝向目标位置生长。引入向目标生长的机制可以加速路径搜索的收敛速度。

基于概率的RRT算法

3. RRT Connect算法

RRT Connect算法从初始状态点和目标状态点同时扩展随机树从而实现对状态空间的快速搜索。

4. 算法说明

我们可以把RRT算法比较形象地看做“树型算法”。它从一个起始构型(对于二维图,就是一个点)出发,不断延伸树型数据,最终与目标点相连。先放一张规划的结果可能更加便于理解:

RRT 算法,从左上角出发呈树型向目标点延伸

算法的步骤如下:

4.1. 初始化

选择或绘制一张bmp格式的图像,作为规划的构型空间,为了便于进行碰撞检测,将其二值化。选择左上角[0, 0]点作为起始点;右下角[499, 499]作为目标点。

原图像
二值化图像

4.2. 随机采样

我们已经确定了规划的起始点,按道理它需要不断地向着目标点进行生长。但需要注意的是,由于存在障碍物,如果我们让树型一味朝着目标点延伸,则可能会因为“撞墙”而失败。因此,我们采取了一种随机采样方法:在每次选择生长方向时,有一定的概率会向着目标点延伸,也有一定的概率会随机在地图内选择一个方向延伸一段距离,关键代码如下:

# 利用rand()函数在[0,1]区间内随机生成一个数
if np.random.rand() < 0.5:# 如果小于0.5,则在图 img_binary 的范围内随机采样一个点sample = np.mat(np.random.randint(0, img_binary.shape[0] - 1, (1, 2)))
else:# 否则用目标点作为采样点sample = self.point_goal

我们每一步让RRT树有0.5的概率直接采样终点向目标点前进,有0.5的概率向地图内任意方向前进。

随机采样一个点,或直接采样终点,概率各一半

4.3. 生长点选择与碰撞检测

从图 2 可以看到,由于每次生长都存在一定的随机性,因此RRT树会逐渐出现许多分支,那么每一步中我们该如何选择要延伸哪个分支呢?这里我们直接选择RRT树中离采样点最近的点,并向其延伸。

假设我们采样了空间中随机一个点,接下来从现有的RRT树中选择离采样点最近的一个点,并向采样点延伸一段距离。假如在这段延伸中没有发生碰撞(碰撞检测),而且新点与现有的所有点的距离大于某个判断阈值(防止生长到RRT已经探索过的位置),则将这个新点也加入RRT树。

4.4. 终止条件

由于我们每次延伸的距离是固定的,所以并不能保证最后一次延伸能够刚好到达终点的位置,更可能的情况是在终点周围来回跳动。因此我们设定一个阈值,假如本次延伸的新点与终点的距离小于这个阈值,我们就认为已经规划成功。

下面是随机采样概率0.5,步长20,采样上限20000次的结果

成功找到路径

4.5. 分析

前面提到,RRT算法是概率完备的,预设参数可能对规划结果造成影响。那么有哪些参数会影响规划效果呢?这里我列举几个:

随机采样概率:

我们每一次采样,都有一定概率朝着任意方向走,或朝着终点走。这个概率显然会影响搜索效果。给人最直接的感觉是,随机采样的概率越大,RRT树的分支也就越多,反之则难以发生新的分支。下面我们修改随机采样概率来看看效果。

设随机采样的概率为0.01,采样上限20000次。可以看到,直到达到采样上限也没有成功找到解。这是因为RRT产生分支的概率太小,经历了许多次碰撞才能凭借分支绕过障碍物。

随机采样的概率为0.01,采样上限20000次

设随机采样的概率为1.0,采样上限20000次。可以看到,虽然规划得以成功,但由于生长缺乏方向性,其实是一种“碰运气”式的搜索。RRT树的分支填充了所有空间直至找到目标点。这样的搜索会消耗大量的时间。

随机采样的概率为1.0,采样上限20000次

生长步长:

我们的RRT树每一次延伸,都有一个固定的步长。这个步长的设置显然也会影响树的形状。当步长太大时,可能由于太过笨拙而无法成功绕过障碍物;当步长过小时,生长的速度显然会有所减慢(因为同样的距离要生长更多次)。一般来说,空间越复杂,步长越小。这里必须注意的是,生长步长一定要比判断是否为同一个采样点的阈值要大。

步长10,采样上限20000次。可以看到,采样点极其密集,消耗的时间更长。

步长10,采样上限20000次

步长200,采样上限20000次。没有搜索到最终结果,可以看到,由于步长太大,生长点在障碍物与终点之间来回跳动,始终不能满足碰撞检测或终止条件的要求。

步长200,采样上限20000次

4.6. 更多演示

RRT算法的适用性同样很广,举例如下:

5. 总结

RRT算法与PRM算法十分类似,都是通过抽样来在已知的地图上建立无向图,进而通过搜索方法寻找相对最优的路径。不同点在于,PRM算法在一开始就通过抽样在地图上构建出完整的无向图,再进行图搜索;而RRT算法则是从某个点出发一边搜索,一边抽样并建图

与PRM算法相同,RRT算法也是概率完备的:只要路径存在,且规划的时间足够长,就一定能确保找到一条路径解。注意“且规划的时间足够长”这一前提条件,说明了如果规划器的参数设置不合理(如搜索次数限制太少、采样点过少等),就可能找不到解。

参考文献

【机器人路径规划】快速扩展随机树(RRT)算法 - 知乎

基于采样的运动规划算法-RRT(Rapidly-exploring Random Trees) - 知乎


http://chatgpt.dhexx.cn/article/Rg4MjZOx.shtml

相关文章

RRT算法及其部分改进算法介绍

基于采样的运动规划算法-RRT&#xff08;Rapidly-exploring Random Trees&#xff09; RRT&#xff1a;一种通过随机构建Space Filling Tree实现对非凸高维空间快速搜索的算法。该算法可以很容易的处理包含障碍物和差分运动约束的场景&#xff0c;被广泛的应用在各种机器人的运…

RRT*算法

简介 RRT* 和RRTconnect一样&#xff0c;是对RRT算法的优化。RRT算法的一个问题在于&#xff0c;它只是找到了可行的路径&#xff0c;不能保证路径是相对优化的。RRT*算法在每次迭代后&#xff0c;都会在局部更新搜索树&#xff0c;以优化路径。 多了两个过程&#xff0c;为&…

RRT算法介绍

RRT算法介绍 RRT算法原理介绍&#xff1a;RRT搜索树与树的生长相类似&#xff0c;即不断生长的同时又向四周扩散。算法以路径起点Xstart作为随机树T的根节点&#xff0c;树中节点xj用集合V存储&#xff0c;节点间的连接用连接边集E存储&#xff0c;所有节点xj满足属于集合Xfree…

【规划】RRT*算法图解

尽管RRT算法是一个相对高效率&#xff0c;同时可以较好的处理带有非完整约束的路径规划问题的算法&#xff0c;并且在很多方面有很大的优势&#xff0c;但是RRT算法并不能保证所得出的可行路径是相对优化的。因此许多关于RRT算法的改进也致力于解决路径优化的问题&#xff0c;R…

RRT算法简介

声明&#xff1a;本文为转载内容非原创&#xff0c;来源会在文末声明&#xff0c;绝无冒犯之意&#xff0c;只为一时复习之方便&#xff0c;侵权必删&#xff01; 感谢原作者写出如此优秀的博文&#xff0c;让我对RRT算法有个大致的理解。 对RRT算法感兴趣&#xff0c;是因为…

RRT 算法原理以及过程演示

RRT 适用于涉及非完整约束场合下的路径规划问题。 RRT 算法为一种递增式的构造方法&#xff0c;在构造过程中&#xff0c;算法不断在搜索空间中随机生成状态点&#xff0c;如果该点位于无碰撞位置&#xff0c;则寻找搜索树中离该节点最近的结点为基准结点&#xff0c;由基准结点…

【机器人学:运动规划】快速搜索随机树(RRT---Rapidly-exploring Random Trees)入门及在Matlab中演示

快速搜索随机树&#xff08;RRT -Rapidly-ExploringRandom Trees&#xff09;&#xff0c;是一种常见的用于机器人路径&#xff08;运动&#xff09;规划的方法&#xff0c;它本质上是一种随机生成的数据结构—树&#xff0c;这种思想自从LaValle在[1]中提出以后已经得到了极大…

【自动驾驶轨迹规划之RRT算法】

目录 1 RRT算法的简介 2 RRT算法原理 2.1 算法流程 2.2 算法伪代码 2.3 算法流程图 3 RRT算法matlab实现 3.1 测试地图 3.2 distance函数 3.3 RRT算法 3.4 动画效果 4 RRT的缺陷 1 RRT算法的简介 天下武功唯快不破&#xff0c;快是 RRT 的最大优势。RRT 的思想是快…

RRT算法

简介 RRT 算法&#xff08;快速扩展随机树&#xff0c;rapidly exploring random tree&#xff09;是一种随机性算法&#xff0c;它可以直接应用于非完整约束系统的规划&#xff0c;不需进行路径转换&#xff0c;所以它的算法复杂度较小&#xff0c;尤为适用于高维多自由度的系…

RRT(快速随机搜索树)算法原理及代码实践

RRT算法简介 RRT 算法为一种递增式的路径规划算法&#xff0c;算法不断在搜索空间中随机生成采样点&#xff0c;如果该点位于无碰撞位置&#xff0c;则寻找搜索树中离该节点最近的结点为基准结点&#xff0c;由基准结点出发以一定步长朝着该随机结点进行延伸&#xff0c;延伸线…

RRT算法原理和代码详解(快速扩展随机树)

文章目录 优缺点伪代码具体流程效率问题代码 优缺点 优缺点先明说&#xff0c;优点RRT Star适用于任何地图&#xff0c;不像A Star&#xff0c;Dijkstra那样受限于栅格地图。 缺点&#xff1a;1.找到的路径可能不是最优的&#xff1b;2.路径可能不符合机器人的运动学动力学模型…

RRT与RRT*算法具体步骤与程序详解(python)

提示&#xff1a;前面写了A*、Dijkstra算法 文章目录 前言一、RRT的原理与步骤二、RRT算法编写的步骤1.算法步骤2.算法的实现 三、RRT*算法编写的步骤1.算法的步骤2.算法的实现 三、所有程序附录RRT算法RRT*算法 前言 RRT和RRT*的区别&#xff1a; RRT的中文名为快速随机探索…

RRT算法原理图解

RRT算法原理图解 开始 本人很懒&#xff0c;习惯了只看不写。废话少说&#xff0c;直奔主题&#xff1a;原始RRT算法原理图文简介&#xff08;图都是我自己按照步骤一幅幅画的——闲的蛋疼&#xff0c;但应该比较直观易懂&#xff0c;能被借鉴参考也算我的功德&#xff09;。 R…

linux中要怎么创建文件夹

我是一个linux初学者,由于工作上面需要,我需要在linux中创建一个文件夹,然后自学了一点点,其实创建文件夹很简单,下面分享给大家,越努力越幸运,共勉! 创建文件夹 mkdir 后面加文件夹名字 例如: mkdir aa 然后第一个文件夹就创好了 假如要在文件夹里面再创一个文件夹就是子目…

Ubuntu系统下如何创建.txt文件

问题 在Ubutnu系统下&#xff0c;右键桌面会发现并没有创建文本文件的选项。 解决 首先进入模板 会发现里面是空的 然后右键在终端打开 输入如下指令 sudo gedit 文本文件保存即可 这个时候在模板文件夹下就有 现在右键的时候就会有一个创建文本文件的选项了。

Linux中创建文件与文件夹

一、创建文件夹 命令&#xff1a;mkdir 文件夹名 例&#xff1a; 一开始home目录下没有test文件夹&#xff0c;命令创建后生成 二、创建文件 命令&#xff1a;touch 文件名 例&#xff1a; 一开始test文件夹下没有boot.properties&#xff0c;命令创建后生成 三、注意事项…

Ubuntu零基础教学-Ubuntu下如何创建.txt记事本文件

环境:Ubuntu20.04 前言: 安装好ubuntu20.04后,发现右键菜单中没有新建空白文件,这样工作的时候需要创建文本文件就不是很方便;那么,基于这里,我们可以通过以下的方式把新建空白文件添加到右键哦! 在此,针对小白系列教学,bug菌专门开放了一个Ubunt…

linux中创建目录

在根下创建一个目录ceshi 1、用mkdir创建目录 2、用ls查看当前目录下的所有文件 3、拷贝需要复制的两个文件 4、将user移动至ceshi下&#xff0c;用move 5、用mv命令来为目录改名 linux中在root用户下创建目录 1、进入root用户目录&#xff0c;输入su后回车 2、查看当前路径…

linux下创建文件和文件夹

使用linux系统会有一些常见的命令&#xff0c;譬如说&#xff0c;创建文件夹&#xff0c;创建文件&#xff0c;这些命令都是比较常见的。 方法/步骤 首先说一下touch 创建二进制文件&#xff0c;用法就非常的简单&#xff0c;touch文件名 之间一定要空格。先查看一下有什么文…

linux创建文件夹命令

我们可以使用mkdir命令在 Linux 或类似 Unix 的操作系统中创建新目录或文件夹。本文将介绍如何在 Linux 或 Unix 系统中创建文件夹&#xff08;也称为“目录”&#xff09;。 操作步骤如下&#xff1a;1.在 Linux 中打开终端应用程序。2.输入mkdir命令。3.输入文件夹名称。 具…