Windows 10にGPS レシーバーを接続し、C#言語を使用してGPSデータを取得しました。C#言語による開発は「Visual Studio 2019」を使用しました。
GPS レシーバーのインストール
amazonから次に示す「GPS レシーバー USB, 内蔵 アンテナ チップ 一体型」を購入しました。届いたGPS レシーバーを確認すると、VFAN社のモデル:UG-353でした。
GPS レシーバーのドライバを「u-blox Product Resources」の「u-blox GNSS Sensor Device Driver for Windows, v2.40」からダウンロードしてインストールします。デバイスマネージャーで接続されているデバイスを確認すると、次のようにセンサーとして「u-blox 7 GPS/GNSS Loacation Sensor」として表示されます。
このドライバをインストールしていないと、プログラムを実行したときに、次のように「 Message=No sensors found. Are any sensor drivers installed?
Source=Microsoft.WindowsAPICodePack.Sensors」の例外が発生します。
GNSS評価ソフトウェア「u-center」のインストール
GNSS評価ソフトウェア「u-center」は、u‑blox GNSSレシーバーをフルサポートするGNSS評価ソフトウェアです。「u-center Windows版GNSS評価ソフトウェア」の「u-center for Windows, v19.08.01」からu-centerをダウンロードしてインストールします。GNSSレシーバーからの入力は、USBインターフェースの仮想ドライバを使用するため、「u-blox Product Resources」の「u-blox GNSS VCP Device Driver for Windows, v3.10 26-Oct-2017」からダウンロードしてインストールします。デバイスマネージャーで接続されているデバイスを確認すると、次のようにポート「u-blox Virtual COM Port」として表示されます。
u-centerを起動し、メニュー「Reciever」→「Port」から「COM5ポート」を選択すると次のようにGPSから入力したデータを表示します。日の丸シンボルで示す準天頂衛星「みちびき」も3機表示されています。ただしデータは入力できていないようです。
NMEAフォーマット
GPSモジュールからは、NMEAフォーマットの情報が送信されます。NMEAフォーマットの情報は、センテンスの集まりです。
- 1つのセンテンスは、「$」で始まり、「(改行(\r\n))」で終わります。
- センテンスは、「,」で区切られた単語の集まりです。それぞれの単語の意味は、データタイプによって異なります。
- センテンスの最初の単語は、データタイプを表します。
- センテンスの最後の単語は、「*」以降がチェックサム値を表します。
次はGYSFDMAXBのデフォルトで出力されるセンテンスです。
データタイプ | 意味 |
---|---|
$GPGGA | GPS位置情報 |
$GPGLL | 地理的位置 – 緯度/経度 |
$GPGSA | DOP及びアクティブ衛星 ※DOP(Dilution Of Precision)はGPSの精度低下率です。 |
$GPGSV | 衛星情報1個目の衛星番号。 ※みちびきは「193」。 ※ひまわり6号は「129」(42)。 ※ひまわり7号は「137」(50)。 |
$GPRMC | 最小ナビゲーション情報(推奨?) |
$GPVTG | 針路と速度 |
$GPZDA | 時刻と日付(UTC) |
GPS受信プログラムの作成
NMEAフォーマットに従うGPSからのデータを取得するために、「Microsoft.WindowsAPICodePack.Sensors」名前空間のSensorクラスを使用します。Microsoft.WindowsAPICodePack.Sensorsは、次の手順でNuGetパッケージマネージャコンソールを表示し、表示されているプロンプトに「Install-Package Microsoft-WindowsAPICodePack-Sensors -Version 1.1.3.3」をキーインして、ライブラリを設定します。
作成したGPS受信プログラムを次に示します。プロジェクトはC#コンソールアプリケーションとして作成しました。
using Microsoft.WindowsAPICodePack.Sensors; using System; using System.Diagnostics; namespace GpsTest { class Program { // 位置情報GUID // 参考:https://docs.microsoft.com/en-us/windows/desktop/sensorsapi/sensor-category-location private static Guid SENSOR_DATA_TYPE_LOCATION_GUID = new Guid("055C74D8-CA6F-47D6-95C6-1ED3637A0FF4"); // 位置センサ static private Sensor GeolocationSensor; static void Main() { GeolocationSensor = SensorManager.GetSensorsByTypeId(SensorTypes.LocationGps)[0]; // GPS信号を取得する度に、イベント実行 GeolocationSensor.DataReportChanged += DataReportChanged; while (true) {} } static private void DataReportChanged(Sensor sender, EventArgs e) { try { System.Console.Write("{0}", sender.DataReport.Values[SENSOR_DATA_TYPE_LOCATION_GUID][25].ToString()); // NMEAフォーマットデータ string[] gpsData = sender.DataReport.Values[SENSOR_DATA_TYPE_LOCATION_GUID][25].ToString().Split(','); DateTimeOffset dto = new DateTimeOffset( DateTime.ParseExact(string.Format("{0}{1}", gpsData[9], gpsData[1].Substring(0, 6)), "ddMMyyHHmmss", null), TimeSpan.Zero); System.Console.Write(string.Format("UTC : {0}\n", dto.ToString())); System.Console.Write(string.Format("JST : {0}\n", dto.ToLocalTime().ToString())); //緯度。dddmm.mmmm float latitude = PosConvert(gpsData[3]); System.Console.Write("緯度 : {0}\n", latitude); //経度。dddmm.mmmm float longitude = PosConvert(gpsData[5]); System.Console.Write("経度 : {0}\n", longitude); //移動の速度[knot] float speed = float.Parse(gpsData[7]); System.Console.Write("速度 : {0}\n", speed); System.Console.Write("\n"); } catch (Exception ex) { Debug.WriteLine(ex.StackTrace); // this.Close(); } } static private float PosConvert(string pos) { float m = float.Parse(pos.Substring(pos.IndexOf(".") - 2)) / 60.0f; float d = float.Parse(pos.Substring(0, pos.IndexOf(".") - 2)); return d + m; } } }
GPS受信プログラムの実行
GPS受信プログラムを実行すると、次のようにコマンドプロンプトに表示されます。
・・・・ $GPRMC,014823.00,A,xxxx,N,xxxx,E,0.391,,021019,,,A*7B $GPVTG,,T,,M,0.391,N,0.725,K,A*28 $GPGNS,014823.00,xxxx,N,xxxx,E,AN,07,1.46,14.3,39.3,,*49 $GPGGA,014823.00,xxxx,N,xxxx,E,1,07,1.46,14.3,M,39.3,M,,*6C $GPGSA,A,3,09,17,02,03,23,06,12,,,,,,2.45,1.46,1.97*07 $GPGSV,3,1,10,02,26,303,34,03,14,052,15,05,07,243,,06,62,343,26*7B $GPGSV,3,2,10,09,56,109,19,12,16,299,28,17,62,170,32,19,78,200,*7F $GPGSV,3,3,10,23,38,061,23,28,02,191,09*7C $GPGLL,xxxx,N,xxxx,E,014823.00,A,A*62 $GPGRS,014823.00,1,-7.3,0.9,-1.6,-20.3,-5.0,0.0,4.7,,,,,*51 $GPGST,014823.00,55,,,,8.9,8.1,15*79 $GPZDA,014823.00,02,10,2019,00,00*63 $GPGBS,014823.00,8.9,8.1,15.3,,,,*72 UTC : 2019/10/02 1:48:23 +00:00 JST : 2019/10/02 10:48:23 +09:00 緯度 : xxxx 経度 : xxxx 速度 : 0.391 ・・・・