博主本人于大二时大创选题做无人机SLAM,但是当时每个队员都在忙其他事,于是就只是草草水过成功结项了。现已大四,毕设再次想做于无人机SLAM有关的项目,遂重新学起以扎实功底,实事求是。
主要参考为《视觉SLAM十四讲》(第二版)
书中源码 https://github.com/gaoxiang12/slambook2
所需基础:高数线代概率论、C++、Linux基础
第一讲:预备知识
需再深入学习C++中的STL,C++11标准,学习Vim(但只用作文本编辑器,不建议用成IDE)
第二讲:初识SLAM
传感器:携带在机器人本体上的传感器(如激光传感器,相机,轮式编码器(测量轮子转动的角度),惯性测量单元IMU(测量运动的角速度和加速度))比安装于环境中的(如导轨、二维码标志等)更通用,且通常都是测量间接物理量而不是直接的位置数据。
相机:单目Monocula,双目Stereo,深度RGB-D
- 单目相机
必须移动相机才能估计它的运动Motion,同时估计场景中物体的远近和大小(称为结构Structure),利用物体在图像上的运动形成的视差(近处物体移动块远处移动慢)来定量判断物体远近(但仍为相对值)。单目估计的轨迹和地图 与真实轨迹和地图相差一个因子(成为尺度Scale),无法仅凭图像确定尺度——尺度不确定性(Scale Ambiguity)加粗样式
- 双目相机
两目之间的距离(称为基线Baseline)已知。能测到的深度范围与基线有关。基线距离越大,能测到的物体就越远。
需要大量计算才能不太可靠地估计每个像素点的深度。不依赖其他传感设备——既可用在室内也可用在室外。需要大算力(常用GPU和FPGA加速)
- 深度相机
通过红外结构光或ToF原理,主动发射光并接收返回的光,测出物体与相机的距离。比起双目可以节省大量算力,但存在测量范围窄,噪声大,视野小,易受日光干扰,无法测量透射材质等问题。
SLAM不是一个算法,而是一个完整的算法框架。
- 经典视觉SLAM框架
传感器信息读取→前端视觉里程计→后端(非线性)优化→建图
↓ ↑
回环检测 →→→→→→→→→→→→
-
传感器信息读取
在视觉SLAM中主要是相机图像信息读取&预处理。若为机器人,还可能有码盘、IMU等信息的读取和同步 -
前端视觉里程计(Visual Odometry , VO)
估算相邻图像间相机的运动,以及局部地图的样子。称为前端(Front End)
(叫里程计是因为和真实的里程计一样,都是只计算相邻时刻的运动,而和过去的信息没有关联,仅有短时记忆(如5~10帧))
仅通过VO来估计轨迹,将不可避免地出现**累计漂移(Accumulating Drift)**由于每次估计都会有一定误差,先前时刻的误差会传递到下一时刻。
因此需要回环检测——把机器人回到原始位置的事情检测出来,后端优化——根据回环检测的信息,校正整个轨迹的形状。
前端与计算机视觉更相关,研究图像的特征提取与匹配等 -
后端(非线性)优化(Optimization)
后端接收不同时刻VO测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。后端(Back End)主要指处理SLAM过程中的噪声问题。**SLAM本质:对运动主体自身和周围环境空间不确定性的估计
后端与滤波和非线性优化算法有关。**为解决SLAM问题,需要状态估计理论,把定位和建图的不确定性表达出来,再采用滤波器或非线性优化,估计状态的均值和不确定性(方差) -
回环检测(Loop Closure Detection)
判断机器人是否达到过先前的位置。若检测到回环,它会把信息提供给后端进行处理。主要解决位置估计随时间漂移的问题。 -
建图(Mapping)
根据估计的轨迹,建立与任务要求对应的地图。
地图可分为度量地图(Metric Map)和拓扑地图(Topological Map)
度量地图 强调精确表示地图中物体的位置关系,通常用稀疏(Sparse)与稠密(Dense)进行分类。
拓扑地图 强调地图元素之间的关系,拓扑是一个图,由节点和边组成,只考虑节点间的连通性。