출처 : http://aquayo.blog.me/80050192618
사용하고 있는 GPS 수신기의 데이타 인터페이스 포맷이 NMEA-0183 이다.
NMEA-0183 포맷은 아래와 같다.
NMEA: National Marine Electronics Association
NMEA 에서는 GNSS, GPS, Loran, Omega, Transit 등 다양한 애플리케이션을 위한 데이타셋을 정의하고 있다.
아래는 GPS 를 위한 7가지 데이타 셋이다.
- GGA: GPS Fix Data,
- GLL: Geographic Position - Latitude/Longitude
- GSA: GNSS DOP 와 Active Satellites
- GSV: GNSS Satellites in View
- RMC: Recommended Minumun Specific GNSS Data
- VTG: Course over Ground
- ZDA: Time and Date
NMEA 프로토콜의 구조
8비트 아스키 문자를 사용하여 4800 Baud 로 데이타를 전송한다. 패리티 비트는 사용하지 않는다.
각 GPS 데이타셋은 다음과 같은 구조로 이루어져 있다.
$GPDTS,Inf_1,Inf_2,Inf_3,Inf_4,Inf_5,Inf_6,Inf_n*CS<CR><LF>
필드 |
내용 |
$ | 데이타셋의 시작을 나타낸다. |
GP | GPS 정보를 나타낸다. |
DTS | 데이타셋의 식별자. |
Inf_1 bis Inf_n | 1 ... n 정보 (예, course data 를 위한 175.4) |
, | 서로 다른 정보를 나타내는 아이템간의 구분문자 |
* | checksum 을 위한 구분 문자 |
CS | 전체 데이타셋을 검사하기 위한 첵섬(Control Word) |
<CR><LF> | 데이타셋의 끝. |
NMEA 프로토콜로 기록한 GPS 데이타 예제(SONY GPS 수신기)
$GPGGA,004952,3723.8259,N,12655.3071,E,1,04,04.7,00046.9,M,018.1,M,,*4F
$GPGSA,A,3,13,16,19,23,,,,,,,,,19.3,04.7,18.7*08
$GPGSV,2,1,05,13,33,295,40,16,57,043,41,19,42,212,41,23,40,249,38*7B
$GPGSV,2,2,05,31,,,28,,,,,,,,,,,,*74
$GPRMC,004952,A,3723.8259,N,12655.3071,E,000.0,088.7,291107,,,A*72
$GPVTG,088.7,T,,M,000.0,N,000.0,K,A*0A
$GPGSA,A,3,13,16,19,23,,,,,,,,,19.3,04.7,18.7*08
$GPGSV,2,1,05,13,33,295,40,16,57,043,41,19,42,212,41,23,40,249,38*7B
$GPGSV,2,2,05,31,,,28,,,,,,,,,,,,*74
$GPRMC,004952,A,3723.8259,N,12655.3071,E,000.0,088.7,291107,,,A*72
$GPVTG,088.7,T,,M,000.0,N,000.0,K,A*0A
1. GGA 데이타 셋
GGA 데이타셋은 시간, longitude, latitude, 시스템의 품질, 사용중인 위성의 수, Height 에 대한 정보를 나타낸다.
데이타 예제
$GPGGA,004952,3723.8259,N,12655.3071,E,1,04,04.7,00046.9,M,018.1,M,,*4F
개별 문자의 값 과 내용
필드 |
내용 |
$ | GGA 데이타셋의 시작 |
GP | GPS 어플라이언스로부터 만들어진 정보 |
GGA | GGA 데이타셋 식별자 |
004952 | UTC Positional Time: 00시 49분 52초 |
3723.8259 | Latitude: 37도23.8259분 |
N | 북위 (N=north, S=South) |
12655.3071 | Longitude: 126도 55.3071분 |
E | 동경 (E=East, W=West) |
1 | GPS (0= no GPS, 1=GPS, 2=DGPS) |
04 | 계산을 위해 사용한 위성의 갯수 |
04.7 | HDOP(Horizontal Dilution of Precision) |
00046.9 | 안테나 높이 (Geoid Height) |
M | 높이 단위(M=meter) |
018.1 | Ellipsoid 와 Geoid 간의 높이 차이 |
M | 높이 차이의 단위(M=meter) |
DPGS 데이타의 Age (No DGPS) | |
* | 첵섬 구분자 |
4F | 전체 데이타 검증을 위한 첵섬값 |
<CR><LF> | 데이타 종료 |
2. GLL 데이타 셋
GLL 데이타 셋은 Latitude, Longitude, time, health 정보를 갖고 있다.
SONY GPS 에는 이 데이타셋은 들어 있지 않다.
데이타 예제
$GPGLL,4717.115,N,00833.912,E,130305.0,A,*32
필드 |
내용 |
$ | GLL 데이타의 시작 |
GP GLL | GLL 데이타셋 식별자 |
4717.115 | Latitude: 47도 11.115분 |
N | 북위(N=north,S=south) |
00833.912 | Logitude: 8도 33.912분 |
E | 동경(E=East, W=West) |
130305.0 | UTC 시간: 13시 3분 5.0초 |
A | 데이타셋 품질: A(Valid), V(Invalid) |
* | 첵섬 구분자 |
32 | 첵섬 |
<CR><LF> | 데이타 종료 |
3. GSA 데이타 셋
측정 모드(2D, 3D)에 대한 정보, 위치 결정에 사용된 위성의 수, DOP 등의 정보를 갖고 있다.
데이타 예제
$GPGSA,A,3,13,16,19,23,,,,,,,,,19.3,04.7,18.7*08
필드 |
내용 |
$ | 데이타의 시작 |
GP | GPS 어플라이언스 정보 |
GSA | GSA 데이타셋 식별자 |
A | 계산 모드(A = 2D/3D 모두간의 자동선택, M=수동 선택) |
3 | 3차원 계산 모드(1=none, 2=2D, 3=3D) |
13 | 계산에 사용된 위성의 번호 (13번 위성) |
16 | 계산에 사용된 위성의 번호 (16번 위성) |
19 | 계산에 사용된 위성의 번호 (19번 위성) |
23 | 계산에 사용된 위성의 번호 (23번 위성) |
계산에 사용된 위성의 번호 | |
계산에 사용된 위성의 번호 | |
계산에 사용된 위성의 번호 | |
계산에 사용된 위성의 번호 | |
계산에 사용된 위성의 번호 | |
계산에 사용된 위성의 번호 | |
19.3 | PDOP (Position DOP) |
04.7 | HDOP (Horizontal DOP) |
18.7 | VDOP (Vertical DOP) |
* | 첵섬 구분자 |
08 | 첵섬 |
<CR><LF> | 데이타 종료 |
4. GSV 데이타 셋
위성의 수와
데이타 예제
$GPGSV,2,1,05,13,33,295,40,16,57,043,41,19,42,212,41,23,40,249,38*7B
필드 |
내용 |
$ | 데이타의 시작 |
GP | GPS 어플라이언스 정보 |
GSV | GSV 데이타셋 정보 |
2 | 전송된 GVS 데이타 셋의 전체 수( 1..9) |
1 | 현재 GVS 데이타 셋 번호 (1..9) |
05 | 관측되는 전체 위성의 수 |
13 | 첫번째 위성의 식별 번호 13번 |
33 | 위성의 고도 33도 (0 ...90 도) |
295 | 위성의 방위각 295도 (0..360도) |
40 | 위성의 Signal-to-noise 비율 40(db-Hz) (1..99, 추적되지 않을 때 NULL) |
16 | 두번째 위성의 식별 번호 16번 |
57 | 위성의 고도 57도 |
043 | 위성의 방위각 43도 |
41 | 위성의 Signal-to-noise 비율 41(db-Hz) |
19 | 세번째 위성의 식별 번호 19번 |
42 | 위성의 고도 42도 |
212 | 위성의 방위각 212도 |
41 | 위성의 Signal-to-noise 비율 41(db-Hz) |
23 | 네번째 위성의 식별 번호 23번 |
40 | 위성의 고도 40도 |
249 | 위성의 방위각 249도 |
38 | 위성의 Signal-to-noise 비율 38(db-Hz) |
* | 첵섬 구분값 |
7B | 첵섬 |
5. RMC 데이타 셋
Recommended Minumum Specific GNSS, 시간, latitude, longitude, height, system status, speed, course, date 등의 정보를 갖고 있다.
데이타 예제
$GPRMC,004952,A,3723.8259,N,12655.3071,E,000.0,088.7,291107,,,A*72
필드 |
내용 |
$ | 데이타의 시작 |
GP | GPS 어플라이언스 정보 |
RMC | RMC 데이타셋 식별자 |
004952 | 수신 시간 (UTC), 00시 49분 52초 |
A | 데이타셋 품질 (A=Valid, V=Invalid) |
3723.8259 | Latitude: 37도 23.8259분 |
N | 북위 |
12655.3071 | Longitude: 126도 55.3071분 |
E | 동경 |
000.0 | 속도: 0 Knots |
088.7 | 경로: 88.7 도 |
291107 | 시간: 2007년 11월 29일 (DDMMYY) |
보정 편차 | |
보정 편차 방향(W=West, E=East) | |
A | |
* | 첵섬 구분자 |
72 | 첵섬 |
-- 포맷이 좀 다르다................
6. VTG 데이타 셋
경로와 속도에 기반한 지상 경로와 속도 정보를 갖고 있다.
데이타 예제
$GPVTG,088.7,T,,M,000.0,N,000.0,K,A*0A
필드 |
내용 |
$ | 데이타의 시작 |
GP | GPS 어플라이언스 정보 |
VTG | VTG 데이타 셋 식별자 |
088.7 | 수평 경로 88.7도 (T) |
T | 지도에 대응하는 Angular Course |
수평경로 0 도 (M) | |
M | 자기장에 대응하는 Angular Course |
000.0 | 수평 속도 (N) |
N | 속도 단위 (knots) |
000.0 | 수평 속도 (km/h) |
K | 속도 단위 (km/h) |
A | 데이타 셋 품질로 보임..(A=Valid, V=Invalid) |
* | 첵섬 구분자 |
0A | 첵섬 |
7. ZDA 데이타 셋
시간 정보가 들어 있다.
SONY GPS 에는 이 정보 역시 들어 있지 않다.
데이타 예제
$GPZDA,130305.2,20,06.2001,,,*57
필드 |
내용 |
* | 데이타의 시작 |
GP | GPS 어플라이언스 정보 |
ZDA | ZDA 데이타셋 |
130305.2 | UTC 시간: 13시3분 5.2초 |
20 | Day (00.31) |
06 | Month (01..12) |
2001 | Year |
Local Time 일자 예약 (HH) | |
Local Time 일자 예약 (MM) | |
* | 첵섬 구분자 |
첵섬으로 데이타 정합성 계산
첵섬은 데이타의 시작과 끝을 나타내는 문자를 제외한 모든 문자를 8비트 문자로 XOR 조합을 한후, 각 4비트 자릿수에 대한 결과값을 나타낸다.
첫번째 VGA 데이타로 첵섬을 계산해 보자.
$GPVTG,088.7,T,,M,000.0,N,000.0,K,A*0A
문자 | 아스키 (8비트 값) | ||||||||
G | 0x47 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
P | 0x50 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
V | 0x56 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
T | 0x54 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
G | 0x47 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
, | 0x2C | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
0 | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
8 | 0x38 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
8 | 0x38 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
. | 0x2E | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
7 | 0x37 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 |
, | 0x2C | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
T | 0x54 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
, | 0x2C | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
, | 0x2C | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
M | 0x4D | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
, | 0x2C | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
0 | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
0 | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
0 | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
. | 0x2E | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
0 | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
, | 0x2C | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
N | 0x4E | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
, | 0x2C | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
0 | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
0 | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
0 | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
. | 0x2E | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
0 | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
, | 0x2C | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
K | 0x4B | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
, | 0x2C | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
A | 0x41 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
XOR 합 | 0x0A | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
4bit(Nibble) | 0 0 0 0 | 1 0 0 0 | |||||||
Hex 값 | 0x00 | 0x0A | |||||||
ASCII CS 값 | 0 | A |
진짜로 XOR 연산이 저렇게 나올까... 글쎄...
HDOP 정의 링크
GPS튀는 현상 설명
http://blog.daum.net/commeca/8907691
참고
https://techlog.gurucat.net/239