Guide du développeur Cloud Anchors pour iOS

Le SDK ARCore pour iOS interagit avec ARKit pour fournir des fonctionnalités Cloud Anchor, ce qui vous permet de partager des ancres entre des appareils iOS et Android du même environnement.

Découvrez comment utiliser l'API ARCore Cloud Anchor, ou le service ARCore Cloud Anchor, dans vos propres applications.

Prérequis

  • Xcode version 13.0 ou ultérieure
  • CocoaPods 1.4.0 ou version ultérieure si vous utilisez CocoaPods
  • Un appareil Apple compatible ARKit fonctionnant sous iOS 12.0 ou version ultérieure (cible de déploiement requise pour iOS 12.0 ou version ultérieure)

Si vous débutez avec Cloud Anchors:

Activer Cloud Anchors dans votre application

Pour utiliser l'API Cloud Anchors, vous devez créer une GARSessionConfiguration et définir la propriété cloudAnchorMode correspondante, comme décrit dans la section Configurer une session ARCore dans iOS. Utilisez setConfiguration:error: (GARSession) pour définir la configuration.

Vous devez également activer l'API ARCore pour votre application.

Héberger et résoudre les ancres

Vous pouvez héberger et résoudre des ancres cloud avec l'API ARCore Cloud Anchor. L'API inclut des méthodes de rappel pour les opérations terminées, ainsi que des objets "Future" pouvant être interrogés.

Héberger une ancre

L'hébergement d'un ARAnchor place l'ancre dans un système de coordonnées commun pour tout espace physique donné.

Une requête hôte envoie des données visuelles à un serveur Google, qui mappe la position du ARAnchor dans un système de coordonnées qui représente l'espace physique actuel. Une requête d'hôte réussie renvoie un nouvel ID d'ancre cloud, qui peut être partagé et utilisé pour résoudre l'ancre ultérieurement.

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

Résoudre une ancre

La résolution d'une ARAnchor permet aux appareils Android et iOS d'un espace physique donné d'ajouter des ancres précédemment hébergées à de nouvelles scènes.

Une requête de résolution envoie à un serveur Google un ID d'ancre cloud ainsi que des données visuelles du frame actuel. Le serveur tente de faire correspondre ces données visuelles avec les images de l'emplacement où les ancres cloud actuellement hébergées sont mappées. Lorsque la résolution aboutit, une nouvelle ancre est ajoutée à la session et renvoyée.

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

Modèle de sondage GARSession facultatif

Si vous utilisez Metal ou si vous avez besoin d'une option d'interrogation et que votre application s'exécute à une fréquence minimale de 30 FPS, utilisez le schéma suivant pour transmettre des ARFrame à GARSession:

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

Quotas d'API

L'API ARCore dispose des quotas suivants pour la bande passante des requêtes:

Type de quota Maximum Durée Applicable à
Nombre d'ancres Illimité N/A Projet
Ancrer les requêtes host 30 minute Adresse IP et projet
Ancrer les requêtes resolve 300 minute Adresse IP et projet

Problèmes connus et solutions temporaires

Il existe quelques problèmes connus lorsque vous travaillez avec le SDK ARCore pour iOS.

Les paramètres du schéma par défaut provoquent un plantage intermittent de l'application

Les paramètres du schéma de capture d'image du GPU et de validation de l'API Metal sont activés par défaut, ce qui peut parfois entraîner le plantage de l'application dans le SDK.

Diagnostiquer un plantage d'application

Chaque fois que vous pensez qu'un plantage s'est produit, examinez votre trace de la pile. Si MTLDebugComputeCommandEncoder apparaît dans la trace de la pile, cela est probablement dû aux paramètres de schéma par défaut.

Solution

  1. Accédez à Product > Scheme > Edit Scheme….

  2. Ouvrez l'onglet Run.

  3. Cliquez sur Options pour afficher vos paramètres actuels.

  4. Assurez-vous que GPU Frame Capture et Metal API Validation sont désactivés.

  5. Créez et exécutez votre application.

Consultez la CHANGELOG de CocoaPods pour en savoir plus sur les autres problèmes connus.

Limites

Le SDK ARCore pour iOS n'est pas compatible avec l'appel de méthode ARKit setWorldOrigin(relativeTransform:).

Considérations sur les performances

L'utilisation de la mémoire augmente lorsque vous activez l'API ARCore. Attendez-vous à ce que l'utilisation de la batterie de l'appareil augmente en raison de l'utilisation accrue du réseau et du processeur.

Étapes suivantes