路径规划——搜索算法详解(六):LPA*算法详解与Matlab代码

上文讲解了D*算法,D*算法为在动态环境下进行路径规划的场景提出了可行的解决方案,本文将继续介绍另外一种动态规划路径的方法——Lifelong Planning A*(LPA*)算法。

该算法可以看作是A*的增量版本,是一种在固定起始点与目标点、动态环境下实时搜索路径的算法。笔者看了很多篇讲解、原文后发现许多文章描述得云里雾里,本文可以看作是笔者对于古月学院LPA*算法的学习笔记,希望本文的算法讲解与MATLAB仿真能够给大家带来理解上的帮助!

一、LPA*算法流程讲解:

1. 基本概念:

  • 符号表示:
    • g(s):之间记录的起点距离代价的最小值;
    • rhs(s):基于父节点g所预测的最小值,设s'为s的父节点,此时有rhs(s)=g(s')+d(ss'),d(ss')表示s与父节点s‘的连接代价
    • 对于每一个节点,其记录着一个代价很熟k(n),其决定了S中的弹出顺序,类比于A*算法中的Openlist弹出的规则,其包含两个值,根据k1优先排序,当k1相同时根据k2排序,其计算方式如下:                                      

    • S:地形图中路径点集合
    • U:优先队列,每次弹出k值最小的节点s;
  • 与D*算法中采用h(X)、k(X)表示每个节点实时更新的代价、最小更新代价类似,LPA*算法采用rhs(s)、g(s)两个值表示每一个搜索点的本次计算中起始点到当前节点的代价值、目前所有次计算中从起始点到当前节点的最小代价值,注意D*是从终点开始搜索的,而LPA*算法是从起点开始搜索,所以衡量指标rhs(s)、g(s)均表示到起点的距离,这要注意不要跟D*混淆。根据rhs(s)、g(s)的大小关系定义节点的状态:
    • rhs(s)=g(s):局部一致状态,表示当前节点并未造成影响,类比于D*算法中的Lower态;
    • rhs(s)<g(s):局部过一致状态,即当前代价小于记录的历史代价,表明当前节点可以寻找到更加适合的父节点以减小到起点的代价值,更新代价:g(s)=rhs(s);此时该节点的后续子节点必定受到影响,此时需要遍历后续子节点,对于每一个后续子节点更新其rhs,检查其子节点是否能恢复到历时最小代价g,当不可恢复时将其插入搜索队列,使节点恢复到局部一致;
    • rhs(s)>g(s):局部欠一致状态,即当前代价大于记录的历史代价,此时表示该节点受到障碍物影响,遍历后续节点更新代价。一般由于父节点突变情况所致,需要将此节点g设置为∞,将其状态改为局部过一致,对于局部过一至的点在下一次循环中更新其g(s)达到局部一致状态。

2. 算法流程解释:

参考论文中的伪代码与符号解释,如下所示:

直接看代码流程会很混乱,待会会有案例讲解,有以下绩点关键需要注意,老规矩留个印象就好,看完例子再回来会有收获的:

1. 搜索过程不断重复事情是:搜索节点达到局部一致;

2. 搜索完成的指标如下(两者之一)如果目标的代价为无穷大,那么从开始到目标没有有限的代价路径。否则,最短路径可以通过向后移动来确定。

        (1)搜索队列U中最小k值大于目标点k值;

        (2)目标节点达到局部一致且不为inf;

3. 当节点s发生变化时,需要检查其所有子节点,更新子节点的rhs值,将局部一致的节点从搜索列表中删除,将受影响导致局部不一致的节点加入到搜索队列U中,并及时更新局部不一致节点的k值,不断循环该过程直到达到2中的搜索指标。

4. 增量式搜索是基于初次完成A*搜索的结果上进行的,需要进行初次搜索。

5. 上述流程中的函数含义如下:

3. 案例讲解(案例出于古月学院):

(1).初始化:

在增量式搜索开始前,求出路径点集合S中每一个自由栅格的起点的实际最小代价g*、终点启发函数h,笔者感觉此处启发函数用的是切比雪夫距离:

(2).起点搜索处理

首先将所有节点的距离起点代价rhs、记录最小的起点代价g初始化为inf,由于起点本身距离为0,所以此时rhs(A3)=0,g(A3)=∞,此时rhs(A3)!= g(A3),局部不一致,此刻将其插入到优先级队列U中。如上图所示,每一个节点处包含k=[k1,k2],后续将根据此从U中弹出元素。

(3).拓展节点(循环1):

此时弹出A3点, 此时到流程中的步骤2(代码09-16),rhs(A3)=0,g(A3)=∞,此时rhs(A3)<g(A3),令g(A3)=rhs(A3)=0(代码12),此时A3点局部一致,g(A3)=rhs(A3)=0,故确定为代价0。

