Help us understand the problem. What is going on with this article?

Swift3でiOS用のGPSロガーアプリを作った話

More than 1 year has passed since last update.

概要

iOS端末向けGPSロガーアプリを作り、アプリ利用者の動線を記録しようと試みた。
GPSの弱点である、屋根のある室内等の電波の障害となりうるものがある地点において、多数の『位置飛び』が観測された。
データ分析の際にこの位置飛びはノイズとなりうる為、除去が求められる。


この記事は自身のブログに記載した情報を纏め、追記したものである。


背景

ここ数年で日本全国に急速に普及したスマートフォン。
最近では世帯あたりの普及率が従来型携帯電話、いわゆるガラケーの割合を追い抜いた1とされている。
スマートフォンには様々な高精度センサが搭載されており、処理能力も高い。
今回はその中でもGPS情報を利用して、アプリを利用している人の位置情報を随時記録するアプリを作成した。

GPSとは

名称

GPSはGlobal Positioning System(全地球測位システム / グローバルポジショニングシステム)の略称。

基本的な測定手法

3つの距離測定衛星と1つの誤差修正衛星の合計4機の人工衛星を必要最低数として利用し、位置を測定している。
衛星から発された電波が地表位置に届くまでにかかった時間を利用して距離を割り出し、時刻誤差修正用の4つ目の衛星を使い位置を修正している。
feature130826_img01_w800.png
(画像引用:Humming HEADS

YouTubeに投稿されている下記の動画も非常に分かりやすく解説されている。
サイエンスチャンネル
TED-Ed

開発環境・動作環境

開発環境

・macOS 10.12 Sierra
・Xcode8
・Swift3.0

動作環境

・iOS9.0以上
・iPhone6, iPhone6S, iPhone6 Plus, iPhone6S Plus, iPhone SE

アプリ詳細

今回紹介には至らなかったが、実は前代のGPSロガーアプリも作成している。
そのアプリからの反省点を踏まえ、改善を行なったものを今回紹介する。

Simulator Screen Shot 2016.12.13 10.24.17.png

Simulator Screen Shot 2016.12.13 10.28.35.png

ユーザがスタートボタンを押すことにより、計測開始。
自動的に位置情報がサーバに送信され、バックアップ用に内部データベースにも保存される仕組み。

計測・記録可能な情報

・ユーザ名/年齢/性別
・緯度経度
・観測時間
・更新距離(1つ前の記録点からどれだけ離れた距離か)2
・歩行速度(更新距離と時間から計算)
・位置情報測位精度値(Horizontal Accuracyのみ使用)3
・ジオフェンシング4

使用しているサービス

Microsoft Azure (SQL/BLOB)
RealmSwift
Firebase【使用中止】

課題点

GPS測位は、GPS信号の持つ直進性の性質により、屋根のある場所や建物群の間では精度が非常に悪くなるという弱点を持つ。
その為、室内においてはビーコンなどの近距離無線を用いる手法が一般的であり、屋外においてもPDR(Pedestrian Dead Reckoning)と呼ばれる加速度センサ等と組み合わせる手法が研究されている。

改善策

今回はGPSのみでどこまで測定できるのかを検証した。
実験データはここでは記載できないが、フィルタをなにも設定せず測定した場合、位置飛びだと見られる点によって、まとまりのない経路図5が出来上がった。
そこで下記に記す4個のフィルタを設定し、組み合わせることで位置飛びを削減することを試みた。

・更新距離5m以内
・位置情報測位精度値48m以内
・歩行速度10km/h以内
・上記3個のフィルタをクリアした点が、5個以上連続した場合のみ記録

事前に測定を行なったデータを分析した結果、改善策として上記フィルタを考えた。
測定時に位置情報測位位置精度値は記録されていなかった為、今回の比較には用いず、他3個のフィルタで比較を行う。

比較結果・考察

先ほどのフィルタのうち、測位精度値を除く3個のフィルタで測定を行なったところ、
何もフィルタを設定しない場合と比較して約18%のデータ削減に成功した。

しかしながら、この結果には本来記録されるべきデータが削除されていたり、
逆に位置飛びであると判定されるべき点が残っていたり、という問題点が未だ存在する。
PDRやビーコン等と組み合わせたり、クラスタリングにより処理する方法も用いた方がより効果的であると考えられる。

参考サイト

RealmSwiftで簡単なGPSロガー作ってみたのでメモ
バックグラウンドで位置情報を取得する(CoreLocation::CLLocationManager)

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away