D-star Lite算法及相关思考

news2024/11/24 6:46:51

   一、D-star Lite算法简介

   1994年 Anthony Stentz在论文Optimal and Efficient Path Planning for Partially-known Environments中提出了D*算法

   D * 算法采用逆向搜索,从目标点向起始点搜索规划,可以处理环境部分未知或全部未知以及动态障碍的一些情况。此算法被作为路径规划的核心算法应用于美国1996年发射的火星探测器上,并获得了很大的成功。

   基于反向搜索思想的D*算法能够很好的处理动态障碍这种情况,虽然可以实现未知环境的路径规划,但效率较低。

   1995年,Anthony Stentz又于在论文The Focussed D * Algorithm for Real-Time Replanning中提出了Focused D * 算法,重点提高了D*算法的实时性

   2001年,Sven Koenig和Maxim Likhachev首次提出了LPA * 算法。

   LPA * ( Lifelong Planning 终身规划 A * )是一种基于A * 的增量启发式搜索算法,被用来处理动态环境下从给定起始点到给定目标点的最短路径问题,即起始点和目标点是固定的。

   LPA * 算法能够在环境的障碍发生突变时,最大限度的利用前一次的搜索结果,从而快速进行第二次规划,但LPA * 算法只能求解定起点和定终点之间的最优路径问题,在遭遇动态障碍物进行第二次路径规划时受影响的节点较多,计算量较大。

   2002年,Sven Koenig和Maxim Likhachev在论文D* Lite中首次提出D * Lite算法

   2005年,Sven Koenig和Senior Member在论文Fast Replanning for Navigation in Unknown Terrain中对提出D * Lite算法进行了进一步描述。

   D * Lite是也是一种增量的、启发式的规划算法,它完成的功能和Focussed Dstar相似,但从算法设计的角度来看,它们有着不同的思路。D * Lite算法融合了LPA * 算法的增量搜索思想、D * 算法的反向搜索思想,是一种变起点的反向增量式动态路径搜索算法。


在这里插入图片描述


   二、D * 算法与LPA * 算法基础

   为了更好的了解D * lite算法,我们先简单了解一下D * 算法(选做),重点了解掌握一下LPA * 算法,本部分内容在前面的文章中已经做了介绍,本文中不再介绍,链接如下:

     xxx:【点击此处跳转】

     LPA-star算法(Lifelong Planning)及相关思考:【点击此处跳转】


   三、在LPA * 算法的基础上看D * Lite算法

     1、D * Lite算法LPA * 算法的重大差异

     ① k1值的不同:D * Lite算法的k1的计算组成中,在LPA * 的min(g(s),rhs(s))+ h(s,sstart)的基础上增加了km项,km值表示机器人当前位置与算法运行后第一次静态规划的起始位置的距离(代价值),如下图所示。

     km值的作用是什么呢? 当算法运行并成功规划出第一次的静态路径后,机器人开始沿着该路径向目标位置移动,若移动过程中出现的动态障碍物导致第一次规划的路径不可行后,开始进行动态规划,并将机器人当前的位置作为新的起点,对于此后的点计算的h值是拓展点与机器人当前位置的距离(代价值),而对于之前第一次规划时计算的h值,则是拓展点与机器人第一次静态规划时的起点的距离(代价值),此时,我们想要在本次规划时使用之前规划搜索时得到的先验信息,便产生了冲突。

   一种解决该冲突的方法是,将U队列中的所有点的h值减去km,来将h值统一成拓展点到机器人当前位置的距离(代价值),但是当U队列中节点较多时,这样做会耗费较多的计算资源,效率较低。若机器人再次移动后,依然需要将U中所有点的h值再次更新一下。

   另外一种解决该冲突的方法,也就是D * Lite采用的方法是,将新加入到U队列中的点的h值都加上km,来将(h+km)值的整体统一成拓展点到算法运行后第一次静态规划的起始位置的距离(代价值),此种方法可以在耗费较低的计算资源的基础上,解决以上冲突,效率较高。

     ② 搜索方向的不同:与LPA * 的正向搜索不同的是,D * Lite算法采用跟D * 算法类似的反向搜索策略,即从目标点向起始点搜索。

     ③搜索方式不同:LPA * 采用的是定起点和终点的搜索方式,当机器人开始移动后,即起始点改变后,在移动过程中出现的新的障碍物使得当前路径不可行后,便需要重新进行静态规划,不能很好的利用之前规划的信息(这一点从LPA * 没有考虑①中介绍冲突也能体现出来 ),而D * Lite算法则是动起点的搜索方式,即使机器人的当前位置已经发生了改变,依然可以很好的使用之前规划的信息进行动态规划,而不需要重新进行无先验信息的静态规划。

     2、在LPA * 算法的基础上看D * Lite算法流程

     首先,将当前的起点赋值给Slast,更新上一次的起点,便于后续计算△km,然后执行初始化部分Initialize(),除将目标点的rhs值设为0,将终点加入到U队列中之外,其余部分与LPA*基本相同。然后执行ComputeShortestPath()函数,与LPA * 不同的是,D * Lite新增了判断当前拓展点是否被影响的程序,若k_old小于节点u计算的k值,表明节点u的k值受到周围节点的影响而做过修改,故应当重新插入到U队列中,不再进行本次拓展,重新从U队列中取k值最小的节点进行拓展。ComputeShortestPath()函数的其余部分与LPA * 相同,不再进行介绍

   执行完ComputeShortestPath函数后,第一次静态规划就结束了,机器人开始沿着该路径向目标点移动,伪代码里面介绍的方法是从当前点开始向周围八邻域节点中代价值(g值)较小的那个节点移动,其实环境未发生变化时,与沿着静态规划的路径移动是等效的。

   在移动过程中,若发现新出现的动态障碍物导致之前规划的路径不可行后,先更新km值,km=km+△km=km+h(Slast,Sstart),并当前起点Sstart赋值给Slast,更新上一次的起点信息。剩下的操作就与LPA* 类似了,找到所有受影响的节点,然后将突变为障碍物的节点的rhs和g值均设为inf,将受影响的节点的rhs值设为inf,并加入到U队列中,然后调用ComputeShortestPath函数动态规划新的路径。

