路径规划——搜索算法详解(五):Dynamic A Star(D*)算法详解与Matlab代码

昨天休息了一天,今天继续学习搜索算法!前几天已经分别介绍了Dijkstra算法、Floyd算法、RRT算法、A*算法,无独有偶,上述算法都只适用于静态环境下两点规划的场景,但是大部分场景是实时变化的,这对规划算法提出了更高的要求,Dynamic A star算法应运而生。

Dynamic A star简称D*在“Optimal and Efficient Path Planning for Partially-Known Environments”中提出,笔者前期收集了很多D*算法的信息,刚开始看的时候也是云里雾里,看了很多遍才懂,其实基础原理并不复杂,但是描述起来比较绕,大家可以看多一遍,会有收获的。

D*算法解决的是在动态环境中计算从起点到终点距离的问题,其搜索过程是基于在初始环境下采用A*搜索的原始结果下的,具体细节接下来会一一介绍:

一、D*算法流程与案例讲解:

1.算法基础:

在该算法中提出了许多新的名词与流程,笔者认为很需要拿出来单独解释以下,留个印象即可,后面提到会再解释,建议看完再回来看,相信会加深你对D*算法的理解:

  • 与A*算法类似,D*通过维护一个优先队列openlist来存储待搜索的路径节点,但与A*不同的是,D*算法是从目标点开始搜索,通过将目标点置于openlist中来启动搜索,直到起点位置从openlist中弹出时该次搜索完成;
  • D*算法分为两个阶段:第一阶段为采用A*算法从目标点反向搜索,得到搜索路径以及每一个区域节点的信息(包含h(当前启发值)、k(最优启发值)、b(父节点))。第二阶段是动态避障搜索阶段,第一阶段的信息获取对于第二阶段的快速动态搜索起着至关重要的作用!
  • D*算法对应地分为两个部分,第一部分为Process_state,主要用于处理节点扩展;第二部分为Modify_cost,这是D*算法的核心,其用于更新受障碍物影响而导致代价值发生变化的节点信息;
  • 对于每一个搜索的节点,其标识被分为了三类:new(未被遍历节点)、open(openlist中的节点)、closed(在openlist中被移除的节点);
  • 每个节点到目标点G的代价为h(参考自A*算法的符号),节点X与节点Y之间的代价为C(X,Y), X到达终点的代价为h(X)=X的父节点Y到达终点的代价+X与Y之间的代价,即:h(X)=h(Y)+C(X,Y);
  • 节点X在不断遍历的过程中,与目标点的代价h(X)会实时改变,k(X)始终保持h(X)变化中的最小值。标识为new的点指的是未遍历点,对于其进行初始化k=h=inf;对于标识为open、closed的点,k=min{k,h_new}。
  • 对于遍历到的节点X,其根据k与h的大小关系将被标记为两种状态,当h=k时,记为Lower态,表示该点记录的最小代价h(X)与k(X)是相等的,直观上可以看作是周围环境未发生改变,或者是周围环境发生改变但是未影响到X点到达终点的代价;当h>k时,记为Raise态,其直观上可以看作是由于环境变化导致实时变化的h(X)受到了影响,更改周围连接的路径点可以达到更短的路径。
  • 为了避免混淆,笔者统一将离终点近的节点作为父节点;

2.算法流程(讲解案例来自于古月学院):

(1)算法代码逻辑:

这是原文中的伪代码

(2)案例讲解:

如上图所示,白色为自由栅格,灰色为障碍物,橙色为openlist中的栅格,蓝色为第一阶段通过A*算法反向搜索所得到的路径。起点为(2,1)、终点为(7,6),其中每个节点有三个信息,b为父节点、h为实时更新的代价值、k为记录h的最小值。

假设当前环境发生变化(4,3)变成了障碍物,此时机器人从起点(2,1)开始运动,当运动到(3,2)后机器人发现(4,3)处变成了障碍物,此时(4,3)处的h更新为h=inf,即k<h,变为了Raise态,此时到了上述伪代码的步骤2。

根据步骤2的流程,此时将遍历(4,3)的周围节点,查找能够使h降低的父节点,若存在一个使得(4,3)的h值恢复到h=k的父节点则将其恢复到Lower态,即表明图中还存在另外一条与原有路径等价的路径。

但是由于(4,3)为障碍物且不可能存在能够将其恢复到Lower态的父节点,降低后的h仍然满足h>k。此时跳过步骤3,直接进入步骤4(可以理解为(4,3)变成障碍物对其原子节点(3,2)会造成影响,这一步是为了动态传播障碍物信息,这也是D*算法的核心思想)

