SLAM 框架概述

最近看了一些关于SLAM的书和博客,个人感觉大概的框架(rgbdslam)已经差不多了,在这记录一下

SLAM分类

根据传感器,可以分为
*雷达,又分二维三维
*摄像头,也就是视觉
*其他与混合
我最近看的是视觉SLAM所以以下展开的介绍也都是视觉部分的,更确切的说是rgbd的.
视觉SLAM又分为:
单目SLAM,顾名思义,一个摄像头
双目SLAM,两个摄像头,二者相对姿态距离固定
rgbdSLAM,深度摄像头,根据飞行时间(TOF)的原理,可以得到每个像素点到相机距离

由rgbd相机到点云

由于我看的是基于rgbd的SLAM(拜半闲居士所赐),所以以下基本就是rgbd的啦~

单张照片到点云

1,原理
相机会提供rgb和depth,根据小孔成像原理,可以得到一组在当前相机坐标下的一组点云.具体原理请看半闲居士,链接http://www.cnblogs.com/gaoxiang12/p/4652478.html
2,编程
仅提几个要点,会用到点云库,PCL,还有开源计算机视觉库opencv,其中包含了很多函数和需要的结构,认真读一读就差不多可以大概明白.可以参考上面半闲居士的链接,或者我作为一个小白的解读http://blog.csdn.net/qq_30513593/article/details/77488322

图像的配准

为什么会有图像的配准呢?因为当相机坐标和姿态发生变化时,如果依靠机器人的传感器来确定和前一状态的变换的话,那误差将会相当相当大啊,但是因为相机移动比较慢,可以找到两张照片中相同的东西来求解变换.也就是只利用照片的信息来计算他们二者之间的位移关系,根据东西的不同,差不多也就两种方法:
直接法,直接法基于灰度不变原理(很强),利用梯度啥的,也有在rgb上下工夫的
特征法,先提取两张照片中的特征,根据描述子进行匹配,将两张照片中匹配到的点进行解算,得到位移.特征提取和描述子提取方法甚多…尚在探索
解算结果会得到旋转向量和平移向量,旋转向量方向为转轴,大小为弧度

点云的拼接

首先单张照片已经可以得到点云,但是要拼接点云就要用到上面图像配准得到的信息啦,一般来说,点云储存为世界坐标,假设第一张照片相机所在位置就是原点,那么第二张由已经得到的位移信息就可以将第二张照片的点云信息转换到世界坐标下.
PCL中提供了转换坐标的函数

pcl::transformPointCloud( input, output, T );

其中T为4x4的矩阵,包含了旋转数据和平移的数据,还可以有缩放(平时不用)

视觉里程计

因为一个slam不可能只有两帧数据,难免有鱼目混珠,所以需要有选择地挑选某些帧来保证正确性.比如:
*goodmatch比较少的
*in_liner比较小的
*求解出来之后变换矩阵太大的(因为摄像头不会很剧烈的运动)

SLAM的优化

其实到上一部分,SLAM就基本结束了.但是!!!(所有但是前面都是废话),这样的SLAM会飞~~~
因为每一步都有误差,每一步都有误差,越往后越不敢想…不飞起来才怪,所以,还需要采取一些措施免得它飞走.大概也是两种思路:
基于滤波,就是在每一步都进行滤波优化,减小误差,比较常见的EKF(扩展卡尔曼),PK(粒子滤波)等等
基于平滑,图优化就是在后端储存位姿图,图中节点对应机器人不同时刻状态,利用边(观测到的信息配准得到)进行约束.
我认为基于图优化的SLAM其实包含两部分,一部分就是图优化,一部分是回环检测

图优化

有点晚了…就不写了
图优化请参考:http://www.cnblogs.com/gaoxiang12/p/4739934.html

回环检测

回环检测请参考http://www.cnblogs.com/gaoxiang12/p/4754948.html

2017.09.18 周1 晴

你可能感兴趣的:(SLAM)