【初心者】Python GPSデータについて
こちらの記事を参考にして進め、後半に書いてあった下記のプログラムを試して、
import serial
import micropyGPS
import threading
import time
gps = micropyGPS.MicropyGPS(9, 'dd') # MicroGPSオブジェクトを生成する。
# 引数はタイムゾーンの時差と出力フォーマット
def rungps(): # GPSモジュールを読み、GPSオブジェクトを更新する
s = serial.Serial('/dev/serial0', 9600, timeout=10)
s.readline() # 最初の1行は中途半端なデーターが読めることがあるので、捨てる
while True:
sentence = s.readline().decode('utf-8') # GPSデーターを読み、文字列に変換する
if sentence[0] != '$': # 先頭が'$'でなければ捨てる
continue
for x in sentence: # 読んだ文字列を解析してGPSオブジェクトにデーターを追加、更新する
gps.update(x)
gpsthread = threading.Thread(target=rungps, args=()) # 上の関数を実行するスレッドを生成
gpsthread.daemon = True
gpsthread.start() # スレッドを起動
while True:
if gps.clean_sentences > 20: # ちゃんとしたデーターがある程度たまったら出力する
h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24
print('%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2]))
print('緯度経度: %2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
print('海抜: %f' % gps.altitude)
print(gps.satellites_used)
print('衛星番号: (仰角, 方位角, SN比)')
for k, v in gps.satellite_data.items():
print('%d: %s' % (k, v))
print('')
time.sleep(3.0)
こちらのプログラムを試してみて上手く行ったため、こちらの結果をExcelなどでまとめたいと思ったので、CSVファイルにできないかと思い、ChatGPTを使い、下記のプログラムを組んだのですが、直したほうがよいところや、そもそもExcelにまとめるなら別の方法のほうがよいなら教えてください。よろしくお願いします。
import serial
import csv
import threading
import micropyGPS
import sys
# シリアルポートの設定
ser = serial.Serial('/dev/ttyS0', 9600) # '/dev/ttyS0'は適切なシリアルポートに変更
ser.flushInput()
# CSVファイルのヘッダーを定義(緯度、経度、時間、衛星番号などのフィールド)
csv_header = ["Latitude", "Longitude", "Time", "Satellite Number"]
# GPSデータをリアルタイムで表示し、CSVファイルに保存する関数
def process_gps_data():
gps = micropyGPS.MicropyGPS(9, 'dd')
with open("gps_data.csv", mode='w', newline='') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(csv_header)
try:
while True:
sentence = ser.readline().decode('utf-8')
if sentence[0] == '$':
for x in sentence:
gps.update(x)
if gps.clean_sentences > 20:
h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24
latitude = gps.latitude[0]
longitude = gps.longitude[0]
time = '%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2])
# 衛星番号のリストを取得
satellites = list(gps.satellite_data.keys())
# CSVファイルにデータを書き込む
writer.writerow([latitude, longitude, time, ', '.join(satellites)])
print(f'time: {time}, lat: {latitude}, lon: {longitude}, Satellites: {", ".join(satellites)}')
except KeyboardInterrupt:
print("プログラムを終了します。")
except Exception as e:
print(f"エラーが発生しました: {str(e)}")
sys.exit(1)
finally:
ser.close()
csv_file.close()
# スレッドでGPSデータの取得と処理を同時に実行
gps_thread = threading.Thread(target=process_gps_data)
gps_thread.daemon = False # デーモンモードを無効にする
gps_thread.start()
try:
gps_thread.join() # スレッドの終了を待つ
except KeyboardInterrupt:
print("プログラムを終了します。")
except Exception as e:
print(f"エラーが発生しました: {str(e)}")
sys.exit(1)
0