Android ed utilizzo_dei_sensori

Post on 04-Jun-2015

1.804 views 3 download

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

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 : danilo.riso@gmail.com

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.

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.

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

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);

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.

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;

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.

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.

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.

Utilizzo dei sensori con Android

Geomagnetic Data Analyzer 

 Gestione dei sensori: Implementazione

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.

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.

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

   

android.hardware.Sensor;

android.hardware.SensorManager; 

android.hardware.SensorEvent; 

android.hardware.SensorEventListener.

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)   

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).

 

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;

 

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; 

 

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

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

 • "TYPE_TEMPERATURE": riferito al sensore di

temperatura; 

 

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. 

 

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.

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. 

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.

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) {

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

android.hardware.SensorEvent: classe che rappresenta gli eventi e le informazioni che provengono dai 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.

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;   

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;

  

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;

 

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.

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'; 

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'.

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: 

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); 

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:

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++;        }   };

       

        }

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.

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:

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

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

       

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. 

       

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);                    ...                 }            }

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;

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;

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

        

Geomagnetic Data AnalyzerGestione dei sensori: Implementazione

   Nel nostro codice di esempio:

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