当前位置: 首页 > 编程日记 > 正文

ARKIT/ARCore对比分析(二)

ARKit(2)  ARCore 和 ARKit平台特点比对

曾与一家最大的 IMU OEM 交谈过,为了节省成本,他们的智能机IMU 在工厂中只是在单一温度下进行标定。这意味着 IMU 硬件在某一指定的温度下,误差被调节到最低。但当手机发热的时候,IMU 就不会那样准确。虽然这是十分普遍的现象,但是对于 VIO 来说,一旦设备发热,标定结果不可信,算法结果会产生漂移。当然,OEM 也可以在客户要求下,在多种温度下标定传感器。

这一点,谷歌比不上苹果。虽然这只是一个很小的误差,但是意味着谷歌 ARCore VIO 代码会随着设备不同而发生变化。苹果的软硬件垂直集成帮助它更快地应对这类挑战,而 Android 需要对整个生态系统进行过滤。

光照问题

ARCore 和 ARKit 提供了场景中的光照实时估计,所以开发者们可以迅速调整模拟光照,以便匹配真实世界(还可能同时触发动画人物)。

ARKit 和 ARCore 可以对场景光进行简单的估计,不管是真实世界环境光还是尖锐的聚光灯。ARKit 为开发者提供了强度和色温选项,而ARCore 提供了单像素强度值(Android Studio API)或 shader(Unity API)。这两种方法在早期 Demo 中有相似的结果,而 Google 的 Demo看起来更好一些,可能是因为开发者们对 Tango 用得更熟。

不过,Google 在今年的 I/O 大会中已经表示,对虚拟阴影在真实世界光照下调整的功能即将和开发者们见面。这是一个很大的进步,会让 AR 更加真实。

构建地图

Mapping,构建地图,是 ARCore 相对于 ARKit 的显著优势领域之一。

它意味着可以将 3D 真实世界的环境信息存在内存中视觉信息中的三维重建,供追踪器(VIO系统中的重要部分)进行设备的定位。设备就可以知道自己在环境中所处的位置。为了帮助大家理解,举个例子,蒙着眼睛把你放到一个陌生城市的市中心,只给你一张地图,你可以通过地图了解到自己的位置。

最简单形式的 SLAM 建图是一些离散的 3D 点云数据,它们代表了光学特征点的位置(例如桌角)。在这些数据中还隐藏着一些元数据,通过特征点在多帧中相同位置出现的次数,表明点的可信度(例如走来走去的狗,可信度就很低,因为每张图拍到的结果都不同)。

一些图包括了“关键帧”,也就是每隔几秒存储的视频或照片的单帧,可以帮助追踪器更好地将真实世界与图进行匹配。另外,一些图使用密集点云,更可信但是需要 GPU 和更多内存。ARCore 和 ARKit 都使用了离散点云图(可能没有关键帧)。

离散点云图就像右上图所示。左上图显示了点云和真实世界是如何匹配的(颜色代表点的可信度)。左下图是原始图像,右下图是强度(灰度)图,可以被用到多种 SLAM 系统中(但并没有用到 ARKit 或 ARCore 中)。

那么这是如何工作的呢?当你加载 ARCore/ARKit App 时,跟踪器会检测之前是否有加载好的图,如果没有就会通过立体计算,自定义一个新的地图,也就是说我们拥有了相机视角下的一个小范围3D图。当你开始四处运动,相机捕捉到新的一幅图,更多的 3D 点云加入到地图中,地图越变越大。

如果地图变得太大而无法控制,追踪则会变得糟糕,以至于追踪出现漂移。不过,这也不再是个大问题,控制地图是 SLAM 研究正在做的一部分(还有深度学习和 CNN AI)。

ARKit 在建图的时候使用了“sliding window”,也就是说它只会在图中保存最近的时间和距离数据,旧的数据会被自动忽视,而 ARCore 会管理更大的地图,也就是说系统会更加稳定。所以使用ARCore,即使追踪跟丢了也会恢复得很好。

ARCore 和 ARKit 都采用了一种被称为“锚点”(Anchors)的概念,让我们感觉地图似乎覆盖了更大的物理面积。我第一次看到这个概念是在 HoloLens 上。正常情况下,系统会完全控制地图,而用户或应用开发者并不知道这点。锚点使开发者告诉系统“记住周围的地图,不要将其丢弃”。

我觉得锚点的某一合理物理范围大概有 1 平方米,这其中有我自己猜测的部分,也有可能会根据系统看到的光学特征发生多种变化。但当用户重新范围物理位置时,该范围足以让系统重新实现定位。

