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

article/2025/10/4 11:23:39

目录

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算法的简介

天下武功唯快不破,是 RRT 的最大优势。RRT 的思想是快速扩张一群像树一样的路径以探索空间的大部分区域,找到可行的路径。RRT 算法是一种对状态空间随机采样的算法,通过对采样点进行碰撞检测,避免了对空间的精确建模带来的大计算量,能够有效地解决高维空间和复杂约束的路径规划问题。与PRM类似,该方法是概率完备且非最优的。可以轻松处理障碍物和差分约束(非完整和动力学)的问题,并被广泛应用于机器人路径规划。

2 RRT算法原理

2.1 算法流程

(1)设定初始点 X_{init} 与目标点 X_{goal},自行设定状态采样空间 M

(2)进行随机采样得到采样点 X_{rand},如果采样点 X_{rand} 在障碍物内,则重新随机采样

(3)若不在障碍物内,计算该采样点 X_{rand} 与集合 \tau (已经生成的节点) 中的所有节点之间的距离,得到离得最近的节点X_{near} ,再从节点 X_{near} 以步长 StepSize\quad(0< StepSize< 1) 走向节点 X_{rand} ,生成一个新的节点 X_{new},若 X_{new} 与 X_{near} 的连线 E_{i} 经过障碍物,则重新随机采样

(4)经过反复迭代,生成一个随机扩展树,当随机扩展树中的子节点进入了我们规定的目标区域,便可以在随机扩展树中找到一条由从初始点到目标点的路径。

2.2 算法伪代码

可以将伪代码与上述算法流程对照起来看

2.3 算法流程图

3 RRT算法matlab实现

3.1 测试地图

%随机生成障碍物
function [f,n1]=ob(n)
f=[];%储存障碍物信息
n1=n;%返回障碍物个数
p=0;
for i=1:nk=1;while(k)D=[rand(1,2)*60+15,rand(1,1)*1+3];%随机生成障碍物的坐标与半径,自行调整if(distance(D(1),D(2),90,90)>(D(3)+5)) %与目标点距离一定长度,防止过多阻碍机器人到达目标点k=0;endfor t=1:p  %障碍物之间的距离不能过窄,可自行调整去测试if(distance(D(1),D(2),f(3*t-2),f(3*t-1))<=(D(3)+f(3*t)+5))k=1;endendend%画出障碍物aplha=0:pi/40:2*pi;r=D(3);x=D(1)+r*cos(aplha);y=D(2)+r*sin(aplha);fill(x,y,'k');axis equal;hold on;xlim([0,100]);ylim([0,100]);f=[f,D];p=p+1;%目前生成的障碍物个数
end
hold all;

3.2 distance函数

function f=distance(x,y,x1,y1)f=sqrt((x-x1)^2+(y-y1)^2);

3.3 RRT算法

clc
clear all
[f,n1]=ob(10);%随机生成障碍物
Xinit=[1,1];%定义初始点
Xgoal=[90,90];%定义目标点
plot(Xinit(1),Xinit(2),'ro');
plot(Xgoal(1),Xgoal(2),'ko');
T=[Xinit(1),Xinit(2)];%已生成节点集合用顺序表的数据结构存储
Xnew=Xinit;
D(1)=0;%初始节点的父节点指向0
while distance(Xnew(1),Xnew(2),Xgoal(1),Xgoal(2))>3  %进入目标区域Xrand=round(rand(1,2)*100)+1;%状态采样空间:横纵坐标均为整数,范围1~100k=1;%进入循环while k==1k=0;%初始化采样成功for i=1:n1if distance(Xrand(1),Xrand(2),f(i*3-2),f(i*3-1))<(f(i*3)+1)%判断随机采样点是否在障碍物内k=1;%采样不成功break;endendXrand=round(rand(1,2)*100);%重新采样endmin=10000;for i=1:size(T,2)/2 %遍历已生成节点集合if distance(T(2*i-1),T(2*i),Xrand(1),Xrand(2))<min  %得到最近的节点min=distance(T(2*i-1),T(2*i),Xrand(1),Xrand(2));Xnear=[T(2*i-1),T(2*i)];endendstepsize=3/distance(Xnear(1),Xnear(2),Xrand(1),Xrand(2));%以一定步长前进,这里选择3Xnew=[Xrand(1)*stepsize+Xnear(1)*(1-stepsize),Xrand(2)*stepsize+Xnear(2)*(1-stepsize)];t=0;%初始状态未碰撞if Xnear(1)>Xnew(1)caiyang=-0.001;elsecaiyang=0.001;endfor i=Xnear(1):caiyang:Xnew(1)%均匀采样进行碰撞检测for j=1:n1if distance(f(3*j-2),f(3*j-1),i,Xnear(2)+(i-Xnear(1))/(Xnew(1)-Xnear(1))*(Xnew(2)-Xnear(2)))<=(f(3*j)+1)t=1;%代表碰撞break;endendif t==1break;endendif t==0T=[T,Xnew(1),Xnew(2)];for i=1:size(T,2)/2 %遍历已生成节点集合if (T(i*2-1)==Xnear(1))&&(T(i*2)==Xnear(2))  %得到最近的节点的索引D(size(T,2)/2)=i;%记录父节点break;endendplot([Xnew(1),Xnear(1)],[Xnew(2),Xnear(2)],'b-');hold on;pause(0.005);plot(Xnew(1),Xnew(2),'r.');xlim([0,100]);ylim([0,100]);end
end
i=size(T,2)/2;
jg=[i];
while D(i)i=D(i); %通过链表回溯if D(i)~=0jg=[D(i),jg];%存储最短路径通过的节点end
end
Fx=T(jg(1)*2-1);Fy=T(jg(1)*2);
i=2;
while jg(i)~=size(T,2)/2x=T(jg(i)*2-1);y=T(jg(i)*2);plot([x,Fx],[y,Fy],'g-');hold on;pause(0.05);Fx=x;Fy=y;i=i+1;
endplot([T(jg(i)*2-1),Fx],[T(jg(i)*2),Fy],'g-');hold on;pause(0.05);    

3.4 动画效果

4 RRT的缺陷

(1)很明显RRT算法得到的路径不是最优的

(2)RRT算法未考虑运动学模型

(3)RRT算法对于狭小的通道的探索性能不好,如下图的对比,有可能探索不到出口

 

(4)没有启发信息的RRT像无头苍蝇,探索空间完全靠运气,如下图

 针对上述缺陷,又出现了很多RRT算法的变种,以后的文章中会介绍。


http://chatgpt.dhexx.cn/article/2uCt0vPI.shtml

相关文章

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

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…