手把手教学RRT*(RRTSTAR)三维算法MATLAB仿真(代码可直接运行,视频手把手教学)

这篇具有很好参考价值的文章主要介绍了手把手教学RRT*(RRTSTAR)三维算法MATLAB仿真(代码可直接运行,视频手把手教学)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在我以前的作品里有关于RRT算法的视频和代码,今天主要讲解一下RRT*算法的原理。RRT*算法主要是在RRT算法的基础上加上了重写父节点和随机重连的两个步骤。具体的实现方式我想以视频的方式向大家讲解,个人感觉讲解的十分详细。视频连接在这里,希望大家看完有任何不懂的地方直接指出。

        视频中还讲述了RRT*算法的整套代码实现流程以及代码的手把手教学。代码内容清晰易懂,且低耦合。而且可以通过注释掉相应模块后直接变为传统RRT算法。下面是效果图。

rrt*算法matlab,matlab,开发语言rrt*算法matlab,matlab,开发语言

        其中左侧是传统RRT算法,右侧是RRT*算法,通过图片可以看出,RRT*算法相比于传统RRT算法节点收敛性好。下面是全部代码展示,还是挺多的。。。。。

rrt*算法matlab,matlab,开发语言

        下面是部分代码,代码获取方式我放在了评论区(不用复制了,指定是运行不成功,我就是单纯凑字数,混个播放量)。

首先是main函数,通过增加路径点可以实现多目标点路径规划。

%% 清空变量
clear;
clc;

%% 变量定义 
axisStart = [0 0 0];                                 %空间起始坐标
axisLWH = [1000 1000 1000];                          %空间长宽高
cubeInfo.exist = 0;                                  %长方体是否存在,若存在则置为1
cylinderInfo.exist = 0;                              %圆柱体是否存在,若存在则置为1
sphereInfo.exist = 0;                                %球是否存在,若存在则置为1
pathPoint = [0     0    0;
            600 200 300;
             600  600  200];                         %一系列的路径点
cubeInfo = CreateCubeObject(cubeInfo);               %创建长方体障碍物信息
cylinderInfo = CreateCylinderObject(cylinderInfo);   %创建圆柱体障碍物信息
sphereInfo = CreateSphereObject(sphereInfo);         %创建圆柱障碍物信息

%% 画图
DrawPicture(cubeInfo,cylinderInfo,sphereInfo,pathPoint,axisStart,axisLWH);

%% 寻找路径
totalPath = [];
for k1 = 1:size(pathPoint,1)-1
    startPoint = pathPoint(k1,:);
    goalPoint = pathPoint(k1+1,:);
    [path,T] = RRTStar(axisStart,axisLWH,startPoint,goalPoint,cubeInfo,cylinderInfo,sphereInfo);
    
    if ~isempty(path)
        for k2 = 1:size(path,1)-1
            line([path(k2,1),path(k2+1,1)],[path(k2,2),path(k2+1,2)],[path(k2,3),path(k2+1,3)],'LineWidth',1,'Color','red');
        end
        totalPath = [totalPath ;path];
    end
    
end

pathLength = 0;
for k1 = 1:size(totalPath,1)-1
    pathLength = pathLength+CalcuDistance([totalPath(k1,1) totalPath(k1,2) totalPath(k1,3)],[totalPath(k1+1,1) totalPath(k1+1,2) totalPath(k1+1,3)]);
end
disp(['路径长度为:',num2str(pathLength)]);

接下来是最核心代码,RRTStar函数,内部可修改一些参数实现不同效果。

function [path,T] = RRTStar(axisStart,axisLWH,startPoint,goalPoint,cubeInfo,cylinderInfo,sphereInfo)
%% 变量定义
iterMax = 5000;                         %最大迭代次数
iter = 0;                               %当前迭代次数
step = 10;                              %步长
count = 1;                              %计数器
Thr = 10;                               %阈值
randProbability = 0.8;                  %随机采样概率,范围0-1之间,越大随机性越大。越小导向性越大,收敛快,但是容易找不到路径
r = 5*step;                             %影响范围,若大一点路径规划效果好,但是迭代慢。若小一点,路径规划效果和rrt算法越贴近
flag = 0;                               %路径规划参数,当规划失败时返回0,规划成功返回1
%%%%%%%%%%%   配置树的信息    %%%%%%%%%%
T.x(1) = startPoint(1);
T.y(1) = startPoint(2);
T.z(1) = startPoint(3);
T.pre(1) = 0;
T.cost(1) = 0;
path = [];