-



   四、D * Lite算法流程示例


   五、D * Lite优化版本

   除了上面介绍的D * Lite版本,原作者还在论文中给出了其多优化版本的伪代码,如下所示。


主要参考资料:

     1、古月学院 基于栅格地图的机器人路径规划算法指南:【点击此处跳转】

     2、D * 算法:【点击此处跳转】


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

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

相关文章

神经网络入门(一)

神经网络入门(一) 文章目录神经网络入门(一)1. 神经元2. 网络结构3. 激活函数2.1 激活函数的作用与性质2.2 Sigmoid型函数2.3 Hard-Logistic函数和 Hard-Tanh函数2.4 ReLU函数2.5 常见的激活函数及其导数4. 前馈神经网络4.1 前馈神…

DAY05-网页布局实战选择器CSS样式

文章目录网页布局实战一 CSS选择器a.基本选择器1.元素选择器2.类选择器3.id选择器b.复杂选择器c 伪选择器d 伪元素选择器二 CSS常用样式1.文本相关属性2.背景属性1)背景颜色2)背景图片3)背景平铺4)背景位置5)设置背景图片大小:6)background 背景复合属性案例1案例2案…

Session的使用

Session的使用Session概述Session特性Session原理Session对象操作获取Session对象-----getSession获取SessionID------getId向Session对象存储/修改数据-----setAttribute获取数据------getAttribute删除数据----removeAttributeSession对象失效Session概述 Session对象&#…

rust编程-rust所有权理解(chapter 4.2 引用实质是借用)

目录 2. 引用与借用 2.1 可变(mutable)引用 2.2 悬空(dangling)引用 2.3 引用的规则总结 2. 引用与借用 上一章节中提到,所有权在函数调用中的转移,函数返回必须同时返还所有权,才能使函数调用后能继续使用某个变量…

[附源码]计算机毕业设计勤工助学管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

jquery 登录-记住密码

jquery 登录-记住密码在登录时,添加记住密码功能:用的 localStorage 存储和获取登录信息 //存储 var username $("input[nameusername]").val(); var password $("input[namepassword]").val(); var validateCode $("inpu…

自动驾驶:2022 apollo day 观后感(一)

2022 apollo day 观后感(一)注: ppt来自apollo day,结合ppt,讲述一些自己的想法,欢迎批评指正!Topic One -- 打造安全、智能、高效的自动驾驶技术体系(陈竞凯)无人驾驶技…

Ruby ERB模板注入检测

