Orientación desde Android Acelerómetro
Estoy probando la salida del acelerómetro en 2 dispositivos diferentes (Elocity A7 y Archos 7 Home Tablet), pero el sensor parece estar dando resultados diferentes. Lo tengo programado para establecer en modo horizontal, pero el eje xey parecen ser el oppisite entre los 2 dispositivos. El eje x devuelve 10 cuando se mantiene perpendicular al suelo y el eje Archos X devuelve 0. La tableta Elocity es el androide 2.2 y el Archos es 2.1. ¿Puede alguien señalarme en la dirección correcta como la forma de obtener la orientación del acelerómetro en sincronía entre estos 2 dispositivos?
- Detectar si Android está en un coche
- ¿Cómo mejorar la precisión de los sensores de acelerómetro y brújula?
- ¿Qué es el acelerómetro androide?
- Interpretación FFT
- Calculando la distancia usando aceleración lineal android
- Valor de Android: Sensor.getResolution ()
- Detectar actividad del usuario (correr, andar en bicicleta, conducir) usando Android
- Rotar marcador según la dirección del usuario en Google Maps V2 Android
- Cómo medir la inclinación del teléfono en el plano XY usando acelerómetro en Android
- Problemas relacionados con el giroscopio con la orientación del dispositivo
- ¿Es posible detectar movimiento cuando la pantalla está apagada?
- ¿Cómo puedo obtener la dirección del movimiento usando un acelerómetro?
- Utilizando acelerómetro, giroscopio y brújula para calcular el movimiento del dispositivo en el mundo 3D
De hecho, los ejes del acelerómetro están relacionados con la orientación por defecto del dispositivo.
Aquí cómo tratar con él:
static void canonicalOrientationToScreenOrientation( int displayRotation, float[] canVec, float[] screenVec) { final int axisSwap[][] = { { 1, -1, 0, 1 }, // ROTATION_0 {-1, -1, 1, 0 }, // ROTATION_90 {-1, 1, 0, 1 }, // ROTATION_180 { 1, 1, 1, 0 } }; // ROTATION_270 final int[] as = axisSwap[displayRotation]; screenVec[0] = (float)as[0] * canVec[ as[2] ]; screenVec[1] = (float)as[1] * canVec[ as[3] ]; screenVec[2] = canVec[2]; }
Esta solución fue proporcionada por NVidia. Consulte su libro blanco sobre el acelerómetro Android para obtener más detalles.
Sólo quería añadir algo a la respuesta de Hartok ya que no podía entenderlo al principio …
He reescrito el método para ser:
public static float[] adjustAccelOrientation(int displayRotation, float[] eventValues) { float[] adjustedValues = new float[3]; final int axisSwap[][] = { { 1, -1, 0, 1 }, // ROTATION_0 {-1, -1, 1, 0 }, // ROTATION_90 {-1, 1, 0, 1 }, // ROTATION_180 { 1, 1, 1, 0 } }; // ROTATION_270 final int[] as = axisSwap[displayRotation]; adjustedValues[0] = (float)as[0] * eventValues[ as[2] ]; adjustedValues[1] = (float)as[1] * eventValues[ as[3] ]; adjustedValues[2] = eventValues[2]; return adjustedValues; }
Exactamente lo mismo, sólo con nombres de variables más amigables para el usuario y vuelvo a crear el flotador internamente porque lo necesitaba así … Simplemente llame a esta función, coloque en getRotation y la matriz float event.values, compruebe los valores de su retorno Float array y elegir cualquier número que prefiera …
Espero que esto ayude a alguien!
Por lo que sé esto es debido a la orientación por defecto del dispositivo. Fe nuevas tabletas androides con Honeycomb tienen orientación vertical cuando se mantiene como en el paisaje en los teléfonos.
http://developer.android.com/reference/android/hardware/SensorEvent.html
En la documentación de Android hay información que:
El sistema de coordenadas se define en relación con la pantalla del teléfono en su orientación predeterminada. Los ejes no se intercambian cuando cambia la orientación de la pantalla del dispositivo.
El eje X es horizontal y apunta hacia la derecha, el eje Y es vertical y apunta hacia arriba y el eje Z apunta hacia el exterior de la cara frontal de la pantalla. En este sistema, las coordenadas detrás de la pantalla tienen valores de Z negativos.
Tal vez uno de estos dispositivos también tiene el paisaje como una orientación de retrato (predeterminado)?
Espero que te ayude de alguna manera.
Como se indicó anteriormente, la orientación predeterminada de la pantalla puede variar de un dispositivo a otro. Las coordenadas del acelerómetro siempre coincidirán con la orientación predeterminada de los dispositivos. Este comportamiento es diferente para coordenadas de pantalla. A medida que gira el dispositivo, las coordenadas de la pantalla giran también, de manera que (0, 0) es siempre la esquina superior izquierda de la pantalla. En un dispositivo con una orientación predeterminada de retrato, el bloqueo de la orientación a retrato garantizará que las coordenadas del sensor funcionen a lo largo del mismo eje que las coordenadas de la pantalla independientemente de la rotación. Por otro lado, el bloqueo de la orientación de la pantalla en posición vertical en un dispositivo con una orientación horizontal predeterminada hará que el eje del sensor funcione en una dirección diferente que el eje de la pantalla.
Este artículo: http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html explica esto en mayor profundidad, así como ofrece una solución para tratar el problema.
- Cómo servir un archivo en sdcard usando NanoHTTPD (dentro de Android)
- MultiDexApplication no reconocido