作者:张长鸿 湖南大学
校稿:董亚微
编辑:郑欣欣@一点人工一点智能
入群邀请:7个专业方向交流群+1个资料需求群
原文地址:视觉SLAM:模型介绍、算法框架及应用场景
本文主要想使用尽量少的专业词汇来解释清楚视觉SLAM是如何进行定位的(在某些表述上可能并不严谨),希望对视觉SLAM有兴趣的伙伴能在刚接触SLAM时有个基本的了解,本文同时介绍了视觉SLAM的经典框架和应用场景。想要深入学习的伙伴,还请参考更专业更系统的书籍和文献。
01 什么是SLAM
SLAM(Simultaneous Localization and Mapping),也就是同时定位与地图构建,它是指搭载特定传感器的车辆、无人机等移动机器人,在没有环境先验信息(什么是先验信息?可以自己查一下)的情况下,在运动过程中,估计自己的运动状态,同时建立环境模型的一系列任务。
目前大家接触比较多的,已经将SLAM技术应用于实际生活中的,就是扫地机器人了。我们来想一下:扫地机器人来到一个陌生的环境后,是怎样去清扫一个垃圾呢?一个直观的想法就是机器人先确定自己的位置,然后确定垃圾相对于自身的位置,这样就有了一个起点和终点,机器人只需要从起点移动到终点就能清扫这个垃圾了。但是这是很直观的想法,而这个想法的前提是:我们清楚房间的地图构造,这样我们才能更好地完成垃圾清扫的任务。所以扫地机器人需要完成的流程应该是:了解自己周围的环境,构建房间地图,确认自己与垃圾的位置,然后规划路线,移动过去,完成清扫。而这整个流程中,构建地图、进行自身的定位,就是咱们SLAM的主要任务了。
通过这样一个小例子,就可以体现出SLAM的作用,通俗地讲,SLAM要解决的主要是两个问题:
- 我在什么地方?----定位
- 周围环境是什么样? ----建图
而根据传感器类型的不同,SLAM可以分为不同的类型,如表1所示
本文主要介绍的就是以相机为传感器的视觉SLAM。视觉SLAM是根据一张张连续输入的图像,从中推断相机的运动,以及周围环境的情况。接下来将介绍相机模型和相机运动,我们将看到相机模型是如何利用已知的图像信息构造观测方程,并从观测方程解出相机运动,而获取相机运动后,到此也就完成了定位。我们先从相机模型开始,一步步推导到最后完成定位。
1.1 相机模型
相机的成像模型表示的是一个真实世界中的三维点到图像二维像素点的对应关系,即相机视野中的三维点可以在图像上找到对应的像素点,在不考虑畸变的情况下,单目相机成像的理想模型为针孔模型,如图1所示,光心\( O\)即镜头的中心,光轴即经过光心与物理成像平面垂直的直线,\( f \)代表焦距,即针孔到物理成像平面的距离,代表在相机坐标系下任意的三维空间点,经过光心,投影到二维物理成像平面中点,每个三维空间点对应物理成像平面上的一个像素。
针孔模型通过成像过程中的几何关系建立三维世界到二维像素平面的映射关系,在数学上的描述就是一个函数关系式,即,也称之为观测方程,其中,二维像素坐标,三维空间点坐标P,K为相机内参矩阵,由相机自身的特性决定。
1.2 相机运动
了解相机运动之前,需要先了解几个基本概念:
世界坐标系: 在视觉SLAM中,通常把拍摄第一张图像时的相机坐标系指定为世界坐标系,在被指定后不变且唯一,可以将世界坐标系理解为笛卡尔坐标系中的原点。
相机坐标系: 以相机的光心(小孔)作为原点的坐标系,其随相机的移动而发生变化。
相机的运动是刚体运动,刚体运动的坐标变换可由一个旋转矩阵(\(R\))和一个平移向量(\(t\))表示,考虑一个三维空间点\(P\),\(P\)点在世界坐标系下的观测值为,在相机坐标系下的观测值为,点P在不同坐标系下的观测值转换关系如下所示:
(1)视觉SLAM系统输入的信息是不同时刻的相机图像,我们所要利用的就是图像的像素信息,假设在第一帧坐标系下,已知某一个空间点\(P(X,Y,Z)\),\(P\)在第一帧图像和第二帧图像上的成像点分别是\(p_1\),\(p_2\)。
(2)通过相机模型,可以得到如下两个观测方程,\(R\)和\(t\)代表着第一帧坐标系到第二帧坐标系的旋转和平移\(p_1=\frac{1}{Z_1}KP,p_2=\frac{1}{Z_2}K(RP+t)\)。
(3)可以根据8个这样的匹配点对\((p_1,p_2)\),求解上述方程,得到\((R,t)\)。
(4)\((R,t)\)即代表着两个坐标系的转换关系,通常情况下,第一帧坐标系将被定为世界坐标系,由于世界坐标系是固定不变的,因此就可以得到第二帧相机坐标系的位置和姿态,也即完成了定位,定位也就是获得任意时刻的相机坐标系相对于世界坐标系的位置和姿态。
以上的几个步骤是对问题做了很多简化才得到的,实际情况下考虑的因素要多得多,如相机类型的差异,相机运动表示方法的不同,对应的具体的求解过程都是不同的,需要更深入的研究和学习。
1.3 建图
建图是指构建地图的过程。地图是对环境的描述,这种描述有很多种形式,要根据需求的不同构建相应的地图,地图的表现形式,主要被分为度量地图和拓扑地图两类。在SLAM领域,研究者更关注度量地图。
度量地图强调精确地表示地图中物体的位置关系。度量地图又分为稠密地图和稀疏地图两类,其中,稀疏地图仅表示环境中有代表性的空间点,如桌子的边缘等较容易从图像中识别的点,而其它不具有代表意义的点则被忽略,稀疏地图主要用于SLAM的定位。相对于稀疏地图,稠密地图则重建环境中所有的空间点,如桌子的整个平面,二维的稠密地图由正方形的网格组成,三维的稠密地图由立方体的网格组成。通常,一个小块含有占据、空闲、未知三个状态,以表达该网格内是否有物体,稠密地图主要用于机器人或智能汽车的导航和避障。
02 SLAM算法框架
经典的视觉SLAM算法框架如图3所示,主要包括:传感器信息读取,前端(里程计),后端,回环检测和建图。需要说明的是,不同类型的SLAM技术仅在前端的处理有所不同,后端所采用的优化算法都是通用的。本节中出现的专业名词会略多,如果不清楚的话,需要耐心的多读几遍,涉及到前沿的研究方向如果感兴趣的话,可以找到原文了解一下。
输入: 采集相机图像,并进行预处理。
前端(视觉里程计): 根据短时间内采集到的相机图像,计算相机的在移动机器人坐标系中的位置和姿态,也就是位姿,并建立局部地图。
前端的主流方法有特征点法(间接法)和直接法两种。特征点由关键点和描述子两部分组成,关键点是指该特征点在图像中的位置,它可以在多帧图像中被检测到,并通过比较描述子来建立配对关系,通过最小化重投影误差来优化相机位姿,最经典的间接法是orb-SLAM2。直接法没有特征提取的步骤,直接利用像素的灰度信息,通过最小化像素的光度误差来优化位姿,最经典的直接法是DSO。
间接法和直接法的理论基础已经较为完善,目前的改进方向就是在已有的理论框架中增加先验约束如:尺度约束,平面特征约束,平行线特征约束等,2022年美团在ICRA学术会议上发表的工作《EDPLVO:Efficient Direct Point-Line Visual Odometry》即对前端做了改进,将线特征扩展到直接法中,获得了最佳导航论文奖。
后端: 根据不同时刻视觉里程计计算的相机位姿,3维地图点和回环检测信息,对位姿和3维地图点进行全局的优化,后端处理的是SLAM过程中的噪声问题,在数学上被建模为最大后验概率估计问题来解决,主流的方法有以扩展卡尔曼滤波为代表的滤波器方法和非线性优化方法。滤波器方法形式更简洁,适用于计算资源受限的场景。非线性优化方法能更精确的优化相机位姿和地图点位置,但计算时间更长,所需计算资源更多。
回环检测: 判断机器人是否到达过先前的位置,如果检测到回环,可以提供时隔更加久远的约束,可以消除累积误差,主要是通过图像之间的相似性来判断,最经典的方法是词袋模型。随着深度学习的快速发展,基于CNN(卷积神经网络)和RNN(循环神经网络)的方法可以有效提高回环检测的效率。
建图: 根据估计的轨迹,建立与任务要求对应的地图。对于SLAM来说,地图是用来辅助定位的,但对于导航、避障和三维重建等任务来说,地图在其中扮演着更重要的角色,为了完成不同的任务,地图的形式也是不同的,常见的地图类型包括占据网格地图、八叉树地图、语义地图等
以上是视觉SLAM发展近20年所形成的经典框架,是研究者们多年工作的结晶,也是我们开展自己研究的基础,对于视觉SLAM这个领域来说,目前越来越多的工作是结合深度学习开展的,包括语义分割网络、深度估计网络、注意力机制等,这些网络可以与视觉SLAM的许多环节相结合,如特征提取和匹配、深度估计、姿态估计和重定位等,来提高视觉SLAM的整体性能,当然结合深度学习的视觉SLAM技术现在还不够成熟,确定做视觉SLAM的伙伴,不妨一试哦~
03 SLAM的应用场景
这部分将主要介绍SLAM的三大应用场景:自动驾驶的高精度定位、自主移动机器人和室内场景的三维重建。在不同场景下,对算法的精度,计算资源和计算速度的需求是不一样的。针对不同的场景,要选择合适的算法。
3.1 自动驾驶的高精度定位
定位是高阶自动驾驶的关键一环,目前高速场景下的自动驾驶定位主要依赖于组合导航技术,高速场景下路况简单,车辆交互少,也无需频繁换道,在该场景下达到车道级/分米级的定位精度即可,组合导航(GNSS/INS)技术就可以满足该场景下的精度要求。
在低速城区场景中,车道较窄,车流量大,尤其在十字路口这样复杂的场景下,还会出现车道变化,为了避免车辆变道压线或车辆碰撞,这时就需要车辆达到厘米级的定位精度,在该场景下,通常需要组合导航、视觉SLAM、激光SLAM等多种技术进行融合定位,来达到厘米级的定位精度。
在没有GNSS信号的地下车库,隧道等场景,此时组合导航(GNSS/INS)算法失效,就必须依赖于视觉SLAM或激光SLAM进行定位。
3.2 自主移动机器人
随着移动机器人的智能化程度逐渐提升,自动移动机器人已经开始出现在家庭服务、物流仓储与搬运、故障检测等领域当中,曾经只存在于工业特种场景下的移动机器人,正逐渐走进我们的日常生活中。
不同场景下的机器人需要执行不同的复杂任务,但良好的自主导航是完成绝大多数复杂任务的前提要求,导航是指机器人能够从当前位置行驶至指定目标点,而准确的实现定位是自主导航的关键,如果错误的估计了自身的位置,最后导航的结果可能就会差十万八千里,机器人自然就不可能完成指定的任务。
SLAM技术就可以满足机器人定位的需求,可以使机器人在未知环境下,在行进过程中同时完成自身的定位与建图,当确定了机器人在地图中的位置以及周围环境后,便可以设计路径规划算法,计算出机器人到达指定位置的轨迹,然后控制机器人沿着指定的轨迹运动,即完成了导航任务。目前视觉SLAM和激光SLAM技术在移动机器人上都有应用,由于激光传感器受环境影响较小,并且激光SLAM发展技术较早,目前已经可以大规模商用落地。相较于激光SLAM算法,由于相机易受光照和环境结构的影响,视觉SLAM算法的鲁棒性还无法和激光SLAM达到同一水准,因此需要借助和IMU的结合,实现更好的鲁棒性和更高的精度。
对于SLAM技术来说,要完成导航任务,构建地图是必要的,地图可以实现路标以及环境的可视化,此外,地图可以辅助机器人进行更优的定位以及丢失位置后的重新定位,移动机器人需要的是3D稠密地图,而地图的规模是随着场景的增大而增大的,地图越大就意味着我们需要更多的内存资源去存储地图,因此如何判断是否更新地图,如何高效存储、表征和更新地图是值得我们研究的。
知识扩展:
除了SLAM,目前主流的移动机器人定位技术还有组合导航(GPS/INS)、二维码导航/磁导航。
组合导航(GNSS/INS)
GNSS技术是指通过观测GNSS卫星获得坐标系内绝对定位坐标的测量技术,中国的北斗导航系统和美国的GPS都属于GNSS技术,在空旷处单一的GNSS的定位误差小于5米,在城市环境下GNSS信号易被遮挡,此时GNSS的定位误差可能会达到几十米。因此现在大多采用组合导航(GNSS/INS)的方式,能极大的提高组合导航的鲁棒性,当然其应用场景主要还是在空旷的室外。
二维码导航/磁导航
AGV最初是用来运输港口的集装箱,AGV最初是采用磁导航的,这种方式需要按照一定的间隔,在机器人行驶道路上提前埋上磁钉,AGV小车通过自身安装的磁导航传感器接收磁钉信息,从而完成自身的定位,其运动路径也就是由磁钉的布置决定,降低了路径规划技术的要求,该技术适用于港口,工厂自动搬运这类封闭且有固定行驶路径的机器人。而这种技术的缺点在于:磁钉会出现老化的问题,更换磁钉的代价很大,不能轻易变更机器人运营路线,这个缺点很大程度上制约了AGV技术更大范围的运用。当然AGV发展到现在,也出现了采用二维码导航的方式,通过AGV小车扫描天花板或者地板上二维码的方式获取当前位置信息,在仓储物流行业和服务送餐机器人都有运用。
3.3 室内场景的三维重建:AR(增强现实技术)等
AR可以被理解为这样一项技术:通过图像和其他传感器信息计算相机的位置和三维环境结构,并结合3D渲染提供更自然的人机交互能力。举一个简单的场景,你可以在VR设备中拥有一只虚拟的小猫,在一个周末的午后,它会懒洋洋的躺在你的脚边,并不时打着哈欠。要实现这样的一个场景,AR设备需要具备以下三个功能:
· 自我定位: 指定位出AR设备在空间中的位置,这样AR设备才能将虚拟物体渲染在合适的位置上,将“小猫”渲染在脚边就需要知道自身在空间的位置。
· 环境感知: 指感知到周围环境的三维几何信息,这样才能让虚拟物体和真实世界发生交互,如果想让“小猫”跳到桌子上,就必须知道桌子的空间位置和形状。
· 人机交互: 要理解来自周围环境的输入,如人类的语言、手势,并给出反馈。
而想要实现自我定位和环境感知的功能就需要SLAM技术,具体而言,需要的是视觉惯导SLAM技术,视觉惯导SLAM也是当前实现AR的主流方案,相比于单纯依靠相机的纯视觉SLAM方案,视觉惯导SLAM通过从相机输入的图像信息和IMU的速度、加速度信息完成更准确的定位,同时图像信息能提供更丰富的环境信息,更有利于后续算法理解环境,以完成人机交互。再加上由于制造工艺的成熟,MIU和相机设备体积更小重量更轻,价格也相对便宜,综合以上因素考虑,视觉惯导SLAM技术要更为契合AR设备的需求。那么,最为经典的视觉惯导SLAM算法是vins-mono算法。
当然,目前的视觉惯导SLAM算法只能说基本满足了AR设备的需求,但为了让消费者获得更好的体验,AR设备必然会往更小,更轻的方向上发展,实际上,硬件的小型化和轻量化确实也是更为迫切的需求。当然,并不是说算法就不重要了,相比于自动驾驶汽车和移动机器人,AR设备对SLAM算法的要求要更高。
首先,SLAM算法的计算效率要更高,小的设备往往意味着更少的计算资源,如何使用更少的计算量完成同样的效果是一个可以长期研究的方向;
其次,相比于自动驾驶汽车和机器人,AR设备要更容易出现一些极端情况,比如你的身体突然转动了180°,这对于佩戴AR设备的你来说是正常的,但AR设备可能因为这样强烈的旋转出现定位失败的情况,这就对SLAM算法的鲁棒性提出了更高的要求;
最后,如何使用更短的时间和更少的动作来快速完成初始化也是很重要的,就如同你希望你的笔记本电脑的开机速度越快越好一样,你也不想在穿戴好AR设备后,要等待30s并且完成某些动作后才能开始使用你的设备。
04 结语
整体而言,SLAM涉及的知识面很多,前端包括相机图像处理、激光雷达点云处理、IMU数据处理,后端的优化算法包括卡尔曼滤波、非线性优化,回环检测更多的属于机器学习的范畴以及各类的建图算法,更进一步的还需要深度学习的知识。如果想要了解或者入行SLAM的话,首先推荐高翔博士的视觉SLAM十四讲,在第一遍学习的过程中,可以快一些,快速掌握SLAM由哪些部分组成,每一部分的目的是什么,第一遍学完后,可以将综述性的论文、经典论文、十四讲的代码和理论知识结合起来学习。在基础打好后,就可以看一下前沿的学术论文,选定其中一个方向进行研究,这里要注意的是,研究方向是偏向就业还是偏向做学术,需要视个人情况而定。同时不要放过每一次和同行交流的机会,可以是师兄、论坛、交流群等等,SLAM涉及的技术太多,要开阔自己的视野,不断地刷新自己的学习路线。
参考文献:
[1] 视觉SLAM14讲:从理论到实践 第2版
[2] An Overview on Visual SLAM: From Tradition to Semantic
[3] https://mp.weixin.qq.com/s/3YRQMAk6eaqBCQSLkxWjKQ
[4] A Comprehensive Survey of Visual SLAM Algorithms