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

目录

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

二、概率路图(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中,更新集合V
    foreach 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 do
        if 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 do
    xrand ← SampleFree; // 在freespcace中得到采样点xrand
    xnearest ← Nearest(G=(V,E),xrand); // 设置离xrand距离最近的树节点为xnearest
    xnew ← 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 do
    xrand ← 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 do
        if 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的具体介绍在后面会具体介绍。

        

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Newtonsoft.Json

目录 引言 1、简单使用 1.1、官方案例 1.2、JsonConvert 2、特性 2.1、默认模式[JsonObject(MemberSerialization.OptIn/OptOut)] 2.2、序列化为集合JsonArrayAttribute/JsonDictionaryAttribute 2.3、序列化该元素JsonProperty 2.4、忽略元素JsonIgnoreAttribute 2.5、…

来,和同频的人一起学习论文#理解技术趋势

学习新技术&#xff0c;慢慢也有了施展拳脚的地方。今天我们给ComfyUI中文爱好者社区成员提供了一个工作机会&#xff0c;有需要可以联系我们的小助手&#xff1a; 相信这几天大家都看到了我们更新了些论文笔记出来&#xff0c;阅读1篇英文论文我们需要花几个小时&#xff0c;如…

STM32串口DMA发送接收(1.5Mbps波特率)机制

数据拷贝过程中不需要CPU干预&#xff0c;数据拷贝结束则通知CPU处理。 以115200bps波特率&#xff0c;1s传输11520字节&#xff0c;大约69us需响应一次中断&#xff0c;如波特率再提高&#xff0c;将消耗更多CPU资源 高波特率场景下&#xff0c;串口非常有必要使用DMA。 关…

C#使用iText7将多个PDF文档合并为单个文档

使用HtmlAgilityPack抓取并分析网页内容&#xff0c;然后再调用PuppeteerSharp将网页生成PDF文件&#xff0c;最终的成果如下图所示&#xff0c;得到将近120个pdf文档。能看&#xff0c;但是不方便&#xff0c;需要逐个打开文档才能看到所需的内容&#xff0c;最好能将这些文档…

Ps:绘画对称功能

Photoshop 中的绘画对称 Paint Symmetry功能允许用户在画布上创建对称的绘画和设计&#xff0c;极大地提高了创作的效率和准确性&#xff0c;尤其适合于制作复杂的对称图形和图案。 可在使用画笔工具、铅笔工具或橡皮擦工具时启用“绘画对称"功能。 提示&#xff1a; 绘画…

【IO流系列】ObjectStream 序列化流与反序列化流

序列化流与反序列化流 1. 概述2. 作用3. 序列化流&#xff08;对象操作字节输出流&#xff09;3.1 构造方法3.2 成员方法3.3 代码示例 4. 反序列化流&#xff08;对象操作字节输入流&#xff09;4.1 构造方法4.2 成员方法4.3 代码示例 5. 细节6. 练习6.1 练习1&#xff1a;用对…

看待事物的层与次 | DBA与架构的一次对话交流

前言 在计算机软件业生涯中,想必行内人或多或少都能感受到系统架构设计与数据库系统工程的重要性,也能够清晰地认识到在计算机软件行业中技术工程师这个职业所需要的专业素养和必备技能! 背景 通过自研的数据库监控管理工具,发现 SQL Server 数据库连接数在1-2K之间,想…

【git】入门

当我们设计文档时&#xff0c;我们会不断的修改文档&#xff0c;而设计的文档通过第一次修改&#xff0c;第二次修改&#xff0c;很难讲每次修改的版本维护起来&#xff0c;每个版本可以分为v1,v2 ,v3,v4如果需要哪个版本&#xff0c;我们可以直接查看。 随着版本的不断增多&am…

当大语言模型遇到AI绘画-google gemma与stable diffusion webui融合方法-矿卡40hx的AI一体机

你有想过建一台主机&#xff0c;又能AI聊天又能AI绘画&#xff0c;还可以直接把聊天内容直接画出来的机器吗&#xff1f; 当Google最新的大语言模型Gemma碰到stable diffusion webui会怎么样&#xff1f; 首先我们安装stable diffusion webui(automatic1111开源项目&#xff…

群晖NAS配置WebDav结合内网穿透实现公网访问本地影视资源

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

贪心算法(算法竞赛、蓝桥杯)--修理牛棚

1、B站视频链接&#xff1a;A27 贪心算法 P1209 [USACO1.3] 修理牛棚_哔哩哔哩_bilibili 题目链接&#xff1a;[USACO1.3] 修理牛棚 Barn Repair - 洛谷 #include <bits/stdc.h> using namespace std; const int N205; int m,s,c,ans; int a[N];//牛的位置标号 int d[N…

opencv--使用直方图找谷底进行确定分割阈值

直方图原理就不说了&#xff0c;大家自行百度 直方图可以帮助分析图像中的灰度变化&#xff0c;进而帮助确定最优二值化的灰度阈值&#xff08;threshold level&#xff09;。如果物体与背景的灰度值对比明显&#xff0c;此时灰度直方图就会包含双峰&#xff08;bimodal histo…

【golang】25、图片操作

用 “github.com/fogleman/gg” 可以画线, 框 用 “github.com/disintegration/imaging” 可以变换颜色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

C# 获取类型 Type.GetType()

背景 C#是强类型语言&#xff0c;任何对象都有Type&#xff0c;有时候需要使用Type来进行反射、序列化、筛选等&#xff0c;获取Type有Type.GetType, typeof()&#xff0c;object.GetType() 等方法&#xff0c;本文重点介绍Type.GetType()。 系统类型/本程序集内的类型 对于系…

【k8s配置与存储--配置管理】

1、ConfigMap的配置 1.1 ConfigMap介绍 ConfigMap 是一种 API 对象&#xff0c;用来将非机密性的数据保存到键值对中。使用时&#xff0c; Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。 ConfigMap 将你的环境配置信息和容器镜像解耦&#xff0c;便于应用配…

蓝牙耳机和笔记本电脑配对连接上了,播放设备里没有显示蓝牙耳机这个设备,选不了输出设备

环境&#xff1a; WIN10 杂牌蓝牙耳机6s 问题描述&#xff1a; 蓝牙耳机和笔记本电脑配对连接上了&#xff0c;播放设备里没有显示蓝牙耳机这个设备&#xff0c;选不了输出设备 解决方案&#xff1a; 1.打开设备和打印机&#xff0c;找到这个设备 2.选中这个设备&#…

Linux下gcc编译常用命令详解

在Linux环境下&#xff0c;使用gcc编译器进行源代码的编译是程序员日常工作的一部分。本篇将介绍一些常用的gcc编译命令&#xff0c;帮助开发者更好地理解和使用这些命令。 1. 基本编译命令 gcc工作流程&#xff1a; 编译单个源文件 gcc source.c -o output这个命令将sour…

java学习笔记-初级

一、变量 1.双标签 <!-- 外部js script 双标签 --><script srcmy.js></script> 在新文件my.js里面写&#xff1a; 2.字符串定义&#xff1a; //外单内双var str 我是一个"高富帅"的程序员;console.log(str);// 字符串转义字符 都是用 \ 开头 …

Jenkins自动化部署之流水线模式部署

文章目录 任务类型Pipeline流水线项目声明式的Pipeline脚本式Pipeline 示例脚本生成Tools配置示例 高级Pipeline Script from SCM 任务类型 在Jenkins中&#xff0c;有不同类型的任务&#xff08;项目&#xff09;适用于不同的构建需求。以下是一些常见的Jenkins任务类型&…

供应链投毒预警 | 恶意NPM包利用Windows反向shell后门攻击开发者

概述 本周&#xff08;2024年02月19号&#xff09;&#xff0c;悬镜供应链安全情报中心在NPM官方仓库&#xff08;https://npmjs.com&#xff09;中发现多起NPM组件包投毒事件。攻击者利用包名错误拼写方式 (typo-squatting)在NPM仓库中连续发布9个不同版本的恶意包&#xff0…