雷锋网按:本文作者为 Matt Miesnieks,目前担任 6D.ai 的 CEO,Super Ventures 合伙人。此前,他发布过多篇文章探讨了 ARKit 的相关问题。谷歌推出 ARCore 后,引起业界热议,Matt 的最新博文中对 ARCore 做了详细的分析。本文转自亮风台,雷锋网对文章进行了校对和补充。
一位开发者戏称:“我觉得 ARCore SDK,就像是他们随便地把 Tango SDK 改了个名字,注释掉深度相机那块代码,改了一种编译标志。”应该不止这些,但也不会太多,比如支持 ARCore 的新的 Web 浏览器对开发者来说很友好,但它们属于相互独立的核心 SDK。
大概很多人都想知道为什么12个月之前,一切都已准备好的时候,Google 没有发布 Tango VIO (无需深度相机),但现在才发布出来。
不论如何,这是一个好消息,意味着 ARCore 是非常成熟的,而且经过了充分的软件测试(尽管苹果收购了 Metaio 和 Flyby 两家公司有技术储备,但 ARCore 还是比 ARKit 至少多两年的实践测试);另外,谷歌已经为 Tango 安排好了全面的功能蓝图,其中不是所有的功能都要依赖 3D 深度相机,现在 ARCore 让这些功能可以全面发挥出来了。
抛开名字不谈,如果在能运行 ARCore 的普通智能手机上添加深度相机,你就等同于拥有了 Tango 手机。现在谷歌有一个更简单的路径,可以通过 OEM 旗舰机,推广 SDK,ARCore 就会随着手机而被推广开来。
没人会因为一款手机带有 AR 功能而放弃使用优质的安卓手机,就像是没人会因为 Windows 系统手机带有 AR 功能,而放弃使用任何安卓手机。所以,微软直接进军头戴设备。现在人们一定会买手机,而 ARCore 也终于实现了免费。
一开始,Tango 聚焦于对 3D 空间手机移动的追踪。最开始 Tango 的应用也多在于室内映射。后来,VR/AR 才变成了最受欢迎的使用场景。
说到命名,这很有趣。Tango 总是被描述为“一款知道自己定位的手机”。而人们从不会被这样的描述对 Tango 留下深刻印象。对我而言,当某系东西与 Google 地图密切联系时,手机才会有定位(但不知道 Google 是否这样看)。有了新名字 ARCore,一切便与 AR 有关。
这就是有趣之所在了……我之前有说过苹果 ARKit 能够如此稳定的三种标定方法:
相机的光学几何校正(简单)
相机的光度标定(难)
IMU误差消除(非常难)
另外,传感器的时钟同步是更重要的。
标定不是非黑即白的问题,需要统计、并做更多的迭代以减少误差,才能让用例更加稳定。系统标定得越好,位置估计误差就会越不容易出现。
正如苹果的 ARKit,Google 也做了以下几件事:
首先,Google 对所支持的设备选择十分谨慎。起初,只有Samsung S8和 Pixel。谷歌工程师已经在这些平台进行过传感器标定的优化,以适配于 DayDream 的 Inside-Out 追踪(从三自由度向六自由度)。
不久前,谷歌工程师在韩国对 Samsung 传感器进行标定和调谐,希望下一代手机可以支持 Daydream。所以我们才有了标定好且符合时钟同步的相机与 IMU 的两款设备。
Google 在今年早些时候的 I/O 大会上宣布 Inside-Out 6自由度跟踪支持 Daydream
今年,Google为融合 Tango 和 Daydream SDK 做了大量工作,据说11 月份这项工作就会结束,所以 8 月底,很多底层工作应该会完成,意味着 Tango/ARCore VIO 系统可以利用 Daydream 传感器融合的工作成果。
最后,标定的真正好处可以从系统表现看出来。ARKit 和 ARCore 在用户发现误差之前,都可以追踪得非常好。在 AR 应用中,目前还是以内容直观可见的形式为主,不像室内导航那样,存在长时间长距离的端对端测试。
所以,从 AR 应用角度来看,标定带来的差异几乎是无法被检测的。但是开发者们正在扩大 SDK 应用的界限,谷歌预计会在工厂中做更紧密的标定,并上市一批新一代的设备。
震动器被用于在工厂中标定加速度计,AR 软件堆栈更无须担心过多误差的问题了。
我曾与一家最大的 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,即 SLAM 中的‘M’,也叫构建地图,是 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 (用户体验)会对内容产生影响。
构建地图的目的是以两种方式来帮助追踪:
第一,当我前后移动手机,地图从一开始移动便建立,手机往回移动时,新的特征点可被实时检测。
在位置计算中,通过对当前和先前场景的特征点收集,这使追踪也更加稳定。
第二,构建地图可帮助定位追踪或是恢复追踪。有时你会遮挡摄像头,手机掉落,或是移动的太快,或是不稳定因素发生,这时摄像头看到的场景与最新更新的地图无法匹配。
这就是我们所说的“追踪丢失”,过去几年,那些率先尝试的开发者们每天都要吐槽 1000 次这个问题。这种情况下,系统可以做两件事:
重置所有的标定系统,然后重启!这纯粹由测距系统完成(没有地图)。你会看到所有的内容“跳到”新的位置,然后固定在那里。用户体验并不好。
还有一件事是,系统可以使用它检测到的 3D 特征,然后搜索整个地图,尝试匹配,随着正确的虚拟位置进行更新。如果你当什么都没发生,一直使用应用,你会发现虚拟内容展示时,追踪不停丢失,但恢复后,追踪又正常。
这里又有两个问题。
首先,随着地图构建的越大,搜索过程会更耗时,过程也会更 密集,也就是说要一遍又一遍地开启搜索;
其次,手机当前的位置永远不会精准地与手机过去那一时刻的位置相匹配,所以这也加大了地图搜索的难度,并且还要花费时间和计算去重新定位。基本上,即便有了构建地图,如果你移动的离地图太远,应用就没法定位了,系统需要重置、重启。
图片上的每条线是 SLAM 地图中的街道。在世界上任何地方,使用移动设备实现 AR 功能,都会遇到 SLAM 地图构建问题。记住,现在尽管有机器可读的地图和数据结构,但它们不是那种人们可使用的 3D 街景地图(这也是必须的)。
注意,对移动 AR 来说,我提到的“大”地图大致意思为,可以覆盖较大房间,或小型公寓物理面积的地图。
同时,也意味着,对于室外 AR,我们不得不思考全新构建地图的方式。
针对地图强大的重新定位是非常非常难的问题,而且在消费者体验层面还未解决。如果任何人宣称他们能提供多人 AR 玩法,或是固定性强的 AR 内容,那么不管是由一号玩家创建的地图,还是云端下载的地图,他们的 UX 会受到其他手机(如二号玩家手机)重新定位性能的限制。
你会发现,二号玩家不得不站在距离二号玩家很近的地方,双方几乎以同样的姿势举着手机。但是,二号玩家,或其他玩家只想坐在与你相反方向的沙发上,打开手机,立马看到你眼前看到的事物。或是说,站在距离几米的空间内,看到 AR 内容“固定”在那里。
(这里有一段 Tango实验的视频效果:https://www.youtube.com/watch?v=YulYq5P3heo)
现在已经有应用可以变通地实现多人游戏,如使用标记点,或为二号玩家编写距离应用开始位置的代码。技术上看,这些是可以运行的,但是你要一直为用户解释如何操作,用户体验可能一团糟。所以,并没有什么“简单运行”的魔法。
当然,如果任何人有不同的解决方案,我很想请教一下。不过,就我所知,多玩家实现稳定性极强的重新定位现在还无法实现,也没有发现公布的研究成果。这就像 VIO 的问题一样,只有少部分人可能会解决。我只知道一个还未公布的系统能够支持,2018 年初才会推出。
谁都未能想到,ARCore在ARKit发布后,拥有如此迅速的反应时间。相对于ARKit来说,ARCore其实有不少优势:
功能方面:有一些 ARKit 并未提到的功能优势
开发者经验:ARCore 在 Tango 和 Daydream 上积累几年丰富的开发者经验,相对于 ARKit 仅仅几个月来说,是更加成熟的。
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 软件解决方案。
如果你喜欢Android,你有一个 Samsung S8 或 Pixel,那么别犹豫,直接去开发吧。如果你喜欢 iPhone,也不要担心是否需要换成 ARCore。
开发者应当关注的是,打造一个人们关心的 AR 应用要面临巨大的挑战。与学习如何在 ARKit 或 ARCore 上创建内容相比,创建什么样的内容要花费更大的努力。
ARKit / ARCore SDK目前还是1.0版,功能还非常基础(VIO、平面检测、基础照明),将在未来几年内获得更多的功能(3D场景理解、遮挡、多人联网,内容固定性等)。对开发商和消费者来说,这将是一个不断的学习过程。所以现在只需要坚持向着自己认为对的路子走就好。
不要对使用哪个平台想太多,多想想能创建什么样的 AR 内容
作为技术解决方案,它们的能力非常接近。ARKit 在集成和跟踪方面具有一定的技术优势; ARCore 在建图和重定位方面具有一些优势。可是这两个优点大多是专业的计算机视觉工程师才能看到的。
想用这张图解释一个设计师的价值
苹果有一个清晰的市场宣传优势,拥有庞大的设备基础,可以立即升级到包含 ARKit 的最新 iOS 系统。苹果的用户一般更愿意花钱,所以从中期来看,AR 应用应该可以在 ARKit 上更好地获利。
Android 的优势在于规模化,但 Android 生态系统需要至少 12 个月才能将所有的部分整合在一起,并在大多数新设备中获得硬件支持的 ARCore。(时间可能会更长,通常 OEM 厂商会在 10 月份决定 2018 年的产品。)
ARCore 由此前 Tango 研发的基础,其中大部分已经进行了用户/市场测试。现在基础已经比较到位,看看这些系统在未来12-24个月内如何快速发展,这会很有趣。
我认为,制约 AR 应用市场普及速度的将会是开发者打造的内容。技术已经足够去创建消费者产品了。
ARKit 和 ARCore 哪个更好?主要还是看开发者的个人偏好和目标。这两个系统都有自己的优点和缺点,但重要的是两者都能够为消费者提供足够的消费体验,开发者请脑洞大开,尽情享受这个过程吧!
Via medium