自动驾驶全局路径规划的常用算法

汽车电子与软件 2022-12-25 19:38

作者| 11号线人

题图| 电影《五亿探长雷洛传1:雷老虎》

决策规划(一),自动驾驶安全、舒适、高效的“守护神”

正菜之前,我们先来了解一下图(包括有向图无向图)的概念。图是图论中的基本概念,用于表示物体与物体之间存在某种关系的结构。在图中,物体被称为节点或顶点,并用一组点或小圆圈表示。节点间的关系称作边,可以用直线或曲线来表示节点间的边。

如果给图的每条边规定一个方向,那么得到的图称为有向图,其边也称为有向边,如图10所示。在有向图中,与一个节点相关联的边有出边和入边之分,而与一个有向边关联的两个点也有始点和终点之分。相反,边没有方向的图称为无向图。

图10 有向图示例

数学上,常用二元组G =(V,E)来表示其数据结构,其中集合V称为点集,E称为边集。对于图6所示的有向图,V可以表示为{A,B,C,D,E,F,G},E可以表示为{,}。表示从顶点A发向顶点B的边,A为始点,B为终点。

在图的边中给出相关的数,称为权。权可以代表一个顶点到另一个顶点的距离、耗费等,带权图一般称为网。

在全局路径规划时,通常将图11所示道路和道路之间的连接情况,通行规则,道路的路宽等各种信息处理成有向图,其中每一个有向边都是带权重的,也被称为路网(Route Network Graph)。

图11 道路连接情况

那么,全局路径的规划问题就变成了在路网中,搜索到一条最优的路径,以便可以尽快见到那个心心念念的她,这也是全局路径规划算法最朴素的愿望。而为了实现这个愿望,诞生了DijkstraA*两种最为广泛使用的全局路径搜索算法。




Dijkstra算法

戴克斯特拉算法(Dijkstra’s algorithm)是由荷兰计算机科学家Edsger W. Dijkstra在1956年提出,解决的是有向图中起点到其他顶点的最短路径问题。

假设有A、B、C、D、E、F五个城市,用有向图表示如图12,边上的权重代表两座城市之间的距离,现在我们要做的就是求出起点A城市到其它城市的最短距离。

图12 五个城市构建的有向图

用Dijkstra算法求解步骤如下:

(1)创建一个二维数组E来描述顶点之间的距离关系,如图13所示。E[B][C]表示顶点B到顶点C的距离。自身之间的距离设为0,无法到达的顶点之间设为无穷大。

图13 顶点之间的距离关系

(2)创建一个一维数组Dis来存储起点A到其余顶点的最短距离。一开始我们并不知道起点A到其它顶点的最短距离,一维数组Dis中所有值均赋值为无穷大。接着我们遍历起点A的相邻顶点,并将与相邻顶点B和C的距离3(E[A][B])和10(E[A][C])更新到Dis[B]和Dis[C]中,如图14所示。这样我们就可以得出起点A到其余顶点最短距离的一个估计值。

图14 Dis经过一次遍历后得到的值

(3)接着我们寻找一个离起点A距离最短的顶点,由数组Dis可知为顶点B。顶点B有两条出边,分别连接顶点C和D。因起点A经过顶点B到达顶点C的距离8(E[A][B] + E[B][C] = 3 + 5)小于起点A直接到达顶点C的距离10,因此Dis[C]的值由10更新为8。同理起点A经过B到达D的距离5(E[A][B] + E[B][D] = 3 + 2)小于初始值无穷大,因此Dis[D]更新为5,如图15所示。

图15 Dis经过第二次遍历后得到的值

(4)接着在剩下的顶点C、D、E、F中,选出里面离起点A最近的顶点D,继续按照上面的方式对顶点D的所有出边进行计算,得到Dis[E]和Dis[F]的更新值,如图16所示。

图16 Dis经过第三次遍历后得到的值

(5)继续在剩下的顶点C、E、F中,选出里面离起点A最近的顶点C,继续按照上面的方式对顶点C的所有出边进行计算,得到Dis[E]的更新值,如图17所示。

图17 Dis经过第四次遍历后得到的值

(6)继续在剩下的顶点E、F中,选出里面离起点A最近的顶点E,继续按照上面的方式对顶点E的所有出边进行计算,得到Dis[F]的更新值,如图18所示。

图18 Dis经过第五次遍历后得到的值

(6)最后对顶点F所有点出边进行计算,此例中顶点F没有出边,因此不用处理。至此,数组Dis中距离起点A的值都已经从“估计值”变为了“确定值”。

