地图构建是SLAM系统中非常重要的部分,一个信息完善的地图对于后续导航相当重要。运动场景中除了静态的元素外也会出现一些例如行人、其他机器人等动态元素,对于导航而言,需要避开但是我们不希望出现在地图模型中,会让机器人认为障碍物的“真实面貌”就是这样,因此我们需要筛选元素,存储到语义图谱中。今天阿chai给大家介绍一种SLAM中动态元素筛选的方法。

1. Main

以下是动态目标筛选的算法流程。

接下来我们详细的讲解一下。

2. YOLOX的动态目标筛选

YOLOX是旷视研究院开源的目标检测算法,赢得了Streaming Perception的第一名。算法是YOLO系列的改进,Anchor- Free,decoupled head、NMS-free以及SimOTA是算法的亮点, COCO 上实现了 50.0% AP,并且提供了ONNX模型,支持TensorRT、NCNN 和 Openvino 的侧端推理部署的版本。

  • 论文:https://arxiv.org/abs/2107.08430
  • 官方demo:https://github.com/Megvii-BaseDetection/YOLOX
  • Tengine版:https://github.com/OAID/Tengine/blob/tengine-lite/examples/tm_yolox.cpp

TFLite、MNN版本的example以及ios上的测试APP私聊阿chai,嘿嘿。

基于YOLOX的动态目标筛选是通过YOLOX检测到可能存在运动的元素,这些元素是优先设置到物体库中,例如人、其他机器人、手推车等。

3. 光流法动态特征点筛选

3.1 Lucas-Kanade


Lucas–Kanade光流算法是两帧差分的光流估计算法,基于三个假设:

  • 灰度不变性:像素的灰度值不会随着帧的跟踪改变。
  • 时间持续性:时间的变化不会引起像素位置的剧烈变化。
  • 空间一致性:场景中相同表面的相邻点具有相似的运动,并且其投影到图像平面上的距离也比较近。

论文:http://cseweb.ucsd.edu/classes/sp02/cse252/lucaskanade81.pdf

首先根据前两个光流的基本假设能得到图像的约束方程,然后进行泰勒展开,联立得到方程组。由于两个未知量所以无法求解,于是根据第三个基本假设设立新的方程带入,同时根据最小二乘策略处理方程组,求的速度矢量。

这里不做有关光流法的详细公式推导,有兴趣的小伙伴可以去阅读paper。

3.2 运动一致性

通过光流法获取匹配的特征点对,并跟据匹配的特征点对计算基础矩阵。然后通过基础矩阵和特征点计算特征点对应的极线,当特征点到极线的距离大于一定值,即判断为动态特征点。

一组匹配的特征点对m1m_{1}m2m_{2}的齐次坐标为:

{m1=[u1,v1,1]m2=[u2,v2,1]\left\{\begin{array}{l} m_{1}=\left[u_{1}, v_{1}, 1\right] \\ m_{2}=\left[u_{2}, v_{2}, 1\right] \end{array}\right.

uuvv是像素的横纵坐标。对于m1m_{1},极线L1L_{1}为:

L1=[XYZ]=Hm1L_{1}=\left[\begin{array}{c} X \\ Y \\ Z \end{array}\right]=H m_{1}

其中HH代表着对应的基础矩阵,m2m_{2}到极线L1L_{1}的距离dd为:

d=m2THm1X2+Y2d=\frac{\left|m_{2}^{T} H m_{1}\right|}{\sqrt{\|X\|^{2}+\|Y\|^{2}}}

当距离大于一定值时m2m_{2}为动态点。

4. 误差分析

视觉里程计的评价标准需要看绝对误差与相对误差。为做误差分析,使用TUM数据集中无运动以及有运动的序列作为分析数据。
绝对轨迹误差:

旋转相对误差:

平移相对误差:

经过测试,在运动目标的序列中动态目标的筛选会降低误差,在静态环境中效果几乎等同于ORB-SLAM。