基于matlab的RRTRRT*算法实现以及可视化

article/2025/10/24 12:30:23

学习记录-基于采样的路径规划算法

  • 内容来源
  • RRT
    • 主要步骤
    • 动态效果展示
    • 优缺点:
    • 自己进行的改进尝试
  • RRT*
    • 主要步骤
      • NearC
      • ChooseParent
      • rewire
      • 总结及动态效果图
    • Informed RRT*
    • 其他优化RRT的方式
    • 总结

内容来源

记录学习深蓝路径规划课程-基于采样的路径规划一节的作业和笔记,实现基于matlab的RRT以及RRT*算法实现以及可视化。

RRT

  1. 伪代码
    RRT伪代码
  2. 树结构
    x, y记录此节点位置
    xPrev, yPrev记录父节点位置
    dist记录此节点到起点的距离(与作业源码不符,我自己进行了修改)
    indPrev记录父节点在树中的索引
    在这里插入图片描述

主要步骤

  1. 采样:Sample
    %Step 1:在地图中随机采样一个点x_rand%提示用(x_rand(1), x_rand(2))表示环境中采样点的坐标x_rand = randi(800, 1, 2);  % 全局随机采样
  1. 搜索邻近节点:Near
function [x_near, near_Idx] = Near(x_rand, T)
% 在树T中搜索距离随机点x_rand最近的节点,返回它及其它在树中的索引count = size(T.v,2);min_dis = 10000;for node = 1: countdis = sqrt(power((T.v(node).x-x_rand(1)) ,2) + power((T.v(node).y - x_rand(2)), 2) );if dis<min_dismin_dis = dis;near_Idx = node;x_near(1) = T.v(node).x;x_near(2) = T.v(node).y;endend
end
  1. 生成新节点:Steer
function  x_new = Steer(x_rand, x_near, StepSize)
% 将距离随机点x_rand最近的节点x_near在x_rand方向上平移StepSize的距离,生成新节点x_newdis = distance(x_near, x_rand);% 强迫症,想让新节点坐标为整数,fix 舍余取整(也可不取整数)x_new(1) = fix(((dis-StepSize)*x_near(1) + StepSize*x_rand(1)) / dis);x_new(2) = fix(((dis-StepSize)*x_near(2) + StepSize*x_rand(2)) / dis);
end
  1. 碰撞检测:collisionChecking(作业源码中已给-基于给定的环境图片设计的)
function feasible=collisionChecking(startPose,goalPose,map)
% 输入为两节点坐标和地图信息,若两节点直线连接不会经过障碍物,则返回true, 碰到障碍物则为返回false
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;end
end
if ~feasiblePoint([floor(goalPose(1)),ceil(goalPose(2))],map), feasible=false; endfunction feasible=feasiblePoint(point,map)
feasible=true;
if ~(point(1)>=1 && point(1)<=size(map,2) && ... % x in mappoint(2)>=1 && point(2)<=size(map,1) && ... % y in mapmap(point(2),point(1))==255) % x,y is Freefeasible=false;
end
  1. 添加新节点:AddNode
function T = AddNode(T, x_new, x_near, near_Idx)
% 将collision_free的x_new节点加入树T中,并以x_near为父节点count = size(T.v,2) + 1;T.v(count).x = x_new(1);T.v(count).y = x_new(2);T.v(count).xPrev = T.v(near_Idx).x;T.v(count).yPrev = T.v(near_Idx).y;T.v(count).dist=distance(x_new, x_near) + T.v(near_Idx).dist;  % 该节点到原点的距离T.v(count).indPrev = near_Idx;     %父节点的index
end
  1. 目标节点检测
    %Step 6:检查是否达到目标点附近%提示:x_new, x_G之间的距离是否小于Thr,小于则跳出fordis_goal = sqrt(power(x_new(1)-x_G,2) + power(x_new(2) - y_G, 2) );if dis_goal<ThrbFind = true;break;  % 继续采样优化所得路径end
  1. 路径生成
if bFindpath.pos(1).x = x_G; path.pos(1).y = y_G;path.pos(2).x = T.v(end).x; path.pos(2).y = T.v(end).y;path_cost = sqrt(power(path.pos(1).x-path.pos(2).x ,2) + power(path.pos(1).y  - path.pos(2).y, 2)) + T.v(end).dist;pathIndex = T.v(end).indPrev; % 终点索引值j=0;while 1path.pos(j+3).x = T.v(pathIndex).x;path.pos(j+3).y = T.v(pathIndex).y;pathIndex = T.v(pathIndex).indPrev;if pathIndex == 1breakendj=j+1;end  % 通过父节点索引,由终点回溯到起点path.pos(end+1).x = x_I; path.pos(end).y = y_I; % 起点加入路径
end

