測量員使用差分 GPS 系統來獲得準確的位置。 固定式 GPS 和流動站共同努力消除一些錯誤。我想我可以用兩個便宜的 GPS 構建一個窮人的差分 GPS,方法是從兩個 GPS 收集數據並從流動站中減去固定設備的運動矢量。 但這不適用於消費級 GPS。 如果我願意先閱讀,我可能會直接去...
對來自相鄰設備的多個 GPS 輸出進行平均確實比單個設備產生更好的答案。我在窗台上放了三個,通過 USB 端口為 Linux 機器供電。
USB GPSs in a window窗口中的 USB GPS
我在編寫讀取設備的 Python 代碼時犯了另一個錯誤,接近尾聲:
### edited for presentation, may not be functional without some TLC
# dmesg after plug in gives usb port info
import serial
import math
import re
import datetime
import sys
# https://github.com/Knio/pynmea2/blob/master/pynmea2/nmea_utils.py
def timestamp(s):
'''
Converts a timestamp given in "hhmmss[.ss]" ASCII format to a
datetime.time object
'''
ms_s = s[6:]
ms = ms_s and int(float(ms_s) * 1000000) or 0
t = datetime.time(
hour=int(s[0:2]),
minute=int(s[2:4]),
second=int(s[4:6]),
microsecond=ms)
return t
def datestamp(s):
'''
Converts a datestamp given in "DDMMYY" ASCII format to a
datetime.datetime object
'''
return datetime.datetime.strptime(s, '%d%m%y').date()
def dm_to_sd(dm):
'''
Converts a geographic coordiante given in "degres/minutes" dddmm.mmmm
format (ie, "12319.943281" = 123 degrees, 19.953281 minutes) to a signed
decimal (python float) format
'''
# '12319.943281'
if not dm or dm == '0':
return 0.
d, m = re.match(r'^(\d+)(\d\d\.\d+)$', dm).groups()
return float(d) + float(m) / 60
ser0 = serial.Serial('/dev/ttyACM0', 2*9600)
ser1 = serial.Serial('/dev/ttyACM1', 2*9600)
ser2 = serial.Serial('/dev/ttyACM2', 2*9600)
lat0=0
lon0=0
lat1=0
lon1=0
lat2=0
lon2=0
time = ""
while True :
state=ser0.readline().split(",")
if state[0]=="$GPRMC":
lat0 = dm_to_sd(state[3])
lon0 = -dm_to_sd(state[5])
time = datetime.datetime.combine(datestamp(state[9]), timestamp(state[1]))
state=ser1.readline().split(",")
if state[0]=="$GPRMC":
lat1 = dm_to_sd(state[3])
lon1 = -dm_to_sd(state[5])
time = datetime.datetime.combine(datestamp(state[9]), timestamp(state[1]))
state=ser2.readline().split(",")
if state[0]=="$GPRMC":
lat2 = dm_to_sd(state[3])
lon2 = -dm_to_sd(state[5])
time = datetime.datetime.combine(datestamp(state[9]), timestamp(state[1]))
print time.strftime("%Y-%m-%dT%H:%M:%S")+","+str(lat0)+","+str(lon0)+","+str(lat1)+","+str(lon1)+","+str(lat2)+","+str(lon2)
sys.stdout.flush()
代碼永遠循環,讀取三個設備中的每一個,尋找GPRMC具有有趣數據的消息,並將格式化的消息打印到輸出文件。 回想起來,簡單的 print 語句應該將數據格式化為我最終想要的形狀。 我有一個像這樣的文件
2017-06-29T13:59:59, 35.111,-78.222,35.112,-78.223,35.113,-78.224
其中 35 和 -78 大約是緯度和經度。 但是我想要的是重新排列的:
2017-06-29T13:59:59, 35.111,-78.222,1
2017-06-29T13:59:59, 35.112,-78.223,2
2017-06-29T13:59:59, 35.113,-78.224,3
其中尾隨的 1,2,3 標識傳感器。 由於我可能會再次導入數據,因此我編寫了這個 JSL 來進行轉換。 (其實大部分代碼都是為了生成圖片,註釋在最後。)
colors={{255,0,0},{0,255,0},{0,0,255},{0,0,0}};
ipicture=1e7; // sequence number with leading digit
path="H:\GPSWander\images\";
takePicture = function({},
// {filename=path||"gps"||char(ipicture++)||".png"},
// Report( gb )[framebox( 1 )]<<SAVEPICTURE>= .003, trans = trans * .80,
Report( gb )[framebox( 1 )] << Transparency( trans );
takePicture();
);
Report( gb )[framebox( 1 )] << Transparency( 1.0 );
Report( gb )[framebox( 1 )] << Marker Size( 2 );
dt << selectrows( 5 :: N Rows( dt ) );
dt << hide( 1 );
dt << clearselect;
step = N Rows( dt ) / 10000; // frames in video
For( i = 1, i < N Rows( dt ), i += step,
dt << selectrows( i :: i + step + step + step + step ); // trail
dt << hide( 0 );
takePicture();
dt << hide( 1 );
dt << clearselect;
);
</SAVEPICTURE>
尋找“gpsLog3.txt”的開放功能。 它有我從導入預覽幫助我的數據表複製的腳本。 接下來的幾行刪除了一些包含無效數據的行。 壞的只有6個;我不確定為什麼通道 2 上的 GPS 報告 0,0。
接下來的幾行創建 lat9,lon9 作為 lat1,2,3 和 lon1,2,3 的平均值。 <
下一步創建僅包含要連接的列的子集,重命名它們,添加 id 變量。 然後將表連接起來,關閉不需要的表。
接下來生成的匯總表用於在隨後的 GraphBuilder 中設置參考線和軸限制。 然後有一些循環來驅動圖形生成器中的動畫序列(以及開始拍照的奇怪功能。)
- 我借用了一些 github 代碼來處理一些 NMEA GPS 問題,感謝 Knio!
- 如果你嘗試這樣做,你可能還需要“sudo adduser $USER dialout”,查一下。
Explaining the density ellipse in the video解釋視頻中的密度橢圓
這GPS漫遊視頻。