제임스딘딘의
Tech & Life

개발자의 기록 노트/GPS 이야기

[GPS 이야기] NMEA-0183 형식, NMEA Sentence Format

제임스-딘딘 2017. 8. 10. 00:15

만약 당신이 GNSS와 직접적으로 관련된 일을 한다면.

혹은 간접적으로 GPS등과 같은 것을 통해 얻은 위치정보등을 다뤄야 할 일이 있다면.

조만간 'NMEA' 라는 것을 마주하게 될 수도 있다.


위치정보라는것은 어떤 목적으로 활용하느냐에 따라 다뤄야 하는 데이터는 달라진다.  

현재 위치에 기반하여 날씨정보를 보여주는 어플리케이션처럼 간단히 위도, 경도만 알면 되는 경우가 있는가 하면,

목적지까지 경로를 알려주는 내비게이션 어플리케이션처럼 때로는 위도, 경도 뿐만아니라 속도, 위치정확도 오차값, 방향.. 등을 알아야 하는 경우도 존재 한다.

또한 종종 등산 트래커 어플리케이션처럼 고도를 활용하는 경우도 있다. 사실 고가의 GPS가 아닌 이상, 스마트폰과 같은 저렴한 GPS칩이 주는 고도값은 부정확하다고 알려져있다.


그리고 이 와중에, NMEA라는 것이 있다. 자세히는 몰라도 되는 것이지만, 알면 도움이 될 수도 있다. (알면 좀 있어보이기도 한다.) 

이 포스팅에서는 NMEA란 무엇이고, NMEA데이터를 해석하기 위해 알아야 할 내용들을 간략히 다루어 보겠다.

NMEA의 개념정도를 잡아보자는 생각으로 가볍게 읽어보자.


지구에서 보이는 위성의 개수 이해하기



NMEA 개요

NMEA는 'National Marine Electronics Association'의 앞글자를 딴 약자이다.

해양 전자공학 산업의 발달과 교육을 위해 모인 비영리 단체를 지칭한다.

그리고 NMEA 표준은 ”해양 전자 장비 기자재들 간의 통신을 위해 정의된 전기적 인터페이스 및 데이터 프로토콜” 이라고 정의할 수 있다.


해양 전자 장비 기자재들 간의 통신을 위해 정의된 전기적 인터페이스 및 데이터 프로토콜


NMEA에서는 몇가지 프로토콜을 정의 했는데, 현재 GPS통신에서는 'NMEA-0183'을 표준 프로토콜로 사용하고 있다.

표준을 관리하는 NMEA의 웹사이트는 http://www.nmea.org 이니 알아두도록 하자.






NMEA 들여다보기

NMEA Sentence 기본 형태

먼저 어떤 모양인지 보자. NMEA는 아래와 같은 형태로 되어있다.


$GPGGA,141113.999,3730.0308,N,12655.2369,E,1,06,1.7,98.9,M,,,,0000*3E

$GPGSA,A,3,02,07,01,20,04,13,,,,,,,3.7,1.7,3.2*31 

$GPRMC,141113.999,A,3730.0308,N,12655.2369,E,19.77,195.23,101200,,*3C

$GPGGA,141114.999,3730.0264,N,12655.2351,E,1,07,1.2,98.8,M,,,,0000*3C 

$GPGSA,A,3,02,07,01,20,24,04,13,,,,,,2.3,1.2,1.9*3E

$GPRMC,141114.999,A,3730.0264,N,12655.2351,E,15.51,202.12,101200,,*3C 

$GPGGA,141115.999,3730.0231,N,12655.2345,E,1,07,1.2,98.7,M,,,,0000*37

$GPGSA,A,3,02,07,01,20,24,04,13,,,,,,2.3,1.2,1.9*3E

$GPGSV,2,1,07,07,84,025,47,04,51,289,48,20,40,048,47,02,32,203,46*74

$GPGSV,2,2,07,01,23,101,47,13,20,131,32,24,19,268,40*49

