【问题标题】:CMAttitude roll and pitch calculationCMA姿态横滚和俯仰计算
【发布时间】:2011-12-10 15:26:59
【问题描述】:

问题本身很简单。当使用 CMDeviceMotion 运动时,它包含一个名为姿态的对象,类型为 CMAttitude,其中包含滚动和俯仰。滚动和俯仰描述了对象围绕 Y 轴和 X 轴的旋转。当 iPhone 放在桌子上且显示屏朝上时,roll 和 pitch 均为 0。当 iPhone 绕 Y 或 X 轴旋转时,这些值会更新。

我想知道这些值是如何计算的。有一种方法可以根据设备的当前重力矢量计算横滚和俯仰。音高似乎是:pitch = -asin(motion.gravity.y) 但我不知道如何计算滚动。

感谢您的帮助

【问题讨论】:

    标签: iphone core-motion pitch


    【解决方案1】:
    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)); // PITCH !!!
    myYaw = radiansToDegrees(asin(2*quat.x*quat.y + 2*quat.w*quat.z));
    

    【讨论】:

    • 为了完整起见:radiansToDegrees(float radians) { return ((radians) * (180.0 / M_PI)); }
    【解决方案2】:

    可能是这样的:

    roll = -atan(x / z);
    

    虽然您需要根据您所处的方向更改符号,但要小心 z=0 的渐近线。

    我相信 Core Motion 实际上除了加速度计读数外还使用陀螺仪测量来更准确地计算姿态(也许还可以处理gimbal lock)。

    【讨论】:

      【解决方案3】:
      pitch = atan2(motion.gravity.z, motion.gravity.y)
      roll = atan2(motion.gravity.z, motion.gravity.x)
      

      这样,pitch的值就会像roll一样在0 +pi和0 -pi之间

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多