视觉SLAM十四讲学习笔记(一)初识SLAM

目录

前言

一、传感器

1 传感器分类

2 相机

二、经典视觉 SLAM 框架

1 视觉里程计

2 后端优化

3 回环检测

4 建图

5 SLAM系统

三、SLAM 问题的数学表述

四、Ubuntu20.04配置SLAM十四讲


前言

  • SLAM: Simultaneous Localization and Mapping 同时定位与地图构建(建图)。
  • 搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环地的模型。同时储计自己的运动。
  • 视觉SLAM:以相机为主要传感器的SLAM。
  • 问题:同时从图像中估计相机的运动以及环境的情况。传感器在空间运动中将自己的运动估计出来,返给使用者;在运动过程中描述出运动环境。

哔哩哔哩课程连接:【高翔】视觉SLAM十四讲_哔哩哔哩_bilibili

一、传感器

相机在场景中运动的过程,将得到一系列连续变化图像。视觉 SLAM 的目标,是通过这样的一些图像,进行定位和地图构建。

1 传感器分类

一类传感器是携带于机器人本体上的,例如机器人的轮式编码器、相机、激光等等。

另一类是安装于环境中的,例如导轨、二维码标志等等。安装于环境中的传感设备,通常能够直接测量到机器人的位置信息,简单有效地解决定位问题。然而,由于它们必须在环境中设置,在一定程度上限制了机器人的使用范围。

2 相机

相机的本质

  • 以二维投影形式记录了三维世界的信息
  • 此过程丢掉了一个维度:距离

各类相机主要区别:有没有深度信息

  • 单目:没有深度,必须通过移动相机产生深度 Moving View Stereo
  • 双目:通过视差计算深度 Stereo
  • RGBD:通过物理方法测量深度

相机的分类

按照相机的工作方式,把相机分为单目(Monocular)、双目(Stereo)和深度相机(RGB-D)三个大类。此外,SLAM 中还有全景相机Event 相机等特殊或新兴的种类。

单目相机只使用一个摄像头进行 SLAM 的做法称为单目 SLAM(Monocular SLAM)。 这种传感器结构特别的简单、成本特别的低,所以单目 SLAM 非常受研究者关注。由于单目相机只是三维空间的二维投影,所以,如果我们真想恢复三维结构,必须移动相机的视角。在单目 SLAM 中也是同样的原理。必须移动相机之后,才能估计它的运动Motion),同时估计场景中物体的远近和大小,不妨称之为结构(Structure)。当相机移动时,这些物体在图像上的运动,形成了视差。通过视差,我们就能定量地判断哪些物体离得远,哪些物体离的近。

单目 SLAM 估计的轨迹和地图,将与真实的轨迹、地图,相差一个因子,也就是所谓的尺度Scale。由于单目 SLAM 无法仅凭图像确定这个真实尺度,所以又称为尺度不确定性。 平移之后才能计算深度,以及无法确定真实尺度,这两件事情给单目 SLAM 的应用造成了很大的麻烦。它们的本质原因是通过单张图像无法确定深度。所以,为了得到这个深度,人们又开始使用双目和深度相机。

双目相机 (Stereo) 和深度相机

共同点

  • 利用图像和场景的几何关系,计算相机运动和场景结构Motion & Structure
  • 三维空间的运动和结构
  • 图像来自连续的视频

双目相机和深度相机的目的,在于通过某种手段测量物体离我们的距离,克服单目无法知道距离的缺点。如果知道了距离,场景的三维结构就可以通过单个图像恢复出来,也就消除了尺度不确定性。尽管都是为测量距离,但双目相机 与深度相机测量深度的原理是不一样的。

双目相机由两个单目相机组成,但这两个相机之间的距离(称为基线Baseline))是已知的。我们通过这个基线来估计每个像素的空间位置——这和人眼非常相似。计算机上的双目相机需要大量的计算才能(不太可靠地)估计每一个像素点的深度。双目相机测量到的深度范围与基线相关,基线距离越大,能够测量到的就越远。双目相机的距离估计是比较左右眼的图像获得的,并不依赖其他传感设备,所以它既可以应用在室内,亦可应用于室外。双目或多目相机的缺点是配置与标定均较为复杂,其深度量程和精度受双目的基线与分辨率限制,而且视差的计算非常消耗计算资源,需要使用 GPU 和 FPGA 设备加速后,才能实时输出整张图像的距离信息。

