由于在许多情况下指定合适的目标位置可能很棘手,因此以下基于2D占用栅格图的方法可能值得考虑。通常将其称为“值迭代”,并与梯度下降/上升结合使用,它给出了一种简单且相当有效(取决于实现方式)的路径规划算法。由于其简单性,它在移动机器人技术中是众所周知的,特别是在室内环境中导航的“简单机器人”。如上所述,这种方法提供了一种寻找远离起始位置的路径的方法,而无需如下明确指定目标位置。请注意,可以选择指定目标位置(如果有)。而且,方法/算法构成了广度优先搜索,
在二进制情况下,2D占用网格图对于占用的网格单元是一个,而在其他位置为零。请注意,此占用率值也可以在[0,1]范围内连续,我将回到下面的值。给定的网格单元g i的值为V(g i)。
基本版本
- 假设网格单元g 0包含起始位置。设置V(g 0)= 0,并将g 0放入FIFO队列中。
- 从队列中取出下一个网格单元g i。
- 对于所有的邻居摹Ĵ的摹我:
- 如果g j没有被占用并且以前没有被访问过:
- V(g j)= V(g i)+1
- 将g j标记为已访问。
- 将g j添加到FIFO队列中。
- 如果尚未达到给定的距离阈值,则继续执行(2.),否则继续进行(5.)。
- 通过遵循从g 0开始的最陡峭的坡度上升来获得路径。
关于步骤4的注释
- 如上所述,步骤(4.)需要跟踪所覆盖的最大距离,为清楚/简洁起见,在上面的描述中已将其省略。
- 如果给出了目标位置,则在达到目标位置后立即停止迭代,即作为步骤(3.)的一部分进行处理/访问。
- 当然,当然也可以简单地处理整个网格图,即继续进行直到所有(免费)网格单元都已被处理/访问。限制因素显然是网格图的大小及其分辨率。
扩展和进一步的评论
更新方程V(g j)= V(g i)+1留有足够的空间通过缩小V(g j)来应用各种其他启发式方法或添加成分,以减少某些路径选项的值。大多数(如果不是全部)这样的修改可以很好地使用带有[0,1]的连续值的网格图进行一般地合并,这实际上构成了初始二进制网格图的预处理步骤。例如,沿着障碍物边界添加从1到0的过渡,会导致“角色”最好保持避开障碍物。可以例如通过模糊,加权膨胀或类似方式从二进制版本生成这种网格图。将威胁和敌人添加为具有较大模糊半径的障碍物,会对靠近这些障碍物的路径造成不利影响。也可以在整个网格图上使用扩散过程,如下所示:
V(g j)=(1 /(N + 1))×[V(g j)+ sum(V(g i))]
其中“ sum ”是指所有相邻网格单元的和。例如,代替创建二进制映射,初始(整数)值可以与威胁的大小成比例,并且障碍物表示“较小”的威胁。在应用扩散过程之后,应/必须将网格值缩放为[0,1],并将障碍,威胁和敌人所占据的像元设置/强制为1。否则,更新方程式的缩放可能不能按需工作。
此一般方案/方法有多种变体。障碍物等可能具有较小的值,而自由网格像元具有较大的值,这取决于目标,可能在最后一步需要进行梯度下降。无论如何,恕我直言,该方法出奇的通用性,易于实施且可能相当快(取决于网格图大小/分辨率)。最后,与许多未采用特定目标位置的路径规划算法一样,很明显有陷入死胡同的风险。在某种程度上,可能可以在最后一步之前应用专用的后处理步骤,以降低这种风险。
这是另一个带有Java脚本(?)插图的简短描述,尽管该插图不适用于我的浏览器:(
http://www.cs.ubc.ca/~poole/demos/mdp/vi.html
可以在下本书中找到有关计划的更多详细信息。在第2章第2.3.1节“最佳固定长度计划”中专门讨论了值迭代。
http://planning.cs.uiuc.edu/
希望对您有所帮助,德里克。