主要分为以下8部分

  • 数据类型

  • 数据关联

  • 初始化

  • 位姿估计

  • 地图维护

  • 地图生成

  • 失效恢复

  • 回环检测

数据类型

  • 直接法(稠密,半稠密)

基本原理是亮度一致性约束,J(x,y)=I(x+u(x,y)+v(x,y))J(x,y)=I(x+u(x,y)+v(x,y)) ,x,y是图像的像素坐标,u,v是同一场景下的两幅图像I,J的对应点的像素偏移。

起源是光流法,由于使用了图像中大部分的信息,对纹理差的部分鲁棒性比直接法好,但是计算量也加大,要并行化计算。

  • 间接法

就是特征点匹配,一般要考虑到特征点的鲁棒性,对光照,尺度,视角的变化有很好的鲁棒性,还要考虑实时性的。大部分系统使用的是Fast作为特征提取器,

描述子可以是BRIEF,BRISK,SURF,SIFT,也可以是图像块

  • 杂交法

上面两个的结合,直接法用于构建特征匹配,间接法用于优化相机的位姿。

iOS培训,Swift培训,苹果开发培训,移动开发培训

数据关联

数据关联就是在不同图像的观测之间建立匹配关系,这里主要讨论间接法的数据关联,直接法本身摄像头位姿估计就是一种数据关联.间接法有以下几种关联

  • 2D --> 2D

没有地图,没有相机之间的变换,只能做2d--2d的数据关联。对于描述子描述的特征,进行描述子距离的L1范数,L2范数,汉明距离等,

对于区域图像块描述子,通常使用模板匹配中差值平方和(SSD,ZMSSD)

  • 3D --> 2D

前一时刻的位姿估计和3D结构已知,就是pnp的过程,

  • 3D --> 3D

在回环检测的时候,两幅图像中观察到的3D点可以用来求两幅图像之间的相似变换

iOS培训,Swift培训,苹果开发培训,移动开发培训

初始化

一般的初始化流程:

iOS培训,Swift培训,苹果开发培训,移动开发培训

主要是为找到跟第一幅图像有足够数量的特征匹配点,视差足够大的第二幅图像

PTAM初始化要求用户两次输入,来获取地图中的前2个关键帧;需要用户在第一个和第二个关键帧之间,做与场景平行的、缓慢平滑相对明显的平移运动。

SVO使用单应进行初始化,但SVO不需要用户输入,算法使用系统启动时的第一个关键帧;提取FAST特征,用图像间的KLT算法跟踪特征,视差足够的时候就选择作为第二幅图像,然后计算单应矩阵,只能是2维平面

LSD-SLAM从第1个图像随机初始化场景的深度,通过随后的图像进行优化。LSD-SLAM初始化方法不需要使用两视图几何。不像其他SLAM系统跟踪两视
图特征,LSD-SLAM只用单个图像进行初始化

ORB-SLAM 并行计算基本矩阵和单应矩阵,根据对称转移误差(多视图几何)惩罚不同的模型,最终选择最合适的模型

不同的系统使用的初始化方法如下:

iOS培训,Swift培训,苹果开发培训,移动开发培训

位姿估计

通用的位姿估计流程

iOS培训,Swift培训,苹果开发培训,移动开发培训

因为数据关联计算量巨大,大部分SLAM系统都有一个先决条件,即对于每个新图像的位姿,用于数据关联工作都有具体要求和限制。

这个先验信息可能是恒速运动模型,可能是假设运动量不大,使用上一时刻的位姿。

PTAM,DT-SLAM,ORB-SLAM,DPPTAM都假设相机做平滑运动采用恒定速度运动模型,用跟踪到的之前两幅图像的位姿变化估计作为当前图像的先验知识(用于数据关联的图像位姿的要求和限制)。但是,在相机运动方向上有猛烈移动时,这样的模型就容易失效

LSD-SLAM和SVO都假设在随后的图像,相机位姿没有明显改变,因此,这种情况下都是用高帧率相机。

直接和间接方式都是通过最小化图像间的测量误差估计相机位姿;

直接方法测量光度误差(像素值),间接方法通过最小化从图像上一位姿的地图中获得的路标的重投影到当前帧的重投影误差(几何位置)。

iOS培训,Swift培训,苹果开发培训,移动开发培训

地图生成

地图生成的一般流程

