iOSの測位設定をいろいろ試してみた話
この記事は、NAVITIME JAPAN Advent Calendar 2021 の 13日目の記事です。
こんにちは、わさびです。ナビタイムジャパンでカーナビゲーションアプリの位置推定技術を担当しています。
弊社ではGPSなどを使ったカーナビゲーションアプリを開発しています。正しい位置を推定する技術について、ユーザーの皆様からのご意見をいただきながら日々改善を重ねています。
この記事では、iOSでGPS周りを扱うエンジニアの方向けに、弊社サービスに最適なiOSの測位設定を検討して得られた知見をご紹介します。
検討したきっかけ
弊社アプリでは、端末で測位した位置を更に補正して利用しています。
そのまま使わずに補正するのは、トンネル内ではGPS信号を受信できなかったり、高層ビルなどの間では位置が荒れるため、そのままだとナビゲーションできない場合があるためです。
(※高層ビルなどの間では測位した位置が荒れることをマルチパスといいます)
補正をしているなかでも、位置に関するご意見をいただくことがありますが、調査の際、ユーザーが走ったログを確認すると、端末で測位した位置は実際には走行していない場所を通過していることがあります。
実際と異なる位置であった場合、目的地までナビの通りにルートを走っているにも関わらず、ルートを外れたと判定します。
このような場合、ユーザーの意図しないリルートとなるため、「ルート通りに走行したのにリルートした!(怒)」という不満に繋がります。
(※リルートとはルートを外れたときに再探索することです)
端末で測位した位置が実際には走っていないところだった場合、正確なナビゲーションが難しいことがわかります。
なぜこのようになってしまうのか、要因のひとつに挙げられるのがiOS内部でマップマッチという処理が行われている可能性です。
マップマッチは通過したとみなした道路に位置を補正する処理ですが、私たちは端末で測位した位置がGPSでの測位であることを前提としているため、上記画像のような正しそうに見える位置が間違っている場合、内部処理で見抜いたり改善することは難しく、できる限りマップマッチ処理を減らす手段を模索していました。
※ 画像はフィールドテストで得られた結果を使用しています。
意図しない測位が届く原因
私たちはこのような入力に対し、様々な推測を立てました。
端末が壊れているんじゃないだろうか
私たちが予想しないような使われ方をしているんじゃないだろうか
この事象がAndroidでは発生せず、iOSでのみ見られたため、これらの違いを調べていくとiOSの測位に関する設定にたどり着きました。
設定できる測位オプションの種類
iOSで測位に関する設定は次の2つがあります。これらはiOSから提供されるCLLocationManagerという位置情報提供クラスに指定することで設定できます。
CLActivityType
CLLocationAccuracy
CLActivityType
移動手段に関する設定です。設定できる選択肢の例は次のとおりです。
CLLocationAccuracy
どのくらい細かい精度で測位するかについての設定です。地図上で〇〇m程度といった精度以外に、どのようなセンサを使うかという指定もできます。以下は、設定できる選択肢の抜粋です。
私たちは移動手段や精度の設定を変更することで、iOSのマップマッチ処理が少なくできれば、上記画像のような意図しないリルートを防げると期待し、調査を行いました。
以下では、GPS荒れが多いことはiOSのマップマッチ処理が少ないこととし、各オプションでiOSのマップマッチ処理がどの程度効いているかを、実際にフィールドテストで調査した結果をまとめます。
CLActivityTypeの各設定値の結果
※ CLLocationAccuracyはBestForNavigation(補完センサを使った可能な限りの高精度)で固定しています。
automotiveNavigation の場合
移動手段を自動車と指定した場合の結果です。
1枚目の画像はマップマッチ処理はなさそうですが、2枚目の画像はマップマッチ処理は行われていそうであり、移動手段を自動車と指定した場合、マップマッチ処理は行われている場合と行われていない場合があると考えられます。
otherNavigation の場合
移動手段を自動車に関係のない他のタイプの車両と指定した場合の結果です。
1枚目、2枚目とも道路の形状から位置が大きく異なってGPSが荒れていることから、移動手段を自動車に関係ない他のタイプの車両と指定した場合、マップマッチ処理は行われていないと考えられます。
other の場合
移動手段を不明とした場合の結果です。
1枚目は実際には通過していない道路に測位した位置があり、2枚目は先のotherNavigationの結果と比較しGPS荒れが少ないことがわかります。
これらの結果から、移動手段を不明と指定した場合、マップマッチ処理は行わていると考えられます。
CLLocationAccuracyの各設定値の結果
左がBest(補完センサを使わない一番の精度)(赤色)、
右がBestForNavigation(補完センサを使った可能な限りの高精度)(緑色)の結果です。
※ CLActivityTypeはother(移動手段不明)で固定しています。
1枚目、2枚目の画像から、精度をBestからBestForNavigationに変更すると、マップマッチ処理の精度が上がり、3枚目の画像からトンネル内の測位も長くなることがわかりました。
よって、BestForNavigationでは、マップマッチ処理の精度が高くなるように補正されていると考えられます。
まとめ
iOSの測位に関する設定を変えることで、マップマッチ処理の適用を変えられることがわかりました。各設定値を改めて表でまとめると次のとおりです。
CLActivityType
CLLocationAccuracy
一方で、調査開始時はマップマッチ処理がないことで正しいナビゲーションができるようになると期待しており、設定の変更によりマップマッチ処理が少なくなる選択肢もありましたが、マップマッチ処理が少なくなりすぎて (= GPS荒れの程度が大きすぎて) 結果が信頼できないケースも確認されました。
それぞれの設定値の初期値は、移動手段のactivityTypeがother(移動手段不明) と精度のaccuracyがbest(補完センサを使わない一番の精度)であるため、設定を指定しなかった場合は、マップマッチ処理が行われると考えられます。
よって、弊社のように端末で測位した位置を更に補正して利用する場合、マップマッチの処理が少ない移動手段のactivityTypeがotherNavigationやautomotiveNavigation、精度のaccuracyはより高精度なbestForNavigationに設定してみるのが良いと判断し、改善を進めています。
このように用途に応じて最適な設定が異なるため、参考になれば幸いです。
参考
Appleの各種ドキュメント