改进的 A*算法的路径规划(路径规划+代码+毕业设计)

news/2024/4/26 7:35:18/文章来源:https://blog.csdn.net/ALiLiLiYa/article/details/129232865

引言

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

重要代码

###############构造地图################
#宽高W,H。
class Array2D:#初始化def __init__(self,w,h):self.w=wself.h=hself.data=[]self.data=[[0.0 for y in range(h)] for x in range(w)]#显示地图def showArray2D(self):for y in range(self.h):for x in range(self.w):print(self.data[x][y],end=' ')print("")#获得任意节点信息 ,__getitem__()魔法函数作用为当实例化对象map进行map[key]操作上自动调用。def __getitem__(self, item):return self.data[item]###############创建点类################
class Point:#初始化def __init__(self,x,y):self.x=xself.y=y#判断是否同一个点def __eq__(self, other):if self.x==other.x and self.y==other.y:return Truereturn False#打印点信息def __str__(self):return "x:"+str(self.x)+",y:"+str(self.y)##全部代码请联系---->qq1309399183<---------

传统 A*算法

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

传统 A*算法缺点分析

虽然传统的 A算法在一些简单的场景具有一定的有效性,但是实际的用途中,环境复杂性对于算法实时的要求,传统的 A算法并无法满足要求。只有对传统算法的局限性进行深入了解分析才能更好的在传统方法之上进行更进一步的改进,因此本小节深入分析传统 A算法的局限性和不足,具体有:
(1)栅格地图建模的不足:
首先要意识到的是处理的是离散数据,而不是现实世界中的“连续”地形。采样的数字地形图像是真实地形的近似值,应该在一个理想的高分辨率采样。数字地形图像的分辨率越高,对真实地形的描述越逼真,寻径精度也越高。然而,在分辨率上存在一个上限,超过这个上限后,道路就不再更加精确,并且会不必要地增加寻径算法的运行时间。而且传统的建模方式只限定为可行驶区域和障碍物区域,然而
现实世界环境是及其复杂的,例如可行驶区域可区分为不同道路,沙地、草地、土质路面等等;障碍物也区分有树、行人、车辆建筑物等等。
(2)邻域节点选择不足:
为了找到从起始节点到目标节点的路径,我们必须定义一种选择后续节点的方式。我们可以从一个给定的位置移动到哪里?在现实世界中,一个人可以朝着喜欢的任何方向前进,但在数字地形图上,我们的选择更受限制。传统的 A
算法中有两种常见的方法:4 个邻接和 8 个邻接。4 个邻接限制移动在北、南、西、东四64 个主要风向。8 邻接的移动更自由,因为它除了 4 邻接的方向外,还可以在东北、西北、西南和东南方向移动。
(3)算法无法自适应满足不同任务要求:
在不同的任务要求中,有的任务要保证路径的最短,则设计预估代价小于真实代价,但是效率低下;有的任务要保证效率的高效,设计预估代价大于真实代价,但是规划的路径不是最优。
(4)对于大地图算法计算效率不足:
对于现实的环境场景,可能寻找道路的搜索空间非常大,这意味着必须采取措施确保内存不会耗尽,或者搜索不会花费过多的时间运行。即使是一个相对较小的300 × 300 像素的地形图也有 9 万个节点的搜索空间。

越野环境下的 A*算法

障碍物模型:
传统的 A*算法的构建方式中最普遍应用的是栅格法,其基本的思路是把智能车辆的工作空间分割为尺寸一致的网格,并通过数据矩阵来记录环境数据。常规的栅格算法把物理环境严格区分为自由区域和障碍物区域,从而使得数值矩阵能够简化为 0-1 矩阵,0 为自由空间,1 为障碍物空间。如假设智能车的工作空间为
R C ,M 为数值矩阵,表示所有的环境信息,则常规的环境模型可以表示为。
在这里插入图片描述
很明显,常规的栅格模型是无法模拟出真实复杂的越野环境,因此本文研究越
野环境的真实场景,建立多层次栅格模型,将越野环境模型细分为障碍物模型,威
胁模型和道路模型,如图 所示。在这里插入图片描述
威胁模型
在这里插入图片描述

子节点优化选择策略

