GPS-nmea0183-criminalist.pdf
출처 : 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> |
데이타셋의 끝. |
GPS 데이타셋의 문자열은 시작과 끝을 나타내는 문자를 제외하고
79자를 초과해서는 안된다.
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
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