【自动驾驶轨迹规划之RRT算法】

欢迎大家关注我的B站:

偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com)

目录

1 RRT算法的简介

2 RRT算法原理

2.1 算法流程

2.2 算法伪代码

2.3 算法流程图

3 RRT算法matlab实现

3.1 测试地图

3.2 distance函数

3.3 RRT算法

3.4 动画效果

4 RRT的缺陷


RRT*是一个常用的路径规划器,这是一个与RRT*相结合的论文 

【ITSC 2023】一种在狭窄空间内快速准确的碰撞检测方法

1 RRT算法的简介

天下武功唯快不破,是 RRT 的最大优势。RRT 的思想是快速扩张一群像树一样的路径以探索空间的大部分区域,找到可行的路径。RRT 算法是一种对状态空间随机采样的算法,通过对采样点进行碰撞检测,避免了对空间的精确建模带来的大计算量,能够有效地解决高维空间和复杂约束的路径规划问题。与PRM类似,该方法是概率完备且非最优的。可以轻松处理障碍物和差分约束(非完整和动力学)的问题,并被广泛应用于机器人路径规划。

2 RRT算法原理

2.1 算法流程

(1)设定初始点 X_{init} 与目标点 X_{goal},自行设定状态采样空间 M

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

(3)若不在障碍物内,计算该采样点 X_{rand} 与集合 \tau (已经生成的节点) 中的所有节点之间的距离,得到离得最近的节点X_{near} ,再从节点 X_{near} 以步长 StepSize\quad(0< StepSize< 1) 走向节点 X_{rand} ,生成一个新的节点 X_{new},若 X_{new} 与 X_{near} 的连线 E_{i} 经过障碍物,则重新随机采样

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

2.2 算法伪代码

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

2.3 算法流程图

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;

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))<(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))<min  %得到最近的节点
            min=distance(T(2*i-1),T(2*i),Xrand(1),Xrand(2));
            Xnear=[T(2*i-1),T(2*i)];
        end
    end
    stepsize=3/distance(Xnear(1),Xnear(2),Xrand(1),Xrand(2));%以一定步长前进,这里选择3
    Xnew=[Xrand(1)*stepsize+Xnear(1)*(1-stepsize),Xrand(2)*stepsize+Xnear(2)*(1-stepsize)];
    t=0;%初始状态未碰撞
    if Xnear(1)>Xnew(1)
        caiyang=-0.001;
    else
        caiyang=0.001;
    end
    for i=Xnear(1):caiyang: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 动画效果

4 RRT的缺陷

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

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

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

 

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

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

  • 29
    点赞
  • 192
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: 自动驾驶技术中的轨迹规划是指通过算法确定车辆在行驶过程中的最佳路径,使其能够安全、有效地到达目的地。其中,RRT算法(Rapidly-exploring Random Tree)是一种常见的轨迹规划算法RRT算法是一种以树结构为基础的算法,它基于随机采样的方式在环境中逐渐扩展并探索可能的轨迹。RRT算法的主要步骤如下: 1. 初始化树结构,将起点放入树中。 2. 随机采样一个点,并在树中找到离该采样点最近的节点。 3. 在该最近节点和采样点之间插入新的节点,形成一条轨迹。 4. 检查新轨迹是否与环境中的障碍物相交,如果相交,则抛弃该轨迹;如果不相交,则将新节点插入树中。 5. 重复2-4步骤,直到生成的轨迹连接到目标点或达到最大迭代次数。 RRT算法的优点是可以在高维复杂环境中进行轨迹规划,而且能够对环境进行自适应学习,适应环境变化。它的生成轨迹的速度较快,在实时应用中表现良好。 不过,RRT算法也存在一些缺点。由于随机采样的方式,它可能生成的轨迹并不是最优解,而是局部最优解。同时,RRT算法在环境中有大量的障碍物时,也可能存在搜索效率低下的问题。为了解决这些问题,可以通过改进RRT算法,如RRT*算法,来提高轨迹的质量以及搜索效率。 综上所述,RRT算法是一种自动驾驶轨迹规划中常用的算法,通过随机采样的方式在环境中探索可能的轨迹,并逐渐生成最佳路径。它具有较快的生成速度和适应复杂环境的能力,但同时也存在局部最优解和搜索效率低下的问题。 ### 回答2: 自动驾驶轨迹规划是指在自动驾驶系统中,通过算法来确定车辆的行驶轨迹。其中一个常用的算法RRT(Rapidly-exploring Random Trees)算法RRT算法通过随机采样的方式在地图上构建一棵随机探索树,树的节点代表车辆在地图上的位置,树的边代表车辆在不同位置之间的移动轨迹。算法初始化时,将起始位置作为树的根节点,然后不断迭代执行以下步骤,直到找到一条符合要求的路径: 1. 随机采样:根据地图的特点和限制条件,随机采样一个点作为新的节点。 2. 寻找最近节点:从树中已有的节点中找到离采样点最近的节点,作为起始节点。 3. 扩展树:以起始节点为起点,按照一定步长,在地图上搜索一条从起始节点到采样点的路径,将路径上的点作为新增的节点加入树中。 4. 碰撞检测:对新增的节点进行碰撞检测,判断是否与障碍物相交。 5. 连接节点:如果新增节点通过碰撞检测,没有与障碍物相交,且与目标点的距离小于阈值,则将新增节点与目标点直接连接。 6. 重复以上步骤,直到找到一条从起始点到目标点且不与障碍物相交的路径。 通过上述步骤,RRT算法可以在较短的时间内找到一条符合要求的车辆轨迹。然而,RRT算法存在一些缺点,如对于复杂环境需要较长的时间来找到一条路径,而且路径的质量可能不够优化。因此,研究者们也在不断改进和优化RRT算法,以提高自动驾驶系统的性能和安全性。 ### 回答3: 自动驾驶轨迹规划是指通过算法来确定车辆在道路上行驶的最佳路径,使得车辆能够安全、高效地达到目的地。其中,rrt(Rapidly-exploring Random Tree)算法是一种常见的路径规划算法rrt算法的基本思想是通过随机采样的方式,探索和扩展树结构,直到找到符合要求的路径。具体过程如下: 1. 初始化:将起点设置为树的起始节点,并将其加入树中。 2. 随机采样:根据特定的采样策略,在地图区域内产生一个随机的采样点,作为目标点。 3. 搜索:从树中选择最近邻的节点(树中距离目标点最近的节点),并通过运动模型生成一个新的节点。 4. 碰撞检测:判断新节点与障碍物是否有碰撞,如果有碰撞,则重复第3步。 5. 节点连接:将新节点添加到树中,并与最近邻节点进行连接。 6. 判断终点:判断新节点是否接近目标点,如果满足条件,则结束搜索。 7. 循环:重复第2至第6步,直到找到有效路径或达到最大搜索次数。 通过rrt算法进行自动驾驶轨迹规划,能够快速探索潜在的路径,同时有效避开障碍物。其优点是适用于复杂的环境和动态障碍物,能够找到可行解。然而,rrt算法也存在一些不足之处,例如路径不一定是最短路径,而且搜索过程中可能出现偏差。因此,实际应用中通常会结合其他算法对路径进行优化和改进,以提高路径规划的准确性和效率。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无意2121

创作不易,多多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值