视觉SLAM十四讲学习笔记【逐行代码带你解析】【适合纯小白 ps:因为我就是】(持续更新中)
前言
大一大二东学学西学学了一大堆,这个暑假想往难一点的方向探索探索,以后想从事机器人行业,所以先从SLAM开始,希望这个暑假能把他更新完。
ps:对于这个方向我也只是初学者,大家看的时候一定要带辩证的思维看,因为我也不敢说我写的这个内容是正确的,同时我也希望大家对我做出一些建议和反馈。
原书代码Github链接: link
笔者代码Github链接: link
ch2 初识SLAM
2.1.什么是SLAM
SLAM是指Simultaneous Localization and Mapping,翻译过来就是同时定位与地图构建模型,他解决了定位与地图构建的问题,说人话就是:
1.我在什么地方——定位
2.周围环境怎么样——建图
2.2经典视觉SLAM框架
视觉SLAM的流程分为以下步骤:
2.2.1.传感器信息读取
2.2.2.前端视觉里程计
这个就是读取了前后两张(两张只是一个假设)图片的数据,然后根据图片信息的变化估计出运动的轨迹,但是仅仅通过这种视觉里程计来估计轨迹,不可避免的就会产生误差,这个误差我们这里叫他飘移,而这种误差是累计性的,也就是估计的越多,误差就会越大,这里我们称之为累积飘移(Accumulating Drift),这将导致我们定位也不准,建图也不准,于是,我们引入了下面两种东西:后端优化和回环检测。
2.2.3.后端非线性优化
我们原始数据的读取来自于各式各样的传感器,但是传感器的数据不可能完全精确,会有误差,这里我们称之为噪声,后端优化要考虑的问题,就是如何从这些带有噪声的数据中去估计整个系统的状态,以及这个状态估计的不确定性有多大,这里的状态包括机器人自身的轨迹,也包含地图。
在视觉SLAM中,前端负责图像的特征提取与匹配等等,后端则主要是滤波和非线性优化算法
2.2.4.回环检测
回环检测,又称闭环检测,主要解决位置估计随时间漂移的问题。与后端优化任务目标相同,但是使用的方法有所差异。
回环检测与“定位”和“建图”二者都有密切的关系。事实上,我们认为,地图存在的主要意义是让机器人知晓自己到过的地方。为了实现回环检测,我们需要让机器人具有识别到过的场景的能力。它的实现手段有很多。
视觉回环检测实质上是一种计算图像数据相似性的算法。由于图像的信息非常丰富,使得正确检测回环的难度降低了不少。
在检测到回环之后,我们会把“A与B 是同一个点”这样的信息告诉后端优化算法。然后后端根据这些新的信息,把轨迹和地图调整到符合回环检测结果的样子。这样,如果我们有充分而且正确的回环检测,则可以消除累积误差,得到全局一致的轨迹和地图。
2.2.5.建图
建图是指构建地图的过程。地图的形式随SLAM的应用场合而定,大体上分为度量地图与拓扑地图
度量地图
度量地图通常用稀疏和稠密分类,稀疏地图进行了一定程度上的抽象,稠密地图着重于建模所有看到的东西,定位时用稀疏路标地图就足够了,而导航往往需要稠密地图。
拓扑地图
相比于度量地图的精确性拓扑地图更强调地图元素之间的关系。拓扑地图是一个图(Graph).由节点和边组成,只考虑节点间的连通性,例如只关注 A、B 点是连通的,而不考虑如何从 A点到达 B点。它放松了地图对精确位置的需要,去掉了地图的细节,是一种更为紧凑的表达方式然而,拓扑地图不擅长表达具有复杂结构的地图。如何对地图进行分割,形成节点与边,又如何使用拓扑地图进行导航与路径规划,仍是有待研究的问题。
2.3.SLAM问题的数学表述
第一个方程是运动方程,xk是当前位置,xk-1是前一时刻的位置,uk是当前输入的数据,wk是噪声。
第二个方程是观测方程,zk,j是观测数据,观测方程描述的是,当机器人在xk位置上看到某个路标点yj时,产生了一个观测数据zk,j,vk,j是这次观测里的噪声。由于观测所用的传感器形式更多,这里的观测数据z及观测方程h也有许多不同的形式。
有了这两个方程,我们就成功节=的将SLAM“问题建模成了一个状态估计问题。
2.4.ch2的实践
书里这部分讲了如何安装ubuntu,并配置c++环境,我对这部分比较熟悉,就不写了。