2014-01-03 2 views
3

Я пытался найти (или вниз, что было бы не намного сложнее найти, просто умножить на -1) на андроид без хорошего решения. Мне нужен вектор, направленный вверх в той же системе координат, что и тот, который используется акселерометром. Таким образом, я буду в состоянии:Как найти вверх или вниз с помощью датчика ориентации устройства?

  • удалить силу добавленный под действием силы тяжести на выходе акселерометра
  • детерминированной, если устройство встряхивали в вертикальном направлении или нет.

Датчик силы тяжести: Во-первых, я думал, используя датчик силы тяжести, который был бы самым простым решением. Но! мое устройство не имеет датчик силы тяжести ...

Магнитный датчик Область: Таким образом, я думал использовать датчик магнитного поля, чтобы найти два вектора, указывающие на север в двух различных положениях, но с той же ориентацией, после того, что я вычислил поперечное произведение обоих векторов, чтобы попытаться найти вектор, направленный вверх или вниз. Это не сработало (или казалось, что это не так).

Магнитное поле с акселерометром: Затем я подумал о том, чтобы сделать кросс-продукт, но на этот раз с вектором, созданным датчиком магнитного поля, и одним, предусмотренным акселерометром. Я не мог найти, как, потому что акселерометр немного наклоняется вниз, когда пользователь ускоряется из-за гравитационного притяжения.

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

Проще говоря, как я детерминированным, что это вектор направлен вверх, в системе координат, используемой акселерометром, если у меня есть эти датчики:

  • ориентация
  • акселерометр
  • магнитное поле

ответ

3

К сожалению, эта проблема не особо проста. Я недостаточно знаком с API Android и, возможно, если вы посмотрите вокруг, вы найдете что-то, что пытается изолировать ускорение силы тяжести от ускорения внешнего устройства (я знаю, что есть алгоритмы слияния датчиков, которые делают это с определенной степенью успеха) ,

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

Вместо этого я предлагаю вам либо предположить, что локальные силы на устройстве незначительны, и поэтому ваше ускорение является вектором силы тяжести. Или, как вы упомянули, используйте фильтр нижних частот, который для большинства целей будет достаточным (и является общим способом определения DOWN для целей слияния датчиков и дополненной реальности).

Всего наилучшего!

+0

Я доволен этим ответом, хотя он не дает конкретного решения, которое не упоминалось ранее, поскольку оно подтверждает, что трудно отличить гравитационную силу и что фильтр нижних частот, вероятно, является способом идти. Спасибо, что подтвердили! – Slackware

+0

Нет проблем :) На боковой ноте вам может быть интересна быстрая запись, которую я сделал на сенсорном оборудовании: http://www.reddit.com/r/Android/comments/1rd8ja/how_much_have_sensors_improved_since_the_nexus_s/ – TheIT

1

Магнитное поле не является горизонтальным, поэтому ваши решения с магнитометром не работают. Это называется магнитным погружением. Вообще говоря, если вы хотите определить вектор вверх/вниз, вы не должны полагаться на магнитное поле, потому что другие решения проще реализовать и точнее.

два основных решения, чтобы найти вверх/вниз вектор являются:

  • низких частот на акселерометр. Это может быть недостаточно для ваших целей.
  • Датчик слияния на гироскоп и акселерометр. Это будет достаточно точной, но для этого требуется хорошая головка для математики (т. Е .: матрицы или кватернионы)

Удачи!

+0

Работа с гироскопом определенно хорошая идея, когда она доступна. Будет проверять решения, когда у меня есть доступ к одному – Slackware

+0

Если у вас нет устройства гироскопа на вашем устройстве, единственным решением является использование акселерометра и низкочастотного сигнала. И, как я сказал, это может быть недостаточно для вашего приложения (что я не уверен, что полностью понимаю). Обратите внимание, что даже в этом случае использование магнитометра не является хорошим вариантом: если, например, магнитное погружение составляет 45 градусов, и вы читаете 45-градусный угол между акселерометром и вектором магнитометра, то вы можете быть полностью или горизонтально горизонтально при 1G при падении из-за силы тяжести, так что это еще неопределенная проблема. – marcv81

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