Неправильные кватернионные значения от CoreMotion? - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь получить свой бросок из кватерниона следующим образом: 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 градусов, и странные скачки в числах.

...