Przewodnik dla programistów Cloud Anchors dla iOS

Pakiet ARCore SDK na iOS współpracuje z ARKit, aby udostępniać funkcje kotwicy w chmurze, które umożliwiają udostępnianie kotwic między urządzeniami z iOS i Androidem w tym samym środowisku.

Dowiedz się, jak używać interfejsu ARCore Cloud Anchor API lub usługi ARCore Cloud Anchor w własnych aplikacjach.

Wymagania wstępne

  • Xcode w wersji 13.0 lub nowszej
  • Cocoapods w wersji 1.4.0 lub nowszej (jeśli używasz Cocoapods).
  • Urządzenie Apple z ARKit w wersji 12.0 lub nowszej (wymagany jest cel wdrożenia w wersji iOS 12.0 lub nowszej)

Jeśli dopiero zaczynasz korzystać z Cloud Anchors:

Włączanie Cloud Anchors w aplikacji

Aby korzystać z interfejsu Cloud Anchors, musisz utworzyć GARSessionConfiguration i ustawić dla niego właściwość cloudAnchorMode zgodnie z opisem w artykule Konfigurowanie sesji ARCore w iOS. Użyj aplikacji setConfiguration:error: (GARSession), aby skonfigurować ustawienia.

Musisz też włączyć w swojej programie interfejs ARCore API.

Hostowanie i rozwiązywanie zakotwiczeń

Możesz hostować i rozwiązywać uchwyty w chmurze za pomocą interfejsu ARCore Cloud Anchor API. Interfejs API zawiera metody wywołania zwrotnego dla zakończonych operacji oraz obiekty Future, które można sprawdzać.

Host an anchor

Hostowanie ARAnchor umieszcza kotwicę w wspólnym układzie współrzędnych w dowolnej przestrzeni fizycznej.

Żądanie hosta wysyła dane wizualne na serwer Google, który mapuje pozycję ARAnchor w układzie współrzędnych reprezentującym bieżącą przestrzeń fizyczną. Pomyślna prośba o hostowanie zwraca nowy identyfikator Cloud Anchor, który można udostępnić i użyć do rozwiązania zakotwiczenia w przyszłości.

- (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];
}

Rozwiązywanie problemu z kotwicą

Rozwiązanie problemu ARAnchor umożliwia urządzeniom z Androidem i iOS w danej przestrzeni fizycznej dodawanie wcześniej hostowanych kotwic do nowych scen.

Żądanie rozwiązania wysyła do serwera Google identyfikator uchwytu w chmurze wraz z danymi wizualnymi z bieżącego klatki. Serwer spróbuje dopasować te dane wizualne do obrazów, w których zmapowane są obecnie hostowane punkty Cloud Anchors. Gdy adres zostanie rozwiązany, nowy kotwnik zostanie dodany do sesji i zwrócony.

- (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;
    }
  }
}

Opcjonalny GARSession wzór próbkowania

Jeśli używasz Metalu lub potrzebujesz opcji pollingu, a Twoja aplikacja działa z minimalną częstotliwością 30 FPS, użyj tego wzoru, aby przekazać ARFrame do GARSession:

-(void)myOwnPersonalUpdateMethod {
  ARFrame *arFrame = arSession.currentFrame;
  NSError *error = nil;
  GARFrame *garFrame = [garSession update:arFrame error:&error];
  // your update code here
}

Limity interfejsu API

Interfejs ARCore API ma te limity przepustowości żądań:

Typ limitu Maksimum Czas trwania Dotyczy:
Liczba kotwic Bez ograniczeń Nie dotyczy Projekt
Prośby o zakotwiczenie hosta 30 minuta Adres IP i projekt
Anuluj resolve 300 minuta Adres IP i projekt

Znane problemy i obejścia

Podczas pracy z pakietem ARCore SDK na iOS występuje kilka znanych problemów.

Domyślne ustawienia schematu powodują sporadyczne zamykanie się aplikacji

Ustawienia schematu GPU Frame Capture i Metal API Validation są domyślnie włączone, co może czasami powodować awarię aplikacji w pakiecie SDK.

Diagnostyka awarii aplikacji

Jeśli podejrzewasz, że doszło do awarii, sprawdź ślad stosu. Jeśli w wyświetleniu stosu widzisz MTLDebugComputeCommandEncoder, prawdopodobnie jest to spowodowane ustawieniami domyślnymi schematu.

Obejście

  1. Jedź do: Product > Scheme > Edit Scheme….

  2. Otwórz kartę Run.

  3. Kliknij Options, aby wyświetlić bieżące ustawienia.

  4. Upewnij się, że funkcje GPU Frame CaptureMetal API Validation są wyłączone.

  5. Kompilowanie i uruchamianie aplikacji.

Aby dowiedzieć się więcej o znanych problemach, zapoznaj się z informacjami na stronie Cocoapods CHANGELOG.

Ograniczenia

Pakiet ARCore SDK na iOS nie obsługuje wywołania metody ARKit setWorldOrigin(relativeTransform:).

Możliwe spowolnienie działania witryny

Włączenie interfejsu ARCore API zwiększa wykorzystanie pamięci. Zużycie baterii urządzenia wzrośnie z powodu większego wykorzystania sieci i procesora.

Dalsze kroki