路径规划——搜索算法详解(五):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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云4核8G服务器ECS u1实例租用优惠价格955元一年

阿里云4核8G服务器优惠价格955元一年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采用Intel(R) Xeon(R) Platinum处理器&#xff0c;阿里云活动链接 aliyunfuwuq…

手写红黑树【数据结构】

手写红黑树【数据结构】 前言版权推荐手写红黑树一、理论知识红黑树的特征增加删除 二、手写代码初始-树结点初始-红黑树初始-遍历初始-判断红黑树是否有效查找增加-1.父为黑&#xff0c;直接插入增加-2. 父叔为红&#xff0c;颜色调换增加-3. 父红叔黑&#xff0c;颜色调换&am…

相机标定学习记录

相机标定是计算机视觉和机器视觉领域中的一项基本技术&#xff0c;它的主要目的是通过获取相机的内部参数&#xff08;内参&#xff09;和外部参数&#xff08;外参&#xff09;&#xff0c;以及镜头畸变参数&#xff0c;建立起现实世界中的点与相机成像平面上对应像素点之间准…

WPF中继承ItemsControl子类控件数据模板获取选中属性

需求场景 列表类控件&#xff0c;如 ListBox、ListView、DataGrid等。显示的行数据中&#xff0c;部分内容依靠选中时触发控制&#xff0c;例如选中行时行记录复选&#xff0c;部分列内容控制显隐。 案例源码以ListView 为例。 Xaml 部分 <ListView ItemsSource"{Bi…

【Node.js】图片验证码识别

现在越来越多的网站采取图片验证码&#xff0c;防止机器恶意向服务端发送请求。但是常规的图片验证码也不是非常安全了。有非常多第三方库可以对图片上的数字文字等进行识别。 代码实现 首先安装依赖&#xff1a; npm install node-native-ocrnpm&#xff1a;(node-native-oc…

HCIA网络基础11-静态路由

文章目录 自治系统LAN和广播域路由选择路由表数据包转发最长匹配原则路由优先级路由度量静态路由配置静态路由负载分担路由备份缺省路由 以太网交换机工作在数据链路层&#xff0c;用于在网络内进行数据转发。而企业网络的拓扑结构一般会比较复杂&#xff0c;不同的部门&#x…

Mistral 7B v0.2 基础模型开源,大模型微调实践来了

Mistral AI在3月24日突然发布并开源了 Mistral 7B v0.2模型&#xff0c;有如下几个特点&#xff1a; 和上一代Mistral v0.1版本相比&#xff0c;上下文窗口长度从8k提升到32k&#xff0c;上下文窗口&#xff08;context window&#xff09;是指语言模型在进行预测或生成文本时&…

设计模式6--抽象工厂模式

定义 案例一 案例二 优缺点

重新温习广软puthon爬虫技术。

下面是我不断试错的一个过程&#xff0c;好多知识点全忘记了&#xff0c;只能不断调实例&#xff0c;不断优化&#xff0c;重构&#xff0c;实现自己的需求。下面是我的运行截图。还是导包的问题。 个人感觉关键的还是这几部&#xff0c;被划了下划线的&#xff0c;存在问题&a…

最优算法100例之17- 环形连续子数组的最大和

专栏主页:计算机专业基础知识总结(适用于期末复习考研刷题求职面试)系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 给定一个长度为 nn 的环形整数数组,请你求出该数组的 非空 连续子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开…

设计模式9--单例模式

定义 案例一 案例二 优缺点

Windows中忘记MySQL ROOT密码的解决方法

在需要ROOT身份登录MySQL但又忘记密码时&#xff0c;可以先已管理员身份运行cmd命令窗口,输入以下命令停止MySQL服务 net stop mysql 随后cd到MySQL安装目录下的bin目录下 D: //我的安装在D盘 cd D:\MySQL\bin 使用跳过权限验证的方式起启动MySQL mysqld --console --skip-g…

从零开始机器学习(机器学习 监督学习之线性回归 损失函数及可视化 梯度下降 线性回归的平方误差损失函数 lab实验)

文章目录 机器学习定义监督学习之线性回归损失函数及可视化梯度下降线性回归的平方误差损失函数lab实验 机器学习定义 机器学习就是机器通过不断训练数据集从逐渐知道正确的结果 机器学习包括监督学习和非监督学习 监督学习&#xff1a;需要输入数据和结果数据来不断训练学习…

大数据面试专题 -- kafka

1、什么是消息队列&#xff1f; 是一个用于存放数据的组件&#xff0c;用于系统之间或者是模块之间的消息传递。 2、消息队列的应用场景&#xff1f; 主要是用于模块之间的解耦合、异步处理、日志处理、流量削峰 3、什么是kafka&#xff1f; kafka是一种基于订阅发布模式的…

Linux 著名的sudo、su是什么?怎么用?

一、su 什么是su&#xff1f; su命令&#xff08;简称是&#xff1a;substitute 或者 switch user &#xff09;用于切换到另一个用户&#xff0c;没有指定用户名&#xff0c;则默认情况下将以root用户登录。 为了向后兼容&#xff0c;su默认不改变当前目录&#xff0c;只设…

专升本-云计算

被誉为第三次信息技术革命 什么是云计算&#xff1f; 云计算是一种商业的计算模式&#xff0c;它将任务分布在大量计算机构成的资源池上&#xff0c;用户可以按需通过网络存储空间&#xff0c;计算能力和信息等服务 云计算的产生和发展&#xff1a; 起源&#xff1a;上世纪6…

【力扣刷题日记】1173.即时食物配送I

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1173.即时食物配送I 表&#xff1a;Delivery 列名类型delivery_idintcustomer_idintorder_datedatecustomer…

Qt使用opencv打开摄像头

1.效果图 2.代码 #include "widget.h"#include <QApplication>#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp>#include <QImage> #include <QLabel> #incl…

实现 Element UI el-table 树形数据的懒加载

当面对大量数据时&#xff0c;一次性加载所有数据可能会导致性能问题。为了解决这一问题&#xff0c;我们可以实现树形数据的懒加载。本文将介绍如何在使用 Element UI 的 Vue 应用中为 el-table 组件的树形数据添加懒加载功能。 懒加载的基本概念 懒加载是一种优化网页或应用…

http和https的工作原理是什么?

HTTP&#xff08;HyperText Transfer Protocol&#xff09;和HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是两种用于在互联网上传输数据的主要协议&#xff0c;它们均用于在客户端&#xff08;通常是Web浏览器&#xff09;与服务器之间交换信息。尽管它们…