$GPRMC,141115.999,A,3730.0231,N,12655.2345,E,12.14,194.75,101200,,*33

$GPGGA,141116.999,3730.0210,N,12655.2330,E,1,07,1.2,98.5,M,,,,0000*37

$GPGSA,A,3,02,07,01,20,24,04,13,,,,,,2.3,1.2,1.9*3E

$GPRMC,141116.999,A,3730.0210,N,12655.2330,E,8.01,194.65,101200,,*0F

$GPGGA,141117.998,3730.0199,N,12655.2320,E,1,06,1.3,98.2,M,,,,0000*33

$GPGSA,A,3,02,07,01,20,24,04,,,,,,,2.4,1.3,2.0*30


GNSS에서는 언제 NMEA-0183을 사용하는가?

위성신호를 해석해낸 GPS수신기가 해석한 정보를 외부에 알리는데 사용하는 방법이다.

GPS측위가 시작되면 GPS위성으로부터의 반송파에 실려오는 데이터를 GPS수신기는 해석을 할텐데, 해석되는 내용을 알려주는 방식이라고 이해하면 쉽다.


GPS수신기는 이와 같은 내용을 1초 ~ 수초마다 Serial 출력의 형태로 내보낸다.

위의 예를 보면 '$' 라는 문자로 시작되는데, 이렇게 $로 시작되는 각각의 한줄을 'NMEA Sentence' 혹은 'NMEA 문장' 이라고 부른다.


이 그림은 GPS수신기가 GPS위성 시스템으로부터 반송파를 받아 해석한 후, NMEA 문장(혹은 NMEA 메세지)으로 내보내는 과정을 보여주고 있다. 

NMEA메세지는 기본적으로 정보나 데이터의 패킷이다. 

GPS수신기는 해석된 각각의 정보를 이 NMEA메세지를 한줄 한줄 내보내는데, 이 NMEA메세지는 여러 타입으로 분류된다. 각 NMEA메세지는 타입에 따라 고유한 프로토콜을 가지고 있다. 따라서, 타입을 먼저 파악 한 후, 그에 맞는 프로토콜로 해석을 해야 한다. 타입은 NMEA메세지의 'Device ID'와 'Sentence ID'라고 불리는 첫 5글자를 읽어서 파악할 수 있다.


보다 더 자세한 내용은 아래에서 설명한다.


NMEA Sentence 구성요소

그럼 NMEA Sentence의 구성요소를 알아보자.


$ - 문장의 시작을 의미함


Linefeed - 문장의 끝을 의미함, 줄바꿈 문자 <CR>/<LF> 를 말한다.


Device ID - 장치를 구분하는 용도다. 현재 이 데이터를 말하는 장치의 ID라는 의미로 'Talker ID'라고도 부른다. '$' 바로 다음에 오는 문자 2개. 예를 들면 'GP' 와 같은 것.


Sentence ID - 문장을 구분하는 용도다. Sentence Name이라고도 한다. Device ID 다음에 오는 문자 3개. 예를 들면 'RMC' 와 같은 것.


콤마 - 각 필드를 구분하는 용도이다.




$GPRMC,141114.999,A,3730.0264,N,12655.2351,E,15.51,202.12,101200,,*3C


이 문장을 다시 보자.

문장의 시작을 의미하는 $ 보이고, GP라는 Device ID(Talker ID)를 가지고 있으며, RMC라는 Sentence ID(Sentence Name)을 가지고 있다.

맨 마지막에 붙는 '3C'는 checksum값이다. 두자리 16진수 이다. 데이터가 올바르게 전달 되었는지 확인하는 용도이다.

checksum 계산 방법은 아래부분에서 다루도록 하겠다.


자, 색상으로 칠해진 부분은 이제 읽을 줄 알게 되었다.

가운데 검은색 부분은 어떻게 읽으면 되는지 알아보자. 어떻게 읽는지는, Sentence ID에 따라 달라진다.


참고로, 통상적인 GPS 수신기에서는 몇가지 Device ID만 제한적으로 출력된다.


