万歩計の作り方(Ver.3.0.0)

◇SmartTraining 3.0.0
Ver.3.0.0で万歩計ロジックを大幅に変更しました。
ザザっと解説。

◇どうやって歩数を測るか
SmartTrainingにおける万歩計は3次元の加速度データを利用します。

◎加速度成分合成値の計算
携帯電話は本物の万歩計と違ってどうやって保持されるかわからないので、1次元の加速度だけでは、正確に計測できない可能性があります。このため、3次元の加速度(raw-x,raw-y,raw-z)を合成した値(raw-composit)を求めます。


◎デジタルフィルタ
raw-compositは基本的にセンサーから取得した生のデータです。生のデータには、歩数計算には邪魔な、様々な雑音が含まれます。歩行時の体の回転による加速度、ポケットの中での端末の振動などなど。余分な雑音は取り除いておいた方がより正確な歩数計測が行えるので、デジタルフィルタを適用して不要な成分を取り除きます。
今回は、IIRによるLPFを作成し0.0030Hzより高い周波数成分を排除しています。デジタルフィルタを適用することでprocessed-compositを計算します。IIRのパラメータはフィルタ職人の腕の見せ所ということでうやむやにします。


◎歩数のカウント
processed-compositは、安静時の重力加速度(G)を中央値として、一定の振幅で振動しています。歩数計では、この加速度の振幅の山と谷を1サイクルとして認識してサイクルを検知することで歩数を数えることにします。サイクルの検知条件は下記のとおりです。
・山の振幅が一定以上あること。
・谷の振幅が一定以下あること。
・山と谷の振幅が一定以上あること。
・山と谷の時間差が一定時間内であること。
山の後でこれらの条件を満たさない場合、再び山の検知処理を続けます。
こうしてカウントをすると以下のグラフのshakeの値が歩数を表しています。


この方式に変更することで、以前の方式が20%程度の誤差だったのに対して、2%程度の誤差まで性能向上を図ることができました。

◇注意事項
どんな方式で万歩計を作成するにしろ、計測条件は計測結果に大きく影響を与えます。
今回の方式では、どんな持ち方をしてもある程度計測できるように3次元の合成値を利用していますが、だからといって、端末が回転するような持ち方をするとノイズが多すぎて正しい計測はできません。
「腰より高い位置で体に密着させて固定」が推奨する持ち方です。

また、世の中には様々なAndroid端末が存在しています。
端末内蔵の加速度計も様々種類があり、取得できるデータの頻度も異なります。

Ver.3.0.0から加速度データをエクスポートできるようにしているので、万歩計の精度が気になる人は自分のデータを取って見てみましょう。

コメント

このブログの人気の投稿

Execノードを使う

SendGridのX-SMTPAPIヘッダの使い方(Section Tags、Substitution Tags編)

Joinノードを使う(その4)