C# A*探路者障碍物碰撞问题

C# A*探路者障碍物碰撞问题,c#,a-star,pathfinder,C#,A Star,Pathfinder,我正在和一个机器人一起做一个项目,这个机器人必须找到通往物体的路,并且在到达它必须捡起的物体时避免一些障碍物 问题在于机器人和机器人需要拾取的对象在pathfinder中都有一个像素宽。实际上,它们要大得多。A*pathfinder通常选择沿障碍物边缘放置路线,有时会使路线与障碍物发生碰撞,这是我们不希望必须要做的 我曾尝试在障碍物上添加一些不可行走的区域,但效果并不总是很好。它仍然和障碍物相撞,并且在不允许它行走的地方添加了太多的点,导致它无法在上面运行 你对这个问题有什么建议吗 编辑: 所以

我正在和一个机器人一起做一个项目,这个机器人必须找到通往物体的路,并且在到达它必须捡起的物体时避免一些障碍物

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

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

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

编辑: 所以我按照Justin L的建议做了,在导致愚蠢的障碍周围增加了很多成本:

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

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

这是一条找到的道路,就像我们以前遇到的问题一样,它正面临着障碍

还有一张有成本地图的图片,上面有路径

所以我觉得奇怪的是为什么A*pathfinder会覆盖这些非常高的现场成本

当它使用当前字段评估打开列表中的节点以查看当前字段路径是否比打开列表中的路径短时,会发生这种情况吗

下面是我在pathfinder中使用的代码:

Pathfinder.cs:


Field.cs和Grid.cs:

我做过一个这样的物理机器人。我的解决方案是,每当需要左转和右转时,向后退一步


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

你考虑过给物体附近的像素增加渐变成本吗

也许有一个像线性渐变一样简单:

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

也许是一个简单的双曲衰减

C = b/x
其中,b是边界外的期望成本。一旦达到某个低点,将截止值设为0

或者,您可以使用指数衰减

C = k e^(-hx)
其中k是标度常数,h是衰减速率。同样,有一个截止线是聪明的


第二个建议

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

您可以尝试大幅降低瓷砖的“分辨率”吗?可能每10×10或20×20像素集有一块瓷砖;瓷砖的成本是瓷砖中像素的最高成本


此外,您还可以尝试对用于*

的最短距离启发式进行估值。您可以尝试在考虑机器人大小的情况下放大障碍物。您可以绕过障碍物的拐角来解决阻塞问题。然后填充的间隙太小,机器人无论如何都无法通过。

只是澄清一下,这是一个物理机器人吗?你有一个机器人所在物理场的地图,你想通过软件地图,让你的物理机器人以相同的方向在物理地图上移动?是的,没错,我们有一个摄像头挂在机器人上,然后,我们粘贴将图像转换为可唤醒和不可唤醒的映射的图像,然后将该映射连同开始和结束cordinate一起提供给我们的a*。目前,我们在障碍物周围添加ekstra none可行走区域,但速度非常慢。是的,正如杜姆斯通所说,我们在障碍物、物体和机器人所在场地上方的三脚架上悬挂了一个网络摄像头。我们拍下这个过程的照片,解析它,找到物体、障碍物和机器人,然后尝试从机器人到它必须拾取的物体的路径。因此,A*算法返回我们可以运行的每个像素,正如我所说,如果物体在机器人的另一侧,它通常会包围障碍物。你能详细说明一下吗,也许可以用一幅画?按照我的理解,这会导致走捷径,这不是一件好事。我们通过进行光线跟踪解决了这个问题,它为我们提供了一条更加平滑和干净的路径!很高兴你以更好的方式成功了增加了第二项建议;希望有帮助!:)我们在pathfinder中发现了一个问题,每次遇到新场地时,我们都会重新评估移动成本,但您的建议起了作用,通过对障碍物周围场地的评分非常高,现在似乎效果很好。比我的好。请不要再投票给我了:(这听起来是我最简单、最好的解决方案,比目前接受的答案中平滑增加的成本要好。这个答案比我的好。