2012-01-10 8 views
5

Sto creando un'app in Android in cui ho bisogno di rilevare se la persona è caduta. So che questa domanda è stata posta e ha risposto a come utilizzare la matematica vettoriale in altri forum, ma non ne ottengo risultati accurati.Rileva se la persona cade verso il basso

Qui di seguito è il mio codice per rilevare la caduta:

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

    if (aaa<=6.0) { 
     min=true; 
     //mintime=System.currentTimeMillis(); 
    } 

    if (min==true) { 
     i++; 
     if(aaa>=13.5) { 
     max=true; 
     } 
    } 

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

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

Per spiegare il codice di cui sopra ho usato la somma vettoriale e controllando se il valore ha raggiunto inferiore o uguale a 6 (mentre caduta) e improvvisamente una maggiore di 13,5 (durante l'atterraggio) per confermare la caduta.

Ora mi è stato detto nel forum che se il dispositivo è ancora la somma vettoriale restituirà il valore di 9,8. Durante l'autunno dovrebbe essere vicino a 0 e dovrebbe arrivare a circa 20 durante l'atterraggio. Questo non sembra accadere nel mio caso. Per favore qualcuno può suggerire se sto sbagliando dovunque?

+3

Il mio suggerimento è ... Trova un materasso e fai dei test da solo. Fai una piccola app registrando tutti i valori rilevanti e prendili da lì. – Cheesebaron

+0

Ho fatto alcuni test sull'app e sono passati a circa 6 mentre cadevo, 15 mentre colpivo il terreno che non sono sicuro sia corretto o sbagliato. – Karan

+0

Hai trovato il codice corretto per questo? Sono nello stesso posto, puoi postare la tua risposta, mi sarà molto utile.Grazie. –

risposta

1

seguito accadrà se persona/telefono cade:

  • assoluto valore vettore accelerazione va a 0 (con un po 'di rumore naturalmente)
  • ci sarà equo picco di valore del vettore assoluto di atterraggio (fino al valore massimo previsto dalla accelerometro)

Quando il telefono è immobile, si dispone di vettore di modulo terra gravità verso l'alto

Il tuo codice è fondamentalmente corretto, ma userei un po 'di media perché gli accelerometri usati nei telefoni sono poco costosi - rumorosi e privi di precisione

+1

Scusa, non sono riuscito a capire cosa intendi facendo la media. Sarebbe bello se tu potessi elaborare un po 'di più. – Karan

7

C'è un ragazzo che ha sviluppato un'app per Android per questo. Forse puoi ottenere alcune informazioni dal suo sito: http://ww2.cs.fsu.edu/~sposaro/iFall/. Ha anche fatto un articolo che spiega come ha rilevato la caduta. È davvero interessante, dovresti dare un'occhiata!

collegamento per la carta: http://ww2.cs.fsu.edu/~sposaro/publications/iFall.pdf

Ripresa, il rilevamento caduta si basa sul risultante dell'accelerazione X-Y-Z. Sulla base di questo valore:

  1. In caso di caduta, la caduta inizia generalmente con un periodo di caduta libera, facendo sì che il risultato scenda notevolmente sotto 1 g.
  2. Sull'impatto a terra, c'è un picco nell'ampiezza del risultante, con valori superiori a 3g.
  3. Dopodiché, se la persona non può muoversi a causa della caduta, la risultante rimarrà vicino a 1G.
1

Per aggiungere la media al segnale si intende: - media mobile. Dipende dalle dimensioni della tua finestra. Per esempio. Diciamo che ho un vettore con i seguenti numeri: 1,2,3,4,5,6. e la mia dimensione della finestra è 2. Quindi la media mobile è di prendere ogni due numeri dal tuo vettore e fare una media di 2. Quindi devi prendere 1 + 2/2, e quindi spostarne uno per i due successivi. 2 + 3/2 e così via.

Problemi correlati