Autore Topic: Tesi su Android: Rilevamento di cadute tramite accelerometro  (Letto 4258 volte)

Offline themexican85

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus
  • Sistema operativo:
    Mac OS X
Tesi su Android: Rilevamento di cadute tramite accelerometro
« il: 06 Dicembre 2012, 09:09:34 CET »
0
Salve a tutti!
Sono un laureando in ing. informatica e come Tesi di laurea il prof. mi ha assegnato lo sviluppo di un'App per Android che sfruttando l'accelerometro, attraverso l'uso di opportuni algoritmi, riesce a determinare se una persona è caduta oppure no.
Dato che sono alle prime armi con lo sviluppo per Android, (mi sto dilettando con passaggio di parametri tra varie activity con intent) volevo qualche consiglio da voi su come procedere per il mio lavoro di tesi. 
In particolare modo, da dove mi consigliate di partire per lo sviluppo di questa applicazione? Gli algoritmi di rilevamento cadute li ho già (devo solo implementarli)  :-)
Grazie mille!!

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #1 il: 06 Dicembre 2012, 09:15:51 CET »
0
Dopo aver fatto girare un helloworld per testare sistema di sviluppo e emulatore, potresti partire da qualche tutorial di base per l'accelerometro.
A quick tutorial on coding Android’s accelerometer | TechRepublic
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline themexican85

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus
  • Sistema operativo:
    Mac OS X
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #2 il: 06 Dicembre 2012, 11:08:46 CET »
0
Grazie mille!! Siete fantastici.
Ho creato l'App tramite tutorial e funziona perfettamente sul mio Nexus. Adesso continuerò ad esercitarmi con altre prove modificate da me. Speriamo bene, anche perchè mi sto appassionando molto a questo nuovo mondo che finora non conoscevo, e ringrazio il cielo per aver trovato anche questo splendido Forum. ;-)

Offline themexican85

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus
  • Sistema operativo:
    Mac OS X
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #3 il: 07 Dicembre 2012, 14:50:34 CET »
0
Salve a tutti!!
Eccomi quì a chiedere di nuovo aiuto sul mio progetto in android. Sto prendendo confidenza con l'uso dell'Accelerometro, ma mi trovo davanti a un problema.. L'Accelerometro misura l'accelerazione lungo gli assi x,y,z come variazione di velocità rispetto a una variazione di tempo (dv(t)/dt), ma se dovessi calcolare la velocità a partire da queste informazioni come posso fare?Ho da sviluppare il seguente algoritmo (composto da 3 sottoalgoritmi) e dovrei verificare se la velocità prima dell'impatto è > 0.7 m/s ... Help me please ???

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #4 il: 07 Dicembre 2012, 15:08:09 CET »
0
Con qualche variante è una domanda che ricorre molto spesso, puoi addirittura provare a leggerti i vari thread che in passato ne hanno parlato. Però si tratta di qualcosa che non ha niente a che vedere con la programmazione Android.

Il problema fondamentale è che in teoria si può risalire alla velocità dall'accelerazione, ma nella pratica gli accelerometri del dei cellulari sono quasi inusabili a questo scopo. Una tra tutte, non hai modo di scorporare l'accelerazione di gravità in quanto non ne conosci le componenti sui vari assi.

Puoi facilmente rendertene conto riproducendo qualche "caduta" e memorizzando i tracciati dell'accelerazione sui tre assi. Partendo da questi dati reali, con matlab o analoghi provi ad estrarre quella dovrebbe essere la velocità di caduta. Se riesci a mettere a punto a tavolino un algoritmo, implementarlo nell'applicazione sarà banale.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #5 il: 07 Dicembre 2012, 16:21:49 CET »
0
Utilizzare solo i dati provenienti da 3 accelerometri posti su 3 assi distinti per rilevare una caduta in una prima analisi sarebbero sufficienti. In pratica usare solo gli accelerometri non è sufficiente, per vari motivi come è stato già detto, basta pensare all'ascensore di Einstein e il principio di equivalenza.

