측량사는 차동 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 흥미로운 데이터가 있는 메시지를 출력 파일에 형식화된 메시지를 인쇄합니다. 돌이켜보면 그 단순한 인쇄 문은 내가 결국 원했던 모양이 되도록 데이터 형식을 지정했어야 했습니다. 내가 가진 것은 다음과 같은 파일입니다
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을 보고했는지 잘 모르겠습니다.
다음 몇 줄은 lat1,2,3 및 lon1,2,3의 평균으로 lat9,lon9를 생성합니다. <
다음 단계에서는 연결할 열만 있는 하위 집합을 만들고 이름을 바꾸고 id 변수를 추가합니다. 그런 다음 테이블이 연결되고 불필요한 테이블이 닫힙니다.
다음에 생성되는 요약 테이블은 뒤에 오는 GraphBuilder에서 기준선 및 축 제한을 설정하는 데 사용됩니다. 그런 다음 그래프 빌더에서 애니메이션 시퀀스를 구동하는 몇 가지 루프가 있습니다(및 처음에 사진을 찍는 홀수 기능).
- 일부 NMEA GPS 문제를 처리하기 위해 일부 github 코드를 빌렸습니다. 감사합니다. Knio!
- 이렇게 하려고 하면 "sudo adduser $USER dialout"도 필요할 것입니다. 찾아보세요.
Explaining the density ellipse in the video비디오에서 밀도 타원 설명
그만큼 GPS 원더 동영상.