• 视觉SLAM——特征点法与直接法对比以及主流开源方案对比 ORB LSD SVO DSO


    前言
    单目视觉SLAM可以根据其前端视觉里程计或是后端优化的具体实现算法进行分类:前端可以分为特征点法与直接法,后端可以分为基于滤波器和基于非线性优化。其中在后端上目前已经公认基于非线性优化的方法在同等计算量的情况下,比滤波器能取得更好的结果。而前端的两种方法则各有优劣。

    本文将具体分析直接法相较于特征点法的优劣处,并具体介绍目前主流的开源方案,以供大家参考。

    直接法与特征点法的对比
    “ 直接法最大的贡献在于,以更整体、更优雅的方式处理了数据关联问题。特征点法需要依赖重复性较强的特征提取器,以及正确的特征匹配,才能得正确地计算相机运动。而直接法,则并不要求一一对应的匹配,只要先前的点在当前图像当中具有合理的投影残差,我们就认为这次投影是成功的。而成功与否,主要取决于我们对地图点深度以及相机位姿的判断,并不在于图像局部看起来是什么样子。”

    优势:
    1)节省特征提取与匹配的大量时间,易于移植到嵌入式系统中,以及与IMU进行融合;
    2)使用的是像素梯度而不必是角点,可以在特征缺失的场合使用,如环境中存在许多重复纹理或是缺乏角点,但出现许多边缘或光线变量不明显区域;
    3)可以进行稠密或半稠密的地图重建;

    劣势:
    1)灰度不变是一个强假设,难以满足(易受曝光和模糊影像);
    2)单像素区没有区分度,需要计算图像块或是相关性;
    3)直接法成功的前提,是目标函数从初始值到最优值之间一直是下降的,然而图像非凸。因此需要有一个相当不错的初始估计,还需要一个质量较好的图像;
    4)难以实现地图复用、回环检测、丢失后的重定位等:除非存储所有的关键帧图像,否则很难利用先前建好的地图;即使有办法存储所有关键帧的图像,那么在重用地图时,我们还需要对位姿有一个比较准确的初始估计——这通常是困难的。

    数据关联和位姿估计,在直接法中是耦合的,而在特征点法中则是解耦的。耦合的好处,在于能够更整体性地处理数据关联;而解耦的好处,在于能够在位姿不确定的情况下,仅利用图像信息去解数据关联问题。所以直接法理应更擅长求解连续图像的定位,而特征点法则更适合回环检测与重定位。此外,稀疏直接法更适用于实时性较高而计算资源有限的场合。

    常用开源方案对比
    MonoSLAM
    2007年提出,是第一个实时单目SLAM系统。
    前端:追踪非常稀疏的特征点(Shi-Tomasi角点);
    后端:扩展卡尔曼滤波,以相机当前状态和所有路标点为状态量,更新其均值和方差。

    缺点:应用场景很窄;路标数量有限;稀疏特征点容易丢失;存在EKF所存在的局限性。

    PTAM
    2007年 Parallel Tracking and Mapping
    前端线程(Tracking):通过匀速运动模型预测当前帧方位,搜索FAST角点,并根据匹配关系优化帧方位,若跟踪失败开始重定位,跟踪成功则判断是否满足关键帧条件。
    后端线程(Mapping):沿极线匹配不同关键帧之间的图像特征点,通过三角化恢复三维位置,并对所有关键帧和三维点运行BA。

    特点:
    1、提出并实现了跟踪和建图过程的并行化,首次区分出前后端的概念。
    2、第一个使用非线性优化,引入了关键帧机制:把几个关键图像串起来,然后优化其轨迹和地图。
    3、PTAM同时是一个增强现实软件:根据估计的相机位姿,可以在虚拟的平面上放置虚拟物体。

    缺点:场景小,跟踪容易丢失。

    ORB-SLAM
    2015年提出。
    关于ORB-SLAM更多的分析将单独开一个博客来讨论。

    三线程的SLAM方案:
    Tracking线程:对新来的图像提取ORB特征点,并与最近的关键帧进行比较,计算特征点的位置并粗略估计相机位姿;
    Local Mapping线程:求解BA问题,包括局部空间内的特征点和相机位姿;
    Loop Closing (and Full BA)线程:对全局的地图与关键帧进行回环检测,消除累计误差,优化只有相机位姿组成的位姿图。

    特点:
    1、支持单目、双目、RGBD,具有良好的泛用性;
    2、ORB特征:不像SIFT和SURF那样费时,相比Harris角点又具有良好的旋转和缩放不变性;ORB提供描述子,在大范围运动时能进行回环检测和重定位;
    3、单目具有自动选择系统初始化方案:基于对极几何还是基于单应性;双目和RGBD的初始化很快,且原地不动就能完成
    4、关键帧的选取:先用宽松的判断条件加入新的关键帧和三维点以保证后续帧的鲁邦跟踪,再删除冗余关键帧和不稳定三维点以保证BA效率和精度。
    5、回环检测防止累计误差。在运行前必须加载一个很大的ORB字典文件;

    优点:
    1、在静态环境下定位准确,系统非常稳定, 单目和双目版本都可以达到实时;
    2、代码可读性强,易扩展, 网上也有实现和imu融合的版本。

    缺点:
    1、计算ORB特征耗时,三线程结构,cpu消耗大,难以移植到嵌入式设备;
    2、稀疏特征点地图;
    3、对动态物体很敏感,有动态物体时非常容易跟踪失败;
    4、纯旋转也容易丢失。

    LSD-SLAM
    2014年 Large Scale Direct monocular SLAM

    将直接法应用到了半稠密的单目SLAM中
    1、提出了地图梯度与直接法的关系,以及像素梯度与极线方向在稠密重建中的角度关系;
    2、在CPU上实现了实时半稠密场景的重建;
    3、具有回环检测功能;
    4、一些技巧保证追踪的实时性与稳定性:
    在极线上等距离取5个点,度量其SSD;深度估计时,首先用随机数初始化深度,在估计完后又把深度均值归一化以调整尺度;度量深度不确定性时,不仅考虑三角化的几何关系,还考虑了极线与深度的夹角,归纳成一个光度不确定项;关键帧之间的约束使用了相似变换群及与之对应的李代数显式表达出尺度,在后端优化中可以将不同的尺度的场景考虑进来,减小尺度漂移现象。

    缺点:
    1、对相机内参和曝光非常敏感
    2、在相机快速运动时容易丢失
    3、依赖于特征点的方法进行回环检测

    SVO
    2014年 Semi-direct Visual Odemetry
    基于稀疏直接法的视觉里程计:
    SVO跟踪了一些关键点(角点),然后像直接法那样根据关键点周围的信息(4*4小块进行块匹配)估计相机运动及其位置 。

    优点:
    1、速度极快,适用于计算平台受限的场合
    2、提出了深度滤波器的概念,推导了基于均匀-高斯混合分布的深度滤波器,用于关键点的位置估计,并使用了逆深度作为参数化形式。

    缺点:
    1、误差大,不准确
    2、目标应用平台为无人机,相机运动主要为水平和上下移动,在平视相机中表现不佳。如单目初始化时使用了分解H矩阵,需要假设特征点位于平面上;在关键帧选择时,使用了平移量作为确定新的关键帧的策略,而没有考虑旋转量。
    3、舍弃了后端优化和回环检测功能,没有建图功能。

    DSO
    2016年 DSO(Direct Sparse Odometry)
    慕尼黑工业大学(TUM)计算机视觉实验室发布的一个稀疏直接法的视觉里程计。

    后端使用一个由若干个关键帧组成的滑动窗口。除了维护这个窗口中的关键帧与地图点外,还会维护与优化相关的结构。特别地,这里指Gauss-Newton或Levenburg-Marquardt方法中的Hessian矩阵和b向量(仅先验部分)。

    提出了光度标定,认为对相机的曝光时间、暗角、伽马响应等参数进行标定后,能够让直接法更加鲁棒。对于未进行光度标定的相机,DSO也会在优化中动态估计光度参数。

    优点:可以生成相当稠密的点云,速度在正常运行的时候很快

    缺点:
    1、对场景光照要求高,要求尽量保持曝光时间的稳定
    2、不是个完整的SLAM,它没有回环检测、地图重用、丢失后的重定位。
    3、初始化部分也比较慢,当然双目或RGBD相机会容易很多。
    4、代码可扩展性比较差

    DSO在准确性,稳定性和速度上都比LSD好。LSD的优势在于回环检测。

    参考
    1、刘浩敏 , 章国锋、鲍虎军. 基于单目视觉的同时定位与地图构建方法综述
    2、高翔《视觉SLAM十四讲》
    3、高翔的知乎文章《DSO详解》

    原文链接:https://blog.csdn.net/qq_41839222/java/article/details/86483071

  • 相关阅读:
    C++ Boost 函数与回调应用
    C++ Boost库 操作字符串与正则
    C++ Boost库 实现命令行解析
    PHP 开发与代码审计(总结)
    c strncpy函数代码实现
    c strcat函数代码实现
    c strcpy函数代码实现
    c strlen函数代码实现
    Java-IO流-打印流
    Java-IO流-文件复制2
  • 原文地址:https://www.cnblogs.com/Ph-one/p/13100630.html
Copyright © 2020-2023  润新知