I telefoni ultimamente oltre all'accelerometri hanno altri sensori come il giroscopio, il magnetometro, bussola, ecc... Combinare i dati di accelerazione e del giroscopio si riesce meglio a individuare una potenziale caduta. Esistono articoli a riguardo ad esempio:

http://rt.cs.virginia.edu/~stankovic/psfiles/bsn09-1.pdf

o altri basta cercare.
adb logcat | tee /tmp/logcat | grep TAG

Offline themexican85

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus
  • Sistema operativo:
    Mac OS X
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #6 il: 08 Dicembre 2012, 11:38:33 CET »
0
Grazie mille!
Si, avevo letto quell'articolo e infatti stavo pensando anche di utilizzare il giroscopio. La cosa che non mi è tanto chiara è che nell'algoritmo di fall detection vengono utilizzati due sensori.. cercherò di adattarlo a un solo sensore, parlandone anche con il mio prof. Vi ringrazio per il supporto, se ho problemi vi faccio sapere. ;-)

Offline themexican85

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus
  • Sistema operativo:
    Mac OS X
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #7 il: 10 Dicembre 2012, 13:37:04 CET »
0
Buongiorno!!
Grazie ai vostri preziosi consigli, sono riuscito a fare una piccolissima app che popola 6 TextView tramite i dati acquisiti dai sensori di Accelerazione e di Orientamento. Volevo chiedervi qualche delucidazione in più riguardo quest'ultimo sensore. Esso fornisce i dati in questo modo:
 - values[0]: Angolo tra il polo nord magnetico e l'asse y. 0=Nord, 90=Est, 180=Sud, 270=ovest.
 - values[1]: Pitch, rotazione intorno l'asse x.
 - values[2]: Roll, rotazione intorno l'asse y.

