此示例演示了如何使用概率路线图(PRM)路径规划器来计算给定地图上的两个位置之间的障碍路径。PRM Path Planner在给定地图的可用空间中使用可用空间中的随机采样节点构建路线图,并将其彼此连接。构造了路线图后,您可以从给定的起始位置查询到地图上给定的最终位置的路径。
在此示例中,地图表示为使用导入数据的占用网格映射。当在地图的可用空间中采样节点时,PRM使用此二进制占用网格表示来推导自由空间。此外,PRM在计算地图上计算无障碍路径时,PRM不会考虑机器人维度。因此,您应该通过机器人的尺寸来膨胀地图,以便允许计算用于机器人尺寸的无障碍路径,并确保实际机器人的碰撞避免。定义PRM Path Planner的地图上的开始和结束位置,以找到无障碍路径。
加载examplemapsmat.
导入的地图包括:simpleMap
那complexMap
和ternaryMap
。
谁是*地图*
名称大小字节类属性complexMap 41x52 2132 logical emptyMap 26x27 702 logical simpleMap 26x27 702 logical ternaryMap 501x501 2008008 double
使用导入simpleMap
数据和构造使用占用网格表示使用binaryoccupancymap.
对象。将此地图的分辨率设置为2格/米。
地图= Binaryoccupancap(SimpleMap,2);
使用该地图显示展示
功能上的binaryoccupancymap.
目的
显示地图)
为了确保机器人不与任何障碍物碰撞,您应该在为PRM路径规划器提供之前通过机器人的尺寸来膨胀地图。
这里可以假设机器人的尺寸是半径为0.2米的圆形。然后,您可以使用此维度来膨胀地图膨胀
功能。
robotRadius = 0.2;
如前所述,PRM不考虑机器人的尺寸,因此向PRM提供膨胀的地图考虑到机器人维度。使用前创建地图的副本膨胀
保存原始地图的功能。
mapInflated = (map)复印件;充气(mapInflated robotRadius);
显示膨胀地图
显示(mapInflated)
现在您需要定义路径规划器。创建一个mobileRobotPRM
对象并定义关联的属性。
PRM = Mobilerobotprm;
将膨胀的映射分配给PRM对象
人口、难民和移民事务局。地图= mapInflated;
定义在PRM构建期间使用的PRM节点的数量。PRM使用给定映射上的给定节点数量构造一个路线图。根据输入映射的维度和复杂性,这是要调优的主要属性之一,以便在映射上的两个点之间获得解决方案。大量的节点创建一个密集的路线图,增加了找到路径的概率。然而,节点越多,创建路线图和寻找解决方案的计算时间就越长。
人口、难民和移民事务局。NumNodes = 50;
定义地图上两个连接节点之间的最大允许距离。PRM连接地图上被这个距离(或更小)分隔的所有节点。这是在较大和/或复杂的输入映射情况下需要调优的另一个属性。较大的连接距离增加了节点之间的连通性,更容易找到路径,但会增加路线图创建的计算时间。
人口、难民和移民事务局。ConnectionDistance = 5;
定义用于使用路径规划器的地图上的开始和结束位置。
startLocation = [2 1];endlocation = [12 10];
属性查找起始位置和结束位置之间的路径FindPath.
功能。该解决方案是从起始位置到最终位置的一组航点。请注意小路
会因PRM算法的概率性质而有所不同。
path = findpath(prm, startLocation, endLocation)
路径=7×22.0000 1.0000 1.9569 1.0546 1.8369 2.3856 2.3856 3.2389 6.6106 7.6106 7.8260 8.1330 11.4632 10.5857 12.0000 10:0000
显示PRM解决方案。
显示(人口、难民和移民事务局)
使用导入complexMap
代表一个大型和复杂的楼层的数据,并用给定分辨率构建二进制占用网格表示(每米1个单元)
地图= Binaryoccupancemap(ComplexMap,1);
显示地图。
显示地图)
复制并膨胀地图,以考虑到机器人的大小,以避免障碍
mapInflated = (map)复印件;充气(Mapinflated,Robotradius);
显示膨胀地图。
显示(mapInflated)
使用新膨胀的映射更新PRM对象,并定义其他属性。
人口、难民和移民事务局。地图= mapInflated;
设定numnodes.
和ConnectionDistance
属性。
人口、难民和移民事务局。NumNodes = 20;人口、难民和移民事务局。ConnectionDistance = 15;
显示PRM图。
显示(人口、难民和移民事务局)
在地图上定义开始和结束位置以找到无障碍路径。
startlocation = [3 3];endlocation = [45 35];
搜索开始和结束位置之间的解决方案。对于复杂的地图,对于给定数量的节点可能没有可行的路径(返回空路径)。
path = findpath(prm,startlocation,endlocation);
由于您是在一个大型且复杂的映射上规划路径,因此可能需要更多的节点。然而,通常不清楚多少节点才足够。调整节点的数量,以确保在开始和结束位置之间有可行的路径。
而Isempty(路径)未找到可行路径,请增加节点数prm.numnodes = prm.numnodes + 10;%使用|update|函数重新创建更改后的PRM路线图%属性更新(人口、难民和移民事务局);%搜索更新的PRM的可行路径path = findpath(prm,startlocation,endlocation);结尾
显示路径。
小路
路径=12×23.0000 3.0000 4.2287 4.2628 7.7686 5.6520 6.8570 6.8570 8.8570 8.8570 8.493.193.1838 8.7614 31.3248 16.3874 41.3317 17.5090 48.3017 25.8527 49.4926 36.8804⋮
人口、难民和移民事务局显示的解决方案。
显示(人口、难民和移民事务局)