while iter<=iterMax
    %% 迭代次数加1
    iter = iter+1;
    %% 空间中随机采样
    randCoor = RandSample(axisStart,axisLWH,goalPoint,randProbability);    
    %% 寻找树上最近的点
    [nearestCoor,parentIndex] = FindNearstPoint(T,randCoor);  
    %% 根据指定步长扩展新的点
    newCoor = ExpandPoint(nearestCoor,randCoor,step);    
    %% 重写
%     parentIndex = RewriteFunction(T,newCoor,r,parentIndex);        
    %% 碰撞检测
    A = [T.x(parentIndex),T.y(parentIndex),T.z(parentIndex)];
    B = newCoor;
    collisionFlag = CollisionDetection(cubeInfo,cylinderInfo,sphereInfo,A,B,step);    
    if collisionFlag
        continue;
    end   
    %% 将新点插入进来
    count = count + 1;
    T.x(count) = newCoor(1);
    T.y(count) = newCoor(2);
    T.z(count) = newCoor(3);
    T.pre(count) = parentIndex;
    T.cost(count) = CalcuDistance(A,B)+T.cost(parentIndex);    
    line([A(1),B(1)],[A(2),B(2)],[A(3),B(3)],'LineWidth',1);   % 要是想只画最终的路径图,不画扩展图就把这行注释掉
    pause(0.01)  %不想看动画,就把这行注释        
    %% 随机重连
%     T = RandRelink(T,newCoor,cubeInfo,cylinderInfo,sphereInfo,step,r);   
    if CalcuDistance(newCoor,goalPoint)<Thr
        flag = 1;
        break;
    end    
end
%% 路径规划失败直接返回
if ~flag 
    disp('路径规划失败');
    return;
else
    disp('路径规划成功');
end

%% 寻找路径
path = FindPath(T,startPoint,goalPoint);

接下来是RRT*算法核心部分,重写和随机重连部分

function parentIndex = RewriteFunction(T,newCoor,r,parentIndex)
%% 重写函数,将新点newCoor重新连接到代价最小

% 下面是寻找到潜在的父节点,在变量potentialParent里
potentialParent = -ones(1,size(T.x,2));
count = 1;
for k1 = 1:size(T.x,2)
    if CalcuDistance(newCoor,[T.x(k1),T.y(k1),T.z(k1)])<r
        potentialParent(count) = k1;
        count = count+1;
    end
end
potentialParent(potentialParent==-1)=[];

%迭代寻找最小代价,并重新选择新节点newCoor的父节点,并把parentIndex改为新父节点对应的索引
for k2 = 1:size(potentialParent,2)
    % potentialParent(k2)潜在父节点的序号
    pp = [T.x(potentialParent(k2)),T.y(potentialParent(k2)),T.z(potentialParent(k2))];
    p = [T.x(parentIndex),T.y(parentIndex),T.z(parentIndex)];
    if (CalcuDistance(pp,newCoor)+T.cost(potentialParent(k2)))<(CalcuDistance(p,newCoor)+T.cost(parentIndex))
        parentIndex = potentialParent(k2);
    end
end
function T = RandRelink(T,newCoor,cubeInfo,cylinderInfo,sphereInfo,step,r)
%% 随机重连,将新节点newCoor周围节点的父节点尝试改为新节点,若代价小于原来的代价值,则确认更改

% 寻找需要需要修改父节点的节点放入potentialParent里面。
potentialParent = -ones(1,size(T.x,2));
count = 1;
for k1 = 1:size(T.x,2)
    if CalcuDistance(newCoor,[T.x(k1),T.y(k1),T.z(k1)])<r
        potentialParent(count) = k1;
        count = count+1;
    end
end
potentialParent(potentialParent==-1)=[];

