惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
云风的 BLOG
云风的 BLOG
IT之家
IT之家
The Register - Security
The Register - Security
博客园_首页
博客园 - 聂微东
MongoDB | Blog
MongoDB | Blog
Blog — PlanetScale
Blog — PlanetScale
The GitHub Blog
The GitHub Blog
博客园 - 【当耐特】
腾讯CDC
F
Full Disclosure
F
Fortinet All Blogs
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
Recorded Future
Recorded Future
MyScale Blog
MyScale Blog
T
Tailwind CSS Blog
Jina AI
Jina AI
月光博客
月光博客
A
About on SuperTechFans
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Help Net Security
博客园 - Franky
Vercel News
Vercel News
美团技术团队
C
CERT Recently Published Vulnerability Notes
Security Latest
Security Latest
Scott Helme
Scott Helme
P
Proofpoint News Feed
博客园 - 三生石上(FineUI控件)
www.infosecurity-magazine.com
www.infosecurity-magazine.com
SecWiki News
SecWiki News
The Last Watchdog
The Last Watchdog
U
Unit 42
The Cloudflare Blog
N
News and Events Feed by Topic
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
T
Tenable Blog
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
B
Blog
Webroot Blog
Webroot Blog
A
Arctic Wolf
S
SegmentFault 最新的问题
aimingoo的专栏
aimingoo的专栏
AWS News Blog
AWS News Blog
I
Intezer
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

RealCat

