rtab-map 相关知识学习
好久之前写的一篇博客,由于那段时间有事就先放一边了,这段时间清理电脑内容,发现了它,干脆花点时间将它补全。
1.在先介绍他的功能时我们先来介绍他的关键模块
内存管理模块:WM(Working Memory)+LTM( Long-Term Memory)
WM:工作内存
LTM: 长期或静态内存
当一个节点被放置到LTM时,它在WM中将不再可用。
“Rtabmap/TimeThr” – rtabmap更新时间超过这个限值时,WM中一些节点将会放置到LTM中以减小更新时间。
“Rtabmap/MemoryThr” – WM能够支持最大数量节点限值。
t
而要确定要传输到LTM的节点,加权机制会识别比其他节点更重要的位置,使用启发式方法,例如观察到的位置时间越长,它就越重要,因此应该留在WM中。
同时,RTABMAP还提供额外的输入模块odometry:使得视觉里程计可以使用多种形式和类型的数据与系统进行连接。
rtab-map的创新思想之一是:假设更频繁的被访问的定位点比其他的定位点更易于形成闭环。这样一个定位点被连续访问的次数就可以用来衡量其易于形成闭环的权重。当需要从WM转移定位点到LTM中时,优先选择具有最低权重的定位点。如果具有最低权重的定位点又有多个时,优先选择被存储时间最长的那一个。(这有点类似一般SLAM的滑动窗口,但是不同的是滑动窗口一旦丢弃某一帧时使不会回收的)
个人认为(也是不知天高地厚的看了几份博客),rtab-map相对于一般的RGB-d SLAM的思想主要体现在他对于闭环检测的特殊性,它是在假设容易形成闭环的定位点一定会比其他的定位点被频繁的访问,这样我们可以用它被连续访问的次数来当成其形成闭环的权重,当WM(工作记忆点)存储过多定位点时(原话是当地图中定位点的数目使得找到定位匹配的时间超过某个阀值时,这是我个人理解),为了减轻工作量,便会将权重较少的定位点放入LTM中相当于回收站,
“转移”:
在我们rtab-map中转移功能,当闭环检测的处理时间超过阀值,具有最低权重的定位点中,存储时间最长的将会被转移到LTM(回收)中,被转移的定位点的数量取决于当前依赖循环中的WM存储的定位点的数量。
取回
但同时,放入回收站LTM里我们也不是全然不管,当一个定位点,通过离散贝叶斯过滤器(一个特殊的称谓),估计发现它有高概率与之前的点形成高概率闭环时,我们就还需要将他不在WM里的相邻定位点,给取回来,由于效率问题,我们每次循环取回时只能拿走两个,那在谁先去谁后去的问题上,我们选择时间相邻的级别会高于空间相邻的级别。
A. 定位点创建 Location Creation(这个定位点便是我们放在LTM和WM中的点)
使用BOW词袋法创建图像的签名,一幅图像的签名由视觉词典中的词的集合表示,是在线增量式(K-means)创建的。
选择增量式的创建方法,而不是采用预先训练好的的词典,好处在于针对一个特定的环境不需要与训练过程。
词袋方法:
第一步:利用SURF算法从不同类别的图像中提取视觉词汇向量,这些向量代表的是图像中局部不变的特征点;
第二步:将所有特征点向量集合到一块,利用K-Means算法合并词义相近的视觉词汇,构造一个包含K个词汇的单词表;
第三步:统计单词表中每个单词在图像中出现的次数,从而将图像表示成为一个K维数值向量
基于opencv从图像中提取SURF特征(阀值超过T(我们自己设置的))来得到视觉单词。(opencv自带函数,我们只需要直接引用就好了)
注意:当提取到的特征的数目很少时(小于阀值T)被认为是一个很差的签名,将不会被用于闭环检测。比如室内一堵白墙的图像。
量化处理(找到词典中已有单词之间的匹配),rtab-map中采用最近邻和次近邻的比率N,如果一个特征到最近邻的距离比到次近邻的距离的T倍数,那么这个特征就能够被其最近邻的特征单词所表示。由四个随机化的kd-tree(FLANN)构成的分类森林来提高最近邻匹配的速率。kd-tree的构建是基于分层k-means聚类的,这样可以减低创建树的时间。
这样一个定位点Lt就可以用签名Zt和时间索引t来创建,初始权重0,并与Lt-1在图中创建一个时间上的双向链接。
在找到新的定位点需要进行 权值更新
为了更新获取到的定位点的权重,将Lt和STM中的最后一个定位点进行比较,相似度s通过该式来衡量
Npair表示定位点签名间匹配上的单词对的数量,Nzt与Nzc分别对应签名Zt与Zc的总单词数目。如果s超过固定的相似度阀值Tsimilarity,则将被比较的定位点Lc被融合到Lt中。融合后的签名中只保存来自Zc的单词,二词典中新增的来自Zt的单词会被删除:Zt被清空,将Zc复制到Zt中。
最后Lt的权重设置为Lc的权重再加1,而且Lc的邻接和闭环链接重新链接到Lt,Lc则从STM中删除。