基于上述形象的过程,Dijkstra算法实现过程可以归纳为如下步骤:

(1)将有向图中所有的顶点分成两个集合P和Q,P用来存放已知距离起点最短距离的顶点,Q用来存放剩余未知顶点。可以想象,一开始,P中只有起点A。同时我们创建一个数组Flag[N]来记录顶点是在P中还是Q中。对于某个顶点N,如果Flag[N]为1则表示这个顶点在集合P中,为1则表示在集合Q中。

(2)起点A到自己的最短距离设置为0,起点能直接到达的顶点N,Dis[N]设为E[A][N],起点不能直接到达的顶点的最短路径为设为∞。

(3)在集合Q中选择一个离起点最近的顶点U(即Dis[U]最小)加入到集合P。并计算所有以顶点U为起点的边,到其它顶点的距离。例如存在一条从顶点U到顶点V的边,那么可以通过将边U->V添加到尾部来拓展一条从A到V的路径,这条路径的长度是Dis[U]+e[U][V]。如果这个值比目前已知的Dis[V]的值要小,我们可以用新值来替代当前Dis[V]中的值。

(4)重复第三步,如果最终集合Q结束,算法结束。最终Dis数组中的值就是起点到所有顶点的最短路径。




A*算法

1968年,斯坦福国际研究院的Peter E. Hart, Nils Nilsson以及Bertram Raphael共同发明了A*算法。A*算法通过借助一个启发函数来引导搜索的过程,可以明显地提高路径搜索效率。

下文仍以一个实例来简单介绍A*算法的实现过程。如图19所示,假设小马要从A点前往B点大榕树底下去约会,但是A点和B点之间隔着一个池塘。为了能尽快提到达约会地点,给姑娘留下了一个守时踏实的好印象,我们需要给小马搜索出一条时间最短的可行路径。

图19 约会场景示意图

A*算法的第一步就是简化搜索区域,将搜索区域划分为若干栅格。并有选择地标识出障碍物不可通行与空白可通行区域。一般地,栅格划分越细密,搜索点数越多,搜索过程越慢,计算量也越大;栅格划分越稀疏,搜索点数越少,相应的搜索精确性就越低。

如图20所示,我们在这里将要搜索的区域划分成了正方形(当然也可以划分为矩形、六边形等)的格子,图中蓝色格子代表A点(小马当前的位置),紫色格子代表B点(大榕树的位置),灰色格子代表池塘。同时我们可以用一个二维数组S来表示搜素区域,数组中的每一项代表一个格子,状态代表可通行和不可通行。

图20 经过简化后的搜索区域

接着我们引入两个集合OpenList和CloseList,以及一个估价函数F = G + H。OpenList用来存储可到达的格子,CloseList用来存储已到达的格子。G代表从起点到当前格子的距离,H表示在不考虑障碍物的情况下,从当前格子到目标格子的距离。F是起点经由当前格子到达目标格子的总代价,值越小,综合优先级越高。

G和H也是A*算法的精髓所在,通过考虑当前格子与起始点的距离,以及当前格子与目标格子的距离来实现启发式搜索。对于H的计算,又有两种方式,一种是欧式距离,一种是曼哈顿距离。

欧式距离用公式表示如下,物理上表示从当前格子出发,支持以8个方向向四周格子移动(横纵向移动+对角移动)。

曼哈顿距离用公式表示如下,物理上表示从当前格子出发,支持以4个方向向四周格子移动(横纵向移动)。这是A*算法最常用的计算H值方法,本文H值的计算也采用这种方法。

现在我们开始搜索,查找最短路径。首先将起点A放入到OpenList中,并计算出此时OpenList中F值最小的格子作为当前方格移入到CloseList中。由于当前OpenList中只有起点A这个格子,所以将起点A移入CloseList,代表这个格子已经检查过了。

接着我们找出当前格子A上下左右所有可通行的格子,看它们是否在OpenList当中。如果不在,加入到OpenList中计算出相应的G、H、F值,并把当前格子A作为它们的父节点。本例子,我们假设横纵向移动代价为10,对角线移动代价为14。

我们在每个格子上标出计算出来的F、G、H值,如图21所示,左上角是F,左下角是G,右下角是H。通过计算可知S[3][2]格子的F值最小,我们把它从OpenList中取出,放到CloseList中。

图21 第一轮计算后的结果

接着将S[3][2]作为当前格子,检查所有与它相邻的格子,忽略已经在CloseList或是不可通行的格子。如果相邻的格子不在OpenList中,则加入到OpenList,并将当前方格子S[3][2]作为父节点。

