主要内容

不同复杂度环境下的路径规划

这个例子演示了如何使用概率路线图(PRM)路径规划器计算给定地图上两个位置之间的无障碍路径。PRM路径规划器使用自由空间中随机抽样的节点在给定映射的自由空间中构建路线图,并将它们彼此连接起来。一旦构建了路线图,您就可以在地图上查询从给定起始位置到给定结束位置的路径。

在本例中,映射使用导入的数据表示为占用网格映射。当采样节点在一个地图的自由空间,PRM使用这种二进制占用网格表示推导自由空间。此外,PRM在计算地图上的无障碍路径时没有考虑机器人的尺寸。因此,您应该根据机器人的尺寸放大地图,以便计算考虑到机器人的尺寸并确保实际机器人避免碰撞的无障碍路径。在地图上为PRM路径规划器定义起始和结束位置,以找到无障碍的路径。

导入规划路径映射示例

负载exampleMaps.mat

导入的地图有:simpleMapcomplexMapternaryMap

*地图*
名称大小字节类属性complexMap 41x52 2132 logical emptyMap 26x27 702 logical simpleMap 26x27 702 logical ternaryMap 501x501 2008008 double

使用进口simpleMap数据并构造占用网格表示binaryOccupancyMap对象。将该地图的分辨率设置为每米2个单元格。

地图= binaryOccupancyMap (simpleMap 2);

控件显示地图显示功能上的binaryOccupancyMap对象

显示(图)

图中包含一个轴。标题为“二进制占用网格”的轴包含一个图像类型的对象。

定义机器人尺寸并膨胀地图

为了确保机器人不会与任何障碍物相撞,在将地图提供给PRM路径规划器之前,应该根据机器人的尺寸将地图膨胀。

这里可以假设机器人的尺寸是一个半径为0.2米的圆。然后,您可以使用膨胀函数。

robotRadius = 0.2;

如前所述,PRM不考虑机器人的尺寸,因此向PRM提供一个膨胀的映射会考虑机器人的尺寸。控件之前创建映射的副本膨胀功能来保存原始地图。

mapInflated = (map)复印件;充气(mapInflated robotRadius);

显示的地图

显示(mapInflated)

图中包含一个轴。标题为“二进制占用网格”的轴包含一个图像类型的对象。

构造PRM并设置参数

现在您需要定义一个路径规划器。创建一个mobileRobotPRM对象,并定义相关属性。

人口、难民和移民事务局= mobileRobotPRM;

将膨胀的映射分配给PRM对象

人口、难民和移民事务局。地图= mapInflated;

定义在PRM构建过程中使用的PRM节点数量。PRM使用给定映射上的给定节点数量构造路线图。根据输入映射的维度和复杂性,这是要优化的主要属性之一,以便获得映射上两点之间的解决方案。大量的节点创建了一个密集的路线图,增加了找到路径的概率。然而,拥有更多的节点会增加创建路线图和寻找解决方案的计算时间。

人口、难民和移民事务局。NumNodes = 50;

定义地图上两个连接节点之间允许的最大距离。PRM连接地图上所有以这个距离(或更短)分隔的节点。对于较大和/或复杂的输入映射,这是另一个要调优的属性。较大的连接距离增加了节点之间的连通性,从而更容易找到路径,但也增加了创建路径的计算时间。

人口、难民和移民事务局。ConnectionDistance = 5;

在构建的PRM上寻找可行路径

在地图上定义要使用的路径规划器的起始和结束位置。

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 3.2389 6.6106 7.8260 8.1330 11.4632 10.5857 12.0000 10.0000

显示PRM解决方案。

显示(人口、难民和移民事务局)

图中包含一个轴。以“概率路线图”为标题的坐标轴包含图像、线、散点4个对象。

使用PRM为一个大型和复杂的地图

使用进口complexMap数据,它代表了一个大而复杂的平面图,并以给定的分辨率(每米1个单元)构造了一个二进制占用网格表示。

地图= binaryOccupancyMap (complexMap, 1);

显示地图。

显示(图)

图中包含一个轴。标题为“二进制占用网格”的轴包含一个图像类型的对象。

基于机器人尺寸膨胀地图

复制并膨胀地图,以考虑机器人的大小,以避障

mapInflated = (map)复印件;充气(mapInflated robotRadius);

显示的地图。

显示(mapInflated)

图中包含一个轴。标题为“二进制占用网格”的轴包含一个图像类型的对象。

将现有的PRM对象与新的Map关联,并设置参数

使用新膨胀的映射更新PRM对象并定义其他属性。

人口、难民和移民事务局。地图= mapInflated;

设置NumNodesConnectionDistance属性。

人口、难民和移民事务局。NumNodes = 20;人口、难民和移民事务局。ConnectionDistance = 15;

人口、难民和移民事务局图显示。

显示(人口、难民和移民事务局)

图中包含一个轴。以“概率路线图”为标题的坐标轴包含图像、线、散点三种类型的物体。

在构建的PRM上寻找可行路径

在地图上定义开始和结束的位置,以找到一个无障碍的路径。

startLocation = [3 3];endLocation = [45 35];

在开始位置和结束位置之间寻找解决方案。对于复杂的映射,对于给定的节点数量可能没有可行的路径(返回一个空路径)。

path = findpath(prm, startLocation, endLocation);

由于您是在一个大而复杂的地图上规划路径,可能需要更多的节点。然而,通常不清楚多少节点就足够了。优化节点数量,以确保在起始位置和结束位置之间有一条可行的路径。

isempty(路径)%没有找到可行路径,增加节点数量人口、难民和移民事务局。NumNodes =人口、难民和移民事务局。NumNodes + 10;%使用|更新|功能重新创建更改后的PRM路线图%属性更新(人口、难民和移民事务局);%使用更新后的PRM搜索可行路径path = findpath(prm, startLocation, endLocation);结束

显示路径。

路径
路径=12×23.000 3.000 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⋮

人口、难民和移民事务局显示的解决方案。

显示(人口、难民和移民事务局)

图中包含一个轴。以“概率路线图”为标题的坐标轴包含图像、线、散点4个对象。