RRT算法

article/2025/10/4 11:26:15

简介


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


缺点是得到的路径质量不是很好。需要后处理进一步优化。
思想快速扩张一群像树一样的路径以探索(填充)空间的大部分区域,伺机找到可行的路径。


RRT 的基本步骤是:
  1. 起点作为一颗种子,从它开始生长枝丫;
  2. 在机器人的“构型”空间中,生成一个随机点X;
  3. 在树上找到距离X最近的那个点,记为Y吧;
  4. 朝着X的方向生长,如果没有碰到障碍物就把生长后的树枝和端点添加到树上,返回 2;

 


  

å­ç»´ç©ºé´

 


 六维空间的RRT

å¨è¿éæå¥å¾çæè¿°

实际效果如图。

 

伪代码


function BuildRRT(qinit, K, Δq)T.init(qinit)for k = 1 to Kqrand = Sample()  -- chooses a random configurationqnearest = Nearest(T, qrand) -- selects the node in the RRT tree that is closest to qrandif  Distance(qnearest, qgoal) < Threshold thenreturn trueqnew = Extend(qnearest, qrand, Δq)  -- moving from qnearest an incremental distance in the direction of qrandif qnew ≠ NULL thenT.AddNode(qnew)return falsefunction Sample() -- Alternatively,one could replace Sample with SampleFree(by using a collision detection algorithm to reject samples in C_obstaclep = Random(0, 1.0)if 0 < p < Prob thenreturn qgoalelseif Prob < p < 1.0 thenreturn RandomNode()


 初始化时随机树T只包含一个节点:根节点qinit。首先Sample函数从状态空间中随机选择一个采样点qrand(4行);

然后Nearest函数从随机树中选择一个距离qrand最近的节点qnearest(5行);

最后Extend函数通过从qnearest向qrand扩展一段距离,得到一个新的节点qnew(8行)。如果qnew与障碍物发生碰撞,则Extend函数返回空,放弃这次生长,否则将qnew加入到随机树中。重复上述步骤直到qnearest和目标点qgaol距离小于一个阈值,则代表随机树到达了目标点,算法返回成功(6~7行)。为了使算法可控,可以设定运行时间上限或搜索次数上限(3行)。如果在限制次数内无法到达目标点,则算法返回失败。


为了加快随机树到达目标点的速度,简单的改进方法是:在随机树每次的生长过程中,根据随机概率来决定qrand是目标点还是随机点。在Sample函数中设定参数Prob (probability),每次得到一个0到1.0的随机值p,当0<p<Prob的时候,随机树朝目标点生长;当Prob<p<1.0时,随机树朝一个随机方向生长


原文链接:https://blog.csdn.net/a735148617/article/details/103644670

 

 

 

上图说明了RRT在有障碍物和没有障碍物的情况下探索自由空间的能力。这种特性通常被称为RRT的Voronoi偏差。作为均匀采样的结果,规划器更有可能在更大的Voronoi区域中选择样本,并且树朝着那个自由空间递增地快速增长。

 

RRT路径规划算法

https://blog.csdn.net/aoyousihaiqiuqihuang/article/details/100147478   matlab实现,包括后处理smooth

- 关于后处理,有不同的策略,文中采用的贪心策略,是相对简单的一种

 

一种后处理smooth策略:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import numpy as np
import random
import mathclass Smoother(object):"""@desc; 在规划好的path中,随机选择两个point(中间至少间隔一个point),对选中的两个point采用固定长度的线性插值,若中间插值点未发生碰撞,则用该path替换之前两点之间的path"""def __init__(self):passdef __linecdchecker(self, start, goal):""":param start::param goal::return:"""nps = np.array(start).reshape(-1,1)npg = np.array(goal).reshape(-1,1)nele = math.ceil((abs(npg-nps)/self.__expanddis).max())ratio = np.linspace(0, 1, nele, endpoint=False)jointslist = (nps+(npg-nps)*ratio).T.tolist()for joints in jointslist:iscollided = self.__iscollidedcallback(joints, self.__obstaclelist, self.__robot, self.__cdchecker)if iscollided:return False, []return True, jointslistdef pathsmoothing(self, path, planner, maxiter):"""the path and planner are necessary parametersthe following member variables of planner will be used for smoothing1. jointlimits2. iscollidedcallback3. cdchecker4. robot5. expanddis6. obstaclelist:param path::param planner::return:"""self.__jointlimits = planner.jointlimitsself.__iscollidedcallback = planner.iscollidedcallbackself.__cdchecker = planner.cdcheckerself.__robot = planner.robotself.__expanddis = planner.expanddisself.__obstaclelist = planner.obstaclelistpathlength = len(path)if pathlength <= 3:return pathfor i in range(maxiter):pickpoint0 = random.randint(0, pathlength-3)pickpoint1 = random.randint(pickpoint0+1, pathlength-1)result, addpath = self.__linecdchecker(path[pickpoint0], path[pickpoint1])if result:path = path[:pickpoint0]+addpath+path[pickpoint1:]pathlength = len(path)return path

smooth效果:

 

 


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

相关文章

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.输入文件夹名称。 具…

Linux:创建文件夹

&#xff08;1&#xff09;输入命令&#xff1a;mkdir music&#xff0c;创建文件夹 music&#xff0c;再次查看列表&#xff0c;可以看到多了一个文件夹 music&#xff1b; &#xff08;2&#xff09;输入命令&#xff1a;mkdir a1 a2 a3&#xff0c;批量创建文件夹 a1、文件夹…

linux创建文件

linux创建文件 1、在 Linux 上使用重定向符&#xff08;>&#xff09;创建一个文件 标准重定向符允许我们创建一个 0KB 的空文件。它通常用于重定向一个命令的输出到一个新文件中。在没有命令的情况下使用重定向符号时&#xff0c;它会创建一个文件。 但是它不允许你在创建…

Linux 创建目录和文件

mkdir 创建目录 在linux中&#xff0c;mkdir是创建目录的意思&#xff0c;是“make directories”的缩写&#xff1b;该命令用于创建新的目录&#xff0c;语法为“mkdir [-mp] 目录名”&#xff1b;设置参数“-m”用于手动配置创建目录的权限&#xff0c;设置参数“-p”用于递…

Linux 创建文件

目录 1. 使用重定向符&#xff08;>&#xff09;创建文件 2. 使用 touch 命令创建文件 3. 使用 echo 命令创建文件 4. 使用 printf 命令创建文件 5. 使用 cat 命令创建文件 6. 使用 vi / vim 创建文件 7. 使用 nano 创建文件 8. 使用 head 命令创建文件 9. 使用 tail 命令创…

Python中colorbar全色表

如图&#xff0c;所有cmap可选参数

matplotlib调节colorbar的大小

调节plt.colorbar的fraction系数即可调节colorbar的大小 weight np.random.random([8, 8]) plt.imshow(weight) plt.colorbar(fraction0.05, pad0.05) plt.savefig(tjn.png, bbox_inchestight) plt.show()

python可视化 matplotlib画图使用colorbar工具自定义颜色

python matplotlib画图使用colorbar工具自定义颜色 colorbar&#xff08;draw colorbar without any mapple/plot&#xff09; 自定义colorbar可以画出任何自己想要的colorbar&#xff0c;自由自在、不受约束&#xff0c;不依赖于任何已有的图(plot/mappable)。这里使用的是m…

MATLAB自定义colorbar

matlab画平面分布图时colorbar的设置是非常重要的&#xff0c;好的colorbar不仅使图像更美观&#xff0c;而且能够使人更容易捕捉图上传递的信息。用过matlab的同学都知道matlab默认的colormap是jet, 也就是你画完图后输入“colorbar” 它所显示出来的颜色。此外&#xff0c;ma…