使用 CMQaternion 计算偏航角

Posted

技术标签:

【中文标题】使用 CMQaternion 计算偏航角【英文标题】:Using CMQuaternion to calculate yaw 【发布时间】:2017-05-24 18:38:28 【问题描述】:

我目前正在开发一个必须跟踪偏航(绕 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
  

只要设备的滚动或俯仰不发生变化,这目前就可以正常工作。

我想知道的是:

    为什么当设备的侧倾或俯仰发生变化时偏航角会发生变化? 如何在不受 x 轴和 y 轴变化影响的情况下准确跟踪 z 轴周围的偏航?

两周来我一直在努力解决这个问题。如果有人能帮助我理解为什么会发生这种情况以及如何解决它,我将不胜感激。

【问题讨论】:

遇到同样的问题,有什么解决办法吗? 嗨@RoyK。为迟到的回复道歉。不幸的是,我找不到解决方案。如果您想出解决方案,请告诉我。真的很想知道如何实现这一目标。 您好,感谢您的回复,我最终将磁航向与定位服务结合使用。似乎更准确,没有漂移,很稳定。 您现在可以跟踪对象周围的完整 360 度运动吗? 是的,假设您将设备指向对象。 【参考方案1】:

试试下面的代码。

let yaw = atan2(motion.gravity.x, motion.gravity.y) - Double.pi
let yawDegrees = self.degreesFromRadians(yaw)
print(yawDegrees)

【讨论】:

以上是关于使用 CMQaternion 计算偏航角的主要内容,如果未能解决你的问题,请参考以下文章

鼠标输入

为啥移动控制器时偏航角消失?

Apple Watch 和 Swift 在使用 CoreMotion 计算设备运动时崩溃

OpenGL,俯仰强制偏航为0

LIS3DH三轴加速度计-实现欧拉角(俯仰角,横滚角)

使用四元数计算 iphone 的偏航、俯仰和滚动?