get pitch, yaw, roll from a CMRotationMatrix

后端 未结 3 1028
Happy的楠姐
Happy的楠姐 2021-01-31 23:18

I have a CMRotationMatrix *rot and i would like to get the pitch, yaw, roll from the matrix. Any ideas how i could do that?

Thanks

相关标签:
3条回答
  • 2021-01-31 23:46

    Its better to use the Quaternion than Euler angles.... The roll, pitch and yaw values can be derived from quaternion using these formulae:

    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)
    

    It can be implemented as:

    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));
    

    where the radianstoDegrees is a preprocessor directive implemented as:

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

    This is done to convert the radian values given by the formulae, to degrees.

    More information about the conversion can be found here: tinkerforge and here:Conversion between Quaternions and Euler angles.

    0 讨论(0)
  • 2021-01-31 23:48

    pitch, yaw, roll from the matrix. Any ideas how i could do that?

    In which order? Pitch, yaw and roll, commonly called Euler angles, don't represent rotations unambigously. Depending on the order you carry out the individual sub-rotations you end up with completely different rotation matrices.

    My personal recommendation: Don't use Euler angles at all, they just call for (numerical) trouble. Use a matrix (you already do) or a quaternion.

    0 讨论(0)
  • 2021-02-01 00:06

    Found it out myself:

    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;
    
            }
    
    0 讨论(0)
提交回复
热议问题