这里有一些关于D*的论文(链接在此),但它们对我来说数学内容有点深。是否有更适合初学者的D*/D* Lite信息?
这里有一些关于D*的论文(链接在此),但它们对我来说数学内容有点深。是否有更适合初学者的D*/D* Lite信息?
维基百科有关此主题的文章:http://en.wikipedia.org/wiki/D*
Sven Koenig的网页提供了一个用C编写的D* Lite实现:http://idm-lab.org/code/dstarlite.tar然而,我发现那些晦涩难懂的数学比C源代码容易阅读;-)
这里还提供了另一个D* Lite的实现(使用C++):http://code.google.com/p/dstarlite/
话虽如此,为什么不再添加一些论文呢,是的,它们也涉及到数学 :-) 但我会尽力获取更多更新的内容。随着时间的推移,人们通常会更擅长解释自己的工作,因此重点放在Stentz、Likhachev和Koenig身上。
如果伪代码对你来说很难(如果你知道标准算法,伪代码其实很简单)并且你抱怨发布的 C 和 C++ 代码,那么我想你需要去做一些其他的事情 :-)
认真点,不要指望有人能在几个网页段落里教你一个高级算法。拿起笔和纸,在纸上写、画和跟随发生的事情。你可能需要读两遍,并谷歌一两个参考资料来了解一些相关概念,根本不需要深入研究定理和证明——除非你希望证明作者是错的 :-))
没有更多的数学就不能继续往前走 —— 这就是生活。想象一下你让别人教你什么是矩阵求逆,但你不知道什么是向量。如果你不先学习足够的数学背景,没人能帮助你。
白话解释D* Lite算法
D* Lite从起点到终点之间采用一条理想的直线路径,没有考虑障碍物(通常通过移动到相邻节点来处理)。也就是说,D* Lite在沿着这条理想路径移动之前,对任何障碍物都没有了解。
任何路径规划算法的追求都是在获得最短路径或至少是一个合理路径(同时还要处理各种特殊情况——对于D* Lite而言,这就是处理未知地图,就像火星探测器一样)的同时保证其快速性。
D* Lite面临的其中一个主要挑战是在遇到障碍时便宜地适应它们。找到它们很容易——只需移动时检查相邻节点的状态即可。但是,在不遍历每个节点的情况下如何调整现有地图的成本估计呢?这可能非常耗费时间和资源。
LPA*使用巧妙的技巧来适应成本,这项技巧被D* Lite充分利用。当前节点会询问其邻居:“你们最了解我,你认为我对自己的实际情况评估准确吗?”具体而言,它询问自己的g值,即从初始节点到当前节点的已知花费。邻居们查看自己的g值,观察当前节点相对于它们的位置,然后给出他们认为应该是其代价的估计值。最小的提供值被设置为当前节点的rhs值,然后用于更新其g值。在估算成本时,邻居们考虑新发现的障碍物(或空闲空间),以便在使用rhs更新g值时将这些因素纳入考虑。
一旦我们在全局范围内获得了现实的g值,当然就会出现新的最短路径。
D*与D* Lite: 首先,D* Lite算法比D*算法简单得多,并且由于它始终至少与D*一样快,因此它已经完全取代了D*。因此,没有任何理由使用D*;请改用D* Lite。
D* Lite与A*: D* Lite算法的工作原理基本上是从目标开始反向运行A*搜索,试图返回起点。然后求解器输出当前解决方案并等待呈现给它的权重或障碍物发生某种变化。与重复的A*搜索不同,D* Lite算法避免了从头开始重新规划路径,并增量修复路径,使其修改局部地围绕机器人姿态。
如果您真的想了解该算法。我建议您首先阅读A*的伪代码并实现它。首先尝试掌握如何从堆队列中选择和插入,以及算法如何使用另一个启发式而不仅仅是常规Dijkstra算法,以及为什么这允许算法探索较少的顶点而不是Dijkstra。
一旦您感觉已经掌握了A*的工作方式(您也应该实现它),那么我建议您再次查看Koenig,2002。我建议您首先查看常规D*-Lite伪代码。确保您理解每行代码。
优先队列概念
实现
我已经在Python中实现了优化的D* Lite算法(请参见此处的线程)。我建议您将代码和伪代码并排放置并阅读。那里还有测试模拟的说明,如果您愿意可以尝试。
我得到了这个
http://idm-lab.org/bib/abstracts/papers/aaai02b.pdf 以及这个
http://www.cs.cmu.edu/~maxim/files/dlitemap_iros02.pdf
http://www.cs.cmu.edu/~maxim/files/dlite_icra02.pdf - D*算法的两个版本
http://www.cs.cmu.edu/~maxim/files/dlite_tro05.pdf - icra02版本的改进版
https://www.cs.cmu.edu/~maxim/files/rstar_aaai08.pdf - R*算法,采用随机化以减少计算成本
http://www.cs.cmu.edu/~maxim/files/rstar_proofs34.pdf - 修改后的 R* http://www.cs.unh.edu/~ruml/papers/f-biased-socs-12.pdf - 实时 R* + PLRTA*
我希望这些链接能够对您有所帮助 :)
编辑:发帖后,我注意到我给您的链接也出现在您指出的链接中。无论如何,我在谷歌上直接找到了它们。我稍微查阅了一下,它们似乎并不那么复杂。如果您很熟悉 A*,那么您也应该能够理解 D*。
从经验来看,A* 也可以用于您想要的目的。
Maxim Likhachev的CMU课堂笔记非常有启发性。它包含了如何传播图形上动态变化的示例。同时,还解释了“不一致”概念,这对于理解算法非常重要。 http://www.cs.cmu.edu/~maxim/classes/robotplanning_grad/lectures/execanytimeincsearch_16782_fall18.pdf