加速度センサーをだいぶ前にお試しで使ってみたものの、せっかくならロボット等の速度計や距離計のアプリケーションに使えないかと少し頭をひねってみました。





最大の問題は重力加速度です。で、先人の知恵を借りようと、Android ではどうやって除去しているのか調べてみました。

Android SensorEvent
http://developer.android.com/reference/android/hardware/SensorEvent.html

Android ではハイパスフィルタを推奨しているようです。コードを抜粋します。


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];
}


基本的なアイディアとしては、前の状態のデータを保持して、現在のデータから引くことで一定値である重力の影響を排除できるという考え方ですね。

う~ん。どうも係数アルファの設定が肝のようですが、いまいち理解できていません。


ということで自分なりに考えてみました。話を簡単にするために2次元で考えてみます。水平静止状態でX方向に加速度 a で動いているシチュエーションを考えてみます。




加速度センサーは水平であるとは限りません(むしろ水平の方が稀)。軸が回転している状態を考えてみます。




この時、重力加速度と加速度の合成 p は次のように表現できます。 px と py は、加速度センサーが検出した値です。


p*p = a*a + g * g ----- (1)
p*p = px*px + py*py ---- (2)


ここで求めたいのは a なので、


a*a = p*p - g*g = px*px + py*py - g*g
∴ a = ±sqrt (px*px + py*py - g*g)


ということになります。プラスマイナスの判定は軸がひっくり返ることがなければ px の符号で判定できそうですが、もう少し考察が必要そうです。そこは息子に宿題として託しました。σ(^_^;

そのうち実験して Android のハイパスフィルタがよいか、今回考察した内容がよいか試してみたいと思います。
(^_^)/~


関連記事
Arduino 3軸加速度センサーのI2C接続うまく行きましたー
http://makers-with-myson.blog.so-net.ne.jp/2014-03-16

Arduino 3軸加速度センサーで大ハマリ中。。
http://makers-with-myson.blog.so-net.ne.jp/2014-03-15

Arduino で3軸加速度センサーを試してみた!
http://makers-with-myson.blog.so-net.ne.jp/2014-03-08









TWE‐Liteではじめる「センサー」電子工作―「加速度」「位置」「温度」の情報を無線で飛ばす! (I・O BOOKS)

  • 作者: 大澤 文孝
  • 出版社/メーカー: 工学社
  • 発売日: 2015/11
  • メディア: 単行本