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