Laboratorul 03. Cloud Anchors

O ancoră cloud este un tip special de ancoră care permite salvarea și reluarea experiențelor AR. Folosind Cloud Anchors API, putem crea spații interactive pe care să le ancorăm în locații din lumea reală și pe care să le distribuim și altor persoane. Practic, spre deosebire de o ancoră clasică, orice obiect cu o ancoră cloud atașată va fi vizibil simultan și oricând altcândva de oricâte device-uri. Ancorele cloud sunt disponibile atât pentru device-uri Android, cât și pentru iOS.

Cum funcționează Ancorele Cloud

ARCore se conectează la serviciul ARCore Cloud Anchor pentru hosting și resolving. Deci, avem nevoie de conexiune la internet pentru a putea folosi ancore Cloud.

Modul de funcționare al ancorelor cloud:

  1. Utilizatorul crează o ancoră locală mediului înconjurător
  2. Hosting. ARCore încarcă informațiile despre ancora locală în serviciul ARCore Cloud Anchor. Serviciul întoarce un id unic pentru acea ancoră.
  3. Aplicația distribuie acel id unic către toți ceilalți utilizatori.
  4. Resolving. Utilizatorii care au primit acel id unic pot recrea aceiași ancoră folosind serviciul ARCore Cloud Anchor.

Hosting

Pentru a crea și a hosta o ancoră, ARCore folosește o hartă de feature-uri 3D a spațiului înconjurător. Pentru a obține această hartă, camera telefonului trebuie să mapeze mediul înconjurător din jurul punctului de interes din cât mai multe unghiuri și poziții diferite înainte de hosting-ul propriu-zis. Serviciul ARCore Cloud Anchor crează pe urmă o hartă de caracteristici 3D ale spațiului și întoarce id-ul unic.

public void HostAnchor()
{
    Debug.Log("HostAnchor call in progress");
 
    /* Get FeatureMapQuality */
    FeatureMapQuality quality = arAnchorManager.EstimateFeatureMapQualityForHosting(GetCameraPose());
    Debug.Log(string.Format("Feature Map Quality: {0}", quality));
 
    if (quality != FeatureMapQuality.Insufficient)
    {
        /* Start the hosting process */
        HostCloudAnchorPromise cloudAnchor = arAnchorManager.HostCloudAnchorAsync(pendingHostAnchor, 365);
 
        /* Wait for the promise to solve */
        StartCoroutine(WaitHostingResult(cloudAnchor));
    }
}
 
private IEnumerator WaitHostingResult(HostCloudAnchorPromise hostingPromise)
{
    /* Wait for the promise. Save the id if the hosting succeeded */
    yield return hostingPromise;
 
    if (hostingPromise.State == PromiseState.Cancelled)
    {
        yield break;
    }
 
    var result = hostingPromise.Result;
 
    if (result.CloudAnchorState == CloudAnchorState.Success)
    {
        anchorIdToResolve = result.CloudAnchorId;
        Debug.Log("Anchor hosted successfully!");
    }
    else
    {
        Debug.Log(string.Format("Error in hosting the anchor: {0}", result.CloudAnchorState));
    }
}

Resolving

Când un alt utilizator aflat în același mediu îndreaptă camera telefonului către zona unde a fost salvată ancora cloud, serviciul ARCore Cloud Anchor compară periodic caracteristicile vizuale din scenă cu harta de caracteristici 3D care a fost creată anterior. ARCore folosește aceste comparații pentru a determina poziția și orientarea utilizatorului relative la ancora cloud.

cloudAnchor = arAnchorManager.ResolveCloudAnchorId(anchorIdToResolve);

Folosirea Ancorelor Cloud

Pentru a putea folosi ancore cloud este nevoie de o formă de autentificare. În cazul Android, ARCore Extensions oferă suport pentru Keyless și API Key pentru autentificare. Pentru iOS, ARCore Extensions oferă suport pentru Authentication token și API Key. Autentificarea trebuie activată manual în Project Settings → XR → ARCore Extensions.

API-ul ARCore Cloud Anchor necesită instalarea ARCore Extensions for AR Foundation.

Activare API ARCore Cloud Anchor

Înainte de a putea utiliza ancore cloud în aplicațiile noastre, trebuie mai întâi să activăm API-ul ARCore Cloud Anchor într-un proiect nou sau deja existent de pe Google Cloud Platform. Activarea API-ului se face aici.

Odată făcut acest pas, în funcție de metoda de autentificare folosită, trebuie să setăm una din următoarele (prin apăsarea butonului Create Credentials):

  • API keys (iOS și Android)
  • OAuth 2.0 Client IDs (Android)
  • Service Accounts (iOS)

În cazul OAuth 2.0 Client IDs va trebui specificat SHA-1 certificate fingerprint al aplicației. Pentru a afla acest lucru, trebuie să facem următorii pași:

  1. În Unity deschidem File → Build Settings.
  2. Deschidem Player Settings → Publishing Settings.
  3. Keystore Manager → Create new → In dedicated location.
  4. Completăm parola fișierului nou creat.
  5. Completăm un alias.
  6. Setăm o parolă pentru alias.
  7. Salvăm fișierul care este creat.
  8. Căutăm executabilul keytool.exe.
  9. Deschidem un terminal la locația executabilului și rulăm următoarea comandă (ni se va cere parola setată anterior):
