写在前面

本文想讨论一下AR的架构和SLAM在其中的作用。

AR

AR的框架可以简单划分为感知和交互两部分。

感知部分主要负责信息的收集和处理。信息主要通过不同的传感器收集,包括图像、设备加速度、距离(深度)、语音、手势等。利用这些信息,可以进行运动追踪(定位)、地图构建、语音识别、手势识别等一系列感知行为。这部分主要通过APP或者Default service调用不同的Service模块实现。

交互部分主要负责根据指令触发感知行为或者根据感知结果输出交互行为,比如根据运动追踪得到的姿态渲染虚拟物体,根据场景扫描的结果控制虚拟物体的运动、控制系统界面等等。这部分主要通过APP调用操作系统命令和渲染模块实现。

下面是一个简单的示意图,虚线代表调用和反馈机制。

如图所示,一个APP可能同时调用多个service模块,一个service模块可能调用多个传感器。理清service模块和传感器之间的最佳组合及最优算法,是AR算法的核心问题。

AR中的SLAM

如果一个设备想要提供3D效果的AR,显然运动追踪模块是必备的。如果想让虚拟物体和场景交互,或是想要扫描一个真实物体,那么(稠密)三维地图可以提供场景的三维几何信息。
而定位(运动追踪)和建图(稀疏或者稠密地图)构成了SLAM的核心功能。因此,SLAM可以说是AR中最基础的模块,属于设备感知周边环境的范畴。

以Tango为例

下面以Tango的API为例,尝试说明一下AR中的SLAM算法和各个传感器之间的关系。

Tango链接

Tango API提供三个核心功能

  • 运动追踪(motion tracking)
  • 场景学习(area learning)
  • 深度感知(depth percetion)

运动追踪

运动追踪的输出是实时的6DOF姿态。这个模块有滤波框架和优化框架可供选择,现在也有结合深度学习在做的。传感器主要包括单目、双目、IMU的排列组合。Tango用的算法是VIO(fisheye camera+IMU)。

Tango implements Motion Tracking using visual-inertial odometry, or VIO, to estimate where a device is relative to where it started.

Tango团队和苏黎世联邦理工学院(ETHZ)有深入合作,ETHZ现在还在基于Tango做一些工作。

场景学习

场景学习的输出是场景中的一些特征,并将它们保存下来,以便将来能够重新定位以前到过的场景,或者用于校正漂移(drift),提高追踪算法的整体精度。

Area Learning gives the device the ability to see and remember the key visual features of a physical space—the edges, corners, other unique features—so it can recognize that area again later.

When a Tango device has learned an area, there are two key things it can do to improve upon the information provided by Motion Tracking alone: a. Improve the accuracy of the trajectory by performing "drift corrections." b.
Orient and position itself within a previously learned area by performing "localization."

重定位常用的方法有DBoW2(3)、FabMap、相关性(PTAM)、Fern(Elastic Fusion)以及基于机器学习的算法。校正漂移一般通过回环检测(和重定位类似)和全局优化实现(g2o、GTSAM、iSAM等优化框架)。

深度感知

深度感知的输出是一些点云。通过API调用,可以从Tango设备得到原始点云。结合motion tracking,可以将不同视角下的点云拼接起来,得到场景完整的点云。调用一些APP可以实现距离测量、场景扫描等功能。注意Tango的深度传感器的测量范围是0.5m到4m,不方便用于手势识别(一般小于0.5m)。

这部分主要对应于SLAM中的稠密地图重建。原始点云既可通过双目也可通过结构光、TOF等深度传感器获取。点云拼接可以通过ICP或者运动追踪辅助实现。点云处理、网格生成可以通过OctoMap、TSDF重建、Poisson重建实现。

有兴趣的同学可以关注
RTAB-Map,目前在Tango设备上实现了接近实时的点云拼接、单帧点云的网格生成和纹理贴图。

展望

随着硬件的发展和算法的成熟,运动追踪模块估计一两年之内会有大规模的商用,嵌入到手机、VRAR和机器人中。场景扫描模块对硬件(传感器性能、工业设计、功耗控制)和软件(算法、需求定位、架构设计和工程实现)均有较高的要求。由于尚无高效可靠的开源算法,有可能作为一个optional的应用开放一些底层API给开发者。

AR虽然对SLAM的实时性和精度要求较高,但由于能够看到真实世界,其实容许一定的错误率,不像无人车那样,对错误零容忍。

