2015-06-10 2 views
1

Я разрабатываю приложение для Android, которое должно проверять, остается ли устройство неподвижным. Это должно работать, когда я кладу устройство на ровную поверхность. Это также должно работать, когда устройство лежит по обеим сторонам устройства. Пока я держу устройство очень тихо в руке, проверка должна завершиться неудачей. Потому что небольшое движение от руки/руки должно быть достаточным для обнаружения движения.Устройство обнаружения акселерометра Android, лежащее неподвижно

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

0.07366191 
0.056904275 
0.034122672 
0.047471035 
0.080519415 
0.07816742 
1.2434766 
0.34602648 
0.25965866 
0.52344894 
0.14806636 

Я попытался следующим:

  • 10 секунд калибровки, лежа на столе, хранение, что калиброванное значение и использовать его в качестве порогового значения.
  • Исправлено пороговое значение на основе Math.sqrt(ax * ax + ay * ay + az * az) результатов.
  • Использование либо TYPE_LINEAR_ACCELERATION, либо обычного типа.
  • Использование силы тяжести (9.8) в качестве порога.

На данный момент я не знаю, что делать дальше. Я действительно надеюсь, что кто-то может мне помочь. Заранее спасибо.

ответ

0

Я не уверен, какие значения акселерометр Android выйдет, но если это похоже на другие акселерометры, с которыми я работал, это даст вам регулярные образцы количества Gs или миллиграмм, которые устройство чувствует направления x, y и z (где оси x-, y- и z-оси фиксированы относительно устройства - обычно вы можете найти руководство для акселерометра, которое скажет вам, каким образом это то, что).

Например, акселерометр, лежащий в плоскости, испытывает один G вверх. Если выход находится в миллисекундах, он будет непрерывно выводиться (0,0,1000). Если вы перевернете его, он выведет (0,0, -1000).

Будет немного шума, поэтому вы увидите такие значения, как (-2,5,998), (1,0 1001) и т. Д. Вместо (0,0,1000). Один из способов фильтрации этого шума - запомнить последние несколько выборок и усреднить их, а затем использовать среднее значение вместо необработанных данных для принятия решения.

Для решения вы можете попробовать проверить, находится ли z-компонент из G-показаний, например, на расстоянии 20 единиц от 1000 или -1000.

+0

Спасибо за предложение. Я сделал следующее. Кэширование 100 образцов оси X, Y и Z 'Math.sqrt (ax * ax + ay * ay + az * az)' output. То, что происходит, составляет средние значения около 9,67 на плоской поверхности. Удерживая устройство рядом с моей головой или очень сильно в моей руке, он идет от 9.60 до 9.75. Очень трудно различать их. Есть идеи? Также почему я хочу проверить ось z для принятия решения? – Jeroen

+0

Скважирование выходных значений, их суммирование и получение квадратного корня дает вам величину правильного ускорения. Это может помочь вам решить, движется ли устройство, но это не поможет вам определить ориентацию устройства. Предполагая, что ось z перпендикулярна плоскости экрана устройства, это интересующая вас координата. Если устройство не ускоряется, он не может испытывать больше одного G в направлении z. (Попробуйте распечатать только показания az, и вы увидите, что они находятся на максимуме, когда устройство находится параллельно земле и неподвижно.) –

+0

Вы также можете попытаться вычислить углы наклона и наклона устройства. Если устройство разбито вперед или назад или свернуто из стороны в сторону, оно не сидит ровно. Вот статья с формулами для тангажа и ролла: http://theccontinuum.com/2012/09/24/arduino-imu-pitch-roll-from-accelerometer/ –

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