主要内容

使用RRT规划移动机器人路径

这个例子展示了如何使用快速探索随机树(RRT)算法来规划通过已知地图的车辆路径。特殊的车辆约束也应用于自定义状态空间。您可以为任何导航应用程序使用自定义状态空间和路径验证对象来优化您自己的规划器。

负载入住率地图

载入一个小型办公空间的现有占用地图。在地图顶部绘制车辆的起始和目标姿态。

负载(“office_area_gridmap.mat”“occGrid”)显示(occGrid)设定开始和目标姿势起始= [-1.0,0.0,-pi];目标= [14,-2.25,0];显示机器人的起始位置和目标位置持有情节(开始(1),(2)开始,“罗”)情节(目标(1)、目标(2),“莫”%显示开始和目标标题r = 0.5;情节([开始(1)开始(1)+ r * cos(开始(3))],[开始(2),(2)+ r *罪(开始(3)),的r -)情节([目标(1),目标(1)+ r * cos(目标(3))],[目标(2)、目标(2)+ r *罪(目标(3))],“m -”)举行

定义状态空间

属性指定车辆的状态空间stateSpaceDubins对象并指定状态边界。该对象将抽样状态限制为在状态范围内操纵车辆的可行杜宾斯曲线。0.4米的转弯半径允许在这个小环境中进行紧密的转弯。

边界= [occGrid.XWorldLimits;occGrid.YWorldLimits;[-ππ]];党卫军= stateSpaceDubins(范围);ss.MinTurningRadius = 0.4;

计划的路径

为了规划一条路径,RRT算法在状态空间中抽样随机状态,并尝试连接一条路径。这些状态和连接需要根据映射约束进行验证或排除。车辆不能与地图上规定的障碍物相撞。

创建一个validatorOccupancyMap对象的指定状态空间。设置地图属性设置为occupancyMap对象。设置一个ValdiationDistance0.05 m。这个距离将离散路径连接并基于此检查地图中的障碍。

stateValidator = validatorOccupancyMap (ss);stateValidator。地图= occGrid;stateValidator。ValidationDistance = 0.05;

创建路径规划器,增加最大连接距离,以连接更多的状态。设置采样状态的最大迭代次数。

planner = plannerRRT(ss, stateValidator);计划。MaxConnectionDistance = 2.0;计划。MaxIterations = 30000;

自定义GoalReached函数。这个示例助手函数检查一个可行路径是否在设定的阈值内达到目标。函数返回真正的当目标已经达到,计划者就停止了。

计划。GoalReachedFcn = @exampleHelperCheckIfGoal;
函数isReached = exampleHelperCheckIfGoal(planner, goalState, newState) isReached = false;阈值= 0.1;如果planner.StateSpace。distance(newState, goalState) < threshold isReached = true;结束结束

在开始和目标之间规划路径。由于是随机抽样,这个例子设置了rng为一致的结果埋下种子。

rng (0,“旋风”) [pthObj, solnInfo] =计划(计划,开始,目标);

图的路径

出示入住地图。绘制搜索树solnInfo.插入并覆盖最终路径。

显示(occGrid)%搜索树情节(solnInfo.TreeData (: 1) solnInfo.TreeData (:, 2),“。”);%插入和绘制路径插入(pthObj 300)情节(pthObj.States (: 1), pthObj.States (:, 2),的r -“线宽”, 2)在网格地图中显示开始和目标情节(开始(1),(2)开始,“罗”)情节(目标(1)、目标(2),“莫”)举行

自定义杜宾车辆约束

要指定自定义车辆约束,请自定义状态空间对象。这个示例使用ExampleHelperStateSpaceOneSidedDubins,这是基于stateSpaceDubins类。这个helper类基于布尔属性将转向方向限制为右或左,GoLeft.属性的路径类型dubinsConnection对象使用(见dubinsConnection。DisabledPathTypes).

使用示例助手创建状态空间对象。指定相同的状态边界并给出新的布尔参数真正的(左)。

只向左转弯goLeft = true;%创建状态空间ssCustom = ExampleHelperStateSpaceOneSidedDubins(bounds, goLeft);ssCustom。MinTurningRadius = 0.4;

计划的路径

使用自定义Dubins约束和基于这些约束的验证器创建一个新的planner对象。指定相同的GoalReached函数。

stateValidator2 = validatorOccupancyMap (ssCustom);stateValidator2。地图= occGrid;stateValidator2。ValidationDistance = 0.05;planner = plannerRRT(ssCustom, stateValidator2);计划。MaxConnectionDistance = 2.0;计划。MaxIterations = 30000;计划。GoalReachedFcn = @exampleHelperCheckIfGoal;

在开始和目标之间规划路径。重置rng种子了。

rng (0,“旋风”) [pthObj2, solnInfo] =计划(计划,开始,目标);

图的路径

在地图上画出新的路径。路径应该只执行左转以达到目标。这个示例展示了如何使用通用RRT算法定制约束并规划路径。

图显示(occGrid)显示搜索树情节(solnInfo.TreeData (: 1) solnInfo.TreeData (:, 2),“。”);%树扩张%绘制路径(路径被插入后)pthObj2.interpolate(300)情节(pthObj2.States (: 1), pthObj2.States (:, 2),的r -“线宽”, 2)在网格地图中显示开始和目标情节(开始(1),(2)开始,“罗”)情节(目标(1)、目标(2),“莫”)举行