版权声明:本文为博主原创文章,未经博主允许不得转载。

  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的更多相关文章

  1. 视觉SLAM算法框架解析(1) PTAM

    版权声明:本文为博主原创文章,未经博主允许不得转载. 本系列文章旨在总结主流视觉SLAM算法的框架,对比各个算法在子模块的差异,最终提炼出融合各个算法优点的架构. PTAM[1]是视觉SLAM领域里程 ...

  2. 视觉SLAM算法框架解析(2) ORB-SLAM

    版权声明:本文为博主原创文章,未经博主允许不得转载. ORB-SLAM[1]完全继承了PTAM(http://www.cnblogs.com/zonghaochen/p/8442699.html)的衣 ...

  3. SLAM学习笔记(2)SLAM算法

    SLAM算法分为三类:Kalman滤波.概率滤波.图优化 Kalman滤波方法包括EKF.EIF:概率滤波包括RBPF,FastSLAM是RBPF滤波器最为成功的实例, 也是应用最为广泛的SLAM方法 ...

  4. 视觉SLAM的主要功能模块分析

    视觉SLAM的主要功能模块分析 一.基本概念 SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and L ...

  5. 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势

    SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...

  6. 经典视觉SLAM框架

    经典视觉SLAM框架 整个视觉SLAM流程包括以下步骤: 1. 传感器信息读取.在视觉SLAM中主要为相机图像信息的读取和预处理. 2. 视觉里程计(Visual Odometry,VO).视觉里程计 ...

  7. 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析

    原文地址:http://www.cnblogs.com/zjiaxing/p/5548265.html 在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/d ...

  8. 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(1)

    在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只 ...

  9. (转) SLAM系统的研究点介绍 与 Kinect视觉SLAM技术介绍

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     SLAM系统的研究点介绍 本文主要谈谈SLAM中的各个研究点,为研究生们(应该是博客的多数读者吧)作一个提纲挈领的摘要.然后,我 ...

随机推荐

  1. csv文件——简单读操作01

    转载:https://www.py.cn/spider/advanced/14381.html import csv with open('C:\\Users\\del\\Desktop\\123.c ...

  2. springboot和shiro的整合

    直接贴上代码 1. 所需要的jar包 <dependency> <groupId>org.apache.shiro</groupId> <artifactId ...

  3. UVA 10801 多线程最短路

    题意:一栋摩天大楼从0层到K层,有N部电梯,每个电梯都有自己的运行速度,此外,对于某个电梯来说,并不是每一层都会停,允许在某一层进行电梯换乘,每次换乘固定消耗60秒,最终求从0层去K层的最短时间,如果 ...

  4. 复杂分布式架构下的计算治理之路:计算中间件 Linkis

    前言 在当前的复杂分布式架构环境下,服务治理已经大行其道.但目光往下一层,从上层 APP.Service,到底层计算引擎这一层面,却还是各个引擎各自为政,Client-Server 模式紧耦合满天飞的 ...

  5. C++---类成员变量定义为引用

    摘要:类成员变量是可以定义为引用类型的,但是我们需要注意一下用法 note1:在类中定义引用变量, 必须要在初始化列表中初始化该成员变量(const 类型数据成员也必须在初始化列表中进行初始化) #i ...

  6. Codeforces 1288C - Two Arrays

    题目大意: 给定n和m,有两个数组,两个数组的长度都等于m 数组内每个元素都在1到n中 对于两个数组对应的位置i,必须满足a[i]<=b[i] a数组必须是不下降的序列 b数组必须是不上升的序列 ...

  7. 远程SSH服务使用指南

    Author Email Yaoyao Liu yaoyaoliu@msn.com 本文所有教程以ubuntu为例,对其他unix内核系统如Debian.CentOS.macOS等也适用. 目录 安装 ...

  8. h5 移动端在阻止touchstart的默认事件时报错

    h5 移动端在阻止touchstart的默认事件时报错 解决办法, 可以添加 *{ touch-action: none;}即可消除错误

  9. Educational Codeforces Round 76 (Rated for Div. 2)E(dp||贪心||题解写法)

    题:https://codeforces.com/contest/1257/problem/E 题意:给定3个数组,可行操作:每个数都可以跳到另外俩个数组中去,实行多步操作后使三个数组拼接起来形成升序 ...

  10. day56-mysql-其他查询-面试题-重点

    一.重点 面试题 1. 临时表查询: -- 查询高于本部门平均工资的人员 #1.先查询部门人员的平均工资 SELECT dept_id,AVG(salary)as sal from person GR ...