进入步骤4,由于不存在能够将(4,3)恢复到Lower态的节点,意味着此时由于障碍物的变化,不能够找到一条等价的路径,以(4,3)作为父节点的节点必定会受到其影响,步骤4将检查其周围节点,其中(4,4)、(5,4)、(5,3)、(5,2)没有受到其影响,而(3,3)、(3,4)、(4,2)本身为障碍物,此次循环中只有(3,2)受到了障碍物变化的影响,由于h(3,2)=h(4,3)+ d(两节点之间的距离)= inf + d(两节点之间的距离)= inf 此时(3,2)也变为了Raise态,此时对应着步骤4.1的操作,将(3,2)插入到openlist中。意味着正处于(3,2)的机器人需要寻找其他可行节点

由于k(3,2)= 5.6,从closelist中弹出并开始新一轮的循环,此时弹出k(3,2),进入步骤2,遍历周围节点并尝试寻找新的父节点X满足h(3,2)=h(X)+d(X与当前节点的距离),此时遍历所有节点可以发现(4,1)满足要求,以(4,1)作为父节点可以将h(3,2)更新为h=7.6=k恢复到Lower态。

因此,只需要将(2,3)的父节点从(4,3)更改为(4,1)后即可,由于初始搜索时每个节点都已经记录了其父节点,所以直接回溯即可得到更改后的新路径,不必再次搜索,进而保证了在动态环境下再规划的效率。

大家可以对着流程理解下,多看几次就能懂了,希望对你们有所帮助!

二、D*算法MATLAB代码

照着课程打了一遍,已经上传到本人github中,需要的朋友自取:

Adamaser/Path-Planning (github.com)

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

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

相关文章

2. 结构体内存对齐

2. 结构体内存对齐 2.1 对齐规则2.2 为什么存在内存对齐?2.3 修改默认对齐数 掌握了结构体的基本使用了。 现在我们深⼊讨论⼀个问题&#xff1a;计算结构体的大小。 这也是⼀个特别热门的考点&#xff1a; 结构体内存对齐 2.1 对齐规则 首先得掌握结构体的对齐规则&#xff…

【附升级gpt4.0方案】探索人工智能在医疗领域的革命

随着科技的飞速发展&#xff0c;人工智能已经逐渐渗透到了各个领域&#xff0c;其中医疗领域更是受益匪浅。本文将探讨人工智能在医疗领域的应用及其带来的革命性影响。 1. 人工智能辅助诊断 在医学诊断中&#xff0c;准确性至关重要。传统的诊断方法往往依赖于医生的经验和知…

服务器永久运行jar包(linux系统)

前言 在上篇博客里已经写了永久运行jar包的命令&#xff0c;但是有可能这个命令没有生效&#xff0c;所以再写一篇详细一点的&#xff0c;也是本人的踩坑经历。 再贴一次永久运行jar包命令 nohup java -jar 文件名 > 日志文件名 2>&1 &报错及检查 输入命令后…

Linux|如何管理多个Git身份

摘要 关于如何管理不同项目和多个Git身份。 作为一名通用软件开发者&#xff0c;我经常发现自己在处理各种各样的项目&#xff0c;每个项目都有自己的要求和期望。这包括为个人、工作和客户项目管理不同的Git身份。以下是我组织Git仓库以简化这一过程的方法。 目录组织 我将我的…

order by field mysql按照查询条件进行排序和统计一个字段中每个不同数值出现的次数

1.比如学生表 如何显示查询结果的顺序根据放置的顺序查询 <select id"selectNames" resultType"Student">select * from student_table where 11<if test"studentList! null">and name in<foreach item"item" ind…

【应用笔记】LAT1413+快速开关蓝牙导致设备无广播

1. 问题背景 客户使用 BlueNRG-345MC 开发了一个 BLE 外设&#xff0c;和手机连接。在测试中发现&#xff0c;手机连接上外设之后&#xff0c;不断地在手机上点击蓝牙的开关按钮&#xff0c;造成设备不断地断开、重连&#xff1b;少则几次&#xff0c;多则几十次。点击之后&am…

乐乐音乐鸿蒙版-支持krc歌词(动感歌词、翻译和音译歌词)

简介 乐乐音乐主要是基于HarmonyOS开发的音乐播放器&#xff0c;它支持lrc歌词和动感歌词(ksc歌词、krc歌词和hrc歌词等)、多种格式歌词转换器及制作动感歌词、翻译歌词和音译歌词。 开发环境 ArkTS、Stage模型、SDK3.1、 API 9 注&#xff1a;没试过在真机条件下调试。 功…

uni-app项目不显示<uni-icons></uni-icons>以及其他uni-开头的组件

