Przewodnik dla programistów Cloud Anchors dla iOS

Interfejsy ARCore SDK na iOS z ARKit do obsługi usługi Cloud Anchor umożliwia udostępnianie zakotwiczonych elementów między urządzeniami z iOS i Androidem w tym samym środowisku.

Dowiedz się, jak używać ARCore Cloud Anchor API lub ARCore Cloud Anchor we 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 zgodne z ARKit z systemem iOS 12.0 lub nowszym (wymagany jest system operacyjny iOS 12.0 lub nowszy)
.

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 setConfiguration:error: (GARSession) aby ustawić konfigurację.

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

Hostowanie i rozwiązywanie reklam zakotwiczonych

Możesz hostować i rozwiązywać kotwice w chmurze za pomocą interfejsu ARCore Cloud Anchor API. Interfejs API obejmuje metody wywołań zwrotnych dla zakończonych operacji oraz obiekty przyszłe które mogą być ankietowane.

Hostowanie kotwicy

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

Żądanie hosta wysyła dane wizualne do serwera Google, który mapuje interfejs ARAnchor położenie w układzie współrzędnych, który reprezentuje 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 kotwicy

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 Anchor. 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 wzorzec odpytywania GARSession

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 następujące 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 prośby o rozwiązanie 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.

Ustawienia schematu domyślnego powodują sporadyczną awarię aplikacji

Ustawienia schematu GPU Frame Capture i Metal weryfikacji API są włączone przez co może czasami powodować awarię aplikacji z poziomu pakietu SDK.

Diagnozowanie 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 Capture i Metal API Validation są wyłączone.

  5. Utworzyć i uruchomić aplikację.

Dodatkowe znane problemy znajdziesz w artykule CHANGELOG Cocoapods.

Ograniczenia

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

Możliwe spowolnienie działania witryny

Wykorzystanie pamięci zwiększy się po włączeniu interfejsu ARCore API. Oczekuj wykorzystanie baterii przez urządzenie wzrośnie z powodu większego wykorzystania sieci i CPU.

Dalsze kroki