Androidスマホにおける「歩数カウント」精度向上への歩み

こんにちは、R&D部の小野知之です。

このたび、京都府精華町さんから「セイカ歩数計」というAndroid スマホアプリが Google Play で公開されました。コミPo! で誕生した精華町の広報キャラクター「京町セイカ」が登場する、便利で楽しいアプリです。

クリックするとGoogle Playのページの 二次元バーコードが表示されます

google-play-badge

2017年4月12日追記

この記事で紹介している「セイカ歩数計」でも使用されている歩数検出装置、歩数検出方法及びコンピュータープログラムで特許を取得しました。詳しくはこちらのブログ記事「『歩数検出装置、歩数検出方法及びコンピュータープログラム』で特許を取得しました」をご覧ください。

精華町から発表された情報

このアプリは当社からのOEMで、開発は私、小野と佐藤伸が担当しました。

そんなわけで今回は、この歩数計の「歩数カウント処理」部分の開発における様々な試行錯誤について、簡単にお話ししたいと思います。

…えぇ、開発当初は、かなり甘く見ていました

はじめの1歩:歩数カウントの基本

スマホアプリで歩数をカウントするには「加速度センサー」を使用します。歩行による振動が発生すると、アプリにセンサーから加速度値が送られてくるので、これを元にして「一歩」を検出します。

しかし、あらゆる振動を単に数えるだけでは、歩数計としてはまったく使い物になりません。そこで、「地面に対して垂直(上下)方向の振動ならば、歩行時の振動である可能性が高い」と考えます。上下方向の加速度値の増減だけを抽出して、歩数のカウントに使用するわけです。

ところが、スマホの加速度センサーから得られるのは、本体を基準とする相対座標系のX,Y,Z軸方向の加速度値のみです。そのため、スマホの傾きによって軸の向きが変わってしまうので、地面に対する上下の振動のみを抽出することが、加速度センサーだけではできません。

sensor_thumb

クリックで拡大

そこで、スマホが現在どのように傾いているかを「地磁気センサー」を使用して取得します。加速度センサーと地磁気センサーから得た値を行列式を用いて変換することで、地面に対する上下方向の加速度値のみを抽出します。

この、上下方向の加速度値を用いるのが、歩数カウントの基本となります。

 

2歩目:キレイに増減しない!

地面に対する上下方向の加速度値が得られれば、あとはこの波形(値の増減の推移)を使ってカウントするだけで良さそうに思います。

しかし、いざやってみると、そう簡単にはいかなかったのです。

まず、スマホの加速度センサーからアプリに加速度値が送られてくるタイミングは「不定期」なのです。激しく振動するとたくさん来るし、動いていないと少ししか来ません。

更に、加速度値自体もそんなにキレイなカーブを描くように増減するわけではありませんでした。所々に上下のブレ(ノイズ)が混ざり、想定していたよりもかなりガタガタでした。

このため、カウント処理の前にデータの補正(ノイズ削減など)をし、なるべく規則正しく自然な増減を繰り返す波形になるように加工してやる必要がありました。

補正後のデータの例。

補正後のデータの例。途中で立ち止まったりしています。

3歩目:環境ノイズか歩行か?

増減の波形が得られれば、あとは中央値(加速度ゼロ)を上下に往復したら「一歩」とカウントするだけで良さそうに思います。

しかし、いざやってみると、そう簡単にはいかなかったのです。

加速度センサーは、思っていたよりも遥かに敏感でした。単にそっと机に置いてあるだけでも、常に何らかの微妙な振動(環境ノイズ)を検出し、アプリに送り続けてきます。

…地動説が正しかったかどうかとは無関係です(笑)。

近くを他の人が歩いて通り過ぎただけでも、はっきりとした値の増減を検出してしまいます。これでは、単純に加速度値の上下往復をカウントするだけだと、とんでもない歩数になってしまいます。

そこで、「この値より小さければ歩行と認めず、環境ノイズとして無視する」という「しきい値」を決める必要がありました。

ただし、しきい値が小さすぎると大きめの環境ノイズをカットできないし、しきい値が大きすぎると今度は「静かに歩いたとき」の歩数がカウントされなくなってしまいます。

しきい値を決めるにあたり、試作アプリにログファイル出力機能を追加し、様々な状況下における振動データを収集して分析しました。こうして、「環境ノイズか歩行の振動か」を区別するためのしきい値を決めました。

しかし、これだけではまだ不十分でした。

 

4歩目:そもそも歩行中?

しきい値を決めることで、小さな環境ノイズをカットするようにしましたが、まだカウント精度は実用的と言えるレベルに達していませんでした。

