質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

3回答

6081閲覧

GPSの誤差について

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/12/04 12:57

編集2017/12/04 13:10

UnityのLocationServicceを使用して以下のコード(不要な部分は省略)を使用してGPSの値をとっているのですが誤差がひどいです。
端末はAndroidで高精度モードです。

private double dlatitude,dlongitude,daltitude;
public double slatitude, slongitude, saltitude;
IEnumerator Start(){

slatitude = Input.location.lastData.latitude; slongitude = Input.location.lastData.longitude; saltitude = Input.location.lastData.altitude; slatitude = double.Parse(slatitude.ToString ("N6")); slongitude = double.Parse(slongitude.ToString ("N6"));

}
void Update(){
dlatitude = Input.location.lastData.latitude;
dlongitude = Input.location.lastData.longitude;
daltitude = Input.location.lastData.altitude;
dlatitude = double.Parse(dlatitude.ToString ("N6"));
dlongitude = double.Parse(dlongitude.ToString ("N6"));

text.text = "開始地点:" + slatitude + "," + slongitude "現在地:" + dlatitude + "," + dlongitude;

}

Start()でアプリの開始位置の位置情報をとりslatitude,slongitudeへ格納しています。Updateでは現在の位置情報をとりdlatitude,dlongitudeへ格納しています。
アプリを起動して静止しtextのslatitudeとdlatitude,slongitudeとdlonngitudeが一致するのを待ちます。
しかし、1mくらい動くとdlatitude,dlongitudeがslatitude,slongitudeから大きくずれてしまいます。数十メートルから数百メートルずれてしまいます。ずれは緯度経度の桁から判断しています。

端末の移動量を計算することが必須のアプリなので誤差がここまでひどいと役に立ちません。

Start()でとった位置情報がアプリ起動の場所から大きくずれていることは確認しました。アプリ起動時に得られる位置情報は誤差が大きいのでしょうか?
どうしても開始位置の位置情報を所得必要があります。

できるだけ正確に開始位置をとりたいのですが、Start関数だと正確に得ることは難しいのでしょうか?
Start()でslatitude,slongitude
Update()でdlatitude,dlongitudeを所得しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/12/04 13:34

一応確認ですが緯度経度か何度ぐらいずれますか
guest

回答3

0

まずGPSの仕組みはご存知でしょうか?GPSは宇宙に漂う無数のGPS衛星から放たれる電波を受信し、それぞれの衛星の交点距離を求めて現在地を算出しています。
【解説参考サイト】
http://xz4u.com/gps-mechanism/

で、高精度モードというのはこれにプラスして「そこらへんを飛んでるWi-Fi電波やBluetoothやキャリア回線の電波強度から、それぞれの発信源からの距離を逆算したもの」を加味して計算されます。

さて、GPSはいろいろ飛んできたものを元に座標を計算しているわけですが、これら全て「壁や遮蔽物」に影響を受けるものですね。それにそもそも近隣にWi-Fi電波やBluetoothやキャリア回線が薄い状態だと高精度モードもほとんど役に立ちません。一般家屋の室内はGPS情報はほぼ正確ではなくなります。あなたは屋外で試されましたか?屋外でも山影であったり、ビルの間だったりしませんか?ビル等の反射の強い建物の中だと、GPS電波が入っているように見えても、実際は反射を繰り返して本来いる場所とずれた位置として計算されることもあります。

要するにGPSに常に正確な座標を求めるのは仕組み的に無理な話なのです。屋外で、周りに遮蔽物がない状態であればかなり正確な位置が取れますが、衛星からの電波が直接届かない場所では望むべくもありません。

補足ですが、lastDataにはhorizontalAccuracyとverticalAccuracyという「今このGPS情報は誤差がどれくらいあるか」という情報も入っています。この誤差を見て100m以上誤差があるようであれば、その情報は捨てて次の更新を待つ、という方法で「出来る限り正解に近いデータだけを拾って更新する」という手もあります。

投稿2017/12/05 01:26

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

正確に開始位置をとりたいのですが、Start関数だと正確に得ることは難しいのでしょうか?

GPSで常時精度を求めるのは困難です

状況によっては測位できないこともあります
LocationServicce がAndroidのFusedLocationを使っているかよくわかりませんが
GPSが使えないので電話網やwifiによる位置測定をしているかもしれません
その場合はもっと悪くなります
そのような事が起きたのかもう一度
テストした場所、周りの環境など確認してみましょう

投稿2017/12/04 14:12

aja

総合スコア3733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あくまで経験則なので正しい確証はありません。
私も業務でunityでGPSを使うことになったのですが、正確な値は得られませんでした。
スマホの「高詳細」モードは、内蔵GPS、モバイル回線、ネットワークIPなど複数の値から算出します。
無線LANに繋いでいれば動いても位置情報は更新されません。モバイル回線も中継局基準となるので正確さには欠けます。
それで内蔵GPSなのですが、sim無しのタブレットで使用した結果、一度GPS衛星を見失うと再受信までに数分かかることもありました。GPSは常に受信できるわけではないので高詳細モードでは複合的に値を得ているのではないかと思います。
そして、アプリ起動時、GPSの値はおそらく、前回の分が残っています。
スマホを再起動したら緯度経度の値はリセットされました。
ネットの情報を調べても同じような情報しかなく、そういう理由で私はGPSをうまく使えませんでした。

投稿2018/06/28 04:25

Nameless7743

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問