使用CMQuaternion计算偏航角

4

我目前正在开发一款需要追踪偏航角(绕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
  }

只要设备的翻滚或俯仰不改变,目前这个功能可以正常使用。

我想要知道的是:

  1. 为什么当设备的翻滚或俯仰发生变化时,偏航会发生变化?
  2. 如何在z轴周围准确地跟踪偏航,而不受x和y轴变化的影响?

我已经苦思冥想了两个星期了。如果有人能帮我理解为什么会发生这种情况并且如何克服它,我将非常感激。


1
遇到同样的问题,有解决方案吗? - Roy K
1
嗨@RoyK。对于回复晚了我表示抱歉。很遗憾,我找不到解决方案。如果你有任何解决办法,请告诉我。真的很想知道如何实现这个。 - martisan
嗨,感谢回复。最终我使用了磁头方向和位置服务。这似乎更准确,没有漂移,非常稳定。 - Roy K
你现在能够跟踪一个物体完整的360度运动吗? - martisan
是的,假设您将设备对准物体。 - Roy K
1个回答

1
尝试以下代码。
let yaw = atan2(motion.gravity.x, motion.gravity.y) - Double.pi
let yawDegrees = self.degreesFromRadians(yaw)
print(yawDegrees)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接