不管何时,内容被放置在一个物理位置时,开发者通常会丢下一个锚点。如果没有锚点,用户来回走动时,物理位置周围构建的地图(内容所呈现的地方)将会丢失,内容也将丢失。而加上锚点后,内容将永远固定在那里,也不排除因为积累的漂移,系统需要矫正重新定位时,糟糕的 UX (用户体验)会对内容产生影响。

构建地图的目的是以两种方式来帮助追踪:

第一,当我前后移动手机,地图从一开始移动便建立,手机往回移动时,新的特征点可被实时检测。

在位置计算中,通过对当前和先前场景的特征点收集,这使追踪也更加稳定。

第二,构建地图可帮助定位追踪或是恢复追踪。有时你会遮挡摄像头,手机掉落,或是移动的太快,或是不稳定因素发生,这时摄像头看到的场景与最新更新的地图无法匹配。这就是我们所说的“追踪丢失”这种情况下,系统重定位的两种方法:

F1:重置所有的标定系统,然后重启!这纯粹由测距系统完成(没有地图)。你会看到所有的内容“跳到”新的位置,然后固定在那里。用户体验并不好。

F2:系统可以使用它检测到的 3D 特征,然后搜索整个地图,尝试匹配,随着正确的虚拟位置进行更新。如果你当什么都没发生,一直使用应用,你会发现虚拟内容展示时,追踪不停丢失,但恢复后,追踪又正常。

这里又有两个问题。

首先,随着地图构建的越大,搜索过程会更耗时,过程也会更密集,也就是说要一遍又一遍地开启搜索;

其次,手机当前的位置永远不会精准地与手机过去那一时刻的位置相匹配,所以这也加大了地图搜索的难度,并且还要花费时间和计算去重新定位。基本上,即便有了构建地图,如果你移动的离地图太远,应用就没法定位了,系统需要重置、重启。

图片上的每条线是 SLAM 地图中的街道。在世界上任何地方,使用移动设备实现 AR 功能,都会遇到 SLAM 地图构建问题。记住,现在尽管有机器可读的地图和数据结构,但它们不是那种人们可使用的 3D 街景地图(这也是必须的)。

注意,对移动 AR 来说,我提到的“大”地图大致意思为,可以覆盖较大房间,或小型公寓物理面积的地图。

同时,也意味着,对于室外 AR,我们不得不思考全新构建地图的方式。

针对地图强大的重新定位是非常非常难的问题,而且在消费者体验层面还未解决。如果任何人宣称他们能提供多人 AR 玩法,或是固定性强的 AR 内容,那么不管是由一号玩家创建的地图,还是云端下载的地图,他们的 UX 会受到其他手机(如二号玩家手机)重新定位性能的限制。

你会发现,二号玩家不得不站在距离二号玩家很近的地方,双方几乎以同样的姿势举着手机。但是,二号玩家,或其他玩家只想坐在与你相反方向的沙发上,打开手机,立马看到你眼前看到的事物。或是说,站在距离几米的空间内,看到 AR 内容“固定”在那里。

