位置(緯度・経度)を測定する
ここでは、GPSの受信機を使って、現在位置の緯度(latitude)と経度(longitude)を測定する方法を説明します。
- GPS受信機がラズパイに正常に接続されていると想定しています。接続方法、動作確認の方法が分からない場合は連絡ください。
- 残念ながら、緯度(latitude)と経度(longitude)の基本を説明する時間がありません。Wikipediaで調べる、Googleで検索するなど、各自でお願いします。
- 緯度と経度は、それぞれ「○度□分」(○ degrees □ minutes)という風に、2つの単位(大きい単位と小さい単位)を使って表現します。時間(hour)と分(minute)の2つの単位を使って「1時間15分」などと表記するのに似ています。「□分」の部分は60進数になっていて、60分が1度と等しくなります。この部分を10進数(小数)で表記する方法もあります。例えば、3度15分を3.25度と表します。3時間15分を3.25時間と表記するのと同様のことです。また、北緯をプラスの数、南緯をマイナスの数で表し、東経をプラスの数、西経をマイナスの数で表します。緯度・経度をデータとして管理、処理する場合には、10進数(小数)表記をよく使います。10進数(小数)表記したものを、英語ではdecimal degrees、 decimal latitude、decimal longitudeなどといいます。
GPS受信機から位置情報を読みとる
まず最初に、ラズパイOSを最新の状態にアップデートしてください。Terminalで以下のコマンドを実行します。
sudo apt update -y
次に、以下のコマンドを実行:
sudo apt full-upgrade -y
これで、ラズパイOSが最新の状態にアップデートされました。
続いて、gps-loc.pyとgpsserial.pyをラズパイ上のThonnyへコピーして保存してください。この2つのファイルは同じフォルダの中に保存してください。gps-loc.pyは、GPS受信機から送られてくる位置情報(緯度・経度)をラズパイ側で読みとるプログラムです。
GPS受信機から位置情報を読みとるには、以下の行をプログラムの先頭部分に書きます。詳細は避けますが、位置情報を読みとるための「おまじない」だと思っておいてください。
import gpsserial as gps
そして、以下のようにして(3-4行目)、GPS受信機から送られてくる位置情報を読む準備をします。
serialPort = "/dev/serial0"
gpsSerialPort = gps.init(serialPort)
準備作業はinit()という関数(function)を使います。この関数が返すのは、GPS受信機から送られてくる位置情報を受けとる場所(受け取り口)だと思ってください。これが変数gpsSerialPortに格納されています。
準備が終わったら、以下のようにして位置情報を読みとります。
gpsData = gps.getData(gpsSerialPort)
print(gpsData)
このように、位置情報を得るには、getData()という関数(function)を使います。この関数は、GPS受信機が送ってきた位置情報をそのまま返します。例えば、次のような位置情報がThonnyのShellに表示されます。
$GPRMC,041023.00,A,4229.93608,N,07116.56893,W,0.010,,290921,,,A*6F\r\n'
この位置情報は、GPS受信機が送ってきたデータそのものです。こういうデータは、まだ何も処理・加工(process)していないので「生データ」(raw data)と呼ばれます。生データは、GPS受信機のような機械が作ったデータそのものなので、上の例のように人間の目には読みにくく理解しにくいです。そこで、以下の表にある関数を使って、生データの中から自分の知りたい情報を抜き出します。それぞれの関数を使うときには、生データを渡します。例えば、getLatitude()を使うときには、次のようにします。
lat = gps.getLatitude(gpsData)
関数の名前 | 関数がやること |
---|---|
getLatitude() | GPS受信機が送ってきた生データから緯度の部分を抜き出して、文字列として返す。上記の生データを使う場合には、”4229.93608”が返る。 |
getLongitude() | GPS受信機が送ってきた生データから経度の部分を抜き出して、文字列として返す。上記の生データを使う場合には、”07116.56893”が返る。 |
getNSIndicator() | GPS受信機が送ってきた緯度が、北緯と南緯のどちらなのかを調べる。文字の”N”が返れば北緯、文字の”S”が返れば南緯。上記の生データを使う場合には、”N”が返る。 |
getEWIndicator() | GPS受信機が送ってきた経度が、東経と西経のどちらなのかを調べる。文字の”E”が返れば東経、文字の”W”が返れば西経。上記の生データを使う場合には、”W”が返る。 |
getLatitudeDegree() | GPS受信機が送ってきた緯度が何度かを調べる。度数を数値で返す。上記の生データを使う場合には、42が返る。 |
getLatitudeMinute() | GPS受信機が送ってきた緯度が何分かを調べる。分数を数値で返す。上記の生データを使う場合には、29.93608が返る。 |
getLongitudeDegree() | GPS受信機が送ってきた経度が何度かを調べる。度数を数値で返す。上記の生データを使う場合には、71が返る。 |
getLongitudeMinute() | GPS受信機が送ってきた経度が何分かを調べる。分数を数値で返す。上記の生データを使う場合には、16.56893が返る。 |
getDecimalLatitude() | GPS受信機が送ってきた緯度を10進数(小数)表記に変換して、小数値として返す。 |
getDecimalLongitude() | GPS受信機が送ってきた経度を10進数(小数)表記に変換して、小数値として返す。 |
使える関数はたくさんありますが、たいていの場合は、最後の2つの関数(getDecimalLatitude()とgetDecimalLatitude())を使うだけで十分だと思います。
gps-loc.pyの最後の部分では、10進数(小数)表記の緯度と経度を使って、Google Mapsで使えるリンクを作っています。
gMapsLink = "https://www.google.com/maps?q=" + str(decimalLat) + ","
+ str(decimalLon)
print("Google Maps link: " + gMapsLink)
作られたリンクはThonnyのShellに表示されます。これをコピーしてWebブラウザで開くと、GPS受信機が送ってきた位置が地図上に表示されます。
なおgps-loc.pyは、次のような全体構造になっています。
while True:
try:
GPS受信機から生データを読みとる。
さまざまな関数を使って、自分の知りたい情報を抜き出す。
except KeyboardInterrupt:
break
つまり、GPS受信機から生データを読みとり、自分の知りたい情報を抜き出す作業を延々と(無限に)くりかえします。この作業を止めるには、ThonnyのShellの部分をマウスでクリックして、キーボードでCtrl-Cしてください。