ARCore SDK for iOS 与 ARKit 交互以提供云锚点 功能,让您可以在 iOS 和 Android 设备之间共享锚点, 相同的环境
了解如何在您自己的应用中使用 ARCore Cloud Anchor API 或 ARCore 云锚点服务。
前提条件
- Xcode 版本 13.0 或更高版本
- Cocoapods 1.4.0 或更高版本(如果使用 Cocoapods)
- 运行 iOS 12.0 或更高版本且与 ARKit 兼容的 Apple 设备 (需要 iOS 12.0 或更高版本的部署目标)
如果您刚开始接触云锚点:
确保您了解用于托管和解析 Cloud SQL 的 Anchor 的定位点。
仔细阅读快速入门,了解系统要求。 设置和安装说明。
查看其中一个云锚点示例
在您的应用中启用云锚点
要使用 Cloud Anchors API,您必须创建一个
GARSessionConfiguration
并为其设置 cloudAnchorMode
属性,如
在 iOS 中配置 ARCore 会话。使用
setConfiguration:error: (GARSession)
来设置配置。
您还必须启用 ARCore API 。
托管和解析锚点
您可以使用 ARCore Cloud Anchor API 托管和解析云锚点。API 包括已完成操作的回调方法,以及 Future 对象 可轮询
托管锚点
托管 ARAnchor
可将锚点置于任何给定坐标系的通用坐标系中。
物理空间
托管请求会将可视化数据发送到 Google 服务器,该服务器会映射 ARAnchor
的
坐标系中表示当前物理空间的位置。答
成功的托管请求将返回一个新的云锚点 ID,该 ID 可以在共享和
用于稍后解析锚点
- (void)addAnchorWithTransform:(matrix_float4x4)transform {
self.arAnchor = [[ARAnchor alloc] initWithTransform:transform];
[self.sceneView.session addAnchor:self.arAnchor];
__weak ExampleViewController *weakSelf = self;
self.hostFuture = [self.cloudAnchorManager
hostCloudAnchor:self.arAnchor
completion:^(NSString *anchorId, GARCloudAnchorState cloudState) {
[weakSelf handleHostAnchor:anchorId cloudState:cloudState];
}
error:nil];
[self enterState:HelloARStateHosting];
}
解析锚点
解析 ARAnchor
以允许给定物理空间中的 Android 和 iOS 设备
将之前托管的锚点添加到新场景。
解析请求会向 Google 服务器发送云锚点 ID 以及视觉数据 从当前帧开始。服务器将尝试匹配这些可视化数据 显示当前托管的云锚点映射位置的图像。时间 解析成功,则系统会将新锚点添加到会话中并返回。
- (void)resolveAnchorWithIdentifier:(NSString *)identifier {
GARResolveCloudAnchorFuture *garFuture =
[self.gSession resolveCloudAnchorWithIdentifier:identifier
completionHandler:completion
error:&error];
}
// Pass the ARFRame to the ARCore session every time there is a frame update.
// This returns a GARFrame that contains a list of updated anchors. If your
// anchor's pose or tracking state changed, your anchor will be in the list.
- (void)cloudAnchorManager:(CloudAnchorManager *)manager didUpdateFrame:(GARFrame *)garFrame {
for (GARAnchor *garAnchor in garFrame.updatedAnchors) {
if ([garAnchor isEqual:self.garAnchor] && self.resolvedAnchorNode) {
self.resolvedAnchorNode.simdTransform = garAnchor.transform;
self.resolvedAnchorNode.hidden = !garAnchor.hasValidTransform;
}
}
}
可选的 GARSession
轮询模式
如果您使用的是 Metal,或者需要轮询选项,并且您的应用在
最低为 30 fps,请使用以下模式将 ARFrame
传递给
GARSession
:
-(void)myOwnPersonalUpdateMethod {
ARFrame *arFrame = arSession.currentFrame;
NSError *error = nil;
GARFrame *garFrame = [garSession update:arFrame error:&error];
// your update code here
}
API 配额
ARCore API 以下请求带宽配额:
配额类型 | 最大值 | 时长 | 适用对象 |
---|---|---|---|
锚点数量 | 无限制 | 不适用 | 项目 |
锚定 host 请求 | 30 | 分钟 | IP 地址和项目 |
锚定 resolve 请求 | 300 | 分钟 | IP 地址和项目 |
已知问题与解决方法
在使用 ARCore SDK for iOS 时,有几个已知问题。
默认 scheme 设置导致应用间歇性崩溃
GPU Frame Capture 和 Metal API Validation scheme 设置由 这有时会导致应用在 SDK 中崩溃。
诊断应用崩溃问题
每当您怀疑发生了崩溃时,请查看您的堆栈轨迹。
如果您在堆栈轨迹中看到 MTLDebugComputeCommandEncoder
,则可能是
默认架构设置
临时解决方法
前往Product > Scheme > Edit Scheme…。
打开 Run 标签页。
点击 Options 即可查看您的当前设置。
确保已停用 GPU Frame Capture 和 Metal API Validation。
构建并运行您的应用。
如需了解其他已知问题,请参阅 Cocoapods CHANGELOG
。
限制
ARCore SDK for iOS 不支持 ARKit setWorldOrigin(relativeTransform:)
方法调用。
性能考虑因素
启用 ARCore API 后,内存用量会增加。届时, 设备的电池用量将因网络用量和 CPU 利用率增加而增加。