视觉SLAM——概述 算法框架 SLAM与SFM的区别

前言

此为学习《视觉SLAM十四讲》第1、2讲及其他相关SLAM内容的总结与整理。

什么是SLAM

SLAM是Simultaneous Location and Mapping,同时定位与地图构建。是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。
目的是解决自主机器人“定位”和“建图”两个问题。同时要求能够实时地,没有先验知识地进行。

SLAM问题的本质是对主体自身(位姿)和周围环境空间(点云)的不确定性的估计。

经典SLAM算法框架

在这里插入图片描述

  • 传感器信息获取:相机图像的读取和预处理,码盘、IMU等的读取和时间同步。
  • 前端视觉里程计(Visual Odometry,VO):通过相邻帧间的图像估计相机运动,并恢复场景的空间结构。仅通过VO估计轨迹会出现累计漂移。主要是特征点法和直接法。
  • 后端优化(Optimization):接收不同时刻视觉里程计输出的相机位姿,以及回环检测的信息,对其进行优化,得到全局一致的轨迹和地图。主要是滤波和非线性优化算法。
  • 回环检测(Loop Closing):解决位置估计误差随时间漂移的问题,得到全局一致的地图。利用图像相似性判断机器人是否曾经到达过此位置,如果检测到回环,会把信息提供给后端进行处理。
  • 建图(Mapping):根据估计出的轨迹,建立于任务要求对应的地图。

SLAM数学模型

运动方程和观测方程:
在这里插入图片描述
SLAM可建模为一个状态估计问题:当知道运动测量读数u,以及传感器的读数z时,如何求解定位问题(估计机器人自身位置x)和建图问题(估计路标点y),其中w和v为运动噪声和观测噪声。

状态估计问题的求解,与系统是否线性,噪声服从哪种分布有关。系统可分为线性/非线性和高斯/非高斯系统。其中线性高斯系统(LG)的无偏最优估计可由卡尔曼滤波器(KF)给出。目前优化技术已经明显优于滤波器技术,主流视觉SLAM使用以图优化为代表的优化技术进行状态估计。

传感器的分类

1、外置:安装在环境中,如导轨、二维码等,这类传感器简单有效,但约束了外界环境;
2、内置:携带在机器人本体上,如轮式编码器、相机、激光、声纳、IMU等,通常测量间接的物理量而非直接位置数据,具有通用性。

相机简单介绍

相机是以一定速率采集环境信息得到照片,形成视频流。照片的本质是拍照时的场景在相机的成像平面下的投影,是以二维的形式反应三维世界,丢失了场景的深度。

单目相机SLAM:通过移动时物体产生的视差计算深度,无法确定真实尺度(Scale)(尺度不确定性)。
尺度表示为单目SLAM估计的轨迹和地图与真实轨迹和地图之间相差的因子。

双目相机(stereo):由两个单目相机组成,通过基线(Baseline)估计每个像素的深度。
优点:不依赖其他传感器,可应用于室内/室外。
缺点:配置与标定复杂,深度量程和精度受双目基线和分辨率所限,视差的计算非常消耗计算资源,需要GPU。

深度相机(RGB-D):通过红外结构光或者Time-of-Fight(TOF)原理,主动测量物体的距离。
优点:通过物理手段测量,可以节省大量运算;
缺点:目前存在测量范围窄、噪声大、视野小、易受阳光干扰、无法测量投射材质等问题,主要应用于室内。

地图的分类

地图是对环境的描述,主要分为:

  • 度量地图(Metric Map):精确地表示地图中物体的位置关系。
  • 拓扑地图(Topological Map):强调地图元素之间的关系,是一个图(Graph),由节点和边组成,只考虑节点间的连通性。

度量地图又可分为:

  • 稀疏地图(Sparse)对环境进行一定尺度的抽象,不表达所有物体,如选择一部分具有代表意义的物体,成为路标(Landmark)。
  • 稠密地图(Dense):建模所有看到的东西,一般由许多小块组成,包含占据、空闲、未知三种状态。

SFM、单目多视角三维重建和vSLAM的区别

SFM又叫structure from motion,即从运动恢复结构。

1、SFM以及单目多视角三维重建的图像是无序的,匹配时需要进行较为暴力的匹配,选择初始两张图像以及加入最好的下一张图像需要技巧;
SLAM是有序的图像序列,一般通过前后帧间匹配和局部窗口法,只有回环检测时需要进行图像间的匹配。
2、SFM中的structure对应于vSLAM中的mapping,camera pose对应于vSLAM中location。从目的考虑,SFM主要是要为了实现三维重建(3D reconstuction),而vSLAM主要是要实现定位(location)。
3、SFM 是离线处理的,对处理时间要求不严格,但对结果的精确度要求高;SLAM需要在线处理,一般要求达到实时性。且SLAM更希望能在小型电脑或嵌入式设备中应用。

视觉SLAM的主要挑战

  1. 回路序列和多视频序列
  2. 高效高精度处理大尺度场景
  3. 动态场景
  4. 快速运动和强旋转问题

机器人绑架

指在丢失之前位置信息的情况下,去确定机器人的当前位姿。比如机器人在移动过程中,由于传感器的暂时性功能故障或相机的快速移动导致跟踪失败,从而得到一个错误的位姿估计;或者外界强行将其放到另外一个位姿。