📝笔记:图像匹配挑战赛回顾(CVPR 2023) | RealCat 📝笔记:Stable Diffusion QR-Code | RealCat 📝笔记:Python zip() | RealCat 📝笔记:图像匹配挑战赛回顾(CVPR 2022) | RealCat 📝笔记:5秒钟训练NeRF,NVIDIA Instant NeRF 测试 | RealCat 📝笔记:Visualization Localization Revisited(under construction...) | RealCat 📝笔记:使用vlfeat的Matlab接口简单实现BOW以及VLAD | RealCat 📝笔记:一些关于KD-Tree的知识点 | RealCat 📝笔记:简明矩阵求导术之分子布局与分母布局 | RealCat 📝笔记:使用Clockwise/Spiral Rule技巧轻松读懂变量/函数声明 | RealCat 🔨工具:优雅地下载Youtube视频 | RealCat 🔨工具:每日自动获取arXiv论文摘要 | RealCat 🎃资料: 从Eigen向量化谈内存对齐 | RealCat 📝笔记:图像匹配挑战赛总结 (SuperPoint + SuperGlue 缝缝补补还能再战一年) | RealCat 📝笔记:ICCV 2021最佳学生论文 | COLMAP 优化建图组件 Pixel-Perfect SFM | RealCat 📝笔记:CVPR 2021 | PixLoc: 端到端场景无关视觉定位算法(SuperGlue一作出品) | RealCat 📝笔记:港大MARS实验室 R3LIVE (R2LIVE升级) 鲁棒实时RGB雷达视觉惯导紧耦合状态估计 | RealCat 🔨工具:bash常用命令 | RealCat 📝笔记:VSLAM基础知识导图 | RealCat 📝笔记:Patch-NetVLAD论文阅读 | RealCat 📝笔记:光场相机能否用于SLAM? | RealCat 📝笔记:读写文本常用操作 | RealCat 📝笔记:CVPR 2020 视觉定位挑战赛冠军方案 | RealCat 📝笔记:三维重建系列 COLMAP: Structure-from-Motion Revisited | RealCat 🐈芒果驾到 | RealCat 📝笔记:GMS一种基于运动统计的快速鲁棒特征匹配过滤算法 | RealCat 🌡️秋天到了,还是很热 | RealCat 📝笔记:AdaLAM: Revisiting Handcrafted Outlier Detection 超强外点滤除算法 | RealCat 🔨工具:使用vercel加速Hexo静态博客访问 | RealCat 📝笔记:ORB-SLAM3论文阅读 | RealCat 🔨工具:解决Github挂图及龟速访问 | RealCat 📝笔记:图解卡尔曼滤波 | RealCat 🔨工具:国内加速访问arxiv | RealCat 📝笔记:CVPR2020图像匹配挑战赛,新数据集+新评测方法,SOTA正瑟瑟发抖! | RealCat 📝笔记:SuperGlue:Learning Feature Matching with Graph Neural Networks论文阅读 | RealCat 📝笔记:SLAM常见问题(四):求解ICP,利用SVD分解得到旋转矩阵 | RealCat 📝笔记:SLAM常见问题(五):Singular Value Decomposition(SVD)分解 | RealCat 📝笔记:SLAM常见问题(三):PNP | RealCat 📝笔记:SLAM常见问题(二):重定位Relocalisation | RealCat 📝笔记:SLAM常见问题(一):SearchByBoW | RealCat 📝笔记:2019年浙大CADCG暑假SLAM培训部分课件 | RealCat 🔨工具:Filebrowser:一款轻量级个人网盘 | RealCat 📝笔记:SuperPoint: Self-Supervised Interest Point Detection and Description 自监督深度学习特征点 | RealCat Black Hole | RealCat 🔥Awesome CV Works | RealCat 🔨工具:开启SSR模式 | RealCat 虚实:「未麻的部屋」 | RealCat 笔记:李群与李代数求导 | RealCat 资料:SLAM草稿 | RealCat 资料:Line Segments Detection | RealCat 资料:Eigen与Matlab语句之对应关系 | RealCat 笔记:清华-谷歌人工智能研讨会(Tsinghua-Google AI Symposium) | RealCat Think Different | RealCat Light Field Depth Estimation | RealCat CV Related References | RealCat 立体视觉综述:Stereo Vision Overview | RealCat Lytro的光场AR之路:从巅峰到死亡 | RealCat Stephen Hawking | RealCat 常用的生产力工具 | RealCat 深度学习在深度(视差)估计中的应用(2) | RealCat 深度学习在深度(视差)估计中的应用(1) | RealCat Matlab Deep Learning学习笔记 | RealCat CNN框架(CNN Architectures) | RealCat 理解LSTM网络【译】 | RealCat 降维之PCA主成分分析原理 | RealCat 📝笔记:SIFT和SURF特性提取总结 | RealCat 统计学习方法总结 | RealCat Ubuntu上使用Git以及GitHub | RealCat 机器学习修炼手册 | RealCat 初试HCI光场数据集 | RealCat 实习季到了,大家又浮躁了起来 | RealCat 日本与美国之行 | RealCat Light Field 光场以及MATLAB光场工具包(LightField ToolBox)的使用说明 | RealCat MATLAB:多个不同维度的箱线图画在一起 | RealCat AR形势与应用 | RealCat Hexo+Github+jsDelivr+Vercel建站备忘录 | RealCat Markdown 学习 | RealCat 复试那些事儿 | RealCat
资料:ORB SLAM2 阅读报告 | RealCat
2018-11-30 · via RealCat

首先,解释下SLAM的概念,借鉴高博《视觉 SLAM 十四讲》中的一句话:SLAM 是 Simultaneous Localization and Mapping 的缩写,中文译作“同时定位与地图构建”。它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。如果这里的传感器主要为相机,那就称为“视觉 SLAM”。

先来张图,下图就是利用相机作为传感器在环境中采集一系列的图像,经过SLAM系统建立的点云图以及相机轨迹。

SLAM自1986年提出之后,一直以来是机器人领域的热点问题。这里总结一些常用开源SLAM方案。

方案名称

传感器形式

地址

MonoSLAM

单目

https://github.com/hanmekim/SceneLib2

PTAM

单目

http://www.robots.ox.ac.uk/~gk/PTAM/

ORB-SLAM

单目

http://webdiis.unizar.es/~raulmur/orbslam/

ORB-SLAM2

