Руководство разработчика Cloud Anchors для iOS

ARCore SDK для iOS взаимодействует с ARKit, предоставляя возможности облачной привязки, позволяя вам использовать привязки между устройствами iOS и Android в одной среде.

Узнайте, как использовать API ARCore Cloud Anchor или службу ARCore Cloud Anchor в своих приложениях.

Предварительные условия

  • Xcode версии 13.0 или новее
  • Cocoapods 1.4.0 или новее, если вы используете Cocoapods
  • ARKit-совместимое устройство Apple под управлением iOS 12.0 или более поздней версии (требуется цель развертывания iOS 12.0 или более поздней версии)

Если вы новичок в Cloud Anchors:

Включите облачные привязки в своем приложении

Чтобы использовать API Cloud Anchors , необходимо создать GARSessionConfiguration и установить для него свойство cloudAnchorMode , как описано в разделе Настройка сеанса ARCore в iOS . Используйте setConfiguration:error: (GARSession) , чтобы установить конфигурацию.

Вы также должны включить API ARCore для своего приложения.

Размещение и разрешение якорей

Вы можете размещать и разрешать облачные привязки с помощью API ARCore Cloud Anchor. API включает методы обратного вызова для завершенных операций, а также объекты Future, которые можно опросить.

Разместите якорь

Размещение ARAnchor помещает якорь в общую систему координат для любого данного физического пространства.

Запрос хоста отправляет визуальные данные на сервер Google, который отображает положение ARAnchor в системе координат, которая представляет текущее физическое пространство. Успешный запрос хоста возвращает новый идентификатор облачной привязки, которым можно поделиться и использовать для последующего разрешения привязки.

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

Разрешить якорь

Разрешение ARAnchor позволяет устройствам Android и iOS в данном физическом пространстве добавлять ранее размещенные привязки к новым сценам.

Запрос на разрешение отправляет серверу Google идентификатор облачной привязки вместе с визуальными данными из текущего кадра. Сервер попытается сопоставить эти визуальные данные с изображением того, где в данный момент размещены облачные привязки. При успешном разрешении к сеансу добавляется и возвращается новая привязка.

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

Дополнительный шаблон опроса GARSession

Если вы используете Metal или вам нужна опция опроса, и ваше приложение работает со скоростью не менее 30 кадров в секунду, используйте следующий шаблон для передачи ARFrame в GARSession :

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

API-квоты

API ARCore имеет следующие квоты на пропускную способность запросов:

Тип квоты Максимум Продолжительность Относится к
Количество анкеров Безлимитный Н/Д Проект
Привязка запросов хоста 30 минута IP-адрес и проект
Привязка запросов на разрешение 300 минута IP-адрес и проект

Известные проблемы и обходные пути

Есть несколько известных проблем при работе с ARCore SDK для iOS.

Настройки схемы по умолчанию вызывают периодический сбой приложения

Настройки схемы захвата кадров графического процессора и проверки Metal API включены по умолчанию, что иногда может привести к сбою приложения в SDK.

Диагностика сбоя приложения

Всякий раз, когда вы подозреваете, что произошел сбой, взгляните на трассировку стека. Если вы видите MTLDebugComputeCommandEncoder в трассировке стека, скорее всего, это связано с настройками схемы по умолчанию.

Обходной путь

  1. Откройте Product > Scheme > Edit Scheme… .

  2. Откройте вкладку Run .

  3. Нажмите Options , чтобы просмотреть текущие настройки.

  4. Убедитесь, что GPU Frame Capture и Metal API Validation отключены.

  5. Создайте и запустите свое приложение.

Дополнительные известные проблемы см. в CHANGELOG Cocoapods.

Ограничения

ARCore SDK для iOS не поддерживает вызов метода ARKit setWorldOrigin(relativeTransform:) .

Вопросы производительности

Использование памяти увеличивается при включении API ARCore. Ожидайте, что расход заряда батареи устройства увеличится из-за более высокой загрузки сети и процессора.

Следующие шаги