He estado tratando de conseguir mi cabeza alrededor de los Android sensores de orientación por un tiempo.
Pensé que yo entendí. Entonces me di cuenta de que no. Ahora bien, yo creo (espero) que tengo una mejor sensación de que de nuevo, pero todavía no estoy al 100%. Voy a intentar explicar mi parches entendimiento de la misma y espero que la gente será capaz de corregir si me equivoco en partes o llenar los espacios en blanco.

Me imagino que estoy a 0 grados de longitud (meridiano de greenwich) y 0 grados de latitud (ecuador). Esta ubicación es realmente en el mar frente a la costa de África, pero tengan paciencia conmigo. Tengo mi teléfono en frente de mi rostro, de modo que la parte inferior del teléfono puntos a mis pies; soy yo mirando hacia el Norte (mirando hacia Greenwich) por lo tanto, el lado derecho del teléfono puntos de Oriente hacia África. En esta orientación (con referencia al diagrama de abajo) tengo el eje X apuntando hacia el Este, el eje Z apunta hacia el Sur y el eje y el punto hacia el cielo.

Teléfono Android orientación de la visión de conjunto de la brújula

Ahora los sensores en el teléfono permiten trabajar la orientación (no lugar) del dispositivo en esta situación. Esta parte siempre me confunde, probablemente porque quería entender cómo algo trabajado antes que aceptar que no sólo el trabajo. Parece que el teléfono funciona su orientación mediante una combinación de dos técnicas diferentes.

Antes de llegar a eso, imagínense estar de nuevo en pie en ese imaginario pedazo de tierra a 0 grados de latitud y longitud de pie en la dirección mencionada anteriormente. Imaginemos, también, que está con los ojos vendados y sus zapatos están fijos a un parque de la rotonda. Si alguien la empuja en la parte de atrás va a caer hacia adelante (hacia el Norte) y puso ambas manos para amortiguar su caída. Del mismo modo, si alguien la empuja el hombro izquierdo que se caiga en su mano derecha. El oído interno tiene «gravitacional sensores» (vídeo de youtube) que permiten detectar si se están cayendo hacia adelante/atrás, o caer a la izquierda/derecha o cayendo hacia abajo (o arriba!!). Por lo tanto, los seres humanos pueden detectar la alineación y rotación alrededor de la misma ejes X y Z, como el teléfono.

Ahora imagina a alguien ahora gira 90 grados en la rotonda, de manera que ahora están mirando hacia el Este. Usted se hace girar alrededor del eje Y. Este eje es diferente porque no se puede detectar biológicamente. Sabemos que estamos en ángulo por una cierta cantidad, pero no sabemos la dirección en relación con el planeta del polo Norte magnético.
En su lugar debemos utilizar una herramienta externa… una brújula magnética. Esto nos permite determinar en qué dirección nos estamos enfrentando. Lo mismo es cierto con nuestro teléfono.

Ahora el teléfono también cuenta con una de 3 ejes acelerómetro. He NO idea de cómo funcionan realmente pero mi forma de visualizar es imaginar la gravedad constante y uniforme de la ‘lluvia’, cayendo desde el cielo y a imaginar los ejes en la figura anterior como tubos, lo cual puede detectar la cantidad de lluvia que fluye a través. Cuando el teléfono en posición vertical toda la lluvia fluye a través de la Y ‘tubo’. Si el teléfono está poco a poco girado para que su pantalla se enfrenta el cielo de la cantidad de lluvia que fluye a través de la Y disminuirá a cero, mientras que el volumen a través de Z va a aumentar de manera constante hasta la cantidad máxima de lluvia fluye a través de. Del mismo modo, si ahora nos incline el teléfono hacia su lado de la X tubo eventualmente recoger la máxima cantidad de lluvia. Por lo tanto dependiendo de la orientación del teléfono mediante la medición de la cantidad de lluvia que fluye a través de los 3 tubos se puede calcular la orientación.

El teléfono también cuenta con una brújula electrónica que se comporta como una normal de la brújula – su «virtual» aguja » señala el norte magnético. Android combina la información de estos dos sensores con el fin de que siempre que un SensorEvent de TYPE_ORIENTATION se genera la values[3] matriz tiene

valores[0]: Azimut – (la brújula este del norte magnético)

los valores de[1]: el Tono, la rotación alrededor del eje x (es el teléfono se inclina hacia adelante o hacia atrás)

