iOS Androidデバイスでの歩数・アクティビティの取得と問題

 iPhone3GSやAndroid1.5〜2.1の時代をご存じの方であれば、加速度センサーの値の変化から歩数をカウントするアプリの記憶があるのではないでしょうか。当時は加速度含め各種センサーそのものが搭載され扱えるということが新しく、利用方法を模索していた時期だったように思います。あれから7年が経過した今、歩数の取得の実態について紹介したいと思います。

モーションコプロセッサの登場

iOS8以降、かつiPhone5s以降の端末、またはAndroid4.4以降の端末(一部除く)にはモーションコプロセッサが搭載されています。これはジャイロセンサー・加速度センサー・コンパス等のセンサー情報を処理する副プロセッサです。過去に歩数を取得するためにはアプリやプロセスにて常にセンサーの値を取得・監視する必要がありましたが、今はモーションコプロセッサとOSがこういった事を常に行ってくれています。それも、主CPUを使うよりも省電力で、かつ多数のセンサーの値を複合的に分析し「ウォーキング」「ランニング」「自転車」といった移動手段の判断まで行えます。

ヘルスケア・Google Fit、歩数を取得するAPI提供の開始

モーションコプロセッサの登場と合わせてiOSであればヘルスケア(エンジニア的にはHealth Kit)、AndroidであればGoogle Fitといったサービスが開始され、これらのサービスと連携するためのAPIの提供が始まりました。また、これらのサービスと連携せずともCoreMotion(iOS)やSensors(Android)に歩数を取得可能なメソッドが追加されました。

歩数、アクティビティの検出精度

加速度センサーの値に頼った歩数のカウントでは端末を振ってもカウントされる問題が付きまといます。モーションコプロセッサの分析なら、これを解決してくれているのでは…と思ったのですが、残念ながら解決されていませんでした。ヘルスケアもGoogle Fitも、CoreMotion(iOS)もSensors(Android)も振ると歩数が増えます。そして強く振ると走っている扱いになります。AppleもGoogleもモーションコプロセッサの分析の精度が高いと謳っている節がありますが、これはあくまで「ウォーキング」「ランニング」といったアクティビティの種類の区別が出来ることを高精度と言っているのかもしれません。

ヘルスケア・Google FitとGPS、しかし…

上記の検出精度の対策として、位置情報を組み合わせる方法があります。一定の時間おける位置情報の変化が20km/h程度であれば人力である、といった具合です。ヘルスケアとGoogle Fit、どちらのアプリもアクティビティを判断する基準に位置情報を用いています。しかし常時GPSによる高精度な位置情報を利用しているわけではありません。ここからは使用感からの推測ですが10分前後の間隔で取得と判断を行っているようです。このため5分程度の運動については正しく認識されない事が多いです。また、逆に短時間の乗り物による移動も、その後のいち情報の取得状況によっては運動とみなされる場合があります。具体的な事例としては…
 ・5分程度の歩行や自転車による移動は認識されない。ただし途中のコンビニで買い物をした場合はアクティビティとして扱われる場合がある。
 ・山手線で2駅だけ電車に乗って高架下で人を待っていたら乗車区間も含め歩き扱い。

また余談ですが、ロードレーサーのような自転車を趣味にしている方はヘルスケアとGoogle Fitの計測では自動車扱いされる可能性が高いです。

歩数を利用する上で気をつけるべきこと

これを書いている2016年の時点でも、完璧な歩数のカウントは出来ません。
取得できる内容の実態は、
 ・歩数らしき振動の回数
 ・その強度(ウォーキング相当 or ランニング相当)
となります。
また歩数を意図的に増やす事が可能であったり、計測漏れが起こる点には昔と変わらず注意が必要です。
歩数を使って高いインセンティブを発生させる企画は避けた方が良いでしょう。

歩数を扱う検討の際の参考になれば幸いです。

●この記事を書いた人