非滤波单目视觉slam

主要分为以下8部分

  • 数据类型
  • 数据关联
  • 初始化
  • 位姿估计
  • 地图维护
  • 地图生成
  • 失效恢复
  • 回环检测

数据类型

  • 直接法(稠密,半稠密)

基本原理是亮度一致性约束,\(J(x,y) = I(x + u(x,y)+ v(x,y))\) ,x,y是图像的像素坐标,u,v是同一场景下的两幅图像I,J的对应点的像素偏移。

起源是光流法,由于使用了图像中大部分的信息,对纹理差的部分鲁棒性比直接法好,但是计算量也加大,要并行化计算。

  • 间接法

就是特征点匹配,一般要考虑到特征点的鲁棒性,对光照,尺度,视角的变化有很好的鲁棒性,还要考虑实时性的。大部分系统使用的是Fast作为特征提取器,

描述子可以是BRIEF,BRISK,SURF,SIFT,也可以是图像块

  • 杂交法

上面两个的结合,直接法用于构建特征匹配,间接法用于优化相机的位姿。

数据关联

数据关联就是在不同图像的观测之间建立匹配关系,这里主要讨论间接法的数据关联,直接法本身摄像头位姿估计就是一种数据关联.间接法有以下几种关联

  • 2D --> 2D

没有地图,没有相机之间的变换,只能做2d--2d的数据关联。对于描述子描述的特征,进行描述子距离的L1范数,L2范数,汉明距离等,

对于区域图像块描述子,通常使用模板匹配中差值平方和(SSD,ZMSSD)

  • 3D --> 2D

前一时刻的位姿估计和3D结构已知,就是pnp的过程,

  • 3D --> 3D

在回环检测的时候,两幅图像中观察到的3D点可以用来求两幅图像之间的相似变换

初始化

一般的初始化流程:

主要是为找到跟第一幅图像有足够数量的特征匹配点,视差足够大的第二幅图像

PTAM初始化要求用户两次输入,来获取地图中的前2个关键帧;需要用户在第一个和第二个关键帧之间,做与场景平行的、缓慢平滑相对明显的平移运动。

SVO使用单应进行初始化,但SVO不需要用户输入,算法使用系统启动时的第一个关键帧;提取FAST特征,用图像间的KLT算法跟踪特征,视差足够的时候就选择作为第二幅图像,然后计算单应矩阵,只能是2维平面

LSD-SLAM从第1个图像随机初始化场景的深度,通过随后的图像进行优化。LSD-SLAM初始化方法不需要使用两视图几何。不像其他SLAM系统跟踪两视

图特征,LSD-SLAM只用单个图像进行初始化

ORB-SLAM 并行计算基本矩阵和单应矩阵,根据对称转移误差(多视图几何)惩罚不同的模型,最终选择最合适的模型

不同的系统使用的初始化方法如下:

位姿估计

通用的位姿估计流程

因为数据关联计算量巨大,大部分SLAM系统都有一个先决条件,即对于每个新图像的位姿,用于数据关联工作都有具体要求和限制。

这个先验信息可能是恒速运动模型,可能是假设运动量不大,使用上一时刻的位姿。

PTAM,DT-SLAM,ORB-SLAM,DPPTAM都假设相机做平滑运动采用恒定速度运动模型,用跟踪到的之前两幅图像的位姿变化估计作为当前图像的先验知识(用于数据关联的图像位姿的要求和限制)。但是,在相机运动方向上有猛烈移动时,这样的模型就容易失效

LSD-SLAM和SVO都假设在随后的图像,相机位姿没有明显改变,因此,这种情况下都是用高帧率相机。

直接和间接方式都是通过最小化图像间的测量误差估计相机位姿;

直接方法测量光度误差(像素值),间接方法通过最小化从图像上一位姿的地图中获得的路标的重投影到当前帧的重投影误差(几何位置)。

地图生成

地图生成的一般流程

地图生成模块将世界表示成稠密(直接)或稀疏(间接)的点云。

