多用户 ARKit

ARKit with multiple users

将 Apple 的新 ARKit 与多个 users/devices 一起使用的最佳方法是什么?

似乎每个设备都有自己的场景理解。到目前为止,我最好的猜测是使用原始特征点位置并尝试跨设备匹配它们以将不同的观点粘合在一起,因为 ARKit 不提供任何绝对参考。

===Edit1,我试过的东西===

1) 特征点

我试过暴露的原始特征点,现在我确信在他们目前的状态下他们是死胡同:

所以总的来说,我认为尝试以某种有意义的方式使用它们是不合理的,不能在一个设备内做出任何类型的好点匹配,更不用说几个了。 替代方案是实现我自己的特征点检测和匹配,但与其说是利用它,不如说是替代 ARKit。

2) 二维码

正如@Rickster 所建议的那样,我还尝试过识别一个易于识别的对象,例如 QR 码,并从该固定点获取相对参考变化(参见 this question)这有点困难,暗示我使用一些 openCV 来估计相机姿势。但更重要的是非常有限

正如一些较新的答案所添加的那样,多用户 AR 是 ARKit 2(又名 iOS 12 上的 ARKit)的主要功能。 The WWDC18 talk on ARKit 2 has a nice overview, and Apple has two developer sample code projects to help you get started: a basic example that just gets 2+ devices into a shared experience, and SwiftShot,一款真正的 AR 多人游戏。

要点:

  1. ARWorldMap 将 ARKit 所知道的有关本地环境的所有信息都打包到一个可序列化的对象中,因此您可以将其保存以备后用或将其发送到另一个设备。在后一种情况下,“重新定位”到同一本地环境中由另一台设备保存的世界地图会为两个设备提供相同的参考系(世界坐标系)。

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

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

    Apple 的 basic multiuser AR demo 显示编码 ARAnchor 并将其发送给同行,以便一个用户可以点击放置 3D 世界上的模型,所有其他人都可以看到它。 SwiftShot game example builds a whole networking protocol so that all users get the same gameplay actions (like firing slingshots at each other) and synchronized physics results (like blocks falling down after being struck). Both use Multipeer Connectivity.

(顺便说一句,上面的第二点和第三点是你从 得到“2 到 6”数字的地方——ARKit 方面没有限制,因为 ARKit 不知道有多少人可能收到了您保存的世界地图。但是,Multipeer Connectivity 有 8 个对等点的限制。您在此基础上构建的任何游戏/应用程序/体验都可能在您添加更多对等点时出现延迟/性能扩展问题,但是取决于你的技术和设计。)

下面的原始答案是为了历史兴趣...


这似乎是 iOS 开发者社区中的一个活跃研究领域 — 上周我在 WWDC 上遇到了几个试图解决这个问题的团队,但还没有人开始破解它。所以我不确定是否存在“最佳方法”,即使是可行的方法。

特征点是相对于会话定位的,不是单独识别的,所以我想在多个用户之间关联它们会很棘手。

会话对齐模式 gravityAndHeading 可能会有所帮助:它将所有 方向 固定为(presumed/estimated 是)绝对参考框架,但是 positions 仍然相对于会话开始时设备所在的位置。如果你能找到一种方法将那个位置与绝对的东西联系起来——一个 lat/long,或者一个 iBeacon 可能——并且可靠地做到这一点,足够精确......好吧,那么你不仅有一个参考框架可以由多个用户共享,您还拥有基于位置的 AR 的主要成分。 (你知道,就像一个浮动的虚拟箭头,上面写着 就在那里 去机场的 A113 号登机口,或其他什么。)

我听说过的另一个途径是图像分析。如果你可以放置一些真实的标记——机器容易识别的东西,比如 QR 码——针对多个用户,你可以使用某种形式的对象识别或跟踪(也许是 ML 模型?)来精确识别标记的位置和方向相对于每个用户,并从那里返回计算共享参考系。不知道这有多可行。 (但是如果你走那条路线,或者类似的路线,请注意每个捕获的相机帧 ARKit exposes a pixel buffer。)

祝你好运!

不是万无一失的答案更像是解决方法,但也许您会发现这些有用。 所有人都假设玩家在同一个地方。

  1. DIY ARKit 会在 AR 会话开始后快速设置它的世界坐标系。因此,如果您可以让所有玩家一个接一个地将他们的设备放置并对齐到相同的物理位置,让他们在那里开始会话,就可以了。想象一下 L 方形尺子的内边缘固定在任何可用的地方。或任何带孔的平面:按住 phone 再次用相机从孔中观察表面,(重新)初始化会话。

  2. Medium 手动保存播放器对齐 phone,而不是像@Rickster 描述的那样通过图像分析检测真实世界的标记。

  3. 参与 训练 Core ML 模型以识别 iPhone 和 iPad 及其相机位置。就像用人脸和眼睛做的一样。在服务器上聚合数据,然后关闭 ML 以节省电量。注意:确保您的模型是防盖的。 :)

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

这是一个非常困难的问题 - 最著名的初创公司是 6D.ai

"Multiplayer AR" 和persistent SLAM 是一样的问题,你需要把自己定位在一张你可能不是自己建的地图上。是大多数自动驾驶车企都在积极解决的问题。

Now, after releasing ARKit 2.0 at WWDC 2018, it's possible to make games for 2....6 users.

为此,您需要使用 ARWorldMap class。通过保存 world maps 并使用它们启动新会话,您的 iOS 应用程序现在可以添加新的增强现实功能:多用户和持久 AR 体验。

AR 多用户体验。现在,您可以通过将存档的 ARWorldMap 对象发送到附近的 iPhone 或 iPad 来创建共享参考框架。通过多个设备同时跟踪相同的 world map,您可以构建一种所有用户(最多 6 个)可以共享和查看相同虚拟 3D 内容的体验(使用 Pixar 的 USDZ 3D 文件格式 Xcode 10+ 和 iOS 12+).

session.getCurrentWorldMap { worldMap, error in 
    guard let worldMap = worldMap else {
        showAlert(error)
        return
    }
}

let configuration = ARWorldTrackingConfiguration()
configuration.initialWorldMap = worldMap
session.run(configuration)

AR 持久体验。如果您保存 world map 然后您的 iOS 应用程序变为非活动状态,您可以在下次启动应用程序时在相同的物理环境中轻松恢复它。您可以使用恢复的 world map 中的 ARAnchors 将相同的虚拟 3D 内容(采用 USDZ 或 DAE 格式)放置在与之前保存的会话相同的位置。