这个专栏第一大部分主要是slam方面的论文和源码解读,从技术领域可分为激光slam和视觉slam,同时视觉slam中语义slam已经成为一个重要的分支,所以我们把它单独提出来作为一部分。激光slam虽然也有很多结合语义的,但是它在方法上和论文数量上还没有像视觉那样丰富,所以暂时不把激光语义slam单独提出来。

第二大部分是我自己会写一套从零开始做定位的系列博客,以及相关的一些我对定位这件事的思考,这件事情暂时没有系统化,想到哪就写到哪。

一、 激光slam

激光slam是我的主业,是我目前工作内容中的最重要一项,所以我会按照激光slam包含的各个功能块对内容进行划分,按照划分的结果,分块搜集资料并进行解读。主要划分为以下部分:

1. 地图

对激光slam进行分类,我觉得最好的分类方式就是根据地图的种类来分,地图的表示形式直接系统其他模块的可选项,甚至直接决定了整个系统的程序架构。

目前主流的地图表示形式有以下几种(此处只是简略概括,详细内容会在论文讲解积累到一定数量之后进行,后面的概括都同此):

1)直接的点云地图。

2)占据栅格地图

3)概率地图

4)surfel地图

5)三维网格地图

6)Multi-level surface map

7)appearance-based map

2. 前端

前端是一个slam系统最基础的部分,它提供每一帧点云对应的位姿。在一个slam系统中,选择哪种前端,其实在选择了地图表示方法之后就基本确定了,我们可以大致梳理下可选的前端。

1)ICP、NDT以及层出不穷的各种改进版。

2)基于线和面特征。最典型的莫过于鼎鼎大名的LOAM了。

3)基于栅格。

4)基于range image。把点云展开成图片,借鉴二维图片中的方式更新位姿。

5)基于特征点和描述子。除了提取特征点以外,还计算对应的描述子。

6)基于语义特征。就是完全具有语义信息的点云,这样好处是不容易陷入局部最优了,但提语义也不是一件容易事。

3. 闭环

对于三维激光slam来讲,闭环是一个太重要的话题了,即便到现在,也是一个没有被完全解决的问题。其中最关键的核心在于当前端误差累计达到一定程度以后,场景重识别和位姿匹配都不能再以开环位姿为基础做判断,需要全局搜索和匹配了,目前主流的方法有以下几种:

1)基于栅格和分支定界。典型的就是cartographer中的闭环检测了。

2)基于appearance-based map的重识别,不过目前的多数这种方法都结合了激光和图像,对于只依赖激光的则不多。

3)基于特征点和描述子。特征点有了描述子,就可以全局搜索和匹配了,可以同时解决重识别和匹配问题。

4)基于直方图。对点云提取直方图,作为特征。

5)结合NDT。NDT每个网格的方差阵是可以提取特征的,这种特征也可以用来识别。

6)语义特征。最高级的特征好像什么都可以解决,不过现实中能不能提取出足够数量的完整语义特征倒是另外一回事。

4. 后端

使用图优化做后端已经成为当之无愧的首选,滤波的方法已经越来越少了。

5. 信息融合

对于自动驾驶中的激光slam来讲,除了优化前端和闭环产生的信息之外,大多数时候还要加上RTK和IMU,这样才能得到可复用的地理系下的地图。

RTK就是直接在因子图中作为先验边加入,而IMU则有多种用途,最合理的融合方式是使用预积分,不过略显复杂,退而求其次,则可与RTK先做一个组合,再作为先验加入因子图也可。

IMU的另外一个作用就是去畸变,对于机械雷达,这是基本要求。

6. 定位

自动驾驶中很少边建图边定位,一般都是建好点云地图,再在该地图上做定位,把当前帧和地图做匹配可以实现基本的定位,如果要更稳定,则需要加上融合。

7. 初始定位

把初始定位从定位中单独提出来,是因为它重要,我们建的图都是大场景地理系下的地图,最可靠的方式是RTK提供准确的位置,以此位置为基础可实现初始化。有些时候卫星信号不理想,则只能由RTK提供粗略位置,然后使用点云匹配的方式在一定附近区域内搜索得到最优的初始结果。此处搜索方式和闭环相似,基本可以互相借鉴。对于建图时没有使用卫星信号的情况,也可以使用这种方式进行全局搜索初始化。

由于我本人以自动驾驶中的激光SLAM为主业,所以在论文讲解积累到一定数量之后,会做一个大的综述。之后,会出一个从零写激光SLAM的系列,重现一个激光SLAM系统的编写过程,程序会开源,当然,这种开源出来的都只是一些基础的东西,工作中用到的很多方法都是公司秘密,是不能公开的,我得遵守我的职业道德。

二、视觉slam

实在惭愧,视觉slam的代码我看过不少,demo跑过不少,但我没有用它实际做过项目。自动驾驶中能让视觉slam发挥的地方确实不多。

所以我在这部分就把主流的代码梳理一下,包括orb-slam、vins、svo等等,如果有不对的地方,还请各位大佬多提意见。

三、视觉语义slam

将来的slam领域,语义slam必然有它重要的一席,只是目前还处在婴儿期,不成熟。我搜集一些论文,放在这个excel表格里,大家可以下载来看。

语义信息对视觉slam的贡献,或者说视觉slam与语义结合的方式,主要可以分为以下几种

  1. 用于改善特征选择

传统方法提取描述子来进行位姿匹配,其中包含了动态物体或可能运动的物体的描述子,语义方法可以帮助识别出这些物体,并剔除相应的特征,提高鲁棒性。另外,有些方法中,神经网络输出的特征可以代替sift或者orb等描述子,用于位姿匹配。

2. 用于位姿优化

主要是利用语义识别出的物体或特征,进行数据关联,从而改善位姿的估计

3. 用于重定位

视觉slam的一个主要问题是所建立的地图会随着时间的推移或者环境的变化而逐渐不试用,这种变化多是光照等环境变化引起的。如果能够建立给予语义特征或语义识别的物体的地图,则会在此方面有很大的改善,尤其是面对life-long的需求的时候。

4. 用于恢复尺度

由于单目slam中缺少尺度信息,因此有很多语义slam方法致力于用深度学习去恢复单目相机的深度信息。

5. 用于端到端位姿输出

这种是直接基于图像信息对6自由度位姿进行端到端的输出。