主要内容

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

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

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

导入规划路径的样例映射

负载exampleMaps.mat

导入的地图是:simpleMapcomplexMap而且ternaryMap

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

使用导入的simpleMap方法构造占用网格表示binaryOccupancyMap对象。将此地图的分辨率设置为每米2个单元格。

map = binaryoccuancymap (simpleMap,2);

控件显示地图显示函数在binaryOccupancyMap对象

显示(图)

图中包含一个轴对象。标题为Binary Occupancy Grid的axis对象包含一个image类型的对象。

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

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

这里机器人的尺寸可以假设为半径为0.2米的圆。属性按此维度对映射进行膨胀膨胀函数。

robotRadius = 0.2;

如前所述,PRM不考虑机器人的尺寸,因此提供到PRM的膨胀映射考虑了机器人的尺寸。属性之前创建映射的副本膨胀函数保存原始地图。

mapinflation = copy(map);充气(mapInflated robotRadius);

显示膨胀地图

显示(mapInflated)

图中包含一个轴对象。标题为Binary Occupancy Grid的axis对象包含一个image类型的对象。

构造PRM并设置参数

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

prm = mobileRobotPRM;

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

人口、难民和移民事务局。Map = 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个单元格)

map = binaryoccuancymap (complexMap,1);

显示地图。

显示(图)

图中包含一个轴对象。标题为Binary Occupancy Grid的axis对象包含一个image类型的对象。

根据机器人尺寸膨胀地图

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

mapinflation = copy(map);充气(mapInflated robotRadius);

显示膨胀地图。

显示(mapInflated)

图中包含一个轴对象。标题为Binary Occupancy Grid的axis对象包含一个image类型的对象。

关联现有PRM对象和新建映射并设置参数

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

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

设置NumNodesConnectionDistance属性。

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

显示PRM图形。

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

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

在已构造的PRM上寻找可行路径

在地图上定义起点和终点位置,以找到一条无障碍的路径。

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

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

path = findpath(prm, startLocation, endLocation);

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

isempty(路径)%未找到可行路径,增加节点数人口、难民和移民事务局。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 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

显示PRM解决方案。

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

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