Tengo un CMRotationMatrix * rot y me gustaría obtener el pitch, yaw, roll de la matriz. ¿Alguna idea de cómo podría hacer eso?get pitch, yaw, roll desde CMRotationMatrix
Gracias
de tonoTengo un CMRotationMatrix * rot y me gustaría obtener el pitch, yaw, roll de la matriz. ¿Alguna idea de cómo podría hacer eso?get pitch, yaw, roll desde CMRotationMatrix
Gracias
de tonoque 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.
, 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.
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;
}
'M_PI' sería una representación más precisa de pi, y le ahorrará la variable;) –
Tengo curiosidad, ¿cuál es la razón detrás de" es mejor usar Quaternion que Euler Angles "? – Jacksonkr
Gracias. Funciona bien. motionManager.deviceMotion.attitude.pitch/roll/yaw son realmente inestables. Me pregunto por qué Apple no los soluciona. –