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

news2024/11/17 17:37:58

目录

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

二、概率路图(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的具体介绍在后面会具体介绍。

        

        

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

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

相关文章

每日一类:QString类深入讲解

QString类是Qt框架中的一个核心组件&#xff0c;设计用于方便、高效地处理Unicode字符串。与标准C中的字符串处理方式相比&#xff0c;QString提供了更为丰富的API&#xff0c;支持国际化&#xff0c;并且内部使用UTF-16编码&#xff0c;能够处理世界上几乎所有的语言文字。 设…

Python图像形态学处理:腐蚀、膨胀、礼帽、黑帽……

文章目录 二值形态学灰度形态学 python图像处理教程&#xff1a;初步&#x1f4f7;插值变换 最基础的形态学操作有四个&#xff0c;分别是腐蚀、膨胀、开计算和闭计算&#xff0c;【scipy.ndimage】分别实现了二值数组和灰度数组的这四种运算。而针对灰度图像&#xff0c;【sc…

android路由表APP,携程Android面试题

大家应该看过很多分享面试成功的经验&#xff0c;但根据幸存者偏差的理论&#xff0c;也许多看看别人面试失败在哪里&#xff0c;对自己才更有帮助。 最近跟一个朋友聊天&#xff0c;他准备了几个月&#xff0c;刚刚参加完字节跳动面试&#xff0c;第二面结束后&#xff0c;嗯&…

(案例贴2) html+css 倒计时器

欢迎大家使用这个计时器噢 老哥直接附代码咯. timer.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…

python 小游戏《2048》字符版非图形界面

参考链接&#xff1a; 闲谈2048小游戏和数组的旋转及翻转和转置 目录 2048 一、方阵类 二、随机插入1或2 三、 合并和递增 四、 判断和移动 五、 键盘控制 完整源代码 玩法过程 2048 上回说到2048小游戏中数组的各种旋转、翻转的方法&#xff0c;就是为代码编程作准…

非阻塞实现高效键盘扫描功能(STM32F4XX)

目录 概述 1 原理分析 1.1 技术背景 1.2 系统硬件 1.3 STM32 IO&#xff08;输入模式&#xff09;寄存器分析 1.3.1 输入IO的功能描述 1.3.2 输入配置 1.3.3 GPIO 寄存器&#xff08;输入模式相关&#xff09; 1.3.3.1 GPIO 端口模式寄存器 1.3.3.2 GPIO 端口上拉/下拉…

VUE3自定义文章排行榜的简单界面

文章目录 一、代码展示二、代码解读三、结果展示 一、代码展示 <template><div class"article-ranking"><div class"header"><h2 class"title">{{ title }}</h2></div><div class"ranking-list&qu…

单片机精进之路-9ds18b20温度传感器

ds18b20复位时序图&#xff0c;先将b20的数据引脚拉低至少480us&#xff0c;然后再将数据引脚拉高15-60us&#xff0c;再去将测传感器的数据引脚是不是变低电平并保持60-240us&#xff0c;如果是&#xff0c;则说明检测到温度传感器&#xff0c;并正常工作。需要在240us后才能检…

默频,主频,睿频

一、默频 默频就是跟在CPU型号后面的数字&#xff0c;如图中的CPU,默频是1.7GHZ 二、主频 可以理解为在运行中&#xff0c;电脑根据程序的需要进行调度&#xff0c;此时CPU的实际频率&#xff0c;在任务管理器中可以查看&#xff0c;如我的笔记本电脑在没有连接电源的情况下&…

云计算 2月21号 (linux文件及用户管理)

一、文件管理 1.1快捷键 编辑命令&#xff1a; Ctrl a &#xff1a;移到命令行首 Ctrl e &#xff1a;移到命令行尾 Ctrl u &#xff1a;从光标处删除至命令行首 Ctrl k &#xff1a;从光标处删除至命令行尾 Ctrl w &#xff1a;从光标处删除至字首 Ctrl d &#x…

图解知识蒸馏

soft labels与soft predictions越接近越好&#xff0c;通过Loss Fn来实现&#xff0c;产生的数值叫做distillation loss&#xff0c;也叫soft loss。 hard label y与hard prediction越接近越好&#xff0c;通过Loss Fn来实现&#xff0c;产生的数值叫做student loss&#xff0c…

模拟算法题练习(二、DNA序列修正、无尽的石头)

&#xff08;一、DNA序列修正&#xff09; 问题描述 在生物学中&#xff0c;DNA序列的相似性常被用来研究物种间的亲缘关系。现在我们有两条 DNA序列&#xff0c;每条序列由 A、C、G、T 四种字符组成&#xff0c;长度相同。但是现在我们记录的 DNA序列存在错误&#xff0c;为了…

C语言题目:指针

1. 下面代码的结果是&#xff1a; #include <stdio.h> int i; int main() {i--;if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0; }答案&#xff1a;> 解析&#xff1a; i作为全局变量且在未赋值的情况下初始值为1&…

大数据分布式计算工具Spark数据计算实战讲解(filter方法,distinct方法,sortby方法)

练习案例 # #单词统计计数 from pyspark import SparkConf, SparkContext import os os.environ[pyspark_python] "D:/python/JIESHIQI/python.exe" #创建一个sparkconf类对象 conf SparkConf().setMaster("local[*]").setAppName("test_spark_app…

学不动系列-git-hooks和husky+lintstage

git-hooks 为了保证提交的代码符合规范&#xff0c;可以在上传代码时进行校验。常用husky来协助进行代码提交时的eslint校验。husky是基于git-hooks来实现&#xff0c;在使用husky之前&#xff0c;我们先来研究一下git-hooks。 构建git-hooks测试项目 需要使用git-hooks就需…

日志系统项目实现

日志系统的功能也就是将一条消息格式化后写入到指定位置&#xff0c;这个指定位置一般是文件&#xff0c;显示器&#xff0c;支持拓展到数据库和服务器&#xff0c;后面我们就知道如何实现拓展的了&#xff0c;支持不同的写入方式(同步异步)&#xff0c;同步:业务线程自己写到文…

C语言基础(二)

5.指针 5.1 指针的定义 内存区域中的每字节都对应一个编号&#xff0c;这个编号就是“地址”. 在程序中定义一个变量&#xff0c;在对程序进行编译时&#xff0c;系统就会给这个变量分配内存单元. 按变量地址存取变量值的方式称为“直接访问”&#xff0c;如printf("&qu…

Nodejs+vue汽车保养美容管理系统vscode前后端分离项目

汽车美容保养管理系统后台采用nodejs语言开发,前台页面和后台管理页面使用vue等技术开发,使用MySql作为数据持久化存储工具对汽车美容保养管理系统的用户等角色权限对应的功能等进行存储。采用vsocde集成IDE对汽车美容保养管理系统统进行开发,整合系统的各个模块。 拟开发的汽车…

【数据分享】2000~2023年MOD15A2H 061 叶面积指数LAI数据集

各位同学们好&#xff0c;今天和大伙儿交流的是2000~2013年MOD15A2H 061 LAI数据集。如果大家有下载处理数据等方面的问题&#xff0c;您可以私信或评论。 Myneni, R., Y. Knyazikhin, T. Park. MODIS/Terra Leaf Area Index/FPAR 8-Day L4 Global 500m SIN Grid V061. 2021, d…

Python:关于数据服务中的Web API的设计

搭建类似joinquant、tushare类似的私有数据服务应用&#xff0c;有以下一些点需要注意&#xff1a; 需要说明的是&#xff0c;这里讨论的是web api前后端&#xff0c;当然还有其它方案&#xff0c;thrift&#xff0c;grpc等。因为要考虑到一鱼两吃&#xff0c;本文只探讨web ap…