• 【优秀论文解读】BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM


    论文简介

    本论文新颖性在于3D激光雷达中实时闭环 且能够实时进行回环矫正 词袋模型为BoW3D 实时构建词袋 效率高 但是鲁棒性未知

    词袋存储

    在这里插入图片描述

    word包含两种变量:Dim_value为描述子计算得到的非零数和Dim_ID为word相对应的维度数 具体的计算可以查看论文:Link3d关键点的计算

    Place Set为一张图片中的word集合 包含两种变量:FrameID为第几帧和DesID为一帧画面中的描述子的ID号、

    Place Set记录了word出现在第几帧中的第几个描述子

    优点:不需要加载额外的单词文件 且hash表的查找需要的时间复杂度很低 对于检索来说大大的提高了效率

    类似于tf-idf的处理方式

    当一个word出现次数过多并且超过了阈值时 认为这个特征比较普通 为了提高检测效率将不对这种word做记录

    tf-idf的处理方式为:
    t f − i d f = n w i n i log ⁡ N n w t f-i d f=\frac{n_{w i}}{n_{i}} \log \frac{N}{n_{w}} tfidf=ninwilognwN
    n w i n_{wi} nwi为单词w在第i帧图片中出现的次数
    n i n_i ni为图片中的单词总数
    N N N所有的图片数 即当前记录了多少帧
    n w n_w nw单词w在所有图片中出现的总次数
    意思是如果单词w出现的次数越多 那么这个w的tf-idf得分就越高 表明这个word不适合用来分类

    本文的做法使用一种类似于tf-idf的方法 目的同样是为了提高检索效率:
     ratio  = N set  / ( N n w ) \text { ratio }=N_{\text {set }} /\left(\frac{N}{n_{w}}\right)  ratio =Nset /(nwN)
    N s e t N_{set} Nset为word对应的place set中包含的place个数(参考上面的图片)
    N N N为place的总数
    n w n_w nw为总的单词数

    如果这个数值高于了阈值 那么这个word对应的place set将不会再被计算

    回环矫正

    构建误差方程:
    r l , c ( R l , c , t l , c ) = 1 2 ∑ i = 1 n ∥ s l i − ( R l , c s c i + t l , c ) ∥ 2

    rl,c(Rl,c,tl,c)=12i=1nsli(Rl,csci+tl,c)2" role="presentation">rl,c(Rl,c,tl,c)=12i=1nsli(Rl,csci+tl,c)2
    rl,c(Rl,c,tl,c)=21i=1n sli(Rl,csci+tl,c) 2
    l l l为回环检测到的历史帧的点云
    c c c为当前帧的点云
    s s s为激光点
    求解R t的方法:
    W = ∑ i = 1 n s ^ l i s ^ c i T \boldsymbol{W} = \sum_{i = 1}^{n} \hat{\boldsymbol{s}}_{l}^{i} \hat{s}_{c}^{i T} W=i=1ns^lis^ciT
    W = U Σ V T W = U\Sigma V^T W=UΣVT
    R l , c = V U T R_{l,c}=VU^T Rl,c=VUT
    t l , c = s , − R l , c s t_{l,c}=s^, - R_{l,c}s tl,c=s,Rl,cs
    s l s c s_ls_c slsc为去中心化的点云坐标 剩下的应该都不用太解释

    检测回环

    1. Link3D的描述子作为输入且维护一个记录该帧每个place出现频率的hash table
    2. 获得每一个Link3D描述子中的word对应的place set
    3. 为每一个place set计算ratio 如果某个单词的频率过高 则直接进入下一次循环
    4. 如果没有大于阈值 则遍历这个单词对应的place set中的每一个place
    5. 如果这个place在hash表中 则该place的频率加一 如果没有出现过 则把这个place加到hash表中
    6. 计算这个hash table中频率最高的place 如果高于了阈值 则认为这一帧是他的回环历史帧

    原文的伪代码:

    在这里插入图片描述

    还有一个更新词典的策略 过于简单 不做文字详解:

    在这里插入图片描述

    优化全部相关变量

    i , j i,j i,j两帧之间的残差定义为:
    r i , j ( T w , i , T w , i ) = ln ⁡ ( T i , j − 1 T w , i − 1 T w , j ) ∨

    ri,j(Tw,i,Tw,i)=ln(Ti,j1Tw,i1Tw,j)" role="presentation">ri,j(Tw,i,Tw,i)=ln(Ti,j1Tw,i1Tw,j)
    ri,j(Tw,i,Tw,i)=ln(Ti,j1Tw,i1Tw,j)
    min ⁡ T { ∑ ( i , j ) ∈ S ∥ r i , j ∥ 2 + ∑ ( i , j ) ∈ L ∥ r i , j ∥ 2 }
    minT{(i,j)Sri,j2+(i,j)Lri,j2}" role="presentation" style="position: relative;">minT{(i,j)Sri,j2+(i,j)Lri,j2}
    minT{(i,j)Sri,j2+(i,j)Lri,j2}

    S S S为所有相邻的边的集合
    L L L为回环检测的边
    全部都会使用Levenberg-Marquadt方法在g2o上优化

  • 相关阅读:
    在HTTP协议层面绕过WAF
    FutureTask源码深度剖析
    【做题打卡】集成每日5题分享(第一期)
    leetcode算法题--二叉树中和为某一值的路径
    python的堆队列(优先队列)
    重写代码实现Flink连接Redis集群(Java版,解决Flink无法连接私有IP Redis集群问题)
    Vue3搭建后台管理系统模板
    SpringBoot集成Activiti7
    C++异常
    AI-数学-高中-43常见函数的导数
  • 原文地址:https://blog.csdn.net/weixin_45485946/article/details/126443177