This is an old revision of the document!


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()
{
    /* Try and host cloud anchor */
    if (arAnchorManager.HostCloudAnchor(anchor, 1) == null)
    {
        /* If no unique ID is returned, the hosting process has failed */
    }
    else
    {
        anchorHostInProgress = true;
    }
}
 
private void CheckHostingProgress()
{
    /* Get the cloud anchor state */
    CloudAnchorState cloudAnchorState = cloudAnchor.cloudAnchorState;
 
    /* If the process was a success */
    if (cloudAnchorState == CloudAnchorState.Success)
    {
        anchorHostInProgress = false;
 
        /* Save the unique ID */
        anchorIdToResolve = cloudAnchor.cloudAnchorId;
    }
    else
    {
        /* If the process is completed, but not successfully */
        if (cloudAnchorState != CloudAnchorState.TaskInProgress)
        {
            /* There was an error while hosting the cloud anchor */
            anchorHostInProgress = false;
        }
    }
}
 
void Update()
{
    if(anchorHostInProgress)
    {
        CheckHostingProgress();
    }
}

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. Salvăm fișierul care este creat (în folderul proiectului).
  5. Setăm o parolă.
  6. La Alias setăm o nouă cheie.
  7. Completăm toate câmpurile care apar.
  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 examplealias -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.

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.
  • 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.
  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: Adăugați opțiunea de a schimba poziția cubului pe ecran. Salvați noua poziție, folosind Cloud Anchors.
irva/laboratoare/03.1697906035.txt.gz · Last modified: 2023/10/21 19:33 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