Обновление (аппаратное обеспечение):
Свойство deviceMotion доступно только на устройствах, имеющих как акселерометр, так и гироскоп.Это связано с тем, что его подчиненные свойства являются результатом алгоритма слияния датчиков, т.е. оба сигнала оцениваются вместе, чтобы уменьшить ошибки оценки.В частности, оценка силы тяжести на быстродвижущихся устройствах все еще является тяжелой работой, когда требуется высокая точность (автомобильная навигация, спутниковое позиционирование, ... сталкиваются с такими же проблемами).К популярным алгоритмам слияния относятся, например, фильтр Калмана и его производные, но я полагаю, что внутренняя реализация CMMotionManager основана на более простых и, следовательно, более быстрых алгоритмах.CMMotionManger accelerometerData
и gyroData
, которые связаны 1: 1 с датчиком - и в случае iOS 5 magnetometerData
.deviceMotion
и все его sup-свойства являются вычисленным результатом внутренней реализации алгоритмов слияния.
Старый ответ:
iOS 4.x:
CMMotionManager поддерживает гироскоп и акселерометр.Он обеспечивает isXxxAvailable и isXxxActive для запроса аппаратных возможностей и определения состояния, например, accelerometerAvailable и accelerometerActive .Кроме того, существует простой, но довольно эффективный алгоритм объединения датчиков, называемый DeviceMotion, если на устройстве имеется акселерометр и гироскоп - компас не нужен и, следовательно, не используется.Аналог для датчиков, которые вы используете deviceMotionAvailable и deviceMotionActive для получения информации.
Магнитометр доступен только через CLLocationManager.
У меня иногда возникали проблемы с deviceMotionActive, когда приложение снова выходит на передний план после приостановки (получил true
, хотя DeviceMotion определенно был остановлен раньше).
iOS 5.x: Поддержка магнитометра добавлена в CMMotionManager и обрабатывается как два других датчика.
Общие сведения: Вы можете использовать CMMotionManager даже на iPhone3g (с iOS4).У вас нет доступа к CMDeviceMotion, но вы можете запрашивать обновления акселерометра.Таким образом, вы должны использовать низкочастотную фильтрацию, чтобы получить оценку силы тяжести, и она намного хуже, чем DeviceMotion.
Не следует использовать UIAccelerometerDelegate с интерфейсом до iOS 4.