/package.json {"dependencies": {"dcloudio/uni-ui": "^1.4.27", //加这个} } /pages.json //根节点下加这个 "easycom": {"autoscan": true,"custom": {// uni-ui 规则如下配置"^uni-(.*)": "d…

LLM大模型可视化-以nano-gpt为例

内容整理自&#xff1a;LLM 可视化 --- LLM Visualization (bbycroft.net)https://bbycroft.net/llm Introduction 介绍 Welcome to the walkthrough of the GPT large language model! Here well explore the model nano-gpt, with a mere 85,000 parameters. 欢迎来到 GPT 大…

什么是数据结构

一、什么是数据结构 1.数据结构研究计算机数据间的关系 2.包括数据的逻辑结构和储存结构及其操作 数据的逻辑结构&#xff1a;表示数据运算之间的抽象关系 按每个元素可能具有的直接前趋数和后继数将逻辑结构分为“线性结构”和“非线性结构”两大类 数据的储存结构&#…

huggingface 常见函数/类

目录 一、trainer保存模型的问题 1.1、在trainer训练时&#xff0c;怎么控制模型保存的数量的同时&#xff0c;还可以保存最优的模型参数呢&#xff1f; 1.2、使用trainer与deepspeed ZeRO3时&#xff0c;怎么保存模型为huggingface格式呢&#xff1f; 二、 huggingface PreTr…

【JavaSE】初识线程,线程与进程的区别

文章目录 ✍线程是什么&#xff1f;✍线程和进程的区别✍线程的创建1.继承 Thread 类2.实现Runnable接口3.匿名内部类4.匿名内部类创建 Runnable ⼦类对象5.lambda 表达式创建 Runnable ⼦类对象 ✍线程是什么&#xff1f; ⼀个线程就是⼀个 “执行流”. 每个线程之间都可以按…

【JavaWeb】Day24.Web入门——SPringBootWeb入门

什么是SPring&#xff1f; 我们可以打开Spring的官网(Spring | Home)&#xff0c;去看一下Spring的简介&#xff1a;Spring makes Java simple。Spring的官方提供很多开源的项目&#xff0c;我们可以点击上面的projects&#xff0c;看到spring家族旗下的项目&#xff0c;按照流…

mobaxterm访问服务器tensorboard方法

参考&#xff1a;mobaxterm访问服务器tensorboard &#xff08;1&#xff09;在服务器端运行 tensorboard --logdir‘/home/zzz/…’ --port 6007命令 其中&#xff0c;logdir参数指定了events.out.tfevents文件所在的路径&#xff0c;port参数指定了端口号&#xff0c;默认是…

Qt中QMutex和QMutexLocker

一.QMutex和QMutexLocker知识介绍 QMutex是Qt中的一个互斥锁&#xff0c;用于保护共享数据不被多个线程同时修改。 QMutexLocker是一个辅助类&#xff0c;它简化了对QMutex的锁定和解锁过程。 当创建一个QMutexLocker实例时&#xff0c;它会自动锁定关联的QMutex。当QMutexLoc…

Python 练习 LeetCode 贪心算法

Python 练习 LeetCode 贪心算法 整理 LeetCode 贪心算法题目的 Python 解答。保持更新 刷题顺序参考&#xff1a;https://www.jianshu.com/p/460edbe3dc36 题目分类 题目编号 数组与贪心算法 605、121、122、561、455、575、135、409、621、179、56、57、228、452、435、646、…

汇编语言第四版-王爽第2章 寄存器

二进制左移四位&#xff0c;相当于四进制左移一位。 debug命令实操&#xff0c;win11不能启动&#xff0c;需要配置文件 Windows64位系统进入debug模式_window10系统64位怎么使用debugger-CSDN博客

k8s入门到实战(八)—— Secret概述

Secret 什么是 secret 在 k8s 中&#xff0c;Secret 是一种用于存储敏感数据的对象&#xff0c;如密码、API 密钥、证书等。Secret 的设计目的是为了安全地存储和传输敏感信息。 Secret 可以以多种形式存储敏感数据&#xff0c;包括 Base64 编码、字符串文本、docker 镜像等…

解决js通过url下载文件,重命名

download属性的兼容性 由于文件服务器的地址不同&#xff0c;导致跨域的问题&#xff0c;使得a标签的download"filename"不生效 解决方案&#xff1a; downloadErrorFile () {this.getBlob(文件的url).then(blob > {let a document.createElement(a);let url …

未解决的问题:头文件和库名称的对应关系

和数学相关的函数&#xff0c;头文件是math.h&#xff0c;库名称是libm.a或libm.so 如果一个程序使用了数学函数&#xff0c;比如pow() 则需要以#include<math.h>的方式引用头文件math.h 编译链接的时候需要链接数学库libm&#xff0c;命令是gcc xxx.c -L. -lm 那…