SfM、VO和SLAM介绍

一家之言,仅作分享,如有不合理或需要改进的地方,欢迎各位讨论。

前言

    在自动驾驶地图定位模块的功能开发中,主要研究方向分为三种:建图、里程计、定位。SfM(Structure From Motion)即 传统三维重建,它更注重的是建图;VO(Visual Odometry)或VIO(Visual-Inertial Odometry)要解决的问题就是里程计问题,与机器人领域不同,在实际自动驾驶项目中,里程计部分是由惯导,轮速计,视觉,激光等多传感器融合完成;SLAM(Simultaneous Localization And Mapping)同时建图与定位,它更注重的是定位。

SfM,运动恢复结构

在这里插入图片描述

    顾名思义,SfM是通过相机的运动来进行三维重建。这里,需要用到对极几何的理论知识,在我的博客视觉里程计-对极几何中,有简单的入门介绍。这里,简单讲述一下SfM的流程。

  • 特征检测与匹配。在我的博客视觉SLAM–ORB特征简介中,介绍了多种特征点以及特征匹配的实例代码。
  • 对每一对完成特征匹配的图像,估计基础矩阵F或本质矩阵E。
  • 根据本质矩阵分解得出R,t,估计相机运动。
  • 三维点云计算。得出两帧图像的相对运动后,利用三角化得出特征点的深度。
  • 计算多帧图像的重投影误差。将同一特征点的三维信息坐标转换至图像坐标系下,确定该值与实际图像感知的点的距离差。
  • BA优化。利用BA同时优化地标位置与相机位姿,解决非线性优化问题,可用ceres,类似方法可以参考我的博客Ceres解决实车SLAM后端优化问题

视觉里程计

    视觉里程计主要有两大方法:直接法和特征点法
特征点法:

  • 当相机为单目时,我们只知道 2D 的像素坐标,因而问题是根据两组 2D 点估计运
    动。该问题用对极几何来解决。
  • 当相机为双目、RGB-D 时,或者我们通过某种方法得到了距离信息,那问题就是根
    据两组 3D 点估计运动。该问题通常用 ICP 来解决。
  • 如果我们有 3D 点和它们在相机的投影位置,也能估计相机的运动。该问题通过 PnP
    求解。

    在实际自动驾驶项目中,作者用到的最多的方法是ICP,在我的博客多种形式ICP问题的ceres实例应用中,提供了多种作者在实际应用中的ICP方法的C++代码。
    虽然特征点法在视觉里程计中处于主流地位,但同时它也有一些不足:

  • 关键点的提取与描述子的计算非常耗时。
  • 使用特征点时,忽略了除特征点以外的所有信息。针对相邻帧的运动估计而言,这样做会丢失了大部分可能有用的图像信息。
  • 相机有时会运动到特征缺失的地方,往往这些地方都没有什么明显的纹理信息。这里额外提一句,在实际项目中,在这样没有明显特征的地方,正如上文提到的,可以利用IMU与轮速计进行航位推算。

    针对上述问题,直接法直接根据像素亮度信息,估计相机的运动,可以完全不用计算关键点和描述子。于是,直接法既避免了特征的计算时间,也避免了特征缺失的情况。只要场景中存在明暗变化(可以是渐变,不形成局部的图像特征),直接法就能工作。
    直接法是从光流演变而来的。光流描述了像素在图像中的运动,而直接法则附带着一个相机运动模型。在直接法中,有一个重要假设,灰度不变假设,同一个空间点的像素灰度值,在各个图像中是固定不变的。而这也是直接法的关键不足的地方。
在这里插入图片描述

SLAM

    SLAM问题的本质是对主体自身(位姿)和周围环境空间(点云)的不确定性的估计。它要求解决是同步建图与定位问题,重点是定位。
在这里插入图片描述

  1. 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。在自动驾驶车辆中,还有轮速计、惯性传感器等信息的读取和同步。
  2. 视觉里程计 (Visual Odometry, VO)。视觉里程计任务是估算相邻图像间相机的运动,以及局部地图的样子。VO 又称为前端(Front End)。
  3. 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后,又称为后端(Back End)。
  4. 回环检测(Loop Closing)。回环检测判断车辆是否曾经到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。
  5. 建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。

在这里,会发现SLAM与SfM本质其实是一样的,都是有特征检测,运动估计,非线性优化误差求解位姿地标等。区别的话,主要有两点:

  • SLAM是有序的图像序列,一般通过前后帧间匹配和局部窗口法,只有回环检测时需要进行图像间的匹配;基于图像的SfM不要求实时,数据是无序的,可以一次输入所有图像,利用所有信息。
  • SLAM是个动态问题,会涉及到滤波,运动学相关的知识,而SfM主要涉及的还是图像处理的知识。

实际问题解决方案

作者在实际自动驾驶SLAM问题中,更推荐的方法还是基于深度学习完成图像语义特征的检测,将特征转换为三维信息后,利用ICP估计位姿变化。具体方案可以结合我之前对两篇论文的阅读心得,分别是
停车场场景【论文阅读】AVP-SLAM Semantic Visual Mapping and Localization for Autonomous Vehicles in the Parking Lot
大范围的城市场景【论文阅读】RoadMap: A Light-Weight Semantic Map for Visual Localization towards Autonomous Driving
自己利用激光雷达处理的大场景问题大范围室外环境三维激光点云SLAM建图

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SFM(Structure from Motion)和SLAM(Simultaneous Localization and Mapping)是计算机视觉和机器人领域中的两个重要研究方向。 深入SFM,首先要了解其基本概念。SFM是一种从图像序列中重建三维场景的方法。它通过分析图像中物体和摄像机的运动来推导出场景的结构和摄像机的轨迹。在SFM中,我们使用了特征点匹配、三维点云重建等技术来实现场景的重建。此外,SFM还可以用于姿态估计、虚拟现实等领域。 在学习SFM时,我们需要掌握深度学习技术和计算机视觉基础知识。了解深度神经网络、卷积神经网络、循环神经网络等深度学习模型对于理解SFM中的特征点检测、匹配和姿态估计等步骤非常重要。同时,了解摄像机成像原理、特征描述子、三维点云重建算法等知识也是必不可少的。 深入SLAM,首先需要了解其基本概念。SLAM是一种同时定位和地图构建的技术,用于机器人或自主系统实时建立环境的地图并同时估计自身的位置。SLAM主要关注于解决机器人在未知环境中自主导航的问题。SLAM算法通常包括前端和后端两个模块。前端负责对环境进行感知,通过传感器(如激光雷达、摄像头等)获取数据。而后端负责估计机器人的轨迹和构建地图。 学习SLAM时,我们需要掌握激光雷达、摄像头等传感器的工作原理以及数据处理方法。此外,了解滤波器理论、优化算法(如最小二乘法、非线性优化等)也是必要的。同时,学习SLAM框架(如ORB-SLAM、LSD-SLAM等)的实现原理和代码实现可以帮助我们更好地理解SLAM算法。 总结而言,深入SFMSLAM需要掌握深度学习、计算机视觉和机器人相关的知识。通过学习基本概念、核心算法和实际应用,我们可以更好地理解和应用SFMSLAM技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值