路径规划在环境中不同的复杂性
这个案例展示了如何计算地图上一个给定的两个地点之间的无障碍路径使用概率路线图(人口、难民和移民事务局)路径规划。人口、难民和移民事务局路径规划构造一个路线图的自由空间中给定的地图使用自由空间中随机采样节点,并把它们互相连接起来。一旦路线图,你可以从一个给定的查询路径开始位置到给定的结束位置在地图上。
在这个例子中,地图表示为一个占用网格地图使用进口数据。当采样节点的空闲空间地图,人口、难民和移民事务局使用这个二进制占用网格表示推断自由空间。此外,人口、难民和移民事务局没有考虑机器人维度而计算地图上的一个无障碍路径。因此,你应该增加机器人的尺寸的地图,为了使计算的无障碍路径占机器人的大小,确保实际机器人避碰。定义的开始和结束位置在地图上找到一个无障碍的人口、难民和移民事务局路径规划路径。
导入示例地图进行路径的规划
负载exampleMaps.mat
导入的地图:simpleMap
,complexMap
和ternaryMap
。
谁*地图*
类属性名称大小字节complexMap 41 x52 2132逻辑emptyMap 26 x27 702逻辑simpleMap 26 x27 702逻辑ternaryMap 501 x501 2008008双
使用进口simpleMap
使用数据和构建一个占用网格表示binaryOccupancyMap
对象。将分辨率设置为2细胞每米这个地图。
地图= binaryOccupancyMap (simpleMap 2);
显示地图使用显示
功能上的binaryOccupancyMap
对象
显示(图)
定义机器人地图维度和膨胀
保证机器人不会撞上任何障碍,你应该增加机器人的地图的维度之前提供人口、难民和移民事务局路径规划。
机器人的尺寸可以被认为是一个圆半径为0.2米。然后您可以夸大这一维度使用的地图膨胀
函数。
robotRadius = 0.2;
如前所述,人口、难民和移民事务局不考虑机器人的尺寸,因此提供一个膨胀映射到人口、难民和移民事务局考虑机器人维度。使用之前创建的副本地图膨胀
函数保存原来的地图。
mapInflated = (map)复印件;充气(mapInflated robotRadius);
显示的地图
显示(mapInflated)
构建人口、难民和移民事务局和设置参数
现在,您需要定义一个路径规划。创建一个mobileRobotPRM
对象和定义相关属性。
人口、难民和移民事务局= mobileRobotPRM;
人口、难民和移民事务局对象分配的地图
人口、难民和移民事务局。地图= mapInflated;
定义使用的人口、难民和移民事务局节点数量在人口、难民和移民事务局建设。人口、难民和移民事务局构造一个路线图上使用给定的节点数量给定的地图。尺寸和复杂性的基础上输入地图,这是其中一个主要属性调整为了得到一个解决方案在地图上两点之间。大量的节点创建一个密集的路线图和增加找到一条路径的概率。然而,有更多的节点增加了计算时间创建路线图和找到一个解决方案。
人口、难民和移民事务局。NumNodes = 50;
定义两个连接节点之间的最大允许距离在地图上。人口、难民和移民事务局连接所有节点被这个距离在地图上(或更少)。这是另一个属性调整的更大的和/或复杂的输入地图。大连接距离增加了连接节点之间找到一条更容易,但是会增加计算时间的路线图。
人口、难民和移民事务局。ConnectionDistance = 5;
找到一个可行的路径构造的人口、难民和移民事务局
在地图上定义的开始和结束位置的路径规划使用。
startLocation = 1 [2];endLocation = 12 [10];
搜索路径之间的开始和结束位置使用findpath
函数。解决方案是一套锚点从开始位置到结束位置。请注意,路径
将不同的人口、难民和移民事务局算法由于概率特性。
路径= findpath(人口、难民和移民事务局、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
显示人口、难民和移民事务局的解决方案。
显示(人口、难民和移民事务局)
使用人口、难民和移民事务局在一个大而复杂的地图
使用进口complexMap
数据,这也代表着一个庞大而复杂的平面图,并构造一个二进制占用网格表示与给定分辨率(1细胞每米)
地图= binaryOccupancyMap (complexMap, 1);
显示地图。
显示(图)
基于机器人尺寸膨胀的地图
地图复制和膨胀因素机器人避障的大小
mapInflated = (map)复印件;充气(mapInflated robotRadius);
显示的地图。
显示(mapInflated)
将现有的人口、难民和移民事务局对象与新地图和设置参数
人口、难民和移民事务局对象更新与新膨胀的地图和定义其他属性。
人口、难民和移民事务局。地图= mapInflated;
设置NumNodes
和ConnectionDistance
属性。
人口、难民和移民事务局。NumNodes = 20;人口、难民和移民事务局。ConnectionDistance = 15;
人口、难民和移民事务局图显示。
显示(人口、难民和移民事务局)
找到一个可行的路径构造的人口、难民和移民事务局
定义的开始和结束位置在地图上找到一个无障碍路径。
startLocation = 3 [3];endLocation = 35 [45];
开始和结束位置之间寻找一个解决方案。对于复杂的地图,可能没有一个可行的路径对于一个给定的节点数量(返回一个空路径)。
路径= findpath(人口、难民和移民事务局、startLocation endLocation);
因为你正在计划一个大型和复杂的地图路径,可能需要更多的节点。然而,往往还不清楚有多少个节点就足够了。调整节点的数量,以确保有一个开始和结束位置之间的可行路径。
而isempty(路径)%没有可行的路径发现,增加节点的数量人口、难民和移民事务局。NumNodes =人口、难民和移民事务局。NumNodes + 10;%使用| |更新函数来重建与改变了人口、难民和移民事务局路线图%属性更新(人口、难民和移民事务局);%与更新的人口、难民和移民事务局寻找一个可行的路径路径= findpath(人口、难民和移民事务局、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⋮
人口、难民和移民事务局显示的解决方案。
显示(人口、难民和移民事务局)