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

article/2025/10/4 12:14:46

RRT算法简介

RRT 算法为一种递增式的路径规划算法,算法不断在搜索空间中随机生成采样点,如果该点位于无碰撞位置,则寻找搜索树中离该节点最近的结点为基准结点,由基准结点出发以一定步长朝着该随机结点进行延伸,延伸线的终点所在的位置被当做新的有效结点加入搜索树中。这个搜索树的生长过程一直持续,直到目标结点与搜索树的距离在一定范围以内时终止。随后搜索算法在搜索树中寻找一条连接起点到终点的最短路径。

RRT算法原理

该博客叙述得十分清楚明白,后面的代码实践基本是按照该思路得到:
链接: link

MALTAB代码实现

使用到的地图:

碰撞检测代码:
collisionChecking.m

function feasible=collisionChecking(startPose,goalPose,map)feasible=true;
dir=atan2(goalPose(1)-startPose(1),goalPose(2)-startPose(2));
for r=0:0.5:sqrt(sum((startPose-goalPose).^2))posCheck = startPose + r.*[sin(dir) cos(dir)];if ~(feasiblePoint(ceil(posCheck),map) && feasiblePoint(floor(posCheck),map) && ...feasiblePoint([ceil(posCheck(1)) floor(posCheck(2))],map) && feasiblePoint([floor(posCheck(1)) ceil(posCheck(2))],map))feasible=false;break;endif ~feasiblePoint([floor(goalPose(1)),ceil(goalPose(2))],map), feasible=false; endendfunction feasible=feasiblePoint(point,map)
feasible=true;
if ~(point(1)>=1 &&  point(1)<=size(map,2) && point(2)>=1 && point(2)<=size(map,1) && map(point(2),point(1))==255)feasible=false;
end

节点编号代码:
node_index.m

function n_index = node_index(T_LIST,xval,yval)%This function returns the index of the location of a node in the T_LISTi=1;while ( T_LIST(i,1) ~= xval || T_LIST(i,2) ~= yval )i=i+1;endn_index=i;
end

主函数:
RRT_main.m