系统将2D兴趣点三角化成3D路标,并持续跟踪3D坐标,然后定位相机,这就是量度地图(pose + point)。但是,相机在大场景运行时,量度地图的大小就会无限增大,最终导致系统失效

拓扑地图(pose-graph)可以减少这一弊端,它尽量将地图中的量度信息最小化,减少几何信息(尺度,距离和方向)而采用连接信息。视觉SLAM中,拓扑地图是一个无向图,节点通常表示关键帧,关键帧通过边连接,节点之间存在相同的数据关联

拓扑地图与大场景的尺度比较吻合,为了估计相机位姿,也需要量度信息;从拓扑地图到量度地图的变化并不是一件容易的事情,因此,最近的视觉 SLAM 系统都采用混合地图,局部量度地图和全局拓扑地图。

地图制作过程会处理新路标将其添加到地图中,还检测和处理离群点。图标点的添加可以通过三角化,或者滤波实现的位置估计(一般是逆深度,加上一个概率分布),收敛到一定的程度就可以加入到地图中。

地图维护

地图维护通过捆集调整(Bundle Adjustment)或位姿图优化(Pose-Graph)来优化地图。地图扩展的过程中,新的3D路标基于相机位姿估计进行三角化。经过一段时间的运行,由于相

机累积误差增加,相机位姿错误,系统出现漂移(scale-drift)。

位姿图优化相比全局捆集调整返回较差的结果。原因是位姿图优化只用于关键帧位姿优化,(要是路标相对于的是关键帧表示,而不是世界下的表示,会相应地调整路标的3D结构);全局捆集调整都优化关键帧位姿和3D结构。

地图维护也负责检测和删除地图中的由于噪声和错误特征匹配的离群点。

失效恢复

不管是错误的用户运动(相机位姿的剧烈改变和运动模糊),或者相机观测无特征的区域,还是无法匹配足够的特征,或者其他原因,视觉SLAM系统都会track lost.

一般是视觉词带,pnp

闭环检测

想法

感觉一般的slam按照上面的8个部分,想一遍要能想通,原理上面一般就算是可以了。就剩下代码实践了。

系统有没有特定的要求,大范围的可以吗,室内还是室外,是直接法还是间接法,对应的就是稀疏地图还是(半)稠密地图,优化的是几何误差还是光度误差。

需不需要初始化,需要人工的干预,非2维平面可以吗,对应的就是计算本征矩阵还是单应矩阵。还是基于滤波的方法,不需要初始化,后续优化就可以。

然后就是tracking,因为视觉slam是一个非凸函数,需要一个初始值,对应的就是你的prior是什么,恒速运动模型还是高速相机,把前一帧的位姿当做初始值。

追踪的过程的优化函数是什么,是光度不变,还是几何误差,就是g2o中边,顶点的构造。

当然还要维护地图,地图中的点是怎么表示,基于逆深度,还是欧式几何表示,camera-anchor的表示。地图维护中要进行BA,还是Pose-Graph的优化,还是杂交。

然后就是闭环的检测,基于视觉词带,还是随机取一些帧进行Image Alignment。

当然这其中还有无数细节,运动快,模糊是怎么处理的(加大搜索范围,从金字塔coarse-fine的搜索),Tracking lost在什么情况下发生,怎么进行重定位。

最小二乘法要做几次,怎么时候收敛,要不要给他设个时间约束,权重怎么设置等等。

文献

A survey on non-filter-based monocular Visual SLAM systems

有一个中文版的 《非滤波方法的单目视觉SLAM系统综述》

下一篇我会把SVO,ORB-SLAM,LSD-SLAM的主要代码学习一下