(1)子节点选择方式

为了找到从起始点到终点的路径,需定义一种可以选择后续节点的方式。在A*算法中两种常见的方法为 4-邻接(见图 5-7(a))和 8-邻接 (见图 5-7(b)),但考虑到在复杂越野环境上,我们希望智能车辆允许更多的自由运动来更好规避危险,因此本文选择 16-邻接(见图 5-7©)。如图 5-8 所示,4-邻接规划的路径具有很多的直角拐点且路径最长,其次是 8-邻接规划的路径,而 16-邻接规划的路径平滑、拐点数少、路径短,适合复杂越野环境智能车的需求。
在这里插入图片描述

(2)优化子节点选择

传统 A*算法在子节点选取上,仅考察子节点周围是否为障碍物,而未考察子节点与障碍物位置的相关性,从而规划出路线存在斜着通过障碍物栅格顶点的问题,导致车辆可能与障碍物发生碰撞。因为本文中所构建环境模型具有更危险的威胁物存在,所以优化了子节点的选择规则。
如图 5-9,为 16 个子节点分布图。本文结合越野环境栅格地图设计的子节点选择规则为:
**1:**若子节点 4 或子节点 12 具有威胁(在越野环境栅格地图中值1),则子节点 2、子节点 6、子节点 3、子节点 5 或子节点 13、子节点 9、子节点 14、子节点11 不作为预选点。
**2:**若子节点 16 或子节点 8 具有威胁,则子节点 2、子节点 13、子节点 15、
子节点 1 或子节点 6、子节点 9、子节点 10、子节点 7 不作为预选点。
**3:**均无具威胁,则不做处理。
优化子节点选择后,规划后的路径避开具有威胁栅格的顶点,避免智能车辆
在这里插入图片描述

代码部分

###############创建A-Star类############
class AStar:# 描述AStar算法中的节点数据class Node:  #初始化def __init__(self, point, startPoint,endPoint, g=0,w=1,p=1):self.point = point  # 自己的坐标self.father = None  # 父节点self.g = g       # g值,g值在用到的时候会重新算# 计算h值,采用曼哈顿距离#self.h = (abs(endPoint.x - point.x) + abs(endPoint.y - point.y)) * 10  #采用欧几里得距离#self.h = math.pow((math.pow((endPoint.x - point.x),2) + math.pow((endPoint.y - point.y),2)),0.5)*10#采用对角距离pp=(1-p)+0.2*math.exp((math.pow((math.pow((endPoint.x - point.x),2) + math.pow((endPoint.y - point.y),2)),0.5))/(math.pow((math.pow((endPoint.x - startPoint.x),2) + math.pow((endPoint.y - startPoint.y),2)),0.5)))Diagonal_step = min((endPoint.x - point.x),(endPoint.y - point.y))straight_step = (abs(endPoint.x - point.x) + abs(endPoint.y - point.y)) - 2*Diagonal_stepself.h  =(straight_step + math.pow(2,0.5)*Diagonal_step)*10*pp#print(pp)#初始化A-startdef __init__(self, map2d, startPoint, endPoint, passTag=1.0):#map2d地图信息,startPoint起点, endPoint终点, passTag=1.0为不可行驶区域# 开启表self.openList = []# 关闭表self.closeList = []# 寻路地图self.map2d = map2d# 起点终点if isinstance(startPoint, Point) and isinstance(endPoint, Point):self.startPoint = startPointself.endPoint = endPointelse:self.startPoint = Point(*startPoint)self.endPoint = Point(*endPoint)# 不可行走标记self.passTag = passTagdef getMinNode(self):"""获得openlist中F值最小的节点:return: Node"""currentNode = self.openList[0]for node in self.openList:if node.g + node.h < currentNode.g + currentNode.h:currentNode = nodereturn currentNode#返回最小代价的点

结果对比

在这里插入图片描述
在这里插入图片描述

越野环境路径规划对比

在这里插入图片描述

敏感度衡量对比

在这里插入图片描述

结论

