Pakiet ARCore SDK na iOS ma interfejs ARKit, który zapewnia funkcje kotwicy w chmurze, umożliwiając udostępnianie kotwic między urządzeniami z iOS i Androidem w tym samym środowisku.
Dowiedz się, jak używać interfejsu ARCore Cloud Anchor API lub ARCore Cloud Anchor we własnych aplikacjach.
Wymagania wstępne
- Xcode w wersji 13.0 lub nowszej.
- Cocoapods w wersji 1.4.0 lub nowszej, jeśli używasz Cocoapods.
- zgodne z ARKit urządzenie Apple z systemem iOS 12.0 lub nowszym (wymagane jest wdrożenie w systemie iOS 12.0 lub nowszym).
Jeśli dopiero zaczynasz korzystać z usług zakotwiczonych w chmurze:
Upewnij się, że znasz proces używany do hostowania i rozwiązywania problemów z kotwicą w Cloud.
W quickstart znajdziesz informacje o wymaganiach systemowych, konfiguracji i instrukcjach instalacji.
Zapoznaj się z jednym z przykładów usługi zakotwiczonej w chmurze.
Włącz w aplikacji kotwice z chmury
Aby użyć interfejsu API Cloud Anchors, musisz utworzyć GARSessionConfiguration
i ustawić dla niego właściwość cloudAnchorMode
zgodnie z opisem w artykule Konfigurowanie sesji ARCore w iOS. Aby ustawić konfigurację, użyj setConfiguration:error: (GARSession)
.
Musisz też włączyć ARCore API dla swojej aplikacji.
Hostowanie i rozstrzyganie kotwic
Możesz hostować i rozpoznawać kotwice w chmurze za pomocą interfejsu ARCore Cloud Anchor API. Interfejs API udostępnia metody wywołań zwrotnych zakończonych operacji oraz obiekty przyszłe, które mogą być odpytywane.
Hostowanie kotwicy
Hostowanie obiektu ARAnchor
umieszcza kotwicę we wspólnym układzie współrzędnych w każdej przestrzeni fizycznej.
Żądanie hosta wysyła do serwera Google dane wizualne, które mapują położenie obiektu ARAnchor
w układzie współrzędnych reprezentującym aktualną przestrzeń fizyczną. Pomyślne żądanie hosta zwraca nowy identyfikator kotwicy Cloud, który można udostępnić i wykorzystać do późniejszego rozpoznania kotwicy.
- (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];
}
Rozwiązywanie problemu z kotwicą
Zastosowanie zasady ARAnchor
umożliwia urządzeniom z Androidem i iOS znajdującym się w danym miejscu dodawać do nowych scen wcześniej hostowane kotwice.
W odpowiedzi na żądanie rozwiązania serwer Google wysyła do serwera Google identyfikator kotwicy w chmurze wraz z danymi wizualnymi z bieżącej ramki. Serwer spróbuje dopasować te dane wizualne do zdjęć miejsc, w których mapowane są aktualnie hostowane kotwice w chmurze. Jeśli uda się rozwiązać problem, nowa kotwica jest dodawana do sesji i zwracana.
- (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;
}
}
}
Opcjonalny wzorzec odpytywania GARSession
Jeśli używasz Metal lub potrzebujesz opcji odpytywania oraz Twoja aplikacja działa z szybkością co najmniej 30 kl./s, użyj tego wzorca do przekazywania ARFrame
do GARSession
:
-(void)myOwnPersonalUpdateMethod {
ARFrame *arFrame = arSession.currentFrame;
NSError *error = nil;
GARFrame *garFrame = [garSession update:arFrame error:&error];
// your update code here
}
Limity interfejsu API
W interfejsie ARCore API obowiązują następujące limity przepustowości żądań:
Typ limitu | Maksimum | Czas działania | Dotyczy: |
---|---|---|---|
Liczba kotwic | Bez limitu | Nie dotyczy | Projektach |
Żądania kotwicy hosta | 30 | minuta | Adres IP i projekt |
resolve żądań zakotwiczonych | 300 | minuta | Adres IP i projekt |
Znane problemy i sposoby obejścia
Podczas pracy z pakietem ARCore SDK na iOS występuje kilka znanych problemów.
Domyślne ustawienia schematu powodują sporadyczne awarie aplikacji
Ustawienia schematu GPU Frame Capture i Metal API Validation są domyślnie włączone, co może czasami powodować awarię aplikacji w pakiecie SDK.
Diagnozowanie awarii aplikacji
Jeśli podejrzewasz, że wystąpiła awaria, sprawdź zrzut stosu.
Jeśli w zrzucie stosu widzisz MTLDebugComputeCommandEncoder
, prawdopodobnie jest to spowodowane domyślnymi ustawieniami schematu.
Obejście
Otwórz: Product > Scheme > Edit Scheme….
Otwórz kartę Run.
Kliknij Options, aby wyświetlić bieżące ustawienia.
Upewnij się, że funkcje GPU Frame Capture i Metal API Validation są wyłączone.
Stwórz i uruchom aplikację.
Więcej znanych problemów znajdziesz na stronie Cocoapods CHANGELOG
.
Ograniczenia
Pakiet ARCore SDK na iOS nie obsługuje wywołania metody ARKit setWorldOrigin(relativeTransform:)
.
Możliwe spowolnienie działania witryny
Wykorzystanie pamięci wzrasta po włączeniu interfejsu ARCore API. Spodziewaj się, że wykorzystanie baterii urządzenia wzrośnie ze względu na większe wykorzystanie sieci i procesora.