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 キーの取得

  1. Google Cloud Consoleにアクセス
  2. 新しいプロジェクトを作成
  3. “Maps JavaScript API”を有効化
  4. APIキーを作成
  5. 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

使用方法

  1. ブラウザでアプリケーションにアクセス
  2. WebSocket接続が自動的に確立されます
  3. GPSデータが取得されると、地図上にリアルタイムで軌跡が表示されます
  4. 赤い点が現在位置、赤い線が軌跡です

コントロール

  • 軌跡をクリア: 保存された軌跡を削除
  • 地図を中心に戻す: 現在位置に地図を移動
  • 自動追従: 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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です