本节针对越野场景路径规划问题,采用栅格法建立障碍物、威胁物和越野道路模型,模拟真实的越野环境场景。引入方向变化惩罚和局部区域复杂度惩罚来优化A算法,使算法规划出的路径更平滑,算法效率更高效。采用改进 Floyd 算法对路径进行双向平滑,并且进行了防碰撞处理,来确保规划出路径的安全可靠性。仿真结果表明,所改进的 A算法与传统算法相比较,效率提高了 30%,拐点数减少了
4 倍,所提算法能够在越野环境多重因素综合影响以及不同车辆性能和任务的要求下快速的规划出安全的路径。

全部代码可私信

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

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

相关文章

improve-2

BFC 块级格式化上下文&#xff0c;是一个独立的渲染区域&#xff0c;让处于 BFC 内部的元素与外部的元素相互隔离&#xff0c;使内外元素的定位不会相互影响。 IE下为 Layout&#xff0c;可通过 zoom:1 触发 触发条件: 根元素position: absolute/fixeddisplay: inline-block /…

区块链到底是个啥???

点击上方“小强的进阶之路”&#xff0c;选择“星标”公众号优质文章&#xff0c;及时送达预计阅读时间: 2分钟区块链起源2008 年&#xff0c;金融系统崩溃&#xff0c;世界惊恐万状。随后多年&#xff0c;银行、监管机构等负责金融系统运行的中央实体管理不善。那一时期&#…

BurpSuite安装