动态效果展示

RRT算法在两种场景下的效果展示 normal case & narrow passage
在这里插入图片描述
在这里插入图片描述

优缺点:

专一地搜寻一条从起点到终点的路径,比PRM更有目的性一点(PRM先采样,然后在采样结果基础上后搜索寻找最优路径)
但是很显然RRT得到的路径具有随机性不是最优的,而且效率也不高

自己进行的改进尝试

优化采样函数:
显然RRT采样的方式是全局随机撒点,好处就是只要存在一条从起点到终点的路径,给他足够长的时间,它肯定能找到,这也就是probability complete的性质,但是效率很低,尤其在狭长走廊(narrow passage)的情况下。

我自己想了一种方式来优化它:
在规定的区域进行一定数量的采样,然后渐进移动到下一区域进行采样,当渐进移动到全图后,重点针对终点所在的区域撒点。以此避免全区域随机撒点效率上的不足。
对比这种采样方式和全局随机采样在两种不同环境下的效率表现:

在这里插入图片描述

从数据上看这种方法带来了很大程度的效率提升,在narrow passage情况下更明显,下面这个动图能更明显的表现出这种先渐进全局后重点采样方式的特点

在这里插入图片描述

RRT*

RRT是一种基于采样的最优化路径规划方式
与RRT的区别是,RRT
尽量使新节点以及其周围的节点到起点的cost(可以是路径或者时间等目标函数)最短,而不是仅仅寻找离它近的节点,而且在找到路径后不会停止,而是继续进行采样来优化得到的路径

  1. 伪代码在这里插入图片描述

主要步骤

NearC

以新节点x_new为圆心,记录与新节点之间的cost小于radius的节点以及最近节点x_near的 (集合) X_near。
这里要注意将之前搜索到的最近节点x_near也加到集合中,因为如果新节点附近radius的距离内没节点的话,之后选择父节点时就以x_near为父节点。

function nearNodes = NearC(T, x_new, near_idx)
%  找到离x_new得距离小于radius的所有节点在树中的索引, 连同near_idx一起放入nearNodesnearNodes = [near_idx];num = 2;count = size(T.v,2);radius = 60;for Idx = 1: countx_near = [];x_near(1) = T.v(Idx).x;x_near(2) = T.v(Idx).y;dis = distance(x_near, x_new);if dis<radiusnearNodes(num) = Idx;num = num+1;endend
end

ChooseParent

在节点集合X_near中,以使得新节点到起点cost最小为基准,选择x_new的父节点。

function [x_min, min_idx] = ChooseParent(X_nears, x_new, T)
% 在邻近集合X_nears中,找到使得x_new通往起点距离最短的父节点
nearest = [];
min_cost = 10000; %计算x_new->nearest node->起点需要的cost
count = size(X_nears, 2);for i = 1:countnearest(1) = T.v(X_nears(i)).x;nearest(2) = T.v(X_nears(i)).y;cost = distance(nearest, x_new) + T.v(X_nears(i)).dist; if cost<min_costmin_cost = cost;x_min = nearest;min_idx = X_nears(i);end
end
end

rewire

遍历x_new的邻近节点,查看它们通过x_new节点到达起点的这条路径,是不是比它们之前的路径要短,如果是则将x_new更新为它们的新父节点。
这个过程要注意,在更新父节点的之前,先要进行新路径的碰撞检测,确保路径合理性。

function T = rewire(T, X_nears, x_new, Imp)
% 对于除了最近节点x_near外的邻近节点来说 若通过x_new使其到起点的距离更短,更新x_new作为它的父节点,
count = size(X_nears, 2);
new_idx = size(T.v, 2);for i = 2:countpre_cost = T.v(X_nears(i)).dist; near_node(1) = T.v(X_nears(i)).x;near_node(2) = T.v(X_nears(i)).y;tentative_cost = distance(near_node, x_new) + T.v(new_idx).dist; % 通过x_new到起点的costif ~collisionChecking(near_node, x_new,Imp)  % rewire过程中也要碰撞检测continue;endif tentative_cost<pre_cost  % 若通过起点使cost降低,改变其父节点为x_newT.v(X_nears(i)).xPrev = x_new(1);T.v(X_nears(i)).yPrev = x_new(2);T.v(X_nears(i)).dist = tentative_cost;T.v(X_nears(i)).indPrev = new_idx;end
endend

总结及动态效果图