%***************************************
%Author: Wang Liang
%Date: 2022-06-21
%***************************************
%% 流程初始化
clc;
clear all; 
close all;x_I=1; y_I=1;           % 设置初始点
x_G=700; y_G=700;       % 设置目标点   这里是地图上的像素点
Thr=30;                 % 设置目标点阈值
Delta= 30;              % 设置扩展步长
%% 建树初始化
T.v(1).x = x_I;         % T是我们要做的树,v是节点,这里先把起始点加入到T里面来
T.v(1).y = y_I;         % 将起始点的坐标加入到结点中
T.v(1).xPrev = x_I;     % 起始节点的父节点仍然是其本身
T.v(1).yPrev = y_I;
T.v(1).dist=0;          % 从父节点到该节点的距离,这里可取欧氏距离
T.v(1).indPrev = 0;     % 
%% 开始搜索并构建树
figure(1);
ImpRgb=imread('map.png');
Imp=rgb2gray(ImpRgb);
imshow(Imp)
xL=size(Imp,1);%地图x轴长度
yL=size(Imp,2);%地图y轴长度
hold on
plot(x_I, y_I, 'ro', 'MarkerSize',5, 'MarkerFaceColor','r');
plot(x_G, y_G, 'go', 'MarkerSize',5, 'MarkerFaceColor','g');% 绘制起点和目标点
count=1;
for iter = 1:3000p_rand=[];%Step 1: 在地图中随机采样一个点x_rand%提示:用(p_rand(1),p_rand(2))表示环境中采样点的坐标p_rand(1)=ceil(rand()*xL); % rand()生成的是0~1均匀分布的随机数,乘以800再向上取整,数便为[1,800]间的整数p_rand(2)=ceil(rand()*yL);p_near=[];%Step 2: 遍历树,从树中找到最近邻近点x_near %提示:x_near已经在树T里min_distance = 1000;for i=1:count distance = sqrt( ( T.v(i).x - p_rand(1) )^2 + ( T.v(i).y - p_rand(2) )^2 );if distance < min_distancemin_distance = distance;index = i;endendp_near(1) = T.v(index).x;p_near(2) = T.v(index).y;    % 找到采样点的最近邻近点p_new=[];%Step 3: 扩展得到x_new节点%提示:注意使用扩展步长Deltap_new(1) = p_near(1) + round( ( p_rand(1)-p_near(1) ) * Delta/min_distance );p_new(2) = p_near(2) + round( ( p_rand(2)-p_near(2) ) * Delta/min_distance );%检查节点是否是collision-freeif ~collisionChecking(p_near,p_new,Imp) continue;endcount=count+1;%Step 4: 将x_new插入树T %提示:新节点x_new的父节点是x_nearT.v(count).x = p_new(1);         T.v(count).y = p_new(2); T.v(count).xPrev = p_near(1);    T.v(count).yPrev = p_near(2);T.v(count).dist = min_distance;          %Step 5:检查是否到达目标点附近 %提示:注意使用目标点阈值Thr,若当前节点和终点的欧式距离小于Thr,则跳出当前for循环new_distance = sqrt( ( p_new(1) - x_G )^2 + ( p_new(2) - y_G )^2 );if new_distance <= Thrplot(p_new(1), p_new(2), 'bo', 'MarkerSize',2, 'MarkerFaceColor','b'); % 绘制x_newline( [p_new(1) p_near(1)], [p_new(2) p_near(2)], 'Marker','.','LineStyle','-'); %连接x_near和x_newline( [x_G p_new(1)], [y_G p_new(2)], 'Marker','.','LineStyle','-'); %连接x_Target和x_newbreak;end%Step 6:将x_near和x_new之间的路径画出来%提示 1:使用plot绘制,因为要多次在同一张图上绘制线段,所以每次使用plot后需要接上hold on命令%提示 2:在判断终点条件弹出for循环前,记得把x_near和x_new之间的路径画出来plot(p_new(1), p_new(2), 'bo', 'MarkerSize',2, 'MarkerFaceColor','b'); % 绘制x_newline( [p_new(1) p_near(1)], [p_new(2) p_near(2)], 'Marker','.','LineStyle','-'); %连接x_near和x_newhold on;pause(0.1); %暂停0.1s,使得RRT扩展过程容易观察
end%% 画出路径
T_LIST = zeros(size(T.v, 2), 5);  % size(),获取矩阵T.v的函数
for i=1:size(T.v, 2)T_LIST(i,1) = T.v(i).x;T_LIST(i,2) = T.v(i).y;T_LIST(i,3) = T.v(i).xPrev;T_LIST(i,4) = T.v(i).yPrev;T_LIST(i,5) = i;
endpath = [];
path_count = 1;
path(path_count,1) = x_G;
path(path_count,2) = y_G;
path_count = path_count + 1;
path(path_count,1) = p_new(1);
path(path_count,2) = p_new(2);
n_index = node_index(T_LIST, p_new(1), p_new(2));
path_count = path_count + 1;
path(path_count,1) = T_LIST(i,3);
path(path_count,2) = T_LIST(i,4);
while path(path_count,1) ~= x_I || path(path_count,2) ~= y_Inew_n_index = node_index(T_LIST, path(path_count,1), path(path_count,2));path_count = path_count + 1;path(path_count,1) = T_LIST(new_n_index,3);path(path_count,2) = T_LIST(new_n_index,4);n_index = new_n_index;
endfor i=size(path,1)-1 :-1: 1line( [path(i,1) path(i+1,1)], [path(i,2) path(i+1,2)], 'Marker','.','LineStyle','-','color','r'); %连接x_near和x_newhold on;pause(0.1); %暂停0.1s,使得RRT扩展过程容易观察
end

运行结果

在这里插入图片描述

C++代码实现

待更新…


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

相关文章

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…

MATLAB | 如何按照任意比例调整颜色条(colorbar)

之前写过的setPivot函数只能把颜色条的中点放到0处或者其他数值处&#xff1a; https://slandarer.blog.csdn.net/article/details/129341645 这次提供的函数可以将任意百分比的点位放置在任意数值处&#xff0c;这个函数大概长这样&#xff1a; 百分比点位设置 function s…