已经在OpenList中的格子,则检查这条路径是否最优,如果非最优,不做任何操作。如果G值更小,则意味着经由当前格子到达OpenList中这个格子距离更短,此时我们将OpenList中这个格子的父节点更新为当前节点。

对于当前格子S[3][2]来说,它的相邻5个格子中有4个已经在OpenList,一个未在。对于已经在OpenList中的4个格子,我们以它上面的格子S[2][2]举例,从起点A经由格子S[3][2]到达格子S[2][2]的G值为20(10+10)大于从起点A直接沿对角线到达格子S[2][2]的G值14。显然A经由格子S[3][2]到达格子S[2][2]不是最优的路径。当把4个已经在OpenList 中的相邻格子都检查后,没有发现经由当前方格的更好路径,因此我们不做任何改变。

对于未在OpenList的格子S[2][3](假设小马可以斜穿墙脚),加入OpenList中,并计算它的F、G、H值,并将当前格子S[3][2]设置为其父节点。经历这一波骚操作后,OpenList中有5个格子,我们需要从中选择F值最小的那个格子S[2][3],放入CloseList中,并设置为当前格子,如图22所示。

图22 第二轮计算后的结果

重复上面的故事,直到终点也加入到OpenList中。此时我们以当前格子倒推,找到其父节点,父节点的父节点……,如此便可搜索出一条最优的路径,如图23中红色圆圈标识。

图23 最后计算得到的结果

基于上述形象的过程,A*算法实现过程可以归纳为如下步骤:

(1)将搜索区域按一定规则划分,把起点加入OpenList。

(2)在OpenList中查找F值最小的格子,将其移入CloseList,并设置为当前格子。

(3)查找当前格子相邻的可通行的格子,如果它已经在OpenList中,用G值衡量这条路径是否更好。如果更好,将该格子的父节点设置为当前格子,重新计算F、G值,如果非更好,不做任何处理;如果不在OpenList中,将它加入OpenList中,并以当前格子为父节点计算F、G、H值。

(4)重复步骤(2)和步骤(3),直到终点加入到OpenList中。




两种算法比较

Dijkstra算法的基本思想是“贪心”,主要特点是以起点为中心向周围层层扩展,直至扩展到终点为止。通过Dijkstra算法得出的最短路径是最优的,但是由于遍历没有明确的方向,计算的复杂度比较高,路径搜索的效率比较低。且无法处理有向图中权值为负的路径最优问题。

A*算法将Dijkstra算法与广度优先搜索(Breadth-First-Search,BFS)算法相结合,并引入启发函数(估价函数),大大减少了搜索节点的数量,提高了搜索效率。但是A*先入为主的将最早遍历路径当成最短路径,不适用于动态环境且不太适合高维空间,且在终点不可达时会造成大量性能消耗。

图24是两种算法路径搜索效率示意图,左图为Dijkstra算法示意图,右图为A*算法示意图,带颜色的格子表示算法搜索过的格子。由图24可以看出,A*算法更有效率,手术的格子更少。

