SLAM中的各种地图
1、地图的不同分类方式
地图有多种不同的分类方式,网上有不少帖子介绍各种各样的地图,但并没有非常完整的总结地图应该怎么分类。论文[1]中将地图分成以下几种:拓扑地图、度量地图、度量-语义地图和混合地图。我觉得按照这种方式进行归类相对比较科学。
1.1 拓扑地图
拓扑地图(Topological Map)使用节点和边来表示环境,其中节点表示重要位置(如拐角、门口),边表示这些位置之间的可达路径。拓扑地图注重表示环境的连接关系,而不是具体的几何细节。这种地图表示方法适用于大型、复杂环境中的高效路径规划和导航。个人简单理解为,是一种表示拓扑关系、不存在准确距离信息的地图,例如:我家地图是,客厅在中间,周围连着卧室、书房、厨房、卫生间,书房又连着阳台。

1.2 度量地图/尺度地图/几何地图
度量地图(Metric Map)或几何地图(Geometric Map)是SLAM种较为常用的一种表示方法,常见的点云(PointCloud)、八叉树地图(OctoMap)、栅格地图(Grid Map)等都属于度量地图,下一节会展开介绍。个人简单的理解为,能够从这个地图中获取具体的尺度信息,例如某个点距离某个点多远、XXX障碍物面积有多大。
根据地图的稠密程度,度量地图还可进一步分为:稀疏地图、稠密地图。稀疏地图例如视觉SLAM建立的特征点地图,是稀疏的,一般多用于自身定位而难以直接导航;而RGBD或LiDAR可以建立稠密地图。
根据地图是连续的还是离散的,还可进一步分为:离散地图、连续地图。栅格地图、体素地图(Voxel Map)就是典型的离散地图,把空间进行了划分,然后离散化表达;连续地图是采用高斯过程或者NeRF方式建立的地图。

离散地图(左)与连续地图(右)
1.3 语义地图
语义地图(Semantic Map)是包含了语义信息的地图,语义信息可以是物体的种类、姿态和形状等描述。例如,无人驾驶需要知道地图中那些是车道、哪些是障碍。需要注意的是,只要包含于语义信息就可以算是语义地图,尺度地图、拓扑地图也可以是语义地图。

带语义信息的点云地图(左)和带语义信息的拓扑地图(右)
1.4 混合地图与多层级地图
混合地图(Hybrid Map)是一种结合多种地图表示的地图,例如在大范围导航时,我们可能既需要拓扑信息(从客厅到卧室),又需要尺度信息(走多少米),这就需要混合地图。
分层级地图(Hierarchy Map)顾名思义,是多层次的地图表示,通过将环境信息组织成不同层次以提高数据管理和处理的效率。例如无人驾驶时,顶层地图表示全局的道路网络,底层表示局部的道路详细结构,可以理解成“分辨率”从粗到细的过程,以适应不同的任务需求。
2、尺度地图细分
2.1 特征地图
特征地图(Feature Map)是仅保留特征的地图,常见于视觉SLAM。一些场景,例如水下的定位放置一些标志物,这样建立的地图就是特征点地图。视觉SLAM一般提取特征点匹配后建立特征点地图。除了点特征意外,线特征和面特征也可以建立地图,但也属于是特征地图的一种。

左:水下声呐建立的声呐目标特征点地图;中:vSLAM建立的特征点地图;右:线+面特征地图
2.2 点云地图
点云地图(Point Cloud Map)是利用点云形式表示地图,常见的激光雷达SLAM建立的都是点云地图。

2.3 栅格地图
栅格地图(Grid Map)将空间划分为均匀的网格,每个网格存储一个值,表征地图的属性。一种常见的方式,用三种状态:占用、空闲、未知,表示某个栅格是否被占用,这种表达方式称作“占用栅格地图”(Occupancy Grid Map),机器人导航常用栅格地图,在“空闲”栅格中规划运动轨迹。
一般来说,栅格地图指的是二维平面地图。

