USB GPSデバイス GLOBALSAT BU-353S4 を試す
USB GPSデバイス GLOBALSAT BU-353S4 を試します。
ソフトの準備
cu
$ sudo apt-get install cu
差し込んで、デバイスが認識されていることを確認
$ lsusb | grep Prolific Bus 001 Device 006: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port $ ls /dev/ttyUSB* /dev/ttyUSB0
conf ファイルを設定した。
# cat /etc/default/gpsd START_DAEMON="true" USBAUTO="true" DEVICES="/dev/ttyUSB0" GPSD_OPTIONS="-F /var/run/gpsd.sock -b -n"
動作確認
# gpsmon # xgps
オプション確認
GPSD
usage: gpsd [-b] [-n] [-N] [-D n] [-F sockfile] [-G] [-P pidfile] [-S port] [-h] device...
Options include:
-b = bluetooth-safe: open data sources read-only
-n = don't wait for client connects to poll GPS
-N = don't go into background
-F sockfile = specify control socket location
-G = make gpsd listen on INADDR_ANY
-P pidfile = set file to record process ID
-D integer (default 0) = set debug level
-S integer (default 2947) = set port for daemon
-h = help message
-V = emit version and exit.
A device may be a local serial device for GPS input, or a URL in one
of the following forms:
tcp://host[:port]
udp://host[:port]
{dgpsip|ntrip}://[user:passwd@]host[:port][/stream]
gpsd://host[:port][/device][?protocol]
in which case it specifies an input source for device, DGPS or ntrip data.
The following driver types are compiled into this gpsd instance:
NMEA0183
Ashtech
Delorme TripMate
Pre-2003 Delorme EarthMate
Furuno Electric GH-79L4
n Garmin NMEA
c MTK-3301
OceanServer OS5000
San Jose Navigation FV18
b True North
c Jackson Labs Fury
* AIVDM
n b c * EverMore
n * Garmin Serial binary
* Garmin USB binary
n b * GeoStar
* iTalk
* Motorola Oncore
b * Navcom
n b * SiRF
n b * SuperStarII
n b * Trimble TSIP
n b c * u-blox
b * Zodiac
* NMEA2000
* RTCM104V2
* RTCM104V3
* Garmin Simple Text
* JSON slave driver
# n: mode switch, b: speed switch, c: rate switch, *: non-NMEA packet type.
# Socket export enabled.
# Shared memory export enabled.
# DBUS export enabled
# Time service features enabled.
# PPS enabled.
Python コーディング
gps を使うので、 インストールしておく。
$ sudo pip install gps
最初から入ってたかも?
こちらを参考にする。
Setting Everything Up | Adafruit Ultimate GPS on the Raspberry Pi | Adafruit Learning System
import gps # Listen on port 2947 (gpsd) of localhost session = gps.gps("localhost", "2947") session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) while True: try: report = session.next() # Wait for a 'TPV' report and display the current time # To see all report data, uncomment the line below print report if report['class'] == 'TPV': if hasattr(report, 'time'): print "time:" + report.time if hasattr(report, 'speed'): print "speed:" + str(report.speed * gps.MPS_TO_KPH) if hasattr(report, 'lat'): print "lat:" + str(report.lat) if hasattr(report, 'lon'): print "lon:" + str(report.lon) if hasattr(report, 'alt'): print "alt:" + str(report.alt) except KeyError: pass except KeyboardInterrupt: quit() except StopIteration: session = None print "GPSD has terminated"
print report の箇所で、どんなデータが帰ってきているのか分かる。
こんな感じだ。(一部伏せました)
<dictwrapper: {u'epx': ***, u'epy': ***, u'epv': ***, u'ept': 0.005, u'lon': ***, u'eps': 63.47, u'epc': 187.7, u'lat': ***, u'tag': u'MID2', u'track': ***, u'mode': 3, u'time': u'2016-07-21T06:47:37.000Z', u'device': u'/dev/ttyUSB0', u'climb': -0.009, u'alt': 48.894, u'speed': 0.353, u'class': u'TPV'}>
ロギングの方針が決まっていませんが、とりあえず、緯度・経度・高度1セット出力したら修了するように改変する。
#!/usr/bin/env python # -*- coding: utf-8 -*- from datetime import datetime import gps # Listen on port 2947 (gpsd) of localhost session = gps.gps("localhost", "2947") session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) lat = '' lon = '' alt = '' tmie = '' while True: try: report = session.next() # print report # To see all report data, uncomment the line below if report['class'] == 'TPV': if hasattr(report, 'lat'): lat= str(report.lat) if hasattr(report, 'lon'): lon= str(report.lon) if hasattr(report, 'alt'): alt= str(report.alt) if hasattr(report, 'time'): alt= str(report.time) if( lat!='' and lon!='' and alt!='' ): print time print "lat:" + lat print "lon:" + lon print "alt:" + alt quit() except KeyError: pass except KeyboardInterrupt: quit() except StopIteration: session = None print "GPSD has terminated"
GPSログのフォーマットについて
どうやら、KML形式 と GPX形式 が、有名らしい。
gpxlogger という、そのまんまが有るので、利用する。
gpxlogger [-D debug-level] [-d] [-e export-method] [-f filename] [-l] [-m minmove] [-h] [-V]
[-i track timeout] [server [:port [:device]]]
gpxlogger
This program collects fixes from gpsd and logs them to standard output in GPX, an XML profile for track
logging.
The output may be composed of multiple tracks. A new track is created if there's no fix for an interval
specified by the -i and defaulting to 5 seconds.
The -d option tells gpxlogger to run as a daemon in background. It requires the -f option, which directs
output to a specified logfile.
The -m option sets a minimum move distance in meters (it may include a fractional decimal part). Motions
shorter than this will not be logged.
gpxlogger can use any of the export methods that gpsd supports. For a list of these methods, use the -l.
To force the method, give the -e one of the colon-terminated method names from the -l table.
If D-Bus support is available on the host, GPSD is configured to use it, and -e dbus is specified, this
program listens to DBUS broadcasts from gpsd via org.gpsd.fix.
With -e sockets, or if sockets is the method defaulted to, you may give a server-port-device
specification as arguments.
どうやら、定期的にログを出すのではなく、設定した移動距離を超えたらログを出す仕様のようだ。
なるべく頻繁にロギングして欲しいので、、、
$ gpxlogger -d -i 30 -m 1 -f /usbmem/gps/`date +%Y%m%d%H%M%S`.gpx /dev/ttyUSB0
作成したファイルは、グーグルマイマップでインポート出来ます。
やってみたところ、起動直後のデータが 100m 程度ぶれており、あっちこっちにプロットされました。
NTP
Raspberry pi は、電池やバッテリが無く、OSが立ち上がっていない状態では時刻情報を更新しない。
そのため、起動すると、前回の時刻の続きに成る。
それでは困るので、GPSデータの時刻情報を元に、NTPで同期させる。
/etc/ntpd_conf
server 127.127.28.0 minpoll 4 maxpoll 4 fudge 127.127.28.0 refid GPS stratum 15
確認
$ ntpq -p
動作確認
数時間電源を落とした後に起動すると、同期してくれない。
man ntpd 抜粋
-g Normally, ntpd exits with a message to the system log if the offset exceeds the panic threshold,
which is 1000 s by default. This option allows the time to be set to any value without restric‐
tion; however, this can happen only once. If the threshold is exceeded after that, ntpd will exit
with a message to the system log. This option can be used with the -q and -x options.
1000秒以上のずれがあると、同期してくれない。
対応策としては、
$ sudo service ntp stop $ sudo ntpd -qg $ sudo service ntp start
となる。
が、足した所、1,2分待っても何も起こらなかった。
GPSDから読み取った値に対して、 date -s する方向で。