Android ed utilizzo_dei_sensori

45
Utilizzo dei sensori con Android Geomagnetic Data Analyzer Progetto sperimentale per il rilevamento e l'analisi dei precursori dei terremoti mediante l'ausilio di dispositivi mobili. Contatto email per informazioni : [email protected]

description

Utilizzo dei sensori su piattaforma Android. Presentazione del progetto sperimentale al fine di utilizzare i sensori integrati a bordo dei dispositivi mobili per il rilevamento dei precursori dei terremoti. Con la raccolta dei dati, sara' possibile confermare le teorie di base e definire un modello deterministico atto alla individuazione e previsione degli eventi sismici con un anticipo variabile dai 10 giorni alle 48 ore.

Transcript of Android ed utilizzo_dei_sensori

Page 1: Android ed utilizzo_dei_sensori

Utilizzo dei sensori con Android

Geomagnetic Data AnalyzerProgetto sperimentale per il

rilevamento e l'analisi dei precursori dei terremoti mediante l'ausilio di

dispositivi mobili.

Contatto email per informazioni : [email protected]

Page 2: Android ed utilizzo_dei_sensori

Geomagnetic Data Analyzer

Introduzione  Prevedere i terremoti con le moderne tecnologie di massa. E' possibile? Allo stato attuale la scienza ha identificato alcuni fenomeni che si manifesterebbero prima dei terremoti. Questi fenomeni scientificamente accertati sono le emissioni di gas radon dal terreno, l'innalzamento della temperatura dell'aria, aberrazioni del campo gravitazionale e del campo geomagnetico.

Page 3: Android ed utilizzo_dei_sensori

Geomagnetic Data Analyzer

Scopo del progetto  Non e' ancora possibile prevedere i terremoti, ma la raccolta dei dati riguardanti i precursori dei terremoti e la successiva elaborazione potrebbero fornirci gli strumenti per definire un modello deterministico in grado di permetterci di prevedere un possibile evento sismico con un certo preavviso.

Page 4: Android ed utilizzo_dei_sensori

Geomagnetic Data Analyzer

Scopo del progetto Il progetto ha lo scopo di determinare se e' possibile identificare, raccogliere ed analizzare le anomalie geomagnetiche, gravitazionali e termiche utilizzando i sensori presenti all'interno dei dispositivi mobili, al fine di individuare i precursori dei terremoti. Sara' cosi' possibile costruire la piu' fitta rete di sensori intelligenti che sia mai esistita

Page 5: Android ed utilizzo_dei_sensori

Geomagnetic Data Analyzer

Teoria di base   I fenomeni sismici sono accompagnati da: • aberrazioni del campo geomagnetico locale (alterazioni

rilevabili in un raggio di 300 chilometri);

Page 6: Android ed utilizzo_dei_sensori

Geomagnetic Data Analyzer

Teoria di base  • Le anomalie gravitazionali sono legate ai lenti

spostamenti della crosta terrestre e quindi alla redistribuzione delle masse;

 • innalzamento della temperatura dell'aria;

 • emissione di gas radon.

Page 7: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerUtilizzo dei sensori dei dispositivi mobili

  I dispositivi mobili odierni hanno un'ampia dotazione di sensori, che potrebbero essere utilizzati per rilevare alcune delle anomalie legate ai precursori dei terremoti: • Il magnetometro per rilevare il campo geomagnetico sui

tre assi X-Y-Z;

Page 8: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerUtilizzo dei sensori dei dispositivi mobili

    • l'accelerometro per individuare le anomalie gravitazionali;

 • sensore di temperatura, qualora sia presente, per

individuare le anomalie termiche.

Page 9: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerUtilizzo dei sensori dei dispositivi mobili

 Inoltre verra' localizzato anche con precisione il punto esatto della manifestazione delle anomalie, mediante

l'utilizzo del GPS, un componente oramai diffusissimo sui dispositivi di ultima generazione.

I dati riguardanti che provengono dai vari sensori vengono inviati verso un server, insieme ai dati di localizzazione

GPS.

Page 10: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerUtilizzo dei sensori dei dispositivi mobili

I dispositivi utilizzati saranno quelli equipaggiati con Android, sistema operativo che permette un certo grado di liberta'

nell'accesso alle risorse a basso livello. Tratteremo quindi la gestione dei sensori in Android.

In futuro e' prevista l'estensione del progetto anche su piattaforma iPhone e Symbian, per rendere ancora piu' fitta la

rete dei sensori.

Page 11: Android ed utilizzo_dei_sensori

Utilizzo dei sensori con Android

Geomagnetic Data Analyzer 

 Gestione dei sensori: Implementazione

Page 12: Android ed utilizzo_dei_sensori

Geomagnetic Data Analyzer

Gestione dei sensori: Introduzione

 Tutti i moderni dispositivi mobili, oramai, possiedono una