"绑架问题"可以分为初始化绑架和追踪丢失状态绑架。
1)初始化绑架可采用粒子滤波方法,重新分散随即状态粒子到三维空间,经不断更新后粒子收敛到可解释观察结果的区域。
2)追踪丢失状态绑架,即在绑架之前系统已经保存当前状态估计,则可以融合多传感器和增加替代传感器的方式解决。

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SLAM(Simultaneous Localization and Mapping,即同时定位与地图构建)是一种计算机视觉和机器人领域的技术,用于实现机器人在未知环境中的自主定位和地图构建。在Python中,有很多可以用于实现SLAM的库和工具,以下是其中的一些: 1. OpenCV:OpenCV是一种开源计算机视觉库,提供了用于处理图像和视频的各种算法和工具,包括用于SLAM的特征提取和匹配算法。 2. ROS(Robot Operating System):ROS是一种用于机器人应用程序开发的框架,它提供了一些用于SLAM的软件包和工具,包括用于地图构建和机器人定位的算法。 3. PySLAM:PySLAM是一个用Python编写的SLAM库,它基于非线性优化算法,并实现了用于地图构建和机器人定位的算法。 4. GTSAM(Generalized Trajectory and Sparse Inference for Multiple View Geometry):GTSAM是一个用于SLAM的C++库,但也提供了Python的接口,可以用于实现基于因子图的SLAM算法。 以上是一些常用的Python库和工具,可以用于实现SLAM。但需要注意的是,实现SLAM需要深入的计算机视觉和机器人知识,如果您是初学者,建议先学习相关的基础知识。 ### 回答2: Python可以通过使用一系列的库和工具来实现视觉SLAM(Simultaneous Localization and Mapping)。以下是一种可能的实现方法: 1. 首先,可以使用OpenCV库来处理图像。OpenCV提供了许多用于图像处理和计算机视觉的功能,比如图像读取、特征提取、特征匹配、图像拼接等。 2. 使用相机校准工具来估计相机的内部和外部参数。相机校准是视觉SLAM的关键,它用于计算相机的畸变和投影矩阵,以便在后续步骤中进行准确的三维重建。 3. 使用特征提取和特征匹配算法,如SIFT、SURF或ORB来检测关键点并计算描述子。这些特征可以用于定位相机和进行场景重建。 4. 使用视觉里程计(Visual Odometry)算法来估计相机的运动。视觉里程计通过跟踪关键点在连续图像帧之间的移动来计算相机的位姿变换。 5. 运行一个稀疏或稠密重建算法,如Structure from Motion(SfM)或Bundle Adjustment(BA),来生成三维地图。这些算法使用视觉里程计和特征点来估计场景的几何结构和相机位姿。 6. 最后,进行地图优化和回环检测,以提高重建的精度和鲁棒性。地图优化使用BA算法来优化相机的位姿和三维点的位置,回环检测则用于识别相机经过的相似场景,并进行位置校正。 需要注意的是,虽然Python具有许多用于计算机视觉的库和工具,但由于视觉SLAM是一个计算密集型任务,性能要求较高。因此,在实际应用中,可能需要使用C++等低级语言来实现SLAM的关键部分,同时使用Python进行辅助开发和数据处理。 ### 回答3: Python实现视觉SLAM(Simultaneous Localization and Mapping)需要以下步骤和工具: 1. 引入适当的库:Python提供了许多计算机视觉和机器学习的库。在实现视觉SLAM之前,需要引入一些基础库,例如NumPy、OpenCV和Matplotlib。 2. 相机标定:SLAM需要准确的相机内外参数。可以使用OpenCV的相机标定工具,对相机进行标定,获取内外参矩阵。 3. 特征提取:通过在图像上检测和描述局部特征,如角点、边缘等,以便于跟踪和地图生成。OpenCV的ORB、SIFT、SURF等算法可以被用于提取特征。 4. 视觉里程计(Visual Odometry):通过计算相邻帧之间的相对运动,估计相机在世界坐标系中的位置和姿态。可以使用特征匹配、光流估计等技术来计算相机的运动。 5. 回环检测(Loop Closure):当相机经过同一场景时,需要检测到回环(Loop)以防止误差累积。可以使用特征匹配、描述子匹配等方法来识别回环。 6. 建图:通过融合视觉里程计和回环检测,将相机观测到的地图点云进行融合和更新,生成三维地图。可以使用点云库(如Open3D)来处理和可视化地图。 7. 数据关联与滤波:将每个图像与先前的图像进行关联,通过滤波器(如扩展卡尔曼滤波器或粒子滤波器)估计相机的位置和姿态。 8. 优化与后端调整:通过最小化重投影误差或光度误差,使用非线性优化方法(如Gauss-Newton或Levenberg-Marquardt)对地图和相机轨迹进行优化和后端调整。 9. 数据集和实时处理:可以使用现有的视觉SLAM数据集进行测试和验证,例如KITTI、TUM RGB-D等。并且可以根据需求进行实时处理,从摄像头或视频流中获取图像进行实时SLAM。 总之,Python可以通过使用开源的计算机视觉库和数学优化库来实现视觉SLAM。通过特征提取、视觉里程计、回环检测和地图建立,可以估计相机在三维空间中的定位和轨迹。这些步骤可能需要结合其他技术和算法来提高精度和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值