[NMEA-0183] Checksum 계산 예제코드 (How to calculate checksum of NMEA-0183)

by Blogger 하얀쿠아
2017. 8. 26. 15:52 하드웨어 Note/GPS 이야기

본 포스팅에서 다뤄볼 내용은 NMEA-0183 문장의 checksum 계산 방법이다.

보통 GPS chip은 해석한 GPS신호를 NMEA라는 특정 형태의 프로토콜로 제공한다.

NMEA 가 무엇인지에 대해서 더 자세히 알고싶다면 아래 포스팅을 참고하도록 하자.


2017/08/10 - [하드웨어 Note/GPS 이야기] - [GPS 이야기] NMEA-0183 형식, NMEA Sentence Format


위 포스팅에 나와있듯이, NMEA sentence는 $ 문자로 시작해서 * 문자로 끝난다.

checksum의 계산은 $, * 의 사이에 있는 각각의 문자 하나하나를 exclusive-or (XOR) 연산 및 누적하면 된다.

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




구체적인 계산 예제 코드를 제시한다.




NMEA 체크섬 계산 함수(JAVA 버전)

char checkSum(String nmeaStr) {
  char check = 0;
  // iterate over the string, XOR each byte with the total sum:
  for (int c = 0; c < theseChars.length(); c++) {
    check = char(check ^ theseChars.charAt(c));
  } 
  // return the result
  return check;
}


인자 'nmeaStr' 은 $와 * 사이의 NMEA문자열을 넣으면 된다. 각 문자 하나하나를 XOR연산하여 'check' 변수에 저장하여 반환한다.

return type은 char 이다. 이것을 2bytes hex string으로 변환해서 사용하면 된다.




NMEA 체크섬 계산 함수 (C 버전 1)

#include <stdint.h>

#define NMEA_END_CHAR_1 '\n'
#define NMEA_MAX_LENGTH 70

uint8_t
nmea_get_checksum(const char *nmea_str)
{
    const char *n = NULL;
    uint8_t chk = 0;
    if (strcmp(nmea_str[0], '$') == 0) {
        n = nmea_str + 1; // skip '$' by plus one
    } else {
        n = nmea_str;
    }

    /* While current char isn't '*' or sentence ending (newline) */
    while ('*' != *n && NMEA_END_CHAR_1 != *n) {
        if ('\0' == *n || n - sentence > NMEA_MAX_LENGTH) {
            /* Sentence too long or short */
            return 0;
        }
        chk ^= (uint8_t) *n;
        n++;
    }

    return chk;
}


인자 nmea_str은 $와 * 사이의 NMEA sentence를 넣으면 된다. 그러나 만약 인자로 들어오는 NMEA sentence가 $ 를 포함하고 있다면 생략하도록 방어코드를 넣어 두었다.

이제, checksum 값은 아래와 같이 계산하면 된다.

GPRMCBuf 가 NMEA sentence이다.


uint8_t chk = nmea_get_checksum(GPRMCBuf);



NMEA 체크섬 계산 함수 (C 버전 2)

또다른 방법으로 NMEA의 checksum 계산을 구현한 C언어 버전이다. 

첫번째 인자 'buf'가 계산하려는 NMEA sentence이다. 위의 버전1과는 달리 $ 부터 * 까지의 NMEA sentence를 인자로 넣어도 된다. 

두번째 인자 'len'는 buf의 길이이다.

int calc_NMEA_Checksum( char *buf, int len )
{
    char Character;
    int Checksum = 0;
    int i;              // loop counter

    // foreach(char Character in sentence)
    for (i=0; i < len; ++i)
    {
        Character = buf[i];
        switch(Character)
        {
            case '$':
                // Ignore the dollar sign
                break;
            case '*':
                // Stop processing before the asterisk
                i = len;
                continue;
            default:
                // Is this the first value for the checksum?
                if (Checksum == 0)
                {
                    // Yes. Set the checksum to the value
                    Checksum = Character;
                }
                else
                {
                    // No. XOR the checksum with this character's value
                    Checksum = Checksum ^ Character;
                }
                break;
        }
    }

    // Return the checksum
    return Checksum;
}



이 함수를 통해 checksum을 계산하면 int 형 결과가 반환된다.

이제, 비교하려는 NMEA sentence에서 2bytes의 char형 checksum 문자를 읽고, 1byte의 hex형으로 변환 한 후, 위 함수의 반환값과 비교하면 된다.

이 댓글을 비밀 댓글로

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

by Blogger 하얀쿠아
2017. 8. 10. 00:15 하드웨어 Note/GPS 이야기