单目/双目/RGB-D

https://github.com/raulmur/ORB_SLAM2

LSD-SLAM

单目为主

http://vision.in.tum.de/research/vslam/lsdslam

SVO

单目

https://github.com/uzh-rpg/rpg_svo

DTAM

RGB-D

https://github.com/anuranbaka/OpenDTAM

DVO

RGB-D

https://github.com/tum-vision/dvo_slam

DSO

单目

https://github.com/JakobEngel/dso

RTAB-MAP

双目/RGB-D

https://github.com/introlab/rtabmap

RGBD-SLAM-V2

RGB-D

https://github.com/felixendres/rgbdslam_v2

Elastic Fusion

RGB-D

https://github.com/mp3guy/ElasticFusion

Hector SLAM

激光

http://wiki.ros.org/hector_slam

GMapping

激光

http://wiki.ros.org/gmapping

OKVIS

多目+IMU

https://github.com/ethz-asl/okvis

ROVIO

多目+IMU

https://github.com/ethz-asl/rovio

VINS

单目+IMU

https://github.com/HKUST-Aerial-Robotics/VINS-Mono

ORB-SLAM应该是SLAM最具有代表性的算法,ORB-SLAM2: an Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras; code; 主页;

ORB-SLAM 是PTAM 的继承者们中非常有名的一位。它提出于 2015 年,是现代 SLAM 系统中做的非常完善,非常易用的系统之一(如果不是最完善和易用的话)。ORB-SLAM 代表着主流的特征点 SLAM 的一个高峰。相比于之前的工作,ORB-SLAM 具有以下几条明显的优势:

  • 支持单目、双目、RGB-D 三种模式。这使得无论我们拿到了任何一种常见的传感器,都可以先放到 ORB-SLAM 上测试一下,它具有良好的泛用性。
  • 整个系统围绕 ORB 特征进行计算,包括视觉里程计与回环检测的 ORB 字典。它体现出 ORB 特征是现阶段计算平台的一种优秀的效率与精度之间的折衷方式。ORB不像 SIFT 或 SURF 那样费时,在 CPU 上面即可实时计算;相比 Harris 角点等简单角点特征,又具有良好的旋转和缩放不变性。并且,ORB 提供描述子,使我们在大范围运动时能够进行回环检测和重定位。
  • ORB 的回环检测是它的亮点。优秀的回环检测算法保证了 ORB-SLAM 有效地防止累计误差,并且在丢失之后还能迅速找回,这在许多现有的 SLAM 系统中都不够完善。为此,ORB-SLAM 在运行之前必须加载一个很大的 ORB 字典文件。
  • ORB-SLAM 创新式地使用了三个线程完成 SLAM:实时跟踪特征点的 Tracking 线程,局部 Bundle Adjustment 的优化线程(Co-visibility Graph,俗称小图),以及全局 Pose Graph 的回环检测与优化线程(Essential Graph 俗称大图)。其中,Tracking线程负责对每张新来的图像提取 ORB 特征点,并与最近的关键帧进行比较,计算特征点的位置并粗略估计相机位姿。小图线程求解一个Bundle Adjustment 问题,它包括局部空间内的特征点与相机位姿。这个线程负责求解更精细的相机位姿与特征点空间位置。不过,仅有前两个线程,只完成了一个比较好的视觉里程计。第三个线程,也就是大图线程,对全局的地图与关键帧进行回环检测,消除累积误差。由于全局地图中的地图点太多,所以这个线程的优化不包括地图点,而只有相机位姿组成的位姿图。继 PTAM 的双线程结构之后,ORB-SLAM 的三线程结构取得了非常好的跟踪和建图效果,能够保证轨迹与地图的全局一致性。这种三线程结构亦将被后续的研究者认同和采用。
  • ORB-SLAM围绕特征点进行了不少的优化。例如,在OpenCV的特征提取基础上保证了特征点的均匀分布;在优化位姿时使用了一种循环优化四遍以得到更多正确匹配的方法;比PTAM更为宽松的关键帧选取策略等等。这些细小的改进使得 ORB-SLAM 具有远超其他方案的鲁棒性:即使对于较差的场景,较差的标定内参,ORB-SLAM 都能够顺利地工作。

