1. 机器人地图的分类

地图有很多种表示方式,例如,用经纬度标识地方的世界地图,城市的地铁图,校园指引图。

第一种我们称为尺度地图(Metric Map),每一个地点都可以用坐标来表示,比如北京在东经116°23′17'',北纬39°54′27'';第二种我们称为拓扑地图(Topological Map),每一个地点用一个点来表示,用边来连接相邻的点,即图论中的图(Graph),比如从地铁路线图中我们知道地铁红磡站与旺角东站和尖东站相连;第三种我们称为语义地图(Semantic Map),其中每一个地点和道路都会用标签的集合来表示,例如,有人问我中山大学教学楼E栋在哪里,我会说在图书馆正门右手边靠近图书馆的一侧。

在机器人领域,尺度地图常用于定位于地图构建(Mapping)、定位(Localization)和同时定位与地图构建(Simultaneous Localization And Mapping,SLAM),拓扑地图常用于路径规划(Path Planning),而语义地图常用于人机交互(Human Robot Interaction)。

这节课我们将介绍如何用机器人传感器数据绘制尺度地图。这有什么难点呢?首先也是最重要的一点,传感器数据有噪音。用激光传感器检测前方障碍物距离机器人多远,不可能检测到一个准确的数值。如果准确值是米,有时会测出1.42米,有时甚至1.35米。另外,传感器数据是本地坐标系的,而机器人要构建的是一个全局的地图。最后,机器人会运动,运动也是有噪音的。总结起来就两个字,噪音。通俗点来讲,“不准”。

2、占据栅格地图

我们首先来介绍机器人Mapping用到的的传感器,它叫做激光传感器(Laser Sensor),如下图所示:

激光传感器会向固定的方向发射激光束,发射出的激光遇到障碍物会被反射,这样就能得到激光从发射到收到的时间差,乘以速度除以二就得到了传感器到该方向上最近障碍物的距离。

这样看来,似乎利用激光传感器,机器人能够很好地完成Mapping这一任务。但是我们前面提到了,传感器数据是有噪音的。例如,假如我们在此时检测到距离障碍物4米,下一时刻检测到距离障碍物4.1米,我们是不是应该把4米和4.1米的地方都标记为障碍物?又或者怎么办呢?

为了解决这一问题,我们引入占据栅格地图(Occupancy Grid Map)的概念。

我们首先来解释这里的占据率(Occupancy)指的是什么。在通常的尺度地图中,对于一个点,它要么有(Occupied状态,下面用1来表示)障碍物,要么没有(Free状态,下面用0来表示)障碍物(旁白:那么问题来了,薛定谔状态呢?)。在占据栅格地图中,对于一个点,我们用来表示它是Free状态的概率,用来表示它是Occupied状态的概率,当然两者的和为。两个值太多了,我们引入两者的比值来作为点的状态:

对于一个点,新来了一个测量值(Measurement,)之后我们需要更新它的状态。假设测量值来之前,该点的状态为,我们要更新它为:。这种表达方式类似于条件概率,表示在发生的条件下的状态。

根据贝叶斯公式,我们有:

带入之后,我们得

我们对两边取对数得:

这样,含有测量值的项就只剩下了。我们称这个比值为测量值的模型(Measurement Model),标记为。测量值的模型只有两种:,而且都是定值。

这样,如果我们用来表示位置的状态的话,我们的更新规则就进一步简化成了:。其中分别表示测量值之后和之前的状态。

另外,在没有任何测量值的初始状态下,一个点的初始状态

经过这样的建模,更新一个点的状态就只需要做简单的加减法了。这,就是数学的魅力。

例如,假设我们设定。那么, 一个点状态的数值越大,就表示越肯定它是Occupied状态,相反数值越小,就表示越肯定它是Free状态。

上图就展示了用两个激光传感器的数据更新地图的过程。在结果中,一个点颜色越深表示越肯定它是Free的,颜色越浅表示越肯定它是Occupied的。

3. 利用激光传感器构建占据栅格地图

