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.

Hier erfahren Sie, wie Sie die ARCore Cloud Anchor API bzw. den ARCore Cloud Anchor-Dienst in Ihren eigenen Apps verwenden.

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 noch nicht mit Cloud Anchors vertraut sind:

Cloud-Anchors in Ihrer Anwendung 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.

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

Anchors hosten und auflösen

Sie können Cloud-Anchors mit der ARCore Cloud Anchor API hosten und auflösen. Die API enthält Callback-Methoden 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.

Bei einer Hostanfrage werden visuelle Daten an einen Google-Server gesendet, der die von der ARAnchor Position in einem Koordinatensystem, das den aktuellen physischen Raum darstellt. A erfolgreiche Hostanfrage gibt eine neue Cloud Anchor-ID zurück, die freigegeben und mit denen der Anker später aufgelöst werden kann.

- (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 du ein ARAnchor auflöst, kannst du Android- und iOS-Geräte in einem bestimmten physischen Bereich nutzen um zuvor gehostete Anker neuen Szenen hinzuzufügen.

Eine Resolve-Anfrage sendet eine Cloud-Anchor-ID zusammen mit visuellen Daten an einen Google-Server. aus dem aktuellen Frame. Der Server versucht, diese visuellen Daten abzugleichen mit dem Bild der aktuell gehosteten Cloud-Anker. Wann? aufgelöst wird, wird ein neuer Anker zur Sitzung 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-Abfragemuster

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

Die ARCore API hat 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
Anker klärt Anfragen 300 Minute IP-Adresse und Projekt

Bekannte Probleme und Behelfslösungen

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

Standardschemaeinstellungen führen zu zeitweiligem Absturz der App

Die Schemaeinstellungen „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 Ihren Stacktrace an. Wenn Sie im Stacktrace MTLDebugComputeCommandEncoder sehen, liegt das wahrscheinlich auf die Einstellungen für das 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 for iOS unterstützt den ARKit-Methodenaufruf setWorldOrigin(relativeTransform:) nicht.

Hinweise zur Leistung

Wenn Sie die ARCore API aktivieren, erhöht sich die Arbeitsspeichernutzung. Freuen Sie sich auf die Akkunutzung des Geräts aufgrund höherer Netzwerk- und CPU-Auslastung steigen.

Nächste Schritte