整个ORB-SLAM系统包括三个部分组成,分别是跟踪(Tracking)、局部建图(Local Mapping)以及回环检测(Loop Closing)模块,它们分别被三个线程并行地进行处理。接下来对这个系统进行介绍。

理论篇

跟踪模块

跟踪(Tracking)是在每帧中粗略地定位相机位姿以及决定何时插入新的关键帧。算法设计了运动模型以及跟踪参考帧模型去大致预测出相机的位姿。如相机跟踪失败(由于遮挡、大幅度运动等),就启动重定位模块对相机进行位置查找。如果已经有了初始位姿以及特征匹配,利用关键帧的Covisibility Graph恢复出局部可见图。之后,局部地图点的匹配可利用重投影实现,随后相机的位姿利用BA来优化。最后,Tracking线程决定是否插入新的关键帧。

  • 初始位姿估计:利用运动模型或者关键帧模型去预测相机位姿。如果运动模型已经跟踪到了当前帧,会利用引导匹配(Guided Search)在上一帧中寻找地图点。如果没有找到足够的匹配(如,运动模型不适用的情况),我们就在上一帧中更大的范围中寻找地图点。如不满足运动模型条件,导致运动模型失败,则采用参考关键帧模型利用参考帧模型对当前帧进行跟踪。通过以上两个模型即可对相机位姿进行初步定位。
  • 跟踪局部地图:一旦我们已经估计了相机位姿以及我们得到一系列匹配的特征。我们可以将地图点投影到该帧上以搜索更多的匹配地图点。为了减小计算大图的超大复杂度,我们仅将其投影局部小图。局部地图包括,一系列关键帧,这些关键帧与当前帧共享着相同的地图点;还有与有共视关系的关键帧们。局部图还有一个参考帧,这个关键帧与当前帧有最多的匹配点。
  • 重定位:当运动模型以及跟踪关键帧失败时,可利用重定位来恢复得到相机位姿。应该从历史关键帧中选取和当前帧相似的图片,对当前帧进行位姿估计以及位姿优化。

局部建图模块

局部建图(Local Mapping)的主要任务:当跟踪当前帧成功之后,需要利用局部建图更新其运动模型同时更新地图点。等待跟踪过程判断是否应该插入一个新的关键帧,并把关键帧插入到地图中,并对局部地图进行局部BA优化。这个线程能够获得更为精细的相机位姿以及点云。

  • 处理关键帧:跟踪成功之后,需要对关键帧进行处理以得到地图。具体而言:从关键帧队列中获得一帧,计算出其特征点的BoW映射向量(表示)。关键帧和其对应的地图点进行绑定,更新地图点的平均观测方向以及观测距离范围。更新关键帧之间的连接关系(共视关系),最后将关键帧插入地图中。
  • 精选地图点:由于跟踪过程引入地图点的策略较为宽松,此时需要检查最近加入的地图点,并将一些冗余的地图点从最近地图点的列表中剔除。
  • 创建新地图点:由于上一步已经剔除了一些冗余地图点,该模块需要通过当前关键帧及其共视关键帧利用三角化得到更多高质量的3D地图点并添加地图点的属性。
  • Local BA:该步骤通过局部BA优化局部地图点以及局部关键帧的位姿。
  • 精选关键帧:剔除冗余的关键帧,这样不至于增加后期BA的压力,而且可以保证在相同的环境下,关键帧的数目不会无限制的增长,同时减小存储压力。

回环检测模块

