此示例演示如何使用概率路线图(PRM)路径规划器计算给定地图上两个位置之间的无障碍路径。PRM路径规划器使用自由空间中随机抽样的节点,并将它们彼此连接起来,在给定映射的自由空间中构建路线图。一旦路线图构建好了,您就可以在地图上查询从给定的起始位置到给定的结束位置的路径。
在这个例子中,地图被表示为使用输入的数据的占用栅格地图。当在图中的自由空间采样节点,PRM使用该二进制占用网格表示推断的自由空间。此外,当计算在地图上的障碍物自由路径PRM不考虑机器人尺寸。因此,你应该通过充气机器人的尺寸图,为了让计及机器人的大小,并确保避免碰撞的实际机器人障碍自由路径的计算。定义开始和地图的PRM路径规划的结束位置找到一个无障碍物路径。
加载exampleMaps.mat
导入的地图有:simpleMap
,complexMap
和ternaryMap
。
谁是*地图*
名字大小字节类属性complexMap 41x52 2132逻辑emptyMap 26x27 702逻辑simpleMap 26x27 702逻辑ternaryMap 501x501 2008008双
使用进口simpleMap
数据以及使用该构建的占用网格表示binaryOccupancyMap
对象。将此地图的分辨率设置为每米2个单元格。
MAP = binaryOccupancyMap(simpleMap,2);
使用显示在地图表演
功能上的binaryOccupancyMap
宾语
显示地图)
为了确保机器人不与任何障碍物发生碰撞,你应该把它提供给PRM路径规划之前充气机器人的尺寸的地图。
这里机器人的尺寸可以被假定为具有0.2米半径的圆。然后,您可以通过此维度使用膨胀地图膨胀
功能。
robotRadius = 0.2;
如前所述,PRM不占机器人的尺寸,并因此提供一种充气位置图PRM考虑到机器人尺寸。使用之前创建的副本地图膨胀
功能保留原始地图。
mapInflated = (map)复印件;充气(mapInflated robotRadius);
显示地图膨胀
显示(mapInflated)
现在,你需要定义一个路径规划。创建一个mobileRobotPRM
对象并定义关联的属性。
PRM = mobileRobotPRM;
将膨胀的映射分配给PRM对象
prm.Map = mapInflated;
定义在PRM构建期间使用的PRM节点的数量。PRM使用给定地图上给定数量的节点构建路线图。根据输入映射的维数和复杂性,这是需要调优的主要属性之一,以便在映射上的两个点之间获得解决方案。大量的节点创建了一个密集的路线图,并增加了找到路径的可能性。然而,拥有更多的节点会增加创建路线图和寻找解决方案的计算时间。
人口、难民和移民事务局。NumNodes = 50;
定义地图上两个连接节点之间的最大允许距离。PRM连接地图上由这个距离(或更小)分隔的所有节点。这是在较大和/或复杂的输入映射情况下需要调优的另一个属性。较大的连接距离会增加节点之间的连接性,从而更容易找到路径,但是会增加路线图创建的计算时间。
人口、难民和移民事务局。ConnectionDistance = 5;
地图的路径规划上使用定义的开始和结束位置。
startLocation = [2 1];EndLocation所= [12 10];
方法在开始和结束位置之间搜索路径findpath
功能。该解决方案是一组从开始位置到结束位置的路径点。注意,路径
会因PRM算法的概率性而有所不同。
路径= 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 = binaryOccupancyMap(complexMap,1);
显示地图。
显示地图)
复制和膨胀地图,以考虑机器人的大小,以避障
mapInflated = (map)复印件;膨胀(mapInflated,robotRadius);
显示地图膨胀。
显示(mapInflated)
使用新膨胀的映射更新PRM对象并定义其他属性。
prm.Map = mapInflated;
设置NumNodes
和ConnectionDistance
属性。
人口、难民和移民事务局。NumNodes = 20;人口、难民和移民事务局。ConnectionDistance = 15;
显示PRM图。
显示(人口、难民和移民事务局)
在地图上定义起点和终点位置,以找到一条没有障碍物的路径。
startLocation = [3 3〕;EndLocation所= [45 35];
搜索开始和结束位置之间的解决方案。对于复杂的地图,可能不存在对于给定数目的节点(返回一个空路径)的可行路径。
路径= findpath(PRM,startLocation,EndLocation组件);
既然你正在规划一个大型而复杂的地图上的路径,可能需要更大的节点数量。然而,往往是不明确的许多节点将如何就足够了。调整节点的数量,以确保有开始和结束位置之间的可行路径。
而的isEmpty(路径)%未找到可行路径,增加节点数prm.NumNodes = prm.NumNodes + 10;使用|更新|功能重新创建更改后的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⋮
人口、难民和移民事务局显示的解决方案。
显示(人口、难民和移民事务局)