深度相机(又称 RGB-D 相机),最大的特点是可以通过红外结构光或 Time-of-Flight(ToF)原理,像激光传感器那样,通过主动向物体发射光并接收返回的光,测出物体离相机的距离。这部分并不像双目那样通过软件计算来解决,而是通过物理的测量手段,所以相比于双目可节省大量的计算量。目前常用的 RGB-D 相机包括 Kinect/Kinect V2Xtion live pro、Realsense 等。不过,现在多数 RGB-D 相机还存在测量范围窄、噪声大、视野小、易受日光干扰、无法测量透射材质等诸多问题,在 SLAM 方面,主要用于室内 SLAM,室外则较难应用。

二、经典视觉 SLAM 框架

整个视觉 SLAM 流程分为以下几步:

1. 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。如果在机器人中,还可能有码盘、惯性传感器等信息的读取和同步。

2. 视觉里程计 (Visual Odometry, VO)。视觉里程计任务是估算相邻图像间相机的运动,以及局部地图的样子。VO 又称为前端(Front End)。

3. 后端优化Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后,又称为后端(Back End)。

4. 回环检测Loop Closing)。回环检测判断机器人是否曾经到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。

5. 建图Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。

1 视觉里程计

视觉里程计(Visual Odometry, VO),关心相邻图像之间的相机运动,最简单的情况当然是两张图像之间的运动关系。

视觉里程计的主要方法分为基于特征点的方法和不使用特征点的直接法两种。特征点方法也叫稀疏方法,而使用特征点描述的也叫稠密方法。按照技术手段不同分为两大类——多传感器融合的视觉里程计(以惯性视觉融合为例)和基于深度学习的视觉里程计。前者通过各传感器之间的优势互补提高VO的精度,后者则是通过和深度学习网络结合改善VO的性能.最后通过比较视觉里程计现有算法,并结合VO面临的挑战展望了视觉里程计的未来发展趋势。

VO 能够通过相邻帧间的图像估计相机运动,并恢复场景的空间结构。叫它为“里程计”是因为它和实际的里程计一样,只计算相邻时刻的运动,而和再往前的过去的信息没有关联。在这一点上,VO 就像一种只有很短时间记忆的物种一样。现在,假们已有了一个视觉里程计,估计了两张图像间的相机运动。那么,只要把相邻时刻的运动“串”起来,就构成了机器人的运动轨迹。

仅通过视觉里程计来估计轨迹,将不可避免地出现累计漂移Accumulating Drift)。这是由于视觉里程计(在最简单的情况下)只估计两个图像间运动造成的。累计误差与回环检测的校正结果如下图所示。

漂移(Drift)将导致无法建立一致的地图,原本直的走廊变成了斜的。为了解决漂移问题,还需要两种技术:后端优化回环检测。回环检测负责把“机器人回到原始位置”的事情检测出来,而后端优化则根据该信息,校正整个轨迹的形状。

2 后端优化

  • 从带有噪声的数据中优化轨迹和地图状态估计问题
  • 最大后验概率估计MAP
  • 前期以EKF为代表,现在以图优化为代表讲

后端优化主要指处理 SLAM 过程中噪声的问题。

后端优化要考虑的问题,就是如何从这些带有噪声的数据中,估计整个系统的状态,以及这个状态估计的不确定性有多大——这称为最大后验概率估计(Maximum-a-PosterioriMAP)。这里的状态既包括机器人自身的轨迹,也包含地图。

在视觉 SLAM 中,前端和计算机视觉研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法

3 回环检测

回环检测,又称闭环检测(Loop Closure Detection),主要解决位置估计随时间漂移的问题。

为了实现回环检测,我们需要让机器人具有识别曾到达过的场景的能力。例如,我们可以判断图像间的相似性,来完成回环检测。

4 建图

建图(Mapping)是指构建地图的过程。地图是对环境的描述,但这个描述并不是固定的,需要视 SLAM 的应用而定。形形色色的地图:2D 栅格地图、拓扑地图以及 3D 点云地图和网格地图:

地图 的形式随 SLAM 的应用场合而定,大体可以分为度量地图拓扑地图两种。

