ま
さ
![]() |
これまで Debian のインストール、 環境整備、 ウェブアプリケーションのシステム構築をするなどシステムを触ることはある程 度経験したものの、 お小遣い帳サーバや、 GPS ロガーなど、 何らかの実用になるものはなかなかつくれませんで した。
そこでプログラムのスキルを得るための教材として、 GPS ロガーを作成したので、 報告します。
これから Debian を目指す人の興味を惹き、 手がかりとなって少しでもお役に立てれば幸いです。
”Global Positioning System ”は数十個の衛星からの電波を受信して現在位置を割り出すシステムです。
原理等はいろんな書籍やインターネットに掲載されているようですので、 ここでは説明を割愛します。
必要なハード構成は以下の通りです。
今回実際に使用したハードの概略仕様は Appendix を参照してください。
ネットブック ⇐= PS2-USB 変換 ⇐= GPS レシーバ
ネットブック購入直後から GPS ロガーを構築する場合について概要を説明します。
今回使用した GPS レシーバは NMEA0183 というプロトコルです。 NMEA0183 では以下のような形式などでデータが出力さ れますが、
今回は
という形式のみ利用しました。
GGA 形式の仕様は次の通りです。
GGA,123519.00,4807.038247,N,01131.324523,E,1,08,0.9,545.42,M,46.93,M,5.0,1012*42
123519.00 = 測位時刻(UTC) 12:35:19.00 4807.038247,N = 緯度 48 度 07.038247 分(北緯) 01131.324523,E = 経度 11 度 31.324523 分(東経) 1 = GPS のクオリティ; 0 = 受信不能、 1 = 単独測位、 2 = DGPS 08 = 受信衛星数 0.9 = HDOP 545.42, M = 平均海水面からのアンテナ高度(m) 46.93, M = WGS-84 楕円体から平均海水面の高度差(m) 5.0 = DGPS データのエイジ(秒) 1012 = DGPS 基準局の ID *42 = チェックサム |
ここから、 時刻、 緯度、 経度などのデータを利用しました。
いよいよアプリケーションの作成です。 上の GPS GGA データを加工して、 表示したり、 ログをとります。
アプリケーションを走らせます。
今回のアプリケーションを基にいろんな展開が考えられます。 Sunday programmer として今後も少しづつであっても、 根気よ く前進します。
地図上への現在位置の表示や、 ログデータからトレース表示したりと地図情報は重要です。 この場合、 種々の縮尺の地図が必要で すが、 Open Street Map はベクトルデータであることからこの点が有利です。 また、 ナビのように指定した位置の地図を得る 場合、 これが可能なインタフェースが OSM にあれば(あるのかも知れませんが) 、 より柔軟に利用できるのではないかと期待 しています。
[A] ネットブック仕様概略
PC: Asus EeePC 901
CPU: Intel Atom (1.6GHz) Memory: 1GB HDD(SSD): 4GB + 8GB Monitor: 8.9 型、 1024 x 600 I/F: USB 2.0 |
[B] ネットブックシステム仕様
OS: Debian Lenny
Kernel: 2.6.26-2-686 言語: Python 2.5.2 Library: pySerial, tkinter 等 |
[C] GPS レシーバ仕様
型式
: GPS-S103(Wonde proud 社製)
位置 精度: 5 - 25m CEP without SA 時刻精度: 1 μ s synchronized to GPS time プロトコル: NMEA0183 動作温度: -40 °C ~ +85 °C 動作湿度: 5% to 90% (結露なき事) 電 源 : DC 3.7 ~ 6V, typical 5V (今回は USB より供給) I/F: TTL serial(PS2 コネクタ). USB option |
[D] GPS ロガー実行例
$GPVTG,113.96,T,,,0.00,N,0.00,K,A*7C
$GPGGA,054832.084,3450.2455,N,13615.2118,E,1,09,01.0,253.6,M,37.3,M,,*6B $GPRMC,054832.084,A,3450.2455,N,13615.2118,E,0.00,113.96,260909,,,A*6C $GPVTG,113.96,T,,,0.00,N,0.00,K,A*7C $GPGGA,054833.083,3450.2455,N,13615.2118,E,1,08,01.1,253.5,M,37.3,M,,*6E $GPRMC,054833.083,A,3450.2455,N,13615.2118,E,0.00,113.96,260909,,,A*6A $GPVTG,113.96,T,,,0.00,N,0.00,K,A*7C $GPGGA,054834.083,3450.2455,N,13615.2118,E,1,09,01.0,253.4,M,37.3,M,,*68 $GPGSA,A,3,03,06,07,08,11,16,19,22,25,,,,2.2,1.0,1.9*39 $GPGSV,3,1,09,3,44,055,37,6,33,060,33,7,50,266,39,8,28,311,37*7A |
![]() |
![]() |
#! /usr/bin/python2.5
# -*- coding: utf8 -*- #******************************************** # # コード例 for KDM 2009.12.27 # # Now edited on .... 2009-02-07 ... # Reviced on .... 2009-12-23 # #******************************************** # 必要なモジュールをインポート import os.path import Tkinter as Tk import time, datetime import serial import string . . . # GUI バッファ準備 root = Tk.Tk() buff_date = Tk.StringVar() buff_date.set(honjitsu) buff_hT = Tk.StringVar() buff_mT = Tk.StringVar() buff_sT = Tk.StringVar() buff_hT.set(’’) buff_mT.set(’’) buff_sT.set(’’) . . . # 表示欄の作成 # display date & gpstime f0 = Tk.Frame(master=None, relief= ’ridge’, bd=3) bd0 = Tk.Label(f0, text="きょうは", font=dfont12, relief = ’ridge’) bd1 = Tk.Label(f0, textvariable = buff_date, font=dfont18, relief = ’ridge’) bd2 = Tk.Label(f0, text=" ", font=dfont12, relief = ’flat’) b00 = Tk.Label(f0, text="時刻", relief = ’ridge’) b01 = Tk.Label(f0, textvariable = buff_hT, font=dfont18, relief = ’ridge’) b02 = Tk.Label(f0, text="時", relief = ’ridge’) b03 = Tk.Label(f0, textvariable = buff_mT, font=dfont18, relief = ’ridge’) b04 = Tk.Label(f0, text="分", relief = ’ridge’) b05 = Tk.Label(f0, textvariable = buff_sT, font=dfont18, relief = ’ridge’) b06 = Tk.Label(f0, text="秒", relief = ’ridge’) for e in [ bd0, bd1, bd2, b00, b01, b02, b03, b04, b05, b06 ]: e.pack(side=’left’, padx=5) # display latitude f1 = Tk.Frame(master=None, relief= ’ridge’, bd=3) b10 = Tk.Label(f1, text="北緯", font=dfont24, relief = ’ridge’) b11 = Tk.Label(f1, textvariable = buff_dLa, font=dfont48, relief = ’ridge’) b12 = Tk.Label(f1, text="度", relief = ’ridge’) b13 = Tk.Label(f1, textvariable = buff_mLa, font=dfont48, relief = ’ridge’) b14 = Tk.Label(f1, text="分", relief = ’ridge’) b15 = Tk.Label(f1, textvariable = buff_sLa, font=dfont48, relief = ’ridge’) b16 = Tk.Label(f1, text="秒", relief = ’ridge’) for e in [b10, b11, b12, b13, b14, b15, b16 ]: e.pack(side=’left’, padx=5) . . . # 1秒毎の表示定義関数 def showtime(): # open log file for write gps data f = open( fname, ’a’) gpstime = ’’ # get ’GPGGA’ sentence from gps receiver. # USB シリアルラインのオープン ser = serial.Serial(’/dev/ttyUSB0’, 4800, timeout = 3) print ser.portstr line = ser.readline() # 1行づつ読み込み words = line.split(’,’) while( not words[0] == ’$GPGGA’): line = ser.readline() words = line.split(’,’) print line ser.close() |
プログラム例, 続き
# time # 時刻データの切り出しと変換 time = words[1] hT_utc = time[:2] hT_jst = str( ( int(hT_utc) + 9 ) % 24 ).zfill(2) mT = time[2:4] sT = str( int( float(time[4:]) ) ).zfill(2) gpstime = ’gpstime = ’ + hT_jst + ’:’ + mT + ’:’ + sT + ’ JST’ . . . # latitude # 緯度データの切り出しと変換 lati = words[2] deg_lati = " " + lati[:2] min_lati = lati[2:4] sec_lati = str( int(float(lati[4:]) * 60 ) ).zfill(2) gpslati = ’latitude = ’ + deg_lati + ’:’ + min_lati + ’:’ + sec_lati + ’ ’ + words[3] + ’ ’ # longitude # 経度データの切り出しと変換 long = words[4] deg_long = long[:3] min_long = long[3:5] sec_long = str( int(float(long[5:]) * 60 ) ).zfill(2) gpslong = ’longitude=’ + deg_long + ’:’ + min_long + ’:’ + sec_long + ’ ’ + words[5] + ’ ’ # koudo kodo = words[9] gpskodo = ’koudo= ’ + kodo + ’ m’ . . . # write new data to data file f.write(line) # ログデータのファイルへの書き込み f.close root.after(1, showtime) # 1秒毎に表示を更新 showtime() # 表示関数の起動 root.mainloop() # 無限ループ |
第
30 回関西 Debian 勉強会 2009 年 12 月
____________________________________________________________________________________________