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

news2025/1/4 17:41:47

昨天休息了一天,今天继续学习搜索算法!前几天已经分别介绍了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.coloradmin.cn/o/1559387.html

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

相关文章

二叉树的深度优先遍历(前中后)

1. 前序遍历 前序遍历是先输出根节点&#xff0c;再输出左子树&#xff0c;最后输出右子树。 2. 中序遍历 中序遍历&#xff0c;左子树&#xff0c;根节点&#xff0c;右子树 3. 后序遍历 左子树&#xff0c;右子树&#xff0c;根节点 4. 代码实现&#xff08;递归形式&…

Vulnhub:BROKEN: GALLERY

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb WEB wen信息收集 目录扫描 进制转换 ssh登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, M…

向量点乘有哪些作用呢

如下&#xff1a; 1.找到两个向量之间的夹角(不用多说) 2.求一个向量投影在另一个向量的投影&#xff1a; 我们把图中b的在a上的投影向量称作b1吧&#xff0c;因为b1就在a上&#xff0c;所以只需要求出b1的大小&#xff0c;然后乘以a的单位向量&#xff0c;我们就得到向量b1了…

Bezier曲线

1. 实验要求 2. Bezier曲线的原理 以及 公式推导 参考贝塞尔曲线&#xff08;Bezier Curve&#xff09;原理及公式推导_bezier曲线-CSDN博客 Bezier曲线的一些特性&#xff1a; 使用n个控制点来控制曲线形状 曲线通过起始点和终止点&#xff0c;接近但不通过中间点 2.1 直观…

结构化绑定optional(C++基础)

结构化绑定 处理多个返回值的操作&#xff1a;C17提出 之前多返回值喜欢用struct来返回。现在会做成元组&#xff0c;下图中设置C17的版本&#xff0c;不要设置错为C语言标准。 #include<iostream> #include<string> #include<tuple> std::pair<std::st…

ubuntu下给不同串口设置别名

目录 一、绑定设备ID 1.查看设备ID 2.编写usev规则 3.重新加载usev规则 4.查看 二、绑定USB端口号 1.先插入一个串口&#xff0c;查看USB设备信息 2.查看USB转串口信息 3.编写usev规则 4.重新加载usev规则 5.查看 在Ubuntu环境下&#xff0c;有时候工控机或者arm开…

新增收货地址

目录 &#x1f9c2;1.创建controller层 &#x1f953;2.创建service层 &#x1f32d;3.注意细节 &#x1f37f;4.避免dao数据暴漏 1.创建controller层 controller不做逻辑操作&#xff0c;只接受前端的数据 1.添加Api设置swagger模块名称2.RestController以json形式返回…

CAJViewer8.1下载地址及安装教程

CAJViewer是中国学术期刊&#xff08;CAJ&#xff09;全文数据库的专用阅读软件。CAJViewer是中国知识资源总库&#xff08;CNKI&#xff09;开发的一款软件&#xff0c;旨在方便用户在线阅读和下载CAJ数据库中的学术论文、期刊和会议论文等文献资源。 CAJViewer具有直观的界面…

2000-2021年各省技术市场发展水平数据(原始数据+计算结果)

2000-2021年各省技术市场发展水平数据&#xff08;原始数据计算结果&#xff09; 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;国家统计局、统计年鉴 3、范围&#xff1a;30省 4、指标&#xff1a;技术市场成交额、国内生产总值、技术市场发展水平 5、计算说明“技…

java字符串(一)-- 字符串API,StringBuffer 和 StringBuilder,Object

String字符串相关的类 String的特性 String类&#xff1a;代表字符串。Java 程序中的所有字符串字面值&#xff08;如"abc" &#xff09;都作为此类的实例实现。String类是引用数据类型。 在 Java 8 中&#xff0c;String 内部使用 char 数组存储数据。 public fi…

C++的入门学习

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一、C关键字(C98) 二、命名空间 2.1 引入 ​编辑2.2 命名空间定义 2.3 命名空间的使用 三. C输入&输出 四.缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 1.全缺省参数 2…

MCGS学习——水位控制

要求 插入一个水罐&#xff0c;液位最大值为37插入一个滑动输入器&#xff0c;用来调节水罐水位&#xff0c;滑动输入器最大调节为液位最大值&#xff0c;并能清楚的显示出液位情况用仪表显示水位变化情况&#xff0c;仪表最大显示设置直观清楚方便读数&#xff0c;主划线为小…

基于spark的大数据分析预测地震受灾情况的系统设计

基于spark的大数据分析预测地震受灾情况的系统设计 在本篇博客中,我们将介绍如何使用Apache Spark框架进行地震受灾情况的预测。我们将结合数据分析、特征工程、模型训练和评估等步骤,最终建立一个预测模型来预测地震造成的破坏程度,同时使用可视化大屏的方式展示数据的分布…

提升 RAG 效果的实践

提升 RAG 效果的实践 0. 引言1. 测试数据2. cohere/embed-multilingual-v3.0 的几组测试结果2-1. 第1组测试2-2. 第2组测试 3. BAAI/bge-m3 的几组测试结果3-1. 第1组测试 0. 引言 AI 大语言模型的主要应用方式之一就是 RAG&#xff0c;接下来计划陆续分享工作中提升 RAG 效果…

vue3封装Element表格

配置表头配置多选配置序号自定义操作列按钮 封装表格 Table.vue <template><el-table:data"tableData"width"100%":maxHeight"maxHeight"v-bind"$attrs"selection-change"handleSelectChange"row-click"hand…

考研数学|听完一遍汤家凤基础,1800都没思路,怎么办?

看了我这篇回答&#xff0c;保证你可以顺利的做1800题&#xff01; 如果你听了汤家凤老师的课&#xff0c;但是做题没思路&#xff0c;请不要担心&#xff0c;也不要急着换老师&#xff0c;你很有可能是方法错了。 请你反思一下&#xff1a; 1、你是不是听完课立刻就去做题。…

linux系统基础命令

1、Linux中文件的权限包括哪些&#xff1f;某个文件的权限列为644代表该文件属主、属组和其它用户分别有什么权限&#xff1f; 1&#xff09;Linux中文件的权限包括哪些&#xff1f; 在Linux系统中&#xff0c;文件的权限包括读取&#xff08;r&#xff09;、写入&#xff08;w…

ARP类型

地址解析协议ARP即可实现将IP地址解析为MAC地址 动态ARP 动态ARP表项由ARP协议通过ARP报文自动生成和维护&#xff0c;可以被老化&#xff0c;可以被新的ARP报文更新&#xff0c;也可以被静态ARP表项覆盖。 动态ARP适用于拓扑结构复杂、通信实时性要求高的网络。 静态ARP …

C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍模型描述程序…

(React组件基础)前端八股文Day6

一 类组件与函数组件有什么异同 在React中&#xff0c;类组件和函数组件是创建组件的两种主要方式。随着React的发展&#xff0c;尤其是自Hooks在React 16.8中引入以来&#xff0c;函数组件的功能变得更加强大&#xff0c;使得它们能够更加方便地与类组件相竞争。下面是类组件…