測量士は、差分 GPS システムを使用して正確な位置を取得します。 定置型 GPS とローバーいくつかのエラーをキャンセルするために協力します。安価な GPS を 2 つ使用して、両方からデータを収集し、ローバーから固定デバイスの動きベクトルを差し引くことで、貧弱な差分 GPS を構築できると考えました。 しかし、これは一般消費者向けの GPS では機能しません。 私がしたい場合最初に読んで、私は直接行ったかもしれません...
隣接するデバイスからの複数の GPS 出力を平均すると、単一のデバイスよりも優れた結果が得られます。私は窓枠に 3 台置き、USB ポート経由で Linux マシンに給電しました。
USB GPSs in a windowUSB GPSs in a windowUSB GPSs in a windowUSB 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()
コードは永遠にループし、3 つのデバイスのそれぞれを読み取り、 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」の open 関数を探します。 インポート プレビューが役に立ったデータ テーブルからコピーしたスクリプトがあります。 次の数行は、無効なデータを含むいくつかの行を削除します。 悪いものは 6 つしかありませんでした。チャネル 2 の GPS が 0,0 を報告した理由がわかりません。
次の数行は、lat1,2,3 と lon1,2,3 の平均として lat9,lon9 を作成します。 <
次のステップでは、連結する列だけを含むサブセットを作成し、それらの名前を変更して、id 変数を追加します。 次に、テーブルが連結され、不要なテーブルが閉じられます。
次に生成されるサマリー テーブルは、後続の GraphBuilder で参照線と軸の制限を設定するために使用されます。 次に、グラフ ビルダーでアニメーション シーケンスを駆動するためのループがいくつかあります (最初に写真を撮るための奇妙な関数もあります)。
- NMEA GPS の問題のいくつかを処理するために、いくつかの github コードを借りました。Knio に感謝します。
- これを行おうとすると、おそらく「sudo adduser $USER dialout」も必要になるでしょう。調べてください。
Explaining the density ellipse in the videoExplaining the density ellipse in the videoExplaining the density ellipse in the videoExplaining the density ellipse in the video密度楕円を動画で解説
のGPSワンダービデオ。