度量地图(Metric Map

度量地图强调精确地表示地图中物体的位置关系,通常我们用稀疏(Sparse)与稠密(Dense)对它们进行分类。稀疏地图进行了一定程度的抽象,并不需要表达所有的物体。例如,选择一部分具有代表意义的东西,称之为路标(Landmark),那么一张稀疏地图就是由路标组成的地图,而不是路标的部分就可以忽略掉。相对的,稠密地图着重于建模所有看到的东西。对于定位来说,稀疏路标地图就足够。

拓扑地图(Topological Map

相比于度量地图的精确性,拓扑地图则更强调地图元素之间的关系。拓扑地图是一个图(Graph),由节点和边组成,只考虑节点间的连通性。

5 SLAM系统

按照运动和观测方程是否为线性,噪声是否服从高斯分布进行分类,分为线性/非线性和高斯/非高斯系统。其中线性高斯系统(LG)是最简单的,它的无偏的最优估计可以由卡尔曼滤波器(KF)给出。而在复杂的非线性非高斯系统(None-Linear Non-Gaussian,NLNG系统)中,使用以扩展卡尔曼滤波器(Extended Kalman Filter, EKF)和非线性优化两大类方法去求解。

直至21世纪早期,以EKF为主的滤波器方法在SLAM中占据了主导地位。在工作点处把系统线性化,并以预测——更新两大步骤进行求解。最早的视觉SLAM系统就是基于EKF开发的。随后,为了克服EKF的缺点(例如线性化误差和噪声高斯分布假设),人们开始使用例子滤波器(Particle Filter)等其他滤波器,乃至使用非线性优化的方法。目前,主流视觉SLAM使用以图优化为代表的优化技术进行状态估计。只要计算资源允许,通常都偏向于使用优化方法。

三、SLAM 问题的数学表述

1. 什么是运动?我们要考虑从 k 1 时刻到 k 时刻,小萝卜的位置 x 是如何变化的。

2. 什么是观测?假设小萝卜在 k 时刻,于 xk 处探测到了某一个路标 yj,要考虑这件事情是如何用数学语言来描述的。

四、Ubuntu20.04配置SLAM十四讲

本章需要虚拟机或ubuntu系统,自行安装。下载配套资源:

git clone https://github.com/gaoxiang12/slambook.git

找到/home/yang/slam/slambook/ch2/,在个文件夹下,打开终端,执行以下操作:

g++ /home/yang/slam/slambook/ch2/helloSLAM.cpp
ls
./a.out

然后

g++ /home/yang/slam/slambook/ch2/helloSLAM.cpp -o helloSLAM
ls
./helloSLAM

gedit CMakeLists.txt

cmake .

make

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/667679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

交友系统---让陌生人变成熟悉人的过程。APP小程序H5三端源码交付,支持二开。

随着社交网络的发展和普及,人们之间的社交模式正在发生着深刻的变革。传统的线下交友方式已经逐渐被线上交友取而代之。而同城交友正是这一趋势的产物,它利用移动互联网的便利性,将同城内的人们连接在一起,打破了时空的限制&#…

机器视觉系统设计:视觉系统中的成像基准

开发视觉系统的一个重要活动是验证其部署是否符合工程规范。一个成功的视觉应用程序的两个特点是它无需工程师干涉情况下正常工作了多长时间,以及它的维护和复制部署是多么简易。实现所有如上所述目标的一个关键步骤是确定视觉系统的基准。 在这里使用的上下文中&a…

移动云ONAIR媒体云全解读!媒体内容数字化融合一站式解决方案

当下,传统媒体面临着诸多挑战,如何利用信息技术提升内容的质量、形式和分发效率,成为媒体行业的迫切需求。移动云作为数字中国建设的“主力军”, 立足于新兴媒体与云计算市场的变化与需求,推出了ONAIR 媒体云解决方案&…

vue2学习笔记(2/2)

vue2学习笔记(1/2) vue2学习笔记(2/2) 文章目录 1. 初始化脚手架2. 分析脚手架&render函数文件结构图示及说明main.jsindex.htmlApp.vueSchool.vueStudent.vue 关于不同版本的Vue修改默认配置vue.config.js配置文件 3. ref属…

08. 【Linux教程】CentOS 目录介绍

CentOS 目录介绍 前面小节介绍了如何安装并登录连接 CentOS 系统,本小节围绕 CentOS 系统的目录,介绍其各个目录的作用,方便读者以后在工作中很好地将项目和软件归类存储,熟悉 CentOS 系统各个目录的功能介绍,有助于加…

035 Arrays类

示例 int[] nums new int[10]; // fill Arrays.fill(nums, 666); System.out.println(Arrays.toString(nums)); // sort nums new int[]{1, 3, 5, 7, 9, 2, 4, 6, 8}; Arrays.sort(nums); System.out.println(Arrays.toString(nums)); // equals int[] nums2 new int[]{1,…

【数据分享】1929-2023年全球站点的逐日平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,说到常用的降水数据,最详细的降水数据是具体到气象监测站点的降水数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全…

【Spring】代理模式

文章目录 代理模式对代理模式的理解静态代理动态代理JDK动态代理原理源码优化 CGLIB动态代理使用原理 JDK与CGLIB的对比 面试题JDK动态代理和CGLIB有什么区别?既然有没有接口都可以用CGLIB,为什么Spring还要使用JDK动态代理? 代理模式 对代理…

4. 树(二叉树、二叉查找树/二叉排序树/二叉搜索树、平衡二叉树、平衡二叉B树/红黑树)

树 1. 二叉树1.1 概述1.2 特点1.3 二叉树遍历方式1.3.1 前序遍历(先序遍历)1.3.2 中序遍历1.3.3 后序遍历1.3.4 层序遍历 2. 二叉查找树(二叉排序树、二叉搜索树)2.1 概述2.2 特点 3. 平衡二叉树3.1 概述3.2 特点3.3 旋转3.3.1 左旋3.3.2 右旋 3.4 平衡二…

云原生数据库 GaiaDB 的核心技术演进和解析

导读 在越来越强调云原生的环境下,存算分离作为一种新的架构理念,已经是大势所趋。新的技术架构带来新的问题和挑战,百度智能云的云原生数据库 GaiaDB 采用 Quorum 分布式协议、高性能网络、高可靠分布式存储引擎等技术实现更高的性能和可用性…

ElementUI Form:Select 选择器

ElementUI安装与使用指南 Select 选择器 点击下载learnelementuispringboot项目源码 效果图 el-select.vue&#xff08;Select选择器&#xff09;页面效果图 项目里el-select.vue代码 <script> export default {name: el_select,data() {return {options: [{value…

PHP之数据类型的基本介绍

让我为大家介绍一下PHP中的数据类型吧&#xff01; 数据类型有&#xff1a;字符串、整数、浮点数、布尔、数组、对象、NULL、资源类型 我们可以使用gettype去获取数据类型 var_jump()会返回变量的数据类型与值&#xff0c;一般用于开发调试时使用 字符串 字符串是字符序列…

备战蓝桥杯---搜索(优化1)

显然&#xff0c;我们可以用BFS解决&#xff0c;具体实现与八数码类似&#xff1a; 下面是代码&#xff1a; #include<bits/stdc.h> using namespace std; #define N 3000000 string a,b; int hh,dis[N],cnt; struct node{string u,v; }bian[7]; map<string,int>…

Python爬虫requests库详解

使用 requests 上一节中&#xff0c;我们了解了 urllib 的基本用法&#xff0c;但是其中确实有不方便的地方&#xff0c;比如处理网页验证和 Cookies 时&#xff0c;需要写 Opener 和 Handler 来处理。为了更加方便地实现这些操作&#xff0c;就有了更为强大的库 requests&…

docker 网络模型

一、docker的网络模型分为四种 【1】Host(与宿主机共享一个网络)&#xff0c;宿主机的localhost 及 容器内的localhost 【2】Bridge(与宿主机共享一个局域网&#xff0c;有自己的网络&#xff1b;docker运行默认Bridge)&#xff1b;容器内localhost不是宿主机localhost 【3】…

【CSS + ElementUI】更改 el-carousel 指示器样式且隐藏左右箭头

需求 前三条数据以走马灯形式展现&#xff0c;指示器 hover 时可以切换到对应内容 实现 <template><div v-loading"latestLoading"><div class"upload-first" v-show"latestThreeList.length > 0"><el-carousel ind…

双非本科准备秋招(16.1)—— 力扣二叉树

1、101. 对称二叉树 检查是否对称&#xff0c;其实就是检查左节点等不等于右节点&#xff0c;我们可以用递归来做。 如果左右节点都为null&#xff0c;说明肯定对称呀&#xff0c;返回true。 如果一个为null一个不为null&#xff0c;或者左右的值不相等&#xff0c;则为false。…

flutter开发实战-ijkplayer视频播放器功能

flutter开发实战-ijkplayer视频播放器功能 使用better_player播放器进行播放视频时候&#xff0c;在Android上会出现解码失败的问题&#xff0c;better_player使用的是video_player&#xff0c;video_player很多视频无法解码。最终采用ijkplayer播放器插件&#xff0c;在flutt…

3D力导向树插件-3d-force-graph学习001

一、引入文件&#xff1a;下载静态js文件引入 1、**以vue项目测试&#xff0c;在index.html文件中引入静态文件&#xff08;js文件可在官网下载&#xff09;** 2、**也曾尝试用npm包下载引入的方法&#xff0c;总是会有报错&#xff0c;所以采用静态js文件引入的方式** 二、基…

【高质量精品】2024美赛B题22页word版高质量半成品论文+多版保奖思路+数据+前四问思路代码等(后续会更新)

一定要点击文末的卡片&#xff0c;进入后&#xff0c;获取完整论文&#xff01;&#xff01; B 题整体模型构建 1. 潜水器动力系统失效&#xff1a;模型需要考虑潜水器在无推进力情况下的行为。 2. 失去与主船通信&#xff1a;考虑无法从主船接收指令或发送位置信息的情况。…