0. 简介
在复杂动态环境下,如何去建立一个稳定的SLAM地图是至关重要的。但是现在当前的SLAM系统主要是面向静态场景。目前相较于点云的分类与分割而言。视觉的识别与分割会更加容易。这就可以根据语义信息提高对环境的理解。文章《Multi-modal Semantic SLAM for Complex Dynamic Environments》提出了一个鲁棒的多模态语义框架去解决slam在复杂和动态环境下的问题。同时该论文也在Github中开源了数据集和代码。
1. 文章贡献
文中提到,为了减小深度学习分割结果不完整所带来的差异性,文中建议学习更强大的对象特征,并将两次查看和思考的机制部署到主干网络,确保实例分割模型获得更好的识别结果。此外,将纯几何聚类和视觉语义信息相结合,以减少由于小尺度对象、遮挡和运动模糊导致的分割错误的影响。为此文中提出:
- 设计一个强大且快速的多模态语义 SLAM 框架,旨在解决复杂和动态环境中的 SLAM 问题。具体来说,我们将仅几何聚类和视觉语义信息相结合,以减少由于小尺度对象、遮挡和运动模糊导致的分割误差的影响。
- 学习更强大的对象特征表示,并将三思机制部署到主干网络,从而为我们的基线实例分割模型带来更好的识别结果。
2. 具体算法
从上图来看,思路我们还是非常清晰,方便理解的。下图为作者提出的多模态语义SLAM流程图,它主要由四个模块组成,即实例分割模块、多模态融合模块、定位模块和全局优化及建图模块。
2.1 实例分割模块
从第一幅图中,我们可以大致理解整个实例分割模块的流程。即首先一张图片的实例分割结果可以用下面公式表示
{
C
i
,
M
i
}
i
=
1
n
\{C_i,M_i\}_{i=1}^n
{Ci,Mi}i=1n
其中
C
C
C代表实例分割的种类,然后
M
M
M代表了Mask掩码信息,n对应了当前图像中存在的物体数量。然后将整个图像中的空间分成
N
×
N
N × N
N×N 个网格单元。如果一个对象的中心落入一个网格单元,该网格单元负责分别预测类别分支
B
c
B_c
Bc和掩码分支
P
m
P_m
Pm中对象的语义类别
C
i
j
C_{ij}
Cij和语义掩码
M
i
j
M_{ij}
Mij:
下面式子中
λ
λ
λ 是类的数量。
φ
φ
φ 是网格单元的总数。通过这样的一个方式可以有效地避免实例分割漏分,误分的问题。
文中提到为了降低实例分割的计算成本,作者使用精度较低的轻量级版本SOLOv2来实现实时实例分割。同时为了提高分割精度,作者将主干架构从最初的特征金字塔网络(FPN)修改为递归特征金字塔网络(RFP)。
从理论上讲,RFP通过将来自FPN的额外反馈整合到自下而上的主干层中,并灌输了两次或多次查看的思想。这递归地增强了现有的FPN,并提供了越来越强的特征表示。
此外,作者使用SAC (Switchable Atrous Convolution)代替主干架构中的卷积层。 SAC 作为软开关功能运行,用于收集具有不同开口率的卷积计算的输出。因此,能够从 SAC 中学习最优系数,并且可以自适应地选择感受野的大小。这使得 SOLOv2 能够有效地提取重要的空间信息。
2.2 多模态融合模块
为了解决运动产生模糊导致的分割不准的情况,作者首先进行形态学膨胀处理,用于逐渐扩展动态对象的区域边界。形态学膨胀结果标记了动态对象周围的模糊边界。这一步虽然会影响到准确性,但是也避免了重影带来的误检情况。
同时为了避免模糊像素会导致分割错误。因此,作者结合点云聚类结果和分割结果来更好地细化动态对象。这一步通过欧几里得空间的连通性分析补偿了视觉膨胀造成的损失。结合点云聚类结果和分割结果来更好地细化动态对象。
同时提到为了提高分割网络的工作效率,作者首先对激光雷达采集到的三维点云进行降维处理以减少数据规模,并将其作为点云聚类的输入。然后将实例分割结果投影到点云坐标上标记每个点,当大多数点(90%)是动态标记点时,点云聚类将被视为动态聚类。当静态点靠近动态点聚类时,静态点将被重新标记为动态标签。并且当附近没有动态点云时,动态点将恢复为静态点。
2.3 定位与位姿估计
在经过多模态融合后,算法将点云分为动态点云和静态点云,其中静态点云被用于定位和建图模块。
对于每个静态点
p
k
∈
P
S
p_k ∈ P_S
pk∈PS ,可以在欧几里得空间中通过半径搜索来搜索其附近的静态点集
S
k
S_k
Sk。让
∣
S
∣
|S|
∣S∣是集合
S
S
S的基数,因此局部平滑度定义为:
并根据附近的静态点集
S
k
S_k
Sk来综合计算出平滑度
σ
k
σ_k
σk来代表,其中边缘特征的
σ
k
σ_k
σk更大,平面特征的
σ
k
σ_k
σk更小。这也让我们不需要使用SIFT这类算子即可完成静态特征点选取。
然后就是通过最小二乘完成机器人位姿的估算,通过最小化点到边缘和点到平面的距离来计算残差,其中
p
ξ
p_\xi
pξ边缘特征点,而
p
^
ξ
\hat{p}_\xi
p^ξ则代表了局部坐标系下的特征点,通过
p
^
ξ
=
T
∗
p
ξ
\hat{p}_\xi=T*p_\xi
p^ξ=T∗pξ进行转化。
T
T
T表示为当前位姿,而
p
ξ
1
p^1_\xi
pξ1与
p
ξ
2
p^2_\xi
pξ2代表了边缘特征图中最近的两个边缘特征。这样就可以定义出点到边缘的残差为
同理平面特征点也是类似的解法,只是局部平面图中会搜索最近的三个点组成平面,其中变量的定义和上面类似。其实个人感觉就是LOAM的变种,思想基本还是一致的。