BurpSuiteBurpSuite简介BurpSuite安装BurpSuite简介 BurpSuite (简称Burp&#xff09;是基于Java开发的Web安全领域的集成工具&#xff0c;被称为信息安全界的瑞士军刀&#xff0c;它包含Proxy、Intruder、Repeater、Decoder.Comparer等多个模块&#xff0c;模块间通过共享相互…

戴尔dell inspiron-5598电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。硬件型号驱动情况主板X99 K9 v2 Machinist处理器i5-10210U / *i7-10510U已驱动内存20GB已驱动硬盘1000GB SAMSUNG 860 QVO SATA已驱动显卡Intel UHD 620已驱动声卡Realtek ALC3204/236已驱动网卡RTL8168H Gigabit Ethernet已…

PMP新考纲考试难不难,通过率怎样?

PMP考试难不难&#xff0c;还是因人而异的&#xff0c;对小白而言&#xff0c;肯定是难的&#xff0c;对项目管理老人而言&#xff0c;难度肯定是没那么高。 据考过的朋友讲&#xff0c;新考纲是有点难度的&#xff0c;尤其是最开始6月25日的考试&#xff0c;2023年就简单些了…

Linux 练习三 (Makefile工程管理器)

文章目录Makefile工程管理器第一个makefile&#xff1a;编写两个.c源文件&#xff0c;并且让一个调用另外一个&#xff0c;使用makefile建立依赖&#xff0c;生成可执行文件&#xff0c;并执行。伪目标变量预定义变量和自动变量通配符和模式匹配内置函数循环指定makefile文件综…

Allegro如何标注PCB的尺寸参数操作指导

Allegro如何标注PCB的尺寸参数操作指导 在输出生产文件之前,需要对PCB的尺寸进行标注,如下图 用Allegro如何进行标注,具体操作如下 点击Manufacture选择Dimension Enviroment<

2023CS双非保研985经验分享(南大、华科、中科大科学岛、国防科大、西交、中南、深圳大学、北邮、中科院等)

前言&#xff1a; 2022保研以来&#xff0c;因为自己的双非背景&#xff0c;要与985、211的排名靠前的计科大佬竞争&#xff0c;不自信、焦虑无时无刻的包围着我&#xff1b;所幸&#xff0c;一路以受到了许多学长、学姐耐心的帮助&#xff0c;也有很多保研的同学一路互相支撑。…

AI绘画进军三次元,有人用它打造赛博女友?(diffusion)

目录0 写在前面1 AI绘画技术飞跃2 效果展示3 环境配置3.1 下载基础模型3.2 更新.NET和模型3.3 下载绘画模型3.4 启动项目3.5 标签配置4 结语0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&a…

【数据库】MySQL

时间戳 可以在创建表的时候&#xff0c;创建时间戳 mysql数据库怎么加入时间戳_帅气的黑桃J的博客-CSDN博客_mysql 插入时间戳 数据库表的命名规范 数据库表字段命名规范 - 腾讯云开发者社区-腾讯云 (tencent.com) MySql 的大小写问题 以下是MySQL详细的大小写区分规则&am…

@ConfigurationProperties在方法上的使用

文章目录1. 前言2. 先说结论3. 代码解释1. Component ConfigurationProperties2. EnableConfigurationProperties ConfigurationProperties3. Bean ConfigurationProperties1. 前言 在学习spring的时候&#xff0c;ConfigurationProperties应该经常被使用到&#xff0c;作用…

NCRE计算机等级考试Python真题(二)

第二套试题1、关于算法的描述&#xff0c;以下选项中错误的是A.算法具有可行性、确定性、有穷性的基本特征B.算法的复杂度主要包括时间复杂度和数据复杂度C.算法的基本要素包括数据对象的运算和操作及算法的控制结构D.算法是指解题方案的准确而完整的描述正确答案&#xff1a; …

Android 网络框架——Retrofit源码精析

众所周知&#xff0c;Retrofit是OkHttp的封装&#xff0c;APP对网络交互部分的实现基本上都是RxJavaRetrofitOkHttp架构&#xff08;或协程RetrofitOkHttp&#xff09;&#xff0c;可以说&#xff0c;Retrofit已经广为人知。本文主要介绍Retrofit主线源码实现机制&#xff0c;及…

在线文档技术-编辑器篇

这是在线文档技术的第二篇文章&#xff0c;本文将对目前市面上所有的主流编辑器和在线文档进行一次深入的剖析和研究&#xff0c;从而使大家对在线文档技术有更深入的了解&#xff0c;也让更多人能够参与其开发与设计中来。 注意&#xff1a;出于对主流文档产品的尊重&#xf…

基础数据结构--线段树(Python版本)

文章目录前言特点操作数据存储updateLazy下移查询实现前言 月末了&#xff0c;划个水&#xff0c;赶一下指标&#xff08;更新一些活跃值&#xff0c;狗头&#xff09; 本文主要是关于线段树的内容。这个线段树的话&#xff0c;主要是适合求解我们一个数组的一些区间的问题&am…

Xcode Developer Document 开发者文档

总目录 iOS开发笔记目录 从一无所知到入门 文章目录IntroDeveloper Documentation 打开方式菜单栏点击 &#xff5c; 快捷键方式另一种打开方式Intro 2016年我在学校学Java的时候&#xff0c;要查某个Java类/方法的用法还得自己手动下载一种.chm格式的开发文档文件&#xff0c…

Oracle-RAC集群主机重启问题分析

问题背景: 在对一套两节点Oracle RAC19.18集群进行部署时&#xff0c;出现启动数据库实例就会出现主机出现重启的情况&#xff0c;检查发现主机重启是由于节点集群被驱逐导致​。 问题: 两节点Oracle RAC19.18集群,启动数据库实例会导致主机出现重启。 问题分析: 主机多次出现…

DFT基本入门介绍

1.什么是DFT&#xff1f;2.为什么要做DFT&#xff1f;3.“测试”与“验证”的区别4.DFT的核心技术1&#xff09;扫描路径设计&#xff08;Scan Design&#xff09;2)内建自测试&#xff08;Bist&#xff09;3)JTAG4)ATPG5.DFT工程师的岗位职责随着芯片的制程越来小(5nm), 芯片的…

【奶奶看了也不会】AI绘画 Mac安装stable-diffusion-webui绘制AI妹子保姆级教程

1.作品图 2.准备工作 目前网上能搜到的stable-diffusion-webui的安装教程都是Window和Mac M1芯片的&#xff0c;而对于因特尔芯片的文章少之又少&#xff0c;这就导致我们还在用老Intel 芯片的Mac本&#xff0c;看着别人生成美女图片只能眼馋。所以小卷这周末折腾了一天&#…

Android 分区和内存监控

Andorid之所以是分区&#xff0c;是因为各自有对应的功能和用途的考量&#xff0c;可以进行单独读写和格式化。Android 设备包含两类分区&#xff1a;一类是启动分区&#xff0c;对启动过程至关重要。一类是用户分区&#xff0c;用于存储与启动无关的信息。启动分区boot 分区一…