GP - Global Positioning System receive

LC - Loran-C receive

OM - Omega Navigation receive



GPGGA

GPGGA는 'Global Positioning System Fix Data'를 의미한다.  아래의 GPGGA 예제 sentence를 살펴보자.

GPGGA는 총 17개의 field를 가진다. 

참고로 예제에서는 12 ~ 15 필드는 비어 있다.

그리고, 17번 필드는 그림에서는 보이지 않는데, 그 이유는 Terminator문자인 CR/LF 이기 때문이다.


NMEA-0183 GPGGA 문장의 예





 Idx

 Field

 Value

 Comments

 1

 Sentence ID

 $GPGGA

 Global Positioning system fixed data

 2

 UTC Time

 141113.999

 시각. hhmmss.sss 형태이다. 

 예제는 14시 11분 13.999초 라는 의미이다. 세계 표준시 이므로 한국에서 사용하려면 +9 를 해야 한다.

 참고로 날짜는 GPGGA로는 확인 할 수 없고, GPRMC에서 처리해야 한다.

 3

 Latitude

 3730.0308

 위도. ddmm.mmmm 형식이다. 앞의 2자가 '도' 이고 이후는 '분' 이다.

 *'도분초' 형식이 아닌 '도분' 인것을 유의할 것. 

 필요하다면 소수점 아래는 60을 곱하여 '초' 형식으로 변환 해야 한다.

 => 0.0308분 x 60 = 1.848 초

 4

 N/S Indicator

 N

 N = North, S = South

 북위 인지 남위 인지를 나타낸다.

 5

 Longitude

 12655.2369

 경도. dddmm.mmmm 형식이다.  앞의 3자가 '도' 이고 이후는 '분' 이다. 

 *'도분초' 형식이 아닌 '도분' 인것을 유의할 것. 

 필요하다면 소수점 아래는 60을 곱하여 '초' 형식으로 변환 해야 한다.

 6

 E/W Indicator

 E

 E = East, W = West, 

 동경인지 서경인지를 나타낸다.

 7

 Position Fix

 1

 0 = Invalid, 1 = Valid SPS, 2 = Valid DGPS, 3 = Valid PPS

 위치가 결정 됐는지를 나타낸다. 이 값이 0이면 위도, 경도 등을 믿을 수 없으므로 사용하면 안된다.

 8

 Satellites Used

 06

 Satellites being used (0-12)

 현재 수신되는 위성의 개수이다.

 9

 HDOP

 1.7

 Horizontal Dilution of Precision

 10

 Altitude

 98.9

 WGS-84 타원체에서  평균해수면(MSL : Mean Sea Level)을 기준으로 한 고도.

 고도값의 단위는 다음에 오는 Altitude Units 필드가 결정한다.

 11

 Altitude Units

 M

 M = Meters

 12

 Geoid Seperation

 (empty) 

 Geoid seperation in meters according to WGS-84 ellipsoid

 MSL과 Geoid의 고도차. 마이너스 값이 나올 수 있다.

 13

 Seperation Units

 (empty)

 M = Meters

 14

 DGPS Age

 (empty)

 Age of DGPS data in seconds

 15

 DPGS Station ID

 0

 

 16

 Checksum

 *3E

 

 17

 Terminator

 CR/LF

 


몇가지 부연설명을 하고자 한다.


10번의 고도값이 있는데, 이는 생각보다 부정확하다. 일반적으로 GPS는 수평오차보다 수직오차가 크다고 알려져있다. 간단하게 말하면 위성이 우리의 발 밑에는 없고 전부 머리 위에 있기 때문으로 이해하면 될 것같다. 즉, 고도 값 자체를 너무 신뢰하지는 말아야 한다.


12번에서 언급하는 Geoid와 WGS-84 타원체는 좌표에 대해 다루면서 좀 더 자세히 알아보겠다. GPS에서 등장하는 경도, 위도 좌표는 모두 WGS-84 타원체를 기준으로 하고 있다고만 알아두자.





GPRMC

