D-Star 寻路算法

D-Star 寻路算法

下面简写 D-Star 为 D*

  1. D算法:D 算法”的名称源自 Dynamic A Star,最初由Anthony Stentz于“Optimal and Efficient Path Planning for Partially-Known Environments”中介绍。它是一种启发式的路径搜索算法, 适合面对周围环境未知或者周围环境存在动态变化的场景。

  2. 同 A算法类似,D 通过维护一个优先队列 OpenList 来对场景中的路径节点进行搜索,不同的是 D* 不是从起点节点开始搜索,而是从目标点开始搜索,首先将目标点放置进OpenList开始搜索,直到起点节点从OpenList队列中出队为止,即为搜索完成,否则视为搜索失败。

  3. D*算法采用反向搜索的目的在于后期需要重新规划路径的时候,能够用到之前搜索到的最短路径信息,减少搜索量,以为从目标节点到起始节点进行搜索得到的最短路径,是以目标点为中心辐射出的最短路径图,图上目标点到各个点之间的路径都是最短的,因此当在既定路径上遇到障碍需要重新规划路径的时候,可以很好的利用之前得到的信息。

  4. 而从起点节点向目标节点搜索得到的最短路径图,是以起点为中心辐射出的最短路径图,当沿着路径前行遇到障碍后,需要重新进行路径规划时,没有办法很好的利用原先搜索到的信息。

  5. E-Star 算法分为两个阶段
    第一个阶段:使用 Dijkstra/A*算法找到从目标点到起始点的路径,然后机器人从开始节点向目标点移动。
    第二阶段:是动态避障搜索阶段,当机器人移动到一个节点要向下一给节点移动的时候,发现下一个节点由可行走变成障碍时,需要重新规划路径。

  6. 参考D论文
    D
    算法有几个重要的概念及函数
    6.1. G : Goal State目标节点

    6.2. **State :**路径节点,路径节点包含以下几个信息

    6.2.1. BackPointer:指向前一个 State 的指针,一般 Dijkstra/A 用 Parent表示,路径搜索结束后,机器人从所在的 State,通过 BackPointer 即可一步一步地移动到目标 Goal State
    6.2.2. b(X) = Y 表示 X 的
    BackPointer
    *(父节点)是 Y
    6.2.3. New:State 从未被放置于 OpenList
    Open:State 此时正存放于 OpenList
    **Closed:**该 State 已经从 OpenList 中出队

    6.3. H(X):代价函数,表示当前 StateG 的开销计算,如果节点X的父节点是YH(X) = H(Y) + C(X,Y)

    6.4. K(X):Key Function,该值是优先队列OpenList中的排序依据,K 值最小的State位于队列头(Dijkstra/AOpenList 排序是以H值为排序依据),D是针对动态环境设计的算法,由于环境的改变节点的H值可能发生改变,而节点的K值记录的是该点的最小H值,也就是说对于为遍历到的点,K=H=inf,对于表示为 OpenClosed的节点 K = min(K,H_new)

    6.5. C(X,Y):表示XY之间的路径开销

    注意:OpenList 是依据节点K值由小到大进行排序的优先队列

  7. 算法最主要的函数:
    PROCESS-STATE:计算到目标G的最优路径
    MODIFY-COST:改变两个 State 之间的开销C(X,Y),并将受影响的State置于OpenList 中
    INSERT: 用来修改节点 X 状态以及 H(X)值和K(X)

D* 寻路算法伪代码如下
下面代码是论文中的代码
在这里插入图片描述
下面是代码的注释翻译

-- 下面代码包含:
-- 开始寻路过程
-- 行走过程
-- 遇到障碍再寻路的过程
{-- 初始设置目标节点 H 值为 0,将 G 加入到 OpenListh(G)=0;-- 开始寻路过程do{-- 循环调用 PROCESS-STATE(), 函数返回当前 OpenList 优先队列中节点K值最小的K值-- 如果 OpenList 优先队列中没有节点则返回 -1kmin=PROCESS-STATE();-- while 判定条件-- kmin = -1:说明还没有找到 开始节点(start state),OpenList 优先队列中没有节点了,则寻路失败-- start state not removed from open list:开始节点(start state)从 OpenList 队列出队,则已经从目标节点找到 开始节点了}while(kmin != -1 && start state not removed from open list);if(kmin == -1){-- 如果 kmin = -1 说明寻路失败返回,退出goal unreachable; exit;}else{-- 寻路成功,在 do-while 中包含了 行走、do{-- 行走过程do{-- 迭代行走trace optimal path();-- while 判定条件-- goal is not reached:没有到大 G 目标节点-- map == environment:假如当前走到节点X,要向下一个节点Y行走时,判断节点Y状态发生了变化(变成了障碍等)}while ( goal is not reached && map == environment);-- 如果已经到大 G 目标点,退出if (goal_is_reached){exit;}else{-- 没有到达目标点,肯定是行走过程中一个本来可以通过的节点,状态发生了变化-- 机器人行走过程中发现障碍时所在的 state 节点X-- 向节点Y行走时发现节点Y状态发生变化了,导致路径开销的更改已经传播到了节点XY = State of discrepancy reached trying to move from some State X;-- 改变节点Y、X 的CostMODIFY-COST(Y,X,newc(Y,X));-- 遇到障碍再寻路的过程do{kmin=PROCESS-STATE();-- while 判定条件-- kmin< h(X):经过不断地处理直到 kmin 小于节点 X 的 H值-- kmin != -1:当 kmin = -1 时表示寻路失败}while(kmin< h(X) && kmin != -1);-- 寻路失败,退出if(kmin==-1)exit();}}while(1);}
}

