单目摄像头定位最大的优点是便宜,定位有多种思路,比较典型的有两种:
1)间接定位
运动主体可以通过识别一些不动的物体作为参照,间接进行定位。但这个对于机器人来说非常难。因为外界的环境通过摄像头传入机器人的都是数字化的信息,具体就是像素点,数字化的信息通过识别物体的方式进行定位,是一件非常吃力的事情。
有一个变种的方案很方便实施,就是二维码方案,机器人识别二维码是非常容易的,通过知晓二维码的宽度(只有知晓先验大小,才能判断远近),与不同二维码所代表的地标位置,机器人可以仅仅通过单目2D摄像头方便的推算出自己的绝对位姿。以前的VR设备,如HTC VIVE,多采用这种方式实现定位。这个方案不方便之处在于要提前部署二维码。
2)单目SLAM
单目SLAM要做到比较鲁棒的定位,需要两个阶段, 分为前端的视觉里程计和后端的回环机制。该方案的问题包含初始化尺度问题和实际工程实施中计算量实时性问题。
尺度问题,是由2D成像理论内在特点决定的,因为没有深度信息,大小和远近是可以成比例缩放的, 反映到单目SLAM, 在初始化阶段,必须运动主体有平移的动作,来确定一个尺度基准,这个尺度基准是无法与测量单位“m,cm,mm”对应的,只是自己的一个单位, 后续的建图和定位都是基于这个单位来进行, 建立的地图和定位理论上可以等比例缩放。
计算量问题,在于SLAM算法本身的复杂性,勉强在嵌入式设备上跑,计算资源基本耗尽。在实践中可以从算法并行计算方面进行探索,或者选择高性能的计算平台。
单目SLAM 分为特征点法和直接法,考虑到对周遭环境的鲁棒性,一般采用特征点法,就是采用人工设计的角点,作为连续帧进行地标匹配。角点肯定是稀疏的,所以建图只是作为定位的辅助地标来做使用, 不能指导避障和导航。
主动光深度摄像头(3D)
这种摄像头在2D摄像头的基础上,增加红外发射和接收装置,在2D RGB像素上增加深度(距离)信息。比较有名的产品有微软的Kinect,苹果最新的手机产品IphoneX会配备这种摄像头,提供给用户VR使用体验和增强人脸识别FaceId的准确度。
深度摄像头在定位方面主要是深度SLAM方案。 相对于单目SLAM, 因为每个像素有了深度信息, 这样尺度问题就不存在了,不需要运动主体做平移运动来做初始化动作。有了深度信息,理论上建图是可以做稠密图,可以做三维建模。
它的缺点也很明显,除了跟2D一样算法计算量偏大,红外主动光非常容易受到其它强光的影响, 这样在室外基本就退化成一个2D摄像头了。 对于一些透光介质,如玻璃,深度信息是无法得到的。
双目摄像头
两个摄像头,光心距离固定。双目摄像头通过视差,可以间接得到两个摄像头共视像素的深度信息。双目摄像头比较像人的眼睛, 人可以通过双眼,直接估计出眼前物体的相对远近。对于计算机来说,通过同一时刻两个摄像头分别拍的两帧图像,根据视差的几何关系,可以算出像素的深度,达到跟主动光深度摄像头一样的效果。
相比主动光深度摄像头, 它的优点是受环境光线的影响比较小,可以在室外自动驾驶汽车上应用。缺点是像素的深度信息不能直接获取,需要不小的运算量通过视差几何关系计算获得。
双目摄像头本质上就是一个深度摄像头,只是获取深度信息的手段不同,所以定位也可以应用深度SLAM方案。
激光雷达
激光雷达是目前定位选择的主流传感器,带自主导航的室内扫地机的商用产品,一般都会配备激光雷达。在自动驾驶领域,高精地图的采集及定位应用, 使用的是多线激光雷达方案。
激光雷达分为单线和多线, 单线雷达只能扫描一个平面的障碍,所以直接出来的是一个2D地图。 多线雷达(有16线,32线,64线)产品,通过多个扫描面的组合,可以给出丰富的环境3D点云。
激光雷达定位, 主要是激光SLAM算法,跟视觉SLAM一样,也分前端雷达里程计和后端回环检测矫正。
激光SLAM对CPU的消耗,是远远低于视觉SLAM的,鲁棒性更好,更加稳定。以2D激光SLAM为例,它可以在任意时刻得到某个特定高度水平面的2D障碍轮廓,所以在做前端里程计的时候,连续两帧,计算局部的地图轮廓匹配,可以使用相对比较少的计算量获取相对位移。
激光扫描出的点有准确度很高的深度信息,这样在做后端回环优化的时候,不需要优化某个位姿下的观测值(扫描的点云), 而直接优化位姿。
对于视觉SLAM, 不论是单目SLAM 通过三角测量算出的点云深度,还是深度SLAM中获取到的点深度, 有很大噪声在里面,所以优化要对观测点和位姿一起优化调整。
激光做定位的缺点是受环境如雨、雾的影响比较大,对于透明介质也无法得到准确的深度信息。