Carto的目的是为了用slam代替CAD,从而迅速,准确的描述出建筑物的二维或三维结构图。这篇文章的创新点在于提出了一种实时的根据雷达数据进行闭环检测的方法,从而能够进行数万平方米的SLAM。
scan-to-scan累积误差太快。scan-to-map的扫描匹配(指的是Hector SLAM)的方式应用Gauss-Newton找到最优匹配,需要高频率的雷达。这种匹配挺准确,鲁棒。但是没有处理累积误差。Carto通过图优化的方式进行优化消除累积误差。
通过背包装置能够实现实时地5cm分辨率的二维栅格地图。通过扫描匹配将scan插入到submap中,这个过程会累积误差。
当submap完成之后,就不在插入新的scan了,并将submap应用到闭环检测中。就是在submap中找当前scan的匹配程度,找到了就添加一个闭环约束到图结构中。闭环检测几秒进行一次,也算是实时了。在查找的过程中应用branch-and-bound(分支定界法)加速寻找。
这部分不细说了,就是Hector SLAM的处理过程。之后会写一个Hector SLAM的理论过程和代码分析,现在提供几个链接仅供参考。
https://blog.csdn.net/nksjc/article/details/72779564
https://blog.csdn.net/roadseek_zw/article/details/53379896
https://www.cnblogs.com/cyberniklee/p/8484104.html
大致说一下流程,首先介绍了scan与submap的概念。然后说hit 和 miss 进行栅格地图的构建。
这里提一下,Carto有个处理是将超过雷达最大值的点或者是Nan的这种点用了一个距离值代替,如10m ,这就保证了只有检测到东西的时候才会更新栅格地图,距离过大或者nan的情况都只更新10m的栅格地图,这就使得地图的边界非常整齐,不会有很多飞出去的白色块。
scan-submap的扫描匹配,通过将scan旋转平移,根据当前地图给scan的末端赋值,然后将这个值与地图做最小二乘,(也就是1-MT = 0,如果匹配的话二者应该重合,所以M值相减应该得0)通过ceres进行求解,应该是高斯牛顿(没看代码呢不太清楚)。在给scan赋值的过程中,Hector是使用双线性插值,这个过程可能会导致问题(啥问题忘了),所以Carto对这个过程进行改进,使用双三次插值进行赋值,避免了那个问题。
扫描匹配会逐渐累积误差,但是对于一小段连续的扫描,累积的误差是很小的。使用Sparse Pose Adjustment进行所有scan和submap的优化。submap不再改变了就会参与闭环检测。闭环检测的scan match后台进行。
A 闭环检测的寻找类似于扫描匹配。之后介绍了目标函数。(谁的目标函数有点不清楚)
B 分支定界的扫描匹配
首先说了最初的搜索是在一个搜索空间中逐步搜索,介绍了一大堆Naive algorithm 1。然后说我们没用这个,用的是分支定界的方法,也就是Algorithm 2 。
主要思想是将所有的可行解作为叶子节点,也就是最底层的节点。根节点代表所有可行解的集合。然后对每个子节点(包括叶节点)进行打分,如果得分没有超过当前最高分,则这个子树不存在最优解,直接将这个节点及其子节点删除。只有在节点的分数超过当前最高分的情况下才继续向下搜索,对其每个子节点再进行打分。
每个节点都是一个可行解,最上层集合的步长最大,最下层集合的步长最小。树结构的每层对应了一个分辨率的地图,树的最上层对应着size为64的地图,最下层对应这size为1的地图。在搜索时采用了深度优先搜索,并设置了一个阈值,低于这个阈值的匹配得分直接舍去。
对所有可行解进行分支。第h层共有 2的h次幂 乘以 2的h次幂 这么多个 节点。也就是说,第0层为1,第1层有 2种x 与 2种y 的选择,一共4个。直到最下一层代表所有的可行解。(具体的可行解的结构要看代码)
搜索的分数阈值的最大值,只有超过了这个值的节点才继续向下进行搜索,并将下一层的节点按分数进行排序,分数最高的在最左侧。
对得分最高的节点分支,对其的子节点进行搜索,直到找到叶节点为止,如果叶节点的分数高于阈值,则将阈值更新为叶节点的值,否则将搜索倒数第二层的下一个节点。深度优先。
为了更有效的计算分数,在之前已经生成了多分辨率地图,在计算得分时只要计算雷达数据与地图的匹配的得分即可。
工作站:Intel Xeon E5-1650 3.2Ghz。服务器级别的cpu
内存:猜测是32G的内存。忘了从哪里看到,跑博物馆那个数据集用了25G的内存,因为所有的Submap都放在内存中了,所以Carto很耗内存,在我自己的实验中,室外环境下跑25Hz的倍加福雷达20分钟录的bag,需要6个G的内存。
用激光笔测量测量5条直线墙壁的距离,以及测量地图的像素距离进行换算,比对2者的距离偏差。
实验B:最小偏差1cm(4m的边),最大偏差11cm(15m的边),最大偏差百分之0.8。
实验C:跑数据集,每个数据集都配置了一份对应的配置文件。
表4提供了闭环检测的准确率(包括true and false positives)。准确率还是很高的,除了一个77的,剩下都是百分之98左右。之后提了为什么会有个77准确率的原因,是因为Huber loss 的尺度因子和分数没设置好。
我们的闭环检测能够实时进行,SLAM的效果很好,确实也很好。