另论文中另一个版本的逻辑如下
在这里插入图片描述
两者的不同在于遇到障碍重新规划路径的 do-while 中的 while 部分

两个代码不同点只在下面 while 部分,经过测试,两种判定都是可以完成再次寻路的,时间原因论文没有仔细阅读,有疑问的读着可以自行去看论文,然后给我说一下结果
do
{kmin=PROCESS-STATE();
}while(kmin< h(X) && kmin != -1);do
{kmin=PROCESS-STATE();
}while( k(Y) < h(Y) && kmin != -1);

PROCESS-STATE() 函数
在这里插入图片描述

MODIFY-COST(X,Y,cval)
MIN-STATE()
GET-KMIN()
INSERT(X, newCost)
在这里插入图片描述

上面截图中函数代码不全,下面是各个函数补齐
MODIFY-COST(X,Y,cval)

    c(X,Y)=cvalh(Y) = cvalif t(X) =CLOSED then INSERT (X,h(X))Return GET-MIN ( )

INSERT(X,Hnew)

	if t(X) = NEW thenk(X)=hnew -- 然后就是 X 加入到 OpenList 队列这部分X and to OpenListif t(X) = OPEN then k(X)=min(k(X),hnew)if t(X) = CLOSED then k(X)=min(k(X),hnew)-- 然后就是 X 加入到 OpenList 队列这部分X and to OpenList-- 漏掉了 h(X) = hnewh(X) = hnewt(X)= OPENSort open list based on increasing k values;

MIN-STATE()

返回 OpenList 优先队列中 节点K 值最小的 节点

GET-KMIN()

返回 OpenList 优先队列中 节点K 值最小的 节点的 K 值

D* 核心逻辑就是上面几个截图
Originally stated D* Algorithm 或者 D* Algorithm, again
加 下面几个方法
PROCESS-STATE()
MODIFY-COST(X,Y,cval)
MIN-STATE()
GET-KMIN()
INSERT(X, newCost)

一个 使用 Unity 实现的 Demo 链接

算法在路径 PathFindingUnity\Assets\Script\PathFinding\Algorithms\DStar
效果如下
在这里插入图片描述

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

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

相关文章

静态代理IP测试:有何优点?

随着互联网的普及&#xff0c;越来越多的人开始使用动态IP进行上网。但是在某些情况下&#xff0c;我们可能需要使用静态IP进行测试或特定的网络设置。本文将介绍如何获取静态IP进行测试以及静态IP的优点。 一、如何获取静态IP进行测试&#xff1f; 1.联系ISP&#xff08;Int…

Docker Desktop 安装 ClickHouse 超级简单教程

Docker desktop 安装 clickhouse 超级简单 文章目录 Docker desktop 安装 clickhouse 超级简单 什么是 Docker &#xff1f;安装下准备安装Docker配置安装 ClickHouse配置数据库密码DBeaver 测试创建表总结 什么是 Docker &#xff1f; 下载 Docker desktop Docker Desktop …

红外相机和RGB相机标定:实现两种模态数据融合

1. 前期准备 RGB相机&#xff1a;森云智能SG2-IMX390&#xff0c;1个红外相机&#xff1a;艾睿光电IR-Pilot 640X-32G&#xff0c;1个红外标定板&#xff1a;https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…

Spring MVC开发小练习

1. 加法计算器 需求&#xff1a;输入两个整数&#xff0c;计算和 约定前后端交互接口&#xff1a; 在开发项目前&#xff0c;根据需求先约定好前后端交互接口&#xff0c;双方按照接口文档进行开发&#xff0c;接口文档一旦写好&#xff0c;尽量不要轻易改变&#xff0c;如果…

CPU设计实战-Wishbone总线接口

为什么需要改用总线接口&#xff1f; 1.但是在实际应用中&#xff0c;程序的体积可能非常大&#xff0c;指令存储器就不能再集成在FPGA内部了&#xff0c;一般使用FPGA芯片外部的Flash作为指令存储器。同理,-般使用FPGA芯片外部的SDRAM作为数据存储器。 2.统一接口标准。 很多…

蓝桥杯 2023 省B 飞机降落

首先&#xff0c;这题要求的数据量比较少&#xff0c;我们可以考虑考虑暴力解法。 这题可能难在很多情况的考虑&#xff0c;比如说&#xff1a; 现在时间是10&#xff0c;有个飞机20才到&#xff0c;我们是可以干等10分钟。 #include <iostream> #include <…

0101插入排序-算法基础-算法导论第三版

