智能驾驶规划控制理论学习03-基于采样的规划方法

目录

一、基于采样的规划方法概述

二、概率路图(PRM)

1、核心思想 

2、实现流程

3、算法描述

4、节点连接处理

5、总结

三、快速搜索随机树(RRT)

1、核心思想

2、实现流程

 3、总结

4、改进RRT算法

①快速搜索随机图(RRG)

②基于运动学的快速搜索随机树(Kinematic-based RRT)


一、基于采样的规划方法概述

        基于采样的方法就是在状态空间中不断地随机撒点,将这些节点根据一定的规则与周围的节点进行连接,以此构造一条条局部路径,最终找到一条从起点到终点的路径。随着采样点的不断增多,最终得到的解会不断逼近最优解。

        一般步骤:

  • 为图表添加随机数种子
  • 以某种策略或者给定条件采样到起始节点
  • 选择和哪些其他节点进行连接
  • 选择添加或者移除哪些边

二、概率路图(PRM)

1、核心思想 

        PRM有两个阶段分别是学习阶段(Learning Phase)和查询阶段(Query Phase)。

        学习阶段:

  • 在配置空间中随机采样足够数量的点;
  • 将相互之间能够到达的节点进行连接。

        查询阶段:

  • 利用图搜索算法寻找图表中从起始节点到目标节点的路径。 

2、实现流程

(a)图中所示为一个用于采样的配置空间,在配置空间中,自动驾驶车辆可以被近似看成一个质点,环境中的障碍物等信息都被近似为图中的forbidden space,自动驾驶车辆在free space空间中运动,二无需考虑其几何形状和运动状态;

(b)图中通过随机采样的方式获得一个坐标点,采样的方法也要根据特定的场景做出不同的选择,常见的采样算法有均匀分布采样(在未知场景中采样)、高斯分布采样(在自动驾驶场景中通常以车道中心线为均值)等;

 (c)图中通过采样大量的点来获取地图的形状;

 (d)图中对采样点进行碰撞检验,删除forbidden space中的采样点;

 (e)图中为删除forbiden space中的采样点后,在free space中保留下来的有效采样点;

  (f)图中每个有效采样点会连接以当前节点为圆心,半径r圆形范围内的所有采样点

 (g)图中若采样点之间的连线与forbiden space相交则发生碰撞,删除发生碰撞的连线;

  (f)图中碰撞检测通过的连线得到保留,作为构成图表graph的边;

 (i)在连线得到的图表graph中添加起始节点和目标节点;

 (j)在graph图中利用图搜索算法寻找最优路径。

3、算法描述

        用伪代码的方式对PRM进行简要描述:

V <- ∅; E <- ∅ // 分别维护两个集合,一个存放顶点,一个存放边
for i = 0,...,n do //假定最大采样点为n,进入循环x <- SampleFree;  //在freespace通过特定的采样策略采样得到一个节点U <- Near(G = (V,E), x, r);  //将节点半径r范围内要专注的邻居节点加入集合U中V <- V ∪ {x}; //将当前采样点x加入集合V中,更新集合Vforeach u in U, in order of increasing ||u - x||, do //对集合U中存入的节点进行处理,为了避免节点过于密集,u和x不能过于接近if x and u are not in the same connected component of G = (V,E) then  // 保证u和x之间的连线与其他连线不重合if CollisionFree(x,u) then E <- E∪{(x,u),(u,x)};  // 通过碰撞检验则将x和u的连线加入集合E
return G=(V,E); // 返回V和E表示的图

        上面是经典的PRM算法描述,也可以对其进行简化:

V <- {x}∪{SampleFree}; E <- ∅;
foreach v in V do U <- near(G=(V,E),v,r)\{v};foreach u in U doif CollisionFree(v,u) then E <- E∪{(v,u),(u,v)}
return G=(V,E);

        主要就是减少了剔除部分节点的步骤,因此在算法实现上效率会降低。

