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

 子节点优化选择策略

(1)子节点选择方式

为了找到从起始点到终点的路径,需定义一种可以选择后续节点的方式。在 A*算法中两种常见的方法为4-邻接(见图5-7(a) 和8-邻接(见图5-7(b)),  但考虑到 在复杂越野环境上,我们希望智能车辆允许更多的自由运动来更好规避危险,因此

本文选择16-邻接(见图5-7(c))。

如图5-8所示,4-邻接规划的路径具有很多的直角拐点且路径最长,其次是8- 邻接规划的路径,而16-邻接规划的路径平滑、拐点数少、路径短,适合复杂越野

环境智能车的需求。

在越野栅格地图中,我们使用节点之间的距离作为全局评估函数中真实代价  g(n)  的计算成本。规定:上下左右移动成本为1;对角45°移动成本为  2;  其余方向移动成本为  5。考虑到计算机对小数处理速度慢于处理整数,则将成本 扩大10倍,最后上下左右移动成本为10;对角45°移动成本为14;其余方向移动成本为22。

(2)优化子节点选择

传统 A* 算法在子节点选取上,仅考察子节点周围是否为障碍物,而未考察子 节点与障碍物位置的相关性,从而规划出路线存在斜着通过障碍物栅格顶点的问 题,导致车辆可能与障碍物发生碰撞。因为本文中所构建环境模型具有更危险的威

胁物存在,所以优化了子节点的选择规则。如图5-9,为16个子节点分布图。本文结合越野环境栅格地图R,    设计的子节点选择规则为:

1:若子节点4或子节点12具有威胁(在越野环境栅格地图R 中值≥1),则子节 点2、子节点6、子节点3、子节点5或子节点13、子节点9、子节点14、子节点11不作为预选点。

  x = m(x)  # runFile "/home/xugaoxiang/anaconda3/envs/pytorch1.6/lib/python3.7/site-packages/torch/nn/modules/module.py", line 722, in _call_implresult = self.forward(*input, **kwargs)File "/home/xugaoxiang/Works/Yolov5-Deepsort-Fastreid/models/yolo.py", line 36, in forwardself.training |= self.export

2: 若子节点16或子节点8具有威胁,则子节点2、子节点13、子节点15、子节点1或子节点6、子节点9、子节点10、子节点7不作为预选点。

#获得任意节点信息 ,__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

3: 均无具威胁,则不做处理。

优化子节点选择后,规划后的路径避开具有威胁栅格的顶点,避免智能车辆在运动中发生碰撞,更符合实际要求。

5.3.3 自适应评估函数设计

为权衡复杂越野环境下智能车辆的行驶安全与行车效率之间的关系,规划出 安全可行的行车路径,本文提出改进的 A*算法。传统A*算法的评价函数一般 为:

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

   (5.14) 式中: f(n)   为全局代价函数, g(n)   为真实代价函数, h(n)  为启发函数。针对传统 A*算法计算效率、无法自适应不同任务要求和拐点数量多等问题,因此,本文算 法提出了方向变化惩罚与局部区域复杂度惩罚来自适应调整g(n)  h(n) 的比例系数。

(1)方向变化惩罚

在传统的 A* 算法中,计算节点的真实代价函数g(n) 值时,到邻域任何子节点 并没有产生惩罚。然而实际的车辆行驶中,我们希望车辆保持直线行驶,所以规划 的路径应笔直、更少转弯和转弯的角度应小点等,因此本文引入方向变化惩罚,来 减少路径的无用拐点。

在越野环境中,本文规定智能车的转弯角度范围为0°~90°,将方向变化对车辆行驶的影响近似转换为行驶距离的增加,即:在原本的移动成本上进行惩罚。

 # 描述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)

方向变化惩罚规则为:

Stepl:计算当前节点与该其父节点的方向 Direction1,方向规定如图5-10(a)所 示。

Step2: 计算当前节点到其子节点的方向 Direction2。

Step3:  计算D_Change=|Direction1-Direction2|,     D_Change>4,   则将方向变化惩罚 D_P 置为无穷大,若D_Change≤4,      则参考表5.2 选择相应的方向变化惩 罚系数,图5-10(b) 已给出相应的例子参考。

Step4:   计算子节点的真实代价函数值。通过方向变化惩罚后,可以使得规划的路径尽量保持直线,减少拐点,使得路径更加高效、符合实际要求。

(2)局部区域复杂度惩罚

通过方向变化惩罚后,增加了节点的真实代价值,在A*算法中,真实代价G 大于预估代价 H 时,会增加算法的搜索范围,使得效率降低。所以本小节引入了 局部区域复杂度惩罚,来自适应调节预估代价 H 的值,使得预估代价约等于真实代价,提高算法的效率。

传统的A*算法中,算法本身是未考虑环境的复杂度。经过研究证实,路径规 划算法计算的复杂性和环境搜索空间的规模成正比,例如: A* 算法的复杂性为 o(n²)(n     为节点数),降低搜索空间即可减少遍历的节点数。为此,本文提出了根据局部区域复杂度,来自适应调节节点的搜索空间,以减少算法的时间复杂度。

(a)局部区域示意图           (b)不同方位局部区域

图5-11 局部区域复杂度定义示意图

如上图5-11(a)所示,若此时当前节点为节点1,它的父节点为父节点1,则可 计算得到当前的方向为3,参考图5-11(b)可获得该方位上的局部区域,观察图5- 11(a)局部区域,明显此区域存在障碍物、威胁物和草地等,在此区域内,希望算法 能够扩大搜索范围,寻找更优路径在避免接触障碍物和威胁物。相反如果该区域不存在障碍物和威胁物体,则希望算法能够缩小搜索范围,提高效率。因此,本文量化了局部区域的信息,设计了威胁率Q。和通过率Q,  具体为:

式中:L。为局部区域,R(i,j)越野环境栅格地图值,δ,为环境敏感度,考虑到越 野智能车辆,对于草地土路能够轻松驶过,所以本文设置为0.5,可根据车辆类型 工作任务灵活选取。n₂,n,    为越野栅格地图中一行和一列均小于δ,的条数, L  D 为局部区域的行和列。Q,描述了环境中威胁程度的多少, Q,越大表明环境存在 越多不可通过的物体。Q,描述了环境中威胁物、障碍物等位置的混乱程度, Q,越 大表明混乱度越小。

#初始化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"""

局部区域惩罚规则为:

Stepl: 计算当前节点与该其父节点的方向 Direction。

Step2:  根据方向 Direction,  参考图5-11(b)选择区域范围。

Step3: 计算威胁率Q。和通过率Q,。

Step4:  计算节点的预估代价函数值。

值得注意的是,值得注意的是,图5-11(b)中局部区域范围a 的取值,本文采 用正方形区域提高为了编程效率。a 的取值也影响着算法的效率,如图5-12所示,

(a)时间图

(a)Time to figure

(b)节点数

(b)Number of nodes in figure

取四个大小分别为30×30,40×40,50×50,60×60具有相同环境分布的栅格地 图,观察到:在不同规模的地图上,随着a 值的增加,算法遍历的节点数都有减少 的趋势,但是当a 值过大时,超过6时,算法的运算时长却有所增加,这是因为随  a 变大局部区域变大,则计算公式(5.15)和公式(5.16)需要更多时间,因此a 值应 该处于3≤a≤6,        本文选择a 为5。

 #判断节点是否在关闭表中def pointInCloseList(self, point):for node in self.closeList:if node.point == point:return Truereturn False#判断节点是否在开启表中,是返回该节点def pointInOpenList(self, point):for node in self.openList:if node.point == point:return nodereturn None#判断开启表中是否有终点def endPointInCloseList(self):for node in self.openList:if node.point == self.endPoint:return nodereturn None

(3)自适应评估函数

在获得方向变化惩罚 D_P、 局部区域的威胁率Q。和通过率Q, 在越野环境R下,改进的评估函数可以表示为:

f(n)=R(g(nz)+n*Step)+R,(h(n))

式中:g(ng)为节点n父节点的真实代价值, D_P为方向变化惩罚, Step移动代 价,R(i,j)为在节点坐标(i,j)越野栅格地图值,h(n)为节点n 的预估代价,ε为环 境威胁敏感度, d 为节点到目标点的距离, d 起始点到目标点的距离。值得注意 的是,为了加快计算机处理速度将移动成本增加了10倍,因为在计算预估代价时 也需增加10倍。

因此,综合考虑了真实越野地图的复杂性、方向变化、局部区域复杂度的影响。 方向变化惩罚确保了规划的路线尽可能笔直,并存在较少的拐点;越野栅格地图模 拟了实际的越野情景,让规划的路线更符合实际需要;局部区域复杂度惩罚则提高 了算法的高效性,当环境危险度较低时,则使启发函数权重增加,进而减小搜寻空 间,从而提升搜寻效率,相反当环境危险度高时,则使启发函数权重降低,从而扩大搜寻空间,提升搜寻精度,当环境通过率较低时,表明环境的混乱程度较大,则使真实代价函数权重提高,拓展了搜寻空间,反之降低权权重。将越野环境信息与 智能汽车的位置信息相结合,并针对不同场景,通过权重函数实现自适应调节,从 而自主调整算法的有效搜索空间,不但能够提高计算的高效性与灵敏度,还保证了路径的全局最优。

5.3.4双向Floyd 算法优化路径

Floyd 算法是一种利用动态规划思想寻找多源点之间最短路径的算法之一。根 据之前小节规划出的路径可能存在多余拐点、路径并非最优的情况,因此针对此问 题,本节提出了改进的 Floyd 算法,设计了双向优化处理来实现双向平滑优化;设计了安全距离,来保证优化了路径避免与障碍物威胁物等发生碰撞。

首先增添防碰撞安全距离预警,首先设置的安全距离 D, 接着计算威胁物点到 连线的垂直距离L,  判断安全距离与垂直距离的关系,从而判断优化的路径是否安 全。如图5-13 所示,设点a坐标为(x,ya), 点S 坐标为(xs,ys), 点n的坐标为 (xa,Ya), 则可以计算得到点a 距离直线 S-n的距离 L。安全距离的设置还与地图 位置有关,由于智能越野车辆能够较为轻松驶过道路通行系数小于0.8的道路,因此安全距离具体为:

式中: cell 为单元栅格的长度。因此,优化的路径要保证距离威胁物的距离要满足

L≥D

 图5-13 双向 Floyd 算法示意图

双向 Floyd 算法优化路径具体步骤为:

Stepl:    从起始点 S  开始,设置 S 为开始点,按步长 k 取下一路径点1,计算 距离 L 与安全距离D 并判断小大,若满足L≥D   则取下一路径点2,直至存在不满 L≥D     的路径点n,   则重新设置点n-1 为开始点,继续取点循环以上步骤直至遇到终点T 循环结束。

#障碍物分布def obstacle_dis(self,minF):if minF.father==None:return 1angle=self.Angle(minF.father.point,minF.point)#主方向   #print(angle)if angle==1:x_left=minF.point.x-2x_right=minF.point.x+2y_up=minF.point.y-5

Step2:  反向 Floyd 算法,将终点T 设置为开始点,按 Stepl 反向遍历路径点 直至遇见起始点 S 循环结束。

Step3: 若正向 Floyd算法优化路径与反向 Floyd 算法优化路径存在交点,则取 两者交集;若不存在交点,则于拐点数与路径长度和小的路径。

QQ767172261

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

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

相关文章

MSF学习

之前的渗透测试中 其实很少用到 cs msf 但是在实际内网的时候 可以发现 msf cs 都是很好用的 所以现在我来学习一下 msf的使用方法 kali自带msf https://www.cnblogs.com/bmjoker/p/10051014.html 使用 msfconsole 启动即可 首先就是最正常的木马生成 所以这里其实只需…

分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】

分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】 目录 分类预测 | Matlab实现DBO-SVM蜣螂算法优化支持向量机的数据分类预测【23年新算法】分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现DBO-SVM蜣螂算法优化支持向量机的…

数理统计基础:参数估计与假设检验

在学习机器学习的过程中,我充分感受到概率与统计知识的重要性,熟悉相关概念思想对理解各种人工智能算法非常有意义,从而做到知其所以然。因此打算写这篇笔记,先好好梳理一下参数估计与假设检验的相关内容。 1 总体梳理 先从整体结…

串口通信(4)-C#串口通信入门实例

本文通过实例讲解C#串口通信。 入门实例设计一个串口助手,能够很好的涵盖串口要点的使用。 目录 一、成品图 二、界面文件 三、后台代码 四、实例中要点 一、成品图 如下: 实现的过程 创建winform项目,将Form1文件的名称改为MainForm&…

Windows汇编调用printf

VS2022 汇编 项目右键 生成依赖项 生成自定义 勾选masm 链接器 高级 入口点 main X86 .686 .model flat,stdcall option casemap:none includelib ucrt.lib includelib legacy_stdio_definitions.libEXTERN printf:proc.data szFormat db %s,0 szStr db hello,0.code main…

关于职场伪勤奋

前段时间看了一些关于勤奋学习、职场成长类的书籍,就在思考勤奋学习和职场的关系时,结合个人的理解,我定义了一种勤奋叫职场“伪勤奋”。那关于职场“伪勤奋”的定义和理解,与大家分享: 1、选择性任务完成 伪勤奋特征…

vue 图片等比例缩放上传

需求:上传图片之前按比例缩小图片分辨率,宽高不超过1920不处理图片,宽高超过1920则缩小图片分辨率,如果是一张图片请参考这篇博客:js实现图片压缩、分辨率等比例缩放 我根据这篇博主的分享,写下了我的循环上…

HarmonyOS使用Web组件

Web组件的使用 1 概述 相信大家都遇到过这样的场景,有时候我们点击应用的页面,会跳转到一个类似浏览器加载的页面,加载完成后,才显示这个页面的具体内容,这个加载和显示网页的过程通常都是浏览器的任务。 ArkUI为我…

chatGPT 国内版,嵌入midjourney AI创作工具

聊天GPT国内入口,免切网直达,可直接多语言对话,操作简单,无需复杂注册,智能高效,即刻使用.可以用作个人助理,学习助理,智能创作、新媒体文案创作、智能创作等各种应用场景! 地址: https://ai.wboat.cn/

【51单片机系列】直流电机使用

本文是关于直流电机使用的相关介绍。 文章目录 一、直流电机介绍二、ULN2003芯片介绍三、在proteus中仿真实现对电机的驱动 51单片机的应用中,电机控制方面的应用也很多。在学习直流电机(PWM)之前,先使用GPIO控制电机的正反转和停止。但不能直接使用GPIO…

06 python 文件基础操作

6.1 .1文件读取操作 演示对文件的读取 # 打开文件 import timef open(02_word.txt, r, encoding"UTF-8") print(type(f))# #读取文件 - read() # print(f读取10个字节的结果{f.read(10)}) # print(f读取全部字节的结果{f.read()})# #读取文件 - readLines() # lines…

面试官:说说你对 linux 用户管理的理解?相关的命令有哪些?

面试官:说说你对 linux 用户管理的理解?相关的命令有哪些? 一、是什么 Linux是一个多用户的系统,允许使用者在系统上通过规划不同类型、不同层级的用户,并公平地分配系统资源与工作环境 而与 Windows 系统最大的不同…

基于MyBatis二级缓存深入装饰器模式

视频地址 学习文档 文章目录 一、示意代码二、装饰器三、经典案例—MyBatis二级缓存1、Cache 标准定义2、PerpetualCache 基础实现3、增强实现3-1、ScheduledCache3-2、LruCache 先来说说我对装饰器理解:当你有一个基础功能的代码,但你想在不改变原来代…

高效营销系统集成:百度营销的API无代码解决方案,提升电商与广告效率

百度营销API连接:构建无代码开发的高效集成体系 在数字营销的高速发展时代,企业追求的是快速响应市场的能力以及提高用户运营的效率。百度营销API连接正是为此而生,它通过无代码开发的方式,实现了电商平台、营销系统和CRM的一站式…

墒情监测FDS-400 土壤温湿电导率盐分传感器

墒情监测FDS-400 土壤温湿电导率盐分传感器产品概述 土壤温度部分是由精密铂电阻和高精度变送器两部分组成。变送器部分由电源模块、温度传感模块、变送模块、温度补偿模块及数据处理模块等组成,解决铂电阻因自身特点导入的测量误差,变送器内有零漂电路…

Redis队列原理解析:让你的应用程序运行更加稳定!

一、消息队列简介 消息队列(Message Queue),字面意思就是存放消息的队列。最简单的消息队列模型包括 3 个角色: 消息队列:存储和管理消息,也被称为消息代理(Message Broker)生产者…

Turtle绘制菱形-第11届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第16讲。 Turtle绘制菱形&a…

六.聚合函数

聚合函数 1.什么是聚合函数1.1AVG和SUM函数1.2MIN和MAX函数1.3COUNT函数 2.GROUP BY2.1基本使用2.2使用多个列分组2.3GROUP BY中使用WITH ROLLUP 3.HAVING3.1基本使用3.2WHERE和HAVING的区别 4.SELECT的执行过程4.1查询的结构4.2SELECT执行顺序4.3SQL执行原理 1.什么是聚合函数…

用友 U8总账凭证打印设置

总账--凭证打印——设置 是设置凭证打印显示的格子框,勾上就有框,去掉就没有框。

判断css文字发生了截断,增加悬浮提示

示例: 固定显示宽度,溢出显示...,利用了css的属性,想要实现成下面这样: 针对溢出的文字,hover显示全部。 提示很好加,使用tooltip组件就行了,难点是如何判断是否发生了文字溢出。…