CMDeviceMotion userAcceleration颠倒了吗?

时间:2013-05-13 17:18:07

标签: ios accelerometer core-motion

我在CMDeviceMotion的userAcceleration字段中看到了一些意外的读数。当我从CMAccelerometerData查看原始加速度计数据时,我看到如果iPhone在桌面上是平的,读数是1G直下(1G在-Z轴),如果我放下iphone(当然在柔软的表面上)那么加速器读数按预期变为零。那一切都很好。当我改为使用CMDeviceMotion类时,当桌面上的iPhone平放时,userAcceleration读数为零。再次这很好。但是当我放下iPhone并读取CMDeviceManager userAcceleration时,userAcceleration值是1G直线上升(+ Z)而不是按预期下降(-Z)。看起来userCcceleration读数实际上与设备实际遇到的加速度完全相反。有没有人观察过这个?在尝试集成速度和位置之前,我可以反转(乘以-1)所有userAcceleration值,还是我误解了userAcceleration正在读取的内容?

4 个答案:

答案 0 :(得分:6)

CMAccelerometerData.accelerationCMDeviceMotion.userAcceleration

之间存在一些概念差异
  1. 原始加速度计数据只是所测量的所有加速度的总和,即装置的重力和当前加速度的组合。
  2. 设备运动数据是所有3个传感器(即加速度计,陀螺仪和磁力计)的传感器融合的结果。因此,消除了偏差和误差(理论上),并将剩余的加速度数据分为重力和加速度,以方便使用。
  3. 因此,如果你想比较两者,你必须检查CMAccelerometerData.accelerationCMDeviceMotion.userAcceleration + CMDeviceMotion.gravity进行比较,以便与之比较。

    通常,在大多数情况下,当您需要精确值和硬件独立性时,CMDeviceMotion是您的首选。

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

    时的默认值是什么

    您声明要整合这些值以获得速度和位置。关于这一点有几个讨论,在底线我可以说不可能得到合理的结果。参见:

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

答案 1 :(得分:0)

事实证明CMAcceleration不遵守右手规则,x指向左边,y指向屏幕底部,在这种情况下,使用典型的右手系统,z轴应指向上方,但不是。 在处理运动传感器时,这让我很不舒服!

答案 2 :(得分:0)

3年后,但仍然认为这是一个尚未解决的问题。我不认为这是"一切都很好"对于CMAccelerometerData在-Z轴读取大约1g,因为根据他们的doc(https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html)+ Z从屏幕向外。当手机放在桌子上时,屏幕朝上,这意味着它正在试验桌子的向上力。请在09:15查看google talk。 x和y也是如此。

陀螺仪读数的行为与文档中描述的一样,x向右,y到顶部,z从屏幕向外。

我的结论是,你必须反转所有的加速度计轴,你将拥有像陀螺仪一样的右手坐标系统,就像文档一样。

答案 3 :(得分:0)

作为一个堆栈溢出的新手,我显然没有足够的声誉来评论其他一些帖子...... 但我得到了与cduguet相同的结论。根据广告中的iPhone坐标系(https://developer.apple.com/documentation/coremotion/getting_processed_device_motion_data/understanding_reference_frames_and_device_attitude#2875084),态度数据与广告的坐标轴一致。也就是说,电话的正旋转(在"右手规则"感觉中)关于任何轴的正旋转记录适当的正陀螺速度增加。什么是有道理的和我期望的。

但是,当您在任意轴上沿正方向传递线性加速度时,CMmanager会将数据记录为值。我已经在所有轴上进行了数十次这样的测试,并且不断发现相同的违反直觉的结果。

我可以改变所有线性加速度值的符号,使运动方程符合电话坐标系,但我一直试图理解为什么Apple会选择这个符号约定。这对我来说没有意义。