AR中的SLAM(二)的更多相关文章

  1. AR中的SLAM(一)

    写在前面 本系列打算讲讲个人对AR行业和AR中的SLAM算法的一点浅显的看法.才疏学浅,文中必然有很多疏漏和不足,还望能和大家多多讨论.今天先讲讲我对AR的一些认识. AR的一点理解 AR是什么 AR ...

  2. C#中的线程二(Cotrol.BeginInvoke和Control.Invoke)

    C#中的线程二(Cotrol.BeginInvoke和Control.Invoke) 原文地址:http://www.cnblogs.com/whssunboy/archive/2007/06/07/ ...

  3. C语言中如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

  4. IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

    问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10   分析: 2*2子数组的最大和.遍历求和,时 ...

  5. C++中的异常处理(二)

    C++中的异常处理(二) 标签: c++C++异常处理 2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报  分类: C++编程语言(24)  版权声明:本文为博主原创文章,未经 ...

  6. c#中的linq二

    c#中的linq二   using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...

  7. [转]Visual Studio 2008中如何比较二个数据库的架构【Schema】和数据【Data】并同步

    使用场景: 在团队开发中,每一个人都有可能随时更新数据库,这时候数据库中数据和架构等信息都会发生变化.如果更新不及时,就会发生数据错误或数据丢失的风险,影响团队的开发效率和 项目进度,这时候我们该怎么 ...

  8. php中向前台js中传送一个二维数组

    在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...

  9. Golang中的坑二

    Golang中的坑二 for ...range 最近两周用Golang做项目,编写web服务,两周时间写了大概五千行代码(业务代码加单元测试用例代码).用Go的感觉很爽,编码效率高,运行效率也不错,用 ...

随机推荐

  1. POJ1038 Bugs Integrated, Inc.

    题目来源:http://poj.org/problem?id=1038 题目大意: 有一家芯片公司要在一块N*M的板子上嵌入芯片,其中1<=N<=150, 1<=M<=10,但 ...

  2. 马哥Python 开发9期

    LVS工作模式: 传输层 会话保持:负载均衡(1) session sticky:同一用户调度固定服务器Source IP:LVS sh算法(对某一特定服务而言)Cookie(2) session r ...

  3. python3 判断大小端的一种方法

    这里用到了array.array('H', [1])来测试大小端,[1]可以转化为十六进制的0x0001,占两位,00位高位, 01位低位,通过第一位就可以判断大小端. 如果是小端,则转化为bytes ...

  4. Centos调整时间时区

    一台VPS的时间出错,使用常规手段修改均失败.提示hwclock failed : ntpdate stdtime.sinica.edu.tw 如果你的 VPS 提示没有 ntpdate 这个命令,可 ...

  5. 三篇文章了解 TiDB 技术内幕 - 说存储(转)

    引言 数据库.操作系统和编译器并称为三大系统,可以说是整个计算机软件的基石.其中数据库更靠近应用层,是很多业务的支撑.这一领域经过了几十年的发展,不断的有新的进展. 很多人用过数据库,但是很少有人实现 ...

  6. 接口文档管理神器RAP2安装和部署

    目录 一 RAP2 二 RAP2 安装需要的环境 2. 1 Node.js 安装: 2. 2 Mysql 5.7+ 安装 2 .3 Redis 安装见文章 2. 4 后端 rap2-delos 安装 ...

  7. springboot-26-springboot 集成rabbitmq

    rabbitmq是基于AMQP规范的一个消息代理, 它可以兼容jms, 支持其他语言, 并且可以跨平台 1, 安装 1) 普通安装 度娘: 2) docker 安装 sudo docker run - ...

  8. php使用date()函数时,提示的警告

    转载:http://www.shangxueba.com/jingyan/121682.html 在用PHP5.3以上的PHP版本时,只要是涉及时间的会报一个: "PHP Warning: ...

  9. nodeJs的npm报错问题

    1. Failed at the phantomjs-prebuilt@2.1.14 install script 'node install.js'. 解决办法: npm install phant ...

  10. Android自动化压力测试图解教程——Monkey工具 (转)

    有时候我们需要对一个软件进行压力测试,检查该软件的性能.如果是人工进行测试的话,效率会低很多,而且会比较枯燥.这时,Android中的一个命令行工具Monkey就可以为我们减轻很多重复而又繁琐的工作. ...