视觉SLAM算法框架解析(3) SVO
版权声明:本文为博主原创文章,未经博主允许不得转载。
SVO(Semi-direct Visual Odometry)[1]顾名思义是一套视觉里程计(VO)算法。相比于ORB-SLAM,它省去了回环检测和重定位的功能,不追求建立、维护一个全局地图,更看重tracking的效果,追求高计算速度、低CPU占用率,所以SVO非常适合在计算资源有限的移动设备上使用。SVO对PTAM的改进主要在两个方面:1)高效的特征匹配;2)鲁棒的深度滤波器。SVO比PTAM、ORB-SLAM计算速度快很多的最主要原因是SVO不需要每一帧都提取特征点。在tracking线程,当前帧的特征点是从上一帧用光流法传递到过来的,只有在mapping线程插入新关键帧时才需要提取特征点。另一个原因是SVO使用了深度滤波器,PTAM和ORB-SLAM只用两帧图像三角化出地图点,只要地图点没有被判定为外点,就固定不变了(除非BA阶段调整),而SVO的深度滤波器会根据多帧图片不断收敛地图点的不确定度,从而得到更可靠的地图点。因为地图点更可靠,所以SVO只需要维护更少的地图点(PTAM一般维护约160到220个特征点,SVO在fast模式下维护约120个地图点),从而加快了计算速度。

