ORB-SLAM中的地图点策略

ORB-SLAM中的地图点策略

地图点策略

1 平均观测方向

  1. 地图点中维护了一个向量,这个向量代表的含义是关键帧光心到单位方向向量的平均向量
  2. v m e a n = 1 k ∑ i = 0 k v n o r m v_{mean} = \frac{1}{k}\sum_{i=0}^{k}v_{norm} vmean=k1i=0kvnorm,值得注意的是, v m e a n v_{mean} vmean并不是单位向量,而是一些单位向量的平均值
  3. 地图点的平均观测方向给定了一个观测方向的参考,也就是说其他观测到这个地图点的关键帧或者普通帧与参考的这个观测方向之间的夹角不能太大,如果太大就说明这次匹配有误,用于进一步筛选匹配
  4. 值得注意的是,在ORB-SLAM的源码中,将 v m e a n v_{mean} vmean当做了单位向量,我认为这是不对的!!

2 最具代表性描述子

  1. 地图点中还维护了描述子信息,这个描述子是地图点中产生观测的最具代表性的描述子。
  2. 地图点和关键帧之间存在观测信息,即地图点对应了多个关键帧的ORB特征点,相应的对应了多个关键帧之间的BRIEF描述子,而地图点对应的描述子应该是和其他描述子之间存在比较近的距离。
  3. 一般来说,可以用平均值或者中位数来描述某一个描述子与所有描述子之间的距离,在ORB-SLAM中使用的是距离中位数代表某一个描述子与其他所有描述子之间的距离,选择距离最小的描述子作为地图点的描述子
  4. 在构建局部地图后,使用局部地图中的地图点去增加某关键帧或者某普通帧的匹配时,可以根据这个代表性描述子和关键帧或普通帧中特征点描述子来判断距离。在跟踪线程中的跟踪局部地图阶段局部建图线程中新增地图点后的阶段,都需要使用这个代表性描述子来计算地图点和某一个ORB特征点之间的距离进行匹配。

3 最大和最小距离

地图点中还维护了能观测到地图点的最大最小距离(根据图像金字塔计算),最大距离和最小距离的计算方法如下:
d m a x = d × s i d m i n = d × s i + 1 − n \begin{array}{lcl}d_{max}=d \times s^i \\ d_{min} = d \times s^{i+1-n} \end{array} dmax=d×sidmin=d×si+1n
其中, d m a x d_{max} dmax为地图点维护的最大距离, d m i n d_{min} dmin为地图点维护的最小距离, d d d为地图点到参考关键帧的真实距离, s s s为金字塔层级缩放因子在ORB-SLAM中为1.2, i i i为地图点的参考关键帧匹配的特征点的金字塔层级, n n n为金字塔的总层级。计算思路如下:

  1. 之所以采用图像金字塔,主要是在计算FAST角点时,可能会由于尺度原因导致相同的区域,在远处可能不是角点而到了近处变成角点或者说在远处是角点而近处不是角点的情况。
  2. 这里地图点和参考关键帧中的第 i i i层金字塔产生了匹配。当其他帧与当前地图点进行匹配时,如果匹配到的金字塔层级小于 i i i,说明其他帧进行了放大才能和参考关键帧相应的地图点产生匹配,因此认定其他帧光心和地图点的距离要大于参考帧光心到地图点的距离。
  3. 也就是说,当参考关键帧的第 i i i层与其他帧的第0层发生匹配时,其他帧的距离最大,最大为 d × s i d \times s^i d×si。当参考关键帧的第 i i i层与其他帧的第n-1层发生匹配时,其他帧的距离最小,最小为 d × s i + 1 − n d \times s^{i+1-n} d×si+1n
  4. 根据上述的计算思路,可以理解 d m a x d_{max} dmax d m i n d_{min} dmin的含义如下:
    1. d m a x d_{max} dmax:在金字塔层级的极限范围内,能够观测到该地图点的最大距离,超过这个距离,即使产生了匹配,也不准确;
    2. d m i n d_{min} dmin:在金字塔层级的极限范围内,能够观测到该地图点的最小距离,小于这个距离,即使产生了匹配,也不准确。

在ORB-SLAM中,地图点维护的最大和最小观测距离的作用如下:

  1. 在产生匹配后,可以使用最大和最小距离进行筛选匹配,去掉哪些超过金字塔观测极限的匹配。
  2. 在进行匹配前,如果知道地图点到关键帧之间的距离,可以初步预测金字塔层级
    1. 金字塔层级限定策略:可以根据预测的这个金字塔层级进行匹配特征点的金字塔层级限定(ORB-SLAM中进行了加一级和减一级的缩放,匹配3层,这是普通帧使用的策略
    2. 窗口大小限定策略:可以根据预测的这个金字塔层级的先验信息,进行重投影匹配的窗口大小限定(ORB-SLAM中层级越大,窗口搜索越大,关键帧只使用这个策略
    3. 普通帧同时使用层级限定策略窗口大小限定策略,而关键帧仅仅使用窗口限定策略

4 地图点添加策略

地图点的添加主要发生在两个阶段,一个是跟踪线程的初始化地图阶段,另一个是局部建图线程的新地图点创建阶段。

  1. 地图初始化阶段:在跟踪阶段,使用上一帧和当前之间的特征点匹配、变换矩阵求解和恢复运动的方式得到匹配的特征点对
    1. 使用不使用金字塔的窗口匹配,得到当前帧和上一帧特征点之间的匹配。
    2. 对特征点进行归一化, T N p = [ s X 0 − s X M e a n ( X ) 0 s Y − s Y M e a n ( Y ) 0 0 1 ] T_{Np}=\begin{bmatrix} s_X & 0 & -s_X Mean(X) \\ 0& s_Y &-s_Y Mean(Y)\\ 0& 0&1\end{bmatrix} TNp= sX000sY0sXMean(X)sYMean(Y)1 ,其中 s X = 1 / ( 1 N ∑ i = 0 n a b s ( X i − M e a n ( X ) ) ) s_X=1/(\frac{1}{N}\sum_{i=0}^{n} abs(X_i - Mean(X))) sX=1/(N1i=0nabs(XiMean(X))),$ s_Y=1/(\frac{1}{N}\sum_{i=0}^{n} abs(Y_i - Mean(Y)))$。
    3. 根据归一化后的匹配进行H矩阵和F矩阵的求解,并根据矩阵恢复运动结构。
    4. 使用SVD分解的方式进行三角化。
  2. 新地图点创建阶段:在局部建图阶段,对当前关键帧和前20最优共视关键帧进行词袋匹配和极线约束来探索新的匹配。
    1. 找到与当前关键帧产生最优共视的20个关键帧
    2. 对这些关键帧和当前关键帧中没有匹配的部分进行词袋匹配,并使用极线约束进行筛选
    3. 对新生成的地图点进行SVD分解方式的三角化。

5 地图点删除策略

发生地图点删除的只有一个阶段,就是局部建图线程中,删除最近添加的局部地图点。

  1. 地图中被设置为bad的地图点,在地图中删除;
  2. 在跟踪线程中,被发现的比例小于0.25,在地图中删除;
  3. 不是前两次局部建图创建的地图点,并且观测数目小于2,在地图中删除;
  4. 如果当前关键帧id和地图点创建id相差3,说明在前2次地图点删除过程中,没有删除掉该地图点,是稳定的地图点,局部建图线程不会再进行删除,永久保留
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值