视觉SLAM学习路线

news2024/9/22 1:43:40

导师让我了解SLAM,SLAM原本是比较小众的方向,最近自动驾驶火起来,做这个SLAM的人也多了,反过来也会推动机器人感知的发展。希望未来学成的时候,能赶上机器人大规模普及,就业一片蓝海。学SLAM方向跟motion planning科研都不好做,而且都很吃数学基础。学习难度的话,planning可能教程更多一点,SLAM相较于planning要小众一些,教程也相对较少,所以对《视觉SLAM十四讲》整理一些自己的理解,记录一下自己的学习路线。

文章目录

    • 一、初识SLAM
      • 1、SLAM是什么?
        • (1)数学基础篇(前六讲)
        • (2)实践应用篇(后八讲)
      • 2、小萝卜的例子
        • (1)自主运动的两大基本问题:
        • (2)定位与建图=内外兼修
        • (3)相互关联
        • (4)怎样完成定位和建图?
        • (5)环境传感器的限制
        • (6)本体上传感器优点
        • (7)视觉SLAM是本书的主题,所以我们非常关心小萝卜的眼睛能够做些什么事。即如何用相机解决定位和建图的问题
        • (8)相机的特点
        • (9)相机分类
      • 3、经典视觉SLAM框架
        • (1)传感器信息读取:在视觉SLAM中主要为相机图像信息的读取和预处理。
        • (2)前端视觉里程计(Visual Odometry, V0) 视觉里程计的任务是估计相邻图像间相机的运动,以及局部地图的样子。(V0又称为前端)
        • (3)回环检测(Loop Closure Detection)用于判断机器人是否到达过先前的位置。
        • (4)后端(非线性)优化(optimization) 。对不同时刻的视觉里程计测量的相机位姿及回环检测的信息进行优化,得到全局一-致的轨迹和地图。
        • (5)建图(Mapping) 。根据估计的轨迹,建立任务要求对应的地图。
      • 4、SLAM问题的数学表达
        • (1)什么是运动?
        • (2)什么是观测?
        • (3)关于运动模型
        • (4)关于观测模型
        • (5)举个例子解释:
        • (6)这两个方程描述了最基本的SLAM问题:

一、初识SLAM

1、SLAM是什么?

SLAM (同时定位与地图构建),是指搭载特定传感器的主体,在没有环境先验信息的情况下,在运动过程中建立环境的模型,同时SLAM (同时定位与地图构建),是指搭载特定传感器的主体,在没有环境先验信息的情况下,在运动过程中建立环境的模型,同时估计自己的运动。如果这里的传感器是相机,那就称为视觉SLAM
如何使用《视觉SLAM十四讲》
注重理论和实践的结合、一讲一个主题(理论部分+实践部分)
全书由两部分组成:

(1)数学基础篇(前六讲)

①预备知识与SLAM概述(教材第1,2讲)
②三维空间的刚体运动(教材第3讲)
③李群与李代数(教材第4讲)
④相机模型与非线性优化(教材第5,6讲)

(2)实践应用篇(后八讲)

⑤特征点法视觉里程计(教材第7讲)
⑥直接法视觉里程计(教材第8讲)
⑦后端优化(教材第9,10讲)
⑧回环检测(教材第11讲)
⑨地图构建( 教材第12讲)
⑩工程实践(教材第13讲)
⑪SLAM的目前与未来(教材第14讲)

注:
学习本书会接触到–些必要的数学理论和许多编程知识,会用到Eigen、OpenCV、 PCL、 g2o、Ceres等库, 需要掌握他们在Linux操作系统中的使用方法。

学习本书最好具备以下基础:
1.高等数学(积分、求导)、线性代数(矩阵的运算)、概率论(极大似然估计)
2.C++语言基础,经典的slam框架都是用c++写的
3. Linux基础(代码都是在Linux系统上运行的)

2、小萝卜的例子

(1)自主运动的两大基本问题:

①我在什么地方?——定位
②周围环境是什么样? ——建图

(2)定位与建图=内外兼修

定位侧重对自身的了解,建图侧重对外在的了解

(3)相互关联

  • 准确的定位需要精确的地图
  • 精确的地图来自准确的定位

(4)怎样完成定位和建图?

传感器:机器人感知外界环境的手段
传感器主要分为以下两类:
①携带于机器人本体上的传感器
例:机器人的轮式编码器、相机、激光传感器、惯性测量单元(IMU)等
②安装于环境之中的传感器
例:导轨、二维码标志等