在tracking线程,SVO综合了直接法和特征点法的优点设计了全新的三步策略。第一步(Sparse Model-based Image Alignment),用Lucas-Kanade光流法粗算当前帧的位置姿态。具体方法是:把前一帧对应的地图点投影到当前帧(初始位置姿态为单位阵),比较前一帧特征点和当前帧投影点附近区域(patch)像素灰度值的差别,通过最小化photometric error求解当前帧的位置姿态。由于这一步是粗算,为了加快计算速度,patch选取了4*4的大小,并且没有做仿射变换(affine warp)。为了加速,从金字塔的最顶层(默认是第五层)逐层计算(默认计算到第3层)。第二步(Feature Alignment),求出特征点在当前帧的精确像素坐标。对于每个特征点单独考虑,找到和当前帧视角最接近的共视关键帧(这个关键帧和当前帧的视角差别越小,patch的形变越小,越可以更精准地匹配),然后再次用Lucas-Kanade光流法最小化photometric error。相比于第一步的粗测,这一步选取了8*8的patch,并且做仿射变换,可以得到亚像素级别的精度。第三步(Pose & Structure Refinement),通过前两步找到精确的匹配点之后,可以通过最小化重投影误差进一步优化相机姿态以及地图点位置(这一步就和patch无关了,地图点和投影点都是点,cost function是点到点的距离),这一步又分成三小步:1)Motion-only BA,地图点不变,只优化当前帧位置姿态。2)Strcture-only BA,当前帧不动,只优化地图点位置。3)Local BA,附近关键帧和可见的地图点都被优化了,这一小步在fast模式下是不做的。
SVO之所以叫半直接法(Semi-direct)就是因为前两步估计策略像直接法(LSD-SLAM、DSO为代表)一样最小化photometric error,而第三步则和特征点法(PTAM、ORB-SLAM为代表)一样最小化重投影误差。如果省略第一步,直接从第二步开始计算会更耗时,因为为了匹配远距离的特征点需要把patch设置得很大,而且会需要剔除外点。而如果省略第二步和第三步则会产生严重的累积漂移,因为第一步只是考虑前后帧,而第三步把当前帧和关键帧、地图点对齐了。
在mapping线程,SVO首先判定当前帧是否是关键帧(追踪成功的特征点数量是否少于一个阈值就插入新关键帧),如果是,则提取特征点、初始化深度滤波器;如果不是,则更新深度滤波器看它是否收敛,如果收敛,则生成新的地图点辅助tracking线程计算。SVO提取特征点的方式和ORB-SLAM类似,也是先构造金字塔,再划分网格提取最显著的FAST特征(如果提取不到足够显著的FAST角点,SVO2.0[2]会找梯度值最大的像素作为edgelet特征点,它和普通FAST角点在计算中的唯一差别是:在tracking线程的第二步feature alignment阶段,edgelet只沿梯度方向优化)。每个特征点有一个单独的深度滤波器,深度值被设定为高斯分布与均匀分布的加权和(作者论证了这种假设比单一高斯分布要好,更详细的解读可以参考REMODE),高斯分布描述内点的分布,均匀分布描述外点的分布。深度值滤波器在初始化时,不确定度是很大的(如果是stereo或者RGBD相机可以直接给出接近真值的初值,深度滤波器会收敛的更快),之后每计算出新一帧的位置姿态,都可以根据几何约束沿着极线找特征点匹配,然后根据三角测量的原理得到不确定度更小的后验深度值。当不确定度小于一个阈值,这个地图点就会被建立。地图点立即就会被用来估计运动。
参考文献:
[1] Forster C, Pizzoli M, Scaramuzza D. SVO: Fast semi-direct monocular visual odometry[C]// IEEE International Conference on Robotics and Automation. IEEE, 2014:15-22.
[2] Forster C, Zhang Z, Gassner M, et al. SVO: Semidirect Visual Odometry for Monocular and Multicamera Systems[J]. IEEE Transactions on Robotics, 2017, 33(2):249-265.
视觉SLAM算法框架解析(3) SVO的更多相关文章
- 视觉SLAM算法框架解析(1) PTAM
版权声明:本文为博主原创文章,未经博主允许不得转载. 本系列文章旨在总结主流视觉SLAM算法的框架,对比各个算法在子模块的差异,最终提炼出融合各个算法优点的架构. PTAM[1]是视觉SLAM领域里程 ...
- 视觉SLAM算法框架解析(2) ORB-SLAM
版权声明:本文为博主原创文章,未经博主允许不得转载. ORB-SLAM[1]完全继承了PTAM(http://www.cnblogs.com/zonghaochen/p/8442699.html)的衣 ...
- SLAM学习笔记(2)SLAM算法
SLAM算法分为三类:Kalman滤波.概率滤波.图优化 Kalman滤波方法包括EKF.EIF:概率滤波包括RBPF,FastSLAM是RBPF滤波器最为成功的实例, 也是应用最为广泛的SLAM方法 ...
- 视觉SLAM的主要功能模块分析
视觉SLAM的主要功能模块分析 一.基本概念 SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and L ...
- 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势
SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...
- 经典视觉SLAM框架
经典视觉SLAM框架 整个视觉SLAM流程包括以下步骤: 1. 传感器信息读取.在视觉SLAM中主要为相机图像信息的读取和预处理. 2. 视觉里程计(Visual Odometry,VO).视觉里程计 ...
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析
原文地址:http://www.cnblogs.com/zjiaxing/p/5548265.html 在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/d ...
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(1)
在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只 ...
- (转) SLAM系统的研究点介绍 与 Kinect视觉SLAM技术介绍
首页 视界智尚 算法技术 每日技术 来打我呀 注册 SLAM系统的研究点介绍 本文主要谈谈SLAM中的各个研究点,为研究生们(应该是博客的多数读者吧)作一个提纲挈领的摘要.然后,我 ...
随机推荐
- shell中获取文件目录方法
1.``:表示执行对应的命令,嵌套时使用`\`\``,注意\进行转义,同时执行多个命令时使用:隔开file=`cd "\`dirname $0\`";pwd`echo $file ...
- ubuntu服务器上配置tomcat
前言 嗯,最近想在自己的腾讯云服务器上跑个项目玩玩,由于服务器是重装的系统,所以,只能自己手动装tomcat. 不过,tomcat是基于java的,必须又java环境tomcat才能够使用,因此首先要 ...
- C#-类型转换和引用转换
对象的引用可以被: 隐式地向上转换 显示的向下转换 向上转换 向上转换是指一个从一个基类指向一个子类: House house = new House(); Asset asset = house; ...
- jQuery如何给DOM添加ID
ID每个元素只能有一个,ID名同一页面也不能重复,addID方法是不需要的,和其他属性一样用attr方法就行了, $(singleTarget).attr('id','idName'); 更简单的 $ ...
- vue每次运行起来端口不一致问题
原因:portfinder新发布的版本异常 解决方案:npm install portfinder@1.0.21
- lvm镜像卷
镜像能够分配物理分区的多个副本,从而提高数据的可用性.当某个磁盘发生故障并且其物理分区变为不可用时,你仍然可以访问可用磁盘上的镜像数据.LVM在逻辑卷内执行镜像. 系统版本 # cat /etc/ce ...
- python计算范数的问题
计算norm时, 注意把数据改为float 类型, 否则结果不对! import numpy.linalg as LA d = LA.svd(features.toarray(),full_matri ...
- 基于SpringBoot框架企业级应用系统开发全面实战
Eclipse 安装spring-tool-suite教程,并创建一个新的springboot项目 使用SpringBoot构建项目,加载SSM整合的applicationContext.xml的注解 ...
- python-day2爬虫基础之爬虫基本架构
今天主要学习了爬虫的基本架构,下边做一下总结: 1.首先要有一个爬虫调度端,来启动爬虫.停止爬虫或者是监视爬虫的运行情况,在爬虫程序中有三个模块,首先是URL管理器来对将要爬取的URL以及爬取过的UR ...
- goweb- session和数据存储
session和数据存储 Web开发中一个很重要的议题就是如何做好用户的整个浏览过程的控制,因为HTTP协议是无状态的,所以用户的每一次请求都是无状态的,我们不知道在整个Web操作过程中哪些连接与该用 ...