Przewodnik dla programistów Cloud Anchors dla iOS

Pakiet ARCore SDK na iOS ma interfejs ARKit, który zapewnia funkcje kotwicy w chmurze, umożliwiając 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 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.
  • zgodne z ARKit urządzenie Apple z systemem iOS 12.0 lub nowszym (wymagane jest wdrożenie w systemie iOS 12.0 lub nowszym).

Jeśli dopiero zaczynasz korzystać z usług zakotwiczonych w chmurze:

Włącz w aplikacji kotwice z chmury

Aby użyć interfejsu API Cloud Anchors, musisz utworzyć GARSessionConfiguration i ustawić dla niego właściwość cloudAnchorMode zgodnie z opisem w artykule Konfigurowanie sesji ARCore w iOS. Aby ustawić konfigurację, użyj setConfiguration:error: (GARSession).

Musisz też włączyć ARCore API dla swojej aplikacji.

Hostowanie i rozstrzyganie kotwic

Możesz hostować i rozpoznawać kotwice w chmurze za pomocą interfejsu ARCore Cloud Anchor API. Interfejs API udostępnia metody wywołań zwrotnych zakończonych operacji oraz obiekty przyszłe, które mogą być odpytywane.

Hostowanie kotwicy

Hostowanie obiektu ARAnchor umieszcza kotwicę we wspólnym układzie współrzędnych w każdej przestrzeni fizycznej.

Żądanie hosta wysyła do serwera Google dane wizualne, które mapują położenie obiektu ARAnchor w układzie współrzędnych reprezentującym aktualną przestrzeń fizyczną. Pomyślne żądanie hosta zwraca nowy identyfikator kotwicy Cloud, który można udostępnić i wykorzystać do późniejszego rozpoznania kotwicy.

- (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ą

Zastosowanie zasady ARAnchor umożliwia urządzeniom z Androidem i iOS znajdującym się w danym miejscu dodawać do nowych scen wcześniej hostowane kotwice.

W odpowiedzi na żądanie rozwiązania serwer Google wysyła do serwera Google identyfikator kotwicy w chmurze wraz z danymi wizualnymi z bieżącej ramki. Serwer spróbuje dopasować te dane wizualne do zdjęć miejsc, w których mapowane są aktualnie hostowane kotwice w chmurze. Jeśli uda się rozwiązać problem, nowa kotwica jest dodawana do sesji i zwracana.

- (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 Metal lub potrzebujesz opcji odpytywania oraz Twoja aplikacja działa z szybkością co najmniej 30 kl./s, użyj tego wzorca do przekazywania 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

W interfejsie ARCore API obowiązują następujące limity przepustowości żądań:

Typ limitu Maksimum Czas działania Dotyczy:
Liczba kotwic Bez limitu Nie dotyczy Projektach
Żądania kotwicy hosta 30 minuta Adres IP i projekt
resolve żądań zakotwiczonych 300 minuta Adres IP i projekt

Znane problemy i sposoby obejścia

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

Domyślne ustawienia schematu powodują sporadyczne awarie 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.

Diagnozowanie awarii aplikacji

Jeśli podejrzewasz, że wystąpiła awaria, sprawdź zrzut stosu. Jeśli w zrzucie stosu widzisz MTLDebugComputeCommandEncoder, prawdopodobnie jest to spowodowane domyślnymi ustawieniami schematu.

Obejście

  1. Otwórz: 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. Stwórz i uruchom aplikację.

Więcej znanych problemów znajdziesz 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

Wykorzystanie pamięci wzrasta po włączeniu interfejsu ARCore API. Spodziewaj się, że wykorzystanie baterii urządzenia wzrośnie ze względu na większe wykorzystanie sieci i procesora.

Dalsze kroki