문서에 의하면 GPRMC는 'Recommended Minimum Specific GNSS Data'로 정의되어있다. 

NMEA에는 GPS에서 필수적인 PVT(Position, Velocity, Time) 데이터의 고유한 버전이 있다. 

그것을 RMC라고 부른다. 'RMC'에서 RM이 Recommended Minimum의 약자이고, C는 GNSS를 의미한다. RMA, RMB도 있으며 각각 LORAN-C와 Navigation을 의미한다. 상식으로 알아두자.


아래와 같은 형태이다.


NMEA-0183 GPRMC 문장의 예



 idx

 Field

 Value

 Comments

 1

 Sentence ID

 $GPRMC

 Recommended Minimum Specific GNSS Data

 2

 UTC Time

 141113.999

 UTC시각. hhmmss.sss 형태. 예제는 14시 11분 13.999초 이다.

 3

 Status

 A

 A = Active, V = Void

 GPGGA의 7번항목, Position Fix와 유사하다. 차이점은 GPRMC가 더 간단하게 2-상태 라는 점. 

 V이면 신뢰할 수 없는 상태이다.

 4

 Latitude

 3730.0308

 위도. ddmm.mmmm

 37도 30.0308'

 5

 N/S Indicator

 N

 N = North, S = South

 북위 인지 남위 인지를 나타낸다.

 6

 Longitude

 12655.2369

 경도. dddmm.mmmm

 126도 55.2369'

 7

 E/W Indicator

 E

 E = East, W = West, 

 동경인지 서경인지를 나타낸다.

 8

 Speed over ground

 19.77

 Knots 단위의 속도이다. 

 km/h 로 변환하려면 1.852 를 곱하면 된다.

 eg. 19.77 (Knots) x 1.852 = 36.61404 (km/h)

 9

 Course over ground

 195.23

 Degrees. 진행방향을 표현한다.

 진북을 중심으로 시계방향으로 0 보다 같거나 크고, 360 보다 작은 범위의 각도값이 주어진다.

 여기서 말하는 '진북'은 WGS-84 타원체를 중심으로 한 것이다.

 10

 UTC Date

 101200

 UTC날짜. DDMMYY

 eg. 101200은 2000년 12월 10일을 의미한다.

 11

 Magnetic variation

 (empty)

 Degrees. '자북' 과 9번에서 말한 '진북' 과의 차이를 각도로 표시한 것이다.

 통상적인 GPS에서는 대개 NULL로 채워져 있다.

 12

 Checksum

 *3C

 

 13

 Terminator

 CR/LF

 



GPGSA

문서에 의하면 GSA는 "GNSS DOP and Active Satellite"를 의미한다고 되어있다. GSA는 단독으로 쓰이기 보다는 GSV와 조합해서 위성상태를 확인하거나 Graphical하게 천공도를 그리는데 사용될 수 있다.


NMEA-0183 GPGSA 문장의 예




4번부터 15까지는 수신기에 잡힌 GPS위성의 번호가 나와 있다. 일반적으로 12채널 GPS수신기라고 말하면 위성신호를 12개 까지 수신할 수 있다는 의미이다. GPS위성 전용 수신기는 12채널이면 충분하며, 사실 그 이상은 의미가 없다. 왜냐하면, GPS위성은 총 24개가 배열되어 있고, 지표면상에서는 12개 이상의 위성은 보이지 않도록 각 위성의 궤도를 설정하기 때문이다. 물론, 높은 하늘에서라면 이야기가 달라진다. 지표면에서 사용하는게 아닌, 항공기나 전투기 등에서 사용하는 GPS수신기는 12채널 이상이어도 의미가 있다는 얘기. 


그런데 예외가 있다. GPS 뿐만 아니라, GLONASS, Baidu, Galieo 위성 등 위치 측위에 사용할 수 있는 위성들이 여럿 존재한다. 이들 모두을 동시에 수신할 수 있는 수신기의 경우에는 또 이야기가 달라진다. 비글보드, 라즈베리파이 등에 붙여서 자주 사용되는 제품중에 'Adafruit Ultimate GPS breakout' 이란 것이 있는데, 66채널 수신이 가능한 제품이다. 