同时遍历A3在第一次搜索时候的子节点(看(1)中相连接且以A3作为父节点的A2、B3),此时将A2、B3分别带入UpdateVertex函数(代码06-08)中此时根据节点A3更新rhs(A2)=g(A3)+d(A2、A3之间的距离) = 0+1=1、rhs(B3)=g(A3)+d(A3、B3之间的距离) = 0+1=1,此时由于初始化时候g(A2)=g(B3)=inf>1,此时A2、B3局部过一致,将其加入到队列U中,此时U中元素为U={A2(6,1),B3(5,1)}。

(4).弹出节点(循环2):

跟上述流程相同,弹出k最小的节点,此时U中最小的为B3,首先令其g(B3)=rhs(B3)=1,达到局部一致,此时记为1,将流程(1)中对应的子节点(C3)带入代码(代码06-08)中,步骤与上次循环一样,应该很好理解。

(5).不断循环直到结束:

不断循环计算,更新节点状态,直到满足跳出循环的条件,按照序号排序即可得到一条最佳轨迹。

(6).节点状态改变处理步骤:

如上图所示,当D1节点突变为障碍物时,此时rhs(D1)=inf,此时节点D1变为欠一致状态,此时检查其所有与之相连接的节点(代码21-23行),此时如上图#1-#4所示,其子节点(子节点定义为在路径中排列在该节点后的所有路径节点E1、F0,而F1父节点为E1,也会受到影响)由于其状态变化也变为了欠一致状态(代码14-16行),此时rhs(E1、F0、E1)= inf,故此时的图变为了#4的状态,灰色的为上次搜索得到结果后在U序列中的节点。此时U={A0(8,3)、E3(7,4)}。此时弹出E3,循环执行代码步骤2,根据上述流程即可得到一条新的路径

大家看完案例讲解后再看一遍上述的1、2部分,相信会有新的收获!

二、LPA*算法代码:

这是笔者按照课程打出来的代码,已经上传到了本人Github,需要的自取:
Adamaser/Path-Planning (github.com)

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

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

相关文章

idea开发 java web 酒店推荐系统bootstrap框架开发协同过滤算法web结构java编程计算机网页

一、源码特点 java 酒店推荐推荐系统是一套完善的完整信息系统&#xff0c;结合java web开发和bootstrap UI框架完成本系统 采用协同过滤算法进行推荐 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式…

萨科微slkor(www.slkoric.com)半导体

萨科微slkor&#xff08;www.slkoric.com&#xff09;半导体技术总监&#xff0c;清华大学李老师介绍说&#xff0c;IGBT器件与MOSFET在技术上的主要区别在于&#xff0c;在IGBT芯片背面引入了一个P掺杂的集电极。从MOSFET拓展至IGBT主要存在IGBT器件设计和IGBT器件加工工艺两方…

Layui三级联动插件使用方法

Layui高版本中没有在提供三级联动这个动画了&#xff0c;而是封装成了一个插件&#xff0c;使用方式也很简单 官网 省市县区三级联动下拉选择器 layarea - Layui 第三方扩展组件平台 (layuion.com)https://dev.layuion.com/extend/layarea/#doc html页面约束 整个选择器需要…

如何在 Oracle 中使用 CREATE SEQUENCE 语句

在本文中&#xff0c;我们将讨论 Oracle CREATE SEQUENCE 语句&#xff0c;其主要目的是提供一种可靠的方法来生成唯一且连续的数值&#xff0c;通常用于数据库表中的主键字段。此功能对于维护数据完整性和效率、确保不同记录之间的标识符有序分配尤其重要。从本质上讲&#xf…

日记本(源码+文档)

日记本&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明功能项目截图客户端首页日记列表 书写日记个人中心设置密码锁拨打客服热线修改信息退出登录登录页输入密码锁注册页 后端管理登录页首页管理员列表管理用户管理日记列表管理日记数据 文件包含…

【stm32】USART编码部分--详细步骤

USART编码部分(文章最后附上源码) 如果看不懂步骤可以根据源码参考此篇文章就能轻而易举学会USART通信啦&#xff01; 编码步骤 第一步 开启时钟 把需要用到的USART和GPIO的时钟打开 第二部 GPIO初始化 把TX配置成复用输出&#xff0c;RX配置成输入(上拉输入、浮空输入)。…

C++ 注册Nacos

下载源码&#xff1a; git clone GitHub - nacos-group/nacos-sdk-cpp: C client for Nacos 编译源码 cd nacos-sdk-cpp cmake . make 生成库文件 在nacos-sdk-cpp 下 注册nacos 将include 和libnacos-cli.so libnacos-cli-static.a 放入你的工程 如果Nacos服务地址:…

代码随想录笔记|C++数据结构与算法学习笔记-栈和队列(〇)|stack、queue、单调队列和优先级队列(priority_queue)、大顶堆和小顶堆