valores[2]: Roll, rotación alrededor del eje y (es el teléfono apoyado sobre su lado izquierdo o derecho)

Así que yo creo (es decir, no sé) la razón Android te da el azimut (la brújula) en lugar de la lectura de la tercera acelerómetro es que la brújula es más útil. No estoy seguro de por qué en desuso de este tipo de sensor, como ahora, se parece usted a registrar un oyente con el sistema de SensorEvents de tipo TYPE_MAGNETIC_FIELD. El evento value[] matriz de necesidades para bepassed en SensorManger.getRotationMatrix(..) método para obtener una matriz de rotación (ver abajo) que se pasa en la SensorManager.getOrientation(..) método.
¿Alguien sabe por qué el Android de equipo obsoleto Sensor.TYPE_ORIENTATION? Es una eficiencia cosa? Que es lo que está implícito en uno de los comentarios a una similar pregunta, pero usted todavía necesita para registrar un tipo distinto de escucha en la development/samples/Compass/src/com/example/android/compass/CompassActivity.java ejemplo.

Teléfono Android orientación de la visión de conjunto de la brújula
Teléfono Android orientación de la visión de conjunto de la brújula
Teléfono Android orientación de la visión de conjunto de la brújula

Me gustaría hablar de la matriz de rotación. (Aquí es donde me siento más seguro)
Así que tenemos encima las tres figuras de Android documentación, vamos a llamar a, B y C.

A = SensorManger.getRotationMatrix(..) el método de la figura y representa el Mundo de coordenadas del sistema de

B = Sistema de coordenadas utilizado por el SensorEvent de la API.

C= SensorManager.getOrientation(..) el método de la figura

Así que mi entendimiento es que representa el «mundo del sistema de coordenadas» supongo que se refiere a la forma en que lugares del planeta se dan como (latitud, longitud) pareja con una opcional (altura). X es el «coordenada» coordinar, Y es el «coordenada y» coordinar. Z apunta al cielo y representa la altitud.

Los teléfonos de sistema de coordenadas se muestra en la figura B se fija. Su eje Y siempre señala la parte superior. La matriz de rotación es constante calculada por el teléfono y permite el mapeo entre los dos. Así que estoy en lo cierto al pensar que la matriz de rotación se transforma el sistema de coordenadas de B a C? Así que cuando usted llama SensorManager.getOrientation(..) método que utilice la values[] matriz con los valores que corresponden a la figura C.
Cuando el teléfono está apuntando hacia el cielo de la matriz de rotación es la identidad de la matriz (la matriz matemática equivalente de 1) lo que significa que no hay asignación es necesario que el dispositivo esté alineado con el mundo del sistema de coordenadas.

Aceptar. Yo creo que es mejor parar ahora. Como dije antes, espero que la gente me diga donde arruiné o ayudado a la gente (o confundido a la gente aún más!)

  • Me gusta mucho esta pregunta. Yo no puedo contestar, pero me gusta.
  • Tim, ¿alguna vez te responda? He estado rascando mi cabeza en el mismo. Este es uno de los más pobremente documentada de la API que he visto nunca.
  • En realidad no tengo miedo. Yo tenía que seguir adelante. Algún día voy a volver a este tema.
  • Here tengo la misma pregunta, casi? Y el la Respuesta, la solución demasiado. Hecho público mi código en Github.
  • lo mismo me pregunto, me han implementado una brújula en un dispositivo android y funciona correctamente si tomé la ayuda de la internet su trabajo bien, pero lo que es confuso es… Supongo que mi dispositivo es el lugar en el terreno de la cara hacia mí y su apuntando hacia el norte ahora me tome mi móvil y ponerlo verticalmente por encima de mi cabeza y sin cara se sigue hacia mí. En primer lugar hizo la aguja debe cambiar su dirección y por qué. Según pienso, no debería ya que no he cambiado mi dirección, pero está cambiando en mi aplicación y todas las demás app que he descargado. ¿Alguien puede explicar por qué?
InformationsquelleAutor Tim | 2011-01-27

