三维重建7:Visual SLAM算法笔记
VSLAM研究了几十年,新的东西不是很多,三维重建的VSLAM方法可以用一篇文章总结一下。
此文是一个好的视觉SLAM综述,对视觉SLAM总结比较全面,是SLAM那本书的很好的补充。介绍了基于滤波器的方法、基于前后端的方法、且介绍了几个SensorFusion方法,总结比较全面。并且文中给出了代码的下载链接,比较方便。
原文链接:Visual SLAM算法笔记
摘抄部分,如有不适,请联系删除或者移步原文链接
一、Visual-Inertial Odometry算法笔记
名字缩写太多,我有点凌乱了,做个区分:
DVO: TUM的基于RGBD camera的VO方法
SVO: Gatech的基于semi-direct的hybrid VO方法
DSO: TUM的direct sparse VO方法
X、Sensor Fusion笔记
使用monocular camera + IMU的方案来做SLAM/Odometry,一般被称作Visual-Inertial Odometry (VIO)或者Visual-Inertial Navigation System (VINS)。这一类paper大多出自Robotics社区,主要focus在如何更好的在Visual SLAM中融合IMU数据。IMU数据不单可以帮助resolve单目的scale ambiguity,一般情况下还可以提高SLAM的精度和鲁棒性。需要注意的是,想要从IMU数据获得准确的姿态没那么容易,一般需要做sensor fusion,从经典的complementary filter做gyroscope、accelerometer、magnetometer的融合,再到Mahony filter等更复杂的融合算法,有很多可以选择的算法,其精度和复杂度也各不相同。现在的Android系统里一般可以直接获得手机姿态,至于其中用了哪种融合算法本人还没有仔细研究过,精度也有待考察。在Robotics社区的VIO paper中,一般是直接用原始的IMU数据或者经过简单滤波的数据,一般需要对IMU的bias进行建模(尤其在MEMS IMU中,所谓的零飘和溫飘对精度影响很大,有些要求比较高的情况下甚至需要将其置于恒温状态工作)。
MSCKF (2007-2013) [14,15]
基于Kalman filter的MSCKF跟EKF-based SLAM一样也是出自Robotics社区,从MSCKF 1.0 [14]到MSCKF 2.0 [15],精度得到了不错的提高,据说Google Project Tango中的SLAM算法就是用的MSCKF算法。
传统的EKF-based SLAM做IMU融合时,跟前面介绍的MonoSLAM类似,一般是每个时刻的state vector保存当前的pose、velocity、以及3D map points坐标等(IMU融合时一般还会加入IMU的bias),然后用IMU做predict step,再用image frame中观测3D map points的观测误差做update step。MSCKF的motivation是,EKF的每次update step是基于3D map points在单帧frame里观测的,如果能基于其在多帧中的观测效果应该会好(有点类似于local bundle adjustment的思想)。所以MSCKF的改进如下: predict step跟EKF一样,但是将update step推迟到某一个3D map point在多个frame中观测之后进行计算,在update之前每接收到一个frame,只是将state vector扩充并加入当前frame的pose estimate。这个思想基本类似于local bundle adjustment(或者sliding window smoothing),在update step时,相当于基于多次观测同时优化pose和3D map point。具体细节可以参考paper[15]。
OKVIS (2013-2014)[16] (code available)
相对应于MSCKF的filter-based SLAM派系,OKVIS是keyframe-based SLAM派系做visual-inertial sensor fusion的代表。从MSCKF的思想基本可以猜出,OKVIS是将image观测和imu观测显式formulate成优化问题,一起去优化求解pose和3D map point。的确如此,OKVIS的优化目标函数包括一个reprojection error term和一个imu integration error term,其中已知的观测数据是每两帧之间的feature matching以及这两帧之间的所有imu采样数据的积分(注意imu采样频率一般高于视频frame rate),待求的是camera pose和3D map point,优化针对的是一个bounded window内的frames(包括最近的几个frames和几个keyframes)。
需要注意的是,在这个optimization problem中,对uncertainty的建模还是蛮复杂的。首先是对imu的gyro和accelerometer的bias都需要建模,并在积分的过程中将uncertainty也积分,所以推导两帧之间的imu integration error时,需要用类似于Kalman filter中predict step里的uncertainty propagation方式去计算covariance。另外,imu的kinematics微分方程也是挺多数学公式,这又涉及到捷联惯性导航(strapdown inertial navigation)中相关的很多知识,推导起来不是很容易。这可以另起一个topic去学习了。
OKVIS使用keyframe的motivation是,由于optimization算法速度的限制,优化不能针对太多frames一起,所以尽量把一些信息量少的frames给marginalization掉,只留下一些keyframes之间的constraints。关于marginalization的机制也挺有趣,具体参见paper[16]。
ETH Zurich的ASL组另外有一篇基于EKF的VIO paper,叫ROVIO [17],也有code,具体还没细看,听说鲁棒性不错。
IMU Preintegration (2015-2016)[18] (code available in GTSAM 4.0)
从OKVIS的算法思想中可以看出,在优化的目标函数中,两个视频帧之间的多个imu采样数据被积分成一个constraint,这样可以减少求解optimization的次数。然而OKVIS中的imu积分是基于前一个视频帧的estimated pose,这样在进行optimization迭代求解时,当这个estimated pose发生变化时,需要重新进行imu积分。为了加速计算,这自然而然可以想到imu preintegraion的方案,也就是将imu积分得到一个不依赖于前一个视频帧estimated pose的constraint。当然与之而来的还有如何将uncertainty也做类似的propagation(考虑imu的bias建模),以及如何计算在optimization过程中需要的Jacobians。相关的推导和理论在paper [18]中有详细的过程。在OKVIS的代码ImuError.cpp和GTSAM 4.0的代码ManifoldPreintegration.cpp中可以分别看到对应的代码。
[1]. David Nister, Oleg Naroditsky, and James Bergen.Visual Odometry. CVPR 2004.
[2]. Andrew Davison, Ian Reid, Nicholas Molton, and Olivier Stasse.MonoSLAM: Real-time single camera SLAM. TPAMI 2007.
[3]. Ethan Eade and Tom Drummond. Monocular SLAM as a Graph of Coalesced Observations. ICCV 2007.
[4]. Georg Klein and David Murray. Parallel Tracking and Mapping for Small AR Workspaces. ISMAR 2007.
[5]. Georg Klein and David Murray. Improving the Agility of Keyframe-based SLAM. ECCV 2008.
[6]. Georg Klein and David Murray. Parallel Tracking and Mapping on a Camera Phone. ISMAR 2009.
[7]. Hauke Strasdat, J.M.M. Montiel, and Andrew Davison.Visual SLAM: Why Filter?. Image and Vision Computing 2012.
[8]. Raul Mur-Artal, J. M. M. Montiel, and Juan D. Tardos.ORB-SLAM: A Versatile and Accurate Monocular SLAM System. IEEE Transactions on Robotics 2015.
[9]. Richard Newcombe, Steven Lovegrove, and Andrew Davison.DTAM: Dense Tracking and Mapping in Real-Time. ICCV 2011.
[10]. Jakob Engel, Jurgen Sturm, and Daniel Cremers.Semi-Dense Visual Odometry for a Monocular Camera. ICCV 2013.
[11]. Christian Forster, Matia Pizzoli, and Davide Scaramuzza.SVO: Fast Semi-Direct Monocular Visual Odometry. ICRA 2014.
[12]. Jakob Engel, Thomas Schops, and Daniel Cremers.LSD-SLAM: Large-Scale Direct Monocular SLAM. ECCV 2014.
[13]. Jakob Engel, Vladlen Koltun, and Daniel Cremers.Direct Sparse Odometry. In arXiv:1607.02565, 2016.
[14]. Anastasios Mourikis, Stergios Roumeliotis. A multi-state constraint Kalman filter for vision-aided inertial navigation. ICRA 2007.
[15]. Mingyang Li, Anastasios Mourikis. High-Precision, Consistent EKF-based Visual-Inertial Odometry. International Journal of Robotics Research 2013.
[16]. Stefan Leutenegger, Simon Lynen, Michael Bosse, Roland Siegwart, and Paul Timothy Furgale.Keyframe-based visual–inertial odometry using nonlinear optimization. The International Journal of Robotics Research 2014.
[17]. Michael Bloesch, Sammy Omari, Marco Hutter, and Roland Siegwart.Robust Visual Inertial Odometry Using a Direct EKF-Based Approach. IROS 2015.
[18]. Christian Forster, Luca Carlone, Frank Dellaert, and Davide Scaramuzza.On-Manifold Preintegration for Real-Time Visual-Inertial Odometry. IEEE Transactions on Robotics 2016.
[19]. George Vogiatzis, Carlos Hernandez. Video-based, Real-Time Multi View Stereo. Image and Vision Computing 2011. (Supplementary material)
三维重建7:Visual SLAM算法笔记的更多相关文章
- SLAM学习笔记(2)SLAM算法
SLAM算法分为三类:Kalman滤波.概率滤波.图优化 Kalman滤波方法包括EKF.EIF:概率滤波包括RBPF,FastSLAM是RBPF滤波器最为成功的实例, 也是应用最为广泛的SLAM方法 ...
- 三维重建:SLAM算法的考题总结
参考英文维基:https://en.wikipedia.org/wiki/Slam 参考文档:视觉slam研究分析的一点认识 1. 请简单描述您对机器人的SLAM的概念理解? 答: 机器人需要在自身位 ...
- 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势
SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...
- SLAM学习笔记(1)基本概念
SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and Localization), 即时定位与地图构建 ...
- 泡泡一分钟:Topomap: Topological Mapping and Navigation Based on Visual SLAM Maps
Topomap: Topological Mapping and Navigation Based on Visual SLAM Maps Fabian Bl¨ochliger, Marius Feh ...
- ORB-SLAM: A Versatile and Accurate Monocular SLAM System 笔记(一)
ORB-SLAM: A Versatile and Accurate Monocular SLAM System Abstract 这篇文章提出了 ORB-SLAM,一个基于特征的单目SLAM系统,这 ...
- Visual SLAM
Visual SLAM 追求直接SLAM技术,而不是使用关键点,直接操作图像强度的跟踪和映射. 作为直接方法,LSD-SLAM使用图像中的所有信息,包括边缘,而基于关键点的方法只能在拐角处使用小块.这 ...
- 什么是视觉Visual SLAM
什么是视觉Visual SLAM What Is Visual SLAM? What are the origins of visual SLAM? and what are some other a ...
- [SLAM]Karto SLAM算法学习(草稿)
Karto_slam算法是一个Graph based SLAM算法.包括前端和后端.关于代码要分成两块内容来看. 一类是OpenKarto项目,是最初的开源代码,包括算法的核心内容: https:// ...
随机推荐
- Django——12 中间件 上下文处理器 admin后台
Django 中间件 中间件介绍 中间件的第一个例子 中间件的第二个例子 上下文处理器 admin后台管理 中间件 Django中间件(Middleware)是一个轻量级.底层的“插件”系统,可以 ...
- [JZOJ4687]奇袭
[JZOJ4687]奇袭 题目 由于各种原因,桐人现在被困在Under World(以下简称UW)中,而UW马上要迎来最终的压力测试——魔界入侵. 唯一一个神一般存在的Administrator被消灭 ...
- 【无限滚动加载数据】—infinite-scroll插件的使用
网上对于infinite-scroll插件使用的例子不多.但由于它的出现,鼓吹了瀑布流形式的页面展示方式,所以不得不了解了解这种新的分页方式. 官网上有对infinite-scroll的详细描述,但一 ...
- pyenv-virtualenv环境搭建
搞了个新服务器,搭个python环境 安装pyenv 直接上懒人脚本,不怕麻烦想手动装的就麻烦您自己查吧~ curl -L https://raw.githubusercontent.com/yyuu ...
- CF #321 (Div. 2) E
用线段树维护哈希,类似于进位制的一个哈希 a[i]*p^i+a[i-1]*p^i-1... 然后,线段树存在某区间的哈希的值,对于更新,则只需提前计算出整段的哈希值即可. 判断是否相等,由于相隔为d, ...
- 可编辑ztree节点的增删改功能图标控制---已解决
每文一语:休倚时来势,提防运去时 <!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - beforeEd ...
- 迅为4412开发板Linux驱动教程/硬件知识及原理图的使用
视频教程下载地址:http://pan.baidu.com/s/1pJwxUfL 嵌入式研发流程介绍 • PCB研发流程介绍 – 方案,原理图(网表) – layoutproject师(gerber文 ...
- Apache OFbiz service engine 源代码解读
上一篇看完了ofbiz entity engine,这篇再来过一下ofbiz的service engine.service engine层在设计模式的使用上跟entity engine有些相似,最典型 ...
- 关于MySQL错误 2005 - Unknown MySQL server host 'localhost' (0) 原因及解决方法
今天在外面开navicat for mysql的时候,怎么也连不上自己本机上的数据库,一直显示2005 - Unknown MySQL server host 'localhost' (0): 错误代 ...
- JArray获取元素值
MXS&Vincene ─╄OvЁ &0000003 ─╄OvЁ MXS&Vincene MXS&Vincene ─╄OvЁ:今天很残酷,明天更残酷,后天很美好 ...