主要内容

isMotionValid

检查状态之间的路径是否有效

描述

例子

isValidlastValid= isMotionValid(验证器state1state2通过在状态之间进行插值来检查两个状态之间的路径是否有效。该函数还返回路径上的最后一个有效状态。

例子

全部折叠

这个例子展示了如何在一个环境中验证路径。

加载示例映射。使用简单映射来创建一个二进制占用映射。

负载exampleMaps.matmap = occuancymap (simpleMap);显示(图)

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

指定通过映射的粗路径。

路径= [2 2 pi/2;10 15 0;17 8 -pi/2];持有情节(路径(:1),路径(:,2),”——o”

图中包含一个轴对象。标题为“占用网格”的坐标轴对象包含两个类型为image、line的对象。

属性创建状态验证器stateSpaceSE2定义。指定插值和验证路径段的映射和距离。

validator = validatorOccupancyMap(stateSpaceSE2);验证器。地图=地图;验证器。ValidationDistance = 0.1;

检查路径上的点是否处于有效状态。这三个点都在自由空间中,因此被认为是有效的。

isValid = isStateValid(验证器,路径)
isValid =3x1逻辑阵列1 1 1

检查每个连续路径状态之间的运动。的isMotionValid函数沿着状态之间的路径进行插值。如果路径段无效,则绘制沿路径的最后一个有效点。

startStates = [path(1,:);path(2,:)];endStates = [path(2,:);path(3,:)];i = 1:2 [isPathValid, lastValid] = isMotionValid(validator,startStates(i,:),endStates(i,:));如果~ isPathValid情节(lastValid (1) lastValid (2),”或“结束结束持有

图中包含一个轴对象。标题为“占用网格”的坐标轴对象包含3个类型为image、line的对象。

这个例子展示了如何在一个环境中验证路径。

加载示例映射。使用简单地图创建车辆成本地图。指定膨胀半径为1米。

负载exampleMaps.matmap = vehicleCostmap(double(simpleMap));地图。CollisionChecker =通胀CollisionChecker(“InflationRadius”1);图(图)

图中包含一个轴对象。axis对象包含image、patch类型的2个对象。此对象表示膨胀区域。

指定通过映射的粗路径。

路径= [3 3 pi/2;8 15 0;17 8 -pi/2];持有情节(路径(:1),路径(:,2),”——o”

图中包含一个轴对象。坐标轴对象包含图像、patch、line 3个对象。此对象表示膨胀区域。

属性创建状态验证器stateSpaceSE2定义。指定插值和验证路径段的映射和距离。

validator = validatorVehicleCostmap(stateSpaceSE2);验证器。地图=地图;验证器。ValidationDistance = 0.1;

检查路径上的点是否处于有效状态。这三个点都在自由空间中,因此被认为是有效的。

isValid = isStateValid(验证器,路径)
isValid =3x1逻辑阵列1 1 1

检查每个连续路径状态之间的运动。的isMotionValid函数沿着状态之间的路径进行插值。如果路径段无效,则绘制沿路径的最后一个有效点。

startStates = [path(1,:);path(2,:)];endStates = [path(2,:);path(3,:)];i = 1:2 [isPathValid, lastValid] = isMotionValid(validator,startStates(i,:),endStates(i,:));如果~ isPathValid情节(lastValid (1) lastValid (2),”或“结束结束持有

图中包含一个轴对象。axis对象包含图像、patch、line等4个对象。此对象表示膨胀区域。

创建一个3-D占用图和相关的状态验证器。规划、验证和可视化占用地图中的路径。

加载并分配映射到状态验证器

将一个城市街区的三维占用地图加载到工作区中。指定一个阈值,认为其中的单元格是无障碍的。

mapData = load(“dMapCityBlock.mat”);omap = mapData.omap;的核心。FreeThreshold = 0.5;

扩大占用地图,为障碍物周围的安全操作增加缓冲区。

充气(omap, 1)

创建带有状态变量边界的SE(3)状态空间对象。

ss = stateSpaceSE3([-20 220;-20 220;-10 100;正正;正正;正正;正正]);

使用创建的状态空间创建一个3-D占用映射状态验证器。

sv = validatoroccuancymap3d (ss);

将占用映射分配给状态验证器对象。指定采样距离间隔。

sv。Map = omap;sv。ValidationDistance = 0.1;

规划和可视化路径

创建一个增加最大连接距离的路径规划器。减少最大迭代次数。

planner = plannerRRT(ss,sv);计划。MaxConnectionDistance = 50;计划。MaxIterations = 1000;

创建一个用户自定义的评估函数,用于判断路径是否达到目标。指定抽样过程中选择目标状态的概率。

计划。GoalReachedFcn = @ ~, x, y)(规范(x - y (1:3)) (1:3) < 5);计划。GoalBias = 0.1;

设置开始和目标状态。

Start = [40 180 25 0.7 0.2 0 0.1];目标= [150 33 35 0.3 0 0.1 0.6];

使用指定的起点、目标和计划器规划路径。

[pthObj,solnInfo] = plan(计划,开始,目标);

检查路径上的点是否为有效状态。

isValid = isStateValid(sv,pthObj.States)
isValid =7x1逻辑阵列1 1 1 1 1 1 1 1 1

检查每个顺序路径状态之间的移动是否有效。

isPathValid = 0 (size(pthObj.States,1)-1,1,“逻辑”);i = 1:size(pthObj.States,1)-1 [isPathValid(i),~] = isMotionValid(sv,pthObj.States(i,:),...: pthObj.States (i + 1));结束isPathValid
isPathValid =6x1逻辑阵列1 1 1 1 1 1 1 1

可视化结果。

显示(omap)scatter3(开始(1,1),开始(1、2),开始(1、3)‘g’“填充”%绘制开始状态scatter3(目标(1,1)、目标(1、2)、目标(1、3)“r”“填充”%绘制目标状态plot3 (pthObj.States (: 1) pthObj.States (:, 2), pthObj.States (:, 3),...的r -“线宽”, 2)%绘制路径

图中包含一个轴对象。标题为Occupancy Map的坐标轴对象包含patch、scatter、line类型的4个对象。

输入参数

全部折叠

的子类的对象指定的状态验证器对象导航。StateValidator.这些是预定义的状态验证器对象:

初始状态位置,指定为n-元素行向量或——- - - - - -n矩阵。n状态空间的维数是验证器是要验证的状态数。

数据类型:|

最终状态位置,指定为n-元素行向量或——- - - - - -n矩阵。n状态空间的维数是验证器是要验证的状态数。

数据类型:|

输出参数

全部折叠

有效状态,返回为-element逻辑列向量。

数据类型:逻辑

每条路径上的最终有效状态,返回为n-元素行向量或——- - - - - -n矩阵。n状态空间的维数是否在状态空间属性中指定验证器验证的路径数。每一行都包含相关路径上的最终有效状态。

数据类型:|

版本历史

R2019b引入

Baidu
map