0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

决策规划,全局路径规划常用算法

3D视觉工坊 来源:十一号组织 2023-01-17 10:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

54e3e8a8-95f2-11ed-bfe3-dac502259ad0.png

图10有向图示例

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

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

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

54f2f1ae-95f2-11ed-bfe3-dac502259ad0.png

图11道路连接情况

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

Dijkstra算法

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

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

550d404a-95f2-11ed-bfe3-dac502259ad0.png

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

用Dijkstra算法求解步骤如下:

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

551ede2c-95f2-11ed-bfe3-dac502259ad0.png

图13 顶点之间的距离关系

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

552f3542-95f2-11ed-bfe3-dac502259ad0.png

图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所示。

553f0652-95f2-11ed-bfe3-dac502259ad0.png

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

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

55522656-95f2-11ed-bfe3-dac502259ad0.png

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

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

556066da-95f2-11ed-bfe3-dac502259ad0.png

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

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

556d9530-95f2-11ed-bfe3-dac502259ad0.png

图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点之间隔着一个池塘。为了能尽快提到达约会地点,给姑娘留下了一个守时踏实的好印象,我们需要给小马搜索出一条时间最短的可行路径。

557b9d56-95f2-11ed-bfe3-dac502259ad0.png

图19 约会场景示意图

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

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

55962eb4-95f2-11ed-bfe3-dac502259ad0.png

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

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

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

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

559f10ba-95f2-11ed-bfe3-dac502259ad0.png

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

55a9a1a6-95f2-11ed-bfe3-dac502259ad0.png

现在我们开始搜索,查找最短路径。首先将起点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中。

55bca40e-95f2-11ed-bfe3-dac502259ad0.png

图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所示。

55d38f52-95f2-11ed-bfe3-dac502259ad0.png

图22第二轮计算后的结果

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

55e6117c-95f2-11ed-bfe3-dac502259ad0.png

图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*算法更有效率,手术的格子更少。

55fd4306-95f2-11ed-bfe3-dac502259ad0.png

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

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4761

    浏览量

    97160
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27114

原文标题:决策规划,全局路径规划常用算法

