自动驾驶 RRT算法原理解析

发布时间:2023-08-03  

1 RRT算法的简介

天下武功唯快不破,快是 RRT 的最大优势。RRT 的思想是快速扩张一群像树一样的路径以探索空间的大部分区域,找到可行的路径。


RRT 算法是一种对状态空间随机采样的算法,通过对采样点进行碰撞检测,避免了对空间的精确建模带来的大计算量,能够有效地解决高维空间和复杂约束的路径规划问题。


与PRM类似,该方法是概率完备且非最优的。可以轻松处理障碍物和差分约束(非完整和动力学)的问题,并被广泛应用于机器人路径规划。


2 RRT算法原理

2.1 算法流程

(1)设定初始点  与目标点 ,自行设定状态采样空间 

(2)进行随机采样得到采样点 ,如果采样点  在障碍物内,则重新随机采样

(3)若不在障碍物内,计算该采样点  与集合  (已经生成的节点) 中的所有节点之间的距离,得到离得最近的节点 ,再从节点  以步长  走向节点  ,生成一个新的节点 ,若  与  的连线  经过障碍物,则重新随机采样

(4)经过反复迭代,生成一个随机扩展树,当随机扩展树中的子节点进入了我们规定的目标区域,便可以在随机扩展树中找到一条由从初始点到目标点的路径。


2.2 算法伪代码

可以将伪代码与上述算法流程对照起来看

9e9b9f9e-29ff-11ee-a368-dac502259ad0.png

2.3 算法流程图

9f12c132-29ff-11ee-a368-dac502259ad0.png

3 RRT算法matlab实现


3.1 测试地图


%随机生成障碍物

function [f,n1]=ob(n)

f=[];%储存障碍物信息

n1=n;%返回障碍物个数

p=0;

for i=1:n

    k=1;

    while(k)

        D=[rand(1,2)*60+15,rand(1,1)*1+3];%随机生成障碍物的坐标与半径,自行调整

        if(distance(D(1),D(2),90,90)>(D(3)+5)) %与目标点距离一定长度,防止过多阻碍机器人到达目标点

            k=0;

        end

        for t=1:p  %障碍物之间的距离不能过窄,可自行调整去测试

            if(distance(D(1),D(2),f(3*t-2),f(3*t-1))<=(D(3)+f(3*t)+5))

                k=1;

            end

        end

    end

    %画出障碍物

    aplha=0:pi/40:2*pi;

    r=D(3);

    x=D(1)+r*cos(aplha);

    y=D(2)+r*sin(aplha);

    fill(x,y,'k');

    axis equal;

    hold on;

    xlim([0,100]);ylim([0,100]);

    f=[f,D];

    p=p+1;%目前生成的障碍物个数

end

hold all;

9f203c4a-29ff-11ee-a368-dac502259ad0.png

3.2 distance函数


function f=distance(x,y,x1,y1)

   f=sqrt((x-x1)^2+(y-y1)^2);

3.3 RRT算法


clc

clear all

[f,n1]=ob(10);%随机生成障碍物

Xinit=[1,1];%定义初始点

Xgoal=[90,90];%定义目标点

plot(Xinit(1),Xinit(2),'ro');

plot(Xgoal(1),Xgoal(2),'ko');

T=[Xinit(1),Xinit(2)];%已生成节点集合用顺序表的数据结构存储

Xnew=Xinit;

D(1)=0;%初始节点的父节点指向0

while distance(Xnew(1),Xnew(2),Xgoal(1),Xgoal(2))>3  %进入目标区域

    Xrand=round(rand(1,2)*100)+1;%状态采样空间:横纵坐标均为整数,范围1~100

    k=1;%进入循环

    while k==1

        k=0;%初始化采样成功

        for i=1:n1

            if distance(Xrand(1),Xrand(2),f(i*3-2),f(i*3-1))                k=1;%采样不成功

                break;

            end

        end

        Xrand=round(rand(1,2)*100);%重新采样

    end

    min=10000;

    for i=1:size(T,2)/2 %遍历已生成节点集合

        if distance(T(2*i-1),T(2*i),Xrand(1),Xrand(2))Xnew(1)

        caiyang=-0.001;

    else

        caiyang=0.001;

    end

    for i=Xnear(1)Xnew(1)%均匀采样进行碰撞检测

        for j=1:n1

            if distance(f(3*j-2),f(3*j-1),i,Xnear(2)+(i-Xnear(1))/(Xnew(1)-Xnear(1))*(Xnew(2)-Xnear(2)))<=(f(3*j)+1)

                t=1;%代表碰撞

                break;

            end

        end

        if t==1

            break;

        end

    end

    if t==0

        T=[T,Xnew(1),Xnew(2)];

        for i=1:size(T,2)/2 %遍历已生成节点集合

            if (T(i*2-1)==Xnear(1))&&(T(i*2)==Xnear(2))  %得到最近的节点的索引

                D(size(T,2)/2)=i;%记录父节点

                break;

            end

        end

        plot([Xnew(1),Xnear(1)],[Xnew(2),Xnear(2)],'b-');hold on;pause(0.005);

        plot(Xnew(1),Xnew(2),'r.');xlim([0,100]);ylim([0,100]);

    end

