SLAM,自动驾驶,自动驾驶技术

IMLS-SLAM:基于scan-to-model方法的大场景3D激光SLAM

IMSL-SLAM 和 IMSL-SLAM++是kitti数据集上仅次于LOAM的激光SLAM系统,虽然它有一个最大的缺点,就是不实时,而且时间确实非常慢(1.3s)。

论文题目:IMLS-SLAM: scan-to-model matching based on 3D data

IMSL-SLAM 和 IMSL-SLAM++是kitti数据集上仅次于LOAM的激光SLAM系统,虽然它有一个最大的缺点,就是不实时,而且时间确实非常慢(1.3s),但是作者也给出了这种不实时的原因,是可以改进的。更重要的是,论文里以IMLS曲面为基础进行的scan-to-model匹配方法是值得借鉴的,有必要进行了解,所以我们在这里一起探讨这篇论文。

一、整体思路

即使不看论文,我们也应该清楚,作为一个SLAM系统来讲,它的整体思路基本包含以下几方面:

1)处理点云。包括去畸变,移除离群点,高级点可以移除动态物体

2)对点云采样。一般都不会用全部点的,具体采样方法主要取决于自己的匹配方法

3)建立地图。可以是特征地图,可以是点云直接拼接的地图,也可以是曲面模型

4)匹配。把点云和地图进行匹配,更新位姿

5)更新地图。根据新的点云,对地图进行更新。更新频率和策略一般也取决于匹配方法

本文的SLAM方法作为SLAM的一种,自然也遵循这个规律。所以以上五点就是它的整体思路。

另外,以上五点是概括性的,包含了多种选择性,而本文的方法属于其中基于曲面的地图匹配方法,所以建立地图和地图更新就主要是曲面更新,匹配就主要是和曲面的数据关联以及优化。

下面对各个点分别介绍

二、实现方法

1.处理点云

这篇论文在处理点云上所加的措施是移除了一些离群点和动态物体。它所采用的做法是先提取地面,然后对剩下的点云聚类,小于一定尺寸的聚类(14m×14m×4m)就全部去掉。

好暴力啊!

这种自然能把移动物体去掉,正常交通路面上,能移动的物体一般也不会大于这个尺寸,但是这种宁可错杀一千也不放过一个的做法显得有点粗暴,周围点云少的时候,再错误去掉了一些非动态的点云,效果自然不会太好。

移除动态物体有很多方法,聚类是第一步,在聚类之后如果加上一些跟踪和判断,只移除真正运动的物体,会更合适一些。

2. 对点云采样

这一步比较有意思。

在以前的改进版ICP中,提取点的特征的时候往往都是先计算协方差矩阵,然后对矩阵计算特征值,根据特征值对特征分类,同时提取主轴方向,根据主轴方向和特征值进行点的筛选。

作者认为这样不好,值得拥有更好的。

他认为,首先主轴方向应该为车的方向,也就是雷达的方向,其次,提取点是为了匹配得到位姿,不同的点对位姿精度的贡献不一样,如果能直接提取出对位姿贡献大的点,那么不就既可以很大程度上减少点的数量,又可以取得很好的精度吗。

所以,这个问题就演变成了,怎样去判断哪些点对位姿精度贡献大,对算法来讲,就是设计一些指标,去把这些点筛选出来,下面这几个公式就是作者筛选的九个指标

关于这九个指标,作者的解释是前六个是点对姿态精度贡献的定量评价,后三个是对位置精度贡献的定量评价。至于为什么,我也没想太清楚,有没有大神指点下?

总之,作者对每个点都计算九个量,就得到了九列值,然后对这九列值排序,找出对位姿影响最大的那些点,就完成了筛选。

这里有一张图,展示它的筛选方法,其中红色的点就是筛选过的点。

3. 建立地图

首先,作者使用的地图是曲面地图,关于曲面地图的简介和历史,在以前介绍SuMa-SLAM的时候已经介绍过,这里给出链接,不再详述了。

激光SLAM|SuMa:基于Surfel地图的室外大场景SLAM


IMSL:《Provably good moving least squares》由于KinectFusion使用的TSDF曲面表示方法不适合大场景,所以使用了IMSL曲面表示方法。作者对这个方法并没有做什么改进,只是使用,所以我们给出文章题目,感兴趣的可以去看论文。

MSL:《Mesh-Independent Surface Interpolation》(IMSL的前身)

4. 匹配

毕竟scan-to-model嘛,所以就是scan和曲面地图之间做数据关联然后优化。

这里用三个公式来表示匹配原理

其中前两个是对点做映射,最后一个是根据位姿计算残差,有了残差去优化不就是修正误差,得到匹配的精确姿态了嘛

5. 更新地图

更新地图就是把原有地图章没有,而新的点云中有的东西加入地图中去。同时注意的是,为了匹配时和scan进行数据关联,要对地图进行KD树存储,目前的做法是每次更新完就重新建立KD树,显然这种做法比较耗计算量,这也是整个步骤中耗时最长的一步。所以设计增量式KD树是有必要的,即每次根据删除的老点和增加的新点更新KD树,而不是重新建。

三、实验效果

他和LOAM比,在他自己的实验中,性能是优于LOAM的,但是在kitti的榜单中,却落后于loam。而且还有一个现象,这里loam的指标和kitti榜单公布的指标是基本吻合的,而作者的SLAM在kitti上的指标却没有这个论文里的好,即使后来的改进版本IMSL-SLAM++也没达到这种水平。

经各位大佬的指点,原因可以归结为以下几方面:

1)kitti分训练集和测试集,榜单上是测试集的结果,论文中是训练集的结果,所以出现不一致的现象,而且一般训练集要比测试集精度高。

2)loam开源出来的是老版本,榜单上是新版本,做了很多改进,所以,如果loam新版本再用训练集做一次测试,精度会比表格中给出的要高很多。

四、关于效率

在效率方面,它的时间实在是太长,IMSL-SLAM是1.25S,IMSL-SLAM++是1.3S,在这一点上,作者也给出了自己的解释,主要包括两方面

1)他使用扫描的三维点云计算每次扫描的法向,而不是使用论文《Fast and accurate computation of surface normals from range images》中的方法,而后者比前者快17倍,至于为什么不用,他说是因为Kitti数据集只提供三维点云,而不提供原始激光雷达数据。这个理由略显牵强,而且这一步只消耗了0.2s,不是时间的大头

2)就是刚才提到的更新地图时KD树的事,这一步消耗1.0s,所以改进这一步去提高效率倒是可取的。

关注自动驾驶之家微信公众号

扫描关注,获取干货

文章来源:任乾 / 文章作者:知乎  →技术
声明:本文来源“任乾”作者“知乎”,版权归作者所有,不代表自动驾驶之家官方立场。转载请注明出处、作者和文章链接,如果有侵权,请联系删除。
收藏