Link : https://www.adafruit.com/product/746


또한 참고로, NMEA sentence상에서 수신되지 않은 위성의 자리는 NULL처리되어 있다.


16번부터 18까지는 위성의 측위 오차에 관한 항목이다. 

수신기에서 4개이상의 위성이 감지되더라도 수신기는 PDOP이 최소인 위성 4개의 배열을 잡아 위치를 계산해 낸다. 

 PDOP은 수신기 위치를 꼭지점으로 각각의 위성이 이르는 사각뿔의 체적에 반비례한다. 체적이 큰 경우가 측위 오차가 적게 되는데 이는 위성이 널리 퍼져 오차가 상쇄되기 때문으로 이해하면 될 것이다. 수직방향은 그러한 상쇄되는 면이 없기 때문에 (위성은 전부 하늘에 있다.) 수평오차보다 크게 된다.

 VDOP은 수직오차를 HDOP은 수평오차를 말한다. PDOP = Sqrt(HDOP*HDOP + VDOP*VDOP)의 관계가 성립한다. 최적값은 1.0으로 대개 6이하면 쓸만하다고 보면 된다.

사실 전문가가 아니면 크게 필요없는 내용이다. 더 자세한 내용을 알고자 하면 인터넷에서 검색해보기 바란다. 상당히 많은 내용이 나와 있을 것이다.



GPGSV

GSV는 'GNSS Satellite in View' 를 의미한다. 각각 위성의 상태에 대해 나와있는 문장이다.

아래와 같은 모양이다.



NMEA-0183 GPGSV 문장의 예


그런데, GSV를 해석할 때 유의할 점 한가지가 있다.

GSV는 한 문장에 4개의 위성에 대한 정보만을 가진다. 따라서 만약 총 12개의 위성을 수신 중인 상황 에는 GPGSV문장이 3개 연속으로 등장하게 된다. 만약 7개의 위성을 수신 중인 상황에서는 GPGSV문장이 2개 연속으로 등장하게 될 것이다.




NMEA checksum 계산방법 및 예제코드

지금까지 예제로 보여준 NMEA sentence들을 살펴보면 알겠지만, checksum은 * 뒤에 16진수 두자리로 표시한다.

checksum의 계산은 $, * 의 사이에 있는 각 문자를 exclusive-or (XOR) 연산한 값을 표시한다.

어떤 NMEA sentence가 주어지면, "*" 뒤에 있는 16진수 두자리의 checksum과 직접 XOR연산한 값이 일치하는지를 검사해야 한다. 일치하지 않는다면, 그 sentence는 통신상의 문제 등의 이유로, 결함이 있는 것으로 간주해야 하며, 사용하면 안된다. 


예를 들어보자.


$GPRMC,155123.000,A,4043.8432,N,07359.7653,W,0.15,83.25,200407,,*28


이와 같은 NMEA sentence가 주어졌을때, checksum계산을 위한 XOR연산은 아래 각 문자들에 대해서 수행하면 된다.


GPRMC,155123.000,A,4043.8432,N,07359.7653,W,0.15,83.25,200407,,



Checksum 계산 하는 코드는 다음 포스팅을 참고하기 바란다.


2017/08/26 - [하드웨어 Note/GPS 이야기] - [NMEA-0183] Checksum 계산 예제코드 (How to calculate checksum of NMEA-0183)





NMEA Sentence ID (Sentence Name) 목록

아래는 NMEA Sentence의 모든  ID와 그것이 어떤 것을 의미하는지를 나열 한 것이다.

또한, 첨부파일을 참고해도 좋다.


nmea_0183_identifier_list(20130801).pdf

여기까지 읽었으면, GPRMC, GPGGA, GPGSA, GPGSV 이렇게 4개 설명하는데도 상당한 양이라는 것을 알 것이다. 따라서 모든 내용을 다루기엔 무리가 있다.

