非滤波单目视觉slam笔记1
非滤波单目视觉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的更多相关文章
- SLAM: 单目视觉SLAM的方案分类《机器人手册》
摘抄知乎上一段有趣的话: 如果你出门问别人『学习SLAM需要哪些基础?』之类的问题,一定会有很热心的大哥大姐过来摸摸你的头,肩或者腰(不重要),一脸神秘地从怀里拿出一本比馒头还厚的<Mu ...
- Slam笔记I
视觉Slam笔记I 第二讲-三位空间刚体运动 点与坐标系: 基础概念: 坐标系:左手系和右手系.右手系更常用.定义坐标系时,会定义世界坐标系,相机坐标系,以及其他关心对象的坐标系.空间中任意一点可由空 ...
- 阻塞 io 非阻塞 io 学习笔记
阻塞 io 非阻塞 io 学习笔记
- 左偏树 / 非旋转treap学习笔记
背景 非旋转treap真的好久没有用过了... 左偏树由于之前学的时候没有写学习笔记, 学得也并不牢固. 所以打算写这么一篇学习笔记, 讲讲左偏树和非旋转treap. 左偏树 定义 左偏树(Lefti ...
- GIT非常见命令使用笔记
1:修改已经提交N次代码的user.name和user.email 解决我在多电脑间,使用不同账户,git config 的global,system,local配置忽略改动,而添加了多台电脑ssh ...
- spring boot教程(一):入门篇(非原创,总结笔记性质)
一,什么是spring boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发 ...
- SLAM笔记
1.matrix.preTranslate()和matrix.postTranslate()的区别 matrix.preTranslate(matrix_1); matrix.postTranslat ...
- SLAM论文阅读笔记
[1]陈卫东, 张飞. 移动机器人的同步自定位与地图创建研究进展[J]. 控制理论与应用, 2005, 22(3):455-460. [2]Cadena C, Carlone L, Carrillo ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
随机推荐
- 不完全图解HTTP
在2D平面上行走的时候,认识只局限于“点”,刚认识一个新的点,就把之前的那个点忘记了,捡了芝麻丢西瓜.只从3D视角俯瞰时,把这些点连接在一起,点成线,线成面时,才能有所顿悟.话不多说,这是我对HTTP ...
- Laravel 5.2 教程 - 文件上传
一.简介 Laravel 有很棒的文件系统抽象层,是基于 Frank de Jonge 的 Flysystem 扩展包. Laravel 集成的 Flysystem 提供了简单的接口,可以操作本地端空 ...
- office web apps 部署-搭建域控服务器
开始第一条先说注意事项:我所配置的环境是用了三台2012server虚拟机,三台虚拟机必须要加下域控,而且登录操作的时候必须以域账号登录,否则测试不通过!在笔记本上搭建了两个虚拟机(window se ...
- 原生JS和JQuery代码编写窗口捕捉函数和页面视觉差效果(scroll()、offsetTop、滚动监听的妙用)
想实现窗口滚动到一定位置时,部分网页的页面发生一些变化,但是手头没有合适的插件,所以就想到自己编写一个简易的方法, 想到这个方法要有很高的自由度和适应性,在这,就尽量的削减其功能,若有错误的地方或者更 ...
- mysql数据库面试总结
数据库优化 建表优化 1)数据库范式 l 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列. 如电话列可进行拆分---家庭电话.公司电话 l 第二范式(2NF):首先是 1NF,另外包 ...
- .Net程序员学用Oracle系列(23):视图理论、物化视图
1.视图理论 1.1.视图的存储 1.2.视图的作用 1.3.视图的工作机制 1.4.视图的依赖性 1.5.可更新的连接视图 1.6.内联视图 2.物化视图 2.1.刷新物化视图 2.2.物化视图日志 ...
- [转载]PHP文件解压代码
来自开源中国:
- CentOS7.2静默安装oracle11g
http://www.centoscn.com/image-text/config/2015/0528/5552.html http://www.linuxidc.com/Linux/2016-04/ ...
- maven(02)--简单的命令操作
使用maven有什么好处呢? 这个问题留到该文的末尾进行总结>v< maven测试 在上一篇文章中介绍了如何简单的编译一个java文件,执行mvn compile命令后,你会发现在你新建的 ...
- 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩
百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...