非滤波单目视觉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. Postmark介绍

    一. 引言 Postmark是由著名的NAS提供商NetApp开发,用来测试其产品的后端存储性能. Postmark主要用于测试文件系统在邮件系统或电子商务系统中性能,这类应用的特点是:需要频繁.大量 ...

  2. PHP 安装 Xdebug 扩展(一)

    一.前言 1. Xdebug 简介 Xdebug 是一个开放源代码的 PHP 程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况.当前最新版本为 Xdebug 2.5.0 ...

  3. 04(2) 基于上下文相关的GMM-HMM声学模型2之参数共享

    1.三音素建模存在的问题 问题一:很多三音素在训练数据中没有出现(尤其跨词三音素) 问题二:在训练数据中出现过的三音素有相当一部分出现的频次较少 因此,三音素模型训练时存在较严重的数据不足问题 2.参 ...

  4. 微坑---微信小程序ios上时间字符串转换为时间戳时,在开发工具上和安卓手机上运行成功

    给定一个时间字符串  var time="2017-02-27 16:42:53" js有三种转换为时间戳的方法:1.var timestamp = Date.parse(time ...

  5. PL/SQL + Oracle客户端 配置记录

    oracle一直都没怎么用. oracle pl/sql也是在别人帮助下完成配置. 这次电脑重装后,自己搞定总结了下怎么配置. 1.下载Oracle 客户端. 安装的版本是win64_11gR2_cl ...

  6. 基于HTML5快速搭建TP-LINK电信拓扑设备面板

    今天我们以真实的TP-LINK设备面板为模型,完成设备面板的搭建,和指示灯的闪烁和图元流动. 先来目睹下最终的实现效果:http://www.hightopo.com/demo/blog_tplink ...

  7. [转]shell awk 入门,中级,高级使用

    awk很常用,对于我们在shell中分析log和file很有好处,很实用的东西,大家一起分享学习- 作为技术支持工程师,我们最最经常的工作就是要处理文本文件,不管是什么数据库最后都可以导成文本,我们就 ...

  8. JVM方法调用

    当我们站在JVM实现的角度去看方法调用的时候,我们自然会想到一种分类: 1.编译代码的时候就知道是哪个方法,永远不会产生歧义,例如静态方法,private方法,构造方法,super方法. 2.运行时才 ...

  9. PHP中的运算符

    一.算术运算符   运算符 名称 描述 实例 结果 x + y 加 x 和 y 的和 2 + 2 4 x - y 减 x 和 y 的差 5 - 2 3 x * y 乘 x 和 y 的积 5 * 2 1 ...

  10. bash shell中测试命令

    bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径.如果test命令中列出的条件成立,test命令就会退出并返回退出状态吗0 .这样if-than语句就与其他编程 ...