In questo articolo vedremo brevemente come creare un’applicazione Unity per Android in Realtà Aumentata, utilizzando ARFoundation e ARCore, in particolare come posizionare degli oggetti appartenenti al mondo virtuale nel mondo reale e con l’ausilio del GPS personalizzeremo il tracking delle immagini in base alla posizione.
La prima parte di questo progetto proviene dall’articolo https://www.francescogarofalo.it/post/imagetrackingunity/.
Introduzione
Per creare questa applicazione avremo bisogno:
Android Build Support per Unity
N.B Questa guida è stata testata con Unity 2021.3.1f1
Il primo passo è quello di creare un progetto per l’Image Tracking, puoi seguire questo articolo https://www.francescogarofalo.it/post/imagetrackingunity/ oppure scaricare da github il seguente progetto Github T1 - Tracking Image AR e lavorare a partire da quest’ultimo.
Se sei già confidente sull’utilizzo del GPS in Unity puoi saltare il prossimo capitolo e passare direttamente al capitolo “Creazione applicazione AR GPS”.
Image Tracking Unity
Per comprendere al meglio come creare questo progetto è fortemente consigliato leggere l’articolo https://www.francescogarofalo.it/post/imagetrackingunity/ o guardare il video https://www.youtube.com/watch?v=_gBBfdSZ-H8.
In alternativa ecco una veloce infarinatura:
AR Foundation consente di lavorare con più piattaforme in realtà aumentata, questo pacchetto infatti fornisce un’interfaccia per gli sviluppatori Unity da utilizzare, ma da sola non implementa alcuna funzionalità AR.
Per utilizzare AR Foundation è necessario conoscere il dispositivo di destinazione e scaricare dei pacchetti separati in base alla piattaforma di destinazione supportata da Unity; nel nostro caso utilizzeremo ARCore XR Plug-in Android.
Il GPS in un dispositivo mobile?
GPS sta per Global Positioning System. È una tecnologia sviluppata dalla Marina degli Stati Uniti e attualmente di proprietà del governo degli Stati Uniti e supervisionata dalla sua Air Force.
Cos’è il GPS?
Il GPS è un sistema di radionavigazione. Utilizza le onde radio tra satelliti e il ricevitore all’interno del device (smartphone, telefono, dispositivo IoT, ecc.) per fornire informazioni sulla posizione e sull’ora a qualsiasi software/applicazione che deve utilizzarlo. Non è necessario inviare alcun dato effettivo nello spazio affinché il GPS funzioni; devi solo essere in grado di ricevere dati da quattro o più dei satelliti in orbita dedicati alla geolocalizzazione.
Il GPS è preciso, però è lento e consuma molta energia da entrambi i lati.
Ogni satellite ha il proprio orologio atomico interno e invia un segnale codificato nel tempo su una frequenza specifica. Il chip del ricevitore determina quali satelliti sono visibili e senza ostacoli, quindi inizia a raccogliere dati dai satelliti con i segnali più forti. I dati GPS sono lenti, e questo è in base alla progettazione quindi ci vorrà circa un minuto per ottenere la geolocalizzazione molto precisa.
Il ricevitore GPS del telefono utilizza i dati di questi segnali per triangolare dove ti trovi e a che ora è. Si noti la parola triangolazione e la menzione sopra che sono necessari quattro satelliti per il funzionamento del GPS. Il quarto segnale viene utilizzato per determinare l’altitudine in modo da poter ottenere i dati di geolocalizzazione su una mappa con solo tre segnali.
I ricevitori GPS consumano molta energia e richiedono una visione libera di più satelliti per funzionare. Gli ostacoli possono includere edifici alti, e ciò significa che i luoghi in cui vive la maggior parte di noi possono (e lo fanno) avere difficoltà a ottenere i dati di cui ha bisogno tutto il tempo. È qui che entra in gioco AGPS (Assisted Global Positioning System).
Integrazione con Unity - LocationService
Unity ha una classe LocationService per l’utilizzo della posizione GPS.
Dalla documentazione ufficiale Unity (un po’ scarna di informazioni) abbiamo i seguenti parametri:
- Il parametro desiredAccuracyInMeters indica la precesione che desideriamo, dal servizio GPS, definita in metri. Il livello di precisione è dato dalle ultime coordinate GPS fornite dal dispositivo all’applicazione. Valori alti (come 500) non richiedono al dispositivo di utilizzare il GPS, quindi si ottiene una posizione approssimativa questo permette al dispositivo di risparmiare batteria, invece valori come 5-10 utilizzano il GPS del device al costo energivori più alti. Il valore di default di questo parametro è 10 metri.
- Il parametro updateDistanceInMeters indica la distanza minima, in metri, di uno spostamento, del dispositivo prima che Unity aggiorni Input.location. Valori alti come 500 producono meno aggiornamenti e richiedono meno risorse da elaborare. Il valore di default di questo parametro è 10 metri.
Su Android, l’utilizzo della metodo LocationService.Start in uno script aggiunge automaticamente il privilegio ACCESS_FINE_LOCATION al manifest Android. Se si utilizzano valori di precisione bassa come 500 o superiori, è possibile selezionare la posizione a bassa precisione nel Player Settings e aggiungere il privilegio ACCESS_COARSE_LOCATION.
Un esempio di script C# per la gestione della posizione in Unity:
|
|
Unity AR e GPS
Get Started
Creiamo un progetto Unity 3D, e iniziamo la configurazione per ARCore e i servizi di localizzazione:
- Dal Package Maanger importiamo ARCore XR Plugin e ARFoundation:
- A questo punto possiamo configurare il progetto android ed installare il XR Plug-in Management ed abilitare ARCore. Quindi click su File -> Build Settings -> Android e cliccate su Switch Platform; una volta terminato click su Player Settings… -> XR Plug-in Management -> Initialize XR on Startup e assicuratevi che ARCore sia selezionato.
- Configurare il Player: Dal menu Project Settings click su Player -> Rimuovete la spunta su Auto Graphics API e rimuovete Vulkan dalle API; infine dalla scheda Minimum API Level settate Android 9.0 ‘Pie’ (API level 28).
- Configurare l’accesso alla location: Dal Player spuntare Low Accuracy Location
N.B. Su Apple iOS le operazioni da eseguire sono diverse.
Dopo aver ultimato la configurazione possiamo lavorare sul progetto partendo prima dall’Image Tracking e poi del GPS con Image Tracking.
GPS Script
Dobbiamo creare uno script per la gestione del GPS del nostro device.
Procediamo quindi alla creazione dello script GPSLocation.cs basandoci sullo script definito dalla documentazione Unity.
Questo script si occuperà sia della gestione del GPS, sia dell’attivazione del tracciamento in base alla posizione infatti all’interno del metodo activateImageTracking dovremmo inserire le coordinate geografiche dove attivare il tracciamento.
|
|
Ci sono degli elementi che chiamano uno script ARTrackedImageGPS.cs che creeremo nel prossimo paragrafo.
Image Tracking
Dalla schermata principale di Unity il primo passo è rimuovere la Main Camera standard. Nel pannello Hierarchy click con il tasto destro del mouse -> XR -> AR Session, e XR -> AR Session Origin.
In questo caso dobbiamo creare uno script che si occupi sia del tracciamento che del posizionamento dell’oggetto sull’immagine da tracciare.
Procediamo quindi alla creazione dello script ARTrackedImageGPS.cs che si occuperà della parte AR.
|
|
Integration
Possiamo usare gli elementi di testo della UI per ottenere informazioni di debug durante l’esecuzione dell’applicazione sul dispositivo Android. Per fare questo dobbiamo creare i seguenti elementi nella Hierarchy di Unity come da immagine sottostante:
Ora integriamo gli script all’interno dell’oggetto AR Session Origin e la UI per avere un’interfaccia da cui leggere le informazioni relative al GPS e al tracciamento localizzato, come da immagine sottostante:
A questo punto siamo pronti per provare la nostra applicazione.
Fonti
- AR Tracked Image Manager - Unity Documentation
- AR Foudations - Unity Documentation
- LocationService - Unity Documentation
- How does GPS work on my phone? - Android Central
- GPS Location in Unity 2020
- AR Image Tracking - Unity Documentation
- Unity UI: Unity User Interface
Grazie ☺