是否有人知道 CMMotionmanager.deviceMotion 的每个属性及其子属性,它们基于哪种硬件(磁力计、加速度计、陀螺仪等)?
我的问题是关于硬件,而不是软件。
我需要知道 CMMotionManager 从哪个硬件获取其值,才能知道我的 CMMotionManager 调用将在哪种 iPhone 上运行。并在我的网站上编写后续文本。
那么使用什么硬件来构建:
deviceMotion.attitude.roll
deviceMotion.attitude.pitch
deviceMotion.attitude.yaw
deviceMotion.rotationRate(唯一陀螺仪?带 iOS4 的 Iphone 4/4S)
deviceMotion.gravity(唯一的加速度计?所以它应该适用于所有装有 iOS4 的 iPhone)
deviceMotion.userAcceleration(唯一的加速度计?所以它应该适用于所有装有 iOS4 的 iPhone)
deviceMotion.magicFied(唯一磁力计?Iphone 3GS/4/4S with iOS4)
最佳答案
更新(硬件):
deviceMotion 属性仅适用于同时具有加速计和陀螺仪的设备。这是因为它的子属性是传感器融合算法的结果,即两个信号一起评估以减少估计误差。特别是当需要高精度时,快速移动设备上的重力估计仍然是一项艰巨的工作(汽车导航、卫星定位……面临同样的问题)。流行的融合算法例如是 Kalman filter和衍生物,但我猜 CMMotionManager 的内部实现是基于更简单、更快的算法。
鉴于此,您只有 CMMotionManger accelerometerData
和 gyroData
的原始传感器数据属性,它们与传感器 1:1 相关 - 在 iOS 5 的情况下磁力计数据
。 deviceMotion
及其所有超属性都是融合算法内部实现的计算结果。
旧答案:
iOS 4.x:
CMMotionManager 支持陀螺仪和加速度计。它提供 isXxxAvailable 和 isXxxActive 来查询硬件功能并确定状态,例如accelerometerAvailable和 accelerometerActive 。此外,如果设备上有加速度计和陀螺仪,则有一种简单但相当有效的传感器融合算法,称为 DeviceMotion - 不需要指南针,因此不使用。类似于您使用的传感器deviceMotionAvailable和 deviceMotionActive用于获取信息。
磁力计只能通过 CLLocationManager 使用。
当应用程序在挂起后再次进入前台时,我有时会遇到 deviceMotionActive 问题(虽然 DeviceMotion 之前肯定已停止,但得到 true
)。
iOS 5.x: 磁力计支持已添加到 CMMotionManager 中,并像其他两个传感器一样进行处理。
一般: 您甚至可以在 iPhone 3g(使用 iOS4)上使用 CMMotionManager。您无权访问 CMDeviceMotion,但可以查询加速度计更新。因此,您必须使用低通滤波来获得重力估计,这比 DeviceMotion 差得多。
您不应使用 iOS 4 之前的接口(interface) UIAccelerometerDelegate。
关于iPhone - CMMotionManager 属性和 iPhone 硬件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7900888/