4、节点连接处理

        在PRM实现过程中,选择那些节点相连也是需要考虑的问题,下面给出三种可行的方法:

  • k-Nearest PRM:选择当前节点最近的k个邻居节点

U ← kNearest(G=(V,E),v,k)

  • Bounded-degree PRM:对半径范围内添加的最近节点添加一个边界值k

U ← Near(G,x,r) ∩ kNearest(G=(V,E),v,k)

  • Variable-radius PRM:让连接半径称为对应节点个数的函数,而不是固定的参数

5、总结

        PRM优点:具有概率完备性,只要采样点足够多,并且生成的图表有解那么一定可以结合图搜索算法找到一条最优解路径;

        缺点:

  • 如果是连接特定起点和终点,那么通过PRM的两个阶段先建图在搜索是比较浪费资源的;
  • 搜索得到的路径是节点之间通过直线连接的,不符合车辆的运动学约束。

三、快速搜索随机树(RRT)

1、核心思想

        与PRM有学习和查询两个阶段,并且在学习阶段构造的是一个图不同,RRT只有一个阶段,在采样结束的同时就能确定路径,RRT在采样的过程中维护的是一个树结构。相比图描述的网络关系,树结构描述的是一种层次关系。

        在RRT算法中,通常将起始节点作为树的根节点,在采样搜索到目标节点时通过回溯就可以确定路径。

2、实现流程

        依然使用伪代码对实现流程进行简要描述:

V <- {root}; E <- ∅; // 维护集合V和E,分别存放节点和边,在V中先将初始节点作为根节点放入
for i = 1,...,n doxrand ← SampleFree; // 在freespcace中得到采样点xrandxnearest ← Nearest(G=(V,E),xrand); // 设置离xrand距离最近的树节点为xnearestxnew ← steer(xnearest,xrand); // 通过特定的方式将xnearest与xrand进行连接,此处直接设置了一个中间节点,比较经典的方式设置一段弧长if ObtacleFree(xnearest,xrand) then  // 进行连线障碍物检测V ← V∪{xnew}; E ← E∪{xnearest,xnew};  // 检测通过将边保存到集合E中
return G={V,E};

 3、总结

        优点:如果是找寻找两个特定节点间的路径,RRT的效率会显著地优于PRM;

        缺点:RRT不具备概率完备性,因为它每次都是树的最近节点连接,如下图红色区域中搜索得到的路径显然不是最优解。

4、改进RRT算法

        为了解决RRT算法不具备概率完备性的缺陷,后来又提出了多种改进的RRT算法。

