Как использовать акселерометр для обнаружения вибрации выше 1 Гс? - PullRequest
3 голосов
/ 05 мая 2011

Я делаю приложение для Android, которое напоминает автомобильный черный ящик, в котором записывается процесс движения автомобиля.

Но теперь я столкнулся с проблемой того, как я собираюсь интегрировать акселерометр, которыйспособен обнаруживать небольшое движение (вероятно,> 1G), когда происходит авария, это может привести к остановке видеозаписи и сохранению ее в архивном файле, таким образом, не теряя файл в результате аварии. Любой знает, как это сделать.Вышеупомянутая задача контролировать любые формы вибрации?

Я новичок в Android / Java, может кто-нибудь помочь мне?Заранее спасибо ...

Это часть раздела видеозаписи, но как теперь я собираюсь использовать акселерометр для целей "Автоархивации"?

1 Ответ

1 голос
/ 05 мая 2011

Вам необходимо использовать onSensorChanged(SensorEvent event) обратный вызов интерфейса SensorEventListener

Получить подробную информацию о классе SensorEvent можно здесь: http://developer.android.com/reference/android/hardware/SensorEvent.html

Есть пример на IBM developerWorksстраница: http://www.ibm.com/developerworks/opensource/library/os-android-sensor/index.html


со справочных страниц для Android:

открытый финальный плавающий []

значения С: APIУровень 3

Длина и содержимое массива значений зависит от того, какой тип датчика отслеживается (определение SensorEvent см. Также в описании используемой системы координат).Sensor.TYPE_ACCELEROMETER: Все значения приведены в единицах СИ (м / с ^ 2)

values[0]: ускорение минус Gx по оси x

values[1]: ускорение минус Gy наось y

values[2]: ускорение минус Gz на оси z

Датчик этого типа измеряет ускорение, приложенное к устройству (Ad).Концептуально это делается путем измерения сил, приложенных к самому датчику (Fs), с использованием соотношения: Ad = - ∑Fs / масса

В частности, сила тяжести всегда влияет на измеренное ускорение: Ad = -g - ∑F / масса

По этой причине, когда устройство сидит на столе (и, очевидно, не ускоряется), акселерометр считывает величину g = 9,81 м / с ^ 2

Аналогично, когда устройство находится в свободном падении и поэтому опасно ускоряется по направлению к земле со скоростью 9,81 м / с ^ 2, его акселерометр показывает величину 0 м / с ^ 2.

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

 public void onSensorChanged(SensorEvent event)
 {
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
 }
...