SLAM 技术 是一种用于帮助机器人自定位的技术。定位,需要知道:
1)我周围是什么样的环境;
2)我在这个环境当中的哪个地方;
机器人可以通过传感器去感知周围的环境,这些传感器可以分为依赖外部的和靠自身的。依赖外部例如:GPS、环境中的QR code来标注landmark,自身的例如:camera, IMU (Inertial measurement unit测量加速度)等。
硬件部分:
关于camera的种类:常见的有Monocular(单目)、Stereo(双目)和RGBD (深度)摄像头。
单目摄像头有自己的limitation:
深度缺失:如果需要重构,则需要移动摄像视角。如果把单目用于SLAM中,我们需要移动来做: Motion(自身) and Structure(物体远近) Detection. 通过近处物体移动快,远处物体移动慢,移动的时候,会形成parallax(视差)来做structure的重构。
为了弥补Monocular的缺点,Stereo和RGB-D出现。其各自优缺点:
Stereo: 原理是通过,双目之间的距离(Baseline)来通过数学计算每个像素点的深度。Computation intensive. 所以,通过要通过GPU、FPGA等硬件支撑去实现高计算效率。另外,基线越长,能探测的距离越长。所以,无人车的基线一般比较大。其比RGB-D要稳定,对环境的要求没有那么高。缺点是:高强度的计算使得对硬件的要求高。
RGB-D:通过infrared ray红外线的Time of Flight原理去探测物体深度。常见的商用产品有:kinect等。光感光、对物体材质敏感、噪声大是其主要缺点。但其计算量相较Stereo会小不少。
系统部分:
Visual Odometry:
通过记录运动前后的传感器数据(例如camera的two frames), 进行Motion state and strucuture 的重构。注意,这里的VO只是当前的two frames,对再之前的数据不会涉及。单纯的VO会有Accumulating Drift的问题,也就是之前的计算误差的不断的叠加,导致最后结果严重失真。正是因为这点,引入了后端优化和回环检测。
Loop Closing:
如果走到了同一个地方,识别出来,告诉后端处理。这样可以准确的校准不必要的误差(把drift拉回来)。一般采用的方法是利用camera的输出来对比,如果场景相似度高于某个threshold,则认定是同一个地方。
Backend Optimization:
1)根据运动和观测方程是否是线性以及对应的噪声的分布(高斯或者非高斯)进行滤波 + 非线性优化,达到估计状态的均值和方差(不确定)。Linear Gaussian (LG)的情况最简单,无偏最优估计可以由Kalman Filter(卡尔曼滤波给出)。对于非线性非高斯的系统,Non Linear Non Gaussian (NLNG)则可以用Extended Kalman Filter和非线性优化方法去求解。早起EKF是比较popular的方法,后来为了克服EKF的缺点(线性误差和噪声高斯分布的解释),Particle Filter等被开发出来,后来更发展到了非线性优化。Graph Optimization是其中一种。如今,一般只要计算资源允许,都选用optimization。
2)根据Loop closing的输出来校准。
Build the map:
Map一般分为两种:Metric Map v.s. Topo Map
1) Metric Map:
Sparse Metric Map: 只记录selected landmark。这种用于做localization是足够的。
Dense Metric Map: 一般用于导航。有障碍物等细节。2D的grid and 3D的voxel,每个单位有occupied, vacancy and unknown表达障碍物信息。常用的导航算法有:A star and D star. 十分消耗存储空间。
2) Topo map: 就是节点和连线,缺乏许多中间的地形、路线的信息;只考虑连通性。