(5)环境传感器的限制

例:GPS:需要能接收到卫星信号的环境
Marker、导轨:需要环境允许安装

(6)本体上传感器优点

  • 相比之下,激光、相机等携带式传感器测量的通常都是一些间接的物理量而不是直接的位置数据,所以更加自由使用携带式传感器来完成SLAM也是我们重点关注的问题
  • 使用携带式传感器来完成SLAM也是我们重点关注的问题

(7)视觉SLAM是本书的主题,所以我们非常关心小萝卜的眼睛能够做些什么事。即如何用相机解决定位和建图的问题

  • SLAM中使用的相机更加简单,以一定速率采集图像、形成视频

(8)相机的特点

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

(9)相机分类

  • 单目相机Monocular
  • 双目相机(立体相机) Stereo
  • 深度相机RGB-D

其他 全景、Event Camera

①单目相机(只使用一个摄像头的相机)
通过相机的运动形成视差,可以测量物体相对深度
优点: 结构简单,成本低,便于标定和识别
缺点: 在单张图片里,无法确定一个物体的真实大小。
它可能是一个很大但很远的物体,也可能是一个很近很小的物体。即单目SLAM估计的轨迹和地图将与真实的轨迹和地图相差一个因子,也就是 尺度(scale) ,单凭图像无法确定这个真实尺度,所以称 尺度不确定性

②双目相机(由两个单目相机组成)
通过基线来估计每个像素的空间位置。** (类似于人眼) **
优点: 基线距离越大,能够测量的距离就越远;并且可以运用到室内和室外。
缺点: 配置与标定较为复杂,深度量程和精度受到双目基线与分辨率限制,计算非常消耗计算资源,需要GPU (图形处理器) /FPGA设备(现场可编程门阵列)加速用两部相机来定位。
深度相机(RGB-D)
通过红外结构光或ToF(time of fly) 的物理方法测量物体深度信息。

③深度相机(RGB-D)
通过红外结构光或ToF(time of fly) 的物理方法测量物体深度信息。
优点: 相比于双目相机可节省大量的计算资源。
缺点: 是测量范围窄,噪声大,视野小,易受日光干扰,无法测量透射材质等问题,主要用在室内,室外很难应用。深度相机主要用来三维成像,和距离的测量。

3、经典视觉SLAM框架

流程步骤如下:

(1)传感器信息读取:在视觉SLAM中主要为相机图像信息的读取和预处理。

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

视觉里程计通过相邻帧间的图像估计相机运动,并恢复场景的空间结构,但只计算相邻时刻的运动,不关心再往前的信息。但前端过程中必然存在误差,误差会不断累积,形成累积漂移 (会发现原本直的走廊变成了斜的,而原本90°的直角变成了歪的)。为消除漂移,我们需要回环检测后端优化

(3)回环检测(Loop Closure Detection)用于判断机器人是否到达过先前的位置。

  • 回环检测的作用:主要解决位置估计随时间漂移的问题(通俗的理解就是,假设机器人经过一段时间又回到了原点(事实),但是我们的位置估计值没有回到原点,怎么解决)

  • 回环检测要达到的目标:通过某种手段,让机器人知道“回到原点”这件事情,让机器人具有识别到过的场景的能力。再把位置估计值“拉”过去。

  • 相机检测手段:判断与之前位置的差异,计算图像间相似性。

  • 回环检测后:可将所得的信息告诉后端优化算法,把轨迹和地图调整到符合回环检测结果的样子。

(4)后端(非线性)优化(optimization) 。对不同时刻的视觉里程计测量的相机位姿及回环检测的信息进行优化,得到全局一-致的轨迹和地图。

  • 定义:如何处理前端所传噪声的数据,从带有噪声的数据中估计整个系统的状态,以及这个状态估计的不确定性有多大——称为最大后验概率估计

  • 通常来说,前端(图像的特征提取与匹配)给后端提供待优化的数据,以及这些数据的初始值。后端(滤波和非线性优化)负责整体的优化过程,它往往面对的就只有数据。

  • 反映了SLAM问题的本质:对运动主体自身和周围环境空间不确定性的估计。(状态估计理论一估计状态的均值和不确定性)

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