만약 당신이 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






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

이 댓글을 비밀 댓글로
    • DDD
    • 2019.05.30 15:34
    퍼가요~
    • uni823
    • 2021.01.20 00:33
    좋은자료 링크해갑니다.
    • user
    • 2021.01.20 09:41
    쉽게 설명해주시고 좋은내용 써주셔서 감사합니다 해당내용 공유해갑니다~

[GPS 이야기] TTFF와 Almanac, Ephemeris 그리고, GPS의 start 방식, Cold start/Hot start/Warm Start ?

by Blogger 하얀쿠아
2017. 4. 13. 22:45 하드웨어 Note/GPS 이야기



여기서는 GPS에 대해 이야기를 해볼까 합니다.

GPS는 Global Positioning System의 약자인 것은 널리 알려진 내용인데요.


오늘은 GPS의 이야기를 시작하기에 앞서, 몇가지 용어를 알아볼까 해요.



TTFF

TTFF(Time To First Fix)란 GPS 수신기의 전원을 켰을 때 GPS 수신기가 현재 위치를 파악하는 데까지 소요되는 시간을 뜻하며, 상황에 따라 Factory Start, Cold Start, Warm Start, Hot Start로 구분됩니다.

TTFF를 이해하기 위해서는 먼저 Almanac 데이터와 Ephemeris 데이터에 대하여 이해할 필요가 있습니다.

지상의 여러 부 관제국에서 GPS 위성신호를 항시 관측하여 그 데이터를 주 관제국으로 보내고, 주 관제국에서는 그 데이터를 토대로 Almanac 데이터와 Ephemeris 데이터를 작성하여 일정주기로 각 GPS 위성으로 보내며, 이는 다시 GPS 위성신호 중 항법 메시지에 포함되어 지상의 각 GPS 수신기로 송신됩니다.

 

Almanac 데이터

Almanac 데이터는 GPS 위성배치의 개략적인 궤도 파리미터 정보이며, 몇달에 한번씩 갱신됩니다.

GPS 수신기는 Almanac 데이터를 통해 특정 시각의 특정 지점에서 어떤 위성들의 신호를 수신할 수 있는지 미리 파악할 수 있기 때문에 보다 신속하게 자기 위치를 계산할 수 있습니다.

각 위성별로 모든 위성의 Almanac 데이터를 2분 30초 동안에 전송완료 하며, 지속적으로 이를 재전송합니다.

GPS 수신기가 Almanac 데이터를 가지고 있지 않으면 데이터 전체를 수신하며, Almanac 데이터를 가지고 있되 일부가 최신 데이터가 아니면 해당 부분만 수신합니다.

 

Ephemeris 데이터

Ephemeris 데이터는 GPS 위성의 아주 정교한 궤도 및 시각보정 정보이며, 매 5시간마다 새로이 갱신됩니다.

GPS 수신기는 Ephemeris 데이터를 통해 정밀하게 자기 위치를 파악할 수 있습니다.

각 위성별로 해당 위성의 Ephemeris 데이터를 30초 동안에 전송완료 하며, 지속적으로 이를 재전송합니다.

GPS 수신기가 특정 위성의 가장 최신의 Ephemeris 데이터를 가지고 있지 않으면 해당 위성의 가장 최신의 데이터 전체를 수신하는데, GPS 수신기의 전원을 켰을 때 Ephemeris 데이터의 중간부터 수신하기 시작하였다면 다음번 전송 주기에 처음부터 끝까지 전체를 수신하며, 수신과정에서 일시적으로 수신이 끊어진 경우에도 다음번 전송 주기에 다시 전체를 수신합니다.

 

 

GPS 수신기는 최신의 Almanac 데이터를 통해 어떤 위성들의 신호를 수신할 수 있는지 미리 파악하고, 최신의 Ephemeris 데이터를 수신한 위성들 중 한 위성으로부터 신호를 받아 위성들과의 시각동기를 이루고, 다른 2개 이상의 위성들로부터 신호를 받아 각 위성들까지의 거리를 측정하여 자기 위치를 파악하는 것입니다. 이 때, 2개 위성에 대하여 거리를 측정하면 지구타원체(WGS84)상의 경위도 좌표값만 구할 수 있고, 3개 이상의 위성에 대하여 거리를 측정하면 지구타원체(WGS84)상의 경위도 좌표값 및 타원체고를 구할 수 있으며, 이 타원체고는 표준 지오이드 모델을 바탕으로 해발고로 환산되어 표현됩니다.

