占用率网格地图

概述

占用网格为离散网格用于机器人工作空间的表示。关于环境的信息可以从传感器实时收集,或者从已知地图中加载。激光测距仪、碰撞传感器、相机和深度传感器通常用于查找机器人环境中的障碍物。

占位网格可用于机器人算法,如路径规划(见 mobileRobotPRM(机器人系统工具箱)或 plannerRRT)。

在制图应用中,它们用于将传感器信息整合到离散地图中;

在路径规划中,用于寻找无碰撞路径;

在已知环境中,用于定位机器人(参见 monteCarloLocalization 或 matchScans)。您可以创建不同大小和分辨率的地图,以适应您的特定应用。

  • 有关三维占用图,请参阅 occupancyMap3D。

对于二维占用网格,有两种表示方法:

  • 二进制占用网格(参见 binaryOccupancyMap)
  • 概率占用网格(见 occupancyMap)

二进制占用网格用真值表示占用的工作空间(障碍物),用假值表示空闲的工作空间。该网格显示了障碍物的位置,以及机器人能否通过该空间。如果内存大小对应用有影响,请使用二进制占用网格。

概率占用网格使用概率值来创建更详细的地图表示。这种表示方法是使用占用网格的首选方法。这种网格通常简称为占用网格。占用网格中的每个单元格都有一个代表该单元格占用概率的值。接近 1 的值表示该单元格中存在障碍物的确定性很高。接近 0 的值则代表该单元格未被占用且无障碍的确定性。概率值可以提供更好的物体保真度,并提高某些算法应用的性能。

二进制占位网格和概率占位网格共享若干属性和算法细节。网格和世界坐标适用于这两种占用网格。膨胀函数也适用于这两种网格,但每种网格的实现方式不同。对数表示法和概率饱和的效果只适用于概率占用网格。


世界坐标、网格坐标和本地坐标

在 MATLAB® 中处理占位网格时,可以使用世界坐标、本地坐标或网格坐标。

在占位网格中,机器人运行所处的绝对参照系被称为世界帧。大多数操作都在世界帧中执行,使用本工具箱中的 MATLAB 函数时,默认选择世界帧。世界坐标被用作具有固定原点的绝对坐标系,可指定任意分辨率的点。不过,由于地图本身的数据存储和分辨率限制,所有位置都会转换为网格位置。

本地框架指的是车辆在地图上导航时的自我中心框架。GridOriginInLocal 和 LocalOriginInWorld 属性定义了网格在本地坐标中的原点以及本地框架在世界坐标中的相对位置。您可以使用move函数调整本地框架。有关使用本地框架作为以自我为中心的地图来模拟车辆行驶并发送本地障碍物的示例,请参阅使用范围传感器创建以自我为中心的占用地图。

网格坐标定义了占用网格的实际分辨率和障碍物的有限位置。网格坐标的原点位于网格的左上角,第一个位置的索引为 (1,1)。但是,MATLAB 中占用网格的 GridLocationInWorld 属性定义了网格在世界坐标中的左下角。创建占用网格对象时,XWorldLimits 和 YWorldLimits 等属性由输入的宽度、高度和分辨率定义。本图直观地展示了这些属性以及世界坐标和网格坐标之间的关系。

坐标膨胀

二进制和普通占位网格都有障碍物膨胀选项。这种膨胀用于增加障碍物的安全系数,并在机器人和环境中的障碍物之间创建缓冲区。占用网格对象的膨胀函数会将指定半径转换为从分辨率*半径值向上舍入的单元格数。每种算法都会分别使用该单元值来修改障碍物周围的数值。

二进制占用网格

膨胀函数会获取每个已占用的单元格,并通过在每个点周围添加占用空间来直接膨胀。这个基本的膨胀示例说明了如何使用半径值。

在二进制占位网格中膨胀障碍物

本示例展示了如何创建地图、设置障碍物位置并以 1 米为半径膨胀地图。图中的附加图有助于说明由于转换为网格位置而导致的膨胀和移动。

