2011年12月27日火曜日

加速度センサーで振動を検知する

加速度センサーから取得される値には、重力加速度が含まれています。したがって、机の上になどに放置した状態でも重力加速度(9.8m/s2)が取得されます。
端末の振動を検知するには、加速度センサーから取得した値から重力加速度の分を除いてやる必要があります。これを実現するには、ハイパスフィルターを利用します。どうしてハイパスフィルターを通すと重力加速度が除けるのかの説明は割愛して、それをどのように実装するかを解説します。
以下は加速度センサーで取得した値から重力加速度を取り除くサンプルコードです。

public void onSensorChanged(SensorEvent event){
  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];
}
上記はハイパスフィルターの簡単な実装です。まずローパスフィルターで周波数の低い成分(=重力加速度)を抽出し、それを測定値から引いています。
もちろんgravity, linear_accelerationはこれらの外側で宣言されている必要があります。

なお、Android 2.3からは重力加速度を除いた加速度を取得できるTYPE_LINEAR_ACCELERATIONというセンサーが利用可能です。上記の面倒な処理を考えたくない場合はこちらを使うようにした方が良いでしょう。

0 件のコメント:

コメントを投稿