参考教材——《视觉SLAM十四讲》高翔著
第一讲 前言
笔记
- SLAM
- Simultaneous Localization And Mapping——同时定位与地图构建
- 搭载特定传感器的主体,在没有环境先验信息的情况下,在运动过程中建立环境的模型,同时估计自己的运动
- 本质——对运动主体自身和周围环境空间不确定性的估计
- 模块体系
- 视觉里程计
- 后端优化
- 建图
- 回环检测
习题
第二讲 初识SLAM
笔记
-
单目SLAM
- 估计的轨迹和地图,将与真实的轨迹、地图,相差一个因子,也就是所谓的尺度(scale)
- 由于单目SLAM无法仅凭图像确定这个真实尺度,所以又称为尺度不确定性
-
双目SLAM——Stereo
- 通过视差来测量物体与相机的距离,克服单目无法检测距离的缺点
- 由两个单目相机组成,两个相机之间的距离(基线baseline)是已知的,我们可以通过基线来估计每个像素的空间位置
- 对双目相机进行扩展可以得到多目相机,本质没有区别
- 双目相机测量到的深度范围与基线相关,基线距离越大,能测量到的就越远,因此一般双目相机体积较大
- 缺点:
- 配置和标定均较为复杂,其深度量程和精度受双目的基线与分辨率限制,而且视差的计算非常消耗计算资源,需要使用GPU&FPGA设备加速后才能实时输出整张图像的距离信息
- 因此当先双目的主要问题是计算量无法解决
-
深度相机(RGB-D相机)
- 通过红外结构光或者Time-of-Flight(ToF)原理,像激光传感器那样,通过主动向物体发射光并接受返回的,测出物体离相机的距离
- 相较于双目相机,通过物理测量手段,可以节省大量的计算量
- 在SLAM方面主要用于室内
- 缺点:测量范围窄,噪声大,视野小,易受日光干扰,无法测量投射材质
-
传统视觉SLAM流程
graph a[传感器数据]-->b[视觉里程计]-->c[非线性优化]-->d[建图] a[传感器数据]-->e[回环检测]-->c[非线性优化]- 视觉里程计(Visual Odometry,VO)
- VO又称为前端(Front End)
- 估算相邻图像间相机的运动,以及局部地图的样子
- 只计算相邻时刻的运动而和其他数据没有关系,可以想象成一条金鱼
- 仅通过VO来估计轨迹会不可避免地出现累计漂移(Accummulating Drift),当一个时刻的角度出现误差时,之后的不管之后的数据多么精确,都会不可避免地产生误差。因此为了解决累计漂移问题,需要引入后端优化和回环检测两种技术,回环检测负责把“机器人是否走回原位”的事情检测出来,后端优化则根据此信息校正整个轨迹的形状
- 优化(Optimization)
- 又称为后端(Back End)
- 接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对他们进行优化,得到全局一致的轨迹和地图
- 主要处理SLAM过程中噪声的问题,即如何从这些带有噪声的数据中,估计整个系统的状态,以及这个状态估计的不准确性有多大————这被称作最大后验概率估计(Mazimum-a-Posteriori,MAP)
- 视觉SLAM中,前端和计算机视觉研究领域更加相关,比如图像特征提取与匹配,而后端主要时滤波和非线性优化算法
- 回环检测(Loop Closing)
- 又称闭环检测(Loop Closure Detection)
- 解决位置估计随时间漂移的问题
- 判断机器人是否曾经到达过先前的位置
- 可以通过图像间的相似性来完成回环检测,如果检测到回环,会把信息提供给后端进行处理
- 建图(Mapping)
- 根据估计的轨迹,建立与任务要求对应的地图
- 度量地图(Metric Map)
- 强调精确地表示地图中物体的位置关系
- 通常用稀疏(Sparse)和稠密(Dense)对其进行分类
- 稀疏地图进行了一定程度的抽象,并不需要表达所有物体,在地图当中选取具有代表性的地标(Landmark)用于表示地图,其他元素则全部忽略
- 稠密地图着重于建模所有看到的东西
- 二维度量地图时许多小格子(grid),三维度量地图则是许多小方块(Voxel),一个单位含有占据、空闲、未知三状态,以表达格内是否由物体
- 拓扑地图(Topological Map)
- 强调地图元素之间的关系
- 数据结构为图(Graph),由点、边组成,只考虑节点间的连通性
- 放松了地图对精确位置的需要,去掉地图细节问题,是更为紧凑的表达方式
- 不擅长表达具有复杂结构的地图
- 如果将工作环境限定在静态、刚体、光照变化不明显、没有人为干扰的场景,那么SLAM系统应该是相当成熟的
- 视觉里程计(Visual Odometry,VO)
-
SLAM问题的数学表述
- 相机主要处理离散时刻的问题(t = 1,...,k),用x表示机器人自身的位置。各个时刻的位置标记为(x_{1},...,x_{k}),这些位置构成了轨迹
- 设地图由多个路标(Landmark)组成,每个时刻,传感器会测量到一部分路标点,得到它们的观测数据
- 不妨设路标点共有N个,用(y_{1},...,y_{N})表示
- 在此前提下可以描述
- 运动 —— 从k-1~k时刻,位置x如何变化
- 由此抽象出运动方程
- (x_{k}=f(x_{k-1},u_{k},w_{k}))
- (u_{k})是运动传感器读数(输入)
- (w_{k})为噪声
- 由此抽象出运动方程
- 观测 —— 机器人在k时刻,于(x_{k})处探测到某个路标(y_{j})
- 由此观测方程
- 机器人在(x_{k})位置上看到某个路标点(y_{j}),产生了观测数据(z_{k,j})
- (z_{k,j}=h(y_{j},x_{k},v_{k,j}))
- (v_{k,j})为观测噪音
- 由此观测方程
- 运动 —— 从k-1~k时刻,位置x如何变化
- 还可以使用参数化描述问题
- 位姿 —— 由两个位置和一个转角来描述
- (x_{k}=[x,y, heta]_{k}^{T})
- 运动传感器能够检测到每两个时间间隔位置和转角的变化量(u_{k}=[varDelta_{x},varDelta_{y},varDelta_{ heta}]_{k}^{T})
- 则运动方程就可以具体化为( left[ egin{array}{c} x\ y\ heta\ end{array} ight] _k=left[ egin{array}{c} x\ y\ heta\ end{array} ight] _{k-1}+left[ egin{array}{c} varDelta x\ varDelta y\ varDelta heta\ end{array} ight] _k+w_k )
- 二维激光传感器观测一个2D路标点时,能够观测两个量:路标点与机器人本体之间的距离r和夹角(phi)
- 我们记路标点为(y=[p_{x},p_{y}]^{T}),观测数据为(z=[r,phi]^{T})
- 为保持简洁,省略下标
- 则观测方程可以具体化为( left[ egin{array}{c} r\ phi\ end{array} ight] =left[ egin{array}{c} sqrt{left( p_x-x ight) ^2+left( p_y-y ight) ^2}\ arctan left( frac{p_y-y}{p_x-x} ight)\ end{array} ight] +v )
- 位姿 —— 由两个位置和一个转角来描述
- 最终,SLAM过程可以总结为两个基本方程:( left{ egin{array}{c} x_k=fleft( x_{k-1},u_k,w_k ight)\ z_{k,j}=hleft( y_j,x_k,v_{k,j} ight)\ end{array} ight. )
- 这两个方程描述了最基本的SLAM问题:当我们知道测量读数u,以及传感器读数z,如何求解定位问题(估计x)和建图问题(估计y)
- 此时我们将SLAM问题建模成一个状态估计问题:如何通过带有噪声的测量数据,估计内部的、隐藏的状态变量?
- 问题的求解与两个方程的具体形式以及噪声服从哪种分布有关
- 运动和观测方程是否为线性
- 噪声是否服从高斯分布
- 可以分为
- 线性/非线性和高斯/非高斯系统
- 线性高斯系统(LG系统)是最简单的,其无偏最优估计可以由卡尔曼滤波器(KF)给出
- 复杂的非线性非高斯系统(NLNG系统),我们会使用扩展卡尔曼滤波器(EKF)和非线性优化两大类方法去求解
- 问题的求解与两个方程的具体形式以及噪声服从哪种分布有关