首页 > 解决方案 > 如何使用 CMDeviceMotion 正确设置初始参考帧

问题描述

我目前正在开展一个项目,在该项目中,一旦按下按钮,我就会收集设备姿态(方向)的大小,并随着时间的推移进行绘制。我想将其设置为初始姿态设置为按下按钮时设备所处的姿态,因此所有进行的值都相对于该零点。

我一直在使用这个网站作为指南: https ://nshipster.com/cmdevicemotion/ 最后的教程是我正在寻找的,因为执行“multiplyByInverseOf”最初的态度应该是我所追求的。

这是我的结果的快照(从 3 开始,因为它是 3 秒倒计时):

time    attitude Magnitude
3       0
2.99    0.673
2.98    0.673
2.97    0.673
2.96    0.67
2.95    0.669
2.94    0.668

我正在使用的代码:

self.motion.startDeviceMotionUpdates(to: OperationQueue.current!) { (motion, error) in

                //START Code here runs every 'updateFrequency'

                if let data = self.motion.deviceMotion {

                    //Store initial attitude for reference
                    if self.isFirst == true {
                        self.initialAttitude = data.attitude
                        self.isFirst = false
                    }

                    //attitude of phone impacted by user
                    data.attitude.multiply(byInverseOf: self.initialAttitude!)
                    let attitudeMagnitude = self.magnitudeFromAttitude(attitude: data.attitude)

initialAttitude 和 isFirst 都是全局的;isFirst 仅用于访问循环的第一次迭代(以检索初始姿态)。

可以看出,第一个数据点是正确的零引用,但是值会跳跃(并保持稳定)超过此值。如何重构我的代码以防止这种跳转?

提前谢谢了!

标签: swiftxcodemotion-detection

解决方案


推荐阅读