代码之家  ›  专栏  ›  技术社区  ›  Eyzuky

CoreMotion中的四元数值错误?

  •  0
  • Eyzuky  · 技术社区  · 6 年前

    我正试图从四元数中得到我的骰子,就像这样: https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles#Quaternion_to_Euler_Angles_Conversion

    extension CMQuaternion {
    
        func toRoll () -> Double {
        //from Wikipedia:
        //roll (x-axis rotation)
        //double sinr_cosp = +2.0 * (q.w() * q.x() + q.y() * q.z());
        //double cosr_cosp = +1.0 - 2.0 * (q.x() * q.x() + q.y() * q.y());
        //roll = atan2(sinr_cosp, cosr_cosp);
            return atan2(2*w*x + 2*y*z, 1 - 2*y*y - 2*x*x).radiansToDegrees
        }
    }
    

    由于某些原因,这些值非常不一致。我不确定我是否遗漏了什么,我的弧度到度函数是:

    extension Double {
        var radiansToDegrees: Double {
            return self * 180 / .pi
        }
    }
    

    我正在使用上面的函数 CMQuaternion 里面 CMAttitude 我从我的 CMMotionManager .

    当设备放在一张桌子上时,我只把它放在滚动轴上,它的范围在12到12之间,我希望它在90到90之间。 当我把我的设备垂直于地面,事情变得更糟,我得到的范围在70到80度之间,奇怪的跳跃在数字中。

    0 回复  |  直到 6 年前