SLAM流程之视觉前端

SLAM(Simultaneous localization and mapping)即同步定位与建图,应用场景一般为机器人导航,场景识别等场景;SLAM的主要实现过程:通过跟踪运动中的相机,估算出来其在每个时刻的位置和姿态,并将相机在不同时刻获取的图像融合重建成完整的三维地图。传统的SLAM可分为视觉前端优化后端两大模块。

视觉前端:

总体概括来说,视觉前端主要完成的任务为:利用运动中的相机在不同时刻获取到的图像帧,通过特征匹配,求解除相邻域之间的相机位姿变换,并完成图像帧之间的融合,重建除地图。视觉前端也是一个局部优化的过程,由于进行优化约束条件仅限于相邻图像帧,因此在相机运动过程中,容易产生误差漂移。

视觉前端主要依赖于机器人搭载的传感器,常用的传感器有相机(单目相机,双目相机,TOF深度相机)IMU(惯性测量单元)激光雷达等,单纯通过视觉传感器(相机)来完成的SLAM又称为视觉SLAM。若使用单目相机作为视觉传感器,优点是成本低,硬件简单,缺点是算法复杂,对相机的运动具有一定的条件要求,因为其通过SFM算法弯沉深度信息的计算,因此若相机在运动时只是发生了旋转而没有发生平移的话,则无法通过三角测量来计算目标的深度信息。由于SFM算法计算出的深度信息并不是真实的深度信息,因为它毕竟不是真正的双目深度重建。

若使用双目相机作为视觉传感器,优点是获取点云数据时,受物体表面材质的反光性质的影响比使用辅助光源的深度传感器方案(如TOF,结构光等)要小,同时其测量距离也相较其他方案要更远,深度图的分辨率更高。缺点是计算复杂度大(计算图像特征及完成特征匹配),同时对于特征的设计具有高鲁棒性的要求。这导致双目视觉SLAM在建立稠密地图(dense map)和算法实时性上具有先天的劣势。

若使用结构光方案的深度相机作为视觉传感器,与双目相机方案大同小异。原理都是利用了双目视差和三角测量,不同之处在于,结构光方案对图像的特征进行了编码,该编码特征在计算和匹配时相比双目相机方案的手工设计特征(如ORB,SIFT等)鲁棒性更好,计算更快,缺点是结构光对物体表面的材质敏感,如果是具有反射、透射性质的表面,或者是漫反射过强的表面,都会出现结构光编码信息的丢失,从而无法正确地匹配特征,导致深度信息的缺失

使用TOF方案的深度相机作为视觉传感器,优点是帧率高,无需通过特征计算及匹配来获取深度信息,因此计算复杂度低,用于SLAM上具有更优的实时性。缺点是同结构光方案,对物体表面的材质比较敏感。此外,TOF相机在图像分辨率和测量距离上,也同结构光方案,不如双目相机的方案

在视觉前端中,主要的任务是完成对相机位姿的估计和建图,这时得到的还是一个局部优化的粗略结果,后续还需要通过后端优化,利用更多约束条件对其进行微调,以获得精确的位姿和地图

估计相机位姿的常用算法是ICP,简而言之是寻找源点集中的每个点在目标点集中的最近邻点作为其对应点,建立起多组对应点。对于每组对应点,都用同一个仿射变换矩阵来描述这组对应点的坐标之间的关系(即旋转和平移关系),建立起一个超定方程组,求解出该仿射变换矩阵。计算出该仿射变换矩阵后,将其应用于源点集上,使源点集整体旋转平移到目标点集上,再计算变换后的各组对应点的坐标的总误差,如果小于给定阈值则停止迭代,如果大于给定阈值,则重复上述过程,直到两个点集的对齐收敛

在SLAM中的做法是,通过ICP来完成相邻帧之间的图像配准进而得到相邻帧之间的相机坐标系之间的旋转平移关系。通常以初始位置的相机坐标系作为全局坐标系,每一帧对应的相机坐标系相对于全局坐标系的旋转平移用于描述该帧对应的时刻的相机的位姿。由于所有相邻帧对之间的旋转平移都可以通过对该相邻帧对进行配准来得到,因此每一帧与第一帧之间的旋转平移也就都可以通过这些中间过程的旋转平移来计算得到,从而得到每一帧的相机位姿

除了通过ICP算法直接对相邻帧的点云进行三维配准,图像配准还可以通过重投影算法来完成: 本质上是最小化重投影误差,即先将当前帧的点云投影到前一帧的相机坐标系中再从前一帧的相机坐标系投影到前一帧的图像坐标系中;同时,前一帧的点云也重投影到其图像坐标系中。通过最小化该图像坐标系上这两个点集里所有对应点对的总误差,来得到当前帧和前一帧的相机坐标系之间的变换矩阵。相邻帧的点云可以使用重投影算法来完成配准,相邻帧的RGB图像也可以使用重投影算法来完成配准,前者称之为几何位姿估计,后者称之为光度位姿估计

相机的位姿由一个旋转变换和一个平移变换来描述。由于相机位姿的求解是一个非线性优化问题,通常的一种求解思路是利用目标函数的梯度下降方向去寻找极值点,即通过不断地调整下降方向和搜索步长,以迭代的方式去逼近极值点

扫描二维码关注公众号,回复: 11300119 查看本文章

在完成了位姿估计后,就可以通过每一帧的全局位姿,不断地将新的图像帧中的点云变换到全局坐标系中,与已重建的全局地图/模型完成融合逐帧地更新重建地图。对于稀疏SLAM而言,在视觉前端中的建图部分至此就结束了。而对于稠密SLAM而言,此时得到的地图不仅是不精确的,而且在可视化上式不够直观的,就是一群离散的点。所以对于稠密SLAM而言,还多了一个步骤就是对地图/模型进行渲染

至此,SLAM流程之前端优化完成了,谢谢各位,若有不足,还请多多指导!

猜你喜欢

转载自blog.csdn.net/Fredric18/article/details/95165501