前面讲到通常用激光传感器数据来构占据栅格地图,这一节我们将详细介绍其中的实现细节。具体来说,我们需要编写函数:

function myMap = occGridMapping(ranges, scanAngles, pose, param)

其中,scanAngles是一个的数组,表示激光传感器的个激光发射方向(与机器人朝向的夹角,定值);ranges是一个的数组,表示个时间采样点激光传感器的读数(距离障碍物的距离);pose是一个的数组,表示个时间采样点机器人的位置和朝向信息(前两维为位置,第三维为朝向角度);param是一些传入的参数,param.origin是机器人的起点,param.lo_occ和param.lo_free分别是第二节中的,param.max和param.min表示位置状态的阈值(超过则置为阈值边界),param.resol表示地图的分辨率,即实际地图中一米所表示的格点数目,param.size表示地图的大小。

首先,我们解决如何将真实世界中的坐标转化为栅格地图中的坐标。

考虑一维的情况:

图中是真实世界中的坐标,为离散化了的地图(栅格地图)中的坐标,为一格的长度,表示分辨率,显然我们有:

ceil向上取整

同理,二维情况下:

其次,我们来计算每一条激光所检测出的障碍物和非障碍物在栅格地图中的位置。

假设机器人的状态为,激光与机器人朝向的夹角为,测量的障碍物的距离为(途中未标明,不好意思):

计算障碍物所在点的实际位置:

再计算障碍物在栅格地图中的位置,以及机器人在栅格地图中的位置。根据这两个坐标可以使用Bresenham算法来计算非障碍物格点的集合。

最后,利用第二节中的结论,我们使用简单的加减法不断更新格点的状态即可。

完整的Matlab代码如下:

