GPS リアルタイム軌跡表示システム
GPSDからNMEAデータを取得し、Google Mapsにリアルタイムで軌跡を表示するWebアプリケーションです。
機能
- ✅ GPSDからリアルタイムでGPSデータを取得(10Hz対応)
- ✅ WebSocketでリアルタイム通信
- ✅ Google Maps上に軌跡を表示
- ✅ 現在位置マーカーの自動追従
- ✅ 速度・高度情報の表示
- ✅ NMEAデータのリアルタイム表示
- ✅ 軌跡のクリア機能
- ✅ 自動追従のオン/オフ切り替え
- ✅ 接続状態の表示
システム要件
- Linux(Raspberry Pi推奨)
- Python 3.7以上
- GPSD起動済み
- インターネット接続(Google Maps API使用)
セットアップ手順
1. GPSDのインストールと設定
# GPSDをインストール
sudo apt-get update
sudo apt-get install gpsd gpsd-clients
# GPSDの設定ファイルを編集
sudo nano /etc/default/gpsd
設定例:
DEVICES="/dev/ttyUSB0"
GPSD_OPTIONS="-F /var/run/gpsd.sock -b -n -s 115200 -G"
USBAUTO="true"
# GPSDを起動
sudo systemctl restart gpsd
# GPSDの動作を確認
gpsmon
2. 必要なパッケージのインストール
# Pythonパッケージをインストール
pip3 install -r requirements.txt
# または
python3 -m pip install -r requirements.txt
3. Google Maps API キーの取得
- Google Cloud Consoleにアクセス
- 新しいプロジェクトを作成
- “Maps JavaScript API”を有効化
- APIキーを作成
index.html
の以下の行を編集:
src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
YOUR_API_KEY
を実際のAPIキーに置き換えてください。
4. ファイルの配置
すべてのファイルを同じディレクトリに配置します:
gps_tracker_v2.py
index.html
requirements.txt
README.md
5. サーバーの起動
# サーバーを起動
python3 gps_tracker_v2.py
6. ブラウザでアクセス
サーバーを起動したマシンのIPアドレスにアクセス:
http://[サーバーのIPアドレス]:5000
例:
http://192.168.1.12:5000
使用方法
- ブラウザでアプリケーションにアクセス
- WebSocket接続が自動的に確立されます
- GPSデータが取得されると、地図上にリアルタイムで軌跡が表示されます
- 赤い点が現在位置、赤い線が軌跡です
コントロール
- 軌跡をクリア: 保存された軌跡を削除
- 地図を中心に戻す: 現在位置に地図を移動
- 自動追従: ON/OFF: GPSの位置情報に地図を自動追従させるかどうかを切り替え
機能詳細
GPSデータ取得
- GPSDからJSONデータを取得(位置情報)
- GPSDからNMEAデータを取得(生データ)
- 10Hz(0.1秒ごと)でデータを更新
地図表示
- Google Maps JavaScript APIを使用
- 現在位置を赤い点で表示
- 軌跡を赤い線で表示
- 自動追従機能で常に現在位置を中心に表示
NMEAデータ表示
- テキストボックスにスクロール可能
- 最新100行を保持
- タイムスタンプ付きで表示
トラブルシューティング
GPSデータが表示されない
# GPSDのステータスを確認
sudo systemctl status gpsd
# GPSDを再起動
sudo systemctl restart gpsd
# GPSDのログを確認
gpsmon
# GPSDから直接データを確認
gpspipe -w -n 10
WebSocket接続エラー
# ファイアウォールでポート5000と8765が開いているか確認
sudo ufw status
# ポートを開く(必要に応じて)
sudo ufw allow 5000
sudo ufw allow 8765
Google Mapsが表示されない
- Google Maps API キーが正しく設定されているか確認
- APIキーに制限がかかっていないか確認
- インターネット接続を確認
- ブラウザのコンソールでエラーメッセージを確認
NMEAデータが表示されない
# GPSDからNMEAデータを直接確認
gpspipe -r -n 10
# GPSDの設定を確認
cat /etc/default/gpsd
技術仕様
ポート
- 5000: HTTPサーバー(Flask)
- 8765: WebSocketサーバー
GPSD設定
- デバイス:
/dev/ttyUSB0
(設定により変更可能) - ボーレート: 115200bps(設定により変更可能)
- 更新レート: 10Hz
データ形式
{
"type": "gps",
"lat": 35.6812,
"lon": 139.7671,
"speed": 0.0,
"altitude": 0.0,
"timestamp": "2024-01-01T12:00:00"
}
{
"type": "nmea",
"data": "$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47",
"timestamp": "2024-01-01T12:00:00"
}
ファイル構成
“`
.
├── gps_tracker_v2.py # GPSサーバー(Python)
├── index.html # Webインターフェース(HTML/JavaScript)
├── requirements.txt # Python依存関係
├── README.md # このファイル
└── start_gps_tracker.sh # 起動スクリプト(オプション)

while True:
try:
# GPSデータを取得(JSON)
data = gpsd_socket.recv(1024).decode(‘utf-8’)
# JSONデータを解析
for line in data.strip().split('\n'):
if line:
try:
packet = json.loads(line)
# デバッグ情報を出力(最初の1回のみ)
if not hasattr(gps_worker, '_debug_printed'):
print(f"Packet class: {packet.get('class')}")
print(f"Packet keys: {list(packet.keys())}")
gps_worker._debug_printed = True
# TPV (Time-Position-Velocity) パケットを処理
if packet.get('class') == 'TPV':
mode = packet.get('mode', 0)
if mode >= 2: # 2Dまたは3Dの位置情報がある
lat = packet.get('lat', 0)
lon = packet.get('lon', 0)
speed = packet.get('speed', 0)
altitude = packet.get('alt', 0)
timestamp = datetime.now().isoformat()
# 軌跡データを保存
point = {
'lat': lat,
'lon': lon,
'speed': speed,
'altitude': altitude,
'timestamp': timestamp
}
with track_lock:
track_history.append(point)
# 無制限で保存(メモリが許す限り)
print(f"GPS: Lat={lat:.6f}, Lon={lon:.6f}, Speed={speed:.2f}m/s")
except json.JSONDecodeError:
pass


# 1. システムを更新
sudo apt-get update
sudo apt-get upgrade -y
# 2. Python 3をインストール(通常は既にインストール済み)
sudo apt-get install python3 python3-pip -y
# 3. GPSDをインストール
sudo apt-get install gpsd gpsd-clients -y
# 4. Apacheをインストール
sudo apt-get install apache2 -y
# 5. 必要なPythonパッケージをインストール
pip3 install flask flask-cors websockets
# 6. GPSDを設定
sudo nano /etc/default/gpsd
# 以下のように設定: GPSポートは BU-353N(PL-2303)= ttyUSB(0,1,2) 115200bps
# DEVICES=”/dev/ttyUSB0″
# GPSD_OPTIONS=”-F /var/run/gpsd.sock -b -n -s 115200 -G”
# USBAUTO=”true”
# 7. GPSDを起動
sudo systemctl enable gpsd
sudo systemctl start gpsd
# 8. Apacheを起動
sudo systemctl enable apache2
sudo systemctl start apache2