视觉SLAM

没什么好说的,最近在ROS下做视觉计算。双目摄像机导航。推荐高翔的《视觉SLAM十四讲》。知识点很全,推导也很详细。随便写一下吧,但项目压在手里,很烦。想起来就写一点笔记。

视觉传感器的分类

视觉传感器分为主要的三种吧。单目相机(Monocular),双目摄像机(stereo),单目加红外(RGBD)。

单目相机

单目相机便宜。但反解决自身姿态会很麻烦。一般用对极几何计算摄像的旋转矩阵R,平移矩阵T。通过三角计算可以计算得到。但这里就有一个问题。在相机纯旋转下,无法计算。所以你在跑单目相机的slam时,初始化第一帧图像一定需要平移一下摄像头。单目相机很多,随便一个网络相机就可做

双目相机

双目相机,emmm。我觉得是一个坑。但很符合人类认知世界的方式。人通过双眼视差理解物体远近,不可能精确获得物体深度信息。但是我只能说这个会比RGBD坑一点。因为视差图很消耗计算资源。而且获得深度图用可能穿过实际物体。这是有像素误匹配导致深度计算过大。双目相机,zed,小觅相机(mynteye)

RGBD

采用RGB相机和红外结构光计算物体深度和获取图像。由于红外结构光通过物理方法计算深度,是不会穿过墙面,但任何传感器实际使用都会存在噪声。kinect或其他3D体感相机都可。

视觉特征点

常用视觉特征点计算SIFT,SUFT。

检测区域 SIFT SURF
尺度空间 DOG与不同尺度的图片卷积 不同尺度的box filters与原图片卷积
特征点检测 先进行非极大抑制,再去除低对比度的点。再通过Hessian矩阵去除边缘的点 先利用Hessian矩阵确定候选点,然后进行非极大抑制
特征方向 在正方形区域内统计梯度的幅值的直方图,找max对应的方向。可以有多个方向。 在圆形区域内,计算各个扇形范围内x、y方向的haar小波响应,找模最大的扇形方向
特征描述子 采样点划分,计算每个区域的采样点的梯度方向和幅值,统计成直方图,一共128维 2020的区域划分为44的子区域,每个子区域找5*5个采样点,计算采样点的haar小波响应,记录∑dx,∑dy,∑

变种的算法很多,不介绍了。原因就是慢。
采用的是ORB。FAST特征点获取和bried二进制特征描述子。
ORB-SLAM: a versatile and accurate monocular SLAM system
ORB-SLAM2 an open-source SLAM System for Monocular, Stereo and RGB-D Camera
这个系统很不错。
ORB速度很快,FAST通过圆形区域内像素灰度查找,可以快速查到角点。由于只是查找到角点,角点不具备旋转不变性。通过计算两方向的灰度变化获得角度值,从而定义一个图像矩。可以描述灰度变化方向。

SLAM计算流图

视觉SLAM
使用三个线程,主要计算特征点并决定是否加入关键帧。局部关键帧匹配。回环检测(检测是否观察相同区域,如果观察到相同的特征会匹配之前观测帧并更新全部关键帧数据)

噪声处理

只要是个传感器就会引入噪声。滤波是常用算法,卡尔曼滤波及其变种。Extended Kalman filter引入非线性优化,非线性优化在做匹配时非常重要。比如高斯牛顿法,Levenburg-Marquart这类采用二阶矩匹配,效果都很好。由于采用非线性,也有研究者将深度学习引入SLAM匹配,方法很多,效果不一。kitti数据集里有效果比对。另一种是开源图优化,21世纪最大发现就是在机器终端维护的二阶矩是稀疏的。图优化采用特殊方法快速计算。原理我还没搞明白。嗯,加油吧,希望项目能做完。