改进的A*算法的路径规划(1)

news2024/11/29 1:51:23

引言

近年来,随着智能时代的到来,路径规划技术飞快发展,已经形成了一套较为 成熟的理论体系。其经典规划算法包括 Dijkstra 算法、A*算法、D*算法、Field D* 算法等,然而传统的路径规划算法在复杂的场景的表现并不如人意,例如复杂的越 野环境。针对越野环境规划问题以及规划算法的优劣性,根据第三章和第四章节获 取越野环境的路面信息与障碍物信息,选择改进A*算法来进行越野环境路径规划 通过越野栅格环境建模、通行方向变化惩罚、局部区域复杂度惩罚和路径平滑的方 法对传统 A*算法进行改进,以满足复杂越野环境下,不同类型的智能车辆和不同任务的安全行驶、高效通行综合要求。

传统 A*算法

在启发式搜索算法中, A* 算法是其中最为典型的代表,它在全局路径规划算 法中,具有快速、高效和准确的优点,因此在智能车辆和工业机器人的路径规划问 题上得到了广泛的应用。针对规划路径的需求和任务的要求,许多学者对传统A*算法进行改进,例如:路径的长度、规划效率和拐点数等方面。

算法原理

许多寻找两点之间最短路径的算法,最早提出的解决方案之一是Dijkstra 算法, Dijkstra 算法总是访问距离起始节点最近的未访问节点,因此搜索不指向目标节点。 广度优先搜索 BFS,  在某种程度上,与 Dijkstra 算法相反,它不是总是选择离起始  节点最近的节点,而是选择离目标节点最近的节点。A* 算法结合了Dijkstra算法和   广度优先搜索BFS,  保证能找到两个最优解,就像Dijkstra 算法一样,因为它是由  启发式引导到目标节点的,像广度优先搜索BFS, 它不会像 Dijkstra算法访问那么  多的节点。

全局代价函数是A* 算法的核心所在,全局代价函数中包含两个代价值, 一个 是从起点到当前节点的代价 G,  称为真实代价;另一个是当前节点到终点的代价 H, 称为预估代价。传统的 A* 算法的全局代价函数一般表示为:

f(n)=g(n)+h(n)

式中:f(n) 为全局代价函数, g(n) 为真实代价函数, h(n)为启发函数,(x,,yy,)为

当前节点坐标, (xg,ya)为终点坐标。

在全局代价函数中,启发函数设计尤为重要,因为启发函数设计的优劣直接影 响 A*算法规划路线的长度和搜寻效果。当预估代价h(n) 低于真实代价g(n)  时,则 算法寻找的节点数量增多,但可以确保获得最短路线;当预测代价h(n)超过真实 代价g(n)时,需要寻找的节点数量大大减少,但无法确保获得最短路线。所以, 想要计划出最短路线并确保效率高效,则应使h(n)尽量等于g(n)。正如我们已经 提到的,A*算法使用的启发式部分h(n)是它与 Dijkstra 算法的区别之处,它将搜 索引导到目标节点。如果启发式函数是可接受的(意味着它永远不会高估目标的最 小代价),那么A* 也像 Dijkstra一样,保证能找到最短、最便宜的路径。使用尽可 能少地低估最小成本的启发式方法也有很大的优势,因为这将导致被检查的节点 更少。理想的启发式总是返回达到目标的实际最小成本。目前最为普遍的三种启发 函数有:对角线距离启发式,适用于使用8邻接的启发式;曼哈顿距离启发式,适 用于使用4邻接的启发式;第三种也是常用的启发式是欧几里德距离启发式。

(1)曼哈顿距离启发式

曼哈顿启发式是通过将x 和y 分量的差值相加来计算的,如下图5-1 所示,使用这种启发式的优点是计算成本低,具体为:

h(n)=|xn-xg|+|yn-y₈| 

式中:(x₁,y,)为当前节点坐标,(xg,yg)为终点坐标。曼哈顿启发式的主要缺点 是它倾向于高估目标的实际最小成本,即会使得预估代价h(n)大于真实代价 g(n),     虽然效率高,但所找到的路径可能不是最优解决方案。

 两点之间的曼哈顿距离

(2)欧氏距离启发式

欧几里德启发式是最为常用的启发式距离,如图5-2所示。欧几里德距离启发式在计算上也比曼哈顿启发式更昂贵,因为它额外涉及两个乘法运算和取平方根:

h(n)=√(x,-x₄)³+(y,-y,) 

      缺点是通常会大大低估实际成本,搜索效率低,可能会访问太多不必要的节点,从而增加了寻找道路的时间,但是能找到最短路径。

对角线距离启发式

对角线距离启发式结合了曼哈顿启发式和欧几里德启发式的两个方面。它的 优点是总是给出目标的实际可能的最小代价,不再需要取平方根,从而使其计算效 率略高于欧几里德距离启发式。启发式值由对角线和直线两部分组成。为求可采取的对角线步数,可使用下列公式:

