具有多个用户的 ARKit
Posted
技术标签:
【中文标题】具有多个用户的 ARKit【英文标题】:ARKit with multiple users 【发布时间】:2017-11-15 16:41:33 【问题描述】:如果有的话,在多用户/设备上使用 Apple 的新 ARKit 的最佳方式是什么?
似乎每个设备都有自己的场景理解。到目前为止,我最好的猜测是使用原始特征点位置并尝试在设备之间匹配它们以将不同的观点粘合在一起,因为 ARKit 不提供任何绝对参考参考。
===Edit1,我尝试过的东西===
1) 特征点
我已经玩过暴露的原始特征点,现在我确信在它们当前的状态下它们是死胡同:
它们不是原始特征点,它们只显示位置,但没有通常在跟踪特征点中发现的属性 它们的实例化不会从帧转移到帧,位置也不完全相同 当摄像头输入几乎没有变化时,报告的特征点经常发生很大变化,出现或消失的很多。所以总的来说,我认为尝试以某种有意义的方式使用它们是不合理的,无法在一个设备内进行任何类型的好点匹配,更不用说多个设备了。 另一种方法是实现我自己的特征点检测和匹配,但这更像是取代 ARKit 而不是利用它。
2) 二维码
正如@Rickster 建议的那样,我还尝试识别一个易于识别的对象,例如 QR 码,并从该固定点获取相对参考变化(请参阅this question)这有点困难,暗示我使用一些 openCV 来估计相机姿势。但更重要的是非常有限
【问题讨论】:
您是否可以将设备的指南针数据和/或方向数据发送到服务器以允许转换到另一个设备的坐标系? 这是可能的。多人 AR exp 可能无论如何都会涉及一些服务器支持的同步。但这并没有给我两个设备之间的精确翻译差异。如果地图可以单独使用指南针、加速度计和 GPS 完成,就不需要像 Apple 使用的那样复杂的 SLAM 技术。 【参考方案1】:由于添加了一些更新的答案,多用户 AR 是 ARKit 2(也称为 ios 12 上的 ARKit)的主要功能。 The WWDC18 talk on ARKit 2 有一个很好的概述,Apple 有两个开发人员示例代码项目可以帮助您入门:一个 basic example 只是让 2 台以上的设备进入共享体验,SwiftShot,一个真正的为 AR 构建的多人游戏。
要点:
ARWorldMap
将 ARKit 所知道的关于本地环境的所有信息都封装到一个可序列化的对象中,因此您可以将其保存以备后用或发送到另一台设备。在后一种情况下,“重新定位”到同一本地环境中另一个设备保存的世界地图会为两个设备提供相同的参考框架(世界坐标系)。
使用您选择的网络技术在设备之间发送ARWorldMap
:AirDrop、云共享、信鸽等都可以,但 Apple 的Multipeer Connectivity framework 是一种很好、简单且安全选项,所以这是 Apple 在他们的示例项目中使用的。
所有这一切只为您提供了创建共享体验的基础 - 您的应用程序在多个设备上的多个副本都使用与相同真实世界环境对齐的世界坐标系。这就是让多个用户体验相同的静态 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 登机口,或者其他什么。)
我听说过的另一个途径是图像分析。如果你可以放置一些真实的标记——很容易机器识别的东西,比如二维码——考虑到多个用户,你可以使用某种形式的对象识别或跟踪(也许是 ML 模型?)来精确识别标记的位置和方向相对于每个用户,然后从那里返回以计算共享的参考框架。不知道这有多可行。 (但如果您走这条路线或类似路线,请注意 ARKit exposes a pixel buffer 用于每个捕获的相机帧。)
祝你好运!
【讨论】:
gravityAndHeading
是个好电话。我会尝试使用它。我不能依赖 QR 码或信标,但我可能能够识别其他一些图像。我将使用 iOS 11 中的新 ML 功能来研究对象识别。我正在考虑首先查看墙上的东西,因为它们只呈现一张脸,但这可能不是很明确。
特征点过于混乱而不可靠:它们以难以理解的方式添加和删除,并且它们没有比估计的 3D 定位更多的信息,因此它们真的很难匹配跨帧,更不用说跨设备了。作为第一步,我已经开始研究 QR 码方法,但我陷入了数学困境。***.com/questions/44579839/…
gravityAndHeading
实际上是非常错误的。 -z 轴根本不对应北方,可以偏离 150 度(到目前为止在我的测试中)。【参考方案2】:
不是防弹答案更像是解决方法,但也许您会发现这些有用。 都假设玩家在同一个地方。
DIY ARKit 会在 AR 会话开始后快速设置其世界坐标系。因此,如果您可以让所有玩家一个接一个地将他们的设备放置并对齐到相同的物理位置,并让他们在那里开始会话,那么您就可以了。想象一下固定在任何可用位置上的 L 方尺的内边缘。或任何带孔的平面:将手机靠在表面上,用相机通过孔看,(重新)初始化会话。
中手动保存玩家对齐手机,而不是像@Rickster 描述的那样通过图像分析检测现实世界的标记。
参与训练 Core ML 模型以识别 iPhone 和 iPad 及其摄像头位置。就像它是用人脸和眼睛完成的。在服务器上聚合数据,然后关闭 ML 以节省电量。注意:确保您的模型是防盖的。 :)
【讨论】:
【参考方案3】:我正在更新我的游戏控制器框架 (https://github.com/robreuss/VirtualGameController) 以支持共享控制器功能,因此所有设备都将从所有设备屏幕上的控制元素接收输入。此增强功能的目的是支持基于 ARKit 的多人游戏功能。我假设开发人员将使用 diviaki 提到的第一种方法,其中虚拟空间的一般定位是通过从物理空间中的公共点、共享参考开始每个设备上的会话来定义的,特别是我想到的是在桌子的相对两侧。所有设备将同时启动游戏并利用相对于物理尺寸的公共坐标空间,并使用来自所有控制器的输入,理论上游戏将在所有设备上保持同步。还在测试。明显的潜在问题是网络延迟或中断,同步失败,除非重新启动游戏,否则很难恢复。该方法和框架可能适用于某些类型的游戏——例如,简单的街机风格游戏,但肯定不适用于许多其他游戏——例如,任何具有显着随机性且无法跨设备协调的游戏。
【讨论】:
【参考方案4】:这是一个非常困难的问题 - 正在研究它的最著名的初创公司是 6D.ai。
“多人 AR”与持久 SLAM 存在相同的问题,您需要将自己定位在您可能没有自己构建的地图中。这是大多数自动驾驶汽车公司都在积极解决的问题。
【讨论】:
【参考方案5】:现在,在 WWDC 2018 上发布 ARKit 2.0 后,可以为 2 到 6 个用户制作游戏。
为此,您需要使用ARWorldMap
类。通过保存 world maps
并使用它们启动新会话,您的 iOS 应用程序现在可以添加新的增强现实功能:多用户和持久的 AR 体验。
AR 多用户体验。现在,您可以通过将归档的ARWorldMap
对象发送到附近的 iPhone 或 iPad 来创建参考的共享框架。通过多台设备同时跟踪相同的world map
,您可以构建一种体验,让所有用户(最多 6 个)可以共享和查看相同的虚拟 3D 内容(在 Xcode 10 和 iOS 中使用全新的 Pixar 的 USDZ
文件格式进行 3D 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 格式)放置在上一个保存会话的相同位置。
【讨论】:
请注意,您可以将普通场景包内容附加到锚点 - 并将其与地图一起保存/检索(不一定必须是 USDZ)。我们的初创公司有一个 SDK,可以在正确的时间动态加载正确的地图 - jordan@jordancampbell.org 如果有人感兴趣的话。 完全同意))以上是关于具有多个用户的 ARKit的主要内容,如果未能解决你的问题,请参考以下文章
iOS-ARKit创建多用户AR体验-Creating a Multiuser AR Experience
iOS-ARKit创建多用户AR体验-Creating a Multiuser AR Experience