非滤波单目视觉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. Java并发包分析——BlockingQueue

    之前因为找实习的缘故,博客1个多月没有写了.找实习的经历总算告一段落,现在重新更新博客,这次的内容是分析Java并发包中的阻塞队列 关于阻塞队列,我之前是一直充满好奇,很好奇这个阻塞是怎么实现.现在我 ...

  2. 观察者模式(Observer)发布、订阅模式

    观察者模式定义了对象之间一对多的依赖关系,这样一来,当一个对象改变时,他的所有依赖者都会收到通知并自动更新.   模式中的角色 1.抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里 ...

  3. 让Cocos2dx中的TestCPP中的Box2dTest运行起来

    一般而言,如果你导入TestCPP到VS2012中去后,会编译十几分钟才会出现窗口界面,这是包含Cocos2dx所有功能的一个demo,功能非常齐全强大,里面有两个关于Box2d的测试案例,一个是Bo ...

  4. Java中File

    1.什么是流? Java中的流是个抽象的概念,当程序需要从某个数据源读入数据的时候,就会开启一个数据流,数据源可以是文件.内存或网络等等.2.使用File类操作文件或目录属性 public class ...

  5. Java 脚本化编程指南

    Java 脚本化编程指南 Java脚本化API为谁准备? 脚本语言的一些有用的特性是: 方便:大多数脚本语言都是动态类型的.您通常可以创建新的变量,而不声明变量类型,并且您可以重用变量来存储不同类型的 ...

  6. 【转】典型的JavaScript面试题

    问题1: 作用域(Scope) (function() { "use strict"; var a = b = 5; })(); console.log(b); 控制台(conso ...

  7. 白话讲session

    什么是session Session一般译作会话,牛津词典对其的解释是进行某活动连续的一段时间.从不同的层面看待session,它有着类似但不全然相同的含义.比如,在web应用的用户看来,他打开浏览器 ...

  8. Longest Palindromic Substring2015年6月20日

    Given a , and there exists one unique longest palindromic substring. 自己的解决方案; public class Solution ...

  9. 实时语音视频技术webrtc的编译总结

    webrtc编译教程 一.安装depot_tools工具 首先你的电脑上安装了git 1)    下载depot_tools cd到下载的目录下 git clone https://chromium. ...

  10. struts2.1.6教程六、使用标签

    1.基础表单标签 准备工作:建立struts2tag项目,搭建好struts2的开发环境.在html我们常用的基础表单标签主要有文本域.密码域.提交.重置四种.它们在strust2中可以通过标签来生成 ...