0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RRT算法Matlab实现 主函数部分

麦辣鸡腿堡 来源:古月居 作者:FlyingKonan 2023-11-24 16:25 次阅读

初始化随机树

初始化随机树,定义树结构体tree以保存新节点及其父节点,便于后续从目标点回推规划的路径。

%% 初始化随机树
tree.child = [];               % 定义树结构体,保存新节点及其父节点
tree.parent = [];
tree.child = x_start;          % 起点作为第一个节点
flag = 1;                      % 标志位
new_node_x = x_start(1,1);     % 将起点作为第一个生成点
new_node_y = x_start(1,2);
new_node = [new_node_x, new_node_y];

主函数部分

主函数中首先生成随机点,并判断是否在地图范围内,若超出范围则将标志位置为0。

rd_x = 30 * rand() - 15;    % 生成随机点
rd_y = 30 * rand() - 15;    
if (rd_x >= x_right_limit || rd_x <= x_left_limit ||... % 判断随机点是否在地图边界范围内
    rd_y >= y_right_limit || rd_y <= y_left_limit)
    flag = 0;
end

调用函数cal_distance计算tree中距离随机点最近的节点的索引,并计算该节点与随机点连线和x正向的夹角。

[angle, min_idx] = cal_distance(rd_x, rd_y, tree);    % 返回tree中最短距离节点索引及对应的和x正向夹角

cal_distance函数定义如下:

function [angle, min_idx] = cal_distance(rd_x, rd_y, tree)
    distance = [];
    i = 1;
    while i<=size(tree.child,1)
        dx = rd_x - tree.child(i,1);
        dy = rd_y - tree.child(i,2);
        d = sqrt(dx^2 + dy^2);
        distance(i) = d;
        i = i+1;
    end
    [~, min_idx] = min(distance);
    angle = atan2(rd_y - tree.child(min_idx,2),rd_x - tree.child(min_idx,1));
end

随后生成新节点。

new_node_x = tree.child(min_idx,1)+grow_distance*cos(angle);% 生成新的节点
new_node_y = tree.child(min_idx,2)+grow_distance*sin(angle);
new_node = [new_node_x, new_node_y];

接下来需要对该节点进行判断:

① 新节点是否在障碍物范围内;

② 新节点和父节点的连线线段是否和障碍物有重合部分。

若任意一点不满足,则将标志位置为0。实际上可以将两个判断结合,即判断新节点和父节点的连线线段上的点是否在障碍物范围内。

for k=1:1:size(ob,1) 
    for i=min(tree.child(min_idx,1),new_node_x):0.01:max(tree.child(min_idx,1),new_node_x)    % 判断生长之后路径与障碍物有无交叉部分
        j = (tree.child(min_idx,2) - new_node_y)/(tree.child(min_idx,1) - new_node_x) *(i - new_node_x) + new_node_y;
        if(i >=ob(k,1)-resolution && i <= ob(k,1)+ob(k,3) && j >= ob(k,2)-resolution && j <= ob(k,2)+ob(k,4))
            flag = 0;
            break
        end
    end
end

在这我采用的方法是写出新节点和父节点连线的直线方程,然后将x变化范围限制在min(tree.child(min_idx,1),new_node_x)max(tree.child(min_idx,1),new_node_x)内,0.01即坐标变换的步长,步长越小判断的越精确,但同时会增加计算量;

步长越大计算速度快但是很可能出现误判,如下图所式。

判断标志位若为1,则可以将该新节点加入到tree中,注意保存新节点和它的父节点,同时显示在figure中,之后重置标志位。

if (flag == true)           % 若标志位为1,则可以将该新节点加入tree中
    tree.child(end+1,:) = new_node;
    tree.parent(end+1,:) = [tree.child(min_idx,1), tree.child(min_idx,2)];
    plot(rd_x, rd_y, '.r');hold on
    plot(new_node_x, new_node_y,'.g');hold on
    plot([tree.child(min_idx,1),new_node_x], [tree.child(min_idx,2),new_node_y],'-b');
end
    
flag = 1;                   % 标志位归位

最后就是把障碍物、起点终点等显示在figure中,并判断新节点到目标点距离。若小于阈值则停止搜索,并将目标点加入到node中,否则重复该过程直至找到目标点。

%% 显示
for i=1:1:size(ob,1)        % 绘制障碍物
    fill([ob(i,1)-resolution, ob(i,1)+ob(i,3),ob(i,1)+ob(i,3),ob(i,1)-resolution],...
         [ob(i,2)-resolution,ob(i,2)-resolution,ob(i,2)+ob(i,4),ob(i,2)+ob(i,4)],'k');
end
hold on