非滤波单目视觉slam笔记1的更多相关文章

  1. SLAM: 单目视觉SLAM的方案分类《机器人手册》

    摘抄知乎上一段有趣的话:     如果你出门问别人『学习SLAM需要哪些基础?』之类的问题,一定会有很热心的大哥大姐过来摸摸你的头,肩或者腰(不重要),一脸神秘地从怀里拿出一本比馒头还厚的<Mu ...

  2. Slam笔记I

    视觉Slam笔记I 第二讲-三位空间刚体运动 点与坐标系: 基础概念: 坐标系:左手系和右手系.右手系更常用.定义坐标系时,会定义世界坐标系,相机坐标系,以及其他关心对象的坐标系.空间中任意一点可由空 ...

  3. 阻塞 io 非阻塞 io 学习笔记

    阻塞 io 非阻塞 io 学习笔记

  4. 左偏树 / 非旋转treap学习笔记

    背景 非旋转treap真的好久没有用过了... 左偏树由于之前学的时候没有写学习笔记, 学得也并不牢固. 所以打算写这么一篇学习笔记, 讲讲左偏树和非旋转treap. 左偏树 定义 左偏树(Lefti ...

  5. GIT非常见命令使用笔记

    1:修改已经提交N次代码的user.name和user.email 解决我在多电脑间,使用不同账户,git config 的global,system,local配置忽略改动,而添加了多台电脑ssh ...

  6. spring boot教程(一):入门篇(非原创,总结笔记性质)

    一,什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...

  7. SLAM笔记

    1.matrix.preTranslate()和matrix.postTranslate()的区别 matrix.preTranslate(matrix_1); matrix.postTranslat ...

  8. SLAM论文阅读笔记

    [1]陈卫东, 张飞. 移动机器人的同步自定位与地图创建研究进展[J]. 控制理论与应用, 2005, 22(3):455-460. [2]Cadena C, Carlone L, Carrillo ...

  9. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

随机推荐

  1. [Day03] 循环语句、list相关练习题

    用户输入两个数,求平均值. 让用户一直输入数字,如果输入的是'0',终止程序打印所有数字之和. 让用户一直输入数字(只输入数字),如果没输入任何值,终止程序打印所有输入数字的平均值. 求出这个list ...

  2. Composer 中国全量镜像(二)

    一.查看当前镜像地址 在命令行输入如下命令,即可查看镜像地址: $ composer config -g repo.packagist {"type":"composer ...

  3. linux文件系统下的特殊权限

    SUID, SGID, Sticky 1 权限 r, w, x user, group, other 2 安全上下文 前提:进程有属主和属组:文件有属主和属组: (1) 任何一个可执行程序文件能不能启 ...

  4. php学习之重要内置函数

    1. require_once()函数 此函数在脚本执行期间包含并执行指定的文件,与require语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含. require_once()函数 ...

  5. Ubuntu server搭建Java web服务器

    1. 在Ubuntu server中安装ssh,如果是购买服务器的话,这已经是安装的了,包括vim 获取超级权限 先更新安装包 开始安装ssh ssh已经启动了 2. 安装Xshell并创建连接安装X ...

  6. [刷题]Google Code Jam 2017 - Round1 C Problem A. Ample Syrup

    https://code.google.com/codejam/contest/3274486/dashboard Problem The kitchen at the Infinite House ...

  7. c# .net core 下的网络请求

    本文章是在VS2017的环境下,.net core 1.1版本以上. 在这期间,由于.net core 并不基于IIS,我们的过去的网络请求代码在.net core框架下,有可能会出现不兼容,报错的现 ...

  8. Linux系统下安装Mysql5.7.18教程收集分享

    本人最近服务器新手入门,需要搭建一个在linux虚拟机上的服务器 第一天再装虚拟机,选的linux系统CentOS,一切顺利. 第二天,要给虚拟机装Mysql,但是需要用到命令行进行安装/操作等,我是 ...

  9. HBuilder 安装使用教程

    前段时间朋友让我帮忙打包一个 IPA 文件(使用 HTML5 开发的 Web 应用),了解到 HBuilder 这款 H5 开发神器.之前一直使用 WebStorm 开发 H5,闲来无事也学习下 HB ...

  10. Vulkan Tutorial 05 逻辑设备与队列

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 在选择要使用的物理设备之后,我们需要设置一个逻辑设备用于交 ...