使用 Core Motion 准确跟踪用户围绕对象旋转的度数

Posted

技术标签:

【中文标题】使用 Core Motion 准确跟踪用户围绕对象旋转的度数【英文标题】:Accurately track users rotation in degrees around an object using Core Motion 【发布时间】:2017-05-15 09:20:29 【问题描述】:

我目前正在尝试准确地跟踪用户在物体(例如汽车)周围的运动。

当用户在汽车周围移动时,他的 iPhone 将处于横向。我想为用户围绕汽车旋转的每一度拍摄一张照片。

我目前正在使用CoreMotion 来尝试确定Yaw

let queue = OperationQueue.main
motionManager.deviceMotionUpdateInterval = 1 / 30
motionManager.startDeviceMotionUpdates(using: .xArbitraryZVertical, to: queue)  (motion, error) in
  if let deviceMotion = motion 
    let quat = deviceMotion.attitude.quaternion

    let ysqr = quat.y * quat.y
    let t3 = 2.0 * (quat.w * quat.z + quat.x * quat.y)
    let t4 = 1.0 - 2.0 * (ysqr + quat.z * quat.z)
    let yaw = atan2(t3, t4)

    print(round(self.degrees(yaw)))
  

我注意到,当我在对象周围移动时,Yaw 会在设备PitchRoll 发生变化时受到影响。

无论如何我可以准确地跟踪Yaw 围绕一个对象旋转 360 度吗?

【问题讨论】:

attitude 具有 pitchrollyaw 的内置属性。你为什么要自己计算这些? 我试图使用Quaternion,因为我注意到当rollpitch 发生变化时我的yaw 会发生变化。我只需要准确地跟踪一个物体周围的 360 度旋转。 在这种情况下,您可能想要的不是pitchrollyaw,而是设备的“指南针”方向。它会像您希望的那样变化,并且不会受到其他方向移动的影响。您还应该能够从设备运动中获得它。 @Fogmeister 感谢您的反馈。我将不得不阅读这一点,因为我不知道如何使用 CoreMotion 获得“指南针”方向。 @Fogmeister 感谢您为我指明了正确的方向。这似乎是我想要实现的解决方案。我将通读CLLocationManagerstartUpdatingHeading 的文档。 【参考方案1】:

您可能想要查看的是使用CoreLocation(特别是CLLocationManagerstartUpdatingHeading)来获取设备的标题。

在获取设备当前航向和更新速度方面更加可靠。

【讨论】:

以上是关于使用 Core Motion 准确跟踪用户围绕对象旋转的度数的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS Core Motion 中暂停、恢复和重置步数

使用 Core Motion 从加速度计数据中获取位移

Core-Motion/accelerometer:检测 iPad 的一个边缘何时抬起

SWIFTUI 和 Core Motion

Core Motion传感器原始数据

使用 Core Motion 构建计步器