ricca dotazione di sensori.  

Questi si suddividono in sensori di movimento, di prossimita', di temperatura e campi magnetici.

Page 13: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

  

La piattaforma Android possiede una serie di interfacce e di classi di funzioni che permettono la gestione dei sensori  e

del posizionamento globale (GPS) da parte dello sviluppatore.

Page 14: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

   

android.hardware.Sensor;

android.hardware.SensorManager; 

android.hardware.SensorEvent; 

android.hardware.SensorEventListener.

Page 15: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 

android.hardware.Sensor: classe che rappresenta i sensori. Per ottenere da SensorManager una lista dei sensori

disponibili si utilizza "getSensorList(int)": 

public List<Sensor> getSensorList (int type)   

Page 16: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 Nel nostro codice di esempio:

 List<Sensor> sensoriMagnetici = mySensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD); 

Questa chiamata crea una lista di sensori richiedendola a SensorManager (che deve essere istanziato prima), in

questo caso il sensore di campi magnetici (Sensor.TYPE_MAGNETIC_FIELD).

 

Page 17: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

  

Le altre costanti utilizzate da Sensor per definire i vari sensori sono:

 • "TYPE_ACCELEROMETER": riferito all'accelerometro;

 • "TYPE_ALL": riferito a tutti i sensori;

 

Page 18: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 • "TYPE_LIGHT": riferito al sensore di luminosita';

 • "TYPE_ORIENTATION": riferito al sensore di

orientamento spaziale del dispositivo; • "TYPE_PRESSURE": riferito al sensore di pressione; 

 

Page 19: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 • "TYPE_PROXIMITY": riferito al sensore di prossimita';

 • "TYPE_TEMPERATURE": riferito al sensore di

temperatura; 

 

Page 20: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 Non tutti i sensori vengono inseriti all'interno dei

dispositivi. 

Per evitare errori indesiderati in fase di esecuzione del codice, e' necessario controllare l'effetiva disponibilita' del

sensore che si intende utilizzare. 

 

Page 21: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

Nel nostro codice di esempio:  List<Sensor> sensoriMagnetici = mySensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD);            if ( sensoriMagnetici != null && sensoriMagnetici.size() != 0) { ... } 

 In questo modo controlliamo l'esistenza del sensore desiderato evitando possibili errori di NullPointerException.

Page 22: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

android.hardware.SensorManager: classe che permette di accedere agli eventi ed alle informazioni che provengono

dai sensori.Un oggetto di tipo SensorManager si instanzia con la chiamata Context.getSystemService() con argomento

SENSOR_SERVICE. 

Page 23: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

La chiamata a Context.getSystemService(): 

public abstract Object getSystemService (String name)

 ritorna un riferimento a livello di sistema, del servizio che ci

interessa. In questo caso il servizio SENSOR.SERVICE.

Page 24: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

Nel nostro codice di esempio: 

final SensorManager mySensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);            List<Sensor> sensoriMagnetici = mySensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD);            if ( sensoriMagnetici != null && sensoriMagnetici.size() != 0) {

Page 25: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

android.hardware.SensorEvent: classe che rappresenta gli eventi e le informazioni che provengono dai sensori.

 

Page 26: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 

Viene usato il sistema di coordinate delle OpenGL ES per determinare su quale asse si sia manifestato l'evento. L'origine degli assi e' fissato in basso a sinistra (nelle API di gestione 2D e' invece fissato in alto a sinistra). Guardando frontalmente lo schermo, l'asse Y punta verso l'alto, l'asse X verso destra e l'asse Z verso l'osservatore.

Page 27: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

SensorEvent, attraverso l'interfaccia SensorEventListener, ci fornisce diverse informazioni riguardanti i dati che

provengono dai sensori, nel momento della registrazione degli eventi.

• "public int accuracy": l'accuratezza del rilevamento dell'evento da parte del sensore;

 • "public Sensor sensor": il sensore che ha generato

l'evento;   

Page 28: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

• "public long timestamp": l'istante di tempo nel quale si e' manifestato l'evento, in nanosecondi;

 • "public final float[] values": un'array i cui vari elementi

cambiano in dimensione e contenuto in base al sensore monitorato;

  

Page 29: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

Lista dei sensori di cui SensorEvent fornisce i dati

"Sensor.TYPE_ORIENTATION": restituisce un'array di tre valori, espressi in gradi:

 o "value[0]": l'azimuth, ovvero l'angolo compreso tra la

direzione del Nord magnetico e l'asse Y del dispositivo, intorno all'asse Z del dispositivo;

 

Page 30: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 o "value[1]": il pitch, ovvero la rotazione intorno all'asse

X, con valori che variano da -180 a 180 gradi. Il valore e' considerato positivo se l'asse Z si dirige nella direzione dell'asse Y;   

 o "value[2]": il roll, ovvero la rotazione intorno all'asse

