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

news2024/12/27 16:44:26

引言

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

重要代码

###############构造地图################
#宽高W,H。
class Array2D:
    #初始化
    def __init__(self,w,h):
        self.w=w
        self.h=h
        self.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=x
        self.y=y
        
    #判断是否同一个点
    def __eq__(self, other):
        if self.x==other.x and self.y==other.y:
            return True
        return 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_step
            self.h  =(straight_step + math.pow(2,0.5)*Diagonal_step)*10*pp
            #print(pp)


            
    #初始化A-start
    def __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 = startPoint
            self.endPoint = endPoint
        else:
            self.startPoint = Point(*startPoint)
            self.endPoint = Point(*endPoint)
 
        # 不可行走标记
        self.passTag = passTag
 
    def 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 = node
        return currentNode#返回最小代价的点
 

结果对比

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

越野环境路径规划对比

在这里插入图片描述

敏感度衡量对比

在这里插入图片描述

结论

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

全部代码可私信

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

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

相关文章

一些cmake error fixed

建完虚拟环境后 运行 pip install . 出现报错&#xff0c;显示svox2安装出错&#xff0c;然后开始进入到svox2中进行手动编译和安装。 1. cmake svox2/csrc pybind11找不到 conda install pybind11用 pip install 在虚拟环境中安装不行&#xff0c;据说会安装到全局下… 2. c…

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

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

量化学习(一)数据列表获取

试验环境 windows10 AnacondaPyCharm&#xff08;小白参考文章&#xff1a;https://coderx.com.cn/?p14&#xff09; 数据库&#xff1a; VM中安装MySQL5.7&#xff08;设置utf8及相应配置优化&#xff09; 复权 小白参考文章&#xff1a;https://zhuanlan.zhihu.com/p/469820…

实例3:树莓派呼吸灯

实例3&#xff1a;树莓派呼吸灯 实验目的 通过背景知识学习&#xff0c;了解digital与analog的区别。通过GPIO对外部LED灯进行呼吸控制&#xff0c;熟悉PWM技术。 实验要求 通过python编程&#xff0c;用GPIO控制LED灯&#xff0c;使之亮度逐渐增大&#xff0c;随后减小&am…

10万字大数据平台数据治理体系和大数据架构技术方案word

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a; 总体技术架构设计 基于企业内部…

高频面试题|RabbitMQ如何防止消息的重复消费?

一. 前言最近有很多小伙伴开始找工作&#xff0c;在面试时&#xff0c;面试官经常会问我们这样一个题目&#xff1a;RabbitMQ如何防止重复消费?有很多小伙伴这个时候都在想&#xff0c;消息怎么还会重复消费呢???.......所以他们在面试后就跑来问壹哥&#xff0c;针对这个比…

【华为OD机试模拟题】用 C++ 实现 - 异常的打卡记录(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明异常的打卡记录【华为OD机试模拟题】题目输入输出备注示例一输入输出说明示例二输入输出说明示例三输入输出说明

基于合作型Stackerlberg博弈的考虑差别定价和风险管理的微网运行策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

数据结构与算法(五):优先队列

这节总结一下优先队列的常用实现方法。 一、基本概念 普通的队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。在优先队列中&#xff0c;元素被赋予优先级。当访问元素时&#xff0c;具有最高优先级的元素最先删除。优先队列具有最高级…

100天精通Python(数据可视化篇)——第77天:数据可视化入门基础大全(万字总结+含常用图表动图展示)

文章目录1. 什么是数据可视化&#xff1f;2. 为什么会用数据可视化&#xff1f;3. 数据可视化的好处&#xff1f;4. 如何使用数据可视化&#xff1f;5. Python数据可视化常用工具1&#xff09;Matplotlib绘图2&#xff09;Seaborn绘图3&#xff09;Bokeh绘图6. 常用图表介绍及其…

81页5G 智慧工厂物联数字孪生可视化建设方案

数字企业建设思路3 XXXX智慧企业将以信息化为基础、以数据为纽带、以制造为核心、以管理为载体打造新型智慧园区&#xff0c;该智慧园区整合了企业的安全、环保、能源、安防、应急、服务等数据资源&#xff0c;支撑企业科学、准确、及时决策&#xff0c;提升企业综合监管能力、…

计算机网络笔记、面试八股(一)—— TCP/IP网络模型

本章目录1. TCP/IP网络模型1.1 应用层1.1.1 应用层作用1.1.2 应用层有哪些常用协议1.2 运输层1.2.1 TCP与UDP的区别1.2.2 分块传输1.2.3 端口1.3 网络层1.3.1 IP报文1.3.2 IP地址1.3.3 网络号和主机号的获得1.3.4 子网掩码的获得1.3.5 路由1.3.6 IP地址与MAC地址的区别1.3.7 AR…

【C++】List 基本接口的使用

LISTList 基本接口介绍前言list 构造方法list 析构方法容量相关元素获取迭代器元素的修改其他相关操作前边博客中已经介绍了c STL 中的 string 以及 vector 基本接口的使用方法并进行了接口的模拟实现&#xff0c;接下来让我们来学习 list 的基本接口使用方法吧~~ List 基本接…

Linux基础命令-stat显示文件的状态信息

文章目录 stat 命令介绍 语法格式 基本参数 测试三个时间的变化过程 1&#xff09;使用cat命令 2&#xff09;使用echo命令 3&#xff09;使用chmod命令 4&#xff09;使用vim命令 参考实例 1&#xff09;显示文件的状态信息 2&#xff09;以简洁的形式显示状态信…

Android:IdleHandler的简单理解和使用

IdleHandler的简单理解和使用1、IdleHandler 是什么2、IdleHandler 使用方式2.1、添加和删除2.2、执行3、常见问题和使用场景3.1、使用场景3.2、常见问题参考1、IdleHandler 是什么 IdleHandler 说白了&#xff0c;就是 Handler 机制提供的一种&#xff0c;可以在 Looper 事件…

Cesium 100K数据加载 支持弹窗 动态更改位置

前言&#xff1a;今天总结关于point、label、billboard海量数据加载。后续会研究下大量model加载以及大bim(几百G上T)模型记载 海量点加载 弹窗 加载点位时&#xff0c;不加载弹窗。点击点位时在加载弹窗&#xff0c;及有效的减少加载量&#xff0c;优化性能。 const handler …

FPGA学习之日常工作复位电路

最近一个多月没有写博客了&#xff0c;然后最近工作中也遇到一个复位信号的问题。问题是这样的&#xff0c;关于外部复位信号&#xff0c;之前我们的处理方式都是通过PLL产生的Lock信号作为内部的复位信号。但是由于换到A54上面没有IP核&#xff0c;所以只有不用PLL&#xff0c…

Mybatis持久层框架 | 动态SQL、缓存

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 动态SQL 动态SQL就是指根据不同条件生成不同的sql语句&#xff0c;本质还是SQL语句&#xff0c;知识可以在SQL层面&#xff0c;执行逻辑代码 搭建环境 创建数据库 cre…

Linux搭建SVN服务器,并内网穿透实现公网远程访问

文章目录1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6.2 配置…

HCIA-HarmonyOS Application Developer——题目集2

题目1 1、HarmonyOS的"18N”战略中的"1"指的是什么? A、智慧屏 B、平板电脑 C、手表 D、手机 解析&#xff1a;&#xff08;D&#xff09; HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统&#xff0c;是一个全场景分布式智慧操作系统&#xff0c;覆…