end

i=size(T,2)/2;

jg=[i];

while D(i)

    i=D(i); %通过链表回溯

    if D(i)~=0

        jg=[D(i),jg];%存储最短路径通过的节点

    end

end

Fx=T(jg(1)*2-1);Fy=T(jg(1)*2);

i=2;

while jg(i)~=size(T,2)/2

    x=T(jg(i)*2-1);

    y=T(jg(i)*2);

    plot([x,Fx],[y,Fy],'g-');hold on;pause(0.05);

    Fx=x;Fy=y;

    i=i+1;

end

 plot([T(jg(i)*2-1),Fx],[T(jg(i)*2),Fy],'g-');hold on;pause(0.05);

3.4 动画效果

9f4378b8-29ff-11ee-a368-dac502259ad0.png

9f5b8bce-29ff-11ee-a368-dac502259ad0.png

4 RRT的缺陷


(1)很明显RRT算法得到的路径不是最优的


(2)RRT算法未考虑运动学模型


(3)RRT算法对于狭小的通道的探索性能不好,如下图的对比,有可能探索不到出口


9f89d682-29ff-11ee-a368-dac502259ad0.png

(4)没有启发信息的RRT像无头苍蝇,探索空间完全靠运气,如下图

9fbe560a-29ff-11ee-a368-dac502259ad0.png

针对上述缺陷,又出现了很多RRT算法的变种,以后的文章中会介绍。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    价值的重要驱动力。" VISC 内部 VISC执行架构是作为一个功能齐全的独立RISC-V兼容内核创建的,非常适合在ASIC和FPGA中使用。它具有出色的内存效率,在计算过程中消除了内存访问,从而提高了安全性。它具有运行通用计算......
    抗运动性能比较差,主要是因为运动干扰经常会污染时域信号特征,导致生理信号被随机的运动干扰噪声影响到准确度。导致单纯使用时域算法是无法在噪声信号中提取有效的生理信号并计算相关参数的,最终表现为血氧参数或脉率参数计算......
    内存块被称为Partial Buffers(PB)。这些PB的主要用途是存储计算过程中的中间结果,从而显著减少对外部DRAM的访问次数。Partial Buffers所带来的优势如下: · 简化......
    味着开发人员无需花费额外的时间和精力来管理片上内存,从而可以更加专注于算法和应用的开发。 以图2所示的卷积神经网络为例,在传统的计算架构中,该网络通常需要12次的DRAM访问来完成一次完整的计算过程。然而,在......
    在时域和频域上解决语音增强的问题。而深度学习在多通道语音增强中常常结合空间信息或者传统算法例如波束形成等实现去噪,例如具有代表性算法的基于掩蔽的波束形成技术[2]。利用深度学习进行语音去的算法一般包括非端到端语音降噪方法和端到端语音降噪算法......
    将两相静止坐标系转为dq两相旋转坐标系,其变换矩阵有: 本文使用的误差校正方法为ASHE算法,该方法无需电机参数,无需额外的传感器,无需复杂的计算过程,其原理为通过最小均方算法建立自适应谐波消除模型,如图2......
    还提供IX15网关和Digi Remote Manager®,为开发者提供了完整的设备到云物联网解决方案。” 从边缘计算到面向未来的迁移,Digi XBee RR......
    无法加速到给定speed就减速的示意图通过以上推导,我们求出了梯形算法要求的所有变量。  算法优化 由于算法在计算过程中涉及到一些浮点型运算,大量的浮点型运算会使得效率大大降低,为了使得计算......
    战略官Eric Vreeland表示:“与Google Cloud的整合是全面普及ZK证明服务的第一步。ZK证明为现代计算过程中存在的数据有效性和可扩展计算问题提供了创新解决方案。与 现有基准相比,Proof......
    战略官Eric Vreeland表示:“与Google Cloud的整合是全面普及ZK证明服务的第一步。ZK证明为现代计算过程中存在的数据有效性和可扩展计算问题提供了创新解决方案。与 现有......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>