可以处理任何Heigth和占用网格的宽度?是的
可以指定多个目标节点?是的。
快速高效?是的。
可以指定与其他节点的连接距离?是(换句话说,算法没有恢复为8个方向)
实际探测器脚本中没有嵌套函数,子功能,绘图仪或任何其他混乱。
算法有简单的输入:占用网格。一个目标矩阵,起始节点和首选连接距离。
这个zip文件包含了一个关于脚本使用的示例。
请参阅更多信息的链接GitHub页面。
------------------------------------------------------------------------------
这段代码是为一个项目编写的,我撰写了关于:
http://proceings.asmedigitalCollection.asme.org/proceeding.aspx?articleid=2655682
本文提供了关于代码的更多详细信息,以及如何在实际示例中应用它。如果您使用代码进行学术工作/出版,如果您能引用上述纸张,我将欣赏。
可能很快就会发生更新,其中包括3D Pathfinding。如果你喜欢这个代码,请给它一个积极的评级。
einar ueland(2021)。Astar-Algorithm(https://github.com/einarueland/astar-algorithm),github。检索到。
谢谢你这么多帮我很多,我想加入你的代码是3D地图,我在想使用ROS创建地图,是可以这样做吗?注意安全
@Manoela Pizyblski
最简单的是预处理您的地图。如果P是您的安全距离,则应考虑在距离P内的所有自由单元格。
@Domi;。基本上,靠近物体的细胞成本应该更高。(我使用单元成本w=1+5 /(0.1+d),其中d是到对象的距离)。在该算法中,单元代价乘以横截面在单元上的欧氏距离。
这在发布的版本中还没有实现。稍后我将把它包含在GitHub项目中。
嗨einar,
我想知道是否有任何参数,有助于我在计算的路线和障碍物之间设置最小距离(例如,汽车宽度)。
提前致谢。
工作良好,代码清晰易懂!完美的学生接触到matlab中的寻径算法。
1个问题剩下:如何集成加权,所以路径变得更加顺畅,并且路径不会直接触摸对象?
@osmandumbuya.
似乎可行,但您可能需要重新映射您的参数。使用阈值应映射到0或1的概率饱和度。
由于它与代码直接相关,我认为我不认为我可以帮助您进一步帮助您。
我正在使用的MAP是在ROS中使用GMAPING的PGM文件生成的。我已经设法获取使用机器人的地图生成的地图.CupancyGrid函数在Matlab中生成的地图。我的问题是我似乎无法在代码中使用这些属性,因为您手动创建了地图。这是什么工作吗?如果我没有任何意义,我很抱歉。
占用属性:
占领赫尔德:0.6500
FreeThreshold: 0.2000
ProbabilitySaturation (0.0010 - 0.9990):
网格化:[181 181]
解决方案:20
Xworldlimits:[0 9.0500]
YWorldLimits: 9.0500 [0]
GridLocationInworld:[0 0]
@osmandumbuya.
我不确定你的意思。可以根据您的喜象设置大小,并在示例文件的第一行中定义
嗨einar,
我是一名本科生,目前正在使用您的代码来实现从ROS中的GMaping获得的占用网格映射的A-Star算法。我是Matlab和ROS的新手,刚刚遵循Mathworks的占用网格中提供的教程。
我的问题是:如何获取占用网格图的高度和宽度,以便在您提供的示例中使用?我可以发送给你的m文件,我到目前为止,但不知道如何去做这?
@giuseppe.
1-在这个循环中,我们在网格中找到每个单元格的启发式,一次。所以mat = [dx,dy]是x和y方向上的目标单元的距离,repmat只是重复电流坐标,这样我们就可以同时比较所有守门器(如果有多个目标单元格)。在下一行中,我们使用它来找到欧几里德距离,在那里“min”确保我们使用与启发式最接近的目标的距离。
2 - 这是一种杂乱的方法来检查我们要从当前节点达到要展开的节点。通过检查交叉的每个节点不是闭孔来实现。k的循环应该确保我们检查需要清除的所有节点。
由于这是重复很多的东西,因此需要更有效的方法来检查这将只是为了在表中设置所有潜在的情况,该潜在的情况会输出要清除所需的节点。我可能会在未来的更新中包含此功能,我计划包含大量的新功能(3D,加权节点成本,预处理以增加搜索效率,。等)。但是,我似乎从未获得了完成和上传此更新的灵感/时间)。
嗨einar,
我是一名硕士学位学生,他们使用代码来实现路径文件算法,但我不明白几行:
- Mat = RegisteredGoals-(repmat([uint16(j) uint16(k)],(Nodesfound),1));
跳跃单元的使用和为什么我们有XPOS和YPOS的公式(你是怎么得到这个公式的)
if(abs(i)> 1 || abs(j)> 1);
%需要检查路径是否未通过对象
jumpcells = 2 * max(abs(i),abs(j)) - 1;
K = 1: JumpCells
YPOS = ROUNG(K * I / JUMPCELLS);
XPOS =圆形(k * j / jumpcells);
你介意向我解释这两件事吗?
Couse我会在我的论文中引用你。
惊人的!!
它帮助我了!
@疯子。嗨,使用内置的功能打印地图,具有简单的输入,因此我并不确定问题可能在哪里。检查您的ImpueC( - )的输入是您期望的输入。虽然不应有必要,但您也可能考虑检查轴(XLIM和YLIM)是否根据地图的大小设置。如果您愿意发给我代码,我可以快速看出我是否找到问题。
你好!我加载了一个图像映射,在将其转换为二进制后,我设置了一个起点和一个目标点。代码成功地找到正确的路径并将其打印到映射中,但是输出图像映射缺少与输入图像进行比较的部分。你知道问题出在哪里吗?
@Norris。它基本上只是定义了一个网格,在规划期间,定义了代码将调查当前单元格的成本。连接距离与网格的大小有关。它的编码非常简单。尝试设置showneighbors =1(我认为是第91行),我已经包含了一些数字,可以帮助您理解它。
您好,埃林卫狮。
Coudl您可以解释一下为什么变量“连接距离”能够更改搜索方向的数量?
嗨Einar Ueland,
你的代码包含了非常好的解释。谢谢你的建议(1),我只是需要给不同的环节分配不同的成本。
如果你可以帮助我,请敲我:rimonece@gmail.com
@md。Munjure.
(1)。如果您只有一个目标节点,则只需在目标矩阵中设置多个开始位置,并将目标设置为起始位置。
(2)在此版本的上传(1.02)中不可能。我在我本地计算机上有一个此脚本的版本,其中一个人可以指定交叉每个节点的成本,并计划在将来的更新中包括它(在我发布之前需要一些清理)。
嗨Einar Ueland,谢谢你的代码。我有两个问题,
(1)如何使用多个源节点作为起始位置?
(2)如何将不同的成本值分配给不同的链接?
谢谢;如果有3D版本可用,请告诉我们。
@michael gauthier
(1)在寻找路径时,算法只跟踪到它所打开的每个单元格的一条路径。只有在搜索找到一个成本较低的路径时,才会更新到单个单元的路径。
如果发现一个新的路径与旧的路径与旧的成本相同,则该路径不会更新。
因此,这个算法总能找到一条最短路径。如果存在多个等优路径,则只存储和显示算法找到的第一个最优路径。
(2)嗨,遗憾的是不是。但是,我认为我可以很容易地将当前设置转移到3D。我可能很快就会调查它。
完美且易于使用。两个问题:
(1)如果有两条相同的最优路径,它们都被显示出来,或者是基于某种逻辑选择了一条而不是另一条,会发生什么?
(2)您是否有三维工作的版本?