측량사는 차동 GPS 시스템을 사용하여 정확한 위치를 얻습니다. 고정 GPS 및 임시 과녁 일부 오류를 취소하기 위해 함께 작업하십시오.나는 둘 다에서 데이터를 수집하고 로버에서 고정 장치의 모션 벡터를 빼서 두 개의 저렴한 GPS로 가난한 사람의 차동 GPS를 구축할 수 있다고 생각했습니다. 그러나 이것은 소비자 등급 GPS에서는 작동하지 않습니다. 만약 내가 먼저 읽어 , 내가 직접 갔을 수도 있습니다 ...
인접 장치의 여러 GPS 출력을 평균화하면 단일 장치보다 더 나은 응답이 생성됩니다.나는 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()
코드는 영원히 반복되며 세 개의 장치를 각각 읽고 다음을 찾습니다. 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 videoExplaining the density ellipse in the videoExplaining the density ellipse in the videoExplaining the density ellipse in the video비디오에서 밀도 타원 설명
그만큼 GPS 원더 동영상.