Android ed utilizzo_dei_sensori
-
Upload
danilo-riso -
Category
Technology
-
view
1.804 -
download
3
description
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 : [email protected]
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); }