% 找到新节点的父节点集合,存在变量Index里
Index = -ones(1,size(T.x,2));
index = T.pre(end);
count = 1;
while T.pre(index)~=0
    Index(count) = index;
    index = T.pre(index);
    count = count+1;  
end
Index(Index==-1) = [];
potentialParent(ismember(potentialParent,Index)==1) = [];  %这行的意思是把需要修改父节点的节点集合,剔除新节点的父节点,以免出现环

% 根据代价决定是否修改父节点
for k2 = 1:size(potentialParent,2)
    pp = [T.x(potentialParent(k2)),T.y(potentialParent(k2)),T.z(potentialParent(k2))];
    if T.cost(potentialParent(k2))>( T.cost(end)+ CalcuDistance(pp,newCoor))
        if ~CollisionDetection(cubeInfo,cylinderInfo,sphereInfo,pp,newCoor,step)
            
            T.pre(potentialParent(k2)) = size(T.x,2)+1;
            T.cost(potentialParent(k2)) = CalcuDistance(newCoor,pp);
        end
    end
end

随机采样函数

function randCoor = RandSample(axisStart,axisLWH,goalPoint,randProbability)
%% 随机采样,当小于某一概率时,采用随机采样,其他情况直接将目标点作为采样点
if rand<randProbability 
    randX = rand*axisLWH(1)+axisStart(1);
    randY = rand*axisLWH(2)+axisStart(2);
    randZ = rand*axisLWH(3)+axisStart(3);
    randCoor = [randX,randY,randZ];
else
    randCoor = goalPoint;
end

 找到最近节点函数

function [nearestCoor,parentIndex] = FindNearstPoint(T,randCoor)
%% 遍历整个树,寻找距离随机点randCoor最近的点,标记为nearestCoor
tempDis = inf;
parentIndex = -1;
for k1 = 1:size(T.x,2)
    dis = CalcuDistance(randCoor,[T.x(k1),T.y(k1),T.z(k1)]);
    if dis<tempDis
        tempDis = dis;
        parentIndex = k1;
    end
end
nearestCoor = [T.x(parentIndex),T.y(parentIndex),T.z(parentIndex)];

 根据步长扩展点

function newCoor = ExpandPoint(nearCoor,randCoor,step)
%% 按照指定步长,随机点方向扩展新的点,命名为newCoor。这里按步长扩展点采用球坐标与直角坐标的转化方式
deltaX = randCoor(1)-nearCoor(1);
deltaY = randCoor(2)-nearCoor(2);
deltaZ = randCoor(3)-nearCoor(3);

r = sqrt(deltaX^2+deltaY^2+deltaZ^2);
fai = atan2(deltaY,deltaX);
theta = acos(deltaZ/r);

x = step*sin(theta)*cos(fai);
y = step*sin(theta)*sin(fai);
z = step*cos(theta);

newCoor = [x+nearCoor(1),y+nearCoor(2),z+nearCoor(3)];

 这些是代码中最核心的部分,因为代码太多,不在这里展示过多,具体获取方式可以看我b站视频(up主名字叫“-不秃头-”)。代码实际上是不免费的,是因为有人拿着我开源代码去卖(很难理解)。但是如果你要是真想学代码,帮我公众号和b站点个关注,我也能免费给你,但你不能拿去赚钱,就当我谢谢你了。文章来源地址https://www.toymoban.com/news/detail-854247.html