2.4 体素地图
体素地图(Voxel Map)可以理解为三维的栅格地图,当然也包括占用体素地图(Occupancy Grid Map)。如果是无人机这类的导航,一般需要用到3D的栅格地图。和点云地图相比,体素地图的“分辨率”更低,对点云地图进行了离散化。

室内场景的占用栅格地图(左)和用于无人机导航的占用栅格地图(右)
2.5 高程地图
高程地图(Elevation Map)也称2.5D地图。如果是平坦地面、二维场景,用栅格地图就可以;如果是无人机,需要用到三维场景体素地图;但如果是无人车在非平坦路面运行、或者是四足/轮式机器人在野外的行进,需要对地形进行建模,常用的方式就是高程地图,例如经典的elevation mapping就是建立的高程地图[2]。在栅格地图的基础上增加了一个维度即高度。

2.6 神经辐射场地图
神经辐射场地图(Neural Radiance Fields, NeRF)是一种新兴的三维场景表示和渲染技术,通过神经网络隐式地表示三维空间中的颜色和密度场。其特点是高精度、连续表示、数据驱动。具体可参考[6]。

2.x 八叉树地图、ikdtree地图、哈希地图等
这些我认为不属于具体的地图表征形式,只是地图存储的数据结构。具体来说:
- 八叉树地图(Octree Map)是利用八叉树数据结构存储体素地图,可以节省数据存储空间。具体实现例如 OctoMap[3]
- ikdtree地图是动态kd-tree的地图,存储的是原始点云形式,由Fastlio2[4]采用,专门用于处理点云数据的高效存储、增量更新和查询
- 哈希地图(Hash Map)使用哈希函数将二维或者三维空间坐标映射到哈希表中,用于存储和检索空间信息,节省存储空间,存取速度快,可以存储点云地图、体素地图
除此之外,还有其他改进例如i-octree[5]等,不展开介绍。
3、一些讨论
这里记录一些自己学习的困惑,或者其他地方的讨论。
3.1 为什么要关注地图的表示?
对于最基础的SLAM而言,实现了定位与建图任务就可以了。但问题是,建立的地图要干什么、如何服务后面的任务?如果不加以考虑、忽视建图,就完全是一个定位过程了。所以,需要根据后续任务决定建立什么地图。
3.2 无人驾驶的高精度地图是什么?
个人简单总结,就是:尺度地图的绝对坐标精度更高,所包含的道路交通信息元素丰富细致。按照第一部分的分类,应该数据多层级地图。
4、小结
本文整理了一些SLAM领域常见的地图,但并没有细致讨论每种地图的优缺点以及应用场景。
参考文献
[1] Survey on Active Simultaneous Localization and Mapping: State of the Art and New Frontiers
[2] GitHub - ANYbotics/elevation_mapping: Robot-centric elevation mapping for rough terrain navigation
[3] https://octomap.github.io/
[4] FAST-LIO2: Fast Direct LiDAR-inertial Odometry
[5] zhujun:【ICRA 2024】i-Octree:快速、轻量级的动态八叉树
[6] LONER: LiDAR Only Neural Representations for Real-Time SLAM
https://zhuanlan.zhihu.com/p/708050126
SLAM中的各种地图的更多相关文章
- Slam(即时定位与地图构建) 知识篇
Slam即时定位与地图构建 技术解释 同步定位与地图构建(SLAM或Simultaneous localization and mapping)是一种概念:希望机器人从未知环境的未知地点出发,在运动过 ...
- 视觉SLAM中相机详解
视觉SLAM中,通常是指使用相机来解决定位和建图问题. SLAM中使用的相机往往更加简单,不携带昂贵的镜头,以一定的速率拍摄周围的环境,形成一个连续的视频流. 相机分类: 单目相机:只是用一个摄像头进 ...
- 视觉SLAM中的数学基础 第三篇 李群与李代数
视觉SLAM中的数学基础 第三篇 李群与李代数 前言 在SLAM中,除了表达3D旋转与位移之外,我们还要对它们进行估计,因为SLAM整个过程就是在不断地估计机器人的位姿与地图.为了做这件事,需要对变换 ...
- C# 程序中嵌入百度地图
本例是对WinForm中使用百度地图的简要介绍.百度地图目前支持Android开发,IOS开发,Web开发,服务接口,具体可以参照'百度地图开放平台'. [动态加载百度地图]涉及到的知识点: WebB ...
- 在ionic/cordova中使用百度地图插件
在ionic项目中,如果想实现定位功能,可以使用ng-cordova提供的cordova-plugin-geolocation. 但由于高墙的缘故,国内andorid环境下,此插件不起作用(ios环境 ...
- 视觉SLAM中的数学基础 第四篇 李群与李代数(2)
前言 理解李群与李代数,是理解许多SLAM中关键问题的基础.本讲我们继续介绍李群李代数的相关知识,重点放在李群李代数的微积分上,这对解决姿态估计问题具有重要意义. 回顾 为了描述三维空间里的运动,我们 ...
- SLAM中的EKF,UKF,PF原理简介
这是我在知乎上问题写的答案,修改了一下排版,转到博客里. 原问题: 能否简单并且易懂地介绍一下多个基于滤波方法的SLAM算法原理? 目前SLAM后端都开始用优化的方法来做,题主想要了解一下之前基于 ...
- Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图
标签: Android百度地图API Key 分类: Android 百度地图开发(2) 最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地 ...
- cocos2d-x中的Tiled地图
cocos2d-x中的瓦片地图是通过tiledMap软件制作的,存档格式是.tmx格式.此软件的使用步骤简单总结如下: (1)制作瓦片地图 1 打开软件,软件界面如下图. 2. 新建地图(文件-> ...
- Android应用中使用百度地图API并加入标注(一)
网上一些资料这样的的内容已经过时了,这里是最新的内容,假设哪里不正确,请吐槽... 1)下载百度地图移动版API(Android)开发包 要在Android应用中使用百度地图API,就须要 ...
随机推荐
- Ubuntu22.04下vscode安装python代码格式化(Format Document)black模块及设置
相关: 如何在vscode中支持python的annotation(注解,type checking)--通过设置pylance参数实现python注解的type checking ubuntu22. ...
- USACO 23023DEC 题解
LG LG9979 [USACO23DEC] Target Practice S code LG9980 [USACO23DEC] Flight Routes G sol 1 已知邻接矩阵求路径数奇偶 ...
- 解密Prompt系列36. Prompt结构化编写和最优化算法UNIPROMPT
上一章我们聊了标准化的Prompt生成方案DSPy,但DSPy还是更多依赖few-shot的Prompt编写范式,在纯任务描述型指令上的优化效果有限.这一章我们就重点关注描述性指令优化.我们先简单介绍 ...
- 工作常用SQL
工作常用SQL Excel生成SQL 这个好用 ="insert into t_gk_mapping(id,gk_project_name,gk_project_code,main_proj ...
- CF1693D--单调区间
\(T_4\) 单调区间结题报告 题目描述 一句话题意:给定一个排列 \(a\) 算出有多少个区间 \([l , r]\) , 满足其可以划分为一个单调递增子序列和单调递减子序列,其中单调递增子序列长 ...
- apr库编译及队列使用笔记
操作系统 :CentOS 7.9_x64 apr库版本:apr-1.7.4 & apr-util-1.6.3 gcc 版本:4.8.5 队列功能在C++或Python等脚本语言里面,是很容易就 ...
- 检测 NAT 类型
使用 pystun3 pystun3 是一个用于获取 NAT 类型和外部 IP 的 Python STUN 客户端 安装: pip install pystun3 使用: pystun3 结果: NA ...
- 逆向WeChat(六)
上篇回顾,逆向分析mojo,mmmojo.dll, wmpf_host_export.dll,还有如何通过mojoCore获取c++binding的remote或receiver,并调用它们的功能接口 ...
- 宝塔安装onlyoffice
1. 拉取镜像 docker pull onlyoffice/documentserver 2. 构建容器 进入宝塔管理面板->docker->镜像,可以看到镜像已被安装成功 配置容器参数 ...
- 系统编程-进程-fork深度理解、vfork简介
1. fork基本使用 #include <unistd.h> #include <stdio.h> int main(){ pid_t pid = fork(); if(pi ...