2014-10-24 4 views
0

Я использую линейный акселерометр для обнаружения встряхивания, я использую этот код:стабильность линейного акселерометра? Android

  float x = event.values[0] ; 
      float y = event.values[1] ; 
      float z = event.values[2] ; 
      float acceleration = (float) Math.sqrt(x * x + y * y + z * z); 
      if(acceleration > 5) 
      { 
       Toast.makeText(this,"shaking",Toast.Length_long).show(); 
      } 

проблема в том, когда я встряхнуть устройство, ускорение становится 10, например, но когда я прекратить встряхивание устройства на ускорение не возвращается к нулю сразу, это занимает несколько секунд!

   -  shaking the device   -    no shaking    - 
acceleration = 20 19 22 23 24 20 24 25 30 - 19 18 17 15 13 0000000000    - 

Почему это происходит?

ответ

0

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

Если вы хотите уменьшить задержку, попробуйте напрямую использовать показания физического физического акселерометра и реализовать собственный фильтр верхних частот, чтобы избавиться от компонента силы тяжести. Вы можете попробовать использовать фильтры более высокого порядка, что уменьшает задержку, но за счет введения артефактов. У меня был хороший опыт, используя Butterworth filter, если вам нужно сначала попробовать.