2012-01-10 18 views
5

Estoy creando una aplicación en Android donde necesito detectar si la persona se ha caído. Sé que esta pregunta ha sido formulada y respondida sobre el uso de las matemáticas vectoriales en otros foros, pero no obtengo los resultados precisos.Detecta si la persona se cae

A continuación se muestra el código para detectar la caída:

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

Para explicar el código anterior he utilizado la suma de vectores y comprobar si el valor ha alcanzado inferior o igual a 6 (mientras otoño) y de repente mayor de 13.5 (mientras aterriza) para confirmar la caída.

Ahora me dijeron en los foros que si el dispositivo sigue siendo el vector sum devolverá el valor de 9.8. Mientras caiga, debería estar cerca de 0 y debería ir a alrededor de 20 mientras aterriza. Esto no parece suceder en mi caso. Por favor, ¿alguien puede sugerir si me estoy equivocando en alguna parte?

+3

Mi sugerencia es ... Encuentre un colchón y haga algunas pruebas por su cuenta. Haga una pequeña aplicación registrando todos los valores relevantes y tómela desde allí. – Cheesebaron

+0

He hecho algunas pruebas en la aplicación y va a alrededor de 6 mientras caigo, 15 al tocar el piso, lo que no estoy seguro es correcto o incorrecto. – Karan

+0

¿Has encontrado el código de trabajo correcto para esto? Estoy en el mismo lugar, ¿pueden publicar su respuesta ?, será realmente útil para mí.Gracias. –

Respuesta

1

Después pasará si la persona/teléfono cae:

  • valor absoluto vector aceleración va a 0 (con un poco de ruido por supuesto)
  • habrá pico justo en el valor del vector absoluta en el aterrizaje (hasta al valor máximo proporcionado por el acelerómetro)

Cuando el teléfono está inmóvil, usted tiene el vector de módulo gravedad de la tierra hacia arriba

Su código es básicamente correcto, pero utilizaría un promedio porque los acelerómetros utilizados en los teléfonos son basura barata: ruidosa y carente de precisión

+1

Lo siento, realmente no pude entender lo que quiere decir al hacer un promedio. Sería genial si puedes elaborar un poco más. – Karan

7

Hay un tipo que desarrolló una aplicación de Android para eso. Tal vez pueda obtener información de su sitio: http://ww2.cs.fsu.edu/~sposaro/iFall/. También hizo un artículo explicando cómo detectó la caída. Es realmente interesante, ¡deberías echarle un vistazo!

Enlace para el papel: http://ww2.cs.fsu.edu/~sposaro/publications/iFall.pdf

reanudación, la detección de caídas se basa en la resultante de la aceleración X-Y-Z. Según este valor:

  1. Al caer, la caída generalmente comienza con un período de caída libre, por lo que el resultado cae significativamente por debajo de 1 g.
  2. En el impacto en el suelo, hay un pico en la amplitud de la resultante, con valores superiores a 3g.
  3. Después de eso, si la persona no pudo moverse debido a la caída, la resultante se mantendrá cerca de 1G.
1

Para agregar un promedio a su señal significa: - promedio móvil. Depende del tamaño de tu ventana. Por ejemplo. Digamos que tengo un vector con los siguientes números: 1,2,3,4,5,6. y el tamaño de mi ventana es 2. Entonces, la media móvil es tomar cada dos números de tu vector y promediarlos por 2. Entonces tomarías 1 + 2/2, y luego moverías uno a los siguientes dos. 2 + 3/2, y así sucesivamente.

Cuestiones relacionadas