matlab练习程序(快速搜索随机树RRT)

RRT快速搜索随机树英文全称Rapid-exploration Random Tree,和PRM类似,也是一种路径规划算法。

和PRM类似,算法也需要随机撒点,不过不同的是,该算法不是全局随机撒点,而是一次撒一个点,然后判断当前搜索树与随机点距离,然后找到搜索树距离随机点最近的节点,向该随机点方向扩展。这里随机点有一定的概率是终点,所以搜索树最终是能够到达终点的。

算法流程如下:

1. 首先确定地图与起始结束点位置,设置搜索树,这里定义了一个随机点列表和一个随机点索引前驱列表代表搜索树。

2. 随机撒一个点,该点有可能是最终点,也有可能是全局中的一个随机点,设为nextp。

3. 找到搜索树中距离nextp最近的节点,从该节点向nextp方向扩展step距离,生成新的路径。

4. 判断新生成的路径是否通过障碍物或者该路径已经被搜索过,如果都没有则该路径加入到搜索树中,否则重新生成随机点。

5. 不断循环直到搜索树最终节点距离终点小于一定阈值,搜索结束,根据前驱列表画出搜索路径。

matlab代码如下:

main.m:

clear all;
close all;
clc;

img = imread(‘map.png‘);    %空间地图
imshow(img);
hold on;

[h,w]=size(img);
p=ginput();                 %选取起始与结束位置
plot(p(:,1),p(:,2),‘r.‘);

pc = p(1,:);                %随机节点列表
step = 20;                  %随机扩展步长
parent = 1;                 %所有节点前驱,初始节点前驱为自己

while norm(pc(end,:)-p(2,:))>step           %搜索到距离结束节点一定距离停止

    if rand()<0.3                           %按30%概率随机搜索,70%概率朝着结束位置搜索
        nextp = [rand()*h rand()*w];
    else
        nextp = p(2,:);
    end

    diff = repmat(nextp,length(pc(:,1)),1)-pc;          %计算节点树与待搜索节点距离
    [~,ind] = min(sqrt(diff(:,1).^2+diff(:,2).^2));     %找到距离带搜索节点最小的节点树节点

    direct = atan2(nextp(1)-pc(ind,1),nextp(2)-pc(ind,2));
    sin_dir = sin(direct);
    cos_dir = cos(direct);

    newp = pc(ind,:) + step*[sin_dir cos_dir];          %向着待搜索节点方向扩展节点树

    isobs = check_obs(img,newp,pc(ind,:));              %判断该路径是否有障碍物

    if isobs==1                                         %有障碍物重新搜索
        continue;
    end

    diff = repmat(newp,length(pc(:,1)),1)-pc;           %判断该路径是否已搜索过,如果已搜索过,则重新搜索
    if min(sqrt(diff(:,1).^2+diff(:,2).^2))<sqrt(step)
        continue;
    end

    pc=[pc;newp];                                       %将新节点加入节点树
    parent = [parent;ind];                              %设置新节点的前驱

    line([pc(ind,1) pc(parent(ind),1)],[pc(ind,2) pc(parent(ind),2)]);
end

line([pc(ind,1) p(2,1)],[pc(ind,2) p(2,2)],‘color‘,‘r‘);
ind = length(pc);
while ind~=1
    ind = parent(ind);                                  %不断搜索当前节点的父节点
    line([pc(ind,1) pc(parent(ind),1)],[pc(ind,2) pc(parent(ind),2)],‘color‘,‘r‘);
end

check_obs.m:

function isobs = check_obs(img,p1,p2)
[h w]=size(img);
d = norm(p1-p2);
direct = atan2(p1(1)-p2(1),p1(2)-p2(2));
sin_dir = sin(direct);
cos_dir = cos(direct);
for r=0:d
    p = floor(p2 + r*[sin_dir cos_dir]);

    y = p(2);
    x = p(1);
    if y>=1 && y<=h && x>=1 && x<=w
        if img(y,x) ==0
            isobs = 1;
            return;
        end
    end
end
isobs = 0;
end

结果如下:

原图:

算法结果:

原文地址:https://www.cnblogs.com/tiandsp/p/12252727.html

时间: 2024-08-29 14:47:50

matlab练习程序(快速搜索随机树RRT)的相关文章

Clustering by fast search and find of desity peaks(基于快速搜索与寻找密度峰值的聚类)

基于快速搜索与寻找密度峰值的聚类(Alex Rodriguez and Alessandro Laio) 摘要:聚类分析目的是基于元素之间的相似度对其进行分类,应用范围从天文学到生物信息学.文献计量学到模式识别.我们提出一种方法,思想基于簇中心具有比其邻居更大密度的特点以及与更大密度点之间有一个相对较大的距离(1.簇中心点有相对高的密度 2.簇中心点之间距离一般较大,即不同类别之间一般距离较远),这种思想形成了簇数目直观出现的聚类机制的基础,自动发现和排除异常点,同时在识别簇时,不用关心其形状和

