我正在研究使用覆盆子pi和LIDAR 2D扫描仪定位RC汽车的研究项目。基本上,汽车将通过扫描仪穿过该地点以获得该地点的2D表示,然后它将返回到起点。之后,您将能够选择一个点,并在其中找到一条路径。因为我几乎是编程的先驱,所以在1个月内几乎不可能做到这一点,但我会尽我所能:)我现在想知道的是我应该使用哪种寻路算法?由于2D位置的分辨率大约为5000 x 5000“像素”,代表以厘米为单位的地方,我相信我需要相当高效的一个。是否有任何特定的算法可以在覆盆子pi上快速工作,几乎可以立即完成这项工作?如果有,是否有任何有效的实施?
其他一些信息: 我正在使用“Pixel”2D数组,其中值表示:
EMPTY_SPACE = 0
FILLED_SPACE = 1
START_POINT = 2
END_POINT = 3
PROCESSING = 4
PROCESSED = 5
VISUAL_ASSISTANCE_POINTS = 6
此外,他们还有第二个可选参数,这意味着距离终点的距离,因为我发现了路径寻找所必需的。
你可能会发现这是一个骗局:Pathfinding in 2D Arrays,但由于我正在寻找更具体的答案,我并没有找到解决所有问题的方法。
编辑:
我发现this代码实现了A *算法,但我觉得它很慢......有没有办法加速它?我使用下面相关的图像进行测试,大约需要80分钟才能解决。
答案 0 :(得分:4)
A* pathfinding是您最好的赌注之一。它广泛用于需要在2D网格中找到A和B之间的路径的游戏中。它使用启发式方法来识别有利节点(如果需要,可以将它们称为像素),从而获得良好的性能(尽管取决于您选择启发式函数的程度)。与任何特定/大量优化的算法相比,该实现很容易。此外,还有各种可用的实现方式。
关于"几乎立刻"速度,我怀疑你可以单独使用算法。如果需要此类性能,则需要应用特定于域的修改。一种解决方案可能是预先计算某些路径。这些路径可以表示单个节点到每个其他节点的完整映射(在您使用5000x5000网格的情况下,这是不切实际的)。或者,预先计算的路径可以将网格中的节点块视为单个节点,即,从区域x,y在0..10,0..10中将任何移动到区域x,y在10..20,0中。 .10使用单个预先计算的路径。这可能不会给你最好的路径,但肯定会更快。与计算中的任何事物一样,总是在记忆和速度之间进行权衡。
值得澄清的是,"像素"在你的问题中指的是汽车的单个运动单元。可能是该区域为5000x5000,但汽车实际上一次占用50个像素。然后,您可以使用单个节点来表示50个像素,以加快计算速度并获得更精确的结果。