Linux 일반

GPS raw data 분석 방법 NMEA(GPRMC, GPGSV, GPGGA)

bumnux 2013. 10. 31. 10:53

출처 : 초심자용 에린 입문서 블로그 (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

$GPGGA114455.5323735.0079,N12701.6446,E1037.948.8,M19.6,M0.0,0000*48
시간위도경도계산종류위성수노이즈고도고도2dgps체크섬


$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 */


$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

1은 fix종류를 뜻하는데

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

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

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

0 이면 invalid한 데이터(못쓰는 데이터) 라는 의미
1 이면 gps 위성신호만으로 계산
2 라면 dgps도 사용하여 계산 등등이다.

/* 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

horizontal dillusion of position이래는데.
무슨 말인지 ~_~)

/* Modified in 2009-01-13 */
위성과의 노이즈에 관련된 자료 라고 하네요


$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로 고친다는 뜻)
구형과 타원체가 얼마나 차이가 나는지, 지표면에서 얼마나 높게 있는지
그 정보를 알 필요가 있다 이것은, 위도, 경도에 따라 다른데, 이 높이이다.


$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