2012-02-28 10 views

Respuesta

22

que es mejor usar el cuaternión de ángulos de Euler .... el rollo, los valores de cabeceo y guiñada se pueden derivar de cuaternión usando estas fórmulas:

roll = atan2(2*y*w - 2*x*z, 1 - 2*y*y - 2*z*z) 
pitch = atan2(2*x*w - 2*y*z, 1 - 2*x*x - 2*z*z) 
yaw = asin(2*x*y + 2*z*w) 

se puede implementar como:

CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion; 
myRoll = radiansToDegrees(atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z)) ; 
myPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z)); 
myYaw = radiansToDegrees(asin(2*quat.x*quat.y + 2*quat.w*quat.z)); 

donde los radianstoDegrees es una directiva de preprocesador implementar ed como:

#define radiansToDegrees(x) (180/M_PI)*x 

Esto se hace para convertir los valores radian dados por las fórmulas, en grados.

Más información sobre la conversión se puede encontrar aquí: tinkerforge y aquí: Conversion between Quaternions and Euler angles.

+1

Tengo curiosidad, ¿cuál es la razón detrás de" es mejor usar Quaternion que Euler Angles "? – Jacksonkr

+0

Gracias. Funciona bien. motionManager.deviceMotion.attitude.pitch/roll/yaw son realmente inestables. Me pregunto por qué Apple no los soluciona. –

1

, guiñada, rollo de la matriz. ¿Alguna idea de cómo podría hacer eso?

¿En qué orden? El tono, el guiñada y el balanceo, comúnmente llamados ángulos de Euler, no representan las rotaciones sin ambages. Dependiendo del orden en que realice las sub-rotaciones individuales, termina con matrices de rotación completamente diferentes.

Mi recomendación personal: No use ángulos de Euler en absoluto, solo llaman para problemas (numéricos). Usa una matriz (ya lo haces) o un cuaternión.

-1

Encontrado yo mismo:

CMAttitude *currentAttitude = motionManager.deviceMotion.attitude;  

     if (currentAttitude == nil) 
     { 
      NSLog(@"Could not get device orientation."); 
      return; 
     } 
     else { 
      float PI = 3.14159265; 
      float yaw = currentAttitude.yaw * 180/PI; 
      float pitch = currentAttitude.pitch * 180/PI; 
      float roll = currentAttitude.roll * 180/PI; 

     } 
+1

'M_PI' sería una representación más precisa de pi, y le ahorrará la variable;) –

Cuestiones relacionadas