从零开始搭建一个基于SLAM的AR框架

为什么要做这么一件事

网上关于AR的资料基本上都是一些关于应用开发的文章,例如利用U3D和ARkit或这ARcore开发AR游戏。这些资料对于AR应用开发有很大的帮助,但是对于想真正了解AR底层技术的人(尤其是刚进行研究生学习的研一同学),很难有什么帮助。想要进一步在AR技术领域有所突破,势必要对AR的跟踪注册,渲染技术,交互技术等有全面的认知(当然涉及的知识点较为丰富,可以选择一个作为自己深入研究的对象)。
对于任何一个想在某个具体行业内(尤其科技圈)有宏伟志向的人,除了需要丰富、扎实的技术知识外,对于行业的历史,发展现状及趋势也应该有所了解,因此本系列博客不仅仅包含关于从零搭建一个基于slam的AR框架的具体操作,相关文献外,还包括对于AR行业的发展现状和趋势的相关文章分享以及个人见解。本部分的内容只会穿插在各篇文章之中(因为我们是技术性文章啊)。
AR技术,是个包含很多知识的综合性技术,本人在AR技术领域也算刚刚入门,通过总结自己踩过的坑,以及学习经验,让后面的加入AR事业的人,能够尽快走在正确的道路上,如有错误之处,还望大佬不吝赐教。
本系列博客,主要目标是搭建一个可运行,实时的AR系统,目的在于了解整个AR系统的运行原理,因此会忽略一些工程上需要考虑的问题。
希望为AR事业的发展奉献绵薄之力!

SLAM和AR综述

这一部分,首先我们需要知道所需的基本数学知识,编程技能,工欲善其事必先利其器,没有基础知识,前进步伐会非常缓慢,而且学习本系列的过程也会相当痛苦。紧接着了解AR和SLAM的关系和我们需要用到的关于SLAM技术中的知识。参考 《视觉SLAM十四讲》《增强现实原理和实践》(只有英文版)。

SLAM综述

关于 《视觉SLAM十四讲》 ,个人建议买一本书,因此在编程的过程中,我发现,如果只是单纯的看代码很难理解其真正的含义,需要理论和实践共同学习。开始阶段我们主要通过纯视觉的方法搭建一个 能够运行 的AR框架,后期为了让系统更加稳定,会考虑加入其他传感器数据,例如IMU,GPS、雷达数据,因此SLAM主要在于讲解视觉SLAM(V-SLAM)的内容。本系列文章主要的目标是构建一个AR框架,而非SLAM系统。从目标出发,分析这个问题。目前的AR主要的应用环境是小范围的应用场景,因此我们抛弃后端闭环检测的技术内容(后期综合考虑性能和精度的问题,可能会加入),只需要SLAM中的前端部分的技术,即 视觉里程计(Visual Odometry,VO) ,因此本文更合适的标题应该是 基于VO的AR系统框架 ,而非SLAM,但是VO作为SLAM的一部分,这样说也未尝不可。关于VO的内容,主要是对 《视觉SLAM十四讲》 中的VO项目的内容做一个总结,对书中涉及到的知识和程序做个大致的讲解和解读。下面将会对SLAM系统做个简介,对VO做个大致的讲解,之后在AR小节中介绍VO在AR中的应用。
从零开始搭建一个基于SLAM的AR框架
上图(此图来自《视觉SLAM十四讲》)是一个经典的SLAM流程图,下面对每个模块做简要的解释(从V-SLAM角度):
1.传感器数据:系统接收的数据,在V-SLAM中主要是图像信息。
2.视觉里程计:从读取的图像信息中,根据相邻时间上的图像信息计算出相机的运动信息,以及构建局部地图。相机的运动信息在视觉里程计中叫 相机位姿 .除此之外,在RGB相机中,我们也要通过视觉的方法估计特征点的深度。
3.非线性优化:因为图像信息具有噪声或者匹配过程中的误差,因此需要优化方法减小VO部分计算出的相机位姿。非线性优化为目前SLAM中主流的优化方法。在我们AR框架中只考虑相邻时间内的局部优化。
4.回环检测:该模板的目标是判断机器是否回到原来的位置。在SLAM中意义重大,我们当前阶段是为了搭建出一个可以运行,具有一定稳定性的AR框架,因此不考虑此模块。
5.建图:根据轨迹信息,建立地图。对于AR系统,不是关键因素。
我们需要在我们的AR框架用到SLAM中的哪些内容,我们将在后续章节中进行讲解。

AR综述

目前AR实现主要分为俩种,一种为基于marker的实现,一种为基于slam的实现。首先我们来看基于marker的实现,之后就可以更好的理解在没有marker的情形下,如何实现一个AR系统。

