代码之家  ›  专栏  ›  技术社区  ›  Cheesebaron

探路者障碍物碰撞问题

  •  6
  • Cheesebaron  · 技术社区  · 16 年前

    我正在和一个机器人合作一个项目,这个机器人必须找到它去一个物体的路,并且在去那个物体时要避开一些障碍物。

    问题在于机器人和机器人需要拾取的对象在探路者中都是一个像素宽。实际上,它们要大得多。通常,A*探路者会选择沿着障碍物的边缘放置路线,有时会使路线与障碍物发生碰撞,而我们不希望这样做。

    我曾尝试在障碍物上添加一些不可行走的区域,但效果并不总是很好。它仍然与障碍物相撞,并且在不允许它行走的地方添加了太多的点,导致它无法在上面运行。

    你对这个问题有什么建议吗?

    编辑:

    所以我按照Justin L的建议做了,增加了大量的成本,绕过了导致folling的障碍: Grid with no path http://sogaard.us/uploades/1_grid_no_path.png

    在这里您可以看到障碍物周围的成本,最初中间的两个障碍物看起来应该和角落里的一样,但是在运行我们的pathfinder之后,成本似乎被忽略了:

    Grid with path http://sogaard.us/uploades/1_map_grid.png

    Picture that shows things found on the picture http://sogaard.us/uploades/2_complete_map.png

    上图显示了在图片上发现的东西。

    Path found http://sogaard.us/uploades/3_path.png

    The grid from before with the path on http://sogaard.us/uploades/4_mg_path.png

    另一张有成本地图的照片,上面有路径。

    所以我觉得奇怪的是,为什么A*pathfinder会超过这些领域的成本,这些成本非常高。

    当它用当前字段计算开放列表中的节点时,是否会看到当前字段路径是否比开放列表中的路径短?

    下面是我为探路者使用的代码:

    探路者.cs: http://pastebin.org/343774

    Field.cs和Grid.cs: http://pastebin.org/343775

    3 回复  |  直到 16 年前
        1
  •  3
  •   Justin L.    16 年前

    也许一个简单的线性梯度:

    C = -mx + b
    

    其中x是到最近物体的距离,b是边界外的成本,m是成本消失的速率。当然,如果C是负数,它应该设置为0。

    可能是一个简单的双曲衰减

    C = b/x
    

    或者,可以使用指数衰减

    C = k e^(-hx)
    


    我从未将*应用于像素贴图;几乎总是瓷砖。

    你可以尝试大幅度降低你瓷砖的“分辨率”吗?可能每十乘十或二十乘二十像素集有一块瓷砖;瓷砖的成本是瓷砖中像素的最高成本。

    此外,您还可以尝试对用于*的最短距离启发式进行反评估。

        2
  •  3
  •   Saulius Žemaitaitis    16 年前

        3
  •  2
  •   Glorfindel Doug L.    6 年前

    我做过一个这样的机器人。我的解决办法是,只要有左转和右转要做,就向后退一步。

    alt text

    红线是我理解你的问题。黑线是我解决问题的方法。机器人可以直接向后移动一步,然后右转。