Sensor TYPE_LINEAR_ACCELERATION de Android: ¿qué muestra?

Estoy desarrollando una aplicación para el seguimiento de la aceleración del automóvil. Utilicé el acelerómetro estándar, calibrándolo en posición específica de antemano.

Luego, asumiendo que la orientación del teléfono no está cambiando, registré los datos del acelerómetro durante un tiempo específico y los parámetros de movimiento calculados, uno de los cuales es la velocidad del automóvil al final de la prueba.

Funciona bastante bien, en una carretera horizontal recta: error de un pequeño porcentaje.

Pero luego descubrí que en API-nivel 10 hay un sensor virtual llamado TYPE_LINEAR_ACCELERATION y, por lo que yo entiendo, debe hacer lo que necesito: filtrar la gravedad, la orientación cambia, así que puedo usarlo y obtener una aceleración lineal pura de dispositivo móvil.

PERO en la vida real …

Hice una aplicación simple, que hace una pequeña prueba:

 //public class Accelerometer implements SensorEventListener { ... public void onSensorChanged(SensorEvent se) { if(!active) return; lastX = se.values[SensorManager.DATA_X]; lastY = se.values[SensorManager.DATA_Y]; lastZ = se.values[SensorManager.DATA_Z]; long now = System.currentTimeMillis(); interval = now - lastEvetn; lastEvetn = now; out.write(Float.toString(lastX) + ";" + Float.toString(lastY) + ";" + Float.toString(lastZ) + ";" + Long.toString(interval) + "\n"); } 

Ato a un oyente con los siguientes parámetros:

  mSensorManager.registerListener(linAcc, mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), SensorManager.SENSOR_DELAY_GAME); 

Funciona bien, pero cuando analicé el volcado de datos, calculando la velocidad como V = V0 + AT , donde V0 = 0 al principio, luego – velocidad de intervalo antes de esto, A = acceleration (SQRT (x*x+y*y+z*z)) (t = tiempo de intervalo), eventualmente obtengo una velocidad muy baja, tres veces menos que la velocidad real.

Cambiar el tipo de sensor a TYPE_ACCELEROMETER , calibrar y usar la misma fórmula para calcular la velocidad: obtengo buenos resultados, mucho más cerca de la realidad.

Entonces, la pregunta es:

¿Qué Sensor.TYPE_LINEAR_ACCELERATION realmente Sensor.TYPE_LINEAR_ACCELERATION ?

¿Dónde estoy equivocado o hay algún problema con la implementación de Sensor.TYPE_LINEAR_ACCELERATION ?

Utilicé el teléfono Samsung Nexus S.

    Pregunta muy interesante !!!!

    Estoy desarrollando algo similar a tu aplicación. Lo que encontré sobre TYPE_LINEAR_ACCELERATION no es feliz para mí.

    1) TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, ecc están implementados solo para Android 2.3 (y versiones superiores) Así que tengo Android 2.2 y no puedo probarlos.

    2) TYPE_LINEAR_ACCELERATION no es tan preciso como lo sería, porque hay algunos problemas simples al restar la gravedad. De hecho, es una “fusión de sensores” que usa acelerómetro y orientación para saber hacia dónde se dirige la gravedad y luego se sumerge. eso.

    Aquí encontré una respuesta muy útil que lo explica:

    https://groups.google.com/forum/#!topic/android-developers/GOm9yhTFZaM

    TYPE_ACCELEROMETER utiliza el acelerómetro y solo el acelerómetro. Devuelve eventos de acelerómetro sin procesar, con un procesamiento mínimo o nulo.

    TYPE_GYROSCOPE (si está presente) usa el giroscopio y solo el giroscopio. Como en el caso anterior, devuelve eventos en bruto (velocidad angular un rad / s) sin procesamiento alguno (sin compensación de desplazamiento / escala).

    TYPE_ORIENTATION está en desuso. Devuelve la orientación como yaw / pitch / roll en degres. No está muy bien definido y solo se puede confiar en él cuando el dispositivo no tiene “rollo”. Este sensor usa una combinación del acelerómetro y el magnetómetro. Se pueden obtener resultados ligeramente mejores utilizando los ayudantes de SensorManager. Este sensor es muy “procesado”.

    TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, TYPE_ROTATION_VECTOR son sensores “fusionados” que devuelven respectivamente el vector de aceleración, gravedad y rotación lineal (un cuaternión). No se define cómo se implementan. En algunos dispositivos se implementan en h / w, en algunos dispositivos usan el acelerómetro + el magnetómetro, en algunos otros dispositivos usan el giroscopio.

    En Nexus S y Xoom, el giroscopio NO se usa actualmente. Se comportan como si no hubiera ningún giroscopio disponible, como en Nexus One o Droid. Estamos planeando mejorar esta situación en una versión futura.

    Actualmente, la única forma de aprovechar el giroscopio es usar TYPE_GYROSCOPE e integrar el resultado a mano.

    Espero que esto ayude,

    Mathias

    De todos modos, en varios lugares de la web no encontré la mejor palabra sobre el sensor del teléfono y su potencial, debido al hecho de que no son precisos …

    Se puede alcanzar algo más de precisión usando el filtro Kalman, pero no tengo idea de cómo …

    Me doy cuenta de que mi respuesta es bastante tarde. Me encontré con este hilo mientras buscaba información sobre TYPE_LINEAR_ACCELERATION.

    No es correcto hacer a = sqrt (ax ^ 2 + ay ^ 2 + az ^ 2) y luego hacer v = u + a t. Eso funcionará solo cuando v y a estén en la misma dirección. Y cualquier desviación haría que los errores se sumran. La aceleración y la velocidad son cantidades de vectores y deben tratarse como tales. Debería hacer vx = ux + ax t, vy = uy + ay t y vz = uz + az t. y luego v = sqrt (vx ^ 2 + vy ^ 2 + vz ^ 2).

    TYPE_LINEAR_ACCELERATION no muestra los datos “brutos” del sensor, muestra datos procesados ​​por filtros de alta frecuencia, por lo que la aceleración constante como la gravedad o cualquier otra aceleración que cambia lentamente no puede pasar a través del filtro.

    Su automóvil tiene una aceleración bastante constante que no puede pasar el filtro. Si cambia su aceleración muy rápido presionando los frenos, luego presionando el pedal del acelerómetro y luego volviendo a los frenos, TYPE_LINEAR_ACCELERATION mostrará el resultado bastante correcto, de lo contrario, siempre muestra menos que el valor real de aceleración.

    Use TYPE_ACCELEROMETER y luego elimine G (9.81) manualmente. En realidad, usted tiene que medir G usted mismo cuando la aceleración real es 0 y luego usar el valor TYPE_ACCELEROMETER como G. En mi caso es 9.6.

    TYPE_ACCELEROMETER es bueno para la aceleración de cambio rápido que dura menos de 1 segundo, como mover la mano emulando una caja o pelear con espada.

    TYPE_LINEAR_ACCELERATION es un vector tridimensional que indica la aceleración a lo largo de cada eje del dispositivo, sin incluir la gravedad. TYPE_ACCELEROMETER = TYPE_GRAVITY + TYPE_LINEAR_ACCELERATION