主要有5个模块:
Sensor data process-----》Visual odometry----》backend(optimization)---》Mapping---》loop closure detection
当前研究状态是视觉SLAM在刚性静态环境中基本得到解决。但是面临运算速度慢,算法不够鲁棒等问题。
VO用于估计帧与帧之间的ego-motion;
Optimization用于handle global trajectory;
Loop closure用于correct相机的drift;
Map用于描述环境。
Feature-based 方法:
Step1:特征提取,当前有FAST corner,SIFT,SURF,ORB等
Step2:特征匹配,有Brute-force or KNN 特征匹配
Step3:估计ego-motion,可以使用PnP或者bundle Adjustment(BA)算法
比如经典的算法 MonoSLAM,PTAM, ORB-SLAM。
目前基于特征的方法是主流方式。
Direct Methods:
最小化两帧之间的灰度之差,这种方法的缺点是相机移动太快,光照变化明显,运算量太大。
该算法可以导出稠密的点云图。比如DTAM,RGBD-SLAM-V2等算法。这些算法一般是需要RGB-D的输入配置的。
还有一种是半稠密的方法,比如LSD-SLAM, DSO, SVO等算法。
视觉里程计之后得到了相机的运动信息和图像的三维信息,那么是否就完美了吗?其实不然,还有如下问题需要考虑:
相机漂移问题,camera drift during motion-----》解决方案是global optimization
环境中的其他部分的不连续问题-----》解决方案是:loop closure或者loop detection
相机在快速运动或者遮挡情况下容易跟丢的问题-----》解决方案:Re-locallization 重定位
目前有两种主流算法,一种是基于滤波器的,准确的说是基于卡尔曼滤波器的,另一种是优化技术,比如bundle adjustment 或者叫束优化技术。
基于滤波的算法:经典算法是EKF。EKF是Extended Kalman Filter。该算法很难表现回环,而且线性化错误比较多。所以当前基本没有在研究了。
基于全局优化的算法:当前主流算法。比如graph-based slam优化或者叫做full-slam。优化图中的节点是优化变量,图中的边是error terms或者constraints。优化变量就是求解的东西,可以是相机的运动情况,也可以是空间点的位置。比如Pose-graph中,优化变量就是相机的pose。
优化的工具有:g2o, ceres, GTSAM etc…
回环的目的就是为了recognize visited place,是为了解决在VO中的累积漂移问题。
Loop closure主要有两种方式:
一种基于Odometry的方法,即如果两个相机的position很靠近,那么可以认为是loop。这种算法假设计算出的相机位置是很准的。反过来看,如果计算的位置很准的话就不会出现相机漂移了,也就不需要回环了。
另一种是基于appearance的方法,即如果两个图形看上去很相似,那么可以认为相机已经重叠,回环确认。这个方法是主流方法。
在appearance-based方法中,关键问题是如何度量两个图像帧之间的相似性。当前的成熟的方法是词袋模型,也叫Bag of words。大致如下:
当然词袋算法不是最好的。如何确定两个图像是否一样,这个问题可以和最近流行的ML结合,比如Auto-encoders,CNN等,就是结合图像分类技术来判断两个图片是否一致。
Map是SLAM的输出,其实没有一个具体的形式,主要取决于SLAM用于什么应用。
目前map主要是两类:一类是metric map,描述每个点是否可以走,另一类是topological map,需要描述空间中的几个地方是否可达,对于可达的目的之间具体如何走是不关心的。
Metric地图和拓扑地图之间的优缺点分析:
地图的一些应用有:
导航
重构