【MATLAB】一种改进RRT寻路算法

目录

1 原算法代码链接

 2 改进说明

3 RRT代码

4 运行结果

5 github链接


1 原算法代码链接

【MATLAB】快速扩展随机树(RRT)路径搜索算法实现_一只小白白的博客-CSDN博客

 2 改进说明

原RRT算法随机新生成节点,不具有启发性,导致新生成的节点并没有向着终点方向前进,搜索效率较低,改进思路很简单:加入启发式向量,引导新生成节点向着终点的方向前进,启发式函数可根据需要设置,我这里提供了两中启发式函数:

启发向量1:计算起点指向终点的单位向量,将其作为新节点的生成方向的一个分向量 

启发向量1的图示:

 启发向量1的代码:

% 启发项1:计算从起点指向终点的单位向量,作为启发项
lambda = 1.5; % 启发项所占的比重
guide_vector1 = (qgoal-qinit)/norm(qgoal-qinit);
% 根据启发项产生可能的新节点
forward_vector = lambda*guide_vector1+(C(:,k)-qnear)/norm(C(:,k)-qnear);
qnew= qnear + dq*forward_vector/norm(forward_vector);

启发向量2:计算最近点指向终点的单位向量,将其作为新节点的生成方向的一个分向量

启发向量1的图示:

 启发向量1的代码:

% 根据启发项产生可能的新节点
lambda=1.5;
guide_vector2 = (qgoal-qnear)/norm(qgoal-qnear);
forward_vector = lambda*guide_vector2+(C(:,k)-qnear)/norm(C(:,k)-qnear);
qnew= qnear + dq*forward_vector/norm(forward_vector);

3 RRT代码

%%----------------------------------------------
% Author: Yinsong Qu
% Date:   8,14,2023
% Email: quyinsong@hrbeu.edu.cn
% reference: https://github.com/gn7550/RRT-PRM-codes
%%----------------------------------------------
function [GEd,qw]=build_RRT(qset, NumNodes, dq, QLIST)
qinit=qset(:,1); qgoal=qset(:,2);
G=qinit; GE=[];
% 启发项1:计算从起点指向终点的单位向量,作为启发项
lambda = 1.5; % 启发项所占的比重
guide_vector1 = (qgoal-qinit)/norm(qgoal-qinit);
% 启发项2:还可以有第二种启发项
% 第二种启发项需要在随机生成新节点后,找到其父节点时计算,如guide_vector2
% 障碍物个数
Obstacle_Num = size(QLIST,1);
%% 绘制障碍物模型
for i=1:Obstacle_Num
    Q = [QLIST(i,1:4);QLIST(i,5:8)];
    fill(Q(1,:),Q(2,:),'k');
    hold on
end
% RRT
fig_num=1;
for k= 1:NumNodes
    qrand=[rand*20; rand*20];
    C(:,k)=qrand;
    qnear= Nearest_Vertex( C(:,k) , G);
    % 根据启发项产生可能的新节点
    guide_vector2 = (qgoal-qnear)/norm(qgoal-qnear);
    forward_vector = lambda*guide_vector2+(C(:,k)-qnear)/norm(C(:,k)-qnear);
    qnew= qnear + dq*forward_vector/norm(forward_vector);
    % 判断新节点是否符合要求
    if Obstacle_Num==0
        G=[G,qnew];
        GE= [GE, [qnear;qnew]];
        plot([qnear(1),qnew(1)],[qnear(2),qnew(2)])
        pause(0.1);
    else
        for i=1:Obstacle_Num
            Q = [QLIST(i,1:4);QLIST(i,5:8)];
            if isequal(1,isIntersection( qnear,qnew,Q ) )
                break;
            elseif i==Obstacle_Num
                % 如果到最后一个障碍物都不碰撞,则将新节点及其父节点保存进GE
                G=[G,qnew];
                GE= [GE, [qnear;qnew]];
                % 保存gif,与算法无关
                plot([qnear(1),qnew(1)],[qnear(2),qnew(2)])
                pause(0.1);
                hold on
                F=getframe(gcf);
                I=frame2im(F);
                [I,map]=rgb2ind(I,256);
                if (fig_num==1)
                    imwrite(I,map,'test.gif','gif','Loopcount',inf,'DelayTime',0.2);
                elseif (rem(fig_num,10)==0)
                    imwrite(I,map,'test.gif','gif','WriteMode','append','DelayTime',0.2);
                end
                fig_num = fig_num+1;
            end
        end
    end
    
    if isequal(qnew,qgoal) || norm(qnew-qgoal)<dq
        GE= [GE, [qnew;qgoal]];
        plot([qnear(1),qnew(1)],[qnear(2),qnew(2)])
        hold on

        break
    end
end

qw=G;
GEd=GE;

end

function vv=Nearest_Vertex(q,G)
d= inf;
n= size(G,2);
for i=1:n
    if norm(G(:,i) - q) < d && ~isequal(G(:,i),q)
        vnew= G(:,i);
        d= norm(G(:,i)-q);
    end
end
vv= vnew;
end

4 运行结果

原始RRT算法运行结果:

本文改进RRT运行结果:

 可以看出其扩展树更具目的性,搜索速度也更快

5 github链接

完整代码链接:GitHub - quyinsong/Motion-Planning-for-Mobile-Robots: 移动机器人路径规划

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值