Swift:CoreMotion 设备不移动,但记录加速度

Posted

技术标签:

【中文标题】Swift:CoreMotion 设备不移动,但记录加速度【英文标题】:Swift: CoreMotion device is not moving but recording accelerations 【发布时间】:2017-10-04 15:54:14 【问题描述】:

这是我的 CM 代码:

func checkMotion(_ myMotionManager:CMMotionManager) -> Bool 
        
        //check to see if core motion is available
        var isCoreMotionAvailable = myMotionManager.isAccelerometerAvailable
        isCoreMotionAvailable = myMotionManager.isGyroAvailable
        isCoreMotionAvailable = myMotionManager.isMagnetometerAvailable
        isCoreMotionAvailable = myMotionManager.isDeviceMotionAvailable
        
        if isCoreMotionAvailable 
            myMotionManager.deviceMotionUpdateInterval = 0.25
            myMotionManager.startDeviceMotionUpdates(to: OperationQueue.current!, withHandler: checkMotionUpdate)

        
        
        return false
    

并检查数据:

func checkMotionUpdate(data: CMDeviceMotion?, error:Error?) 
        
        if error != nil 
            print(error!.localizedDescription)
         else 
            
            if let motionData = data 
                
                //check to see if we have a base point and if not store one
                if !bHasBasePoint 
                    basePoint = motionData
                    bHasBasePoint = true
                    print("Basepoint:\(basePoint!)")
                
                
                print("Acceleration X: \(motionData.userAcceleration.x)")
                print("Acceleration Y: \(motionData.userAcceleration.y)")
                print("Acceleration Z: \(motionData.userAcceleration.z)")
                print()
                
            
        
    

还有一些结果:

基点:

Basepoint:QuaternionX 0.011783 QuaternionY -0.461725 QuaternionZ 0.000044 QuaternionW 0.886945 UserAccelX 0.006458 UserAccelY 0.000324 UserAccelZ 0.002740 RotationRateX 0.000997 RotationRateY -0.001316 RotationRateZ -0.001370 MagneticFieldX 0.000000 MagneticFieldY 0.000000 MagneticFieldZ 0.000000 MagneticFieldAccuracy -1 Heading -1.000000 @ 73807.821537

一些加速检查:

Acceleration X: 0.00645828247070312
Acceleration Y: 0.0003238245844841
Acceleration Z: 0.00274038314819336

Acceleration X: 0.00522691011428833
Acceleration Y: 0.000595645979046822
Acceleration Z: 0.00370562076568604

Acceleration X: 0.00506830215454102
Acceleration Y: 0.000180358067154884
Acceleration Z: 0.0017169713973999

Acceleration X: 0.00555837154388428
Acceleration Y: -0.00128581002354622
Acceleration Z: 0.00320953130722046

Acceleration X: 0.00509798526763916
Acceleration Y: -4.2034313082695e-05
Acceleration Z: 0.00197714567184448

所以我是 CM 编码的新手(第 2 天),我有点困惑为什么当 iPhone 现在坐在摇篮中时,我会看到 x、y 和 z 的加速度变化?这是预期的行为吗?是否存在我应该忽略的加速范围作为误报?

【问题讨论】:

【参考方案1】:

所以,也许您现在找到了其他有关它的信息。但是由于还没有回答:

通常在设备静止时进行一些运动记录是正常的。这有两个原因:一个是,传感器本身会产生一些误差噪声,另一个是,传感器在一个轴上(或更实际地在轴之间拆分)确实总是有一个值 1 朝向重力我们生活的星球。现在这个引力部分被过滤器分开了,但这也引入了一些错误。

传感器本身的误差应该随机产生负误差和正误差,移动平均线应该消除这些误差的影响(例如,你的 Y 轴似乎没有受到重力和线性加速度分裂的影响,我猜它几乎会完全抵消某些值)。因此,您应该已经通过对过去的一些值进行平均来获得更好的值。

根据您获得的读数,通常有 2 个轴具有更高的值。我猜他们是从引力分裂中出现的,你的手机还在,但可能有点倾斜,因为在 gradle 中。

现在虽然 0.00something 不低,但它也不是最高的错误。您可以通过查找诸如Wikipedia Magnitude 之类的参考资料来了解这些值的含义,或者查看地震的这一侧,它们显示了人类需要多大的加速度;)Wikipedia Ground Acceleration。

我不知道苹果用什么来分裂引力,但我记得至少前一段时间它不是最好的过滤器,但对于 UI 的东西来说足够快和有用。但这可能会随着 ARKit 而改变。因此,如果您需要更准确的分割,也许基于原始引力实现另一个过滤器可能是有意义的。

希望对你有所帮助。

【讨论】:

以上是关于Swift:CoreMotion 设备不移动,但记录加速度的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中测量 iOS 设备上的抖动量?

如何使用 CoreMotion 在空间中获取设备方向

iOS开发-CoreMotion框架

如何在 Swift 中计算“纯”移动距离?

使用 CoreMotion 移动 SKSpriteNode

如何使用 CoreMotion 框架确定设备位置?