(这里有一段 Tango实验的视频效果:https://www.youtube.com/watch?v=YulYq5P3heo)

现在已经有应用可以变通地实现多人游戏,如使用标记点,或为二号玩家编写距离应用开始位置的代码。技术上看,这些是可以运行的,但是你要一直为用户解释如何操作,用户体验可能一团糟。所以,并没有什么“简单运行”的魔法。

当然,如果任何人有不同的解决方案,我很想请教一下。不过,就我所知,多玩家实现稳定性极强的重新定位现在还无法实现,也没有发现公布的研究成果。这就像 VIO 的问题一样,只有少部分人可能会解决。我只知道一个还未公布的系统能够支持,2018 年初才会推出。

ARCore 的优势

谁都未能想到,ARCore在ARKit发布后,拥有如此迅速的反应时间。相对于ARKit来说,ARCore其实有不少优势:

功能方面:有一些 ARKit 并未提到的功能优势

开发者经验:ARCore 在 Tango 和 Daydream 上积累几年丰富的开发者经验,相对于 ARKit 仅仅几个月来说,是更加成熟的。

OEM:有足够的 OEM 厂商提供强大的支持

宣传:一段比较走心的宣传短片

OEM 厂商依旧谨慎

我感觉  ARCore 的推出相当匆忙,例如没有 ARCore 的 Logo。我在之前的文章中谈过 OEM 厂商对于 Tango 手机的谨慎。ARCore 消除了摄像头堆栈硬件商品化,以及 Tango 面临的材料成本的问题。看起来,Google 已经考虑到一些战略控制,但是讲真,我感觉一切太快了,这些事情还没真正地实施。

Google 坚持 ARCore 是谷歌移动服务(GMS)的一部分,如果 AR 真的成为“下一个平台”,这是重新划分生态系统势力的一个机会。ARCore 不只是像 GUI 那种功能。所有的初创公司都要考虑 SLAM 的问题。而 AR 是否会脱离 GMS,这可不好说。

OEM 厂商寻找 ARCore 替代品的最大原因可能是,他们巨大的市场(如中国)不欢迎 GMS。

GMS 最大的阻力在于:无法进入中国市场,那里却是 OEM 厂商们最大的市场。厂商们更喜欢一个可以在全球运行的 AR 软件解决方案。

开发者现在可以用 ARCore 开发了吗?

如果你喜欢Android,你有一个 Samsung S8 或 Pixel,那么别犹豫,直接去开发吧。如果你喜欢 iPhone,也不要担心是否需要换成 ARCore。

开发者应当关注的是,打造一个人们关心的 AR 应用要面临巨大的挑战。与学习如何在 ARKit 或 ARCore 上创建内容相比,创建什么样的内容要花费更大的努力。

ARKit / ARCore SDK目前还是1.0版,功能还非常基础(VIO、平面检测、基础照明),将在未来几年内获得更多的功能(3D场景理解、遮挡、多人联网,内容固定性等)。对开发商和消费者来说,这将是一个不断的学习过程。所以现在只需要坚持向着自己认为对的路子走就好。

不要对使用哪个平台想太多,多想想能创建什么样的 AR 内容

ARCore 比 ARKit 更好吗?

作为技术解决方案,它们的能力非常接近。ARKit 在集成和跟踪方面具有一定的技术优势(原因技术是基于特征点的); ARCore 在建图和重定位方面具有一些优势(给予vslam的)。可是这两个优点大多是专业的计算机视觉工程师才能看到的。

苹果有一个清晰的市场宣传优势,拥有庞大的设备基础,可以立即升级到包含 ARKit 的最新 iOS 系统。苹果的用户一般更愿意花钱,所以从中期来看,AR 应用应该可以在 ARKit 上更好地获利。

Android 的优势在于规模化,但 Android 生态系统需要至少 12 个月才能将所有的部分整合在一起,并在大多数新设备中获得硬件支持的 ARCore。

ARCore 由此前 Tango 研发的基础,其中大部分已经进行了用户/市场测试。现在基础已经比较到位,看看这些系统在未来12-24个月内如何快速发展,这会很有趣。

相关文章:

【ACM】杭电OJ 1789(Doing Homework again)

http://acm.hdu.edu.cn/showproblem.php?pid1789 cmp函数: 先按扣分由多到少进行排序,然后如果遇到扣分一样的,则先做时间少的。 vis数组: 最要的事,放在它的截至日期那一天去做,然后,之后…

推荐使用的几款Java常用基础工具库

通用工具类(字符串、时间格式化、BeanUtils、IO)1. commons-lang3库1.1. org.apache.commons.lang3.StringUtils类日常代码中,我们经常和String字符串打交道,经常对字符串进行处理,稍微不注意的话,很容易出现类似NullPointerExcep…

ARKit 与 ARCore比对(三)

ARKit 和 ARCore剖析、结构、原理介绍 ARKit 和 ARCore 都是三部分:相机姿态估计, 环境感知(平面估计)及光源感知。 ARCore 的部分源码:https://github.com/google-ar/arcore-unity-sdk/tree/master/Assets/GoogleARCo…

前端开发之retina屏幕

像素 && ppi 首先先说一下pixel(picture element),显示图像的最小单位,有多个带色彩的像素点组成的整体就是一张图像。然后再说一下ppi(pixel per inch)这个概念,其实就是在每英寸显示的像素数。 设备像素 && 逻辑像素 &…

【ACM】Uva 1152 (4 Values whose Sum is 0) 二分查找lower_bound() 和upper_bound()的使用

【问题描述】 The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d) ∈ A B C D are such that a b c d 0. In the following, we assume that all lists have the same size n. …

广东“基因编辑婴儿事件”调查组:将对贺建奎依法依规严肃处理

