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?

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.

  • Android acelerómetro, uso de sensores y consumo de energía
  • Cómo calcular el movimiento del teléfono en la dirección vertical del resto?
  • Acelerómetro con filtro de paso bajo en Android
  • Diferentes valores de acelerómetros en varios dispositivos
  • ¿Cuál es la diferencia entre sensores de "gravedad" y "aceleración" en Android?
  • Aceleración del sistema de coordenadas del dispositivo en sistema de coordenadas absoluto
  • Detectar algoritmo de giro de 360 ​​grados
  • Contador de pasos en Android: ¿siempre activado?
  • Componentes de la gravedad del acelerómetro
  • Calcular la altura de mi teléfono
  • ¿Dónde puedo encontrar recursos y muestras de código para hacer uso de la señal de un acelerómetro?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.