访问未知障碍的网格上每个可访问空间的有效方法是什么?


13

我正在尝试使用探索在相当粗糙的2D网格空间中创建障碍物的地图。我通过尝试从一个空间移动到相邻空间来检测障碍物,如果失败,则目标空间中会存在障碍物(此问题中没有测距传感器的概念)。

示例网格http://www.eriding.net/resources/general/prim_frmwrks/images/asses/asses_y3_5d_3.gif(例如)

当所有可到达的正方形都已被访问时,该过程完成。换句话说,即使某些空间没有障碍物(因为它们被包围),它们也可能是完全无法到达的。这是预期的。

在最简单的情况下,我可以使用DFS算法,但是我担心这将花费很长时间才能完成-机器人将花更多的时间回溯而不是探索新领域。我希望这在尝试到达无法到达的正方形时尤其成问题,因为机器人将耗尽所有选择。

在更复杂的方法中,正确的方法似乎是Boustrophedon细胞分解
梭菌细胞分解

但是,我似乎找不到关于Boustrophedon细胞分解算法的完整描述(即,简单的完整描述)。还有像资源这一块或在垂直细胞分解更一般的一个,但他们没有提供多少洞察高级算法,也没有涉及到的低级别的数据结构。

如何有效访问(映射)此网格?如果存在,我希望有一种算法在网格平方总数方面比更好(对于网格,它比好)。O(n2)O(n4)nn


非常有趣的问题。为了清楚起见,您是否将“有效”定义为对任何给定单元的最少重复访问?
DaemonMaker

那可能是表达它的一种方式。确实,我正在尝试避免使用相对于网格平方总数为或更差的算法。O(n2)
2013年

我猜这与CNC加工软件所面临的问题类似,该软件必须通过使用切削工具访问材料来去除材料。
Rocketmagnet

@Rocketmagnet:不太清楚,因为CNC机器先验地知道了“障碍” ,而我在移动时正在检测它们。
2013年

是的,这是对机器人知道其位置的有限环境的在线搜索。障碍的数量,位置和形状是完全未知的-它们可能不是凸形的。
2013年

Answers:


11

Boustrophedon细胞分解仅是将环境细分为可以由牛齿path路径有效覆盖的区域。可以进行梯形分解,并且可以使用行扫描算法来完成。参见[Choset 2000],该网站 ,或(我建议!)马克·德·伯格等人的著作《计算几何学》(Computational Geometry)。等,以完整描述所需的数据结构和算法。

乔塞特,豪伊。“已知空间的覆盖范围:Boustrophedon细胞分解” 自动机器人,2000年。


例如,将一组障碍视为边缘和顶点。假设环境也受到特殊多边形的限制。我们有类似以下内容。为了分解该空间,我们只需在每个顶点和最近的线或顶点之间添加垂直边。

要在代码中完成此操作,您只需要一个线段相交测试,一个排序的边列表和一个排序的顶点列表。

  1. 从每个顶点以从左到右的顺序,vi
  2. 在每个处创建一条垂直线,一直延伸到与之相交的第一条边或顶点livi
  3. 在每个相交处,创建一个新顶点。

完成此操作后,一组新的边和顶点将仅包含梯形。但我要强调,您不能在线进行此操作(没有事先了解障碍的情况)。如果您想在没有先验知识的情况下进行可靠的覆盖,则可以查看“错误算法”。特别是,这是一个简单的算法,假设环境是有界的。


  1. 从开始位置向上和向左移动,直到到达环境的左上角。如果您首先遇到障碍,则必须绕过障碍。您知道如果可以绕过某些物体(颠簸和移动),则它是一个障碍。

  2. 从左上角向右移动,直到遇到边界。然后向下移动并向左移动(我们正在对整个空间进行牛头怪)。

  3. 当您在左右线上遇到障碍物时,有两种选择。(i)我们可以绕行直到到达我们要覆盖的左右线,然后继续。(ii),我们可以转身并覆盖一条新的左右线,直到我们越过障碍物或再次陷入这种情况。我会说明。

在左侧,我们绕过障碍物,直到可以返回到我们试图遵循的“线”。在右侧,我们继续覆盖障碍物一侧的(较小)区域。

第一种方法的优点是,在决定如何绕过障碍物之前,您始终会先将障碍物完全标出,从而可以走更短的路。第二种方法的优点是您完全不必绕开障碍,您可以继续覆盖您所在的区域。

请注意,这以在线方式定义了牛牙根分解:您覆盖了障碍物之间或障碍物与边界之间的区域。

但是,据我所知,第一种方法更易于分析。选择更复杂的算法(例如BFS等),是因为环境不受限制(您不想永远花时间寻找边界),或者在基本上划分环境的方式中存在着非常讨厌的障碍。为什么这样不好?看这个例子:

移动左右,然后盘旋每个障碍产生的方式各障碍物之间的小零件太多的封面。实际上,如果没有全局路径规划,则可以通过将这些列设置为1 px宽,与整个环境一样高且相隔1 px来使它与网格的分辨率一样糟糕。然后,每次碰到障碍物时,您都必须绕过障碍物。

这就是为什么我问您是否对环境的位置有所了解或可以进行全局路径规划的原因。但是,在线离线讨论以及针对此的最佳算法并不是您真正想要的。


更新:我必须删除图像(而不是https),并将其发布出来,这在实际的实际应用程序中经常使用。http://www.cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/yamauchi_frontiers.pdf


仅找到Boustrophedon分解算法的描述(简单而言)就足够了。失败的话,对具有类似性能的算法进行简单描述就可以了。
2013年

我添加了一个简单的牛磺草分解示例。
乔什·范德·胡克

3

最后,我发现执行此操作的最佳方法是采用一个非常简单的概念:Flood Fill。我使用基于堆栈的迭代方法而不是递归选项,并通过使用A *搜索来查找从当前位置到堆栈中下一个位置的路径来修改它的物理空间(仅使用那些已经存在的网格正方形)被访问过,因为我保证它们之间会有一条路径)。

效率似乎相当合理。


像我一样,你已经发现基于前沿探索cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/...,它确实效果很好
smirkingman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.