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歩

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

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

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

 

追記

弊社では、この歩数計アプリのOEM提供を行っています。また、各種スマホアプリの受託開発も承っております。ご興味がございましたら、歩数計に限らず、お気軽にご相談ください。

タグ: , , , , | 2017/04/13 更新 |

コメント

6件のコメント

  • N
    2016年10月19日 15:01

    小野知之様

    初めまして、私 精華町のお隣、枚方津田の N と申します
    御苦労の上作成されました歩数計のソフトを私のタブレットに導入させて頂きました 
    本体を腰に巻きつけ(腰のほぼ横)暫く歩きましたが動作は良好です。(まだ1日目です)

    私のタブレットは「HUAWEI Mediapad T2 7.0 pro」ですがこれまで10種類程の 歩数計アプリを使用しました。その結果は本体がスリーブ状になった時、不安定な計数とストップです。
    諦めかけていたのですが、本HPから早速導入しちょっと歩いただけですが本体スリーブ状でも動作しており うれしくコメントを入れました。 他のアプリと選択センサーが違うのでしょうか
    まずはお礼まで

    ※ 個人情報が含まれるため一部を編集させていただきました

  • ウェブテクノロジ
    2016年10月20日 16:54

    お世話になります。開発の小野です。
    歩数計アプリ、ご活用いただきありがとうございます。

    歩数系アプリはスリープ中でもカウントするため、その分バッテリー消費が増えてしまいますが、これは仕様ということでご理解いただければと思います。

    また、セイカ歩数計は、タブレットの大きな画面には対応しておらず、レイアウトが崩れてしまうと思いますが、動作には支障無いと思いますので、ご了承いただけますと幸いです。

  • k2
    2016年11月23日 20:08

    To 小野様
    歩数計アプリの不具合原因を探っていたところ当ページに辿り着いた輩です。m(__)m
    当方の不具合現象は、2台のスマホに同じ歩数計アプリをインストールし、同じポケットに入れて歩くと片方のスマホが歩数をカウントしない。別々のポケット(ズボンの右と左、など)にスマホを入れた場合は、両スマホが歩数をカウントする、という現象です。
    小野様の「7歩目」に’10台のスマホ’での計測の記述がありましたので「同様の経験をされてないか?」と思い、コメントした次第です。
    あ、小野様の回答を求めてる訳ではありません。コメント欄汚しスミマセン m(__)m

    • ウェブテクノロジ
      2016年11月25日 10:35

      k2様

      小野です。コメントありがとうございます。

      「まったくカウントできない端末」というものは存在しますが、「状況によってカウントできない」というケースはありませんでした。
      他の歩数計アプリで試したり、他のスマホ端末と一緒に持ち歩いたりすることで、原因を絞り込めるかもしれません。
      お役に立てず申し訳ありません。

  • S.I
    2017年2月26日 19:58

    歩数計が作動しない

    • ウェブテクノロジ
      2017年2月27日 10:53

      >S.I様
      ※ お名前が記載されていましたが個人情報に当たるため、イニシャルに変更させていただきました。

      歩数計が動作しない原因は複数考えられます。よくある原因と対処方法をご案内いたします。

      1. 省電力機能や省電力アプリ等によって計測が止められてしまっている
      画面OFF等の際に電池の消費を抑えるため動作しているアプリを終了するタイプの機能が働いていた場合、歩数計の機能が止められてしまい、計測ができなくなります。これらの機能をOFFにしていただくか、終了しないアプリとして歩数計を登録してください。

      2. 歩数計アプリが計測停止の状態になっている

      歩数計アプリの画面左上に「計測中」「停止中」と表示されているボタンがあります。「停止中」になっているときは計測されませんので、タップして「計測中」に切り替えてください。

      3. 端末が歩数計の動作に必要なセンサーをサポートしていない

      歩数系アプリはスマートフォンに搭載されているセンサーを利用して歩数を計測しています。センサーが搭載されていないスマートフォンでは計測ができません。(通常は「センサーがない」とエラーが表示されます)

      4. スマートフォン以外の端末を使用している

      タブレット、特にiPadには対応しておりません

      対策を行っても歩数が計測されない場合は一度アプリをアンインストールし、入れ直しをお試しください。(今までの履歴は消去されます)

      改善しない場合は、歩数系アプリから問い合わせのメールを送信できますのでご利用の機種名やスマートフォンのOSなどをお書き添えの上でお問い合わせください。
      よろしくお願いします。

コメントはこちら