将加速度数据调整为全局参考系

问题描述 投票:0回答:1

与Core Motion一起使用时,加速度似乎总是相对于设备返回。意思是,如果您向上摇动设备屏幕,则将设备侧向旋转并上下摇动时,摇动将为+/- Z(取决于初始参考),加速度与之前相同,即为+ / -X或Y。

我想将此设备特定的加速度转换回“全局”帧。这意味着设备的相同物理运动会导致加速度数据返回相同的轴,而与设备在摇动时的方向无关。

例如,如果我们上下摇动设备,屏幕向上,则它进入z,如果您旋转设备,使屏幕面向前并进行相同的摇动,则z轴仍显示加速度尽管相对于设备为Y轴。

我一直在尝试将加速度转回初始姿态,看起来有时可以起作用,有时不起作用。我不认为轮换是正确的方法。我不确定这是数学运算,还是有时只是看起来随机而已。

extension CMQuaternion {
    var toSIMD: simd_quatd {
        return simd_quatd(ix: x, iy: y, iz: z, r: w)
    }
}

extension CMAcceleration {
    var toSIMD: SIMD3<Double> {
        return SIMD3<Double>(x,y,z)
    }
}

然后像这样进行计算:

var reference: simd_quatd?
motionManager.startDeviceMotionUpdates(using: .xArbitraryZVertical, to: .main) { deviceMotion, error in
    guard let deviceMotion = deviceMotion else { return }

    let userAcceleration = deviceMotion.userAcceleration.toSIMD
    let adjusted: SIMD3<Double>
    if let ref = reference {
// rotate the userAccel by the inverse of the reference times the current attitude. 
      adjusted = simd_act(simd_mul( simd_inverse(ref.quaternion.toSIMD),deviceMotion.attitude.quaternion.toSIMD), userAcceleration)
    } else {
      reference = deviceMotion.attitude.quaternion.toSIMD
      adjusted = userAcceleration
    }
...
}

最终目标是将“上/下”部分放入FFT中,以尝试找到运动的频率。

旋转加速度矢量是否正确?有没有更好的方法可以实现姿态独立加速?或更妙的是,找到与方向无关的设备运动频率!

ios accelerometer core-motion accelerate-framework cmattitude
1个回答
0
投票

我能够验证这确实是“旋转”加速度数据的一种方式。

作为说明,而不是使用第一帧作为参考,我对其进行了简化并使用四元数

let referenceFrame = simd_inverse(simd_quatd(ix: 0,iy: 0,iz: 0,r: 1))

然后处理调整后的加速度:

let userAcceleration = motion.userAcceleration.toSIMD

let adjusted = simd_act(simd_mul(referenceFrame, motion.attitude.quaternion.toSIMD), userAcceleration)

[adjusted的Z分量将在全局帧中向上/向下。

我一直在实时进行此操作,没有任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.