从零开始搭建一个基于SLAM的AR框架
本图来自ARtoolKit简介,我们来阐述一个基于marker的AR实现的步骤:
1.获取相机图像
2.特征匹配(实时获取的图像和预存的marker)
3.根据匹配结果估计相机位姿
4.通过非线性优化的方法优化位姿
5.通过求解出的相机位姿矩阵和内参矩阵
6.通过OpenGL渲染虚拟物体到正确的位置。
基于marker的AR系统中,需要marker图,并且在使用中需要在真实场景中放置marker,这个很影响用户体验。因此无需先验,即可实现虚拟物体的注册方式诞生,下面用另外一张图即可展示基于slam的AR系统。
从零开始搭建一个基于SLAM的AR框架
我们只需将特征提取匹配过程,改成相机帧之间的特征提取和匹配即可实现这一原理相机求解的工作,这就是VO做的工作(这就是为什么我们要学习SLAM的原因)。绘制的工作,我们交给OpenGL来完成,后续章节会讲解。下一节将讲解VO是如何求解相机位姿。
关于ARToolkit,本人建议把源码看一下,了解其工作的原理。这里顺便推荐一份关于ARToolKit文档。
ARToolKit5
ARToolKit文档

VO概述

VO的目标:计算获取的相邻帧之间的相机位姿态。然后通过非线性优化,减小因为噪声引起的误差。VO的实现方法按是否提取特征点,分为特征点法和直接法,本系列主要考虑特征点法。特征点法的优势在于不受光照等因素的影响,并且特征点法有较为成熟的解决方案。下面简要讲解 特征点法VO 的整个过程,详细简介将在后续文章中体现;
(1)提取图像的ORB特征
(2)使用 快速近似最近邻(FLANN) 算法匹配俩帧的特征点
(1)(2)步骤的方法在OpenCV中均有集成,因此OpenCV将会是我们重要的工具
(3) 位姿估计 :RGB相机的情况下,我们使用 对极几何 求解 本质矩阵 或者 单应性矩阵 (特征点共面的情况下),然后通过矩阵分解的方式分解出于运动。RGB相机存在尺度和初始化的问题,尺度问题可以通过三角测量估计地图的深度。初始化是不可避免的问题,需要相机具有平移的操作来初始化整个VO(这也是为什么AR应用再刚开始需要你平移手机的作用)。RGBD相机,可以获得地图点的深度信息,因此我们使用PnP/ICP方法求解位姿,RGB-D不需要初始化操作,成为一种重要的位姿估计方法。双目视觉的方法,可以自行研究,这里不做讲解。** 本系列博客也将以单目RGBD相机为基础**。
(4)优化位姿和地图点:使用捆绑调整(Bundle Adjustment,BA) ,在PnP中,即为最小化重投影误差
后续将以代码实现为主,详细介绍其中最为关键的因素。想要完全了解VO的同学可以观看 《视觉SLAM十四讲》 相关章节。

基础知识需求

关于VO和图形学(渲染)的知识,想要弄明白的同学,数学知识必不可少。因此,高等数学,线性代数,概率论知识必不可少,本人考研期间所学的数学知识基本上可以达到看懂的程度,想要理解需要进一步深化数学知识,但对于想要主要以工程为目标的同学到看懂的程度就可以了。其次,当然是编程能力了,即使再深厚的数学功底,再优秀的想打,无法实现自己的想法也是天方夜谭。我们需要高效的运行环境,因此采用 C++ 作为编程语言。其他需要学习的环境,下篇文章介绍项目的整体架构时候做介绍。

总结

SLAM除了可以应用于AR中,还有俩个非常典型的应用场景,一个为自动驾驶,一个是机器人,这俩个产业规模巨大。学好SLAM,走遍科技圈都不怕。到这里,大家应该知道我们要做怎么样一件事,对于如何做虽然有所了解,但是可能还不是很清晰,下一章我们将会对介绍我们项目的整体架构,并开始动手配置环境和写程序一步步实现。文末我为大家提高一些额外学习参考资料,希望每个程序员除了关注技术本身外,也能够清楚的认知行业的发展,为自己的职业方向发展定下一个长远的目标。

推荐

学术界SLAM框架

名称 相机类型 VO方法 优化方法
SVO 单目 直接法 非线性优化
LSD-SLAM 单目 直接法 非线性优化
PTAM 单目 特征点法 非线性优化
ORB-SLAM 单目,立体,RGBD 特征点法 非线性优化
VISO2 单目,立体 特征点法 滤波器
TLBBA 立体 特征点法 非线性优化
MonoSLAM 单目 特征点法 滤波器
DEMO RGB-D 特征点法 非线性优化
RTAB-MAP 立体,RGB-D 特征点法 非线性优化

C++基础视频课程
ARToolKit5
ORB-SLAM
ARKit
Vuforia
EasyAR
映维网,专业VR/AR咨询网站
《增强现实原理和实践》
OpenGL学习网站