从CMRotationMatrix得到俯仰,偏航,滚动

时间:2012-02-28 08:30:45

标签: ios opengl-es core-motion

我有一个CMRotationMatrix * rot,我想从矩阵中获得俯仰,偏航,滚动。 任何想法我怎么能这样做?

由于

3 个答案:

答案 0 :(得分:24)

使用四元数比使用欧拉角更好....滚动,俯仰和偏航值可以使用以下公式从四元数导出:

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和此处:Conversion between Quaternions and Euler angles

答案 1 :(得分:1)

  

俯仰,偏航,从矩阵滚动。任何想法我怎么能这样做?

以哪种顺序?俯仰,偏航和滚转,通常称为欧拉角,不能明确地表示旋转。根据您执行单个子旋转的顺序,最终会得到完全不同的旋转矩阵。

我的个人建议:根本不要使用欧拉角,他们只是要求(数字)麻烦。使用矩阵(您已经做过)或四元数。

答案 2 :(得分:-1)

自己找到它:

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;

        }