主要内容

vehicleCostmap

表示车辆周围规划空间的成本图

描述

vehicleCostmap对象创建开销图,该开销图表示车辆周围的规划搜索空间。成本图包含环境信息,比如障碍物或车辆无法穿越的区域。方法中指定的膨胀半径对障碍物进行膨胀,以检查碰撞CollisionChecker财产。路径规划算法使用开销图,例如pathPlannerRRT,为车辆寻找无碰撞路径。

成本图存储为单元格的2-D网格,通常称为占用网格入住率地图.成本图中的每个网格单元格都有一个范围为[0,1]的值,表示在该网格单元格中导航的成本。每个网格单元格的状态为免费的被占领的,或未知的,由FreeThreshold而且OccupiedThreshold属性。

下图显示了包含样本成本和网格单元状态的成本图。

costmap示例。中心网格单元格为暗红色,成本为0.9。这个格子代表一个障碍。障碍物周围的单元格是浅红色的,成本为0.8。这些细胞代表膨胀区域。膨胀区域周围的单元格是灰色的,成本为0.4。这些细胞有一个未知的状态。成本图角落的单元格是白色的,成本为0.2。这些细胞处于自由状态。

创建

描述

costmap =车辆ostmap(C使用矩阵中的成本值创建车辆成本图C

costmap =车辆ostmap(mapWidthmapLength创建一个表示宽度区域的车辆成本图mapWidth和长度mapLength单位是世界单位。默认情况下,每个网格单元格都处于未知状态。

例子

costmap =车辆ostmap(mapWidthmapLengthcostVal也指定了一个默认代价,costVal,到网格中的每个单元格。

costmap =车辆ostmap(occMap从占用地图创建一个车辆成本图occMap.使用此语法需要导航工具箱™。

costmap =车辆ostmap(___“MapLocation”,mapLocation指定在mapLocation成本图的左下角坐标。指定MapLocation, MapLocation在上述任何输入后,并在其中的任意顺序名称,值对参数。

costmap =车辆ostmap(___名称,值使用名称,值参数来指定FreeThresholdOccupiedThresholdCollisionChecker,CellSize属性。例如,vehicleCostmap (C ' CollisionChecker ccConfig)使用一个inflationCollisionChecker对象,ccConfig,以表示车辆形状并检查碰撞情况。创建对象后,可以更新除CellSize

输入参数

全部展开

成本值,指定为范围为[0,1]的实际值的矩阵。

当创建vehicleCostmap对象,如果未指定C或者一个统一的成本值,costVal,则每个网格单元的默认成本值为FreeThreshold+OccupiedThreshold) / 2

数据类型:|

成本映射的宽度,以世界单位表示,指定为正实标量。

成本映射的长度,以世界单位表示,指定为正实标量。

应用于成本映射中的所有单元格的统一成本值,指定为范围[0,1]中的实标量。

当创建vehicleCostmap对象,如果未指定costVal或者成本价值矩阵,C,则每个网格单元的默认成本值为FreeThreshold+OccupiedThreshold) / 2

占用图,指定为occupancyMap(导航工具箱)binaryOccupancyMap(导航工具箱)对象。使用此参数需要“导航工具箱”。

Costmap位置,指定为形式为[的双元素实值向量mapXmapY].这个向量指定成本图左下角的坐标位置。

例子:“MapLocation”,[8]

属性

全部展开

低于此阈值的网格单元格是空闲的,指定为范围[0,1]中的实标量。

有成本的网格单元c可以有以下状态之一:

  • 如果c<FreeThreshold,网格单元格状态为免费的

  • 如果cFreeThreshold而且cOccupiedThreshold,网格单元格状态为未知的

  • 如果c>OccupiedThreshold,网格单元格状态为被占领的

占用网格单元格的阈值,指定为范围[0,1]中的实标量。

有成本的网格单元c可以有以下状态之一:

  • 如果c<FreeThreshold,网格单元格状态为免费的

  • 如果cFreeThreshold而且cOccupiedThreshold,网格单元格状态为未知的

  • 如果c>OccupiedThreshold,网格单元格状态为被占领的

冲突检查配置,指定为InflationCollisionChecker对象。要创建此对象,请使用inflationCollisionChecker函数。属性的属性InflationCollisionChecker对象,您可以配置:

  • 膨胀半径用于膨胀成本图中的障碍

  • 计算膨胀半径时用来包围飞行器的圈数

  • 每个圆沿车辆纵向轴的位置

  • 车辆的尺寸

默认情况下,CollisionChecker使用默认值InflationCollisionChecker对象,该对象使用语法创建inflationCollisionChecker ().这种碰撞检查配置将车辆围在一个圈内。

此属性是只读的。

成本图在飞行器周围的范围,指定为四元非负整数向量,形式为[xminxmaxyminymax].

  • xmin而且xmax用世界坐标描述地图的长度。

  • ymin而且ymax用世界坐标描述地图的宽度。

每个正方形单元的边长,以世界单位表示,以正实标量表示。例如,的边长1暗示一个网格,其中每个单元格都是一个大小为1 × 1米的正方形。较小的值可以提高搜索空间的分辨率,但代价是增加内存消耗。

你可以指定CellSize当您创建vehicleCostmap对象。但是,在创建对象之后,CellSize成为只读的。

此属性是只读的。

costmap网格的大小,指定为形式为[的双元素正整数向量nrowsncols].

  • nrows成本映射中的网格单元格行数。

  • ncols成本映射中的网格单元格列数。

对象的功能

checkFree 检查车辆成本图中无碰撞的姿势或点
checkOccupied 查看车辆消耗图,查看被占用的姿势或点
getCosts 在车辆成本图中获取电池的成本值
setcost 在车辆成本图中设置电池的成本值
情节 绘制车辆成本图

例子

全部折叠

创建一个10 × 20米的成本图,将其划分为大小为0.5 × 0.5米的正方形单元格。为所有单元格指定默认成本值0.5。

mapWidth = 10;mapLength = 20;costVal = 0.5;cellSize = 0.5;costmap = vehicleCostmap(mapWidth,mapLength,costVal,“CellSize”cellSize)
FreeThreshold: 0.2000 OccupiedThreshold: 0.6500 CollisionChecker: [1x1 driving.costmap. properties]InflationCollisionChecker] CellSize: 0.5000 MapSize: [40 20] MapExtent: [0 10 0 20]

在成本图上标出一个障碍。显示成本图。

占位val = 0.9;xyPoint = [2,4];setcost (costmap xyPoint occupiedVal)情节(costmap)

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

在成本图上标出一个无障碍区域。再次显示成本图。

freeVal = 0.15;[X,Y] = meshgrid(3.5:cellSize:5,0.5:cellSize:1.5);setcost (costmap [X (:), Y (:)), freeVal)情节(costmap)

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

使用a *网格算法规划到停车位的最短车辆路径。然后对车辆施加非完整约束,并使用Hybrid A*算法重新规划路径。

创建占用图

加载一个停车场的成本图。创建一个occupancyMap(导航工具箱)对象使用costmap对象的属性。可视化占用地图。

数据=负载(“parkingLotCostmapReducedInflation.mat”);costmapObj = data.parkingLotCostmapReducedInflation;分辨率= 1/costmapObj.CellSize;oMap = occuancymap (costmapObj.Costmap,resolution);的核心。FreeThreshold = costmapObj.FreeThreshold;的核心。占用阈值= costmapobj .占用阈值;显示(oMap)

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

使用A*网格规划器规划路径

使用占用地图创建一个plannerAStarGrid(导航工具箱)对象。

gridPlanner = plannerAStarGrid(oMap);

在世界坐标系中定义起始点和目标点。这个坐标框架的原点位于地图的左下角。

startPos = [11,10];goalPos = [31.5,18];

在世界坐标中规划从起点到目标点的路径。

path = plan(gridPlanner,startPos,goalPos,“世界”);

方法可视化路径和已探索的节点显示对象的功能。

显示(gridPlanner)

图中包含一个轴对象。标题为AStar的axes对象包含8个image、line类型的对象。这些对象表示Path, Start, Goal, gridexplorers。

使用混合A*规划器施加非完整约束并重新规划

创建一个状态验证器对象,用于使用冲突检查验证规划的路径。将占用映射分配给状态验证器对象。

validator = validatorOccupancyMap;验证器。Map = oMap;

初始化一个plannerHybridAStar(导航工具箱)对象使用状态验证器对象。通过指定最小转弯半径和运动基元长度来施加非完整约束MinTurningRadius而且MotionPrimitiveLength计划器的属性。

hybridPlanner = plannerHybridAStar(validator,MinTurningRadius=4,MotionPrimitiveLength=6);

定义车辆的起始和目标姿态为[X y)向量。x而且y位置单位为米,和θ指定以弧度为单位的方向角度。

startPose = [4 4 pi/2];%[米,米,弧度]goalPose = [45 27 -pi/2];

计划从开始姿势到目标姿势的路径。

refpath =计划(hybridPlanner,startPose,goalPose);

使用以下命令可视化路径显示对象的功能。

显示(hybridPlanner)

图中包含一个轴对象。标题为Hybrid A* Path Planner的坐标轴对象包含图像、直线、散点类型的6个对象。这些对象代表前进运动原语、反向运动原语、前进路径、开始、目标。

算法

为了简化车辆姿态是否发生碰撞的检查,vehicleCostmap膨胀障碍的大小。碰撞检查算法遵循以下步骤:

  1. 计算膨胀半径,以世界单位为单位,从车辆尺寸。默认的膨胀半径等于完全包围车辆所需的最小重叠圆圈集合的半径。圆的中心点位于车辆的纵轴上。增加圆圈的数量会降低膨胀半径,从而实现更精确的碰撞检查。

    膨胀半径,一个中心 膨胀半径,三个中心

    有一个中心并且在中心周围有一个大膨胀半径的飞行器

    有三个中心和围绕这些中心的三个小膨胀半径的飞行器

  2. 将膨胀半径转换为多个网格单元格,R.的非整数值取整R到下一个最大的整数。

  3. 使用膨胀障碍的大小R.将充气区域内的所有单元标记为已占用。

    图表以暗红色显示已占用的细胞。充气区域的细胞被涂成浅红色。黑色实线表示原始的膨胀半径。在左边的图表中,R是3。在右边的图表中,R是2。

    膨胀网格单元,一个中心 膨胀网格单元,三个中心

    在成本图上有一个圆和相应的膨胀网格单元的车辆。通货膨胀面积很大。

    在成本图上有三个中心和相应的小膨胀网格单元的车辆。膨胀面积很小。

  4. 检查车辆中心点是否位于充气网格上。

    • 如果任何中心点位于膨胀网格单元上,则车辆姿态为被占领的.的checkOccupied函数返回真正的.一个占据的姿势并不一定意味着碰撞。例如,车辆可能位于膨胀的网格单元上,而不是实际占用的网格单元上。

    • 如果在膨胀的网格单元上没有中心点,并且每个包含中心点的单元的成本值小于FreeThreshold,则飞行器姿态为免费的.的checkFree函数返回真正的

    • 如果没有中心点位于膨胀的网格单元上,并且任何包含中心点的单元的成本值大于FreeThreshold,则飞行器姿态为未知的.这两个checkFree而且checkOccupied返回

以下姿势被认为是碰撞,因为至少有一个中心点在充气区域上。

姿势为“碰撞,一个中心” 三中心碰撞

在成本图上有一个中心的车辆。车辆处于碰撞状态。

在成本图上有三个中心的交通工具。车辆处于碰撞状态。

扩展功能

版本历史

在R2018a中引入

全部展开

错误从R2020b开始