スマホに試作アプリを入れ、有名メーカー製の歩数計測専用機と一緒に携帯してしばらく使い続けてみると、カウント結果がどうしても専用機よりかなり多くなってしまいました。

ログを分析したところ、原因はすぐにわかりました。歩行時以外の「電車内の振動」や「ポケットからの出し入れ」などの大きな上下振動をすべて「一歩」としてカウントしてしまうからでした。

この問題を解決するには、その大きな振動が「歩行によるものか否か」を区別しないとなりません。そこで、「振動が継続するか」を確認する処理を追加しました。継続しなければ、それは歩行による振動ではないと考えられるわけです。

この判定処理の開発には、精度を高めるためのチューニングに非常に多くの時間を要しました。毎日の通勤時に、歩数計測専用機と多数のスマホを持ち歩き、ログを収集して分析し、しきい値と一緒に調整を繰り返して精度を少しずつ高めていく必要がありました。

 

5歩目:個人差が! 個体差が!

ここまでの試行錯誤で、ようやく実用的な精度で歩数をカウントできるようになってきました。そこで次に、社内の他の人にも試しに使ってもらいました。

ところが…。結果はあまり良くありませんでした。人によっては、誤差が大きすぎてとても実用的とは言えない結果になりました。ここまでのチューニングが、ほぼ私一人のデータだけに頼っていたことが大失敗でした。

人の歩き方には非常に大きな「個人差」があったのです。例えば、踏み込みの強さによって、加速度の上下への「偏り」が生じます。もちろん偏り方は人によって異なります。

その他にも、例えば階段や坂道の昇降時にも加速度の上下への偏りが生じます。更に、スマホのセンサーの個体差によって、最初から偏りが生じていたり、値が大きめ・小さめに出るケースも見つかりました。

これらの想定外の「偏り」が原因で、苦労して決めた「しきい値」の範囲に加速度値がうまく収まらず、カウントミスが多発してしまったのです。

そこで、この問題を解決するために、加速度の偏りを検出して常にしきい値を自動補正する処理を追加する必要がありました。

もちろん精度向上のためのチューニングが必要なのですが、今回の問題は個人差・個体差が原因です。とにかく一人でも多くの人・一台でも多くの端末でテストする必要がありますから、とても手間のかかる作業でした。

しかし、これでようやく今度こそ、「実用的」と言える精度の歩数カウント処理が完成しました。

 

6歩目:バッテリー消費が!

さて、歩数カウントの精度は問題ないレベルになったのですが、まだ最後に、非常に大きな問題が残っていました。

バッテリー消費です。

スマホのスリープ中でもセンサーを動かし続けなくてはならないわけですから、どうしてもバッテリーへの負荷が大きいのです。

これもまた、試行錯誤とチューニングをひたすら繰り返す必要がありました。なにしろ、バッテリー消費を減らそうとすればするほど今度はカウント精度が低下してしまいますから、このバランスを取るのが大変でした。

そして、動的にセンサーの感度を落としたり一時停止したりするといったような工夫を盛り込むことで、バッテリー消費を大幅に削減し、なんとか「動かしっぱなしでも大丈夫」なレベルになったかな…と思います。

なお、Android 4.4 からは、API で歩数計センサーをサポートしています。歩数計センサーを搭載している機種はまだ少ないですが、対応端末が増えれば、これを併用することでいろいろと改善するかもしれません。

 

7歩目:健康に良い!

おまけのお話です。

開発中は、様々な判定処理やパラメータのチューニングを繰り返して来たわけですが、この作業は具体的にはこんな感じでした。

ポケットとカバンに、歩数計測専用機と、スマホ(10台位)を入れて持ち歩き、ログファイルを収集してExcelでグラフ化。波形とカウント結果を見比べながら、カウントミスしている箇所を探し出し、精度が上がるように判定処理やパラメータを調整。

これを毎日の通勤の往復時にひたすら繰り返し、また会社では近所をぐるぐる歩き回ったりして、チューニングを続けて精度を上げていきました。

スマホも、何台も持つと結構重いです。

おかげですっかり足腰が鍛えられました。

歩数計(の開発)は、とても健康に良いです。

 

さいごの1歩

こうして、実用的な精度で歩数をカウントできるようになりましたが、更に精度を上げる余地はたくさん残っています。バッテリー消費についても、アイデアはまだまだあるので、次の機会には更なる省電力化に取り組みたいと思っています。

「セイカ歩数計」は、歩数カウントだけでなく、グラフ表示によるわかりやすい歩数履歴表示や、一定条件を達成するたびにプレゼントされる記念メダルの収集など、実用的かつ楽しい要素を詰め込んでいます。

皆さんも是非、ダウンロードして毎日使いながら、いつまでも健康な身体を維持してください!

タグ , , , , | 2020/06/18 更新 |