地图大体.上可分为以下两类:
①度量地图(强调精确的表示地图中的位置关系)
常用稀疏与稠密进行分类

  • 稀疏地图:即由路标组成的地图
  • 稠密地图:着重于建模所有看到的东西(可用于导航) (耗费大量的储存空间)
    ②拓扑地图
    拓扑地图(更加强调元素之间的关系)
    是一个图:由节点和边组成
  • 例:只关注A、B点是连通的,而不考虑如何从A点到达B点
  • 不适用于表达较为复杂结构的地图

4、SLAM问题的数学表达

假设小萝卜正携带着某种传感器在位置环境里运动。如何用数学语言描述这件事呢?
我们知道,相机通常是在某些时刻采集数据的,所以我们也关心这些时刻的位置和地图。
.段连续时间的运动变成了离散时刻t=1,2,3,…,k当中发生的事

  • x表示小萝卜的位置,x1,x2,…xk表示个时刻的位置
  • 假设地图是由许多个路标组成,每个时刻,传感器会测量到一 部分路标点,得到他们的观测数据,设路标点有N个,用y1,y2…yn表示

这样,我们需要考虑以下两件事情:

(1)什么是运动?

从k-1时刻到k时刻,小萝卜的位置是如何变化的?

(2)什么是观测?

假设小萝卜在k时刻xk处观测到了某个路标yj,我们如何用数学语描述呢?

(3)关于运动模型

机器人会携带一个测量自身运动的传感器,这合传感器可以测量有关运动的读数,但不一-定直接就是位置之差,还可能是加速度、角速度这些信息。
我们可以用一个抽象的数学模型来描述:
数学模型:
在这里插入图片描述

(4)关于观测模型

机器人在xk位置上看到某个路标点yj产生了一个观测数据zk,j同样可以用一个抽象的数学模型描述:

数学模型:
在这里插入图片描述

事实上,根据机器人的真实运动和传感器的种类,存在着若干种参数化形式。而考虑视觉SLAM时,传感器是相机,则观测方程就是“对路标点拍摄后,得到图像中的像素”的过程(第五讲)

(5)举个例子解释:

假设机器人在平面运动,那么位姿(位置+姿态)由两个位置的坐标和一个转角来描述xk=(x, y, Θ),同时,运动传感器能够测量到机器人在任意两个时间间隔位置和转角的变化量云(Δx, Δy, ΔΘ)T
于是此时的运动方程就可以写成:
在这里插入图片描述

(6)这两个方程描述了最基本的SLAM问题:

当知道运动测量的读数u以及传感器的读数z时,如何求解定位问题(估计x)和建图问题(估计y)
在这里插入图片描述

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

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

相关文章

RabbitMQ延迟列队的使用

目录 1. 延迟队列使用场景 2. RabbitMQ中的延迟队列实现思路 3. 实现示例 3。运行项目测试 1. 延迟队列使用场景 延迟队列一般可用于具有时间限制的任务,例如:限时优惠,超时的订单处理等。 对于这种场景,传统的处理方式是任…

Ceph: ceph基础知识

ceph基础知识 一、基础概念 ceph官方文档 http://docs.ceph.org.cn/ ceph中文开源社区 http://ceph.org.cn/ 1、概述 Ceph是可靠的、可扩展的、统一的、开源分布式的存储系统。 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 C…

Python基础知识(一)

