利用 BeagleBoard-xM 上的 Linux 讀取 GPS 接收器的數據

先前我用了我的 BeagleBoard-xM 去讀取 Arduino UNO 接駁的感測器的氣溫、濕度和氣壓數據(連結)。這次我將我的 GPS 接收器(型號為 Holux M-241)接上 BeagleBoard-xM,它會在 Linux 上開啟一個 serial port,我們可用以下 Python 程式讀取由它輸出的 NMEA 資料:
import serial
ser = serial.Serial('/dev/ttyUSB0', 38400)

while True:
        result = ser.readline()
        data = result[0:len(result)-2]
        print data

我可以每秒讀取出數據,以下為其中一秒的數據:
$GPGGA,144014.000,2227.0987,N,11410.1382,E,2,6,1.67,32.6,M,-1.3,M,0000,0000*7B
$GPGSA,A,3,23,13,19,06,07,03,,,,,,,1.92,1.67,0.95*0D
$GPGSV,3,1,12,19,62,014,18,11,57,174,,50,46,122,31,07,43,326,20*79
$GPGSV,3,2,12,13,40,236,29,03,40,031,27,01,33,174,,23,29,207,29*76
$GPGSV,3,3,12,16,24,067,,06,23,040,26,08,13,323,,30,06,091,*78
$GPRMC,144014.000,A,2227.0987,N,11410.1382,E,0.89,138.25,090313,,,D*65
$GPVTG,138.25,T,,M,0.89,N,1.65,K,D*36

從 GPGGA,我們可知它在 14:40:14 UTC 輸出,位於北緯 22 度 27.0987 分,東經 114 度 10.1382 分,聲稱以 DGPS 作為定位方式,以 6 顆衛星進行定位,HDOP 為 1.67,這一點位於特定基準的大地水準面(Geoid)上 32.6 米,而根據內置的轉換資料庫,這裡的大地水準面是低於 WGS84 橢圓球體表面 1.3 米,反過來說,就是 WGS84 橢圓球體表面位於大地水準面之上 1.3 米,所以這一點跟 WGS84 橢圓球體表面的距離窄一點,在橢圓球體表面之上 31.3 米。

從 GPGSA,我們可知它自動選擇 2D 或 3D 定位,而它現在是以 3D 定位,23、13、19、06、07 和 03 是每顆用來定位的 GPS 衛星的 PRN 碼,1.92 為 PDOP,1.67 為 HDOP,0.95 為 VDOP。

從三行 GPGSV,我們可知總共有 12 顆衛星在視線範圍內,其中 PRN 為 19 的在 62 度上空,方位為 014 度,訊噪比為 18,每 4 個一組,如此類推。

從 GPRMC,我們可知它在 14:40:14 UTC 輸出,A 指運作中,位於北緯 22 度 27.0987 分,東經 114 度 10.1382 分,以每小時 0.89 knots 向 138.25 度移動,日期為 2013 年 3 月 9 日。

從 GPVTG,我們可知它正向 138.25 度移動,以每小時 0.89 knots,也就是每小時 1.65 公里移動。

更多 NMEA 的資料可參考這裡,DOP 可參考這裡

可見的 GPS 衛星預測可參考這裡

同時讀取感測器和 GPS 接收器數據的情況:
beagleboardxm-running

內部連結:
【目錄】地理/地理資訊系統/空間資料庫/大地測量內部連結

本文連結