각 항목 하나하나의 자세한 설명은 본 포스팅에서는 더이상 하지 않기로 한다.

우선 각 코드들의 의미 정도만 파악해 보고, 자세한 내용은 추후에 기회가 된다면 다뤄보겠다.

  • $GPAAM - Waypoint Arrival Alarm
  • $GPALM - GPS Almanac Data
  • $GPAPA - Autopilot format "A"
  • $GPAPB - Autopilot format "B"
  • $GPASD - Autopilot System Data
  • $GPBEC - Bearing & Distance to Waypoint, Dead Reckoning
  • $GPBOD - Bearing, Origin to Destination
  • $GPBWC - Bearing & Distance to Waypoint, Great Circle
  • $GPBWR - Bearing & Distance to Waypoint, Rhumb Line
  • $GPBWW - Bearing, Waypoint to Waypoint
  • $GPDBT - Depth Below Transducer
  • $GPDCN - Decca Position
  • $GPDPT - Depth
  • $GPFSI - Frequency Set Information
  • $GPGGA - Global Positioning System Fix Data
  • $GPGLC - Geographic Position, Loran-C
  • $GPGLL - Geographic Position, Latitude/Longitude
  • $GPGRS - GPS Range Residuals
  • $GPGSA - GPS DOP and Active Satellites
  • $GPGST - GPS Pseudorange Noise Statistics
  • $GPGSV - GPS Satellites in View
  • $GPGXA - TRANSIT Position
  • $GPHDG - Heading, Deviation & Variation
  • $GPHDT - Heading, True
  • $GPHSC - Heading Steering Command
  • $GPLCD - Loran-C Signal Data
  • $GPMSK - Control for a Beacon Receiver
  • $GPMSS - Beacon Receiver Status
  • $GPMTA - Air Temperature (to be phased out)
  • $GPMTW - Water Temperature
  • $GPMWD - Wind Direction
  • $GPMWV - Wind Speed and Angle
  • $GPOLN - Omega Lane Numbers
  • $GPOSD - Own Ship Data
  • $GPR00 - Waypoint active route (not standard)
  • $GPRMA - Recommended Minimum Specific Loran-C Data
  • $GPRMB - Recommended Minimum Navigation Information
  • $GPRMC - Recommended Minimum Specific GPS/TRANSIT Data
  • $GPROT - Rate of Turn
  • $GPRPM - Revolutions
  • $GPRSA - Rudder Sensor Angle
  • $GPRSD - RADAR System Data
  • $GPRTE - Routes
  • $GPSFI - Scanning Frequency Information
  • $GPSTN - Multiple Data ID
  • $GPTRF - TRANSIT Fix Data
  • $GPTTM - Tracked Target Message
  • $GPVBW - Dual Ground/Water Speed
  • $GPVDR - Set and Drift
  • $GPVHW - Water Speed and Heading
  • $GPVLW - Distance Traveled through the Water
  • $GPVPW - Speed, Measured Parallel to Wind
  • $GPVTG - Track Made Good and Ground Speed
  • $GPWCV - Waypoint Closure Velocity
  • $GPWNC - Distance, Waypoint to Waypoint
  • $GPWPL - Waypoint Location
  • $GPXDR - Transducer Measurements
  • $GPXTE - Cross-Track Error, Measured
  • $GPXTR - Cross-Track Error, Dead Reckoning
  • $GPZDA - UTC Date / Time and Local Time Zone Offset
  • $GPZFO - UTC & Time from Origin Waypoint
  • $GPZTG - UTC & Time to Destination Waypoint



참고 [GNSS, NMEA-0183(National Marine Electronics Association) Format 쉽게 설명] : http://joongyup.egloos.com/9173927

참고 [Glenn Baddeley - GPS - NMEA sentence information] : http://home.mira.net/~gnb/gps/nmea.html

참고 : [NMEA data] http://www.gpsinformation.org/dale/nmea.htm






이 글이 도움이 되었다면 아래 '공감' 버튼 콕!