①快速搜索随机图(RRG)
V <- {root}; E <- ∅; 
for i = 1,...,n doxrand ← SampleFree; xnearest ← Nearest(G=(V,E),xrand); xnew ← steer(xnearest,xrand);if ObtacleFree(xnearest,xrand) then Xnear ← Near(G=(V,E),xnew,min{γRRG(log(card(V))/card(V)^(1/d),η); // 将xnew附近给定半径内的所有节点都存入Xnear集合中V ← V∪{xnew}; E ← E∪{xnearest,xnew};foreach xnear in Xnear doif CollisionFree(xnear,xnew) then E ← E∪{xnearest,xnew};  // 将通过碰撞检测的所有Xnear集合中的节点与xnew的连线都存入集合E中return G={V,E};

        核心思想:不仅仅只是连接xnew和xnearest,将xnew半径范围内的所有符合非碰撞条件的节点都连接。

        虽然RRG使得算法具有概率完备性,但是却违背了RRT算法提高效率的初衷,因为RRG算法在实现过程中并没有在维护树结构,输出的依然是一个图,相当于是PRM的学习阶段,还要再利用搜索算法进行最优路径确定。

②基于运动学的快速搜索随机树(Kinematic-based RRT)

        核心思想:利用车辆运动学方法在两个节点之间进行转向,主要在于RRT伪代码中xnew获取步骤的优化。

        上图所示是基于杜宾斯规划(dubins_path_planning)得到的路径,可以看出在引入车辆运动学方法后,得到的最终路径是一条较为平滑的曲线。dubins_path_planning的具体介绍在后面会具体介绍。

四、优化的快速搜索随机数(RRT*)

1、核心思想

  • 与RRG算法相比,RRT*算法维护的是一个树结构,而不是一个图,也就是说会在RRG得的图中删除掉多余的边界;
  • 与原来的RRT算法相比,RRT*增加了重连的步骤以确保各个节点取得的是最小代价值。

2、实现流程

V <- {root}; E <- ∅; 
for i = 1,...,n doxrand ← SampleFree; xnearest ← Nearest(G=(V,E),xrand); xnew ← steer(xnearest,xrand);if ObtacleFree(xnearest,xrand) then // 延续RRG的思想先搜索附近的邻居节点Xnear ← Near(G=(V,E),xnew,min{γRRG(log(card(V))/card(V)^(1/d),η); V ← V∪{xnew};xmin ← xnear; cmin ← Cost(xnearest) + c(Line(xnearest,xnew));// 获取代价值最小节点foreach xnear in Xnear do if CollisionFree(xnear,xnew) && Cost(xnew) + c(Line(xnearest,xnew)) < c(min) thenxmin ← xnear; cmin ← Cost(xnear) + c(Line(xnearest,xnew))// 对节点进行重连,通过xnew更新总代价值值和路径foreach xnear in Xnear do if CollisionFree(xnew,xnear) && Cost(xnew) + c(Line(xnew,xnearest)) < Cost(xnear)then xparent ← Parent(xnear);E ← (E\{xparent,xnear}∪{xnew,xnear}) // 在边集合中删除xnear到其原父节点xparent的连线,重新加入xnew到xnear的连线
return G = {V,E};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/714888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运筹学_1.1.2 线性规划问题-图解法

1.1.2 线性规划问题-图解法 一、图解法求解步骤&#xff08;只适用于两个决策变量问题&#xff09;二、图解法作图实例三、图解法分析线性规划几种解的情况1、唯一最优解2、无穷多最优解3、无界解4、无解或无可行解 四、图解法的几点启示 一、图解法求解步骤&#xff08;只适用…

深入浅出Redis(一):对象与数据结构

引言 Redis是一款基于键值对的数据结构存储系统&#xff0c;它的特点是基于内存操作、单线程处理命令、IO多路复用模型处理网络请求、键值对存储与简单丰富的数据结构等等 这篇文章主要围绕Redis中的对象与数据结构来详细说明键值对存储与简单丰富的数据结构这两大特点 Redi…

运筹学_1.1.4 线性规划问题-解的概念

1.1.4 线性规划问题-解的概念 一、可行解与最优解二、基的概念三、基变量、基向量&#xff1b;非基变量、非基向量&#xff1b;基解、基可行解&#xff1b;四、最优解与可行解、基可行解的关系五、用例题&#xff08;枚举法&#xff09;巩固基解、基可行解、最优解三个概念1、例…

5、DVWA代码审计(2)

一、csrf 1、csrf(low) 限制 复现 GET /vulnerabilities/csrf/?password_new123456&password_conf123456&ChangeChange HTTP/1.1 Host: ddd.com Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,…

电子电器架构 —— DoIP协议相关的介绍

电子电器架构 —— DoIP协议相关的介绍 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕…

vue3编写H5适配横竖屏

具体思路如下&#xff1a; 1、监听浏览器屏幕变化&#xff0c;通过监听屏幕宽高&#xff0c;辨别出是横屏&#xff0c;还是竖屏状态 在项目的起始根页面进行监听&#xff0c;我就是在App.vue文件下进行监听 代码如下&#xff1a; <template><RouterView /> <…

【Spring IoC】实验四:特殊值处理

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

C++ //练习 10.16 使用lambda编写你自己版本的biggies。

C Primer&#xff08;第5版&#xff09; 练习 10.16 练习 10.16 使用lambda编写你自己版本的biggies。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*******************************************************************…

BERTopic安装最全教程及报错处理

BERTopic安装 BERTopic的安装比较复杂,直接安装会报错 安装方法1,.whl文件安装 ERROR: Could not build wheels for hdbscan, which is required to install pyproject.toml-based projects正确安装流程 查看python能安装whl的版本pip debug --verbose Compatible tags: 2…

图表背后的智慧:办公场景中的数据可视化革新

在现代办公场景中&#xff0c;数据可视化的应用已经成为提高效率、推动创新的得力工具。无论是管理层还是普通员工&#xff0c;都能从数据可视化中受益匪浅。下面我就以可视化从业者的角度&#xff0c;简单聊聊这个话题。 首先&#xff0c;数据可视化提升了数据的易读性与理解性…

【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug

文章目录 前言 State断点 Transition断点 条件断点 按State步进 Watch Data Value Sequence Viewer 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑…

Flink状态存储-StateBackend

文章目录 前言一、MemoryStateBackend二、FSStateBackend三、RocksDBStateBackend四、StateBackend配置方式五、状态持久化六、状态重分布OperatorState 重分布KeyedState 重分布 七、状态过期 前言 Flink是一个流处理框架&#xff0c;它需要对数据流进行状态管理以支持复杂的…

10个技巧,3分钟教会你高效寻找开源项目

作为程序员&#xff0c;不论是开发还是学习&#xff0c;肯定会用到开源项目&#xff0c;那么怎么快速在开源网站找到这些项目呢&#xff1f; 常用的开源网站有&#xff1a;github 和 gitee github是全球最大的开源社区&#xff0c;今天就以github为例&#xff0c;演示一下 gi…

JavaWeb之 Servlet(2万6千字详解)

目录 前言1. Servlet 简介2. Servlet 前世今生3. Servlet 执行流程4. Servlet 快速入门5. 两种配置 Servlet程序 URL的方式5.1 使用 注解来配置 Servlet程序 的 URL5.1.1 urlPattern 的配置规则精确匹配目录匹配&#xff1a;使用 * 符号代表任意路径扩展名匹配任意匹配 5.1.2 小…

【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱

1 基本定义 SG 滤波算法&#xff08;Savitzky - Golay 滤波算法&#xff09;是一种数字信号处理算法&#xff0c;用于对信号进行平滑处理。该算法利用最小二乘法拟合局部数据段&#xff0c;然后用拟合的函数来估计每个数据点的值&#xff0c;从而实现平滑处理。 SG 滤波算法的…

redis05 sprngboot整合redis

redis的Java客户端 整合步骤 添加redis的pom依赖 <!-- 引入redis依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency><!-- 引入redis连…

51单片机学习day02

基于普中的stc89c52&#xff0c; 串口&#xff1a; 通讯接口&#xff0c;51单片机自带UART&#xff08;通用异步收发器&#xff09;&#xff0c;可实现窗口通讯。 硬件电路&#xff1a; 简单双向串口通信有两根通信线&#xff08;发送端TXD和接收端RXD&#xff09;&#xff0…

HelixToolKit的模型旋转操作

前面加载了模型以后&#xff0c;鼠标拖动和缩放比较好操作&#xff1b;但是旋转似乎没有&#xff0c; 操作了一阵&#xff0c;也不是没有&#xff0c;应该是还不熟悉&#xff1b; 旋转的指示器在右下角&#xff0c;现在U面看到正面&#xff0c; 想看一下模型的背面&#xff0…

【Java项目介绍和界面搭建】拼图小游戏——添加图片

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

扼杀网络中的环路:STP、RSTP、MSTP

目录 前言&#xff1a; 一、STP&#xff08;Spanning Tree Protocol&#xff09; 1.1 STP功能 1.2 STP应用 二、RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09; 2.1 RSTP功能 2.2 RSTP应用 三、MSTP&#xff08;Multiple Spanning Tree Protocol&#xff0…