SLAM 是Simultaneous Localization and Mapping 的缩写,中文译作“同时定位与地图构建”。它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。如果这里的传感器主要为相机,那就称为“视觉SLAM”。
在国际上,SLAM已经有近三十年的研究历史,也一直是机器人和计算机视觉的研究热点。二十一世纪以来,以视觉传感器为中心的视觉SLAM 技术,在理论和实践上都经历了明显的转变与突破,正逐步从实验室研究迈向市场应用。
1. 我在什么地方?——定位。
2. 周围环境是什么样?——建图。
按照相机的工作方式,我们把相机分为单目(Monocular)、双目(Stereo)和深度相机(RGB-D)三个大类。RGB-D 原理较复杂,除了能够采集到彩色图片之外,还能读出每个像素离相机的距离。
照片,本质上是拍照时的场景(Scene),在相机的成像平面上留下的一个投影。它以二维的形式反映了三维的世界。显然,这个过程丢掉了场景的一个维度:也就是所谓的深度(或距离)。
平移之后才能计算深度,以及无法确定真实尺度,这两件事情给单目SLAM 的应用造成了很大的麻烦。它们的本质原因是通过单张图像无法确定深度。所以,为了得到这个深度,人们又开始使用双目和深度相机。
VO 能够通过相邻帧间的图像估计相机运动,并恢复场景的空间结构。叫它为“里程计”是因为它和实际的里程计一样,只计算相邻时刻的运动,而和再往前的过去的信息没有关联。在这一点上,VO 就像一种只有很短时间记忆的物种一样。
后端优化主要指处理SLAM 过程中噪声的问题。传感器测量存在测量噪声。
机器人携带着传感器在环境中运动——运动方程和观测方程来描述自身运动和观测到的地标。
当我们知道运动测量的读数u,以及传感器的读数z 时,如何求解定位问题(估计x)和建图问题(估计y)?这时,我们把SLAM
问题建模成了一个状态估计问题:如何通过带有噪声的测量数据,估计内部的、隐藏着的状态变量?
状态估计问题的求解,与两个方程的具体形式,以及噪声服从哪种分布有关。我们按照运动和观测方程是否为线性,噪声是否服从高斯分布进行分类,分为线性/非线性和高斯/非高斯系统。用卡尔曼滤波、扩展卡尔曼、非线性优化等求解。
插播linux下编译C++:用cmake管理源代码。在一个cmake 工程中,我们会用cmake 命令生成一个makefile 文件,然后,用make命令,根据这个makefile 文件的内容,编译整个工程。在Linux 中,库文件分成静态库和共享库两种。静态库以.a 作为后缀名,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间。