Cloud Anchors-Entwicklerleitfaden für iOS

Das ARCore SDK for iOS verbindet sich mit ARKit und ermöglicht so Cloud Anchor. können Sie Anker zwischen iOS- und Android-Geräten im in derselben Umgebung.

Weitere Informationen zur Verwendung der ARCore Cloud Anchor API oder des ARCore Cloud Anchor-Dienstes in Ihren eigenen Apps

Vorbereitung

  • Xcode Version 13.0 oder höher
  • CocoaPods 1.4.0 oder höher bei Verwendung von CocoaPods
  • Ein ARKit-kompatibles Apple-Gerät mit iOS 12.0 oder höher (Bereitstellungsziel für iOS 12.0 oder höher erforderlich)

Wenn Sie Cloud-Anker noch nicht kennen:

Cloud-Markierungen in Ihrer App aktivieren

Wenn Sie die Cloud Anchors API verwenden möchten, müssen Sie einen GARSessionConfiguration und legen Sie die Eigenschaft cloudAnchorMode dafür fest, wie in Konfigurieren Sie eine ARCore-Sitzung unter iOS. Verwenden Sie setConfiguration:error: (GARSession) um die Konfiguration festzulegen.

Sie müssen außerdem die ARCore API für Ihre Anwendung aktivieren.

Anker hosten und auflösen

Mit der ARCore Cloud Anchor API können Sie Cloud-Markierungen hosten und auflösen. Die API umfasst Rückrufmethoden für abgeschlossene Vorgänge sowie Future-Objekte, die abgefragt werden können.

Anker hosten

Beim Hosten eines ARAnchor wird der Anker für ein bestimmtes Koordinatensystem in einem gemeinsamen Koordinatensystem gespeichert. einem physischen Raum.

Eine Hostanfrage sendet visuelle Daten an einen Google-Server, der die Position der ARAnchor in einem Koordinatensystem abbildet, das den aktuellen physischen Raum darstellt. A erfolgreiche Hostanfrage gibt eine neue Cloud Anchor-ID zurück, die freigegeben und zum Auflösen des Ankers.

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

Anker auflösen

Wenn Sie eine ARAnchor auflösen, können Android- und iOS-Geräte in einem bestimmten physischen Raum neuen Szenen zuvor gehostete Anker hinzufügen.

Bei einer Resolve-Anfrage wird eine Cloud-Anchor-ID zusammen mit visuellen Daten an einen Google-Server gesendet. aus dem aktuellen Frame. Der Server versucht, diese visuellen Daten mit den Bildern abzugleichen, an denen derzeit gehostete Cloud-Anchors zugeordnet sind. Wenn die Auflösung erfolgreich war, wird der Sitzung ein neuer Anker hinzugefügt und zurückgegeben.

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

Optionales GARSession-Polling-Muster

Wenn Sie Metal verwenden oder eine Umfrageoption benötigen und Ihre App mit einer mindestens 30 fps erreichen möchten, verwenden Sie das folgende Muster, um ARFrames an die GARSession:

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

API-Kontingente

Bei der ARCore API gelten die folgenden Kontingente für die Anfragebandbreite:

Kontingenttyp Maximum Dauer Gilt für
Anzahl der Anker Unbegrenzt Projekt
host-Anfragen verankern 30 Minute IP-Adresse und Projekt
Anfragen an Anchor bearbeiten 300 Minute IP-Adresse und Projekt

Bekannte Probleme und Problemumgehungen

Bei der Arbeit mit dem ARCore SDK for iOS gibt es einige bekannte Probleme.

Standardschemaeinstellungen führen zu gelegentlichen App-Abstürzen

Die Schemaeinstellungen für GPU Frame Capture und Metal API Validation werden durch Das kann dazu führen, dass die App innerhalb des SDK abstürzt.

App-Absturz diagnostizieren

Wenn Sie vermuten, dass ein Absturz aufgetreten ist, sehen Sie sich den Stack-Trace an. Wenn Sie im Stacktrace MTLDebugComputeCommandEncoder sehen, liegt das wahrscheinlich auf die Einstellungen für Standardschema zurück.

Problemumgehung

  1. Öffnen Sie Product > Scheme > Edit Scheme….

  2. Öffnen Sie den Tab Run.

  3. Klicken Sie auf Options, um Ihre aktuellen Einstellungen aufzurufen.

  4. Achten Sie darauf, dass sowohl GPU Frame Capture als auch Metal API Validation deaktiviert sind.

  5. Erstellen Sie Ihre App und führen Sie sie aus.

Weitere bekannte Probleme finden Sie in der CHANGELOG von CocoaPods.

Beschränkungen

Das ARCore SDK für iOS unterstützt den ARKit-Methodenaufruf setWorldOrigin(relativeTransform:) nicht.

Hinweise zur Leistung

Wenn Sie die ARCore API aktivieren, erhöht sich die Arbeitsspeichernutzung. Aufgrund der höheren Netzwerk- und CPU-Auslastung steigt der Akkuverbrauch des Geräts.

Nächste Schritte