我正在开发一个带有机器人的项目,该机器人必须找到一个物体,并且在去往它必须拾取的物体时避免一些障碍物。
问题在于机器人和机器人需要拾取的物体在探路者中都是一个像素宽。实际上它们要大得多。通常A *探路者选择沿着障碍物的边缘放置路线,有时会使它与它们发生碰撞,我们不希望这样做。
我曾试图在障碍物上增加一些不可走路的田地,但并不总是很好。它仍然与障碍物碰撞,也增加了太多不允许行走的点,导致它没有可以运行的路径。
您对如何处理此问题有任何建议吗?
所以我按照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
答案 0 :(得分:3)
您是否考虑过向对象附近的像素添加渐变成本?
也许就像线性渐变一样简单:
C = -mx + b
其中x是距离最近物体的距离,b是边界外的成本权,m是成本消失的速率。当然,如果C为负数,则应将其设置为0.
也许是一个简单的双曲线衰变
C = b/x
其中b是边界外的理想成本。一旦达到某个低点,就截止到0。
或者,您可以使用指数衰减
C = k e^(-hx)
其中k是缩放常数,h是衰减速率。再次,切断是明智的。
第二个建议
我从未将A *应用于像素映射的地图;几乎总是,瓷砖。
您可以尝试大幅降低瓷砖的“分辨率”吗?也许每十个十或二十二个像素的一个瓦片;磁贴的成本是磁贴中像素的最高成本。
此外,您可以尝试对您用于A *的最短距离启发式进行降价。
答案 1 :(得分:3)
您可能会尝试将考虑机器人尺寸的障碍扩大。您可以围绕障碍物的角落来解决阻塞问题。然后填充的间隙太小,无论如何都不能让机器人挤过去。
答案 2 :(得分:2)
我做过一个这样的物理机器人。我的解决方案是在左右转弯时向后移动一步。
alt text http://www.freeimagehosting.net/uploads/bb41eb3ba5.png
红线是我理解你的问题。黑线是我为解决这个问题所做的。机器人可以向后直线移动一步,然后向右转。