num_D_S=min{|xn-xg|,|y₀-y₅

num  S  S=(|xn-x₈|+|yn-y₈|)-2*num_D_s

从曼哈顿距离减去两倍的对角线步数的原因是,1个对角线步数等于2个直线 步数。如果我们假设对角线步骤的代价是2,水平步骤的代价是1,那么下面的公式产生了这个启发式的h(n)值:

h(n)=num  S S+√2*num D   

两点之间的对角距离

本文采用的为对角距离。

A* 算法原理实现的一个重要组成部分是开链表OPEN  和闭链表 CLOSE。  开放 列表包含已经到达但尚未访问和扩展的所有节点。关闭列表包含所有已访问和展 开的节点。A* 通过从潜在的后续节点列表,即f(n)   值最低的节点中选择最有希望 的节点移动到后续节点。A* 算法的寻路过程可以简单概括为:

Step1: 如图5-5所示,起始点S, 终 点T, 黑色方框为障碍物。从起始点S 开 始,并把它加入到开链表 OPEN 中。现在开链表 OPEN 里只有一项为起始点 S    后面会慢慢加入更多的项。开链表 OPEN  里的格子是路径可能会是沿途经过的,

也有可能不经过。

Step2: 查看与起点 S 相邻的节点(忽略其中障碍物所占领的节点),把那些节 点加入到开链表 OPEN 中,把起点S 设置为这些节点的父节点。并把起始点 S 从 开链表OPEN 中移除,加入到闭链表 CLOSE 中,闭链表 CLOSE 中的每个节点不 需要再关注。

 传统 A*算法流程图

Step3:  计算开链表 OPEN 中所有节点的真实代价 G,   预估代价 H,  全局评估 值 f; 选 择 最 小 全 局 评 估 值f 的 节 点n,  把 它 从 开 链 表 OPEN   里 取 出 , 放 到 闭 链 表 CLOSE 中。检查所有与它相邻的节点,忽略在闭链表CLOSE 中或障碍物的节点。

Step4:如果那些节点不在开链表OPEN  中,则把它们加入到开链表OPEN 中,

根据节点n 计算那些节点的真实代价G,   预估代价H,   全局评估值f;   把节点n 设置为那些节点的父节点。

Step5: 如果那些节点已经在开链表 OPEN 中,则根据节点n 计算那些节点的 真实代价G, 判断从新计算的 G 是小于原本的G, 是则更新那些节点真实代价 G,   预估代价 H,   全局评估值f,   把节点 n 设置为那些节点的父节点;否则不做操作。

Step6:   循环以上步骤,直至将终点T 加入开链表 OPEN,  循环结束,将终点

T加入闭链表CLOSE。

Step7: 反向遍历闭链表CLOSE,  从终点 T 求得其父节点 T 父节点,在求 T 又节点 的父节点直至到初始点S,   这些节点即为路径节点。相应流程图如图5-4所示。

传统A*算法缺点分析

虽然传统的A*算法在一些简单的场景具有一定的有效性,但是实际的用途中, 环境复杂性对于算法实时的要求,传统的A*算法并无法满足要求。只有对传统算 法的局限性进行深入了解分析才能更好的在传统方法之上进行更进一步的改进,

因此本小节深入分析传统 A*算法的局限性和不足,具体有:

(1)栅格地图建模的不足:

首先要意识到的是处理的是离散数据,而不是现实世界中的“连续”地形。采样 的数字地形图像是真实地形的近似值,应该在一个理想的高分辨率采样。数字地形 图像的分辨率越高,对真实地形的描述越逼真,寻径精度也越高。然而,在分辨率 上存在一个上限,超过这个上限后,道路就不再更加精确,并且会不必要地增加寻 径算法的运行时间。而且传统的建模方式只限定为可行驶区域和障碍物区域,然而 现实世界环境是及其复杂的,例如可行驶区域可区分为不同道路,沙地、草地、土

质路面等等;障碍物也区分有树、行人、车辆建筑物等等。

(2)邻域节点选择不足:

为了找到从起始节点到目标节点的路径,我们必须定义一种选择后续节点的 方式。我们可以从一个给定的位置移动到哪里?在现实世界中, 一个人可以朝着喜 欢的任何方向前进,但在数字地形图上,我们的选择更受限制。传统的A* 算法中

有两种常见的方法:4个邻接和8个邻接。4个邻接限制移动在北、南、西、东四个主要风向。8邻接的移动更自由,因为它除了4邻接的方向外,还可以在东北、西北、西南和东南方向移动。

(3)算法无法自适应满足不同任务要求:

在不同的任务要求中,有的任务要保证路径的最短,则设计预估代价小于真实 代价,但是效率低下;有的任务要保证效率的高效,设计预估代价大于真实代价,

目录

引言

传统 A*算法

算法原理


但是规划的路径不是最优。

(4)对于大地图算法计算效率不足:

对于现实的环境场景,可能寻找道路的搜索空间非常大,这意味着必须采取措 施确保内存不会耗尽,或者搜索不会花费过多的时间运行。即使是一个相对较小的300×300像素的地形图也有9万个节点的搜索空间。

5.3 越野环境下的A* 算法

5.3.1 越野环境建模

传统的A*算法的构建方式中最普遍应用的是栅格法,其基本的思路是把智能 车辆的工作空间分割为尺寸一致的网格,并通过数据矩阵来记录环境数据。常规的 栅格算法把物理环境严格区分为自由区域和障碍物区域,从而使得数值矩阵能够 简化为0-1 矩阵,0 为自由空间,1 为障碍物空间。如假设智能车的工作空间为

R×C,M   为数值矩阵,R 表示所有的环境信息,则常规的环境模型可以表示为。

很明显,常规的栅格模型是无法模拟出真实复杂的越野环境,因此本文研究越 野环境的真实场景,建立多层次栅格模型,将越野环境模型细分为障碍物模型,威

胁模型和道路模型,如图5-6所示。

(1)障碍物模型:

障碍物模型即为越野环境中智能车辆无法驶过的区域,如建筑物、森林、山地 等。如图5-6(a)所示,在越野环境中存在障碍物O1-O3, 障碍物之外为安全通行区。

之后的步骤还将添加安全距离,保证智能车能够和障碍物保存一定距离。障碍物模型表示为:

 式中:织。障碍物模型,O障碍物区域,(xy,y;)为越野栅格模型的坐标点

 多层次越野模型

威胁模型:

威胁模型指的是越野环境中可能对智能车造成破坏损伤的存在,如地雷和敌 军等。威胁模型的范围取决于威胁物的风险程度,本文设置威胁等级H 为1~5,

则威胁范围为威胁等级 H 的威胁物向外均匀减少至0所覆盖的范围,例: H=3,

则威胁范围半径 r 为[3,2,1,0.8,0.6,0.4,0.2,0],每步间隔一个栅格。威胁模型表示

为:

式中:R, 为威胁模型,T 为威胁物,H 为威胁等级,r 为威胁范围半径。如图1(b) 所示,越野环境中存在威胁物 T₁,T₂,      威胁范围沿着威胁物向外扩散直至减少为0。

(3)越野道路模型

道路模型即为越野环境中智能车辆可安全行驶的区域,在越野环境中,可行驶区域大致可分为:硬质路面、土路、草地和沙地等,这些不同的地表具有不同的属 性,对智能车辆具有不同的通行影响。本文参照轮式智能车辆的实验数据和专家经

验值,将不同的地表按照属性设置相应的通过系数,如表所示。

本文根据表5.1,将不同地表属性对车辆的通行影响进行量化,则可以将道路

模型可表示为:

式中: R 为道路模型, Z 越野道路,k为道路通行系数。如图1(c)中所示,越野环 境中存在3处越野道路,例:灰色区域的沙路,在越野栅格模型中的数据值为0.7。 

最后,得到障碍物模型、威胁模型和道路模型后,融合三个层次的模型,获得 最终的越野栅格模型: R=R 。+R₇+R₄ 。 值得注意的是,三个模型的优先级为:威 胁模型、障碍物模型、道路模型,当融合模型重叠时,优先考虑优先级高的模型以及模型数据值高的栅格。

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

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

相关文章

项目二 创建与操作学生管理数据库

项目二 创建与操作学生管理数据库 #目标 创建库;查看库;操作库;图形工具操作库1,创建学生管理数据库 #创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collat…

开发猿的平平淡淡周末---2023/12/10

天气阴 温度适宜17摄氏度 AM 昨晚竟然下小雨了,还好还好,昨天刷的两个背包基本干了 一觉睡到日三竿,谁是神仙,我是神仙(哈哈哈哈哈哈) 刷会儿视频 补充下起床的动力 洗漱,恰饭,肝…

springboot基础(80):redis geospatial的应用

文章目录 前言redis geospatial如何从地图上获取经纬度springboot 的相关方法调用准备redis服务器引用的依赖预设位置的keyGEOADD 添加位置GEORADIUS 获取指定经纬度附件的停车场(deprecated)GEORADIUS 获取指定成员附件的停车场(deprecated&…

[LeetCode]-283. 移动零-1089. 复写零

目录 283. 移动零 描述 解析 代码 1089. 复写零 描述 解析 代码 283. 移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 描述 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 &…

【安卓12源码】WMS系列:addWindow 和 removeWindow流程

一、Window 的属性 Window的属性定义在WindowManager的内部类LayoutParams中,了解Window的属性能够更好的理解WMS的内部原理。Window的属性有很多种,与应用开发最密切的有三种,它们分别是Type(Window的类型)、Flag(Window的标志)和SoftInputM…

【蜗牛到家】获南明电子信息产业引导基金战略投资

智慧社区生活服务平台「蜗牛到家」已于近期获得贵阳南明电子信息产业引导基金、华科明德战略投资。 贵阳南明电子信息产业引导基金属于政府旗下产业引导基金,贵州华科明德基金管理有限公司擅长电子信息产业、高科技产业、城市建设及民生保障领域的投资,双…

【EI会议征稿中】第三届信号处理与通信安全国际学术会议(ICSPCS 2024)

第三届信号处理与通信安全国际学术会议(ICSPCS 2024) 2024 3rd International Conference on Signal Processing and Communication Security 信号处理和通信安全是现代信息技术应用的重要领域,近年来这两个领域的研究相互交叉促进&#xf…

[每周一更]-(第76期):Go源码阅读与分析的方式

读源码可以深层理解Go的编写方式,理解作者们的思维方式;也有助于对Go语法用法深刻的理解,我们从这一篇说一下如何读源码,从哪些源码着手,从 简单到深入的方式学习源码; 学习源码也是一个修炼过程&#xff0…

【小白专用】Sql Server 连接Mysql 更新23.12.09

目标 已知mysql连接参数(地址和用户),期望通过Microsoft Sql Server Management Studio (以下简称MSSSMS)连接Mysql,在MSSSMS中直接查询或修改Mysql中的数据。 一般是选最新的版本下载。 选64位还是32位&a…

P13 Linux进程间通信——管道

前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《Linux C应用编程(概念类)_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🛸推荐专栏3: ​​​​​​《链表_C…

LeetCode二分查找:寻找旋转排序数组中的最小值

LeetCode二分查找:寻找旋转排序数组中的最小值 题目描述 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到: 若旋…

Nginx【通俗易懂】《上篇》

目录 1.什么是Nginx💕💕💕 2.Nginx的基本目录💕💕💕 3.基本原理图 💕💕💕 4.Nginx配置 💕💕💕 5.日志的分析 💕&…

neuq-acm预备队训练week 8 P4779 【模板】单源最短路径(标准版)

题目背景 题目限制 题目描述 给定一个 n 个点,m 条有向边的带非负权图,请你计算从 s 出发,到每个点的距离。 数据保证你能从 s 出发到任意点。 输入格式 第一行为三个正整数n,m,s。 第二行起 m 行,每行三个非负整数 ui​,vi​…

Grounding DINO、TAG2TEXT、RAM、RAM++论文解读

提示:Grounding DINO、TAG2TEXT、RAM、RAM论文解读 文章目录 前言一、Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection1、摘要2、背景3、部分文献翻译4、贡献5、模型结构解读a.模型整体结构b.特征增强结构c.解码结构 6、实…

JAVAEE-8-线程池

池 我们之前也接触过,比如说常量池,数据库连接池,线程池,进程池,内存池等等, 池的共性: 1.提前把要用的对象准备好 2.把用完的对象也不要立即释放,先留着以备下次使用 来提高效率!!! 最开始,进程能够解决并发编程的问题,因为频繁创建销毁进程的开销成本太大了,所以我们引…

接口自动化测试框架的搭建

经过了一年多的接口测试工作,旧的框架也做了一些新的调整,删除了很多冗余的功能,只保留了最基本的接口结构验证、接口回归测试、线上定时巡检功能。 框架的演进 1.界面 UI 做了优化,整个框架的画风突然不一样了(人靠…

11、虚函数、多态、纯虚函数

11、虚函数、多态、纯虚函数 虚函数覆盖调用 多态实现多态的两个必要条件多态 和 this指针多态的实现:虚函数表虚函数表与动态绑定动态绑定动态绑定对性能的影响 纯虚函数抽象类纯抽象类 虚函数 形如class 类名{ virtual 返回值 函数名(形参表) { … } }; 的成员函…

Git merge 与 Git rebase 与 Git fetch

Git merge 与 Git rebase 看这个图就行了 git merge、git rebase 和 git fetch 是 Git 中的三个不同的命令,它们分别用于不同的目的。以下是它们的主要区别: git merge(合并): 用途: 用于将一个分支的更改…

pta模拟题——7-34 刮刮彩票

“刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示: 每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9,数字各不重复,并以 33 的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个位置上…

带你搞懂JavaScript中的原型和原型链

简介 原型和原型链是JavaScript中与对象有关的重要概念,但是部分前端开发者却不太理解,也不清楚原型链有什么用处。其实,学过其他面对对象语言的同学应该了解,对象是由类生成的实例,类与类之间有继承的关系。在ES6之前…