三维重建7:Visual SLAM算法笔记

2023-05-16

        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)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三维重建7:Visual SLAM算法笔记 的相关文章

  • 项目篇:移动平台机械臂视觉定位抓取实施(基于ROS架构)

    ROS包内容 xff1a 代码暂不公开 这篇日志的目的是快速项目实施 xff0c 所以详细的部分会不断补充 举例如下 xff1a 项目包1 xff1a 项目地址 Pylon Camera Aruco ros AUBO Robot 大寰机械手
  • 查看rospackage包的依赖

    rospack libs only l my package
  • 转载:Snorkel - 可编程的数据标注神器

    我知道你已经用上了最先进的深度学习模型 xff0c 不过 xff0c 还在人工标注数据吗 xff1f 这有点过时了 xff01 快来了解下Snorkel 最新的基于弱监督学习的大规模训练数据标注神器 现在的机器学习尤其是深度学习模型很强大
  • ubuntu16.04使用阿路比-LPMS-IG1进行ros数据发布

    官方资料下载 https www alubi cn support download 这个是ros包下载地址 https bitbucket org lpresearch openzenros src master 这个包比较坑 xff0c
  • C++总结1-vector的指针

    在使用vector的时候犯了一个导致编译错误 xff0c 在这里记录一下 vector是非常常见也非常好用的容器 xff0c 但是vector的指针有一些特殊 如果想要获得vector的数组的指针 xff0c 我找到了两种方法 amp ve
  • Unity项目关闭Debug.Log没有Log

    接手的项目打包后没有记录自定义Log 卧槽 xff0c 这我怎么debug 搜索了一堆都只有说怎么关闭 xff0c 没什么怎么打开的 以至于我明明加了Andrid关键词还有说设置Use Player Log的 换了个关键词搜索怎么关闭 xf
  • 发行商提供证书打包iOS时 遇到的若干问题

    No signing certificate ios Development found No ios Development signing certificate matching 开发和发布总共收到了2个 p12文件 xff0c 另外
  • RPGMakerMV接入Greenworks,以支持steamworks API

    RPGMaker MV的基本原理 在查看Greenworks的github页面时有提到NW JS xff0c 实际上RPGMakerMV部署好的工程就是基于NW JS运行的 在根目录下的Game exe实际上可以用网上下载的NW exe替代
  • MBP合上盖子后仍反复自动唤醒

    现象 每天早上起来电脑都有点温度 xff0c 明明一直合着盖子但总是隔了几天就没电了 在办公室的时候开着steam就看到提示家里的笔记本可以远程流传输 通过休眠命令查看 xff0c 几乎每10分钟就有一条唤醒记录 大部分唤醒理由是 xff0
  • MAC 关闭office软件自动更新提示 (Microsoft AutoUpdate)

    参考 xff1a https blog csdn net weixin 42873928 article details 115936349 sudo chmod 000 Microsoft AutoUpdate app 执行的功能是设置文
  • git 出现 “fatal: The remote end hung up unexpectedly“

    情况 xff1a 有台两年没开的电脑长期没有更新git等工具版本 xff0c clone跟checkout的时候都有报这个问题 实际上没注意到git lfs filter process git lfs command not found这
  • VSCode智能补全代码片段技巧

    小技巧 foreach的代码片段中没有快速建议智能建议不优先推荐代码片段 xff08 试过也不大行 xff09 foreach的代码片段中没有快速建议 通过快速建议输入一个foreach之类的代码片段 xff0c 保持tab键可以切换输入位
  • Windows下搭建局域网内简易git服务器

    这里写自定义目录标题 概述配置步骤1 任意位置创建git 仓库2 启动Git Daemon3 其他电脑克隆工程4 开机自动启动5 其他配置注意事项 概述 由于和朋友小规模制作项目 xff0c 又使用了UE5这样的庞然大物 xff0c 准备整
  • 如果OpenStack给虚机自动分配的ip和其他静态配置的ip重复了怎么办

    1 查找你要修改ip地址的网卡id root 64 node 1 neutron port list 2 允许ip地址为10 10 1 56通过 root 64 node 1 neutron port update 4e79200f ac5
  • Lisp笔记

    变量 动态变量 defvar defparameter span class token punctuation span span class token car dafvar span paraname default value sp
  • MSDK接入 中的各种问题

    检查顺序 包名注意一下 Unity报 Found plugins with same names Found plugins with same names Assets Msdk BuglyPlugins Android libs bug
  • C++ Windows 窗体程序入门 - 1.你的第亿个窗体程序

    前言 43 学Windows窗体已经有一段时日了 xff0c 奈何没有什么浅显易懂 amp 便宜 xff01 xff01 的书籍 就想来 算是记笔记吧 顺便还能给你们总结一些经验 注 有许多内容源于我看过的一些视频 比如Chili和Cher
  • CSS替换元素和非替换元素

    根据是否可以通过修改某个属性值更改元素呈现的内容 xff0c 可以分为替换元素和非替换元素 替换元素 以下元素都是可替换元素 xff0c 以及在各种浏览器下的默认display值 xff08 图片来源 CSS世界 张鑫旭 xff09 针对
  • SD-WAN加速保障跨国公司数据传输质量

    很多企业开启国际化业务 xff0c 跨国文件传输越来越频繁 xff0c 而且随着业务的开展 xff0c 公司规模的扩张 xff0c 很多企业都在海外设置了分支机构 不得不说 xff0c 随着经济一体化的进程不断加快 xff0c 企业跨国经营
  • 零基础视觉SLAM(一)

    文章目录 SLAM简介什么是SLAM xff1f 传感器VSLAM架构视觉里程计后端优化 SLAM应用自学参考书预备知识 SLAM简介 什么是SLAM xff1f SLAM从本质上来说它要实现的就是通过传感器去实时地估计自身位置及经过的轨迹

