Descripción general de la orientación del teléfono Android, incluida la brújula

He estado tratando de entender los sensores de orientación de Android por un tiempo. Pensé que lo entendía. Entonces me di cuenta de que no. Ahora creo (espero) que tenga una mejor sensación de nuevo, pero todavía no estoy al 100%. Trataré de explicar mi comprensión irregular y espero que la gente pueda corregirme si me equivoco en partes o si llego algún espacio en blanco.

Me imagino que estoy de pie a 0 grados de longitud (primer meridiano) y 0 grados de latitud (ecuador). Esta ubicación es en realidad en el mar frente a la costa de África, pero tengan paciencia conmigo. Sostengo mi teléfono frente a mi cara para que la parte inferior del teléfono apunte a mis pies; Estoy mirando al norte (mirando hacia Greenwich), por lo que el lado derecho del teléfono apunta al este hacia África. En esta orientación (con referencia al diagrama a continuación) tengo el eje X apuntando hacia el este, el eje Z apunta hacia el sur y el eje Y apunta al cielo.

Ahora los sensores del teléfono le permiten determinar la orientación (no la ubicación) del dispositivo en esta situación. Esta parte siempre me ha confundido, probablemente porque quería entender cómo funcionaba algo antes de aceptar que simplemente funcionaba. Parece que el teléfono calcula su orientación utilizando una combinación de dos técnicas diferentes.

Antes de llegar a eso, imagina estar de vuelta en ese terreno imaginario a 0 grados de latitud y longitud en la dirección mencionada anteriormente. Imagínese también que tiene los ojos vendados y que sus zapatos están sujetos a una rotonda del patio de juegos. Si alguien te empuja por la espalda, caerás hacia adelante (hacia el norte) y extenderás ambas manos para detener tu caída. Del mismo modo, si alguien te empuja el hombro izquierdo, caerás sobre tu mano derecha. Su oído interno tiene "sensores gravitacionales"(clip de youtube) que le permiten detectar si se está cayendo hacia adelante / atrás, o hacia la izquierda / derecha o hacia abajo (¡o hacia arriba!). Por lo tanto, los humanos pueden detectar la alineación y la rotación alrededor de los mismos ejes X y Z que el teléfono.

Ahora imagina que alguien te gira 90 grados en la rotonda para que ahora estés mirando hacia el este. Te están girando alrededor del eje Y. Este eje es diferente porque no podemos detectarlo biológicamente. Sabemos que estamos angulados por una cierta cantidad, pero no sabemos la dirección en relación con el polo norte magnético del planeta. En cambio, necesitamos usar una herramienta externa ... una brújula magnética. Esto nos permite determinar en qué dirección estamos mirando. Lo mismo es cierto con nuestro teléfono.

Ahora el teléfono también tiene un acelerómetro de 3 ejes. yo tengoNO idea de cómo funcionan realmente, pero la forma en que lo visualizo es imaginar la gravedad como una 'lluvia' constante y uniforme que cae del cielo e imaginar los ejes en la figura de arriba como tubos que pueden detectar la cantidad de lluvia que fluye a través. Cuando el teléfono se mantiene en posición vertical, toda la lluvia fluirá a través del Y 'tubo'. Si el teléfono gira gradualmente para que su pantalla mire hacia el cielo, la cantidad de lluvia que fluye a través de Y disminuirá a cero, mientras que el volumen a través de Z aumentará constantemente hasta que fluya la cantidad máxima de lluvia. Del mismo modo, si ahora inclinamos el teléfono hacia un lado, el tubo X eventualmente recogerá la cantidad máxima de lluvia. Por lo tanto, dependiendo de la orientación del teléfono midiendo la cantidad de lluvia que fluye a través de los 3 tubos, puede calcular la orientación.

El teléfono también tiene una brújula electrónica que se comporta como una brújula normal: su "aguja virtual" apunta al norte magnético. Android combina la información de estos dos sensores para que siempre queSensorEvent deTYPE_ORIENTATION se genera elvalues[3] matriz tiene
valores [0]: Azimut - (la brújula que lleva al este del norte magnético)
valores [1]: inclinación, rotación alrededor del eje x (es el teléfono inclinado hacia adelante o hacia atrás)
valores [2]: Rollo, rotación alrededor del eje y (es el teléfono inclinado sobre su lado izquierdo o derecho)

Así que creo (es decir, no sé) la razón por la que Android da el acimut (rumbo de la brújula) en lugar de la lectura del tercer acelerómetro es que la demora de la brújula es simplemente más útil. No estoy seguro de por qué desaprobaron este tipo de sensor, ya que ahora parece que necesita registrar un oyente en el sistema paraSensorEvents de tipoTYPE_MAGNETIC_FIELD. Los eventosvalue[] matriz necesita pasarse aSensorManger.getRotationMatrix(..) método para obtener una matriz de rotación (ver más abajo) que luego se pasa alSensorManager.getOrientation(..) método. ¿Alguien sabe por qué el equipo de Android en desusoSensor.TYPE_ORIENTATION? ¿Es una cosa de eficiencia? Eso es lo que está implícito en uno de los comentarios a un similarpregunta pero aún necesita registrar un tipo diferente de oyente en eldesarrollo / samples / Compass / src / com / example / android / compass / CompassActivity.java ejemplo.

Ahora me gustaría hablar sobre la matriz de rotación. (Aquí es donde estoy más inseguro) Así que arriba tenemos las tres cifras de la documentación de Android, las llamaremos A, B y C.

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

B =Sistema de coordenadas utilizado por la API SensorEvent.

C = SensorManager.getOrientation (..) figura del método

Entonces, entiendo que A representa el "sistema de coordenadas del mundo", que supongo se refiere a la forma en que las ubicaciones en el planeta se dan como una pareja (latitud, longitud) con una (altitud) opcional. X es el"dirección del este" coordinado, Y es el"norte" coordinar. Z apunta al cielo y representa la altitud.

El sistema de coordenadas del teléfono se muestra en la figura B es fijo. Su eje Y siempre señala la parte superior. El teléfono calcula constantemente la matriz de rotación y permite el mapeo entre los dos. Entonces, ¿estoy en lo cierto al pensar que la matriz de rotación transforma el sistema de coordenadas de B a C? Entonces cuando llamasSensorManager.getOrientation(..) método utiliza elvalues[] matriz con valores que corresponden a la figura C. Cuando el teléfono apunta al cielo, la matriz de rotación es una matriz de identidad (el equivalente matemático de la matriz de 1), lo que significa que no es necesario mapear ya que el dispositivo está alineado con el sistema de coordenadas del mundo.

Okay. Creo que mejor me detengo ahora. Como dije antes, espero que la gente me diga dónde lo he estropeado o ayudado (¡o confundido aún más a la gente!)

Respuestas a la pregunta(4)

Su respuesta a la pregunta