CMDeviceMotion userAcceleration перевернут?

Я вижу некоторые неожиданные показания из поля userAcceleration в CMDeviceMotion. Когда я смотрю на необработанные данные акселерометра из CMAccelerometerData, я вижу, что если iPhone лежит плоско на столе, показание составляет 1G прямо вниз (1G по оси -Z), и если я уроню iphone (конечно, на мягкую поверхность), тогда показания акселерометра обнуляются, как и ожидалось. Все в порядке. Когда вместо этого я использую класс CMDeviceMotion, значение userAcceleration равно нулю, как и ожидалось, когда iPhone лежит на столе. Опять же, это нормально. Но когда я бросаю iPhone и читаю userAcceleration CMDeviceManager, значения userAcceleration составляют 1G прямо вверх (+Z), а не вниз (-Z), как и ожидалось. Похоже, что показания userAcceleration на самом деле являются полной противоположностью тому ускорению, которое на самом деле испытывает устройство. Кто-нибудь еще это наблюдал? Могу ли я просто инвертировать (умножить на -1) все значения userAcceleration, прежде чем пытаться интегрировать скорость и положение, или я неправильно понимаю, что читает userAcceleration?


person Marc    schedule 13.05.2013    source источник


Ответы (2)


Существуют некоторые концептуальные различия между CMAccelerometerData.acceleration и CMDeviceMotion.userAcceleration

  1. Необработанные данные акселерометра представляют собой просто сумму всех измеренных ускорений, то есть комбинацию силы тяжести и текущего ускорения устройства.
  2. Данные о движении устройства являются результатом слияния всех трех датчиков, то есть акселерометра, гироскопа и магнитометра. Таким образом устраняются смещения и ошибки (теоретически), а оставшиеся данные об ускорении разделяются на гравитацию и ускорение для удобного использования.

Поэтому, если вы хотите сравнить оба, вам нужно сравнить CMAccelerometerData.acceleration с CMDeviceMotion.userAcceleration + CMDeviceMotion.gravity, чтобы сравнить подобное с подобным.

В общем, CMDeviceMotion — ваш первый выбор в большинстве случаев, когда вам нужны точные значения и независимость от оборудования.

Еще одна вещь, которую следует учитывать, — это CMAttitudeReferenceFrame, который вы предоставляете при запуске обновлений Device Motion через startDeviceMotionUpdatesUsingReferenceFrame. Я не уверен, что такое значение по умолчанию при использовании базовой версии startDeviceMotionUpdates


Вы заявили, что хотите интегрировать значения, чтобы получить скорость и положение. Есть несколько дискуссий по этому поводу, и в итоге я могу сказать, что невозможно получить разумные результаты. Видеть:

Если концепция вашего приложения заставляет вас полагаться на точные результаты более чем на полсекунды, попробуйте изменить ее.

person Kay    schedule 13.05.2013

Оказывается, CMAcceleration не подчиняется правилу правой руки, где x указывает налево, y указывает на нижнюю часть экрана, в этом случае в типичной правосторонней системе ось z должна указывать на верхнюю сторону, но ее нет. Мне неудобно иметь дело с датчиками движения!

person melode11    schedule 11.03.2014