본문 바로가기
ROBOT/개발자료

GPS NMEA Code

by 학수씨 2011. 8. 25.

출처 : 초심자용 에린 입문서 블로그 (http://erine.egloos.com/2233135)

$ELEXTECH, Inc  G1800s
$HW Version 1.6
$SW Version 231.000.100
$Startup    4
$TOW: 0
$WK:  1192
$POS: 6378137  0        0
$Baud rate: 9600  System clock: 24.553MHz



$GPGGA,215235.670,3735.0064,N,12701.6746,E,1,03,50.0,0.0,M,19.6,M,0.0,0000*4F
$GPGSA,A,2,10,08,02,,,,,,,,,,50.0,50.0,20.0*0A
$GPGSV,3,1,10,26,78,314,00,29,71,017,00,24,48,156,00,10,44,079,46*79
$GPGSV,3,2,10,21,39,309,32,08,21,046,36,09,16,187,00,02,14,151,35*73
$GPGSV,3,3,10,06,14,296,00,15,06,319,00*7F
$GPRMC,215235.670,A,3735.0064,N,12701.6746,E,0.000000,,060905,,*12
$GPGGA,215236.670,3735.0066,N,12701.6748,E,1,03,50.0,0.0,M,19.6,M,0.0,0000*40
$GPGSA,A,2,10,08,02,,,,,,,,,,50.0,50.0,20.0*0A

..
..
..
$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48
$GPGSA,A,2,19,25,15,,,,,,,,,,21.5,7.9,20.0*32
$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77
$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A





1. NMEA Code

GPS에서는 신호가 대략 위와 같은 형식으로 오는데 이걸 NMEA 라고 한다.

NMEA는 The National Marine Elecrtronics Association이라고 하는데,
원래 이 신호가 해양에서의 배의 정확한 위치 확인에 가장 먼저 이용되었나 보다.


그냥 위와 같이 보면 복잡한데,
데이터의 형식은
$로 시작해서 GP로시작하는 NMEA코드이름, 그리고 데이터와 맨 마지막에 *??의
Check Sum그리고 혹은 
로 끝난다.
(, 
은 개행(줄바꿈)을 뜻한다)

/* Modified in 2008-12-09 */
NMEA 0183의 Sentence는 $로 시작해서 *로 끝나며,
그 사이의 모든 글을 XOR 연산하여 *뒤에 체크섬으로 나타낸다.
또한 Sentece뒤에는 <CR><LF>를 붙여서 한 줄로 나타낸다.



Elextech에서 만든 G1800sLP+라는 GPS 모듈에서 나온 GPS정보이며,
UART로 데이터를 전송하고, baud rate는 9600bps (bit per second)라는 것을 알 수 있다.


이 GPS는 총 네가지 종류의 NMEA코드를 출력하는데
$GPGGA,  $GPGSA, $GPGSV, $GPRMC이다.

그리고 뒤의 데이터는 모두 comma ( , )로 구분되어 있다.


2. GPGGA
(Global Positioning System Fix Data)


$GPGGA는 Fix Data라고 하는데, 여기에서 주로 알 수 있는 것은
시간, 위도, 경도, 고도 등이다.

예제 => $GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

$GPGGA 114455.532 3735.0079,N 12701.6446,E 1 03 7.9 48.8,M 19.6,M 0.0,0000 *48
시간 위도 경도 계산종류 위성수 노이즈 고도 고도2 dgps 체크섬



$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

114455.532는 시간으로서
Zulu time (그리니치 표준시) 기준으로 11시 44분 55.532초를 뜻한다.


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

3735.0079는 위도로서
37도 35.0079분을 뜻한다. 60분이 1도니까, 대략 37.5도가 된다. -> 서울
뒤의 N은 북위라는 것을 뜻한다. S라면 남위가 되는 것.
(37˚ 35.0079' = 37.583465˚ = 37˚ 35' 0.474")/* Modified in 2009-03-03 */

구글의 KML 형식으로 변환할 때는 37 + (32.6627/60)의 좌표를 사용하여야 한다. /* 2010-02-11 수정 */


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

12701.6446은 경도로서
127도 1.6446분을 뜻한다. 그러니까, 대략 127도가 된다 -> 서울
뒤에 E는 동경을 뜻하므로, W가 되면 서경이 된다.
(127˚ 1.6446' = 127.02741˚ =  127˚ 1' 38.676")/* Modified in 2009-03-03 */


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

/* 2010-02-11 수정 */

좌표 뒤의 1은 GPS Quality Indicator로,
0 - fix not available ... 즉, GPS가 위성 신호를 제데로 잡지 못해서 좌표를 알 수 없다는 이야기이고,
1 - GPS fix ... 위성 신호를 잘 잡아서 좌표를 보고한다는 말이고,
2 - Differential GPS fix ... Differential GPS로 지상이나위성에서 differential gps 정보를 받아 fix data를 구했다는 뜻으로 좀 더 정교한 측정을 하고 있다는 말이다...

GPS는 미국에서 쏘아올린 GPS 위성에서 동시에 쏘아준 신호의 시간차를 이용하여
거리를 계산하는 방법을 쓴다(삼각측량, 불확정성의 원리)
지구의 어디에 있든지 최소한 3개 이상의 GPS신호를 받을 수 있다.

그런데, 이 경우에 상업용 GPS는 오차가 15m정도 생기는데, 이를 보정하는게
dgps라는 것이다. 지상의 특정하고 정확한 곳에 GPS기지국을 설치하고
여기에서도 신호를 쏘아보내는 것이다.

그러면 오차가 5m이내로 줄어들게 된다.

/* Modified in 2008-12-09 */
DGPS 기지국을 지상의 특정한 곳에 설치할 수도 있지만,
따로 GPS기기 회사에서 위성을 발사하여 보정하는 경우도 있다.


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

계산에 사용한 위성의 갯수인데,
최소한 3개 이상의 신호를 받아야 한다.


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

/* 2010-02-11 수정   2.6 = 7.9 */
Horizontal  Dilution of precision, 즉, DOP란 놈의 수평 값인데...
이것을 이해하고 나면 GPS에서 얻은 좌표에 대한 약간은 실망스럽고, 약간은 절망적이기도 하면서, 그나마 있는게 어디냐는 정도의 생각을 하게 합니다.

GPS는 전 지구적인 시스템으로, 아시다시피 24개 이상의 위성을 띄워서 여기서 발사하는 전파의 지연을 측정해서 자신의 위치를 구해내는 시스템입니다. 따라서, 전지구적 스케일의 시스템으로 부터, 우리가 있는 작은 지점의 위치를 얻는데 조금이라도 오차가 발생하면 즉, 1us의 오차도 수백미터의 오차를 발생시키게 됩니다. 그런데...위성에서 발사하는 전파는 성층권과 전리층 등을 통과하면서 조금씩 속도 차이가 나게 되고, 대기중과 진공 속에서도 속도 차이가 나고, 대기에 습도가 높으냐 낮으냐 그날 비가 오느냐 오지 않느냐...먼지가 많으냐 적으냐....하다 못해 이산화탄소 등 여러 오염 물질 및 기체의 농도에 따라서도 조금씩 차이가 있게 됩니다. 여기에 더해서, 위성도 항상 정확한 위치에 있을 수는 없고...위성의 고도나 위치에 따라서도 조금씩 편차가 있고...즉, 위성이 수평선에 가까이 있을 수록 더 두꺼운 대기층을 통과하게 되고...전파를 받는 위성들의 constellation즉...위성들의 위치가 서로 보완적인 위치에 있느냐 아니면 중복되는 위치에 있느냐...기타 등등등의 원인에 따라 많은 오차가 생기게 됩니다.

이 오차는 UERE(User Equivalent Range Error)와 DOP(Dilution of Precision)으로 구분되는데, UERE는 user와 관련된, gps 기기, 그날의 온도/습도/전리층상태/대기상태/수신기 문제/건물등에 의한 간섭 문제...기타 등등에 의한 오차로, S/A off시 10미터 내외, S/A on시 25~30미터 정도가 되게 됩니다.

DOP는 위성의 geometry 즉, 지리적 위치 등에 의한 것인데...고도나 방위각이 거의 비슷한 위성들로 부터 전파를 받게 되면 DOP가 커지고...잘 분산된 위성들로 부터 받게되면 작아지는 등의 효과가 있지만, 우리는 자세히 알 필요는 없고...어차피 받을 수 있는 위성들로 부터 최선의 데이타를 받아야 하므로... 여기에 있는 2.6이란 값의 의미만 보면...다른 여러 에러의 총 합이 이 값을 곱하라는 것으로...

즉, 수평위치오차의 범위 = ranging accuracy * dilution of precision 이 되고,
S/A off의 경우, 요즘은 대부분의 경우 off, 10m * 2.6 = 26m 정도의 수평 오차가 있을 수 있다는 이야기입니다.

생각하기에 따라서는 상당히 피곤한 이야기인데...이러한 오차를 여러 방법으로 보정해야하겠지요...

$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

고도 정보인데
M법으로 환산했을때 48.8M라는 것이다. (해수면 기준)

$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

지구를 모델링할때에, 구형으로 모델링할 수도 있고
타원체로 모델링할 수 도 있다.

타원체로 모델링할 경우에, 지표면상에서 정확한 위치를 구하기 위해서
(위도 경도 고도를 x,y,z로 고친다는 뜻)
구형과 타원체가 얼마나 차이가 나는지, 지표면에서 얼마나 높게 있는지
그 정보를 알 필요가 있다 이것은, 위도, 경도에 따라 다른데, 이 높이이다.

/* 2010-02-11 수정 */

48.8M는 WGS-84표준에 의한 가상의 타원형 지구의 해수면으로 부터 48.8M 위에 있다는 이야기인데...
그 뒤에 나오는 19.6,M은...
이놈의 가상의 해수면이라는 것이 실제 해수면과 동일할 수는 없기 때문에...
즉, 중력이나 기타 여러 작용으로 인해 바닷물의 높이
도 가상의 평평한 해수면에 맞지 않고 들쭉날쭉하여,
바다위에 떠 있는 배에서도 가상의 해수면 값을 받아 보면 -50M 이런 식으로 나올 수도 있으니...
실제 평균 해수면의 높이와 가상의 해수면 높이를 보정하는 값이 필요하게 됩니다.

따라서 여기에 나오는 19.6M라는 것은 가상의 해수면이 실제 평균 해수면 보다 19.6M 높다는 이야기로,
실제 해수면으로 부터의 높이 = 48.8M + 19.6M = 68.4M....물론 이 값도 오차가 크지만...


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*48

dgps를 사용했을 경우 마지막으로 update한 시간과, dgps 기지국의 ID이다.


$GPGGA,114455.532,3735.0079,N,12701.6446,E,1,03,7.9,48.8,M,19.6,M,0.0,0000*
48

check sum이다.



3. GPGSA

사용을 안한다.


4. GPGSV

GPS Satellites in View
계산에 사용한 위성이 아니라, 현재 위치에서 보이는 모든 위성정보이다.


$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77

줄이 몇 줄인지 나타낸다.
GPGSV가 총 3줄이 나온다./* Modified in 2009-03-03 */


$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77

몇번째 줄인지 나타낸다.
총 3줄의 GPGSV 중 1번째 줄 이다/* Modified in 2009-03-03 */


$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77

보이는 위성의 갯수를 나타낸다.
10개의 위성이 보이고 있고 한줄당 4개의 위성정보가 출력된다/* Modified in 2009-03-03 */


$GPGSV,3,1,10,03,86,244,00,19,51,218,38,16,51,057,00,07,40,048,00*77
$GPGSV,3,2,10,13,34,279,00,23,33,236,00,15,29,076,40,25,25,143,38*71
$GPGSV,3,3,10,21,18,051,,27,12,315,*77

03,86,244,00

3번 위성이고,
현재 자신의 위치에서 86도 (degree) elevation
244도 (degree)의 Azimuth
그리고 신호대잡음비 (SNR)은 0 이다.


그렇게 위성 3개가 적히고
*77은 checksum이다.


5. GPRMC
Recommended Minimmum data라고 하는데
추천되는 가장 최소한의 데이터 들이다.

$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A



$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A

역시 시간을 의미한다. zulutime 기준으로 11시 44분 55.532초


$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A

지금 현재 출력되는 값이
쓸 수 있는 값인지 (valid) 아니면 쓰면 안되는 이상한 값인지를 나타내는데
A라면 valid하고 V라면 valid하지 않다.


$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A


뒤의 위도와 경도는 GPGGA와 동일하다.


$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A


Speed over ground라고 하는데
knots 단위의 속도이다.

비행기에서는 보통 KIAS라는 속도단위를 쓰고,
배에서는 knots라는 속도단위를 사용한다.
KIAS는 대략 km/h 단위의 1/3이라고 보면된다.

만약 900km/h라면 300KIAS정도 된다.
KIAS는 knots indicator air speed의 약자이다.

/* Modified in 2007-12-19 */
Knot단위계와 km/h단위계의 변환은 대략 1.8을 곱하면 된다.



$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A

Track Angle in degree true라고 하는데 잘 모르겠다. ~_~)

/* Modified in 2007-12-19 */
진행방향을 정북으로부터 0도부터 359도까지로 표현한 것이다.
121.61 이니까. 동남쪽으로 이동하고 있다.



$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A

Date이다.
11th, July, 2006. 2006년 7월 11일을 뜻한다.


$GPRMC,114455.532,A,3735.0079,N,12701.6446,E,0.000000,121.61,110706,,*0A


안나오는데 (이 장치가 지원을 안해서..)
원래 북쪽을 0으로 한, magnetic variation,
즉 나침반이다.


*0A

체크섬이다.


- 참조자료 - reference

http://www.nmea.org/ - National Marine Electronics Association
http://www.gpsinformation.org/dale/nmea.htm - GPS Information
http://home.pacific.net.au/~gnb/gps/nmea.html - GPS NMEA reference

댓글