Y, con valori che variano da -90 a 90 gradi. Il valore e' considerato positivo se l'asse X si allontana dalla direzione dell'asse Z.

Page 31: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

Lista dei sensori di cui SensorEvent fornisce i dati

"Sensor.TYPE_ACCELEROMETER": restituisce un'array di tre valori, espressi m/s^2. Rappresentano l'accelerazione a

cui e' sottoposto il dispositivo lungo i tre assi, meno l'accelerazione di gravita':

 • "value[0]": l'accelerazione lungo l'asse X, meno

l'accelerazione di gravita'; 

Page 32: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 o "value[1]": l'accelerazione lungo l'asse Y, meno

l'accelerazione di gravita';    

o "value[2]": l'accelerazione lungo l'asse Z, meno l'accelerazione di gravita'.

Page 33: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

Lista dei sensori di cui SensorEvent fornisce i dati

• "Sensor.TYPE_MAGNETIC_FIELD": restituisce un'array di tre valori, espressi microtesla. Rappresentano il campo magnetico ambientale a cui e' sottoposto il

dispositivo lungo i tre assi X,Y e Z: 

Page 34: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

Lista dei sensori di cui SensorEvent fornisce i dati

• "Sensor.TYPE_LIGHT": restituisce un'array di un valore, value[0], ed esprime il livello di luminosita' ambientale in

lux (SI); 

Page 35: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

Lista dei sensori di cui SensorEvent fornisce i dati

• "Sensor.TYPE_PROXIMITY": restituisce un'array di un valore, value[0], ed esprime la distanza dall'oggetto in

cm; 

Nel nostro codice di esempio:

Page 36: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 @Override public void onSensorChanged(SensorEvent event) {

            magneticAvgValues[0] = (magneticAvgValues[0]*nMagneticValues + event.values[0])/((float)nMagneticValues+1);            magneticAvgValues[1] = (magneticAvgValues[1]*nMagneticValues + event.values[1])/((float)nMagneticValues+1);            magneticAvgValues[2] = (magneticAvgValues[2]*nMagneticValues + event.values[2])/((float)nMagneticValues+1);

            nMagneticValues++;        }   };

       

        }

Page 37: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

android.hardware.SensorEventListener: interfaccia, usata per ricevere le notifiche dalla classe SensorManager

quando i valori provenienti dai sensori cambiano.

Page 38: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

SensorEventListener mette a disposizione 2 metodi:

• "abstract void onAccuracyChanged(Sensor sensor, int accuracy)": chiamato quando l'accuratezza del sensore cambia;

 • "abstract void onSensorChanged(SensorEvent event)": chiamato quando

i dati dei sensori cambiano.

Si definisce l'interfaccia, nel nostro codice di esempio:

Page 39: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 SensorEventListener magneticiListener = new SensorEventListener() {         @Override        public void onAccuracyChanged(Sensor sensor, int accuracy) {                    }                @Override        public void onSensorChanged(SensorEvent event) { ... } }; 

       

Page 40: Android ed utilizzo_dei_sensori

Geomagnetic Data Analyzer

Gestione dei sensori: Implementazione  

Si aggancia l'interfaccia SensorEventListener all'istanza della classe SensorManager con il metodo

boolean registerListener(SensorEventListener listener, Sensor sensor, int

rate)  per permettere a quest'ultima di notificare le modifiche ai

valori che provengono dai sensori. 

       

Page 41: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 Nel nostro codice di esempio:

if ( sensoriMagnetici != null && sensoriMagnetici.size() != 0) {

    for( final Sensor sensore : sensoriMagnetici) {        mySensorManager.registerListener(magneticiListener, sensore, SensorManager.SENSOR_DELAY_FASTEST);                    ...                 }            }

Page 42: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 L'ultimo campo riguarda il rate con il quale si intende

effettuare il campionamento: 

"SensorManager.SENSOR_DELAY_FASTEST":  il piu' velocemente possibile;

 "SensorManager.SENSOR_DELAY_GAME": adatto per i

giochi;

Page 43: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 

 "SensorManager.SENSOR_DELAY_NORMAL":  utilizzato generalmente per i cambiamenti di orientamento dello

schermo; 

"SensorManager.SENSOR_DELAY_UI": adatto per le user interface;

Page 44: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

 Se si decide di inserire il codice di gestione dei sensori

all'interno di un'Activity, e' importante ricordarsi di chiudere il listener quando si chiude l'applicazione o

quando e' in onPause(), usando 

unregisterListener(SensorEventListener listener, Sensor sensor)   

Si evitera' di scaricare la batteria quando l'applicazione non e' in uso

        

Page 45: Android ed utilizzo_dei_sensori

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

   Nel nostro codice di esempio:

for( final Sensor sensore : sensoriMagnetici) {                    mySensorManager.unregisterListener(magneticiListener, sensore);                                        }