到了这里,关于手把手教学RRT*(RRTSTAR)三维算法MATLAB仿真(代码可直接运行,视频手把手教学)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Kafka】手把手SASL,SSL教学

    Kafka支持以下SASL机制:GSSAPI 、PLAIN、 SCRAM-SHA-256、 SCRAM-SHA-512、 OAUTHBEARER。 本指南主要以SCRAM机制配置为主。 当使用SCRAM机制时,Kafka使用Zookeeper存储用户加密后的凭证,所以需要先使用Kafka提供的脚本进行用户的创建。 比如创建用户名为kafkaAdmin,密码为admin用户的操作命令如

    2024年01月17日
    浏览(42)
  • 手把手教学搭建ntp服务器

    目录 一 配置服务端(172.17.0.214) 第一步 查看当前时区和时间  第二步 安装ntp服务端 第三步 查看ntp服务状态:systemctl status ntpd 第四步 编辑ntp配置 第5步 启动ntp  第六步 设置开机自启 第七步 查看配置: ntpq -p 二 配置客户端 (172.17.0.215/216) 第一步 安装ntp:yum install ntp n

    2024年02月06日
    浏览(60)
  • Kaggle 新手入门必看,手把手教学

    Add Data 的路径:/kaggle/input git clone 的路径:/kaggle/working 1.进入官网 Kaggle 点击 Register 进行账号注册 2.随便点一个方式注册,本人用的邮箱 3.点进去填写对应信息进行注册,点击 next 即可 1.如果你看到是这个界面 2.如果你看到的是这个界面 Kaggle 新建 kernel 有两种方式,这个主要

    2024年01月25日
    浏览(46)
  • 基于FPGA:多目标运动检测(手把手教学①)

          在3月份发表了基于FPGA:运动目标检测(原理图+源码+硬件选择,可用毕设)后反应很强,很多同学表示,希望我们能 在运动目标检测的基础上 , 做多目标运动检测。 最近跟其他两个工程师刚好有空,就把就版本的工程 做了一次超大升级。       本次工程,花了

    2023年04月08日
    浏览(53)
  • Docker容器部署前端Vue服务——手把手教学

    需要工具: Xftp Xshell   首先对前端项目进行打包:npm run build   打包完成 ​ 在项目中生成dist文件: 通过Xshell在/home目录下创建项目文件夹 通过Xftp将打包的dist文件上传到服务器的项目文件夹下; 利用Xshell在拉取nginx镜像 在项目文件夹下编写nginx config配置文件 default.conf内容

    2024年02月07日
    浏览(62)
  • Hadoop高可靠集群搭建步骤(手把手教学)【超级详细】

    Hadoop高可靠集群搭建步骤(手把手教学) 【超级详细】 一、用管理员身份运行虚拟机 二、创建新的虚拟机: 选择自定义→选择硬件兼容性:Workstation 15.x→选择稍后安装→选Linux(L)(选CentOS 7 64位)→编辑虚拟机名字并选择文件位置→处理器数量和内核数量均选1→选择虚拟机

    2024年02月02日
    浏览(51)
  • 使用devstack安装部署OpenStack(据详细手把手教学)

            (1) 操作系统 :Linux。OpenStack官网推荐使用 Ubuntu-20.04 LTS进行安装OpenStack,所以本教程也以此版本为例。 (不推荐使用其他版本,出现错误较多,容易安装失败)         (2) 虚拟机软件 :VirtualBox或者Vmware。虚拟机的内存最好分配 8G 以上(至少4G),若达

    2024年02月02日
    浏览(89)
  • 【有问必答】搭建uniapp项目流程手把手教学

    博友有问,狗哥必答 前段时间,博友加本狗微信,询问 uniapp的学习方法 。本狗资历浅薄,没有专门学过uniapp,只能将自己日常开发 uniapp的基本流程和步骤 进行分享,希望可以略尽绵薄之力。 感谢 如下图所示的 博友朋友 的 询问支持 ,大家的支持才是我进步的动力。 实现

    2024年02月01日
    浏览(45)
  • Java WebSocket Demo ,案例手把手教学 记录(11)

    希望能写一些简单的教程和案例分享给需要的人 java websocket 服务端 系统:window 开发工具:IDEA 2022.2.3 JAVA 网络通讯开发 填写项目名字 选择 JAVA 语言 选择 Maven 选择自己的JDK版本 (我当前用的是 1.8.0_301) 第三步:编写websocket核心代码:创建类 在 org.example 上右击鼠标(进入菜

    2024年02月03日
    浏览(50)
  • 解决pyinstaller打包文件过大问题,手把手教学

    1.首先需要在Pycharm创建一个虚拟环境,如图:  2.第二步创建我们自己的虚拟环境,如图,我这里将我的环境命名为myworkspace,然后它会自动创建一个venv文件,这里面就包含了我们的一些依赖包,接下来点击create就行:  3.第三步点击create之后,我们再点击new window,打开我们的虚拟

    2024年02月14日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包