文章目录 stack容器stack 基本概念常用接口构造函数赋值操作数据存取大小操作 queue容器queue常用接口构造函数赋值操作数据存取大小操作 栈和队列的灵魂四问C中stack,queue是容器吗我们使用的stack,queue属于哪个版本的STL我们使用的STL中stack,queue是如何实现的&#xff1f;…

SAP CAP篇十六:写个ERP的会计系统吧,Part III

本文目录 本系列文章目标开发步骤数据库表设计Service 定义生成Fiori App更新CDS Annotation更新Entity: Companies更新Entity&#xff1a;Accounts App运行 本系列文章 SAP CAP篇一: 快速创建一个Service&#xff0c;基于Java的实现 SAP CAP篇二&#xff1a;为Service加上数据…

NLP学习路线总结:从入门到精通

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是人工智能领域的重要分支&#xff0c;它致力于使计算机能够理解、解释和生成人类语言。NLP技术的应用范围广泛&#xff0c;涵盖了机器翻译、情感分析、语义理解、信息抽取等诸多领域。对于想要…

每日一题---存在重复元素(1)和(2)

文章目录 一、存在重复数组1,1.题目展示1.2.解题思路1.3.参考代码 二、存在重复元素||2.1.题目展示2.2.解题思路2.3.参考代码 大家学习完了数组&#xff0c;指针等内容可以进行刷题了&#xff0c;刷题不仅可以增加大家的代码量&#xff0c;也可以积累自己的经验&#xff0c;言归…

C语言之指针的指向地址和指针的内容总结(八十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

2023年第十四届蓝桥杯 - 省赛 - Python研究生组 - A.工作时长

题目 数据文件&#xff1a;https://labfile.oss.aliyuncs.com/courses/21074/records.txt Idea 直接通过 datetime 模块加载时间字符串进行格式化&#xff0c;然后对时间列表进行排序&#xff0c;最后两两计算时间差。 Code Python from datetime import datetimetime_lis…

目标检测——服饰属性标签识别数据集

一、重要性及意义 首先&#xff0c;随着电商、时尚推荐等业务的发展&#xff0c;服饰属性标签识别已经成为一项关键的计算机视觉任务。这些标签&#xff0c;如颜色、款式、材质等&#xff0c;对于实现图像搜索、时尚推荐等业务需求至关重要。服饰属性标签识别数据集为此类任务…

Excel 数据-分列的三个经常用法

Case 1 &#xff1a;有时候数据导出时如果没有电子表格的话&#xff0c;只能导出本地文件&#xff0c;如下图情况&#xff1a; 可以使用数据-分列处理数据&#xff1a; 原来是因为SAP导出数据没有完成的原因&#xff0c;或者关闭Excel重新打开试一下。 重新打开后可以输入了 C…

python3GUI--不同样式的登录注册界面By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;介绍&效果展示界面一1.注册2.登录3.切换效果 界面二1.注册2.登录3.切换效果 界面三1.注册3.登录3.切换效果 界面四1.注册2.登录3.切换效果 界面五1.注册2.登录3.切换效果 界面六1.注册2.普通登录3.快捷登录4.切换效果 界面七1.登…

基于FPGA的HDMI方块移动程序设计

前面写了一篇关于HDMI视频接口的文章《基于FPGA的HDMI视频接口的设计》&#xff0c;该文章对HDMI的相关知识点做了讲解&#xff0c;这里不再重复&#xff0c;本篇文章直接实现一个简单功能-方块的移动。 该系统程序主要实现的功能就是通过串口下发指令控制方块的位置移动&…

Docker基础系列之TLS和CA认证

Docker基础系列之TLS和CA认证 文章目录 Docker基础系列之TLS和CA认证1. 引言2. 初识TLS和CA3. 开启TLS和CA认证3.1 生成证书3.2 配置TLS 4. 参考和感谢 1. 引言 我们日常工作当中会遇到这些需求&#xff1a; 监控Docker容器在idea开发工具中连接Docker&#xff0c;直接发布至…

手搓Docker-Image-Creator(DIC)工具(03):实现alpine+jre的镜像

此篇博客将介绍如何使用 Docker 创建一个alpine3.10-jre1.8.0_401 的 Docker 镜像&#xff0c;并使用 Docker 运行起来。将用到 Dockerfile 的 COPY 命令、RUN 命令、ENV 命令&#xff0c;最终实现基于单一应用的 Dockerfile 构建镜像和运行。 紧急修改&#xff1a;代码我是在m…

【机器学习300问】60、图像分类任务中,训练数据不足会带来什么问题?如何缓解图像数据不足带来的问题?

在机器学习中&#xff0c;绝大部分模型都需要大量的数据进行训练和学习&#xff08;包括有监督学习和无监督学习&#xff09;&#xff0c;然而在实际应用中经常会遇到训练数据不足的问题。就比如图像分类这样的计算机视觉任务&#xff0c;确实依赖于大规模且多样化的训练数据以…