Лучше использовать кватернионы, чем углы Эйлера .... Значения крена, тангажа и рыскания могут быть получены из кватерниона с использованием следующих формул:
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)
Может быть реализовано как:
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));
где radianstoDegrees - это директива препроцессора, реализованная как:
#define radiansToDegrees(x) (180/M_PI)*x
Это делается для преобразования значений радиан, заданных формулами, в градусы.
Более подробную информацию о конвертации можно найти здесь:
tinkerforge и здесь: Преобразование между кватернионами и углами Эйлера .