主要内容

vehicleCostmap

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

描述

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

成本图以二维网格的形式存储,通常称为网格占用网格入住率地图。成本图中的每个网格单元格都有一个范围为[0,1]的值,表示在该网格单元格中导航的成本。每个网格单元格的状态为免费的被占领的,或未知的,由…决定FreeThresholdOccupiedThreshold属性。

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

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

创建

描述

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

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

例子

成本映射=车辆成本映射(mapWidthmapLengthcostVal还分配了一个默认成本,costVal,到网格中的每个单元格。

成本映射=车辆成本映射(occMap从占用地图创建一个车辆成本图occMap。使用此语法需要Navigation Toolbox™。

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

成本映射=车辆成本映射(___名称,值使用名称,值参数来指定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,网格单元状态为免费的

  • 如果cFreeThresholdcOccupiedThreshold,网格单元状态为未知的

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

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

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

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

  • 如果cFreeThresholdcOccupiedThreshold,网格单元状态为未知的

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

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

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

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

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

  • 车辆的尺寸

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

此属性是只读的。

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

  • xminxmax用世界坐标描述地图的长度。

  • yminymax用世界坐标描述地图的宽度。

每个正方形单元的边长,以世界单位表示,以正实标量表示。例如,的边长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;cost = vehicle - lecostmap (mapWidth, mapplength,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]

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

occupiedVal = 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 *网格算法规划到停车位的最短车辆路径。然后对车辆施加非完整约束,使用混合A*算法重新规划路径。

创建占用映射

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

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

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

使用A* Grid Planner规划路径

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

gridPlanner = plannerAStarGrid(oMap);

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

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

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

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

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

显示(gridPlanner)

图中包含一个轴对象。标题为AStar的axes对象包含8个image、line类型的对象。这些对象表示路径,开始,目标,网格探索。

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

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

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

初始化一个plannerHybridAStar(导航工具箱)对象与状态验证器对象。施加最小转弯半径和运动原语长度的非完整约束MinTurningRadiusMotionPrimitiveLength规划器的属性。

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

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

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

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

refpath = plan(hybridPlanner,startPose,goalPose);

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

显示(hybridPlanner)

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

算法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在成本图上覆盖三个中心的车辆。车辆处于碰撞状态。

扩展功能

版本历史

在R2018a中引入

全部展开

Baidu
map