我在CMDeviceMotion的userAcceleration字段中看到了一些意外的读数。当我从CMAccelerometerData查看原始加速度计数据时,我看到如果iPhone在桌面上是平的,读数是1G直下(1G在-Z轴),如果我放下iphone(当然在柔软的表面上)那么加速器读数按预期变为零。那一切都很好。当我改为使用CMDeviceMotion类时,当桌面上的iPhone平放时,userAcceleration读数为零。再次这很好。但是当我放下iPhone并读取CMDeviceManager userAcceleration时,userAcceleration值是1G直线上升(+ Z)而不是按预期下降(-Z)。看起来userCcceleration读数实际上与设备实际遇到的加速度完全相反。有没有人观察过这个?在尝试集成速度和位置之前,我可以反转(乘以-1)所有userAcceleration值,还是我误解了userAcceleration正在读取的内容?
答案 0 :(得分:6)
CMAccelerometerData.acceleration和CMDeviceMotion.userAcceleration
之间存在一些概念差异因此,如果你想比较两者,你必须检查CMAccelerometerData.acceleration
与CMDeviceMotion.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会选择这个符号约定。这对我来说没有意义。