TTFF는 Almanac 데이터와 Ephemeris 데이터의 수신 여부에 따라 Factory Start, Cold Start, Warm Start, Hot Start로 구분할 수 있습니다.


 

Factory Start

Factory Start는 전원을 켠 후, 위성신호로부터 Almanac 데이터 전체와 신호가 수신되는 위성 중 최소 3개 이상의 위성으로부터 각각의 Ephemeris 데이터 전체를 수신하여 위치를 파악하는 데 소요되는 시간으로 대략 15분 정도입니다.

GPS 수신기가 공장에서 출고될 때에는 특정 시점의 Almanac 데이터 전체와 각 위성의 Ephemeris 데이터 전체가 입력되어 있습니다.

GPS 수신기를 그 시점보다 수개월이 지난 시점에 처음 사용하거나 사용했던 GPS 수신기를 끈 후, 수개월간 사용하지 않다가 다시 사용하는 경우가 이에 해당됩니다.


 

Cold Start

Cold Start는 전원을 켠 후, 위성신호로부터 Almanac 데이터 일부와 신호가 수신되는 위성 중 최소 3개 이상의 위성으로부터 각각의 Ephemeris 데이터 전체를 수신하여 위치를 파악하는 데 소요되는 시간으로 대략 30초에서 1분 30초 정도입니다.

사용했던 GPS 수신기의 전원을 끈 후, 수십일 동안 사용하지 않다가 다시 사용하는 경우가 이에 해당됩니다.


 

Warm Start

Warm Start는 전원을 켠 후, 신호가 수신되는 위성 중 1~2개의 위성으로부터 각각의 Ephemeris 데이터 전체를 수신하여 위치를 파악하는 데 소요되는 시간으로 대략 10초에서 40초 정도입니다.

사용했던 GPS 수신기의 전원을 끈 후, 수시간 이내 다시 사용하는 경우가 이에 해당됩니다.

* 참고 : Cold Start는 신호가 수신되는 위성들 중 대다수가 Ephemeris 데이터의 갱신이 있었던 경우이고, Warm Start는 신호가 수신되는 위성들 중 일부만 Ephemeris 데이터의 갱신이 있었던 경우입니다.



Hot Start

Hot Start는 새로운 데이터의 수신없이 위치를 파악하는 데 소요되는 시간으로 대략 3초에서 20초 정도입니다.

사용했던 GPS 수신기의 전원을 끈 후, 수분 이내 다시 사용하는 경우와 GPS 수신기 사용 중 장애물(건물, 터널 등)에 의해 일시적으로 위성신호를 수신하지 못하여 위치파악을 하지 못하다가 다시 위성신호를 수신하게 된 경우가 이에 해당됩니다.

 

 


GPS 단말기의 위성화면에는 대부분 2개의 동심원이 그려져 있는데 이 중 바깥쪽 원은 현위치 기준의 평면(수평선)을 표시하는 것이고, 안쪽 원은 현위치 기준의 고도각 45도 영역을 표시하는 것입니다.

GPS 수신기는 Almanac 데이터를 바탕으로 위성화면 동심원에 각 위성들의 위치를 표시합니다.

그리고 위성화면 하단에서 막대 그래프의 길이는 각 위성들의 신호강도를 표시하는 것이고, 막대 그래프의 색깔은 Ephemeris 데이터의 활용가능여부를 나타냅니다.

현재 저장되어 있는 특정 위성의 Ephemeris 데이터가 최신 것으로 확인되면 막대 그래프의 색이 채워지고, 그렇지 않은 경우에는 막대 그래프의 테두리 선만 표현되지만 새로운 Ephemeris 데이터의 수신이 완료되면 색이 채워지게 됩니다.

 

 


내용정리

그런데, TTFF는 위에서 설명한 Almanac 데이터와 Ephemeris 데이터의 수신 여부만으로 결정되는 것은 아닙니다.

GPS 수신기의 전원을 끈 채로 1,000km 이상 떨어진 곳으로 이동하여 다시 GPS 수신기의 전원을 켜면 TTFF가 굉장히 길어지는 것을 경험하신 분도 계실 것입니다.

이는 GPS 수신기가 위성들의 원자시계와 정확한 시각동기를 이루기 위한 과정이 길어지기 때문에 발생하는 문제입니다.


GPS 수신기는 각 GPS 위성들로부터 전파(PRN 코드)를 수신하여 전파가 도달한 시간을 측정하고, 이를 통해 해당 위성까지의 거리를 측정합니다.