shell在大文件日志中按照时间段快速搜索日志

问题描述: 在大流量线上服务中,日志系统会产生数量庞大的日志,动辄就是几十G.在如此之大的文件中快速搜索日志是运维人员经常遇见的问题.我们经常遇见的问题是查询一段时间内的某些条日志.比如,今天有一个访问失败了,大约是在上午9点,把这条日志找出来,然后查找失败原因. 常见处理方式及缺点: 1.如果文件比较小,100m以内使用grep.awk或者sed进行逐条匹配比较方便,但是文件非常大时,其查找效率是非常低的,运行时间长达几十分钟甚至上小时. 2.使用hadoop大数据处理,查询速度快,效率高.但

matlab练习程序(毛玻璃模糊)

算是一种特效模糊方式吧,算法原理就是用邻域随机像素代替当前所处理的像素就可以了. 效果如下图所示: 原图: 处理后结果: matlab代码如下: clear all; close all;clc; img=imread('lena.jpg'); [h,w]=size(img); imgn=img; n=3; %模糊直径 for i=1:h for j=1:w offsetX=n*rand()-n/2; %邻域随机值代替当前像素 offsetY=n*rand()-n/2; y=floor(i+of

如何让微信小程序快速接入七牛云

如果你确定用七牛运行小程序的话,给大家分享一个九折优惠码:61d1fd4d1 月 9 日 微信小程序正式发布,小程序终于揭开了它神秘的面纱,开发者对小程序的追捧更是热度不减.从小程序的热门应用场景来看,大概可以分为两大类,一类是低使用频率的 App,如金融类的银行或保险公司 App,O2O 类的上门做饭.家政 App:另一类是虽然使用频率高但是功能简单的 App,如工具类的天气.快递查询,富媒体类的资讯 App 等.那么,谁将成为小程序的大赢家?要打造独角兽级别的微信小程序,开发者除了要注重小程

matlab练习程序(生成黑白网格)

提供了两种生成方法,一个是自己编程实现,比较灵活:另一个是调用系统的checkerboard函数,似乎只能生成8*8网格. 至于用途,也许可以用来下国际象棋. 自己函数生成: 系统函数生成: 代码如下: clear all;close all;clc h=256; w=256; n=8; img=zeros(h,w); flag=1; for y=1:h for x=1:w if flag>0 img(y,x)=255; end if mod(x,int8(w/n))==0 flag=-flag

web程序快速开发

关于web程序快速开发个人见解以及经历 由于在之前公司业务的发展,需要在基于核心业务的基础上开发其他较为独立的业务系统,所以就有了这个基于Dapper,DDD概念的基础框架,由于个人基于这个框架已经经历过两个系统的开发,也因为其他项目团队需要基于这个框架进行其他系统的一些开发,所以需要对此框架有一些简单介绍和使用说明. 1.主要框架主体介绍 Dapper,DapperExtensions:Dapper框架集成. Topever.AutoMapper:对象映射扩展,这个项目其实可以集成到公共项目T

Gradle用户指南(章10:Web应用程序快速入门)

Gradle用户指南(章10:Web应用程序快速入门) 本章正在完善中..... 本章介绍gradle对web应用程序的支持.Gradle为web应用程序开发提供了两个插件:War插件和Jetty插件.War插件扩展了java插件并且能为你的项目构建一个war包.Jetty插件扩展了War插件并且提供了发布你的web项目到Jetty容器中的功能. 构建一个War文件 构建War文件,你需要在项目中添加War插件. 注意:你可以在gradle发布库和源文件的samples/webApplicati

Atitit. Gui控件and面板----程序快速启动区--最佳实践Launchy ObjectDock-o0g

Atitit.  Gui控件and面板----程序快速启动区--最佳实践Launchy ObjectDock-o0g 两个方式::: 键盘式::先用热键呼叫出QS,然后开始输入程序中的部分字母,按Enter就 是启动这个程序 鼠标式::mouse左的呼叫出面板,分组,点击启动... 作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:[email protected] 转载请注明来源: http://blog.csdn.net/attilax 1. ===Launchy Quicksil

matlab练习程序(旋转、径向模糊)

还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到旋转模糊. 一看代码就能全部明白,不仔细解释了. 原图如下: 处理后效果: matlab代码如下: clear all;close all;clc img=imread('lena.jpg'); [h w]=size(img); imshow(img) imgn=zeros(h,w); for y=