Dato che per il sensore di Accelerazione uso come informazione il "delta", cioè la variazione di accelerazione. Volevo sapere se per ottenere l'orientamento del dispositivo, mi basta recuperare i vari values[] oppure c'è bisogno di calcolarmi anche il delta?
Vi posto il codice della classe MainActivity in modo da poter essere più chiaro.  :-) Grazie Mille
Codice (Java): [Seleziona]
package com.example.prova;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity implements SensorEventListener {

        private SensorManager sm;
    private Sensor Accel, Orient;
    private float [] sensorData;
    private long [] mTimestamp;
    TextView AccX;
    TextView AccY;
    TextView AccZ;
    TextView OrX;
    TextView OrY;
    TextView OrZ;
   
    private float ALastX, ALastY, ALastZ;
    private float OLastX, OLastY, OLastZ;
       
        private boolean AInitialized, OInitialized;
        private final float NOISE = (float) 2.0;
   

   
    @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
                Accel = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        Orient = sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        sm.registerListener((SensorEventListener) this, Accel, SensorManager.SENSOR_DELAY_FASTEST);
        sm.registerListener((SensorEventListener) this, Orient, SensorManager.SENSOR_DELAY_FASTEST);
               
        sensorData = new float[6];
        mTimestamp = new long[2];
               
               
                AccX=(TextView)findViewById(R.id.accx);
                AccY=(TextView)findViewById(R.id.accy);
                AccZ=(TextView)findViewById(R.id.accz);
                OrX=(TextView)findViewById(R.id.orx);
                OrY=(TextView)findViewById(R.id.ory);
                OrZ=(TextView)findViewById(R.id.orz);
               
        }
    @Override
    protected void onResume() {
                super.onResume();
                Accel = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
               
                sm.registerListener(this, Accel, SensorManager.SENSOR_DELAY_NORMAL);
               
                }
   
    protected void onPause() {
                super.onPause();
                sm.unregisterListener(this);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.activity_main, menu);
                return true;
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
                // TODO Auto-generated method stub
               
        }

        @Override
        public void onSensorChanged(SensorEvent event) {
                Sensor sensor = event.sensor;
        float [] values = event.values;
                synchronized (this) {
       
                if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

                                float x = event.values[0];
                               
                                float y = event.values[1];
                               
                                float z = event.values[2];
                               
                               
                                if (!AInitialized) {
                                  ALastX = x;
                                  ALastY = y;
                                  ALastZ = z;
                                  AccX.setText("Ax: 0.0");
                                  AccY.setText("Ay: 0.0");
                                  AccZ.setText("Az: 0.0");
                                  AInitialized = true;
                                } else {

                                  float deltaX = Math.abs(ALastX - x);
                                  float deltaY = Math.abs(ALastY - y);
                                  float deltaZ = Math.abs(ALastZ - z);
                               
                                if (deltaX < NOISE) deltaX = (float)0.0;
                                if (deltaY < NOISE) deltaY = (float)0.0;
                                if (deltaZ < NOISE) deltaZ = (float)0.0;
                               
                                ALastX = x;
                                ALastY = y;
                                ALastZ = z;

                        sensorData [0] = deltaX;
                    sensorData [1] = deltaY;
                    sensorData [2] = deltaZ;
                   
                    if ((sensorData[3] != 0)||(sensorData[4] != 0)||(sensorData[5] != 0))
                    {
                                AccX.setText("Ax :"+Float.toString(sensorData [0]));
                                AccY.setText("Ay :"+Float.toString(sensorData [1]));
                                AccZ.setText("Az :"+Float.toString(sensorData [2]));
                               
                    }

                       
                       
                    }
                }
                else if (event.sensor.getType() == Sensor.TYPE_ORIENTATION ) {

                       
                        sensorData [3] = values[0];
                    sensorData [4] = values[1];
                    sensorData [5] = values[2];

                       
                    if ((sensorData[0] != 0)||(sensorData[1] != 0)||(sensorData[2] != 0))
                    {
                                OrX.setText("Ox :"+Float.toString(sensorData[3]));
                                OrY.setText("Oy :"+Float.toString(sensorData[4]));
                                OrZ.setText("Oz :"+Float.toString(sensorData[5]));
                       
                    }
                }
               
                }
       
        }

               
       
        @Override
    public void onDestroy() {
    super.onDestroy();
    // unregister listener
    sm.unregisterListener(this);
   
    }
}

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #8 il: 10 Dicembre 2012, 14:17:37 CET »
0
Il giroscopio è sempre assoluto, se vuoi quello che tu chiami delta, basta la lettura a tempi prefissati e fare la differenza tra il valore attuale e quello precedente.
adb logcat | tee /tmp/logcat | grep TAG

Offline themexican85

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus
  • Sistema operativo:
    Mac OS X
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #9 il: 13 Dicembre 2012, 11:34:19 CET »
0
Buongiorno a tutti!!
Leggendo vari tutorial sono riuscito più o meno a mettere su un algoritmo di rilevamento cadute.. Sostanzialmente quando una persona(o cellulare) cade si ha un'accelerazione iniziale che tende a 0g, mentre si ha uno spike nel momento dell'impatto che fa salire l'accelerazione intorno ai 2/3 g (dipende da dove è installato il dispositivo).
Ho un problema nell'algoritmo di rilevamento:
-Imposto una soglia minima di 6.0 m/s^2 e l'algoritmo rileva il superamento di tale soglia settando una variabile booleana a true
-Se entro in tale if, controllo con un altro if se si supera una soglia massima di 13.0 m/s^2. Il problema è a questo punto dell'algoritmo, in pratica anche se tale soglia viene superata, l'algoritmo non riesce ad entrare nel secondo if ed effettuare il controllo della seconda soglia.
Ho provato anche a impostare i SENSOR_DELAY.. ai vari valori, ma nisba. Vi posto il codice sperando che possiate darmi una mano. Grazie
Codice (Java): [Seleziona]
public void onSensorChanged(SensorEvent arg0) {
          // TODO Auto-generated method stub
          if (arg0.sensor.getType()==Sensor.TYPE_ACCELEROMETER) {
            double gvt=SensorManager.STANDARD_GRAVITY;

            float vals[] = arg0.values;
            //int sensor=arg0.sensor.getType();
            double xx=arg0.values[0];
            double yy=arg0.values[1];
            double zz=arg0.values[2];
            double aaa=Math.round(Math.sqrt(Math.pow(xx, 2)+Math.pow(yy, 2)+Math.pow(zz, 2)));
           
            Log.i("ACCEL", Double.toString(aaa));

            boolean min = false;
            boolean max = false;
           
            int i = 0;
           
                if (aaa<=6.0) {
                  //Soglia minima superata
              min=true;
              Log.i("SOGLIA MIN", Double.toString(aaa));
              //mintime=System.currentTimeMillis();
            }


                if (min==true) {
              i++;
              Log.i("AGGIORNO i", Integer.toString(i));
              if(aaa>=13.5) {
                max=true;
                Log.i("SOGLIA MAX", Double.toString(aaa));
              }
            }

            if (min==true && max==true) {
              Toast.makeText(this,"FALL DETECTED!!!!!" ,Toast.LENGTH_LONG).show();
              i=0;
              min=false;
              max=false;
            }

            if (i>4) {
              i=0;
              min=false;
              max=false;
            }
          }
        }

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #10 il: 13 Dicembre 2012, 13:56:29 CET »
0
Ti ricordo che quel metodo è un evento e le variabili locali non sono persistenti tra una chiamata e l'altra.