plot(x_start(1,1)-0.5*resolution, x_start(1,2)-0.5*resolution,'b^','MarkerFaceColor','b','MarkerSize',4*resolution); % 起点
plot(goal(1,1)-0.5*resolution, goal(1,2)-0.5*resolution,'m^','MarkerFaceColor','m','MarkerSize',4*resolution); % 终点
set(gca,'XLim',[x_left_limit x_right_limit]); % X轴的数据显示范围
set(gca,'XTick',[x_left_limit:resolution:x_right_limit]); % 设置要显示坐标刻度
set(gca,'YLim',[y_left_limit y_right_limit]); % Y轴的数据显示范围
set(gca,'YTick',[y_left_limit:resolution:y_right_limit]); % 设置要显示坐标刻度
grid on
title('D-RRT');
xlabel('横坐标 x'); 
ylabel('纵坐标 y');
pause(0.05);
if (sqrt((new_node_x - goal(1,1))^2 + (new_node_y- goal(1,2))^2) <= goal_radius) % 若新节点到目标点距离小于阈值,则停止搜索,并将目标点加入到node中
    tree.child(end+1,:) = goal;         % 把终点加入到树中
    tree.parent(end+1,:) = new_node;
    disp('find goal!');
    break
end
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • matlab
    +关注

    关注

    175

    文章

    2922

    浏览量

    228441
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61309
  • 路径规划
    +关注

    关注

    0

    文章

    78

    浏览量

    15287
  • RRT
    RRT
    +关注

    关注

    0

    文章

    12

    浏览量

    1081
收藏 人收藏

    评论

    相关推荐

    matlab部分图像处理函数

    matlab部分图像处理函数
    发表于 03-04 19:11

    基于二维图像的FFT算法实现matlab程序

    基于二维图像的FFT算法实现matlab程序,FFT函数源代码
    发表于 05-15 14:22

    果蝇优化算法MATLAB实现

    果蝇优化算法MATLAB实现发布时间:2018-10-12 23:28,浏览次数:1183, 标签:MATLAB果蝇优化算法--
    发表于 08-17 07:28

    果蝇优化算法MATLAB实现过程是怎样的?

    果蝇优化算法MATLAB实现过程是怎样的?
    发表于 11-22 07:48

    Matlab遗传算法工具箱的应用

    Matlab遗传算法(GA)优4~-r-具箱是基于基本操作及终止条件、二进制和十进制相互转换等操作的综合函数库。其实现步骤包括:通过输入及输出函数
    发表于 11-13 17:57 60次下载

    matlab取整函数命令代码

    本内容介绍了matlab取整函数。在matlab中有四个取整函数具体:Matlab取整函数有:
    发表于 12-20 14:41 4797次阅读

    matlab牛逼函数总结

    matlab牛逼函数总结,想大家会因为MATLAB函数不懂吧!自己看看吧!
    发表于 11-06 17:18 0次下载

    模糊推理的Mamdani算法及其Matlab实现

    模糊滤波的mamdani算法及其Matlab实现
    发表于 11-17 18:23 40次下载

    MATLAB常用函数总结(表格)

    MATLAB常用函数总结,MATLAB函数速查手册,方便应用MATLAB函数
    发表于 01-21 14:31 0次下载

    matlab函数资料

    matlab 函数 matlab的一些基本的界面设计的函数
    发表于 03-23 17:13 0次下载

    BP算法及其matlab实现

    高级自动控制算法:BP算法及其matlab实现
    发表于 12-02 11:45 2次下载

    matlab怎样编写函数并调用函数

    MATLAB和Mathematica、Maple并称为三大数学软件。它在数学类科技应用软件中在数值计算方面首屈一指。MATLAB可以进行矩阵运算、绘制函数和数据、实现
    发表于 12-04 14:33 2.6w次阅读
    <b class='flag-5'>matlab</b>怎样编写<b class='flag-5'>函数</b>并调用<b class='flag-5'>函数</b>

    《图论算法及其MATLAB实现》电子教材和函数函数功能列表概述

    全书分为相对独立的9章每章都是解决-类问题的算法思想及其MATLAB实现,首先介绍有关基础知识,然后给出相关著名实际问题及解决此向题的算法思想。最后给出
    发表于 10-22 08:00 0次下载

    MATLAB的简单函数优化的遗传算法程序免费下载

    本文档的主要内容详细介绍的是MATLAB的简单函数优化的遗传算法程序免费下载。
    发表于 10-24 08:00 2次下载
    <b class='flag-5'>MATLAB</b>的简单<b class='flag-5'>函数</b>优化的遗传<b class='flag-5'>算法</b>程序免费下载

    自动驾驶 RRT算法原理解析

    RRT 算法是一种对状态空间随机采样的算法,通过对采样点进行碰撞检测,避免了对空间的精确建模带来的大计算量,能够有效地解决高维空间和复杂约束的路径规划问题。 与PRM类似,该方法是概率完备且非最优的。可以轻松处理障碍物和差
    发表于 07-28 15:45 1450次阅读
    自动驾驶 <b class='flag-5'>RRT</b><b class='flag-5'>算法</b>原理解析