4 Comentarios

  1. 26

    Usted puede ser que desee comprobar hacia fuera el Una Pantalla Merece Otro artículo. Esto explica por qué se necesita la matriz de rotación.

    En pocas palabras, el teléfono sensores de utilizar siempre el mismo sistema de coordenadas, incluso cuando se gira el dispositivo.

    En aplicaciones que no están bloqueados a una sola orientación, el sistema de coordenadas de la pantalla cambia al girar el dispositivo. Por lo tanto, cuando se gira el dispositivo de su modo de vista por defecto, el sensor del sistema de coordenadas no es la misma como la pantalla del sistema de coordenadas. La matriz de rotación en este caso se utiliza para transformar Un a C (B siempre permanece fijo).

    He aquí un fragmento de código para mostrar cómo se puede utilizar.

    SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
    //Register this class as a listener for the accelerometer sensor
    sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
    SensorManager.SENSOR_DELAY_NORMAL);
    //...and the orientation sensor
    sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
    SensorManager.SENSOR_DELAY_NORMAL);
    //...
    //The following code inside a class implementing a SensorEventListener
    //...
    float[] inR = new float[16];
    float[] I = new float[16];
    float[] gravity = new float[3];
    float[] geomag = new float[3];
    float[] orientVals = new float[3];
    double azimuth = 0;
    double pitch = 0;
    double roll = 0;
    public void onSensorChanged(SensorEvent sensorEvent) {
    //If the sensor data is unreliable return
    if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
    return;
    //Gets the value of the sensor that has been changed
    switch (sensorEvent.sensor.getType()) {  
    case Sensor.TYPE_ACCELEROMETER:
    gravity = sensorEvent.values.clone();
    break;
    case Sensor.TYPE_MAGNETIC_FIELD:
    geomag = sensorEvent.values.clone();
    break;
    }
    //If gravity and geomag have values then find rotation matrix
    if (gravity != null && geomag != null) {
    //checks that the rotation matrix is found
    boolean success = SensorManager.getRotationMatrix(inR, I,
    gravity, geomag);
    if (success) {
    SensorManager.getOrientation(inR, orientVals);
    azimuth = Math.toDegrees(orientVals[0]);
    pitch = Math.toDegrees(orientVals[1]);
    roll = Math.toDegrees(orientVals[2]);
    }
    }
    }
    • tan solo mencionar que el azimut, inclinación y balanceo, NO son como los que salen de la obsoleta OrientationSensor. orientation[0] = orientation[0] >= 0 ? orientation[0]: orientation[0] + 360; normalice el azimut y if (orientation[1] <= -90) { orientation[1] += (-2*(90+orientation[1])); } else if(orientation[1] >= 90){ orientation[1] += (2*(90 - orientation[1])); } va a normalizar el tono
    • y a normalizar el rollo? O que no tienen ningún sentido?
    • Su normalización de azimut parece afectar: los valores van desde [-180,180] a [0, 360]. Pero los valores de tono llego ya están en [-90,90] por lo que la normalización se propone usted no tiene ningún efecto.
    • ¿Qué significa si después de comprobar (gravedad != null && geomag != null) , el valor de geomag es siempre 0, no importa cómo puedo mover la tablet? Podría ser una tableta sin geomag sensor?
  2. 3

    Roll es una función de la gravedad, una de 90 grados rollo pone todo de la gravedad en el registro x.

    El tono es el mismo, un 90 grados de pitch up pone a todos los componente de la gravedad en la y registro.

    De guiñada /Rúbrica /azimut no tiene ningún efecto sobre la gravedad, que es SIEMPRE en ángulos rectos a la gravedad, por lo tanto, no importa la forma en que usted se enfrenta a la gravedad será imeasurable.

    Esta es la razón por la que necesita una brújula para evaluar, tal vez eso tiene sentido?

  3. 0

    Yo estaba teniendo este problema así que yo mapa de lo que ocurre en diferentes direcciones.
    Si el dispositivo está montado en el paisaje de la moda, por ejemplo, en un coche de montaje de los ‘grados’ de la brújula parece funcionar de 0-275 (de las agujas del reloj) por encima de 269 ( entre el oeste y el norte) cuenta hacia atrás a partir de -90 a 0, luego hacia delante desde 0 a 269. 270 se convierte en -90

    Todavía En el paisaje, pero con el dispositivo acostado sobre su espalda de mi sensor da 0-360.
    y en el modo de retrato se ejecuta 0-360 tanto acostado sobre su espalda y de pie en el retrato.

    La esperanza de que ayude a alguien

Dejar respuesta

Please enter your comment!
Please enter your name here