随机推荐

  • 关于Proxmox 5.x的国内有效镜像源

    官网的 http download proxmox com 有多慢我就不提了 xff0c 否则大家也不会看到这篇小文 首先需要分清楚Proxmox VE的镜像构成 1 xff09 Debian自身 这个用国内哪个镜像都可以 xff0c al
  • 多线程是否真的有必要?

    一点疑问 相比大家在投简历 面试等等过程中 xff0c 或多或少会遇到这么一个问题 xff1a 熟悉掌握多线程开发 xff1b 谈谈你对多线程的认识 其实 xff0c 我有这么一个疑问 xff0c 那就是多线程真的有必要么 xff1f 根据
  • stm32无法烧录问题分析

    1 开始能烧录 xff0c 烧录程序后就不能烧录了 原因 xff1a 升级接口IO被代码修改应用 xff0c 导致无法烧录 xff0c 解决办法 xff1a 可以让MCU进入升级模式 xff08 拉高boot0 xff0c 然后复位MCU
  • 【Git】msysgit + TortoiseGit:在 windows 上安装配置版本控制工具 Git 图形化使用

    msysgit 43 TortoiseGit xff1a 在 windows 上安装配置版本控制工具 Git 图形化使用 一 安装说明 Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控
  • Slickedit使用记录

    Slickedit使用记录 一 快捷键二 问题和解决方法 一 快捷键 已经习惯了android studio 中的快捷键 xff0c 在slickedit上也做下修改Tools gt options gt Keyboard and mous
  • 查看.Net源代码vs版本号

    方法 xff1a 用记事本打开vs项目的 sln文件 第2行就是这个源代码包的开发软件vs版本号了 Microsoft Visual Studio Solution File Format Version 9 00 Visual Studi
  • Docker: GUI 应用,Ubuntu 上如何运行呢?

    操作系统 Ubuntu 18 04运行镜像 continuumio anaconda3 based on debian Step 1 安装 Docker span class token comment update the apt pac
  • 网络爬虫详细设计方案

    目录 网络爬虫设计方案 1 网络爬虫简介 2 Java爬虫的开发和使用流程 2 1 下载 2 2 分析 3 单点登陆与Jsoup解析 3 1 单点登陆简介 3 1 1 登陆 3 1 2 注销 3 2 Jsoup网页解析 4 网络爬虫详细设计
  • 安装 python-dev 的时候,缺少依赖关系

    sudo aptitude install python dev报错 xff1a 下列软件包有未满足的依赖关系 xff1a python dev 依赖 libpython dev 61 2 7 5 5ubuntu3 但是它将不会被安装 依赖
  • maven-replacer-plugin 静态资源打包方案js css

    解决问题 xff1a 防止浏览器缓存 xff0c 修改js css后无效 xff0c 需要强刷 两种解决方案 xff1a 1 不依赖插件 xff0c 纯代码实现 1 1 实现拦截处理器 xff1a ModelAndViewIntercept
  • 简单FTP构建及访问

    使用2台RHEL6虚拟机 xff0c 其中一台作为vsftpd服务器 xff08 192 168 4 5 xff09 另外一台作为测试用的Linux客户机 xff08 192 168 4 205 xff09 在RHEL6系统中 xff0c
  • freertos程序死机原因

    一 开机死机原因 1 一般是某任务栈溢出所致 栈溢出一般有两个原因 xff1a 1 此任务函数的代码量太大 或调用了某个比较大的函数 2 此任务的函数内有比较大的局部变量的数组 调试方法 xff1a 1 先关闭所有任务再逐个打开 xff0c
  • 安装在win10环境下的Jenkins添加本地虚拟机centos7作为从机遇到的问题,报错:SSH Connection failed with IOException: "Key exchange

    首先声明我的Jenkins版本是 xff1a 2 31版 因为不同版本页面有所不一样 安装在win10环境下的Jenkins添加本地虚拟机centos7作为从机遇到的问题 xff0c 报错情况如下 xff1a Searching for 1
  • Linux du命令和df命令区别

    1 xff0c 两者区别 du xff0c disk usage 是通过搜索文件来计算每个文件的大小然后累加 xff0c du能看到的文件只是一些当前存在的 xff0c 没有被删除的 他计算的大小就是当前他认为存在的所有文件大小的累加和 d
  • ML大杂烩:**常见机器学习算法公式梳理

    机器学习方法有一个进阶的过程 xff0c 不同的方法族 xff0c 都有其基础和逐渐进化的模型 每一个更新的模型一般是对上一个简单模型的改进 xff0c 比如SVM就直接改进了近邻方法 xff0c 降低了保留的实例个数 本文有大量修改 xf
  • libuv笔记 (一)Threads

    Threads 线程在现代程序开发中会很常见 xff0c 当然Libuv也不能缺席这一块 xff0c 记得你在使用过程中要非常认真的处理 各种原始的同步问题 线程会在内部使用 xff0c 用来在执行系统调用时伪造异步的假象 libuv通过线
  • SLAM: SLAM基本流程—VSLAM扫盲之旅

    在很多机器人的论文和书籍里面 xff0c 劈头第一页即是 xff0c 经典的SLAM视觉框架是过去十几年前已经成熟的研究结果 xff0c 这个框架和算法本身已经没有太多理论可以操作的空间 封杀了很多人的SLAM科研之路 xff0c 把SLA
  • 三维重建:SLAM的尺度和方法论问题

    百度百科的定义 此文引用了其他博客的一些图像 xff0c 如有侵权 xff0c 邮件联系删除 作为算法的SLAM xff0c 被称为同步相机位姿确定和地图构建 作为一个工程的SLAM xff0c 有众多的算法 在计算机视觉中 三维重建是指根
  • 相机标定:PNP基于单应面解决多点透视问题

    利用二维视野内的图像 xff0c 求出三维图像在场景中的位姿 xff0c 这是一个三维透视投影的反向求解问题 常用方法是PNP方法 xff0c 需要已知三维点集的原始模型 本文做了大量修改 xff0c 如有不适 xff0c 请移步原文 xf
  • 三维重建7:Visual SLAM算法笔记

    VSLAM研究了几十年 xff0c 新的东西不是很多 xff0c 三维重建的VSLAM方法可以用一篇文章总结一下 此文是一个好的视觉SLAM综述 xff0c 对视觉SLAM总结比较全面 xff0c 是SLAM那本书的很好的补充 介绍了基于滤