文章出处:【微信号:3D视觉工坊,微信公众号:3D视觉工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    地物光谱应用在农业与城市规划中的创新实践

    在现代农业和城市规划领域,准确获取地物信息成为提升管理效率和决策科学性的重要环节。随着遥感技术的飞速发展,地物光谱分析作为一种精准、非接触的检测手段,正被广泛应用于真实场景中。无论是农作物健康监测
    的头像 发表于 10-20 16:33 394次阅读

    分享一个嵌入式学习阶段规划

    给大家分享一个嵌入式学习阶段规划: (一)基础筑牢阶段(约 23 天) 核心目标:打牢 C 语言、数据结构、电路基础C 语言开发:学变量 / 指针 / 结构体等核心语法,用 Dev-C++ 实操
    发表于 09-12 15:11

    自主工具链助力端到端组合辅助驾驶算法验证

    算法介绍传统组合辅助驾驶算法一般分为感知定位、决策规划、控制三部分功能,将传感器数据输入后,经算法处理,输出控制指令。传统组合辅助驾驶
    的头像 发表于 08-26 17:41 3349次阅读
    自主工具链助力端到端组合辅助驾驶<b class='flag-5'>算法</b>验证

    三坐标测量机路径规划与补偿技术:核心算法解析

    三坐标测量的微米级精度背后,是精密的路径规划算法与实时补偿技术在保驾护航。三坐标测量机的智能避撞算法保障了测量的安全与高效;温度补偿技术消除了环境的无形干扰;点云智能处理则让海量数据蜕变为精准的工程
    的头像 发表于 08-01 14:15 1319次阅读
    三坐标测量机<b class='flag-5'>路径</b><b class='flag-5'>规划</b>与补偿技术:核心<b class='flag-5'>算法</b>解析

    从哈希极化到零拥塞:主动路径规划在RoCE网络中的负载均衡实践

    集群整体性能的瓶颈。本文将探讨哈希极化的成因、影响,并介绍一种通过主动路径规划(PPD)来优化网络配置、提升性能的解决方案。
    的头像 发表于 07-21 17:27 1679次阅读
    从哈希极化到零拥塞:主动<b class='flag-5'>路径</b><b class='flag-5'>规划</b>在RoCE网络中的负载均衡实践

    投入式水位计:助力水资源规划与结构安全

    在水资源管理与岩土工程安全监测领域,水位数据的实时性和准确性直接影响决策的科学性与工程可靠性。投入式水位计作为一种高精度、耐用的监测工具,正成为水利工程、地下结构物安全评估及水资源规划中不可或缺
    的头像 发表于 06-19 13:17 431次阅读
    投入式水位计:助力水资源<b class='flag-5'>规划</b>与结构安全

    AGV小车中的动态路径规划算法揭秘

    并非一成不变时,动态路径规划能力就显得至关重要。本文将深入探讨几种主流的动态路径规划算法(如A、Dijkstra、RRT等),并解析它们如何在AGV行业中大显身手。 为何需要动态
    的头像 发表于 06-17 15:54 1173次阅读
    AGV小车中的动态<b class='flag-5'>路径</b><b class='flag-5'>规划算法</b>揭秘

    AGV通信第2期 AGV集群智能路径规划解决方案

    在智能制造加速发展的背景下,AGV作为智慧物流的核心载体,其路径规划的智能化水平直接影响工厂的运作效率。在工厂物流升级过程中,企业面临以下技术挑战:   动态环境适应:复杂工况下需实时避障并保持最优
    的头像 发表于 05-09 14:03 539次阅读
    AGV通信第2期 AGV集群智能<b class='flag-5'>路径</b><b class='flag-5'>规划</b>解决方案

    CADENAS 数字产品配置器轻松实现Ascendor电梯规划

    。2022 年,Ascendor 启动了一项数字化推进计划,其中一个重要部分就是实施由 CADENAS 提供技术支持的数字化产品配置器。 利用高质量的规划数据进行灵活的电梯规划 数字产品配置器提供
    发表于 04-28 14:22

    三维天地智能路径规划引擎:以算法驱动,重新定义智能路径优化技术

    随着环境监测和设备巡检工作的日益复杂化,传统的人工路径规划方式正面临效率和精度的双重挑战。企业和环保部门正面临着采样点数量的激增、采样频次的提高以及对时效性的更高要求。随着合规要求的日趋严格,采样
    的头像 发表于 04-27 15:44 462次阅读
    三维天地智能<b class='flag-5'>路径</b><b class='flag-5'>规划</b>引擎:以<b class='flag-5'>算法</b>驱动,重新定义智能<b class='flag-5'>路径</b>优化技术

    经纬恒润端到端组合辅助驾驶算法测试解决方案

    传统组合辅助驾驶算法一般分为感知定位、决策规划、控制三部分功能,将传感器数据输入后,经算法处理,输出控制指令。传统组合辅助驾驶算法中的
    的头像 发表于 04-27 09:24 1085次阅读
    经纬恒润端到端组合辅助驾驶<b class='flag-5'>算法</b>测试解决方案

    概伦电子层次化SoC设计规划方案NavisPro介绍

    NavisPro可提供整体性设计规划解决方案,支持在RTL设计阶段完成芯片评估和布局规划,帮助芯片设计师在布局规划早期阶段预测并预防物理实现问题。
    的头像 发表于 04-22 10:13 558次阅读
    概伦电子层次化SoC设计<b class='flag-5'>规划</b>方案NavisPro介绍

    具身智能工业机器人路径规划算法成为破局关键

    在工业4.0与智能制造深度融合的今天,传统路径规划算法已难以满足动态生产环境的需求。面对复杂场景下的高精度避障、实时决策与多任务协同挑战,具身智能工业机器人路径
    的头像 发表于 03-28 15:01 734次阅读

    MCSDK位置控制S形轨迹规划q轴电流存在冲击怎么解决?

    工程师您好,我用MCSDK生成了FOC位置控制的代码,在实际运行中发现,每隔t0时间q轴电流出现一次冲击(t0为S形轨迹规划9段时间的一段),如下图所示: 绿色线是用STM32CUBEMONITOR观察到q轴电流。 下图是S形规划的原理图: 我想请教一下怎么才能避免q轴
    发表于 03-11 06:51

    外资制造业可利用AI提升决策能力

    运筹优化技术是一种利用数学模型和算法,在有限资源下寻求最佳决策的技术,广泛应用于物流、生产、金融等领域。运筹优化能够帮助解决复杂的优化问题,例如资源分配、路径规划、生产调度等,以提高效
    的头像 发表于 12-24 10:01 714次阅读