导师让我了解SLAM,SLAM原本是比较小众的方向,最近自动驾驶火起来,做这个SLAM的人也多了,反过来也会推动机器人感知的发展。希望未来学成的时候,能赶上机器人大规模普及,就业一片蓝海。
关于视觉SLAM我感觉学习成本高、科研选题难和行业壁垒高,但是充满挑战不是很有意思嘛。
学SLAM方向跟motion planning科研都不好做,而且都很吃数学基础。学习难度的话,planning可能教程更多一点,SLAM相较于planning要小众一些,教程也相对较少,所以对《视觉SLAM十四讲》整理一些自己的理解,记录一下自己的学习路线。
SLAM (同时定位与地图构建),是指搭载特定传感器的主体,在没有环境先验信息的情况下,在运动过程中建立环境的模型,同时SLAM (同时定位与地图构建),是指搭载特定传感器的主体,在没有环境先验信息的情况下,在运动过程中建立环境的模型,同时估计自己的运动。如果这里的传感器是相机,那就称为视觉SLAM
如何使用《视觉SLAM十四讲》
注重理论和实践的结合、一讲一个主题(理论部分+实践部分)
全书由两部分组成:
①预备知识与SLAM概述(教材第1,2讲)
②三维空间的刚体运动(教材第3讲)
③李群与李代数(教材第4讲)
④相机模型与非线性优化(教材第5,6讲)
⑤特征点法视觉里程计(教材第7讲)
⑥直接法视觉里程计(教材第8讲)
⑦后端优化(教材第9,10讲)
⑧回环检测(教材第11讲)
⑨地图构建( 教材第12讲)
⑩工程实践(教材第13讲)
⑪SLAM的目前与未来(教材第14讲)
注:
学习本书会接触到–些必要的数学理论和许多编程知识,会用到Eigen、OpenCV、 PCL、 g2o、Ceres等库, 需要掌握他们在Linux操作系统中的使用方法。
学习本书最好具备以下基础:
1.高等数学(积分、求导)、线性代数(矩阵的运算)、概率论(极大似然估计)
2.C++语言基础,经典的slam框架都是用c++写的
3. Linux基础(代码都是在Linux系统上运行的)
①我在什么地方?——定位
②周围环境是什么样? ——建图
定位侧重对自身的了解,建图侧重对外在的了解
传感器:机器人感知外界环境的手段
传感器主要分为以下两类:
①携带于机器人本体上的传感器
例:机器人的轮式编码器、相机、激光传感器、惯性测量单元(IMU)等
②安装于环境之中的传感器
例:导轨、二维码标志等
例:GPS:需要能接收到卫星信号的环境
Marker、导轨:需要环境允许安装
其他 全景相机(可以观察周围360°的环境)、事件相机Event Camera(科研热点:只要有一个像素值变化,就会回传一个事件,响应速度非常快)、红外相机(科研热点:红外SLAM,传感器融合的SLAM)
①单目相机(只使用一个摄像头的相机)
通过相机的运动形成视差,可以测量物体相对深度。
优点: 结构简单,成本低,便于标定和识别
缺点: 在单张图片里,无法确定一个物体的真实大小。
它可能是一个很大但很远的物体,也可能是一个很近很小的物体。即单目SLAM估计的轨迹和地图将与真实的轨迹和地图相差一个因子,也就是 尺度(scale) ,单凭图像无法确定这个真实尺度,所以称 尺度不确定性
②双目相机(由两个单目相机组成)
通过基线来估计每个像素的空间位置。** (类似于人眼) **
优点: 基线距离越大,能够测量的距离就越远;并且可以运用到室内和室外。
缺点: 配置与标定较为复杂,深度量程和精度受到双目基线与分辨率限制,计算非常消耗计算资源,需要GPU (图形处理器) /FPGA设备(现场可编程门阵列)加速用两部相机来定位。
深度相机(RGB-D)
通过红外结构光或ToF(time of fly) 的物理方法测量物体深度信息。
③深度相机(RGB-D)
通过红外结构光或ToF(time of fly) 的物理方法测量物体深度信息。
优点: 相比于双目相机可节省大量的计算资源。
缺点: 是测量范围窄,噪声大,视野小,易受日光干扰,无法测量透射材质等问题,主要用在室内,室外很难应用。深度相机主要用来三维成像,和距离的测量。
相机综合的特点:
优点:没有累计误差、直接测量旋转平移、便宜
缺点:要求光照环境相对稳定、不适于高速运动场景、无法应对纹理缺失、单目丢失深度信息、双目计算量大
标定:
流程步骤如下:
在视觉SLAM中主要为相机图像信息的读取和预处理。
估算帧间运动,建立局部地图
视觉里程计的任务是估计相邻图像间相机的运动,以及局部地图的样子。(V0又称为前端)
视觉里程计通过相邻帧间的图像估计相机运动,并恢复场景的空间结构,但只计算相邻时刻的运动,不关心再往前的信息。但前端过程中必然存在误差,误差会不断累积,形成累积漂移 (会发现原本直的走廊变成了斜的,而原本90°的直角变成了歪的)。为消除漂移,我们需要回环检测和后端优化。
判断是否之前来过
回环检测的作用:主要解决位置估计随时间漂移的问题(通俗的理解就是,假设机器人经过一段时间又回到了原点(事实),但是我们的位置估计值没有回到原点,怎么解决)
回环检测要达到的目标:通过某种手段,让机器人知道“回到原点”这件事情,让机器人具有识别到过的场景的能力。再把位置估计值“拉”过去。
相机检测手段:判断与之前位置的差异,计算图像间相似性。
回环检测后:可将所得的信息告诉后端优化算法,把轨迹和地图调整到符合回环检测结果的样子。
修正前端造成的一些误差
对不同时刻的视觉里程计测量的相机位姿及回环检测的信息进行优化,得到全局一致的轨迹和地图。
定义:如何处理前端所传噪声的数据,从带有噪声的数据中估计整个系统的状态,以及这个状态估计的不确定性有多大——称为最大后验概率估计
通常来说,前端(图像的特征提取与匹配)给后端提供待优化的数据,以及这些数据的初始值。后端(滤波和非线性优化)负责整体的优化过程,它往往面对的就只有数据。
反映了SLAM问题的本质:对运动主体自身和周围环境空间不确定性的估计。(状态估计理论一估计状态的均值和不确定性)
根据估计的轨迹,建立任务要求对应的地图
地图大体.上可分为以下两类:
①度量地图(强调精确的表示地图中的位置关系)
常用稀疏与稠密进行分类
②拓扑地图
拓扑地图(更加强调元素之间的关系)
是一个图:由节点和边组成
假设小萝卜正携带着某种传感器在位置环境里运动。如何用数学语言描述这件事呢?
我们知道,相机通常是在某些时刻采集数据的,所以我们也关心这些时刻的位置和地图。
.段连续时间的运动变成了离散时刻t=1,2,3,…,k当中发生的事
这样,我们需要考虑以下两件事情:
从k-1时刻到k时刻,小萝卜的位置是如何变化的?
假设小萝卜在k时刻xk处观测到了某个路标yj,我们如何用数学语描述呢?
机器人会携带一个测量自身运动的传感器,这合传感器可以测量有关运动的读数,但不一-定直接就是位置之差,还可能是加速度、角速度这些信息。
我们可以用一个抽象的数学模型来描述:
数学模型:
机器人在xk位置上看到某个路标点yj产生了一个观测数据zk,j同样可以用一个抽象的数学模型描述:
数学模型:
事实上,根据机器人的真实运动和传感器的种类,存在着若干种参数化形式。而考虑视觉SLAM时,传感器是相机,则观测方程就是“对路标点拍摄后,得到图像中的像素”的过程(第五讲)
假设机器人在平面运动,那么位姿(位置+姿态)由两个位置的坐标和一个转角来描述xk=(x, y, Θ),同时,运动传感器能够测量到机器人在任意两个时间间隔位置和转角的变化量云(Δx, Δy, ΔΘ)T
于是此时的运动方程就可以写成: