ARKit与多个用户的应用

26

如果需要多个用户/设备使用Apple的新ARKit技术,最佳方式是什么?

每个设备似乎都会单独获得其自身的场景理解。目前我最好的猜测是使用原始特征点位置,并尝试在设备之间匹配它们以将不同视角的点粘合在一起,因为ARKit没有提供任何绝对参考参照。

===编辑1,我尝试过的事情===

1) 特征点

我已经玩弄了暴露的原始特征点,并且现在确信它们在当前状态下是死路一条:

  • 它们不是原始特征点,它们只公开位置,但没有跟踪特征点中通常找到的任何属性
  • 它们的实例化不会从帧到帧保持一致,位置也不完全相同
  • 通常情况下,当摄像机输入几乎不变时,报告的特征点会大量改变,出现或消失。

因此,总体而言,我认为尝试以某种有意义的方式使用它们是不合理的,在一个设备内无法进行任何良好的点匹配,更不用说在多个设备上了。 另一种选择是实现自己的特征点检测和匹配,但那将更换ARKit而不是利用它。

2) QR码

正如@Rickster建议的那样,我还尝试识别易于识别的物体(例如QR码),并从该固定点获取相对参照变化(请参见此问题)。这有点困难,并且需要我使用一些openCV来估计相机姿态。但更重要的是非常受限制。


有没有可能将设备的指南针数据和/或方向数据发送到服务器,以便将其转换为另一个设备的坐标系统? - Chris
可以做到。多人 AR 体验可能需要一些服务器支持的同步。但这并不能给我两个设备之间精确的翻译差异。如果只能使用指南针、加速度计和 GPS 来完成映射,那么就不需要像苹果正在使用的复杂 SLAM 技术了。 - Guig
5个回答

10
作为一些新答案的补充,多用户增强现实是 ARKit 2 (也称 iOS 12 上的 ARKit)的一个重要特性。WWDC18 关于 ARKit 2 的演讲提供了一个很好的概述,并且 Apple 提供了两个开发者示例代码项目来帮助你入门:一个基本示例只需将 2 个或以上设备放入共享体验中,以及SwiftShot,一个专为 AR 打造的真正的多人游戏。
主要要点:
  1. ARWorldMap将ARKit知道的本地环境打包成可序列化的对象,以便您可以保存它以备后用或将其发送到另一台设备。在后一种情况下,“重新定位”到由同一本地环境中的另一台设备保存的世界地图会为两个设备提供相同的参考框架(世界坐标系)。

  2. 使用您选择的网络技术将 ARWorldMap 在设备之间发送:AirDrop、云共享、信鸽等都可以,但 Apple 的 Multipeer Connectivity framework 是一个好的、易用的、安全的选项,所以它是 Apple 在他们的示例项目中使用的。

  3. 所有这些只为创建共享体验提供了基础——多个设备上您的应用程序的多个副本都使用与相同真实世界环境对齐的世界坐标系。这就是您需要的全部内容,以使多个用户体验相同的静态 AR 内容,但如果您希望他们在 AR 中交互,则需要再次使用您喜欢的网络技术。

    Apple 的 basic multiuser AR demo 演示了如何对一个 ARAnchor 进行编码并将其发送给同伴,以便一个用户可以轻触以在世界中放置一个 3D 模型,所有其他用户都可以看到它。SwiftShot game example 构建了一个完整的网络协议,以使所有用户获得相同的游戏动作(如相互之间发射弹弓)和同步的物理结果(如被击中后块的倒塌)。两者都使用 Multipeer Connectivity

(顺便说一句,上面第二和第三点是你从@andy's answer中得出“2到6”的数字的原因——在ARKit方面没有限制,因为ARKit不知道有多少人可能已经接收了你保存的世界地图。然而,Multipeer Connectivity有一个8个对等节点的限制。无论你在这个基础上构建什么游戏/应用程序/体验,随着添加更多的对等节点,可能会出现延迟/性能缩放问题,但这取决于你的技术和设计)

下面是原始答案,供历史参考...


这似乎是iOS开发者社区中一个活跃的研究领域——上周在WWDC上我遇到了几个试图解决它的团队,但没有人开始破解它。因此,即使有可行的方法,我也不确定是否存在“最佳方法”。
要注意的是,特征点是相对于会话定位的,没有单独的标识,所以我想在多个用户之间进行关联可能会比较棘手。
会话对齐模式 gravityAndHeading 可能会有所帮助:它将所有方向固定到(假定/估计为)绝对参考框架,但位置仍然相对于设备在会话开始时的位置。如果您能找到一种将该位置与某些绝对值(例如纬度/经度或iBeacon)可靠地关联起来,并且足够精确......那么,您不仅可以拥有供多个用户共享的参考框架,还可以获得基于位置的AR的主要组成部分。(你知道的,像一个浮动的虚拟箭头,指向某个地方,告诉你去机场的A113登机口右转,或者其他什么地方。)
另一种被讨论的方法是图像分析。如果您能够放置一些真实标记(易于机器识别的东西,如QR码)在多个用户的视野范围内,您或许可以使用某种形式的物体识别或跟踪(例如ML模型)来精确地识别标记相对于每个用户的位置和方向,并从那里计算出共享的参考框架。不知道这是否可行。(但如果您选择这条路线或类似路线,请注意ARKit为每个捕获的相机帧公开了像素缓冲区。)
祝好运!

“gravityAndHeading” 是一个不错的调用。我会尝试使用它。我不能依赖 QR 码或信标,但我可能能够识别一些其他图像。我将查看 iOS 11 中的新 ML 功能中的对象识别。我考虑首先查看墙上的物品,因为它们只呈现一个面,但这可能不是非常确定的。 - Guig
特征点太混乱了,不可靠:它们的添加和删除方式难以理解,而且它们没有比它们估计的三维定位更多的信息,因此它们在帧之间非常难匹配,更不用说在设备之间。我已经开始从QR码入手作为第一步,但我在数学上遇到了困难... https://dev59.com/A1cP5IYBdhLWcg3wVYeh - Guig
gravityAndHeading 实际上非常有 bug。-z 轴根本不对应北方,并且可能偏差达到 150 度(在我的测试中)。 - dmr07

4
现在,在WWDC 2018发布ARKit 2.0之后,可以为2...6个用户制作游戏。
为此,您需要使用ARWorldMap类。通过保存世界地图并使用它们启动新会话,您的iOS应用程序现在可以添加新的增强现实功能:多用户和持久性AR体验。
AR多用户体验。现在,您可以通过将归档的ARWorldMap对象发送到附近的iPhone或iPad来创建共享的参考帧。通过同时跟踪相同的世界地图,您可以构建一个体验,所有用户(最多6个)都可以分享和查看相同的虚拟3D内容(在Xcode 10+和iOS 12+中使用Pixar的USDZ文件格式进行3D)。
session.getCurrentWorldMap { worldMap, error in 
    guard let worldMap = worldMap else {
        showAlert(error)
        return
    }
}

let configuration = ARWorldTrackingConfiguration()
configuration.initialWorldMap = worldMap
session.run(configuration)
AR持久体验。如果您保存了一个世界地图,然后您的iOS应用程序变为非活动状态,您可以在下次启动应用程序时轻松恢复它,并在相同的物理环境中进行。您可以使用恢复的世界地图中的ARAnchors将相同的虚拟3D内容(以USDZ或DAE格式)放置在以前保存的会话中相同的位置。

请注意,您可以将普通的场景工具包内容附加到锚点上,并与地图一起保存/检索(不一定必须是USDZ格式)。我们的创业公司拥有一款SDK,可以在正确的时间动态加载正确的地图 - 如果有人感兴趣,请联系jordan@jordancampbell.org - Jordan
完全同意)) - Andy Jazz

1
不是百分之百可靠的答案,更像是解决问题的折中方案,但或许你会觉得这些有用。所有方案都假定玩家在同一地点。
  1. DIY ARKit 在AR会话启动后很快就会建立起世界坐标系。因此,如果你能让所有玩家依次将其设备放置并与相同物理位置对齐,然后在那里启动会话,那么问题就解决了。可以想象成一个固定在任何可用表面上的L形直尺的内边缘。或者是带孔的任何平面:将手机靠在表面上,透过孔看相机,(重新)初始化会话。

  2. Medium 不要让玩家手动对准手机,而是使用图像分析检测真实世界的标记,就像 @Rickster 所描述的那样。

  3. Involved 训练一个Core ML模型来识别iPhone和iPad及其相机位置,就像对人脸和眼睛所做的那样。在服务器上聚合数据,然后关闭ML以节省电力。注意:确保您的模型具有覆盖范围。


0

这是一个非常困难的问题 - 目前正在解决此问题的最重要的创业公司是6D.ai

“多人 AR” 与持久 SLAM 是同样的问题,您需要将自己定位在可能不是自己构建的地图中。 这是大多数自动驾驶汽车公司正在积极解决的问题。


0
我正在更新我的游戏控制器框架(https://github.com/robreuss/VirtualGameController),以支持共享控制器功能,这样所有设备都可以从所有设备屏幕上的控制元素接收输入。此增强的目的是支持基于ARKit的多人游戏功能。我假设开发人员将使用diviaki提到的第一种方法,其中虚拟空间的一般定位是通过从物理空间的共同点开始在每个设备上启动会话来定义的,即一个共享参考系,特别是我想象的是在桌子的对面。所有设备将同时启动游戏,并利用相对于物理尺寸的公共坐标空间,使用所有控制器的输入,游戏理论上将在所有设备上保持同步。仍在测试中。明显的潜在问题是网络延迟或中断,同步会失败,除非重新启动游戏,否则很难恢复。该方法和框架可能适用于某些类型的游戏 - 例如,直接的街机风格游戏,但肯定不适用于许多其他游戏 - 例如,任何无法在设备之间协调的重要随机性游戏。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接