Noblesse Oblige

App/iOS/Android/Unity/cocos2d/VR/GameJam/Hackathon/肉 ブログの記事は勉強会の書きなぐりメモが多め

【DroidKaigi 2017】位置情報を正確にトラッキングする技術

セッション情報 スライドに出てくるサンプルコード

speakerdeck.com

自己紹介

  • @mizutory
  • 元SonyEricsson
  • 現在 Goldrush Computing
  • 位置情報を使ったネイティブアプリ開発をしていた

アジェンダ

  • 位置情報の取得
  • マップへの描画
  • 位置情報フィルタリング
  • バッテリー消費について

位置情報の取得

メモ

  • Criteria:どのように位置情報をとってくるかるかの設定
  • スマホに入っているチップはagps
    • 基地局から取ってくるやつっぽい
    • これをfalseにしてしまうとgpsだけの取得になるので精度が落ちる

マップへの描画

メモ

  • 位置情報を使うアプリでも、マップを使わないアプリはあると思うが、デバッグ目的でマップ上に位置情報を出して見れるようにしておいたほうがわかりやすい
    • バグも見つけやすい
  • map.addCircle()
    • Accuracyをこいつにセットすると、円で精度が見れるようになるので良い
  • map.addMarker()
    • 位置が分かる
  • map.位置情報を線で繋ぐメソッド()
    • 通った経路がわかる

フィルタリング

取得時刻でフィルターする

位置情報取得タイミングに影響を与えるもの

  • GPS衛星の位置 (頭上にたくさんあるかどうか)
  • 衛生とAndroid機との間の障害物 (ビル、受寄、雲など)
  • 携帯電話基地局の位置 (近くにたくさんあるか)
  • 携帯電話基地局Android機との間の障害物の状況
  • 古い位置情報が来るときは、キャッシュされた位置情報

サンプルコード

メモ

  • 水平方向の精度はgetAccuracyで取れるのだが、取れないケースがある
    • 0になるケース
      • gpsプロバイダーから取れた時は、0にはならないが、それ以外だと0になることがある (一応ドキュエントに書いてあるけど、曖昧)
    • マイナスの値が帰ってくるケース
      • Androidドキュメントには書いてないけど、マイナスが帰ってくるときがあり、その時はおかしな位置情報のことが多いので取らない
      • サンプルコードでは10m以上なら弾いている
  • getAccuracy() の精度は68%
    • ドキュメントに書いてある
    • 信じすぎない
    • 最近のOSの時はあまりおかしい時はないが、4とか5の時はおかしいことが多かった
      • KalmanFilterでフィルターすることで対応していた
      • 移動速度などから次の位置情報の予測をしてくれる
      • Accuracyが良いのに、おかしい時はこいつでフィルタリングする
      • これで弾いた情報をマップ上に出すことで、おかしくなる場所を見れるようにしたりもしていた

バッテリー

メモ

  • 3-5分、5-6kmでの消費量
    • 2~4%くらい
  • 5km か 5時間走っても3,40%くらい
  • 残量取得はサンプルコードに乗せているので見てね

バッテリー残量を意識した設計

  • バッテリー残量によってCriteriaを変える
  • Minmum DistanceとMinimumTimeは変えてもGPSチップが消費するエネルギー量は同じ
    • 計測して見たけど変わらなかった

耐久性について

  • 全然取れなかったら妥協してとるという設計方法があるけど、詳しくは懇親会で聞いて

まとめ

  • もう少し詳しい内容を後日ブログに書くよ