目录
orb-slam官方代码:ORB-SLAM Project Webpage (unizar.es)
ORB-SLAM和后期的ORB-SLAM2。第一个版本主要用于单目SLAM,而第二个版本支持单目、双目和RGBD三种接口。
编译部分有ROS版本和非ROS版本,非ROS版本不需要安装ROS也可以运行,主要针对离线数据集模式。而ROS版本主要针对使用摄像头的在线运行模式。
ORB中vocabulary词袋文件的作用是特征空间的划分和Bag-of-Words Vector的计算。
主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计,或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧。
ORBextractor.CC ORBextractor被用于Tracking
线程对输入图像预处理的第一步。
主要流程如下:
构造函数: `ORBextractor()`
构建图像金字塔: `ComputePyramid()`
提取特征点并进行筛选: `ComputeKeyPointsOctTree()`
八叉树筛选特征点: `DistributeOctTree()`
计算特征点方向`computeOrientation()`
计算特征点描述子`computeOrbDescriptor()`
恒速模型利用速度预测一个位姿,利用位姿做投影搜索,根据匹配结果反过来再优化位姿,能够实现时间开销与准确性的双赢;
参考关键帧跟踪依赖于当前帧的参考关键帧,将地图点的来源由上一帧换为参考关键帧,采用的方法不再是投影搜索了,而是用词袋模型加速过的暴力匹配,虽然是暴力匹配,单一由于词袋模型的划分功能,匹配的范围已经小了很多;
重定位作为最后的救命稻草,将特征来源换为了数据库中和当前帧匹配程度足够大的候选关键帧组,筛选过后利用从关键帧组里挑选出来的特征点进行词袋加速匹配,在更加严格的阈值下得到当前帧的位姿。
主要完成局部地图构建。包括对关键帧的插入,验证最近生成的地图点并进行筛选,然后生成新的地图点,使用局部捆集调整(Local BA),最后再对插入的关键帧进行筛选,去除多余的关键帧,并通过对当前帧的附近关键帧操作,利用视觉 BA 或视觉-惯性 BA 技术来优化地图。此外,在惯性模式下,mapping 线程会利用最大后验估计(MAP)技术来初始化和优化 IMU 参数。
主要分为两个过程,分别是闭环探测和闭环校正。闭环检测先使用WOB进行探测,然后通过Sim3算法计算相似变换。闭环校正,主要是闭环融合和Essential Graph的图优化。
回环检测的关键,就是如何有效地检测出相机经过同一个地方这件事。如果我们能够成功地检测这件事,就可以为后端的 Pose Graph 提供更多的有效数据,使之得到更好的估计,特别是得到一个全局一致的估计。
方式:基于外观(发现当前相机运动到了之前的某个位置附近时,检测它们有没有回环关系),基于几何(仅根据两张图像的相似性确定回环检测关系)。
而由于像素灰度是一种不稳定的测量值,它严重受环境光照和相机曝光的影响。相机视角发生少量变化时,即使每个物体的光度不变,它们的像素也会在图像中发生位移。因此不能简单使用两种图片的范数或者距离衡量相似。
词袋模型(BoW)和构建字典,目的是用“图像上有哪几种特征”来描述一个图像。根据 K-means,我们可以把已经提取的大量特征点聚类成一个含有 kd个单词的字典,k 叉树来表达字典,在查找某个给定特征对应的单词时,只需将它与每个中间结点的聚类中心比较(一共 d 次),即可找到最后的单词,保证了对数级别的查找效率。
两张图片词袋的相似性。利用TF-IDF,思想是,某单词在一个图像中经常出现,它的区分度就高。另一方面,IDF 的思想是,某单词在字典中出现的频率越低,则分类图像时区分度越高。最终每幅图像的BOW由特征点对应的那些单词以及权重组成。
后续。相似性评分归一化,关键帧的处理(用于回环检测的帧最好是稀疏一些,“相近”的回环聚成一类),检测之后的验证(在一段时间中一直检测到的回环,认为是正确的回环;空间上的一致性检测,把运动放到之前的 Pose Graph 中,检查与之前的估计是否有很大的出入。)。