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

9 篇文章 2 订阅
7 篇文章 1 订阅

目录

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的缺陷


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 测试地图

 
  1. %随机生成障碍物

  2. function [f,n1]=ob(n)

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

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

  5. p=0;

  6. for i=1:n

  7. k=1;

  8. while(k)

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

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

  11. k=0;

  12. end

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

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

  15. k=1;

  16. end

  17. end

  18. end

  19. %画出障碍物

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

  21. r=D(3);

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

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

  24. fill(x,y,'k');

  25. axis equal;

  26. hold on;

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

  28. f=[f,D];

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

  30. end

  31. hold all;

3.2 distance函数

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

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

3.3 RRT算法

 
  1. clc

  2. clear all

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

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

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

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

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

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

  9. Xnew=Xinit;

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

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

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

  13. k=1;%进入循环

  14. while k==1

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

  16. for i=1:n1

  17. if distance(Xrand(1),Xrand(2),f(i*3-2),f(i*3-1))<(f(i*3)+1)%判断随机采样点是否在障碍物内

  18. k=1;%采样不成功

  19. break;

  20. end

  21. end

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

  23. end

  24. min=10000;

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

  26. if distance(T(2*i-1),T(2*i),Xrand(1),Xrand(2))<min %得到最近的节点

  27. min=distance(T(2*i-1),T(2*i),Xrand(1),Xrand(2));

  28. Xnear=[T(2*i-1),T(2*i)];

  29. end

  30. end

  31. stepsize=3/distance(Xnear(1),Xnear(2),Xrand(1),Xrand(2));%以一定步长前进,这里选择3

  32. Xnew=[Xrand(1)*stepsize+Xnear(1)*(1-stepsize),Xrand(2)*stepsize+Xnear(2)*(1-stepsize)];

  33. t=0;%初始状态未碰撞

  34. if Xnear(1)>Xnew(1)

  35. caiyang=-0.001;

  36. else

  37. caiyang=0.001;

  38. end

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

  40. for j=1:n1

  41. 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)

  42. t=1;%代表碰撞

  43. break;

  44. end

  45. end

  46. if t==1

  47. break;

  48. end

  49. end

  50. if t==0

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

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

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

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

  55. break;

  56. end

  57. end

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

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

  60. end

  61. end

  62. i=size(T,2)/2;

  63. jg=[i];

  64. while D(i)

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

  66. if D(i)~=0

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

  68. end

  69. end

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

  71. i=2;

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

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

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

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

  76. Fx=x;Fy=y;

  77. i=i+1;

  78. end

  79. 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算法的变种,以后的文章中会介绍。

【自动驾驶轨迹规划之RRT算法】_无意2121的博客-CSDN博客_rrt算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值