.\keytool -exportcert -alias <numele aliasului setat anterior> -keystore <calea către fișierul creat de Unity>\user.keystore -list -v

În consolă vom avea SHA-1 certificate fingerprint.

Atenție! Odată setată parola, de fiecare dată când pornim Unity, va fi necesar să scriem parola în Player Settings. Atfel, build-ul nu se va putea face. De asemenea, prima dată după ce ați făcut acești pași va fi nevoie sa ștergeți ultima versiune a aplicației de pe telefon înainte de a încerca să puneți aplicația iar pe telefon.

Activarea Ancorelor Cloud în Aplicație

Keyless Authentication

Opțiunea de autentificare keyless este disponibilă pentru dispozitivele Android. Aceasta permite salvarea unei ancore cloud pentru maxim 365 de zile.

Pași pentru setarea acestui mod de autentificare:

  • Setăm Keyless din meniul de setări Cloud Anchors (Edit → Project Settings → XR Plug-in Management → ARCore Extensions). Mai întâi, din același meniu activăm Cloud Anchors.
  • Creăm un client OAuth pentru aplicația curentă Android în Google Developers Console.

Token authentication

Opțiunea de autentificare pe bază de token este disponibilă pentru dispozitivele iOS. Aceasta permite salvarea unei ancore cloud pentru maxim 365 de zile. Pentru setare, urmați pașii de aici.

API Key Authentication

Autentificarea pe bază de cheie API este disponibilă atât pe dispozitive iOS, cât pe dispozitive Android. Aceasta permite salvarea unei ancore pentru o singură zi.

Pași pentru configurare:

  1. Creăm o cheie pentru API pe Google Cloud Platform.
  2. Adăugăm noua cheie API proiectului:
  • În Unity: Edit → Project Settings → XR → ARCore Extensions.
  • Adăugăm cheia în câmpul Cloud Anchor API Keys.

Calitatea Mapării Feature Points

FeatureMapQuality indică gradul de calitate al punctelor caracteristice detectate de ARCore de la o anumită poziție. Ancorele cloud care sunt salvate folosind puncte caracteristice de o calitate înaltă vor avea în general rezultate cât mai bune. Dacă gradul de calitate al hărții de puncte caracteristice nu poate fi estimat pentru o anumită poziție și orientare, atunci EstimateFeatureMapQualityForHosting loghează un mesaj de avertizare și are rezultatul FeatureMapQuality.Insufficient. Acest rezultat indică faptul că ARCore va avea cel mai probabil dificultăți în rezolvarea ancorei cloud. Deci, pentru rezultate optime, trebuie să ne asigurăm că FeatureMapQuality indică un rezultat suficient de bun.

FeatureMapQuality quality = arAnchorManager.EstimateFeatureMapQualityForHosting(GetCameraPose());

Tasks

Vom folosi scena Cloud Anchors din scheletul de laborator. Acesta poate fi descărcat de aici. Scripturile necesare pentru rezolvarea laboratorului se află în Assets→Scripts: ARCloudAnchorManager.cs și CloudAnchorObjectPlacement.cs.

Inițial în scenă aveți 3 butoane:

  • Host. Butonul este mapat la funcția HostAnchor() prin care veți crea și hosta o nouă ancoră cloud.
  • Resolve. Butonul este mapat la funcția Resolve() prin care veți rezolva o ancoră cloud deja existentă.
  • Delete. Butonul este mapat la funcția RemovePlacement() prin care veți șterge ancora existentă.

Pentru testare, ancora cloud va fi mereu atașată pe un cub. Deci, când apăsați butonul Resolve pe ecran ar trebui să vă apară cubul la poziția la care l-ați pus inițial.

Workflow-ul aplicației este următorul:

  1. Adăugăm un cub cu o ancoră pe ecran.
  2. Hostăm ancora în cloud.
  3. Ștergem cubul de pe ecran.
  4. Readucem cubul pe ecran la exact aceiași poziție prin rezolvarea ancorei.

  1. Implementați una din cele 3 metode pentru activarea API-ului ARCore Cloud Anchor și faceți setările corespunzătoare și în interfața Unity.
  2. Adăugați un cub pe ecran la poziția degetului. Atașați cubului o ancoră.
  3. Salvați ancora în cloud.
  4. Ștergeți cubul de pe ecran la apăsarea butonului Delete.
  5. Folosind ancora din cloud, afișați cubul în poziția în care l-ați plasat inițial.
  6. Bonus: Laboratorul este configurat să accepte o singură ancoră cloud. Modificați astfel încât să puteți adăuga, host și rezolva oricâte ancore cloud.
irva/laboratoare/03.txt · Last modified: 2023/10/23 12:49 by maria_anca.balutoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0