如何解决在 coremotion 中调整参考系
我正在使用 CoreMotion 从 Apple Watch SE 捕获四元数。我使用以下代码执行此操作:
motion.startDeviceMotionUpdates(using: .xArbitraryZVertical,to: queue) { [self] (deviceMotion: CMDeviceMotion?,_ : Error?) in
guard let motion = deviceMotion else { return }
let attitude = motion.attitude
let q = attitude.quaternion
measureAngle(quaternion: simd_quatd.init(ix: q.x,iy: q.y,iz: q.z,r: q.w));
}
我想测量 Z 轴上的角位移。我将 x 和 y 分量归零,归一化,并取传入四元数的共轭。然后我使用参考系获取产品,并计算角度。以下代码演示了这一点:
func measureAngle(quaternion : simd_quatd) -> Double {
let normedInput = simd_quatd.init(ix: 0,iy: 0,iz: quaternion.vector.z,r: quaternion.vector.w).normalized.conjugate;
let product = simd_mul(simd_quatd.init(ix: 0,iz: 1,r: 0),normedInput);
let radians = acos(product.vector.w);
return 2 * Measurement(value: radians,unit: UnitAngle.radians).converted(to: .degrees).value;
}
当我开始捕获四元数并上下移动手臂时,角位移是正确的。如果我将身体向起始位置的右侧或左侧旋转 90 度,并执行相同的动作,我的角位移会发生漂移。我相信这是因为我没有在 measureAngle 函数期间调整静态参考系。如果我是正确的,我如何使用 CoreMotion 调整框架?否则,我在计算 z 轴上的角位移时做错了什么?
我的问题与以下帖子有关:DeviceMotion relative to world - multiplyByInverseOfAttitude、CoreMotion iOS 5 attitude with reference frame doesn't work、selecting attitude reference frame in IOS 10 coremotion using swift 3、Adjust Acceleration Data to Global Frame of Reference。
我尝试遵循 this tutorial,并将每个传入的态度与初始态度相乘,但没有发现任何区别。我也试过每个 deviation of reference frames 都无济于事。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。