目录 输入输出函数 输入函数:input() 输出函数:print() 算术运算符 关系运算符 逻辑运算符 变量 1.命名规则 2.变量类型 3.动态类型特性 输入输出函数 输入函数:input() name input("请输入:") print(nam…

第二证券|北向资金全年净买入约900亿元 哪些行业和个股成“香饽饽”

2022年A股收官。回顾这一年,面临复杂严峻的国内外环境,A股商场推动完善多元融资支撑机制,加大了对实体经济的金融支撑力度,为中国经济V形复苏做出了奉献。这一年,A股IPO融资规划创出历史新高,存量上市公司打…

驱动的并发和竞争

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、什么是并发?并发并行并发并行模式二、什么是竞争三、如何解决竞争1、原子操作整形原子操作:原子位操作2.自旋锁3.信号量4.互斥锁5.如…

mysql批量更新方法

mysql批量更新方法 实验mysql版本为5.7.20 隔离级别为rr,加锁场景的问题在mysql8.0.18中为复现 方法一 replace into 批量更新 原理:replace into table (col1,col2) values (x1,x2), 操作本质是对重复的记录先delete 后insert 缺点:1、如…

特斯拉Model S及Model X 2023上半年交付,1月6日公布售价

特斯拉Model S及Model X终于快要交付了。 2022年12月30日,广州国际车展盛大开幕。众多车企带来了旗舰车型,让观众直呼太过瘾,其中,人流量爆火的莫过于特斯拉展台。此次,特斯拉携旗下S3XY家族重磅出击,全新车…

【C++基础】08:模板

模板 OVERVIEW模板一、函数模板1.func template基本使用:2.func template案例:数组排序3.函数与函数模板的区别&调用规则:4.func template的局限性:二、类模板1.类模板基本使用:2.类模板与函数模板的区别&#xff…

AOA估计中的MUSIC算法(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 随着阵列信号处理技术的不断发展,到达角估计(Angle Of Arrival)的研究在移动通信系统中具有重要意义。通过分析经典MUSIC算法,…

golang 自定义命令行flag包简单使用

一、为什么需要使用golang自定义命令行 不恰当的比喻,当我们写了一个服务代码后,按照简单的思维,我们会在业务代码中将要连接的数据库 用户名、主机名、端口号、密码写死。 那么也就意味着我们启动该服务后都只能固定连接某一个数据库&#x…

etcd快速入门

etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。 etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。 etcd作为服务发现系统,有以下的特点: 1.简单&#…

分享67个PHP源码,总有一款适合您

链接:https://pan.baidu.com/s/1MzKN0bLDRv0i290R2erMHQ?pwdbo2i 提取码:bo2i PHP源码 分享67个PHP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载…

寒假每日一题W1D3——上课睡觉

题目描述 有 N 堆石子,每堆的石子数量分别为 a1,a2,…,aN。 你可以对石子堆进行合并操作,将两个相邻的石子堆合并为一个石子堆,例如,如果 a[1,2,3,4,5],合并第 2,3 堆石子,则石子堆集合变为 a[1,5,4,5]。…

【学习】backdoor attacks、Adversarial Attack on Images、Adversarial Attack on Audio

文章目录一、后门攻击backdoor attacks1、data poisoning2、backdoored PLM3、defenseONION4、后门攻击:绕过ONION防御5、摘要二、Adversarial Attack on Imagesone pixel attackdifferential evolution三、Adversarial Attack on Audio一、后门攻击backdoor attacks 什么是后…

进程的终止和等待

目录 进程终止 如何获取退出码呢? 进程退出方法有哪些? 对于进程退出,内核OS做了什么? 进程等待 为什么要进行进程等待? 如何进行进程等待? 什么是阻塞和非阻塞等待? 进程终止 对于进程…

飞依诺冲刺科创板上市:上半年出现亏损,因商业秘密纠纷被起诉

近日,飞依诺科技股份有限公司(下称“飞依诺”)在上海证券交易所递交招股书,准备在科创板上市。本次冲刺上市,飞依诺计划募资11.22亿元,将用于生产基地升级项目、新产品研发与总部基地建设项目、营销网络建设…

【Linux】一文掌握Linux基本指令(下)

本章命令大致总结命令功能cat打印文件内容echo打印文件内容> 输出重定向 >>追加重定向< 输入重定向 more 查看文本内容 less等价于morehead打印文本前n行tail 打印文本后n行 |管道date时间相关cal日历sort文本排序uniq相邻文本降重zip打包压缩unzip解包tar打包/解包…

蓝桥杯寒假集训第四天(全球变暖DFS)

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 有一个正方形区域&#xff0c;里面有大陆和海洋&#xff0c;暂且用‘.’表示海洋&#xff0c;用‘#’表示大陆。我们把上下左右都连在一起的大陆称之为岛屿。但是随着气温…

07 来自于网友的 retrieveFileStream 的一个问题, 导致系统程序异常

前言 可以先参考前面一篇文章 retrieveFileStream 之后需要调用 completePendingCommand 否则业务代码会存在问题 retrieveFileStream 之后需要调用 completePendingCommand 否则业务代码会存在问题 这里的问题 主要是来自于 某 qq 交流群的网友 呵呵 当然 这里测试用例代码…

新鲜速递:Spring Data JPA 3.0快速入门、进阶到精通

第一章、安装Spring Data JPA 第一步&#xff0c;先确保你使用的是Spring Boot 3.0或以上环境&#xff0c;可以在pom.xml里加入Spring Data JPA依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-…