我正在开发一个必须跟踪偏航的应用程序(围绕 z-axis 旋转)。用户将横向指向 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
  }

只要设备的滚动或俯仰没有改变,这当前工作正常。

我想知道的是:

  • 当设备的滚动或俯仰变化时,为什么偏航会发生变化?

  • 如何在不受 x 和 y-axis 变化影响的情况下准确跟踪 z-axis 周围的偏航?

我一直在敲打这个问题两个星期。如果有人能帮助我理解为什么会这样,以及如何解决它,我将非常感激。