本次学习和总结内容主要包括以下四个方面:
1、vSLAM发展历程
2、vSLAM技术原理及不同算法实现
3、vSLAM在不同场景下的应用挑战与解决办法
4、vSLAM在机器人实时导航避障中的应用实践
vSLAM的发展历程也可以说是视觉传感器的进化史,两者是相互依赖的。最早诞生的是单目相机,于是有了单目的vSLAM算法,XBox的Kinect相机把结构光和ToF都变成了消费类电子产品,并得到了大规模的量产。单目相机加上一组深度相机,于是有了RGB-D的SLAM,也有把深度图转换为Laser-Scan当激光来使用去做同步建图。
相比之下,双目相机由于对算力的要求比较高,得益于近些年来CPU和GPU的算力越来越高,逐步发展成了主流的传感器。视觉里程计对于视觉和IMU的同步精度要求是比较高的,所以我们也做了专门的双目惯导相机。多目相机可以简单的理解为是多组的双目,对视角和不同方向进行了扩充。
下面我简单介绍一下每个相机的特点:
单目相机的最大的问题是没有尺度信息,比如图片里的比例关系,人之所以可以区分是因为我们经过了大量的训练,类似于深度学习。但是机器视觉是不能从一张图中得到空间关系的,这就需要对相机进行移动来估计不同位姿下的图像关系,从而得到尺度信息,相当于这就是一个可变基线的双目相机。
结构光相机是靠投射出一些红外的图案,再利用IR摄像头接收到图像的形变来计算出来深度,IR的发射器和接收器之间的距离也类似于双目的基线,测距的关系、原理也类似于三角测量。用到的图案也有各式各样的,比如条纹状图案等。在Kinect中用的是随机的散斑,Kinect也提供了三种不同距离下的三种不同尺寸的散斑,用于测量不同的区间。
ToF相机是通过发射连续的光脉冲,然后利用传感器接收反射光,通过光飞行的时间推算出距离。ToF相机现在的分辨率普遍不高,基本上是QVGA(QuarterVGA),当然现在也有VGA分辨率的,但是随着它的分辨率的提升,成本也会越来越高。
双目相机的原理类似于人眼,我们人眼是通过左眼和右眼看到物体的不同视差,来得到深度信息,双目相机也是同样的原理。
这张图展示的是一个双目三角测距的简化模型,P代表被测的物体,z代表物体和相机之间的距离,b代表基线,f代表焦距,d代表视差。通过相似三角形的原理:z/f=b/d。实际上双目视差的算法要更复杂一些,像OpenCV中就有BM算法和SGBM算法。
因为双目的视差计算是不依赖于其它传感器的,所以双目相机在室内和室外都可以很好应用。上图就是在室内应用中看到的效果。对于一些弱纹理的表面,比如白墙或者没有纹理的桌面等,我们可以通过叠加一些IR结构光的纹理去增强它表面的纹理信息,这样可以方便计算出双目视差。
上面是双目相机在室外的效果,结构光的相机主要发射和接受IR光,太阳光里有大量的IR光会被覆盖掉,所以大部分结构光相机和ToF相机在室外都不能很好的工作,但是双目没有这个问题,所以现在很多汽车的ADAS里都用到了双目相机。
我们把双目结构光再加上IMU融合到一个相机里叫双目结构光惯导相机,通过多传感器融合和互补来达到双目在室内、室外不同的纹理,即使在旋转的情况下也可以达到很好的应用效果。
下面为大家介绍一下vSLAM的技术原理和一些开源的VSLAM算法的实现。vSLAM的技术框架主要包含了传感器的预处理、前端、后端、回环检测、建图等。
传感器部分我们经常用到的就是单目、双目和RGBD。由于单目相机尺度的不确定性,所以初始化的时间一般比较长,而且估计的位姿会有累积的误差;而双目相机本身是有尺度信息的,所以初始化很快,但是对标定有一定的要求;RGBD相机主要受室外阳光的影响比较大,包括反光物体的表面对RGBD相机的干扰也是比较大的,如果再加入IMU,就需要考虑IMU和图像之间同步的问题。
前端又称为视觉里程计 VO,主要是做一些相邻帧的图像估算,还有帧间相机的运动,其实是解决了定位的问题,里边又涉及到特征提取和位姿估计的算法。
这里提到的视觉里程计只能做相邻帧的运动,相当于做一个局部的估计,运行时间长了会有累积误差,因此需要后端的优化和回环检测去做闭环处理。
后端优化主要有两类算法:基于滤波理论的优化和非线性优化。近些年来基于非线性优化的vSLAM越来越多,而且逐渐成为主流的方法,但是实际上基于滤波理论的发展时间比较长,而且之前也有很好的应用案例,所以也是非常有生命力的。
回环检测和我们人类用眼睛来判断两个地方是否相同是一样的道理,检测到了相同的点就会做一次回环修正。但是这里有一个问题需要注意,由于场景里边可能出现高度相似的情况导致错误的闭环,比如贴着相同重复纹理的墙纸,这种情况我们需要增加一些其他的约束来避免它的错误闭环。
vSLAM建立的地图有几种
(1)比如特征地图会把几何特征点和一些关键帧存储起来,这些可以做定位导航用,也可以保存成地图载入做导航。
(2)拓扑地图也叫统计地图,它是一种保持点与线相对位置关系正确但是不关心面积距离和方向是否正确的一种抽象地图。
(3)栅格地图就是加入了尺寸信息的一种二维地图,比如大家可以看到上面图片背景的小格子,每一个格子就代表1个固定单位的尺寸信息,整个地图都是按照尺寸去描述的。二维的地图实际上比较适用于在地面运动且没有太多高度的机器人。
(4)三维地图可以把三维的环境和场景进行还原,比如Octomap或者是点云的地图,有了这个地图,我们就可以做空间的三维重建或者路径规划,比如无人机的路径规划和导航。
下面为大家快速介绍几种开源的SLAM案例:
ORB_SLAM的核心是使用ORB作为vSLAM的核心特征,是一个完整的SLAM系统,包含了视觉里程计、跟踪、闭环检测,是一种完全基于稀疏特征点的单目SLAM系统。同时也有单目、双目和RGBD相机的接口。
ORB特征实际上是将FAST特征的检测方法和BRIEF特征描述子的结合起来,并在他们原来的基础上做了改进和优化,在效果和速度上都有很大的提升。上面的地址是我们的双目产品接入了ORB_SLAM后的一个历程,ORB_SLAM并没有加入IMU的计算。
ORB的作者发了一篇基于惯导的单目vSLAM的文章,可以解决纯旋转的问题,国内的大神王京把它进行了简单的实现,但是这个仅仅是验证性质的,里边还存在一些Bug,下图里有代码地址,大家可以去学习下。
VINS-Mono和VINS-Mobile是香港科技大学的沈劭劼老师团队开源的单目视觉惯导SLAM方案,也是非常经典而且我个人非常推荐的一个单目VIO的项目。对整体算力的要求不高,精度也不错,尤其是VINS-Mobile可以在iOS系统运行。
VINS-Fusion是香港科技大学VINS-Mono的一个扩展,它支持多传感器的整合,包括单目+IMU、双目+IMU甚至纯双目,同时也提供了增加GPS的版本,也非常有幸我们和秦通大神一起探讨传感器在VINS上面的优化,在这方面提供了优化方案和支持,这个也帮助VINS在前期发布的时候有一个很好的传感器。
OKVIS是苏黎世联邦理工学院发布的一个双目VIO项目,这也是一个非常经典的双目VIO,但是它只输出六自由度的位姿,并没有回环检测和地图,因此严格意义上说并不是一个完整的SLAM,虽然它精度不错,但是如果长时间静止会出现位姿飘走的情况,这也是该项目里的一个问题。
OKVIS的代码结构框架是非常清晰的,但只限于定位功能这一部分,当然它也包含了紧耦合和多传感器融合,代码也是非常推荐大家去学习。
maplab是苏黎世理工大学继OKVIS之后推出的另一个vSLAM框架,它包含了两部分,一部分是ROVIO,另一部分是SLAM离线处理的console.
MSCKF是一个经典的基于滤波理论优化的vSLAM,它的优点是对算力要求不高,而且精度也不错。
下面主要是针对几种常见的VIO的性能做一些对比介绍,以及传感器选型时的一些注意事项。
测试对比用到的机型分别是Intel NUC、Odroid XU4、Up Board。这里NUC和UpBoard都是X86架构的,XU4使用的是一个ARM架构的主板。
在这幅图里横坐标代表了位姿的误差,这个误差越小越好,纵坐标分别是CPU的占用率、内存的占用率和处理的时间。从这个结果来看VINS、OKVIS和ROVIO的表现效果还是不错的,随着一些新的算法推出,也会有一些新的评测,大家可以关注一下。
对于vSLAM全局快门要比卷帘快门好,因为全局快门一次是曝光一整幅图像,而卷帘快门是按行去做曝光。这里可能有个误区,有人会觉得全局快门不会模糊,其实并不是这样的,是否模糊跟曝光时间的长短有关系,如果是在比较暗的环境,并且自动曝光时间拉长的情况下,即使移动也是会模糊的,这个和图像传感器的感光面积、镜头的光圈等因素有关,全局快门实际上主要解决的是果冻效应问题。
对于镜头来讲,视场角对于SLAM系统来说越大越好,因为视野里信息越多,能抓的特征点就越多,但是在选择大广角的镜头时,画面的畸变不能太怪异,需要匹配标定和矫正的模型才可以使用。
另外,双目传感器一定要注意双目之间的同步,左目和右目必须在同一时间内曝光,曝光的同时也要有相同的AE(自动白平衡)和AWE(自动曝光)。
图像和IMU之间的同步也有严格要求,最好的情况是IMU和图像能够完全的对齐,就像第一种情况,这种实际上是很难的,但是我们的传感器基本上已经可以做到了,这也是我们在市面上比一些竞品做得好的一个非常重要的原因;
第二种情况是Sensor和IMU的时钟同步,由于二者时钟是同步的,所以它的offset相对来说是固定的,这种也是可以用的,因为在初始化的时候,我们能够把offset估计出来然后固定化;但是第三种情况是不同步的,这对于vSLAM来说是致命问题,是不能使用的。
在产品化的过程中,实际上我们还要对算法进行加速,包括CPU指令集的加速、GPU里CUDA或者Open CL的加速以及FPGA、DSP、ASIC等芯片的加速。这里有一个误区,很多公司希望通过开源项目稍加修改来实现产品化,但这是非常困难的。因为算法需要对场景进行优化,对不同传感器进行融合,同时也要对于特定的平台去做加速和优化,降低一些主机的配置降低成本,才有可能把产品做好。
我们在Jetson TX 2上面也跑过VINS相关的算法,而且值得一提的是,VINS有一个专门的项目是VINS-Fusion对于GPU的优化项目,大家可以看一下,这也使得其在英伟达的GPU产品上能有更好的表现。
vSLAM发展到现在,在很多领域都有了很成熟的应用。下边我们看一下vSLAM在哪些产品中都得到了应用?
对于现在市面上不同的定位导航和避障方案来讲,双目+IMU的产品逐渐成为大家选型的主流方向,因为它的精度和布置成本相对来说都比较好,同时也能提供视觉传感器里的识别等部分。
像AR、VR之前基本上是使用外部设备进行定位的,或者在环境中部署一些二维码,但是对于环境和部署的要求比较高。
现在一些新的VR、AR定位产品都在使用VIO技术,让头盔能够实现自主定位,主要关注的是图像的高帧率,定位的帧率要高,传感器不能太重,而且功耗也不能太高。定位的高帧率,和头盔的图像刷新率有关,因为它要有很好的响应速度,才不会让人感到眩晕。
针对于无人机的避障现在也越来越多的方案用到了双目,因为双目能够很好的去用作室外的一些避障和导航,并且分辨率越高,对于物体的检测效果会越好。
在无人驾驶的应用里大部分都是在借助于多传感器融合的方案,里面包含了高精度的GPS、毫米波雷达、相机、激光雷达、惯导等传感器。对于里面的视觉部分,我们比较关心图像的动态范围,可以让相机在低光或者背光的环境下(比如隧道)能有很好的表现。同时也希望相机能够用到这种车规级的传感器,因为在夏天阳光直射的情况下,车内的温度会非常高。
下图是VINS融合GPS做的数据集的定位导航,可以看到双目+GPS也可以达到很好的效果。
安防机器人我们用到了扫地机的一种底盘,然后使用我们的双目相机做定位、导航和避障,最上面有一个2D的激光雷达去做建图,同时还有一个三摄像头的全景相机做全景图像的采集,下面我们说一下不同传感器在这套系统里边起到的作用。
超声波传感器实际上是一个精度不高的传感器,而且易受外界环境的干扰,在这里的主要是解决视觉和激光以及一些传感器对于玻璃等透明物体识别无效的问题,超声波可以很好的探测到玻璃。
双目传感器主要用来提供位姿信息,包括避障的点云和深度,同时也可以做回环检测。主要起到定位、导航和避障的作用。
IMU传感器:我们是和视觉做了一些融合,也放到了vSLAM VIO的相关算法里,我们用到的IMU实际上只是这种消费级的IMU,精度并不是很高,但是达到了非常好的效果。
现在的产品里大多数用的都是单线激光雷达,因为多线的激光雷达价格太高,激光雷达在这种建图的精度上和一些特殊场景上有很好的表现。至于这套系统要做多少传感器的冗余和配合,需要结合应用场景和产品的定位来决定,在一些场景里边可以完全不用激光雷达也能得到很好的效果。
另外,要注意的是底盘里程计,相对来说,底盘轮子的转动是比较精确的,但是打滑或者地面有坑坑洼洼的情况除外,这种情况需要一个多传感器融合的方案。
对于主机现在比较常见的是GPU或X86的主机,我们用到的基本是NVIDIA的嵌入式平台,通过ARM+GPU的优化方式,把我们的算法放进去。同时对于低成本的要求,我们也会去别的平台做一些移植和优化。