2013-05-13 2 views
4

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

ответ

6

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

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

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

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

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


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

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

0

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

0

3 года спустя, но все еще считает, что это неразрешенный вопрос. Я не думаю, что для CMAccelerometerData «все отлично» читать примерно 1 г в -Z-оси, потому что согласно их доктору (https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html) + Z отображается с экрана наружу.Когда телефон кладет на стол, с экраном вверх, это означает, что он экспериментирует с повышательной силой стола. См. Это google talk в 09:15. То же самое происходит с x и y.

Показания гироскопа ведут себя, как описано в документации, с x справа, y вверху и z от экрана наружу.

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

0

Как переполнение стека новичком, у меня, видимо, недостаточно репутации, чтобы прокомментировать некоторые другие сообщения ... Но я пришел к такому же выводу, что и cduguet. Основываясь на объявленной системе координат iPhone (https://developer.apple.com/documentation/coremotion/getting_processed_device_motion_data/understanding_reference_frames_and_device_attitude#2875084), данные отношения согласуются с объявленными координатными осями. То есть положительное вращение телефона (в смысле «правильное правое») вокруг любой оси регистрирует соответственно положительное увеличение скорости гироскопа. Что имеет смысл и что я ожидаю.

Однако, когда вы передаете линейное ускорение в положительном направлении на любую ось, CMmanager записывает данные как отрицательное значение. Я делал этот тест десятки раз на всех осях и продолжал находить тот же противоречивый результат.

Я могу изменить знак всех значений линейного ускорения, чтобы уравнения движения соответствовали системе координат телефона, но я все время пытаюсь понять, почему Apple выбрала бы это соглашение о знаках. Это просто не имеет смысла для меня.

 Смежные вопросы

  • Нет связанных вопросов^_^