iOS培训,Swift培训,苹果开发培训,移动开发培训

地图生成模块将世界表示成稠密(直接)或稀疏(间接)的点云。

系统将2D兴趣点三角化成3D路标,并持续跟踪3D坐标,然后定位相机,这就是量度地图(pose + point)。但是,相机在大场景运行时,量度地图的大小就会无限增大,最终导致系统失效

拓扑地图(pose-graph)可以减少这一弊端,它尽量将地图中的量度信息最小化,减少几何信息(尺度,距离和方向)而采用连接信息。视觉SLAM中,拓扑地图是一个无向图,节点通常表示关键帧,关键帧通过边连接,节点之间存在相同的数据关联

拓扑地图与大场景的尺度比较吻合,为了估计相机位姿,也需要量度信息;从拓扑地图到量度地图的变化并不是一件容易的事情,因此,最近的视觉 SLAM 系统都采用混合地图,局部量度地图和全局拓扑地图。

地图制作过程会处理新路标将其添加到地图中,还检测和处理离群点。图标点的添加可以通过三角化,或者滤波实现的位置估计(一般是逆深度,加上一个概率分布),收敛到一定的程度就可以加入到地图中。

iOS培训,Swift培训,苹果开发培训,移动开发培训

地图维护

iOS培训,Swift培训,苹果开发培训,移动开发培训

地图维护通过捆集调整(Bundle Adjustment)或位姿图优化(Pose-Graph)来优化地图。地图扩展的过程中,新的3D路标基于相机位姿估计进行三角化。经过一段时间的运行,由于相
机累积误差增加,相机位姿错误,系统出现漂移(scale-drift)。

位姿图优化相比全局捆集调整返回较差的结果。原因是位姿图优化只用于关键帧位姿优化,(要是路标相对于的是关键帧表示,而不是世界下的表示,会相应地调整路标的3D结构);全局捆集调整都优化关键帧位姿和3D结构。

地图维护也负责检测和删除地图中的由于噪声和错误特征匹配的离群点。

iOS培训,Swift培训,苹果开发培训,移动开发培训

失效恢复

不管是错误的用户运动(相机位姿的剧烈改变和运动模糊),或者相机观测无特征的区域,还是无法匹配足够的特征,或者其他原因,视觉SLAM系统都会track lost.

一般是视觉词带,pnp

iOS培训,Swift培训,苹果开发培训,移动开发培训

闭环检测

iOS培训,Swift培训,苹果开发培训,移动开发培训

想法

感觉一般的slam按照上面的8个部分,想一遍要能想通,原理上面一般就算是可以了。就剩下代码实践了。

系统有没有特定的要求,大范围的可以吗,室内还是室外,是直接法还是间接法,对应的就是稀疏地图还是(半)稠密地图,优化的是几何误差还是光度误差。

需不需要初始化,需要人工的干预,非2维平面可以吗,对应的就是计算本征矩阵还是单应矩阵。还是基于滤波的方法,不需要初始化,后续优化就可以。

然后就是tracking,因为视觉slam是一个非凸函数,需要一个初始值,对应的就是你的prior是什么,恒速运动模型还是高速相机,把前一帧的位姿当做初始值。

追踪的过程的优化函数是什么,是光度不变,还是几何误差,就是g2o中边,顶点的构造。

当然还要维护地图,地图中的点是怎么表示,基于逆深度,还是欧式几何表示,camera-anchor的表示。地图维护中要进行BA,还是Pose-Graph的优化,还是杂交。

然后就是闭环的检测,基于视觉词带,还是随机取一些帧进行Image Alignment。

当然这其中还有无数细节,运动快,模糊是怎么处理的(加大搜索范围,从金字塔coarse-fine的搜索),Tracking lost在什么情况下发生,怎么进行重定位。

最小二乘法要做几次,怎么时候收敛,要不要给他设个时间约束,权重怎么设置等等。

文献

A survey on non-filter-based monocular Visual SLAM systems

有一个中文版的 《非滤波方法的单目视觉SLAM系统综述》

下一篇我会把SVO,ORB-SLAM,LSD-SLAM的主要代码学习一下


网友评论

更多精彩分享

万码学堂联系方式-Java培训机构,青岛Java培训,青岛计算机培训,软件编程培训,seo优化培训,网络推广培训,网络营销培训,SEM培训,网络优化,在线营销培训,Java培训万码学堂联系方式