雷锋网(公众号:雷锋网)消息,1 月 21 日,新华社报道了关于“基因编辑婴儿事件”的初步调查结果,该结果宣称,该事件是南方科技大学副教授为了追逐个人名利而进行的人类胚胎基因编辑活动;而在此过程中&#xf…

测试我的第一个随笔

# encodingutf-8## Python Version 3.5# 利用数学中的复数 求解 一元一次方程(从网上看来的)def solve(qx, var): qx qx.replace(, -() ) c eval(qx , {var: 1j}) return -c.real/c.imagres solve(2*x 4 8,x)print(res)转载于:https://www.cnblogs.com/imyjy/p/…

ubuntu16.04 下安装Opencv2.4.9

ubuntu16.04 下安装Opencv2.4.9 OpenCV的源码download from: https://sourceforge.net/projects/opencvlibrary/?sourcetyp_redirect[plain] view plaincopycd opencv-2.4.9 mkdir build sudo chmod -R 777 build cd build [plain] view plaincopycmake -D CMAKE_…

UVa 167(八皇后)、POJ2258 The Settlers of Catan——记两个简单回溯搜索

UVa 167 题意&#xff1a;八行八列的棋盘每行每列都要有一个皇后&#xff0c;每个对角线上最多放一个皇后&#xff0c;让你放八个&#xff0c;使摆放位置上的数字加起来最大。 参考&#xff1a;https://blog.csdn.net/xiaoxiede_wo/article/details/79973171 1 #include <io…

AR + ROS +UBUNTU16.04+ORB-SLAM2

ORB SLAM2 USB摄像头 实验环境ubuntu 16.04ros kinetic OPencv2.4.9 Step1&#xff1a; 配置环境变量 $ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/src 在’src’目录中可能没有任何软件包&#xff0c;只有一个CMakeLists.txt&#xff0c;依然可以编译它&#xff1a; …

Cross-validation

2019独角兽企业重金招聘Python工程师标准>>> 1: Introduction To Validation So far, weve been evaluating accuracy of trained models on the data the model was trained on. While this is an essential first step, this doesnt tell us much about how well …

【ACM】杭电OJ 1877 又一版A+B(进制转换)

注意&#xff1a;A和B都是0的情况 A和B为int也可以AC #include<cstdio> #include <iostream> using namespace std;const int maxn 10000;int a[maxn];int main() {long long A,B;int m,k;while(scanf("%d",&m)!EOF){if(m0) return 0;scanf("…

[POI2009]KAM-Pebbles BZOJ1115 [ 待填坑 ] 博弈

有N堆石子&#xff0c;除了第一堆外&#xff0c;每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从一堆石子中移走任意多石子&#xff0c;但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。 感谢MT大牛翻译. Sample OutputNIE…

ROS中使用摄像头的问题

ROS中使用摄像头的问题 0.prepare 4 . 安装uvc_cam $ sudo apt-get install ros-indigo-uvc-camera $ source /opt/ros/indigo/setup.bash 采用apt-get的方式&#xff0c;直接装在了ROS的安装路径中&#xff0c;并设置工作路径。 安装成功后在/opt/ros/hydro/的路径中就…

EmEditor Professional(文本编辑) 下载地址

http://www.greenxf.com/soft/2126.html 16.1.5 http://www.cr173.com/soft/3031.html 16.3.0 http://www.pc6.com/softview/SoftView_43146.html 17.8.1 绿色注册版 EmEditor 71 个实用插件汉化版 http://www.onlinedown.net/soft/35609.htm

【ACM】杭电OJ 4548 美素数(二次打表)

二次打表&#xff0c;第一次是标记哪些是素数&#xff0c;哪些不是。 第二次是前n个数中 “本身是素数 && 各个位上的和是素数 ” 的个数 TLE&#xff1a; #include <iostream> #include <cstdio> using namespace std;int fun1(int x) {int sum0…

animation与transition区别

transition&#xff1a; 过渡属性 过渡所需要时间 过渡动画函数 过渡延迟时间&#xff1b;默认值分别为&#xff1a;all 0 ease 0 1、局限性&#xff1a; 1&#xff09;只能设置一个属性 2&#xff09;需要伪类/事件触发才执行 3&#xff09;只能设置动画初始值和结束值 2、过…

如何将cocos2d-x程序分别移植到ios,android,windowsphone三个手机平台上

作者&#xff1a;方格子链接&#xff1a;https://www.zhihu.com/question/21505500/answer/22152464来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。面向android的移植 0. 这移植过程简直…… 1. 完成以上工具的下载安装…

【数据结构】顺序循环队列及其实现(C语言)