Un'altra cosa "Math.pow" è lento, deve essere utilizzato solo se l'esponente non è un intero, è più veloce e si risparmia una chiamata con la moltiplicazione diretta.
« Ultima modifica: 17 Dicembre 2012, 01:02:22 CET da iceweasel »
adb logcat | tee /tmp/logcat | grep TAG

Offline themexican85

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus
  • Sistema operativo:
    Mac OS X
R: Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #11 il: 15 Dicembre 2012, 14:40:46 CET »
0
Salve!
Chiedo a voi perché sto impazzendo con questo algoritmo..
Come posso fare per acquisire dati dall'accelerometro (e da altri sensori) ogni tot secondi in modo tale che appena si verifica una condizione, posso analizzare tali dati (memorizzati ad esempio in un arrayList) e verificare un'altra condizione? Grazie :'(

Inviato dal mio Galaxy Nexus con Tapatalk 2


Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #12 il: 15 Dicembre 2012, 17:07:58 CET »
0
API di Android permette di programmare timer in diversi modi, dal one-shot a periodici. E' possibile creare e gestire thread per leggere i dati dai sensori e per elaborazioni complesse in background. I dati possono essere memorizzati in vario modo, con strutture dati in memoria, come gli array e non solo, possono essere salvati in file esterni per successive elaborazioni.

Tutto quello che hai scritto è fattibile, dipende dalle tue capacità di programmazione e conoscenze.
adb logcat | tee /tmp/logcat | grep TAG

Offline themexican85

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus
  • Sistema operativo:
    Mac OS X
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #13 il: 15 Dicembre 2012, 17:51:50 CET »
0
Ciao,
purtroppo sono nuovo della programmazione Android.. ho un discreto background in Java, e se mi rivolgo a voi è proprio perchè non so come potrei gestire la cosa. Se potete fornirmi un esempio di come programmare un timer vi sarei molto grato.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Tesi su Android: Rilevamento di cadute tramite accelerometro
« Risposta #14 il: 16 Dicembre 2012, 11:28:27 CET »
0
Basta cercare, per accedere in background ai sensori è meglio utilizzare i service, qui c'è un esempio:

Acquisizione dati da accelerometri (in generale da sensori) - Android Developers Italia

Per le elaborazioni in background si usano i thread, un tutorial:

[medio] Introduzione ai Thread - Android Developers Italia

Puoi esaminare i sorgenti di applicazioni open souce, ad esempio:

https://github.com/bagilevi/android-pedometer
https://github.com/jamesonwilliams/AndroidPersistentSensors



adb logcat | tee /tmp/logcat | grep TAG