그런데 문제는 GPS 위성에서 GPS 수신기까지 전파가 도달하는 시간을 측정하려면 GPS 위성과 GPS 수신기의 시각이 아주 정밀하게 일치해야 된다는 것입니다.


실제로 GPS 위성은 원자시계를 탑재하고 있지요.

그런데 GPS 수신기에도 원자시계를 탑재할 경우... GPS 수신기의 무게와 부피는 아주 커지게 되고요, 그 가격 또한 수천만원을 넘게 될 것입니다.

실효성이 떨어지겠지요.

그렇기때문에 실제로 일반적인 제품에서 사용하는 방법은, GPS 신호를 통해 GPS 수신기의 시각동기를 이루는 것입니다.


그런데 여기서 또 문제가 발생합니다.

GPS 위성에서 현재의 정확한 시각정보를 전파에 실어 GPS 수신기로 보내면,

그 신호가 수신기에 도달할 때에는 이미 그 시각이 아니라는 것입니다.


그래서 다시 이 문제를 해결하기 위해 예상소요시간의 개념이 도입는데 이는 GPS 위성과 GPS 수신기의 거리를 고려하여 전파가 도달하는 예상소요시간을 산출하는 것입니다.

즉, GPS의 시각정보가 GPS 위성으로부터 GPS 수신기까지 도달하는 예상소요시간을 고려하여 GPS 수신기의 시각을 동기화 시키는 것입니다.


특정 시각의 GPS 위성 위치는 Ephemeris 데이터를 통해 산출할 수 있지만 문제는 GPS 수신기의 위치는 파악할 수 없다는 것입니다.

그래서 GPS 수신기의 위치는 최후로 위치파악이 되었던 곳을 기준으로 하여 예상소요시간을 산출하고, 시각을 보정하고, 이를 바탕으로 본격적으로 GPS 수신기의 위치파악에 들어갑니다.


만약 최후로 위치파악이 되었던 곳이 아닌 다른 곳에서 다시 GPS 수신기를 사용한다면 당연히 예상소요시간도 틀린 값이며, 시각도 정확하게 동기화 되지 않은 것이며, 좌표값도 산출도 불가능할 것입니다.

이 때, GPS 수신기의 프로세서는 예상소요시간을 가감하며 다시 위치계산을 되풀이 하게 되는데 산출된 결과를 살펴서 보다 신뢰할 수 있는 결과가 나올 수 있도록 예상소요시간을 변경해 갑니다.


여기서 산출된 결과를 살핀다는 것은 글로 설명하기 정말 어려운 부분인데,

예를들어 3개 위성과의 거리(의사거리 : Pseudorange)로 산출한 위치에 4번째 위성과의 거리값을 적용하여도 그 위치가 나오는지 확인하는 것으로,

4번째 위성과의 거리값이 더 길어야 되는지 혹은 더 짧아야 되는지 확인하여 예상소요시간의 가감을 결정하는 것입니다.

예상소요시간의 가감하여 3개 위성을 통해 산출한 위치에 4번째 위성과의 거리값을 적용하여도 정확히 일치하는 결과가 나왔다면 그 좌표값은 신뢰할 수 있는 좌표값이며,

그 때의 예상소요시간은 정확한 소요시간이 되기 때문에 GPS 수신기는 정확한 시각동기를 이룬 것입니다.


다시 본론으로 돌아가 GPS 수신기의 전원을 끈 채로 1,000km 이상 떨어진 곳으로 이동하여 다시 GPS 수신기의 전원을 켜는 경우를 생각해보죠.

GPS 수신기는 1,000km 떨어진 이전의 위치를 기준으로 예상소요시간을 부여하고 위치계산에 들어가게 되는데,

이 예상소요시간은 실제 소요시간과 큰 차이를 보이기 때문에 당연히 정확한 소요시간을 찾아내는 데 많은 시간이 필요하게 됩니다.


이 때, 사용자가 직접 수동으로 GPS 단말기에 자신의 개략적인 위치와 고도 및 시각을 입력해 준다면 GPS 수신기는 Almanac 데이터를 통해 해당 시각과 지점에서 위성위치를 파악할 수 있고,

그 위치를 기준으로 예상소요시간을 부여하기 때문에 좀 더 빨리 정확한 소요시간을 찾아내게 되어 시각동기를 이루게 될 것이고, 곧 위치파악을 할 수 있게 됩니다.

이러한 기능을 초기화(Initialize) 또는 재시작(Restart GPS)이라 합니다.

이 댓글을 비밀 댓글로
    • 2019.11.30 11:12
    비밀댓글입니다