了解Ruby ERB模板注入,Ruby ERB模板注入检测。 ERB是Ruby自带的 <% 写逻辑脚本(Ruby语法) %><%= 直接输出变量值或运算结果 %>require erbtemplate = "text to be generated: <%= x %>" erb_object = ERB.new(template) x = 5 puts erb_object.r…

[附源码]JAVA毕业设计人才公寓管理系统(系统+LW)

[附源码]JAVA毕业设计人才公寓管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

Linux——Xshell、Xftp实现Linux远程登录与应用

目录 一、远程登录 1.1 SSH登录方式 二、Xshell远程连接 2.1 远程连接 2.2 设置粘贴复制 三、Xftp远程连接 3.1 远程连接 3.2 解决乱码 3.3 传输文件 一、远程登录 通常在工作过程中&#xff0c;公司中使用的真实服务器或者是云服务器&#xff0c;都不允许除运维人员 之…

微电网优化调度|农村农业区可再生能源微电网优化调度(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

软件测试就业现状分析,2023是卷还是润?

一、当前软件测试的现状是什么&#xff1f; 现状1、网络上大量人唱衰&#xff0c;测试就业不行了 2022年5月后&#xff0c;越来越多人网络发声“互联网行业不行了”。贴吧、知乎、小红书上&#xff0c;也有大量人反馈软件测试就业惨淡……&#xff0c;篇幅有限&#xff0c;仅…

Docker学习4-常用命令之重要的容器命令

本文是Docker学习系列教程中的第四篇。本文是Docker常用命令中的重要命令。为什么说重要呢&#xff1f;因为这些命令&#xff0c;在以后开发过程中&#xff0c;会经常使用到。比如&#xff1a;怎么查看容器中运行的日志&#xff1f;怎么查看容器运行的进程&#xff1f;怎么导出…

最新中文版本FLStudio21水果音乐软件更新下载

导读&#xff1a;昨晚Image-Line发布FL Studio 2023&#xff0c;而今年也是他们成立第23周年。FL21一经发行便引起了广大制作人的关注&#xff0c;今天我们来介绍一下这款软件。FL Studio是一款音乐编曲软件&#xff0c;全称&#xff1a;Fruity Loops Studio&#xff0c;也是我…

实战:Kind部署k8s集群-2022.12.6(成功测试)

写在前面 原文阅读效果更佳&#xff1a;实战&#xff1a;Kind部署k8s集群-2022.12.6(成功测试) 语雀 《实战&#xff1a;Kind部署k8s集群-2022.12.6(成功测试)》 Kind Kind 是 Kubernetes in Docker 的简写&#xff0c;是一个使用 Docker 容器作为 Node 节点&#xff0c;在…

通关算法题之 ⌈栈和队列⌋

栈和队列 155. 最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取…

文件系统实现

文件系统实现&#x1f3de;️1. 整体组织&#x1f301;2. 文件组织&#xff1a;inode&#x1f320;3. 多级索引&#x1f4d6;3.1 间接指针&#x1f4d6;3.2 多重间接指针&#x1f4d6;3.3 基于范围的方法&#x1f30c;4. 目录组织⛺5. 空闲空间管理&#x1f33f;6. 读取和写入文…

Vue 官方文档2.x教程学习笔记 1 基础 1.7 条件渲染

Vue 官方文档2.x教程学习笔记 文章目录Vue 官方文档2.x教程学习笔记1 基础1.7 条件渲染1.7.1 v-if1.7.2 在\<template> 元素上使用 v-if条件渲染分组1.7.3 v-else1.7.4 v-else-if1.7.5 用 key 管理可复用的元素1.7.6 v-show1.7.7 v-if vs v-show1.7.8 v-if 与 v-for 一起…

小网SIM卡QMI拨号无法获取IPv6地址问题的分析

背景 客户反馈设备插小网卡驻网并加载qmi_wwan驱动后,使用多路拨号工具进行两路拨号,第一路无法获取IPv6地址,但是插现网卡测试是没有问题的。具体测试方法如下图: Check后只有第二路有PDN驻网请求,如下图,建议排查QMI拨号工具 分析流程 首先根据客户提供的方法对问…

day6_redis学习

文章目录关注和取关查看其他用户界面及共同关注关注推送关注和取关 因为关注用户的时候可能涉及到共同关注的对象&#xff0c;所以需要利用到交集&#xff0c;而在Redis中可以使用交集的&#xff0c;是Set以及ZSet数据结构&#xff0c;但是显然这里并不需要排序&#xff0c;所…