@《视觉SLAM十四讲》知识点与习题
《视觉SLAM十四讲》第二讲知识点整理+习题
正在学习SLAM相关知识,将一些关键点及时记录下来。
知识点整理
本讲主要是介绍了SLAM,主要是视觉SLAM方面的基础知识,对一些术语进行了大体的解释,并且将整本书的内容的逻辑梳理了一遍,手把手上手视觉SLAM。
SLAM问题的本质:对运动主体自身和周围环境空间不确定性的估计
- 定位 ,“我在什么地方”,即自身状态
- 建图 ,“周围环境是怎么样”
- 传感器,分为携带于机器人本体和安装于环境中两种情况。但是后者约束了外部环境,前者只能通过测量到的间接物理量来计算位置数据。后者更适用于未知环境
- 相机,单目相机、双目相机、深度相机三大类。以一定速率拍摄周围的环境,形成一个连续的视频流。
- 单目相机:结构特别简单,成本特别低,单目SLAM非常受研究者关注。
但是在投影的过程中,丢失了深度信息,然而这个距离(物体与相机)很关键。因此,从单目SLAM中恢复三维结构,需要改变相机的视角,即移动相机来估计相机的运动,才能计算深度。
在相机移动过程中,不同远近的物体在图像上的运动会形成视差,有助于定量的判断
单目SLAM估记得轨迹和地图将与实际的轨迹和地图相差一个因子,即所谓的尺度scale。由于单目SLAM无法仅凭图像得到这个真实尺度,所以又称为尺度不确定性 - 双目相机和深度相机:测量物体与我们之间的距离,消除尺度不确定性。
双目相机:通过基线(两个相机之间的距离)来估计每个像素的空间位置。双目相机需要大量的计算才能估计每一个像素点的深度。测量的深度范围与基线相关。后者越大,测量到的就越远。
但是,双目相机的配置与标定均较为复杂,深度量程和精度受双目的基线与分辨率所限,且视差的计算非常消耗计算资源。室内室外均可
深度相机:通过物理测量手段,通过红外或TOF来获得距离,相较于双目相机节省了大量的计算。
但是,深度相机存在测量范围窄、噪声大、视野小、易受日光干扰、无法测量透射材质等诸多问题,主要用于室内。
- 单目相机:结构特别简单,成本特别低,单目SLAM非常受研究者关注。
- 经典视觉SLAM框架,传感器信息读取、视觉里程计(VO)、后端优化(Optimization)、回环检测(Loop Closing)、建图(Mapping)。
- 如果把工作环境限制在静态、刚体,光照变化不明显、没有人为干扰的场景,那么这个SLAM系统是相当成熟的了。
- 传感器信息读取:视觉SLAM:相机图像信息的读取和预处理。在机器人中,还有码盘、惯性传感器等信息的读取和同步
- VO: 估计相邻图像间相机的运动,以及局部地图的样子。VO只计算相邻时刻的运动,而和再往前的过去的信息没有关联。将相邻时刻的运动”串“起来,就构成了运动轨迹,就进行了定位。且根据每个时刻的相机位置,计算出各像素对应的空间点的位置,就得到了地图。
但是,会出现累计漂移。即误差会逐帧累加。 - Optimization: 接受不同时刻VO测量的相机位姿,以及Loop Closing的信息,对他们进行优化,得到全局一致的轨迹和地图,对整个轨迹的形状进行校正。
主要处理噪声的问题。需从带噪声的数据中估计整个系统的状态,以及这个状态(轨迹、地图)估计的不确定性。将不确定性表达出来以后,采用filtering或非线性优化,估计状态的均值和不确定性(方差) - Loop Closing: 判断机器人是否到达过先前的为止。若检测到回环,将信息提供给Optimization进行处理。实质是一种计算图像数据相似性的算法
- Mapping: 根据估记的轨迹,建立于任务要求对应的地图。根据需求,对环境进行描述。
度量地图:精确地表示地图中物体的位置关系,用稀疏与稠密对齐分类。稀疏:选择具有代表意义的东西——路标,适用于定位。 稠密:建模所有看到的东西,适用于导航。但是稠密地图存储空间大,且大多数时候很多细节部分是无用的。
拓扑地图:强调地图元素之间的关系。由节点和边组成,只考虑节点之间的连通性。但是不擅长表达具有复杂结构的地图。如何对地图进行分割形成节点与边,又如何使用拓扑地图进行导航进行路径规划,仍是有待研究的问题
- 观测:在k时刻于xk处探测到了某一个路标yj,产生了一个观测数据zk,j。
运动:从k-1时刻到k时刻,位置x的变化。需要测量自身运动的传感器。
当知道运动测量的读数u,以及传感器的读数z,如何求解定位问题(估计x)和建图问题(估计y)。因此,SLAM问题转换成为了一个状态估计问题 - 状态估计问题:根据噪声是否服从高斯分布进行分类,分为线性/非线性和高斯/非高斯系统。
- 线性高斯系统的无偏的最优估计可以又卡尔曼滤波器KF给出
- 复杂的非线性非高斯系统,使用以扩展卡尔曼滤波器和非线性优化两大类方法求解
- 最早的实时视觉SLAM系统是基于EKF开发的,但是EKF的缺陷是线性化误差和噪声高斯分布假设。
- 目前,主流视觉SLAM使用以图优化为代表的优化技术进行状态估计
习题
- 阅读文献1, 2。心得会在另一个博客中记录
- 阅读综述3,4,5,6,7
- g++命令参数
g++ Test.cpp:功能:生成默认为a.exe的文件,这个过程包含了编译和链接
g++ -o Test.exe Test.cpp。-o命令是输出的意思,这样就输出了Test.exe。使用-o可以指定目标名称 8 - 注意需要首先使用+按钮添加添加二进制文件,修改名字,且将环境选择为default。Debug界面里保持默认配置即可。接下来设置断点,点击Default按钮。会看到界面有些许的变化,上方出现Stop All和Stop按钮。在左侧打开Variables一栏,即可以查看变量的值。
- 如果将CMakeLists.txt中的target_link_libraries(useHello hello_shared)注释掉,在Build时会报错,提示”Linking CXX executable useHello … recipe for target ‘useHello’ failed … undefined reference to ‘printHello()’"这句话就表示,此时虽然将库文件包含进去了,但是没有给头文件,无法知道该如何去调用该库文件中的函数,从而无法知道printHello()函数应该如何使用
- 看《cmake实践》。把一些用到的点,书上没有解释的整理如下
cmake . :命令后面的点号,代表本目录
中间文件有:CMakefiles, CMakeCache.txt, cmake_install.cmake等文件,以及Makefile
CMakeLists.txt: cmake的构建定义文件,文件名大小写相关
若工程中有多个目录,需每个目录均存在CMakeLists.txt
PROJECT指令定义工程名称,同时也隐式的定义了两个cmake变量,projectName_BINARY_DIR和projectName_SOURCE_DIR
SET指令可以显式的定义变量