function myMap = occGridMapping(ranges, scanAngles, pose, param)  resol = param.resol; % the number of grids for 1 meter. myMap = zeros(param.size); % the initial map size in pixels origin = param.origin; % the origin of the map in pixels % Log-odd parameters lo_occ = param.lo_occ; lo_free = param.lo_free; lo_max = param.lo_max; lo_min = param.lo_min; lidarn = size(scanAngles,1); % number of rays per timestamp N = size(ranges,2); % number of timestamp for i = 1:N % for each timestamp theta = pose(3,i); % orientation of robot % coordinate of robot in real world x = pose(1,i); y = pose(2,i); % local coordinates of occupied points in real world local_occs = [ranges(:,i).*cos(scanAngles+theta), -ranges(:,i).*sin(scanAngles+theta)]; % coordinate of robot in metric map grid_rob = ceil(resol * [x; y]); % calc coordinates of occupied and free points in metric map for j=1:lidarn real_occ = local_occs(j,:) + [x, y]; % global coordinate of occ in real world grid_occ = ceil(resol * real_occ); % coordinate of occ in metric map % coordinates of free in metric map (by breshnham's algorithm) [freex, freey] = bresenham(grid_rob(1),grid_rob(2),grid_occ(1),grid_occ(2)); % convert coordinate to offset to array free = sub2ind(size(myMap),freey+origin(2),freex+origin(1)); occ = sub2ind(size(myMap), grid_occ(2)+origin(2), grid_occ(1)+origin

机器人的地图——占据栅格地图相关推荐

  1. 9 概率机器人 Probabilistic Robotics 二值贝叶斯滤波 占据栅格地图 occupancy grid mapping

    文章目录 1 前言 2 二值贝叶斯滤波 2.1 理论基础 2.2 算法流程 2.3 重要公式推导 3 实例:占据栅格地图(occupancy grid mapping) 4 参考文献 1 前言 如果通 ...

  2. 占据栅格地图(Occupancy Grid Map)

    转载自:https://zhuanlan.zhihu.com/p/21738718 写在前面:这篇文章是Coursera上的课程(Robotics: Estimation and Learning), ...

  3. 占据栅格地图构建(Occupancy Grid Map)

    移动机器人地图构建问题,主要以gmapping为例,讲解了地图构建的整个流程.看过前面文章的小伙伴肯定都知道,gmapping算法把SLAM问题分解成两个部分,定位问题和地图构建问题.而gmappin ...

  4. 机器人导航必备的栅格地图数学模型及使用

    机器人导航必备的栅格地图数学模型及使用 占据栅格地图(Occupancy Grid Map) 占用栅格地图基础概念 占据栅格地图的数学模型 ROS中使用OccupancyGrid 占据栅格地图(Occ ...

  5. SLAM中有关占据栅格地图的的表示方法和利用激光传感器构建占据栅格地图的方法

    SLAM中有关占据栅格地图的的表示方法和利用激光传感器构建占据栅格地图的方法: https://zhuanlan.zhihu.com/p/21738718

  6. 工程复现 -- 占据栅格地图 G-VOM

    工程复现 – G-VOM 参考: 1.G-VOM 2.catkin-tools官方文档 3.G-VOM论文地址 4. 本文工程地址GVOM_Nuscenes 一. 效果(主要查看voxel_map和h ...

  7. 机器人学习--栅格地图(occupancy grid map)构建(部分代码解析)

    转自: 占据栅格地图构建(Occupancy Grid Map) - 知乎 占据栅格地图构建(Occupancy Grid Map)_「小白学移动机器人」一个专注分享移动机器人相关知识的公众号!-CS ...

  8. 机器人学习--从路径规划侧面看栅格地图

    移动机器人路径规划--很多种算法,如果有计算机学科基础的话,可以参考数据结构中的深度优先算法或者广度优先算法 https://zhuanlan.zhihu.com/p/51112799 https:/ ...

  9. 占用栅格地图(occupancy grid map)

    机器人地图分类 尺度地图(metric map):每一个地点都可以用坐标来表示,比如经纬度. 拓扑地图(topological map):每一个地点用一个点来表示,用边来连接相邻的点,即图论中的图. ...

最新文章

  1. java环境用openoffice转pdf
  2. Python3 字符串format使用代码示例
  3. Eclipse自动代码补全
  4. git schnnel failed to receive handshake, SSLTLS connection failed
  5. esp8266 继电器接线图_esp8266控制继电器问题(通电瞬间继电器吸合断开一次)
  6. 十分钟-Nginx入门到上线
  7. Linux系统java进程产生的core文件导致宕机原因排查
  8. 3d slicer调整窗宽窗位_3D游戏模型制作技巧,掌握这些技术你也能进鹅厂!
  9. 七星彩长奖表图_够力七星彩奖表长条图app
  10. 计算机论文中期考核报告,硕士学位论文中期检查表范文_中期检查报告范文_中期考核 修改论文题目...
  11. uniapp下微信小程序超过2MB大小限制的解决方法
  12. CTF---青青子衿(无C++注册机)
  13. 回炉重造之JAVA---枚举
  14. 中国行政区边界线下载(省,市,区县、乡镇边界线)
  15. 计算hashCode通用计算公式
  16. 互联网金融风控大数据技术应用
  17. mysql 二叉树表设计_Mysql 索引模型 B+ 树详解
  18. 分布式微服务企业快速架构之SpringCloud分布式、微服务、云架构快速开发平台
  19. 为何 Linus 一个人就能写出这么强的系统,国人却做不出来?
  20. 在word上写博客直接发到CSDN ——失败哈哈

热门文章

  1. 钓鱼工具gophish详细教程
  2. cesium entities 贴图
  3. 从规模化平台工程实践,我们学到了什么?
  4. Java堆外缓存OHC在马蜂窝推荐引擎的应用
  5. ACREL-3000电能管理系统在金桥德勤电能管理系统项目中的应用-安科瑞苏月婷
  6. rhino(犀牛) --- color control
  7. 智慧环保--生态环境监测网络扩充
  8. ubuntu取消桌面回收站,移动磁盘等图标
  9. 第一批吃螃蟹的人:浙大全日制英文MBA复试经验分享
  10. 全网最全激活函数图像绘制