文章目录 一 插入排序二 循环不变式与插入排序的正确性三 伪代码中的一些约定四 Java代码实现插入排序结语 一 插入排序 输入&#xff1a; n n n个数订单一个序列 ( a 1 , a 2 , ⋯ , a n ) (a_1,a_2,\cdots,a_n) (a1​,a2​,⋯,an​). **输出&#xff1a;**输入序列的一个排…

OpenWRT+zeroTier旁路由组网

前言 我之前写过一篇文章&#xff0c;探究了zeroTier的最基础的玩法&#xff0c;那篇文章结尾我提到了使用zeroTier虽然实现组网了&#xff0c;但是我只能访问局域网中制定的设备&#xff0c;局域网中其他设备无法访问&#xff0c;这篇文章我又研究了一套方案openwrtzeroTier旁…

IEEE Transactions on Medical Imaging(TMI)论文推荐:2024年01月(1)

Unsupervised Domain Adaptation for Medical Image Segmentation by Disentanglement Learning and Self-Training 摘要&#xff1a;无监督域适应(Unsupervised domain adaptive, UDA)旨在提高深度模型在无标记数据上的分割性能&#xff0c;近年来受到广泛关注。在本文中&…

el-input设置max、min无效的解决方案

目录 一、方式1&#xff1a;type“number” 二、方式2&#xff1a;oninput&#xff08;推荐&#xff09; 三、计算属性 如下表所示&#xff0c;下面为官方关于max&#xff0c;min的介绍&#xff1a; el-input&#xff1a; max原生属性&#xff0c;设置最大值min原生属性&a…

如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境

如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境 基于包管理器进行安装 Linux 会把一些软件包放到对应的服务器上&#xff0c;通过包管理器这样的程序&#xff0c;来把这些软件包给下载安装 ubuntu系统上的包管理器是 apt centos系统上的包管理器 yum 注&#xff1a;…

前缀和算法

前缀和可以快速求出数组中某个连续区间的和 预处理出来一个前缀和数组 为了处理边界情况,下标从1开始 dp[i]表示原数组[ 1 , i ]区间内所有元素之和 dp[i]dp[i-1]原数组[i] 使用前缀和数组 文章目录 【模板】前缀和【模板】二维前缀和寻找数组的中心下标除自身以外数组的乘积…

打卡学习kubernetes——了解k8s基本概念

目录 1 Container 2 Pod 3 Node 4 Namespace 5 Service 6 Label 7 Annotations 8 Volume 1 Container Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用namespace隔离不同的软件运行环境&#xff0c;并通过镜像自包含软件的运行环境&#xff0c;从而…

关于继承是怎么样的?那当然是很好理解之

本文描述了关于继承的大部分知识&#xff0c;但是并不全&#xff0c;每篇博客之间的知识都有互串&#xff0c;所以需要把几篇文章合起来看&#xff0c;学会融会贯通&#xff01; 温馨提示&#xff1a;使用PC端观看&#xff0c;效果更佳&#xff01; 目录 1.继承是什么 2.什…

机器学习是什么?

机器学习是一种人工智能&#xff08;AI&#xff09;的分支&#xff0c;其主要目标是使计算机系统能够通过数据和经验来改进和学习&#xff0c;而无需明确地编程。在机器学习中&#xff0c;计算机系统会通过对大量数据进行学习和分析&#xff0c;从中发现模式和规律&#xff0c;…

JavaScript进阶:js的一些学习笔记-4

文章目录 1. 拷贝1. 浅拷贝2. 深拷贝 2. 异常处理 1. 拷贝 这里指的拷贝是指拷贝引用类型的数据(对象) 1. 浅拷贝 拷贝对象&#xff1a;Object.assign() 或者 {…obj} 展开运算符 const obj {name:liuze,age:23 } const o {...obj}; o.age 22; console.log(o); console.…

Linux | Ubuntu安装pylsl

PYNQ开发中使用pylsl过程记录 操作系统为 Linux pynq 5.15.19-xilinx-v2022.1 #1 SMP PREEMPT Mon Apr 11 17:52:14 UTC 2022 armv7l armv7l armv7l GNU/Linux 使用 pip install pylsl 安装后在导入包的过程中会遇到如下错误&#xff1a; RuntimeError: LSL binary library f…

深入浅出前端本地储存(1)

引言 2021 年&#xff0c;如果你的前端应用&#xff0c;需要在浏览器上保存数据&#xff0c;有三个主流方案&#xff1a; CookieWeb Storage (LocalStorage)IndexedDB 这些方案就是如今应用最广、浏览器兼容性最高的三种前端储存方案 今天这篇文章就聊一聊这三种方案的历史…

前端基础篇-深入了解 Ajax 、Axios

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Ajax 概述 2.0 Axios 概述 3.0 综合案例 1.0 Ajax 概述 通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互是指&#xff0c;可以在不…

【安全类书籍-2】Web渗透测试:使用Kali Linux

目录 内容简介 作用 下载地址 内容简介 书籍的主要内容是指导读者如何运用Kali Linux这一专业的渗透测试平台对Web应用程序进行全面的安全测试。作者们从攻击者的视角出发,详细阐述了渗透测试的基本概念和技术,以及如何配置Kali Linux以适应渗透测试需求。书中不仅教授读者…