我正在使用一个机器人进行一个项目,该机器人必须找到通往某个物体的路径,并避免在必须拾取该物体时遇到一些障碍。

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

我试图为障碍添加一些其他不可步行的字段,但是效果并不总是很好。它仍然会与障碍物碰撞,还会在不允许行走的地方添加过多的点,从而导致它无法继续前进。

您对如何解决此问题有任何建议吗?

编辑:

因此,我按照贾斯汀·L(Justin L)的建议,通过在障碍周围增加了很多成本来解决以下问题:
Grid with no path http://sogaard.us/uploades/1_grid_no_path.png

在这里,您可以看到障碍物周围的成本,最初,中间的两个障碍物应该看起来像拐角处的障碍物,但是运行我们的探路者之后,成本似乎已被覆盖:

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

最佳答案

您是否考虑过为物体附近的像素增加渐变成本?

也许和线性渐变一样简单:

C = -mx + b

其中x是到最近对象的距离,b是边界外的成本,m是成本消失的速率。当然,如果C为负,则应将其设置为0。

也许是简单的双曲线衰变
C = b/x

再次,b是边界之外的期望成本。到达某个低点时将其截止值设为0。

或者,您可以使用指数衰减
C = k e^(-hx)

其中k是缩放常数,h是衰减率。再次,截止是很聪明的。

第二个建议

我从未将A *应用于像素映射的 map ;几乎总是瓷砖。

您可以尝试大幅降低瓷砖的“分辨率”吗?也许每10×10或20×20的像素集只有1个图块;区块的成本是区块中像素的最高成本。

另外,您可以尝试对A *使用的最短距离启发式方法进行贬值。

关于c# - A *探路者障碍物碰撞问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3069010/

10-09 06:59
查看更多