4

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

4

2 回答 2

6

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

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

因此,如果您想比较两者,则必须检查CMAccelerometerData.accelerationCMDeviceMotion.userAcceleration + CMDeviceMotion.gravity将同类与同类进行比较。

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

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


你说你想整合这些值来获得速度和位置。关于这个有几个讨论,最重要的是,我可以说不可能得到合理的结果。看:

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

于 2013-05-13T20:35:56.910 回答
0

原来 CMAcceleration 不遵循右手法则,即 x 指向左,y 指向屏幕底部,在这种情况下,对于典型的右手系统,z 轴应该指向上侧,但它的不是。处理运动传感器时让我感到不舒服!

于 2014-03-11T14:00:55.597 回答