我目前正在开发一款需要追踪偏航角(绕z轴旋转)的应用程序。用户将iPhone横向放置,指向前方的汽车等物体。当用户开始围绕该物体行走时,我必须追踪完整的360度旋转的偏航角。
我目前使用CoreMotion和CMQuaternion来追踪旋转:
private func startDeviceMotionUpdates() {
if motionManager.isDeviceMotionAvailable {
let queue = OperationQueue()
motionManager.deviceMotionUpdateInterval = 1 / 60
motionManager.startDeviceMotionUpdates(using: .xArbitraryZVertical, to: queue, withHandler: { (motion, error) in
guard let motion = motion else { return }
let quat = motion.attitude.quaternion
let yaw = 2 * (quat.x * quat.y + quat.w * quat.z)
let yawDegrees = self.degreesFromRadians(yaw)
print(yawDegrees)
})
}
}
private func stopDeviceMotionUpdates() {
motionManager.stopDeviceMotionUpdates()
}
private func degreesFromRadians(_ radians: Double) -> Double {
return radians * 180 / .pi
}
只要设备的翻滚或俯仰不改变,目前这个功能可以正常使用。
我想要知道的是:
- 为什么当设备的翻滚或俯仰发生变化时,偏航会发生变化?
- 如何在z轴周围准确地跟踪偏航,而不受x和y轴变化的影响?
我已经苦思冥想了两个星期了。如果有人能帮我理解为什么会发生这种情况并且如何克服它,我将非常感激。