Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Sensor TYPE_LINEAR_ACCELERATION de Android: ¿qué muestra?

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

Entonces, suponiendo que la orientación del teléfono no está cambiando, registré los datos del acelerómetro durante un tiempo especificado y calculé los parámetros de movimiento, uno de los cuales es la velocidad del coche al final de la prueba.

Funciona bastante bien, en una carretera recta, horizontal: error de un pocos por ciento.

Pero entonces descubrí que en el nivel 10 de la API hay un sensor virtual llamado TYPE_LINEAR_ACCELERATION y, por lo que entiendo, debe hacer lo que necesito: gravedad del filtro, cambios de orientación – para poder usarlo y obtener una aceleración lineal pura Del dispositivo móvil.

Pero en la vida real

Hice una aplicación sencilla, 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"); } 

Me atan 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 analizo el volcado de datos, calculando la velocidad como V = V0 + AT , donde V0 = 0 al principio, entonces – velocidad del 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.

Por lo tanto, la pregunta es:

¿Qué Sensor.TYPE_LINEAR_ACCELERATION realmente Sensor.TYPE_LINEAR_ACCELERATION ?

¿Dónde estoy equivocado, o algo está mal con la implementación de Sensor.TYPE_LINEAR_ACCELERATION ?

Utilicé el teléfono Samsung Nexus S.

  • Lectura de la temperatura a través de DHT11 usando Android Things
  • ¿Cómo conseguir que la orientación del teléfono Android coincida con la orientación humana?
  • ¿Cómo obtener el azimut de un teléfono con lecturas de brújula y lecturas de giroscopio?
  • Android: cómo afectan las lecturas de los sensores a la duración de la batería
  • Android - Aceleración hacia abajo (smash)
  • Implementación de JKalman en Android
  • Uso del sensor de orientación para apuntar hacia una ubicación específica
  • La brújula android parece poco fiable
  • 4 Solutions collect form web for “Sensor TYPE_LINEAR_ACCELERATION de Android: ¿qué muestra?”

    ¡Pregunta muy interesante !!!!

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

    1) TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, ecc se implementan sólo para Android 2.3 (y arriba) Así que tengo Android 2.2 y no puedo probarlos.

    2) TYPE_LINEAR_ACCELERATION no es tan exacto como lo sería, porque hay algún problema simple cuando se suprime la gravedad. De hecho es un "sensor de fusión" que utiliza el acelerómetro y la orientación para saber dónde se dirige la gravedad y luego subs. eso.

    Aquí he encontrado una respuesta muy útil que lo explica:

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

    TYPE_ACCELEROMETER utiliza el acelerómetro y sólo el acelerómetro. Devuelve eventos de acelerómetro en bruto, con un mínimo o ningún procesamiento en absoluto.

    TYPE_GYROSCOPE (si está presente) utiliza el giroscopio y sólo el giroscopio. Como arriba, devuelve eventos sin procesar (velocidad angular un rad / s) sin procesamiento en absoluto (sin compensación de compensación / escala).

    TYPE_ORIENTATION está obsoleto. Devuelve la orientación como guiñada / tono / rollo en grados. No está muy bien definido y sólo se puede confiar en cuando el dispositivo no tiene "rollo". Este sensor utiliza una combinación del acelerómetro y el magnetómetro. Marginalmente mejores resultados se pueden obtener usando los ayudantes de SensorManager. Este sensor es muy "procesado".

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

    En Nexus S y Xoom, el giroscopio no se utiliza actualmente. Se comportan como si no hubiera gyro disponible, como en Nexus One o Droid. Estamos planeando mejorar esta situación en un futuro lanzamiento.

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

    Espero que esto ayude,

    Mathias

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

    Un poco más de precisión se puede llegar con el filtro de Kalman, pero no tengo ni idea de cómo …

    Me doy cuenta de que mi respuesta es bastante tarde. Me topé 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á sólo cuando vy a estén exactamente en la misma dirección. Y cualquier desviación haría que los errores se sumaran. La aceleración y la velocidad son cantidades vectoriales, y deben tratarse como tales. Usted debe hacer vx = ux + ax t, vy = uy + ay t y vz = uz + az t. Y entonces v = sqrt (vx ^ 2 + vy ^ 2 + vz ^ 2).

    TYPE_LINEAR_ACCELERATION no muestra los datos "crudos" del sensor, muestra los datos que fueron procesados ​​por el filtro 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 coche tiene aceleración bastante constante que no puede pasar el filtro. Si cambia su aceleración muy rápido presionando los frenos y luego presionando el pedal del acelerómetro y luego de nuevo a los frenos entonces TYPE_LINEAR_ACCELERATION mostraría el resultado bastante correcto, de lo contrario siempre mostrará menos que el valor de aceleración real.

    Utilice TYPE_ACCELEROMETER y, a continuación, quite 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 rápida aceleración cambiante que dura menos de 1 segundo como moverte la mano emulando una pelea de caja o 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

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.