回环检测(Loop Closing)的主要目标是检测当前关键帧是否经过历史位置。如有经过,则利用回环检测得到的回环帧去修正整个SLAM长期跟踪过程中带来的累积误差、尺度漂移等。如果仅有前两个线程的话,仅仅完成了一个很好的视觉里程计(VO),这个线程会对全局地图以及关键帧进行回环检测,以消除上述累积误差。

  • 候选关键帧检测:当前关键帧仅有与历史关键帧足够相似才可能成为回环候选帧,该模块通过一定的筛选策略对当前关键帧进行筛选,判断其是否为闭环候选关键帧。由于在实际闭环检测过程中,回环候选帧及其共视关键帧,在一定连续的时间内都可能被观测到。该模块主要通过利用这一条件,对闭环候选关键帧进一步地筛选,通过筛选条件的候选关键帧将进行下一步的判断。
  • 相似性变换计算:考虑到单目SLAM的尺度漂移,当前帧和回环帧之间的相对位姿应是一个相似变换,并且,二者之间应具有足够多的匹配点。该模块主要是通过循环计算当前帧和上述经过筛选后的候选关键帧之间的相似变换,直到找到一个和当前帧具有足够多匹配点的相似变换,对应的候选关键帧即为最终的回环帧。
  • 回环修正:受累积误差的影响,时间越久,越接近当前帧的关键帧及相应的地图点,误差将越大。若寻找到的回环帧,当前帧位姿及其对应的地图点会更精确。该模块就是为了修正累积误差,利用回环帧及其共视关键帧,以及对应的地图点,来修正当前帧及其共视关键帧的位姿以及对应的地图点的世界坐标。紧接着进行地图点融合,更新共视图,然后通过本质图优化相机位姿,最后进行全局BA来修正整个SLAM的累积误差(相机位姿以及地图点)。

牛吹完了,说下缺点。 当然,ORB-SLAM 也存在一些不足之处。首先,由于整个 SLAM 系统都采用特征点进行计算,我们必须对每张图像都计算一遍 ORB 特征,这是非常耗时的。ORB-SLAM 的三线程结构也对 CPU 带来了较重的负担,使得它只有在当前 PC 架构的 CPU 上才能实时运算,移植到嵌入式端则有一定困难。其次,ORB-SLAM 的建图为稀疏特征点,目前还没有开放存储和读取地图后重新定位的功能(虽然从实现上来讲并不困难)。根据我们在建图章节的分析,稀疏特征点地图只能满足我们对定位的需求,而无法提供导航、避障、交互等诸多功能。然而,如果我们仅用 ORB-SLAM 处理定位问题,似乎又嫌它有些过于重量级了。相比之下,另外一些方案提供了更为轻量级的定位,使我们能够在低端的处理器上运行 SLAM,或者让 CPU 有余力处理其他的事务。

实践篇

在这里下载ORB-SLAM2的源码,然后参考ORB-SLAM2项目的说明文档,安装一些必要的第三方软件:

注意,其中有坑,务必安装正确。安装好之后顺便在Euroc数据集中的MH01上测试,得到下面的轨迹地图。

EuRoC数据集

EuRoC数据集包含11个双目序列,这个序列由小型无人机在两个房间(V1/V2, Vicon Room)以及一个大工厂环境(MH, Machine Hall)中拍摄得到。相机的基线长约为11cm,以20Hz速度拍摄图片。序列被分成了三种(根据MAV的速度,光照以及场景纹理)easy , medium, difficult。 表示绝对轨迹误差,是衡量相机位姿的标准之一。假设有真实位姿序列:以及估计的位姿序列: ,它们已经做了包括时间戳对齐等操作。实际场景中,这两个序列可能有不同的采样率、长度亦或数据可能丢失,此时需要进行数据关联和插值。首先得的在第i时刻的轨迹误差:

其中是从的最小二乘刚体变换,通过求取以上误差在所有位置时刻的均方根我们得到APE的具体形式:

其中的表示求取该位姿的平移分量算子。

文中大部分内容来自网络以及高博十四讲。因本人水平有限,如有错误,谢谢指出。

参考