SLOAM是一个针对于森林场景下的语义激光SLAM,其SLAM的部分与上一篇“基于物体的SLAM”的思路很相似,但是考虑到森林场景的特殊性,并没有引入回环检测的部分。
一、符号规定
在这篇论文中,依然采用的是激光雷达很多约定俗成的量,比如scan和beam等,除此之外,论文用L表示树的集合,上标表示树的数量:
对于激光雷达的扫描,每次scan记为一个p,下面的公式表示的就是一个数据集中有k次scan:
二、树木和地面的检测
这里我们调换一下顺序,先记录检测的部分,这里对应原文的第四章。
首先为了标注数据集方便,作者团队开发了一套vr数据标注工具。
其次是语义标签的获取的部分,既然是基于语义的SLAM,那么按照前面那篇论文的观点,语义信息的获取主要是两种方式,这里用的是比较普遍的神经网络方法,论文将2D的深度图作为网络的输入,这个2D的深度图是通过点云投影而成的,网络部分使用简易版的ERFNET进行语义分割,得到的结果原文说是一个2D的mask,其实也可以看作一个2D的语义图,利用这个mask反向投影回3D的点云空间,就可以得到点云的语义信息标签。
在地面点检测的部分,论文并没有使用神经网络的方法,而是用了启发式的方法。具体来说首先将已经通过神经网络打上树木标签的点去掉,剩下的点就是地面点和灌木等障碍的点,考虑到一般地面点都在其它点的下面,所以将剩下的点中将点云划分为环形的网格,每个网格中选择高度最低的点,这些点就被作为地面点,网格的大小是超参数,需要人为设置。通过这种方法,点变少了但是也变准确了。
得到了树木点,由于SLAM的部分使用的是类似“基于物体”的思想,所以需要将点聚集为一个个体,或者说将同一棵树的点凑到一起。个人感觉论文在这里使用的方法十分巧妙。论文使用了一个trellis graph的方法,直译是格子图,但是个人感觉叫层次图会更加准确一些。
考虑到树木的结构,树木在一张图中出现,一定是在下面某个位置出现,然后从上面某个位置消失,不可能出现中断,因此论文将激光雷达的一线(beam)在一次scan中扫描的结果放在一起,可以看作是同一个高度上的一层,对这一层的点进行聚类,得到的结果当作是这一层的点,用这种方法,将每一层都聚一下。利用前面提到的树的结构,那么两层之间的点如果是一棵树上的,那么位置上的偏差应该不会太大,所以只要不超过阈值就连接上一条边,利用这种方法,我们可以得到一个图结构,按照数据结构的概念,这个图结构本身就是个多个连通分支的森林,对每个连通分支,贪心地选择最短路径作为树干本体。这里的点只是聚类之后的中心点,是一堆点的代表,并不只是一个点,所以根据选择的点,我们可以再恢复为一大堆点,最后凑出来3d点云中的树干。
采用这种方法,还有两个优点,一个是速度快,能够快速给出一个圆柱体的描述,另一个是不会受到树干分叉的影响,可以检测出树的其他部分。
三、语义里程计
这篇论文采用了和LOAM相同的框架,引入语义,实际上其实现和基于物体是差不多思路的,只不过那一篇论文用的物体是静态的车辆、建筑物和柱子,这篇论文里用的是树木和地面而已。
SLOAM依赖于模型中的物体,也可以称为地标,在森林的环境中,可靠的地标是树木和地面。论文将树木和地面以及其投影做了如下的规定:
现在求轨迹的问题就变成了求每一帧之间的位姿变换T,将T整合在一起就变成了整个过程的轨迹变化。
对于一个平面,使用法向量和偏移去表示,也就是一般的平面方程:
那么基于此,点到平面的距离可以写为:
地面特征相当于提供了z轴上的限制,而树木提供的则是xy方向的限制,对于一个树木个体,其需要一个五参数的向量来表示树木所代表的圆柱体:
基于此,点到圆柱体的距离可以表示为:
但是这种距离计算方法在曲率下降的时候会出现问题,所以论文还给出了一种当曲率变小的时候的距离计算方法:
那么现在对于新来的一帧,经过了前面提到的提取,一棵树的点已经可以凑到一起,那么就可以用最小二乘法,得到一个圆柱体的最优表示:
而对于地面的表示方法,受限于森林的环境,大量的地面信息会受到遮挡的影响,所以一些传统的方法会失效。这篇论文提出的方法是将所有标记为地面的点排成一个3×m的矩阵,对矩阵进行奇异值分解,解出来的矩阵的左奇异向量就是地面的法向量,再结合形心就可以写出地面的表达式。
后面就类似于计算一个重投影误差,将上一帧的信息投影到当前帧,然后计算一个累积误差和:
但是这个过程缺少一个匹配的过程,也就是说我们还没有建立当前帧和上一帧点云之间的对应关系,论文提供了两种方法。对于上一帧的一个特征点,根据位姿变换投影到当前帧,对于当前帧的每个特征点,找一个与其最近的投影点,投影点的标签和个体信息,就是特征点的个体信息。另一种方法同样需要投影,区别在于这种方法直接找与之最近的物体。对于这两种方法,显然后者需要存储的开销更少,但是前者更加准确,因此论文选择第一种方法。此外这部分的论文公式有些混乱,而且表述上总感觉哪里不太对,既然要找最近的物体,那么应该就不需要投影点了,然而论文写的是两种方法都要用投影点,这一部分有些奇怪。
至此,就可以写出语义雷达里程计的伪代码了:
总的来说,SLOAM也采用“基于物体”的思想,提出了在森林环境下的语义激光SLAM,语义标签获取的部分,该论文将2D深度图(range image)作为网络输入,利用简化版的ERFNET进行语义分割,得到一个带有标签信息的2D的mask,并反向投影到3D点云上,从而实现语义标签的获取。之后采用启发式方法对滤除标签为树木的点云提取地面点,并对树干个体进行提取,树干个体的提取使用格子图,其思路十分巧妙。之后使用基于语义信息的里程计,这部分使用的思路与“LiDAR-Based Object-Level SLAM for Autonomous Vehicles”很相似,关于语义的用法也是提取为完整物体再进行后续的SLAM过程,只将树干抽象成的圆柱体以及地面点作为特征信息,通过最小化重投影距离,寻找一个最优的帧间位姿变换。