2. DEFINITION
• Isa term for a live direct or indirect view of a physical real-
world environment whose elements are augmented by virtual
computer-generated imagery. (Wikipedia)
www.MitAPP.com
3. HISTORY
• 1966: was invented the head mounted display.
• 1992: The term Augmented Reality has been coined by Thomas
Caudell.
• 1999: Hirokazu Kato develops ARToolKit and is demonstrated at
Siggraph in the same year.
• 2008: Wikitude AR Travel Guide is launched with the G1
Android Phone.
• 2010: acrossair, AR Browser brings AR to the mobile user on the
iPhone 3Gs.
www.MitAPP.com
4. TECHNOLOGY - TRACKING
• Mobile devices use
• Digital camera.
• Accelerometers.
• GPS.
• Gyroscopes, Solid state compasses.
• RFID.
• Wireless sensors.
www.MitAPP.com
5. PROCEDURE
• ImageRegistration: this define
the way of retrieving the real
world reference system on
which over-impose
computer generated images.
• Toachieve the point above
are used computer vision
techniques.
www.MitAPP.com
6. LIGHTWEIGHT AUGMENTED
REALITY
es: Wikitude
• Use GPS tracking to
retrieve the device
position.
• Usesolid state compass
to manage the device
orientation.
www.MitAPP.com
16. RETRIEVING GPS POSITION
- (void)locationManager:(CLLocationManager*)manager
didUpdateToLocation:(CLLocation*)newLocation fromLocation:
(CLLocation*)oldLocation {
// Use the coordinate data
double lat = newLocation.coordinate.latitude;
double lon = newLocation.coordinate.longitude;
}
www.MitAPP.com
17. RETRIEVING GPS POSITION
- (void)locationManager:(CLLocationManager*)manager
didUpdateToLocation:(CLLocation*)newLocation fromLocation:
(CLLocation*)oldLocation {
NSTimeInterval howRecent =
[newLocation.timestamp timeIntervalSinceNow];
if (howRecent < -10) return;
if (newLocation.horizontalAccuracy > 100) return;
// Use the coordinate data
double lat = newLocation.coordinate.latitude;
double lon = newLocation.coordinate.longitude;
}
www.MitAPP.com
18. RETRIEVING GPS POSITION
- (void)locationManager:(CLLocationManager*)manager
didUpdateToLocation:(CLLocation*)newLocation fromLocation:
(CLLocation*)oldLocation {
NSTimeInterval howRecent =
[newLocation.timestamp timeIntervalSinceNow];
if (howRecent < -10) return;
if (newLocation.horizontalAccuracy > 100) return;
// Use the coordinate data
double lat = newLocation.coordinate.latitude;
double lon = newLocation.coordinate.longitude;
}
www.MitAPP.com
19. WORKFLOW
GPS Accelerom
Camera
Position eter
Get the orientation through the Compass
20. WORKFLOW
GPS Accelerom
Compass Camera
Position eter
Get the orientation through the Compass
21. USING THE COMPASS
• Classes
• CLLocationManager
• CLHeading
• Protocol
• CLLocationManagerDelegate
www.MitAPP.com
22. USING THE COMPASS
Delegates Methods
- (void)locationManager:(CLLocationManager*)manager
didUpdateHeading:(CLHeading*)newHeading;
- (void)locationManagerShouldDisplayHeadingCalibration:
(CLLocationManager*)manager;
www.MitAPP.com
23. USING THE COMPASS
Delegates Methods
- (void)locationManager:(CLLocationManager*)manager
didUpdateHeading:(CLHeading*)newHeading;
-
(void)locationManagerShouldDisplayHeadingCalibration:
(CLLocationManager*)manager;
www.MitAPP.com
24. USING THE COMPASS
CLLocationManager* manager = [[CLLocationManager alloc] init];
[manager setDelegate:self];
[manager setDesiredAccuracy:kCLLocationAccuracyBest];
[manager setDistanceFilter:10];
[manager startUpdatingLocation];
if ([manager headingAvailable]) {
[manager setHeadingFilter:2];
[manager startUpdatingHeading];
} else {
// Show a message to notify the user that compass is required in AR
apps.
}
www.MitAPP.com
25. USING THE COMPASS
CLLocationManager* manager = [[CLLocationManager alloc] init];
[manager setDelegate:self];
[manager setDesiredAccuracy:kCLLocationAccuracyBest];
[manager setDistanceFilter:10];
[manager startUpdatingLocation];
if ([manager headingAvailable]) {
[manager setHeadingFilter:2]; // filter value is in degrees.
[manager startUpdatingHeading];
} else {
// Show a message to notify the user that compass is required in AR
apps.
}
www.MitAPP.com
26. RETRIEVING GPS POSITION
- (void)locationManager:
(CLLocationManager*)manager didUpdateHeading:
(CLHeading*)newHeading {
// Use the compass data
// angle in degree with respect to the magnetic
north
double heading = newHeading.magneticHeading;
}
www.MitAPP.com
27. WORKFLOW
GPS
Compass Camera
Position
Catch the Acceleration for detecting device orientation
and virtual item fine positioning
28. WORKFLOW
GPS
Compass Accelerometer Camera
Position
Catch the Acceleration for detecting device orientation
and virtual item fine positioning
Per poter visualizzare i dati geo referenziati in AR occorre daterminare la propria posizione rispetto ai dati. Occorre quindi far partire il sistema di acquisizione della posizione GPS e utilizzare i dati che da esso provengono per capire quali dati mostrare.
Delegate Method chiamato dal CLLocationManager quando una nuova posizione GPS viene determinata
Delegate Method chiamato dal CLLocationManager quando c&#x2019;&#xE8; stato un errore nel determinarla (es. non c&#x2019;&#xE8; copertira GPS)
Codice necessario a far partire l&#x2019;acquisizione della posizione GPS.
Il codice in giallo permette di creare l&#x2019;instanza del location manager.
La classe in cui &#xE8; inserito questo codice (in genere un ViewController) diventa la classe delegate del location manager.
I due metodi evidenziati mostrano come sia possibile scegliere l&#x2019;accuratezza del segnala GPS che si desidera avere durante l&#x2019;acquisizione e quale &#xE8; la soglia minima di aggiornamento tra una posizione e l&#x2019;altra espressa in metri.
Il metodo evidenziato permette di far partire il location manager e quindi l&#x2019;acquisizione del segnale GPS appena disponibile.
Primo metodo delegate chiamato dal location manager quando una nuova posizione GPS &#xE8; disponibile.
Il parametro newLocation contiene la nuova posizione, mentre in oldLocation &#xE8; presente l&#x2019;ultima delle posizioni valide precedentemente acquisite. Il codice in giallo mostra come estrarre le coordinate geografiche latitudine e longitudine dalla struttura dati CLLocation.
Un controllo necessario da fare prima di estrarre le informazioni relative alle coordinate &#xE8; quello di verificare che tale posizione non sia estratta dalla cache. Occorre quindi controllare il timestamp della &#x2018;newLocation&#x2019; e verificare che non sia antecedente al tempo attiale di una certa soglia, altrimenti si tratta di un valore preso dalla cache => da scartare.
Altro controllo da fare &#xE8; relativo all&#x2019;accuratezza della posizione pervenuta dal manager. In questo caso (codice in giallo) si sta scartando la posizione GPS che ha un&#x2019;accuratezza maggiore di 100m. La soglia con cui confrontare il valore estratto da newLocation dipende dal tipo di applicazione che si sta realizzando, quindi va scelto caso per caso. Per un&#x2019;app di AR l&#x2019;accuratezza da accettare dovrebbe essere inferiore o uguale a 10m.
Oltre alla posizione GPS occorre determinare anche l&#x2019;orientazione dell&#x2019;utente rispetto al nord magnetico in maniera tale da capire (per una determinata posizione GPS) verso quali dati l&#x2019;utente si sta orientando e quindi stabilire quali dati mostrare e quali nascondere dalla visualizzazione.
Il metodo evidenziato rappresenta il metodo delegate relativo all&#x2019;aggiornamento del compasso a stato solido presente nell&#x2019;iPhone 3Gs. Questo metodo viene chiamato nel momento in cui un nuovo valore di oriemtamento &#xE8; disponibile.
Il metodo evidenziato rappresenta il metodo delegate relativo all&#x2019;aggiornamento del compasso a stato solido presente nell&#x2019;iPhone 3Gs. Questo metodo viene chiamato nel momento in cui si presenta un&#x2019;interferenza elettromagnetica e/o non &#xE8; possibile calcolare l&#x2019;orientamento. Questo methodo &#xE8; quello che permette di visualizzare l&#x2019;icona della bussola in presenza di disturbi.
Il codice in giallo permette di eseguire il test della disponibilit&#xE0; del compasso a stato solido nell&#x2019;iPhone su cui viene eseguito il codice. In caso di esito positivo, si proceder&#xE0; alla configurazione del compasso.
Il codice evidenziato mostra il parametro di configurazione della frequenza di aggiornamento dei valori (nell&#x2019;esempio ogni 2 gradi) e l&#x2019;istruzione necessaria a far partire l&#x2019;acquisizione dei valori relativi al compasso.
Il codice evidenziato mostra come estrarre l&#x2019;informazione dell&#x2019;orientamento dell&#x2019;utente rispetto al nord magnetico espresso in gradi dalla struttura CLHeading.
Questo tipo di sensore permette di avere un controllo fine dei movimenti dell&#x2019;utente e quindi aggiostare le icone rappresentanti i dati in maniera tale da filtrare i movimenti rapidi del dispositivo. Inoltre &#xE8; possibile gestire eventuali cambi di orientamento del dispositivo e aggiornare conseguentemente la posizione delle icone sullo schermo.
Il metodo rappresenta il delegate relativo all&#x2019;aggiornamento dell&#x2019;accelerometro presente nell&#x2019;iPhone/iPod. Questo metodo viene chiamato nel momento in cui un nuovo valore di accelerazione &#xE8; disponibile.
Il codice in giallo mostra il modo di avere un riferimento all&#x2019;accelerometro di sistema. Non si pu&#xF2; creare una nuova instanza, ma occorre far riferimento all&#x2019;UIAccelerometer unico di sistema.
Il codice in giallo mostra poi come customizzare la frequenza di aggiornamento dell&#x2019;acquisizione dei valori di accelerazione e l&#x2019;assegnazione del delegate oltre ad assegnare chi ricever&#xE0; i dati di aggiornamento scatener&#xE0; l&#x2019;inizio dell&#x2019;acquisizione delle accelerazioni.
Il metodo evidenziato rappresenta il metodo delegate relativo all&#x2019;aggiornamento dell&#x2019;acelerometro. Il parametro &#x2018;acceleration&#x2019; contiene i valori di accelerazione lungo i 3 assi x, y e z.
Ora che si hanno a disposizione tutti i dati di posizione orientamento ed accelerazione, occorre acquisire le informazioni dal mondo reale in maniera da poterci poi sovrapporre quelle provenienti dal mondo &#x2018;sintetico&#x2019;.
Il codice evidenziato permette di eseguire un controllo sul dispositivo della presenza o meno della camera. Per un&#x2019;app di AR &#xE8; decisamente fondamentale che questo tipo di input sia presente.
Si proceder&#xE0; quindi all&#x2019;instanza del&#x2019;ImagePickerController.
... e all&#x2019;abilitazione del picker per restituirci l&#x2019;immagine proveniente dalla camera e non dalla libreria delle immagini salvate. Quindi assegnamo il delegate per poter ricevere le chiamate di aggiornamento dal picker controller.
Per un&#x2019;app di AR &#xE8; fondamentale l&#x2019;immersivit&#xE0; dei dati nel mondo reale, quindi i due metodi evidenziati permettono di eliminare gli elementi grafici 2D presenti normalmente nel picker che permettono di scattare una foto (il primo) e la navigazione delle foto scattate (il secondo).
Questo &#xE8; il metodo fondamentale per l&#x2019;app di AR, in quanto permette di definire la vista che verr&#xE0; sovrapposta a quela di visualizzazione dell&#x2019;immagine proveniente dalla camera dell&#x2019;iPhone. In questa vista verranno poi disegnate le icone che rappresentano i dati sintetici da sovrapporre all&#x2019;immagine della camera.
E&#x2019; quindi giunto il momento di mostrare l&#x2019;immagine della camera mediante il metodo evidenziato. In questo caso non &#xE8; necessario mostrarlo con l&#x2019;animazione classica dei ViewController presentati in modalit&#xE0; modale, quindi al flag &#x2018;animated&#x2019; viene assegnato NO.
In questa slide viene presentata una lista di librerie disponibili per iPhone (Objective-C) che permettono di costruire un&#x2019;applicazione di AR senza dover pertire da zero. Ovviamente la complessit&#xE0; di un&#x2019;app di AR non &#xE8; banale, quindi conviene appoggiarsi alle librerie esistenti magari modificandole per adattarle all&#x2019;applicazione del caso.