自动驾驶路径规划算法学习-RRT算法及matlab实现
自动驾驶路径规划算法学习-RRT算法及matlab实现
参考 手把手教用matlab做无人驾驶(六)-路径规划RRT
RRT路径规划算法在二维仿真环境中的应用 -- Python代码实现
RRT路径规划算法在二维仿真环境中的应用 -- Python代码实现
RRT 算法原理以及过程演示
RRT快速随机数算法 Rapid Random Tree
是基于采样的规划方法的一种。
快速搜索随机树,就是在环境中随机撒一些点,这些点经过算法运算,最终可以连接起来,变成车辆可以运行的轨迹。
1.算法原理
RRT 适用于涉及非完整约束场合下的路径规划问题。
过程中,算法不断在搜索空间中随机生成状态点,如果该点位于无碰撞位置,则寻找搜索树中离该节点最近的结点为基准结点,由基准结点出发以一定步长朝着该随机结点进行延伸,延伸线的终点所在的位置被当做有效结点加入搜索树中。这个搜索树的生长过程一直持续,直到目标结点与搜索树的距离在一定范围以内时终止。随后搜索算法在搜索树中寻找一条连接起点到终点的最短路径。
计算实例参考 RRT 算法原理以及过程演示,这篇博客讲的非常清楚,如下:
1.1计算实例
Step 1.初始化一个环境,包括地图,起点,终点。如下图所示,黑色物体为障碍物,蓝色飞机位于起点位置,红色五角星为目标终点位置
Step2:从环境中随机采样状态点,如下图所示,采样点为 Xrand
。
Step3: 从所构建的树中寻找距离采样点 Xrand
最近的结点 Xnear
。现在树中只有起点一个结点,所有最近的结点就是起点
Step4:开始树的生长过程。首先连接 Xnear
和 Xrand
连接起来,这个连接线的方向就是树生长的方向。设置一个步长 Stepsize
作为树一次生长的步长,在树生长的这个方向上生长一个步长,然后就会在生长的末端会产生一个新的结点 Xnew
。
Step5:判断从 Xnear
到 Xrand
是否穿过障碍物,如果穿过,则放弃该新的结点,如果没有,则将 Xnew
结点加入到树中。
Step6:从步骤 2 开始再循环执行,从环境中随机采样状态点。
.........
重复上述树的生长过程,直到树新生成的结点到目标点的距离小于一个步长,则终止树的生长。直接将该新结点与目标点相连。
整个步骤动图如下:
1.2算法伪代码
概述之:
输入地图,起点,终点→起点先加入树节点nodes表→在地图随机采样一个点xrand(同时保证有一定的概率会选择到目标点,保证有节点会向着目标点的方向扩展)→找到树节点中离xrand最近的点xnearest→xnearest朝着xrand前进一个步长得到新的点xnew→判断xnearest到xnew连线进行碰撞检测,若有碰撞则放弃该节点重新选择,若无碰撞则将该节点加入树节点→重复xnew的扩展过程直到扩展的xnew在目标点附近。
2.算法Matlab实现
这里只介绍了关键代码的实现,非完整程序,完整代码链接附在文末。
2.1 二维环境的搭建 CreateMap.m
CreateMap.m的主要作用输入起点终点障碍物等信息,障碍物是一一个个实心圆表示。绘制起点终点障碍物信息,代码如下:
%CreateMap.m
start = [0,0];
goal = [10,14];
%障碍物(x,y,radiu)
obstacle_list=[3,3,1.5;12,2,3;3,9,2;9,11,2];
%画出地图框及障碍物
axis([-2,18,-2,15])
hold on
for i=1:length(obstacle_list(:,1))
%调用画障碍物函数
plot_obstacle(obstacle_list(i,1),obstacle_list(i,2),obstacle_list(i,3))
end
plot(start(1),start(2),'og')
hold on
plot(goal(1),goal(2),'or')
hold on
2.2 随机采样
隶属于RRT算法程序RRT_planning.m的一部分。
在状态空间中随机采样p_rand(这里采样的是一个坐标点), 有一定的概率采样到目标点,确保路径能以一定的概率向着目标点前进。这里随机采样取得目标点的概率是0.3,这个参数越大,越快找到路径,但障碍物较多时可能反而要耗费更多时间绕开。
%随机采样取得目标点的概率是0.3,这个参数越大,越快找到路径,但障碍物较多时可能反而要耗费更多时间绕开
p=0.3
%在环境中采样p_rand,p_int是start
p_randx = randi(16)-1; %x随机采样范围0-15
p_randy = randi(13)-1; %x随机采样范围0-12
p_rand=[p_randx,p_randy];
%一定概率采样点取得目标点
if rand(1)<pp_rand=goal;
end
2.3 FindNearest.m
从节点树中找到距随机采样点p_rand最近的节点p_nearest的程序FindNearest.m程序如下:
这里有一个要注意的细节,运行时出错,因为nodes节点树很可能存在好几个点同时到p_rand随机采样点距离最小,这里设置的返回值必须只有一个,如果有多个最近点,只取第一个返回。
function minID=FindNearest(p_rand,nodes)
%dist矩阵存放p_rand到nodes节点每个节点的距离
%nodes的节点数
nodes_num = length(nodes(:,1));
prand_matx=ones(nodes_num,1)*p_rand(1);
prand_maty=ones(nodes_num,1)*p_rand(2);
nodes_matx=nodes(:,1);
nodes_maty=nodes(:,2);
dist=((prand_matx-nodes_matx).^2+(prand_maty-nodes_maty).^2).^0.5;
minID=find(dist==min(dist));
minID=minID(1); %万一有多个同样小的,只取其中一个
end
2.4 扩展新节点
最近点朝着随机点走一个步长得到新节点。
先求出随机点p_rand和最近点p_nearest连线与x轴所成角theta,然后计算pnew新节点,代码如下:
%随机点和树中最近点连线与x轴夹角
theta = atan2(p_rand(2)-p_nearest(2),p_rand(1)-p_nearest(1));
%计算新节点
pnew(1)= p_nearest(1)+ RRT_stepsize*cos(theta);
pnew(2)= p_nearest(2)+ RRT_stepsize*sin(theta);
%看该随机点是否已在随机树nodes中,是的话重新选择,防止pnew在nodes里出现两次
father=FindFather(pnew, nodes);
if ~isempty(father) %如果father非空说明能找到父节点说明在nodes里,重复了,避免出错continue
end
特别注意,我在跑程序时开始跑很多次总有一两次会陷入死循环,怎么都找不到错误所在,后来发现是在回溯路径时出现了两个节点互为父节点father的情况,原因是在扩展新节点pnew时,没有判断pnew是否已经在nodes树节点中了,如果已经在nodes树节点中,就不应再作为新的扩展点,本次随机采样放弃,进入下一次随机采样。下面用图说明:
假设
P2是由父节点P0扩展出;P1是由父节点P2扩展出;此时新一次的扩展P1扩展出的pnew正好是P2
我们程序里树节点存放在nodes中,是一层层往上堆的,后扩展的放在上面,但是在nodes中找父节点时又是从上往下,则会出现下图的情况
对扩展的新节点判断是否已经在nodes树节点中,若是则放弃本次采样,pnew也不加入树节点nodes中,就不会陷入死循环:
2.5 碰撞检测 collision_check.m
计算障碍物圆心o到线段p_nearest-pnew的最短距离是否小于半径,是则会发生碰撞。
障碍物的圆心o和线段p_nearest-pnew的距离计算三种情况(垂点在线段之间,垂点在线段下方,垂点在线段上方):
点到线段最短距离d的计算方法为点到直线的距离
点到线段最短距离d的计算方法为圆心o到p_nearest的距离
点到线段最短距离d的计算方法为圆心o到p_new的距离
点到线段最短距离的实现封装为distance_squared_point_to_segment.m,其返回值为最短距离的平方,其代码如下:
程序中 x1--p_nearest, x2--pnew, x3--圆心
向量(x3-x1)乘向量(x2-x1)求到O-pnearest在pnearest-pnew上的投影,投影/l2求到垂足在线段长度中的百分比,可能超过1或为负数。超过1时,最短距离取x3x2,小于0时距离取x3x1
distance_squared_point_to_segment.m
function dd=distance_squared_point_to_segment(x1,x2,x3)
%""" 计算线段 vw 和 点 p 之间的最短距离""",x1 near v; x2 new w; x3 obstacle_圆心 p
%点 v 和 点 w 重合的情况
if isequal(x1,x2)dd=(x3(1)-x1(1))^2+(x3(2)-x1(2))^2;return
end
%线段 vw 长度的平方
l2=(x2(1)-x1(1))^2+(x2(2)-x1(2))^2;
t = max(0, min(1, (x3 - x1)*(x2 - x1)' / l2)); %向量(x3-x1)乘向量(x2-x1)求到O-pnearest在pnearest-pnew上的投影,投影/l2求导垂足在线段长度中的百分比,可能超过1或为负数。超过1时,最短距离取x3x2,小于0时距离取x3x1
projection = x1 + t * (x2 - x1);
dd = (x3 - projection)*(x3 - projection)';
end
整个碰撞检测函数collision_check.m代码如下:
function collisionflag=collision_check(pnew,p_nearest,obstacle_list)
collisionflag=0;
for i=1:length(obstacle_list(:,1))
x0=p_nearest;
x1=pnew;
x2=[obstacle_list(i,1),obstacle_list(i,2)];
dd = distance_squared_point_to_segment(x0,x1,x2);
if dd<(obstacle_list(i,3))^2 %%距离小于障碍物半径collisionflag=1;return
end
end
如果发生碰撞,就放弃本次采样,直接进入下一次
如果没有发生碰撞,计算出的新节点pnew加入节点树nodes,并在nodes存入pnew父节点为p_nearest
2.6 判断是否到达目标点is_near_goal.m
判断的原理就是计算通过碰撞检测的pnew新扩展节点到目标点距离是否小于一个步长RRT_stepsize,是的话,
则说明达到,并将目标点加入节点树nodes,记录其父节点为此时的pnew,实现代码如下:
function goalflag=is_near_goal(pnew,goal,RRT_stepsize)
goalflag=0;
dist=pdist([pnew;goal],'euclidean');
if dist<RRT_stepsizegoalflag=1;return
end
end
3. 运行结果
RRT算法的几个可调节参数 步长RRT_stepsize,随机采样取得目标点概率p
RRT_stepsize越大,计算路径的速度越快,当步长过大可能来回震荡往复无法达到目标点附近;
p越大,计算路径的速度越快,节点更快向目标点生长,但p过大时,遇到障碍物时要花费更多的时间才能绕开,反而使搜索速度下降。
从运行结果来看,搜索到的并非最优路径,可以了解RRT相关的改进算法如RRT*等,考虑到路径代价的优化。
运行视频:https://www.bilibili.com/video/BV1wK4y1R7H7/
运行代码:https://download.csdn.net/download/weixin_39199083/18932919?spm=1001.2014.3001.5501
自动驾驶路径规划算法学习-RRT算法及matlab实现相关推荐
- 自动驾驶路径规划——基于概率采样的路径规划算法(RRT、RRT*)
目录 1. RRT算法背景 1.1 RRT算法核心思想 1.2 RRT算法优缺点 2. 经典RRT算法 2.1 RRT算法流程 2.2 RRT伪代码 3. 基于目标概率采样 4. RRT*算法 4.1 ...
- 自动驾驶路径规划论文解析(5)
解析论文:A Sampling-Based Local Trajectory Planner for Autonomous Driving along a Reference Path 文章依然采用了 ...
- 自动驾驶路径规划:A*(Astar)算法
来源丨古月居 点击进入->3D视觉工坊学习交流群 1. 最佳优先搜索(Best-First Search) 最佳优先搜索(BFS),又称A算法,是一种启发式搜索算法(Heuristic Algo ...
- 自动驾驶路径规划五大常用算法(Dijkstra/人工势场/图搜索等)
编辑 | 希骥智能网联汽车 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[规划控制]技术交流群 后台回复[规划控制综述]获取自动驾驶 ...
- 自动驾驶路径规划概况
文章目录 前言 介绍 1. 路径规划在自动驾驶系统架构中的位置 2. 全局路径规划的分类 2.1 基础图搜索算法 2.1.1 Dijkstra算法 2.1.2 双向搜索算法 2.1.3 Floyd算法 ...
- 自动驾驶路径规划——基于概率采样的路径规划算法(PRM)
目录 1. PRM算法流程 1.1 预处理 1.2 搜索 2. PRM算法案例 2.1 构型采样 2.2 邻域计算 2.3 图搜索(A*搜索) 3. 采样数量的影响 4. 采样策略 4.1 基于障碍物 ...
- 自动驾驶路径规划——Dijkstra算法
目录 前言 1. 深度优先(DFS)和广度优先(BFS) 2. 深度优先搜索(DFS) 2.1 算法基本思想 2.2 深度优先搜索算法(C) 3. 广度优先搜索(BFS) 3.1 算法基本思想 3.2 ...
- 【路径规划-PRM路径规划】基于RRT算法避障路径规划附完整matlab代码
1 内容介绍 尽管RRT算法是一个相对高效率,同时可以较好的处理带有非完整约束的路径规划问题的算法,并且在很多方面有很大的优势,但是RRT算法并不能保证所得出的可行路径是相对优化的.因此许多关于RRT ...
- 自动驾驶路径规划技术-高速公路路径规划
Path Planning - Highway Driving project Github: https://github.com/williamhyin/CarND-Path-Planning E ...
- 汇总!自动驾驶路径规划中的障碍物处理方法总结
作者 | 西涯先生 编辑 | 汽车人 原文链接:https://zhuanlan.zhihu.com/p/635971229 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨 ...
最新文章
- CrackMe-CrackHead
- CPU GPU FPU TPU 及厂商
- 算法练习day19——190410(数组中重复的数字、替换空格、从尾到头打印链表)
- POJ 1789(最小生成树)
- SDL2源代码分析7:显示(SDL_RenderPresent())
- SpringMVC路径配置
- 设置pdf软件同时查看多页PDF
- python怎么筛选并列关系数据_一文带你学会如何用Python生成带误差棒的并列和堆积柱状图...
- java + selenium 实现QQ快速安全登录xx网站
- 海洋CMS采集-内置接口的海洋CMS采集
- 《算法通识16讲》学习笔记
- 稳若磐石的「云上奥运」背后,是云计算新界面的崛起
- Zynq-7000 - Which IBIS models should be used for Zynq-7000 devices?
- [激光原理与应用-16]:《激光原理与技术》-2- 光的本质(粒子、波动说、电磁波、量子)
- AD620仪表放大器介绍
- Cisco NAC介绍
- IEC60870-5-104报文解析
- 传统媒体试水微信杂志 联手搭建销售新模式
- 如何控制局域网网速_如何优化家中的网络设备,让你的网络最快?
- 把苹果全家桶用于VR全身追踪是什么体验
热门文章
- Visio2016卸载干净,以及同时安装Office2016和Visio2016的方法
- 简明python教程最新版价格_《简明Python教程》【价格 目录 书评 正版】_中国图书网...
- Android 四大开发组件
- android 四大组件,安卓四大组件及其作用
- 网络驱动器无法访问,提示找不到网络路径故障处理过程
- 22考研在职跨考软件工程(专业课408)目前待录取——经验分享和感受
- 钉钉小程序 DEMO的坑
- 云桌面优缺点_云桌面真的是办公最佳选择吗?云桌面的优缺点对比
- 使用软件测试路由器性能报告,路由器软件测试报告
- [病毒木马] LSP劫持