Android端末で加速度センサーを使う場合、「TYPE_ACCELEROMETER」と「TYPE_LINEAR_ACCELERATION」があります。
ドキュメントによると、「TYPE_ACCELEROMETER」は、一般的な加速度センサーの値(えーと、重力を含めた値です)が取得でき、「TYPE_LINEAR_ACCELERATION」では、重力の影響を除いた加速度が取得できるそうです。
Motion Sensors – Android Developers
もちろん端末に搭載されてる加速度センサーは1つなので、LINEAR_ACCELERATIONはACCELEROMETERから算出したあたいなのですが、
・・・なんか、検知の精度とか応答性が違うような気がしませんか。
(もちろん厳密には違って当たり前なのですが、使用感に影響するような差があるような気がしたのです)
ということで、ちょっと調べてみたのでメモ。
TYPEによるセンサ値の違い
垂直移動時
スマホを床に置いた状態で、真上に持ち上げたり、下げたりした時のSensorから取得できるZ軸加速度です。
黄色:TYPE_ACCELEROMETER Z軸
茶色:TYPE_LINEAR_ACCELERATION Z軸
横軸は経過時間(ms)です。
LINEAR_ACCELERATIONは、ちゃんと重力加速度=9.8m/s^2が除かれた値が取得できています。
・・・で、問題の応答性ですが、・・・データを見る限りでは全然問題ないですね。
ただ気が付いたのは、何らかの原因でセンサ値が取得できなくなった場合、再度ACCELEROMETERが取得できるようになってからLINEAR_ACCELERATIONが取得できるようになるまで約700msの遅延があるようです。
(グラフの11777ms、13249ms辺り)
センサ値が一旦クリアされてるのかな?
回転時
せっかくなので回転運動時のセンサ値もとってみました。
スマホを床に寝かせた状態から、手前に引き起こした場合のZ軸加速度です。
こちらもとくに遅延なく取得できてました。
ACCELEROMETER+ハイパスフィルタとLINEAR_ACCELERATION
Android Developersのサンプルコードには、ACCELEROMETERで取得できるセンサ値をハイパスフィルタ処理を使って直線加速度を求める方法が載っています。
せっかくなので、サンプルコードで算出した値とLINEAR_ACCELERATIONを使った場合とでは、どんな違いがあるのかも計算してみました。
垂直移動時
黄色:TYPE_ACCELEROMETER+ハイパスフィルタ Z軸
茶色:TYPE_LINEAR_ACCELERATION Z軸
横軸は経過時間(ms)です。
α=0.95
α=0.9
α=0.7
回転時
α=0.95
α=0.9
α=0.7
サンプルコードのα値を変えて試してみましたが、α>0.95にするとLINEAR_ACCELERATIONに近い波形になりました。
あとがき
加速度センサーについて、ちょっと気になったので調べてみました。
かなり適当な実験ですが、ACCELEROMETERとLINEAR_ACCELERATIONの違いは把握できたかなと。
とりあえず加速度を取りたいときは、LINEAR_ACCELERATIONを使っとけばいいんじゃないかと。
傾きとかも知りたいときはACCELEROMETERって感じかな。
(あっでもGYROSCOPEあるし・・・)
ただ、加速度センサー使ったアプリってゲーム以外だとあんまり思いつかないな~。フリフリ通信ぐらい。
やっぱり、加速度センサーはAndroid Wearで使ってこそ面白いことができそうな気がするこの頃です。
ではでは~。