我目前正在从事一个项目,在该项目中,一旦按下按钮,我便会收集设备姿态(方向)的大小,并随时间进行绘制。我想将其设置为将初始姿态设置为按下按钮时设备所处的姿态,以便所有进行中的值均相对于该零点。
我一直在使用本网站作为指南: 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仅用于访问循环的第一次迭代(以检索初始姿态)。
可以看出,第一个数据点已正确零参考,但是值超出此范围(并保持稳定)。如何重构代码以防止这种跳转?
非常感谢!