我在 CMDeviceMotion 中的 userAcceleration 字段中看到了一些意外读数。当我查看来自 CMAccelerometerData 的原始加速度计数据时,我看到如果 iPhone 平放在 table 上,读数为 1G(在 -Z 轴上为 1G),如果我放下 iPhone(当然是在柔软的表面上)然后加速度计读数按预期变为零。这一切都很好。当我改为使用 CMDeviceMotion 类时,当 iPhone 平放在 table 上时,userAcceleration 读数按预期为零。再次这很好。但是当我放下 iPhone 并读取 CMDeviceManager userAcceleration 时,userAcceleration 值是 1G,按预期直接向上 (+Z) 而不是向下 (-Z)。看起来 userAcceleration 读数实际上与设备实际经历的加速度完全相反。有没有其他人观察到这一点?在尝试对速度和位置进行积分之前,我是否可以反转(乘以 -1)所有 userAcceleration 值,或者我是否误解了 userAcceleration 正在读取的内容?

最佳答案

CMAccelerometerData.accelerationCMDeviceMotion.userAcceleration 之间存在一些概念上的差异

  • 原始加速度计数据只是所有测量加速度的总和,即重力和设备当前加速度的组合。
  • 设备运动数据是所有 3 个传感器(即加速度计、陀螺仪和磁力计)的传感器融合的结果。从而消除偏差和误差(理论上),并将剩余的加速度数据分离为重力和加速度以方便使用。

  • 所以如果你想比较两者,你必须检查 CMAccelerometerData.accelerationCMDeviceMotion.userAcceleration + CMDeviceMotion.gravity 来比较 like 和 like。

    一般来说,在大多数情况下,当您想要精确的值和硬件独立性时,CMDeviceMotion 是您的首选。

    另一件要考虑的事情是您在通过 CMAttitudeReferenceFrame 启动 Device Motion 更新时提供的 startDeviceMotionUpdatesUsingReferenceFrame 。我不确定使用基本版本 startDeviceMotionUpdates 时的默认值是什么

    您表示要对这些值进行积分以获得速度和位置。对此有几个讨论,归根结底,我可以说不可能获得合理的结果。看:
  • Finding distance using accelerometer in iPhone
  • Getting displacement from accelerometer data with Core Motion
  • How can I find distance traveled with a gyroscope and accelerometer?

  • 如果您的应用程序概念迫使您依赖精确结果超过半秒,请尝试更改它。

    关于ios - CMDeviceMotion userAcceleration 倒挂?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16527593/

    10-08 21:28