map = binaryOccupancyMap(10,10,5);%创建二进制占空比网格
setOccupancy(map,[5 5], 1);%设置位置 [5,5] 的占用率。
show(map);
inflate(map,1);%将地图上的占用空间膨胀 1 米
show(map)

% 绘制原始位置图、转换后的网格位置图并绘制原始圆
% 从图中可以看出,网格中心是 [4.9 4.9],与 [5 5] 的位置有所偏移
% 从这里开始绘制一个 1 米的圆,注意任何接触到这个圆的单元格都会被标记为被占用
% 该图已放大到相关区域

hold on
theta = linspace(0,2*pi);
x = 4.9+cos(theta);                % x circle coordinates
y = 4.9+sin(theta);                % y circle coordinates
plot(5,5,'*b','MarkerSize',10)     % 原始位置
plot(4.9,4.9,'xr','MarkerSize',10) % 网格位置中心
plot(x,y,'-r','LineWidth',2);      % 半径为1m的圆
axis([3.6 6 3.6 6])
ax = gca;
ax.XTick = [3.6:0.2:6];
ax.YTick = [3.6:0.2:6];
grid on
legend('原始位置','网格中心','膨胀')

从上图可以看出,即使是与膨胀半径几乎没有重叠的单元格,也会被标记为被占用。

占用网格

膨胀函数使用膨胀半径来执行概率膨胀。概率膨胀作为一个局部最大值运算符,为附近的单元格找出最高的概率值。膨胀函数利用这一定义在整个网格中膨胀较高的概率值。这种膨胀会增大任何被占据位置的大小,并为机器人绕过障碍物创建一个缓冲区。本示例展示了如何使用一系列概率值进行充气。

在占位网格中膨胀障碍物

本例展示了膨胀方法如何对障碍物进行概率充气,以扩大障碍物的大小,并为障碍物出现概率较高的区域创建缓冲区。

map = occupancyMap(10,10,10);%绘制一张 10 米 x 10 米的空白地图。
show(map)
x = [1.2; 2.3; 3.4; 4.5; 5.6];
y = [5.0; 4.0; 3.0; 2.0; 1.0];

pvalues = [0.2 0.4 0.6 0.8 1];

updateOccupancy(map,[x y],pvalues)%用pvalues中的特定值更新世界位置的占用率。
figure
show(map)
% 按给定半径膨胀占用区域。
% 较大的占用值会写入较小的值。
% 您可以事先复制地图,以恢复任何不需要的更改。
savedMap = copy(map);
inflate(map,0.5)
figure
show(map)

 概率值的对数表示法

在使用带有概率值的占用网格时,目的是估计障碍物位置的概率,以便在实时机器人应用中使用。occupancyMap 类使用对数表示每个单元格的概率值。每个概率值都会转换为相应的对数值,以便在内部存储。在访问时,该值会转换回概率值。这种表示方法能以最少的操作有效更新概率值。因此,您可以快速将传感器数据整合到地图中。

对数表示使用以下等式:

备注

对数概率值以 int16 值存储。这种数据类型将概率值的分辨率限制在 ±0.001,不但大大改善了内存大小,并允许创建更大的地图。

概率饱和度

使用对数表示法更新占用网格时,数值范围为-∞至∞。这个范围意味着,如果机器人多次观察到某个位置(如一扇紧闭的门),该位置的对数值就会变得过高,或者该值的概率达到饱和。如果门随后打开,机器人需要多次观察门是否打开,概率才会从占用变为空闲。在动态环境中,您希望地图对变化做出反应,以便更准确地跟踪动态物体。

为防止出现这种饱和现象,可更新 ProbabilitySaturation属性,该属性限制了包含多个观测值时所允许的最小和最大概率值。该属性是对数概率值的上限和下限,可使地图根据环境变化快速更新。

饱和极限的默认最小值和最大值为 [0.001 0.999]。

对于动态环境,建议值至少为 [0.12 0.97]。如果地图更新速度不够快,无法进行多次观测,可考虑修改此范围。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值