回环检测的关键:如何有效的检测出相机经过同一个地方。如果成功的检测到可以为后端的位姿图提供更多有效数据,得到全局一致的估计。
回环检测提供了当前数据和所有历史数据的关联,还可以用回环检测进行重定位。
具体方法:
一:基于外观的,和前端和后端的估计无关,仅仅根据两幅图像的相似度确定回环检测关系。
核心问题:如何计算图像间的相似性。
计算准确率和召回率。准确率是算法提取到的所有回环中是真实回环的概率;召回率是真实回环中被正确检测出的概率。SLAM中,对准确率的要求更高,召回率相对宽容点。
二:词袋模型
先介绍词袋(Bags of Words,BOW)的做法,用图像上有哪几种特征来描述一幅图像。
当相机发生少量运动,只要物体在视野中,仍然保证描述向量不发生变化。
该方法分为两个步骤:
step1:字典的生成:
字典由单词组成,单词代表一个概念,与特征点不同,单词是某一类特征的组合。所以,字典生成问题类似于一个聚类问题。
例如,对N张图像提取了特征点,想找出一个有k个单词的字典,即有N个数据,想要归成k个类,①使用K-means方法可以把提取到的特征点聚类成一个含有k的单词的字典,然后思考如何根据图像中的某个特征点查找字典中相应的单词。
②使用k叉数来表达字典。当有N个特征点,希望构建一个深度为d,每次分叉为k的树,做法如下:
在根节点,用K-means把所有样本聚成k类,这样的到了第一层
对第一层的每个节点,把属于该节点的样本再聚成k类,得到下一层。
以此类推,最后得到叶子层。叶子层就是Words.
最终在叶子层构建了单词,而树结构中的中间节点仅供快速查找时使用,这样一个k分支、深度为d的树可以容纳k^d个单词。
feature_training.cpp对十张图片训练了一个小的字典
step2:根据字典计算两幅图像的相似性。
生成字典后,图像可以由特征对应的单词组成的向量表示。如对于一张图像提取N个特征,找到这些特征对应的单词后,相当于得到了图像在词袋中的分布。根据TF-IDF计算图像的相似性。
loop_closure.cpp根据生成的字典计算十张图片的相似度
存在问题:上述相似度结果相差不大,需要增加字典规模(更多的图片进行训练),图像的相似性更明显。
检测到回环的验证:一个方法是建立回环的缓存机制:认为单次检测到的回环并不足以构成良好的约束,而在一段时间内一直检测到回环,才是正确的回环。另一个方法是空间上的一致性检测:对回环检测到的两个帧进行特征匹配,估计相机的运动,然后把运动放到之前的位姿图中,检查与之前的估计是否有很大的出入。
回环检测与机器学习的关系: 词袋模型类似于一个非监督的机器学习过程,构建字典相当于对特征描述子进行聚类,结合深度学习方法对图像特征进行聚类,如BOW模型的改进型式VLAD是基于CNN网络实现的。
平移向量归一化的原因
本质矩阵具有尺度等价性,也就是,分解得到的
和
也有一个尺度等价性。然而旋转矩阵自带约束,认为平移向量具有一个 尺度
。在对本质矩阵分解时,把
进行归一化处理,使它的模长等于一。归一化导致了单目SLAM的尺度不确定性。
单目SLAM需要初始化操作(需要一定程度的平移,不能纯旋转)
单目SLAM中计算空间点的具体位置时通过三角测量方法计算地图点的深度
ORB-SLAM2 回环矫正中用sim3计算回环关键帧之间的相似变换,关于相似变换尺度因子的理解。
尺度因子的物理意义:(单目)在初始化的过程中,将平移向量t
进行了归一化,也就是说令平移向量的模值为1,但它的真实模值并不是1。所以平移向量的真实模值与归一化之后的模值之比就是尺度因子。在将平移向量进行归一化处理后,运用三角化的方式计算特征点的空间坐标(也就是计算特征点的深度),所以尺度因子也可以表示为特征点的真实深度与用归一化平移向量计算出的深度之比。如果系统没有任何误差,那么在整个过程中尺度不会发生漂移。但是由于存在误差,并且误差会进行累计,所以系统运行时间越长,计算出的特征点的深度与特征点的真实深度之比(即尺度因子)就会发生变化。也就是发生了尺度漂移。而且尺度漂移和累积误差是相互影响的,尺度漂移越严重,累积误差越大;累积误差越大,也会导致尺度漂移越严重。
双目相机或深度相机 理论上不存在尺度不确定的问题。从而也就不用考虑尺度漂移的问题。但是相似矩阵在变换矩阵的基础上多了尺度因子,如果能确定相似矩阵那肯定也就能确定变换矩阵。