整个过程中要注意权衡NearC函数中radius变量的大小,如果过大的话在更新邻近节点父节点时,其步长可能会大于步长Delta,太小的话因为覆盖面积小,算法整体效率也会降低。
看一下动态图的展示效果
在这里插入图片描述

Informed RRT*

在RRT中,当初始路径已经生成之后,如果重点在初始路径周围进行采样的话,可以明显提高路径优化效率。Informed RRT就是进一步优化了采样函数,采样的方式是以起点和终点为焦点构建椭圆形采样区域。
在这里插入图片描述

其他优化RRT的方式

  1. 优化树结构-kd tree
    树结构的优化会带来搜索效率上的很大提升,之前在matlab代码里Near function中搜索临近节点用的是暴力搜索,显然效率比较低,而将其优化成类似于二叉树的形式会将其搜索效率从O(n)提高为O(logn)。
    在这里插入图片描述
    在这里插入图片描述
  2. Bidirectional RRT

从起点和终点各建立一个树,当其树杈相碰时搜索结束。这种方法显然对narrow passage问题有很好的优势,而且也很新颖。
在这里插入图片描述
在这里插入图片描述

总结

RRT及其变种都是依托于采样+在树结构上加减枝的形式进行路径规划的,具有probalility complete特性,但是效率稳定性不高。不过可以针对性地对其主要函数进行优化进行效率的改进:优化采样,优化树结构等。
在文中我也提出了一些自己的简单的优化想法,有不足的地方希望和大家一起学习探讨。源码:https://github.com/Z-SB/Motion-Planning-Shenlan


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

相关文章

RRT基本概念

原文地址 快速探索随机树&#xff08;RRT&#xff09;是一种通过随机构建空间填充树来有效搜索非凸&#xff0c;高维空间的算法。树是从搜索 空间中随机抽取的样本逐步构建的&#xff0c;并且本质上倾向于朝向大部分未探测区域生长。 RRT由Steven M. LaValle 和James J. Kuf…

SQLSERTVER安装教程

很久没有安装过这个了&#xff0c;今天安装有点生疏了&#xff0c;这里记录一下分享 分为三块块1、下载地址&#xff0c;2、安装图解 &#xff0c;3、安装失败问题 1、sqlserver 2008 r2 百度下载地址链接&#xff1a;下载 cn_sql_server_2008_r2_enterprise_x86 Microsoft…

sqlserver安装目录_SQL Server 2016数据库安装

SQL SERVER 2016较之前的SQL安装有些不同,下面详细介绍如何将SQL SERVER 2016安装到Windows的服务器。 一、第一阶段,SQL安装 1.首先具备SQL SERVER 2016的安装介质。一般可能是下载的为ISO光盘镜像文件。在Windows Server 2016操作系统和Windows 10的系统中可以使用鼠标的右…

Sql Server安装时遇到polybase问题

错误&#xff1a;以域格式&#xff08;域\用户名&#xff09;指定账户。对于本地用户&#xff0c;请采用&#xff08;本地主机\用户名&#xff09;格式。 在安装时选了polybase&#xff0c;需要手动输入账户&#xff0c;如果不需要该服务或没有账户&#xff0c;可以不要勾选po…

SQL Server 安装教程

目录 第一阶段&#xff1a;安装SQL Server向导 第二阶段&#xff1a;安装SQL Server 第三阶段&#xff1a;安装SQL Server管理工具 运行SSM 参考链接 第一阶段&#xff1a;安装SQL Server向导 以下以中文版为例&#xff1a; 中文版官网&#xff1a;https://www.microsoft.com/…

SQL Server 基础操作(一)安装数据库

Windows server 2012 R2系统 安装SQL Server 2008数据库 1.创建虚拟机---安装Windwos server 2012 R2 操作系统 2.安装windows server 2012 R2系统完成后&#xff0c;更换SQL Server 2008 iso镜像 3.安装.NET Framework 3.5&#xff0c;一直点击下一步在.NET Framework 3.5选项…

sqlserver 2016 安装

1、环境介绍 操作系统&#xff1a;windows server 2016 sqlserver版本&#xff1a; sqlserver 2016 下载地址&#xff1a; https://msdn.itellyou.cn/ 2、双击下载下来的镜像&#xff0c;打开setup开始安装 3、选择全新安装 4、选择输入秘钥&#xff0c;下一不 5、接受许可…

SQLserver的安装

SQLserver的安装 一、SQLserver的安装步骤 1.SQLserver的下载&#xff1a;官网下载网址 下载Developer版本即可。 2.运行完成后安装类型选择“基本” &#xff0c;之后选择合适的语言和安装位置。 3.显示“成功完成安装”后&#xff0c;不急于点击完成退出&#xff0c;应点…

