iOS 適用的 Cloud Anchors 開發人員指南

iOS 版 ARCore SDK 會與 ARKit 介面連結,提供 Cloud Anchor 功能,讓您在相同環境中在 iOS 和 Android 裝置之間共用錨點。

瞭解如何在您自己的應用程式中使用 ARCore Cloud Anchor APIARCore Cloud Anchor 服務

必要條件

  • Xcode 13.0 以上版本
  • 如果使用 Cocoapods,請使用 1.4.0 以上版本
  • 搭載 iOS 12.0 以上版本的 ARKit 相容 Apple 裝置 (必須指定 iOS 12.0 以上版本為部署目標)

如果您是 Cloud Anchors 新手:

在應用程式中啟用 Cloud Anchors

如要使用 Cloud Anchors API,您必須建立 GARSessionConfiguration,並為其設定 cloudAnchorMode 屬性,如在 iOS 中設定 ARCore 工作階段所述。使用 setConfiguration:error: (GARSession) 設定設定。

您也必須為應用程式啟用 ARCore API

主機和解析錨點

您可以使用 ARCore Cloud Anchor API 代管及解析雲端錨點。這個 API 包含已完成作業的回呼方法,以及可輪詢的 Future 物件。

主持節目

代管 ARAnchor 會將錨點置於任何指定實體空間的通用座標系統中。

主機要求會將視覺資料傳送至 Google 伺服器,後者會將 ARAnchor 的位置對應至代表目前實體空間的座標系統。成功的代管要求會傳回新的 Cloud Anchor 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 裝置就能將先前代管的錨點新增至新場景。

解析要求會將雲端錨點 ID 和目前影格中的視覺資料傳送至 Google 伺服器。伺服器會嘗試將這項視覺資料與目前代管 Cloud Anchor 的對應圖像比對。解析成功後,系統會在工作階段中新增錨點並傳回。

- (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 針對要求頻寬設有以下配額:

配額類型 上限 持續時間 套用對象
錨點數 無限制 專案
錨點主機要求 30 分鐘 IP 位址和專案
錨定resolve要求 300 分鐘 IP 位址和專案

已知問題和解決方法

使用 iOS 版 ARCore SDK 時,會發生一些已知問題。

預設配置設定導致應用程式不時當機

根據預設,系統會啟用 GPU 影格擷取和 Metal API 驗證配置設定,這可能導致應用程式在 SDK 中當機。

診斷應用程式當機問題

每當您懷疑發生異常終止時,請查看堆疊追蹤。如果在堆疊追蹤中看到 MTLDebugComputeCommandEncoder,可能是因為預設的配置文件設定。

解決方法

  1. 前往Product > Scheme > Edit Scheme…

  2. 開啟 Run 分頁。

  3. 點選 Options 即可查看目前的設定。

  4. 請確認已停用 GPU Frame CaptureMetal API Validation

  5. 建構並執行應用程式。

如需其他已知問題,請參閱 Cocoapods CHANGELOG

限制

iOS 版 ARCore SDK 不支援 ARKit setWorldOrigin(relativeTransform:) 方法呼叫。

效能注意事項

啟用 ARCore API 後,記憶體用量會增加。由於網路用量和 CPU 使用率較高,因此裝置的電池用量也會增加。

後續步驟