iOS için Cloud Anchor geliştirici kılavuzu

iOS için ARCore SDK'sı, Cloud Anchor özelliklerini sunmak için ARKit ile arayüz oluşturur. Böylece, aynı ortamdaki iOS ve Android cihazlar arasında ankrajları paylaşabilirsiniz.

ARCore Cloud Anchor API veya ARCore Cloud Anchor hizmetini kendi uygulamalarınızda nasıl kullanacağınızı öğrenin.

Ön koşullar

  • Xcode 13.0 veya sonraki sürümler
  • CocoaPods kullanıyorsanız CocoaPods 1.4.0 veya sonraki sürümler
  • iOS 12.0 veya sonraki sürümleri çalıştıran ARKit uyumlu bir Apple cihaz (iOS 12.0 veya sonraki sürümlerin dağıtım hedefi gereklidir)

Cloud Anchor'ları kullanmaya yeni başladıysanız:

Uygulamanızda Cloud Anchors'ı etkinleştirme

Cloud Anchors API'yi kullanmak için GARSessionConfiguration oluşturmanız ve iOS'te ARCore oturumu yapılandırma bölümünde açıklandığı gibi cloudAnchorMode mülkünü ayarlamanız gerekir. Tekliflerinizi otomatikleştirmek ve optimize etmek için setConfiguration:error: (GARSession) tıklayın.

ARCore API'yi de etkinleştirmeniz gerekir seçin.

Bağlayıcıları barındırma ve çözme

ARCore Cloud Anchor API ile bulut çapalarını barındırabilir ve çözebilirsiniz. API hem tamamlanan işlemler için geri çağırma yöntemlerini hem de Gelecekteki nesneleri içerir anket yapabilirsiniz.

Bağlayıcı barındırma

ARAnchor barındırmak, ankrajı belirli bir fiziksel alan için ortak bir koordinat sistemine yerleştirir.

Bir ana makine isteği, görsel verileri bir Google sunucusuna gönderir ve bu veri, ARAnchor koordinat sisteminde mevcut fiziksel alanı temsil eden konumdur. Başarılı bir barındırma isteği, paylaşılabilen ve daha sonra ankörü çözmek için kullanılabilen yeni bir Cloud Anchor kimliği döndürür.

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

Sabitleme noktasını çözümleme

ARAnchor çözüldüğünde, belirli bir fiziksel alandaki Android ve iOS cihazlar daha önce barındırılan ankrajları yeni sahnelere ekleyebilir.

Çözüm isteği, mevcut çerçevedeki görsel verilerle birlikte bir Google sunucusuna bulut ankraj kimliği gönderir. Sunucu bu görsel verileri eşleştirmeye çalışır şu anda barındırılan Cloud Anchor'ların nerede eşlendiğine dair görüntülerle birlikte. Zaman çözümleme başarılı olursa oturuma yeni bir çapa eklenir ve geri döndürülür.

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

İsteğe bağlı GARSession anket kalıbı

Metal kullanıyorsanız veya bir anket seçeneğine ihtiyacınız varsa ve uygulamanız en az 30 fps hızında çalışıyorsa ARFrame'leri GARSession'a iletmek için aşağıdaki kalıbı kullanın:

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

API kotaları

ARCore API, istek bant genişliği için aşağıdaki kotalara sahiptir:

Kota türü Maksimum Süre Geçerlilik kapsamı:
Sabitleme noktası sayısı Sınırsız Yok Proje
Sabit ana makine istekleri 30 dakika IP adresi ve proje
Sabit çözüm istekleri 300 dakika IP adresi ve proje

Bilinen sorunlar ve geçici çözümler

iOS için ARCore SDK'sı ile çalışırken bilinen birkaç sorun vardır.

Varsayılan şema ayarları, aralıklı uygulama kilitlenmesine neden oluyor

GPU çerçeve yakalama ve Metal API doğrulama şeması ayarları varsayılan olarak etkindir. Bu durum bazen uygulamanın SDK içinde kilitlenmesine neden olabilir.

Uygulama kilitlenmelerini teşhis etme

Bir kilitlenme olduğundan şüphelendiğiniz zaman yığın izlemelere göz atın. Yığın izlemede MTLDebugComputeCommandEncoder görüyorsanız bunun nedeni büyük olasılıkla varsayılan şema ayarlarından kaynaklanmaktadır.

Geçici çözüm

  1. Şuraya git: Product > Scheme > Edit Scheme….

  2. Run sekmesini açın.

  3. Mevcut ayarlarınızı görüntülemek için Options bağlantısını tıklayın.

  4. GPU Frame Capture ve Metal API Validation öğelerinin devre dışı bırakıldığından emin olun.

  5. Uygulamanızı derleyip çalıştırın.

Diğer bilinen sorunlar için Cocoapods CHANGELOG sayfasına bakın.

Sınırlamalar

iOS için ARCore SDK, ARKit setWorldOrigin(relativeTransform:) yöntem çağrısını desteklemiyor.

Performansla ilgili konular

ARCore API'yi etkinleştirdiğinizde bellek kullanımı artar. Beklenen 24 saat daha yüksek ağ kullanımı ve CPU kullanımı nedeniyle cihazın pil kullanımının artmasını sağlayabilir.

Sonraki adımlar