给定一个大小为MAXSIZE的数组储存一个队列&#xff0c;经过若干次的插入和删除以后&#xff0c;当队尾指针 rear MAXSIZE 时&#xff0c;呈现队列满的状态&#xff0c;而事实上数组的前部可能还有空闲的位置。为了有效地利用空间&#xff0c;引入循环队列&#xff08;环状&…

C++中Reference与指针(Pointer)的使用对比

了解引用reference与指针pointer到底有什么不同可以帮助你决定什么时候该用reference&#xff0c;什么时候该用pointer。在C 中&#xff0c;reference在很多方面与指针(pointer)具有同样的能力。虽然多数C程序员对于何时使用reference何时使用pointer 都会有一些直觉&#xff0…

云南实现手机自主补(换)领居民身份证

图为云南首位通过手机自主补领居民身份证的申领人付宏强。 缪超 摄 中新网昆明1月22日电 (缪超)春节临近&#xff0c;云南实现手机自主补(换)领居民身份证&#xff0c;首张通过手机补办的居民身份证于22日在武定县公安局狮山派出所成功申领。 据悉&#xff0c;为方便民众因遗失…

NDK JNI 安装与配置(一)(UBUNTU16.04 )

1、下载Android NDK自解压包&#xff0c;官方地址&#xff1a;https://developer.android.com/ndk/downloads/index.html#download下载&#xff1a;$ wget -c http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin2、解压&#xff0c;将Android NDK压缩包解压到…

【数据结构】顺序表的应用(4)(C语言)

【数据结构】顺序表的应用&#xff08;1&#xff09;&#xff08;C语言&#xff09; 【数据结构】顺序表的应用&#xff08;2&#xff09;&#xff08;C语言&#xff09; 【数据结构】顺序表的应用&#xff08;3&#xff09;&#xff08;C语言&#xff09; 设计一个算法&…

Java泛型:泛型类、泛型接口和泛型方法

2019独角兽企业重金招聘Python工程师标准>>> 根据《Java编程思想 &#xff08;第4版&#xff09;》中的描述&#xff0c;泛型出现的动机在于&#xff1a;有许多原因促成了泛型的出现&#xff0c;而最引人注意的一个原因&#xff0c;就是为了创建容器类。 泛型类 容器…

POJ 2456 Aggressive cows(二分答案)

Aggressive cowsTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 22674 Accepted: 10636Description Farmer John has built a new long barn, with N (2 < N < 100,000) stalls. The stalls are located along a straight line at positions x1,...,xN (0…

JMeter打开脚本报错处理方法

今天电脑重装了系统&#xff0c;安装好jmeter后打开以前写的脚本&#xff0c;总是报错如下图&#xff0c;研究了半天也没搞明白。 后来一个群里的人员提醒才想起来&#xff0c;是脚本的问题&#xff0c;为啥捏&#xff1f; 因为之前写的脚本用了一些监听&#xff0c;而这些监听…

Android开发中libs包下面的mips、armeabi、armeabi-v7a和x86

简介 在Android日常的开发过程中有的项目需要引入第三方的库&#xff0c;有时候大家可能会在libs文件夹下看到 mips、armeabi、armeabi-v7a和x86这四个文件夹。那么这三个文件夹下面的包是干什么用的&#xff1f; 这三个包下面存放的用C编译的本地库文件&#xff08;各类『.…

【数据结构】判断一个单链表中各结点的值是否有序

count记录的是单链表的总长 count1记录的是升序的结点的个数 count2记录的是降序的结点的个数 如果count1或者count2等于count&#xff0c;那么就说明该序列是升序或者降序的。 稍加改进可以在准确判断是升序还是降序还是无序 &#xff08;个人认为链表中只有一个结点或者…

MSSQL-最佳实践-行级别安全解决方案

title: MSSQL-最佳实践-行级别安全解决方案 author: 风移 摘要 在SQL Server安全系列专题月报分享中&#xff0c;我们已经分享了&#xff1a;如何使用对称密钥实现SQL Server列加密技术、使用非对称密钥加密方式实现SQL Server列加密、使用混合密钥实现SQL Server列加密技术和列…

浮点数运算原理详解

导读&#xff1a; 浮点数运算是一个非常有技术含量的话题&#xff0c;不太容易掌握。许多程序员都不清楚使用操作符比较float/double类型的话到底出现什么问题。 许多人使用float/double进行货币计算时经常会犯错。这篇文章是这一系列中的精华&#xff0c;所有的软件开发人员都…