Cómo obtener los ángulos euler del vector de rotación (Sensor.TYPE_ROTATION_VECTOR)

Giré mi dispositivo del androide en la dirección de x (de -180 grados a 180 grados), vea la imagen abajo. Introduzca aquí la descripción de la imagen
Y supongo que sólo cambia el valor del vector x de rotación. Y y z pueden tener algo de ruido, pero no debería haber mucha diferencia entre los valores.

Sin embargo, recibo esto. Por favor, vea

Https://docs.google.com/spreadsheets/d/1ZLoSKI8XNjI1v4exaXxsuMtzP0qWTP5Uu4C3YTwnsKo/edit?usp=sharing

Sospecho que mi sensor tiene algún problema.

¿Alguna idea? Muchas gracias.

Palanqueta

EDIT Necesito revisar esta pregunta. Algunos errores fueron cometidos

Su sensor está bien.
Bueno, las entradas del vector de rotación no pueden estar relacionadas simplemente con el ángulo de rotación alrededor de un eje particular. La estructura SensorEvent consta de marca de tiempo, sensor, precisión y valores. Dependiendo del vector, el flotador [] de values varía en tamaño 1-5.
Los valores de los vectores de rotación se basan en cuaternaciones unitarias, formando todos juntos un vector que representa la orientación de este marco mundial en relación con el marco fijo del teléfono inteligente anterior Introduzca aquí la descripción de la imagen Son unitless y positivo a la izquierda.

La orientación del teléfono se representa mediante la rotación necesaria para alinear las coordenadas East-North-Up con las coordenadas del teléfono. Es decir, aplicar la rotación al marco mundial (X, Y, Z) los alinearía con las coordenadas telefónicas (x, y, z).

Si el vector fuera una Matriz de Rotación se podría escribir como
v_body = R_rot_vec * v_world (<--)
Empujando el vector del mundo en una descripción fija del teléfono inteligente.
Además sobre el vector:

Los tres elementos del vector de rotación son iguales a los tres últimos componentes de una unidad cuaternión <cos (θ / 2), x sin (θ / 2), y sin (θ / 2), z * sin (θ / 2) >.

P: Entonces, ¿qué hacer con él?
Dependiendo de la convención de ángulos de Euler (24 posibles secuencias, 12 válidas), se pueden calcular los ángulos correspondientes u: = [ψ, θ, φ] aplicando, por ejemplo,
La secuencia 123 :
Introduzca aquí la descripción de la imagen
Si ya tienes las entradas de matriz de rotación, obtén euler así:
123 seq euler ángulos
La secuencia 321 :
321 seq euler ángulos
Con q1-3 siendo siempre los values[0-2] (No se confunda por u_ijk como ref (Diebel) utiliza diferentes convenciones comp. A la norma)

Pero espera, tu tabla vinculada sólo tiene 3 valores, que es similar a lo que obtengo. Este es un SensorEvent de la mina, los últimos tres se imprimen de values[]
23191581386897 11 -75 -0.0036907701 -0.014922042 0.9932963 timestamp sensortype exactitud valores [0] valores [1] valores [2] 4q-3values ​​= 1q unkown. El primer q0 es redunant info (también el doku dice que debe estar allí bajo values[3] , depende de su nivel de API). Así podemos usar la norma (= longitud) para calcular q0 de los otros tres.
Norma unitaria
Establezca la ecuación || q || = 1 y resolver para q0. Ahora todos los q0-3 son conocidos.
Además, mi Android 4.4.2 no tiene la cuarta posición estimada de la cabecera (en radianes) dentro del value[4] , por lo que evaluar el event.accuracy . event.accuracy :

  for (SensorEvent e : currentEvent) { if (e != null) { String toMsg = ""; for(int i = 0; i < e.values.length;i++) { toMsg += " " + String.valueOf(e.values[i]); } iBinder.msgString(String.valueOf(e.timestamp) + " "+String.valueOf(e.sensor.getType()) + " " + String.valueOf(e.accuracy) + toMsg, 0); } } 

Ponga esas ecuaciones en código y obtendrá las cosas ordenadas.

Como tuve que lidiar con la conversión quat-> eul antes, escribí un litte C + + – código de conversión Quats. Utilizando XYZ o ZYX . Si por casualidad te sientas frente a una shell "linux", puedes usarla como un pequeño ayudante de conversión o simplemente simplemente echar un vistazo al código fuente dentro de la carpeta. (Licencia BSD)
La parte correspondiente a XYZ

 /*quaternation to euler in XYZ (seq:123)*/ double* quat2eulerxyz(double* q){ /*euler-angles*/ double psi = atan2( -2.*(q[2]*q[3] - q[0]*q[1]) , q[0]*q[0] - q[1]*q[1]- q[2]*q[2] + q[3]*q[3]); double theta = asin( 2.*(q[1]*q[3] + q[0]*q[2])); double phi = atan2( 2.*(-q[1]*q[2] + q[0]*q[3]) , q[0]*q[0] + q[1]*q[1] - q[2]*q[2] - q[3]*q[3]); /*save var. by simply pushing them back into the array and return*/ q[1] = psi; q[2] = theta; q[3] = phi; return q; } 

Aquí algunos ejemplos de aplicación de quats a euls: Introduzca aquí la descripción de la imagen

P: ¿Qué significa la secuencia ijk?
Tome dos cuadros de coordenadas A y B que se superponen entre sí (todos los ejes dentro de cada uno de ellos) y comiencen a girar el cuadro B a través del eje i con el ángulo psi , luego el eje j teniendo el ángulo theta y el último eje z teniendo phi . También podría ser α, β, γ para i, j, k. No tomo los números porque son confusos (Diebel contra otros papeles).

 R(psi,theta,phi) = R_z(phi)R_y(theta)R_x(psi) (<--) 

El truco es que las rotaciones elementales se aplican de derecha a izquierda, aunque leemos la secuencia de izquierda a derecha. Esas son las tres rotaciones elementales que estás pasando para ir de

 A to B: *v_B = R(psi,theta,phi) v_A* 

P: Entonces, ¿cómo conseguir que los ángulos de euler giren de [0 °, 0 °, 0 °] a eg. [0º, 90º, 0º]?
Primero alinee ambos cuadros de las imágenes, respectiva- mente la trama de dispositivo B conocida a la trama de mundo "invisible" A. Su superposición se realiza cuando los ángulos llegan a [0 °, 0 °, 0 °]. Apenas figura hacia fuera donde está el norte, el sur y el este donde te estás sentando ahora y señala el marco B de los dispositivos en esas direcciones. Ahora, cuando gire alrededor del eje y en el sentido contrario a las agujas del reloj 90 °, tendrá el deseado [0 °, 90 °, 0 °], al convertir el cuaternión.
Julian

* Cinemática fuente: Fuente Diebel (Stanford) con información sólida sobre el fondo de la mecánica (cuidado: para Diebel XYZ se denota u_321 (1,2,3) mientras que ZYX es u_123 (3,2,1)), y esto es un buen punto de partida.

  • Detección de líneas en una imagen de hoja musical en Android
  • Gire un botón (o el texto dentro) del código
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.