SQL Server无法安装问题

SQL Server无法安装问题 一、软件安装“无法使用此产品的安装源,请确认安装源存在并且你可以访问它安装过程中遇到无法访问您试图使用的功能所在的网络位置问题一、软件安装“无法使用此产品的安装源,请确认安装源存在并且你可以访问它 原因:之前版本卸载没有卸载干净(主要…

mysql 2005 安装教程_sql2005 安装教程 图文

SQL2005安装安装步骤 安装Microsoft SQL Server 2005 数据库步骤&#xff1a; 第一步&#xff1a;将Microsoft SQL Server 2000安装光盘放入光驱中&#xff0c;在光驱目录下&#xff0c;点击Setup.exe安装程序开始安装过程&#xff0c; 或使用镜像安装文件。选择“基于X86的操作…

SQLserver2005 安装

解压cs_sql server_2005_ent_x64_dvd.iso镜像文件。打开Servers文件夹找到setup.exe双机点击安装。出现程序兼容助手提示&#xff0c;点击运行程序。 3、用户许可协议&#xff0c;选择我接受&#xff0c;点击下一步。 4、安装必要组件&#xff0c;点击安装。 5、安装必要组件&a…

Elasticsearch插件:elasticsearch-sql安装和使用

使用此插件&#xff0c;您可以使用熟悉的SQL语法查询elasticsearch。您还可以在SQL中使用ES函数。 有两种方法可以使用此插件&#xff1a; 使用其余的api http://localhost:9200/_sql?sqlselect * from indexName limit 10 2. 或者通过浏览器访问 http://localhost:9200/…

sqlserver2012安装教程

前言&#xff1a; 我们实验室开发前端界面一般用.net&#xff0c;然后数据库用微软的Sqlserver,搭配起来做一些系统框架还是很方便的。记得本科的时候安装Sqlserver的时候好像出了点问题&#xff0c;不知道是不是因为先安装了VS&#xff0c;然后这一次我打算先安装Sqlserver&am…

SQLServer2008安装教程

因为对接老系统的数据&#xff0c;上面使用的SQLServer2008&#xff0c;所以本机也需要SQLServer2008作对接。 首当其冲的就是SQLServer2008的安装。 1.下载sqlServer2008的安装包 2.在安装包中点击setup.exe 2.选择安装&#xff0c;再选择全新安装 3.安装规则检测&#xff…

SQL server安装问题汇总

SQLTOC 欢迎使用Markdown编辑器 安装SQL Server遇到的几个问题 1.安装过程中最后出现“数据库引擎服务安装失败”&#xff0c;报错代码&#xff1a;1722&#xff0c;安装时选择“全新SQL server安装或向现有安装添加功能”&#xff0c;安装成功了。 2.安装过程出现“以前的某…

MySQL可视化工具HeidiSQL安装与使用

之前mysql可视化工具一直使用navicat for mysql工具,后来想学一下其他的数据库,把navicat for MySQL卸载后,网上找教程下载安装了navicat premium,但是破解之后的一段时间内,激活码失效了,由于navicat for mysql工具安装也需要破解,便不想安装了,就找到这款免费的MySQL可视化工…

SQL安装步骤及可能遇到的错误

SQL Server 2017下载内容分为两部分SQL Server 2017 Developer和SQLserver Mamngement Studio 第一部分&#xff1a; 1.官网下载SQL Server 2017 Developer https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.打开安装软件&#xff0c;选择自定义 3选择语…

mysql安装步骤

针对windows操作系统&#xff0c;使用mysql8免安装版本。 1、在官网下载对应的压缩文件&#xff0c;放到本地文件夹下&#xff0c;解压缩。 2、配置Path环境变量&#xff1a;指向mysql的bin文件夹路径&#xff0c;C:\software\mysql-8.0.23-winx64\bin。 3、在mysql根目录下…

我的老公是IT男

我家老公是个资深IT男&#xff0c;结婚这么多年以来&#xff0c;工作日一起吃晚餐的次数屈指可数&#xff01;因为要加班&#xff5e; 对老公的工作谈不上支持&#xff0c;但至少不能扯后腿吧。 晚上自己吃饭自己遛弯&#xff0c;倒也还清净。 成家立业后&#xff0c;才觉出…

IT人的事业情结

IT人的事业情结 对事业的认知主要来自学生时代的那些影视作品&#xff0c;不管是白手起家、还是承袭祖业&#xff0c;有一家自己的小面店做得风生水起、门庭若市&#xff0c;便是年少轻狂的心中完美的事业愿景。 毕业之初进入一家当地小有名气民营企业&#xff0c;兢兢业业研发…