图24 Dijkstra算法和A*算法搜索效率对比图(图片来源:https://mp.weixin.qq.com/s/myU204Uq3tfuIKHGD3oEfw)


敬请期待:
决策规划(三),行为决策常用算法
决策规划(四),运动规划常用算法


初心 | 记录生而为人的证据,分享工农阶层原创作品,聚焦智能网联与人情冷暖。
声明 | 本文部分文字及图片资料取自网络,如有侵权,请联系平台进行修改或删除;文章属于作者本人,仅代表个人观点,不代表平台立场,如有不妥,也请联系平台修改或删除;本文不作任何商业用途。

汽车电子与软件 主要介绍汽车电子软件设计相关内容,每天分享一篇技术文章!
评论
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 41浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 38浏览
  • Matter加持:新世代串流装置如何改变智能家居体验?随着现在智能家庭快速成长,串流装置(Streaming Device,以下简称Streaming Device)除了提供更卓越的影音体验,越来越多厂商开始推出支持Matter标准的串流产品,使其能作为智能家庭中枢,连结多种智能家电。消费者可以透过Matter的功能执行多样化功能,例如:开关灯、控制窗帘、对讲机开门,以及操作所有支持Matter的智能家电。此外,再搭配语音遥控器与语音助理,打造出一个更加智能、便捷的居家生活。支持Matter协议
    百佳泰测试实验室 2025-01-03 10:29 143浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 164浏览
  • 影像质量应用于多个不同领域,无论是在娱乐、医疗或工业应用中,高质量的影像都是决策的关键基础。清晰的影像不仅能提升观看体验,还能保证关键细节的准确传达,例如:在医学影像中,它对诊断结果有着直接的影响!不仅如此,影像质量还影响了:▶ 压缩技术▶ 存储需求▶ 传输效率随着技术进步,影像质量的标准不断提高,对于研究与开发领域,理解并提升影像质量已成为不可忽视的重要课题。在图像处理的过程中,硬件与软件除了各自扮演着不可或缺的基础角色,有效地协作能够确保图像处理过程既高效又具有优异的质量。软硬件各扮演了什么
    百佳泰测试实验室 2025-01-03 10:39 143浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 42浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 23浏览
  • 车身域是指负责管理和控制汽车车身相关功能的一个功能域,在汽车域控系统中起着至关重要的作用。它涵盖了车门、车窗、车灯、雨刮器等各种与车身相关的功能模块。与汽车电子电气架构升级相一致,车身域发展亦可以划分为三个阶段,功能集成愈加丰富:第一阶段为分布式架构:对应BCM车身控制模块,包含灯光、雨刮、门窗等传统车身控制功能。第二阶段为域集中架构:对应BDC/CEM域控制器,在BCM基础上集成网关、PEPS等。第三阶段为SOA理念下的中央集中架构:VIU/ZCU区域控制器,在BDC/CEM基础上集成VCU、
    北汇信息 2025-01-03 16:01 175浏览
  • 本文继续介绍Linux系统查看硬件配置及常用调试命令,方便开发者快速了解开发板硬件信息及进行相关调试。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。查看系统版本信息查看操作系统版本信息root@ido:/# cat /etc/*releaseDISTRIB_ID=UbuntuDISTRIB_RELEASE=20.04DISTRIB_CODENAME=focalDIS
    Industio_触觉智能 2025-01-03 11:37 138浏览
  • 在测试XTS时会遇到修改产品属性、SElinux权限、等一些内容,修改源码再编译很费时。今天为大家介绍一个便捷的方法,让OpenHarmony通过挂载镜像来修改镜像内容!触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系统,适合鸿蒙开发入门学习。挂载镜像首先,将要修改内容的镜像传入虚拟机当中,并创建一个要挂载镜像的文件夹,如下图:之后通过挂载命令将system.img镜像挂载到sys
    Industio_触觉智能 2025-01-03 11:39 113浏览
  • 物联网(IoT)的快速发展彻底改变了从智能家居到工业自动化等各个行业。由于物联网系统需要高效、可靠且紧凑的组件来处理众多传感器、执行器和通信设备,国产固态继电器(SSR)已成为满足中国这些需求的关键解决方案。本文探讨了国产SSR如何满足物联网应用的需求,重点介绍了它们的优势、技术能力以及在现实场景中的应用。了解物联网中的固态继电器固态继电器是一种电子开关设备,它使用半导体而不是机械触点来控制负载。与传统的机械继电器不同,固态继电器具有以下优势:快速切换:确保精确快速的响应,这对于实时物联网系统至
    克里雅半导体科技 2025-01-03 16:11 165浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 32浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 162浏览
  • 在快速发展的能源领域,发电厂是发电的支柱,效率和安全性至关重要。在这种背景下,国产数字隔离器已成为现代化和优化发电厂运营的重要组成部分。本文探讨了这些设备在提高性能方面的重要性,同时展示了中国在生产可靠且具有成本效益的数字隔离器方面的进步。什么是数字隔离器?数字隔离器充当屏障,在电气上将系统的不同部分隔离开来,同时允许无缝数据传输。在发电厂中,它们保护敏感的控制电路免受高压尖峰的影响,确保准确的信号处理,并在恶劣条件下保持系统完整性。中国国产数字隔离器经历了重大创新,在许多方面达到甚至超过了全球
    克里雅半导体科技 2025-01-03 16:10 121浏览
  • 【工程师故事】+半年的经历依然忧伤,带着焦虑和绝望  对于一个企业来说,赚钱才是第一位的,对于一个人来说,赚钱也是第一位的。因为企业要活下去,因为个人也要活下去。企业打不了倒闭。个人还是要吃饭的。企业倒闭了,打不了从头再来。个人失业了,面对的不仅是房贷车贷和教育,还有找工作的焦虑。企业说,一个公司倒闭了,说明不了什么,这是正常的一个现象。个人说,一个中年男人失业了,面对的压力太大了,焦虑会摧毁你的一切。企业说,是个公司倒闭了,也不是什么大的问题,只不过是这些公司经营有问题吧。
    curton 2025-01-02 23:08 293浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