4/25/2020

GPS/GNSS Device 관련내용

1. GPS/GNSS 의 구조 

일반적인 GPS는 Serial 통신으로 설정이 되어있으며, Chip에따라 속도변경도 가능하다.
또한 Serial Protocol인 NMEA를 이용하여 GPS의 정보를 Parsing해서 관련정보를 얻는다.

GPS의 Chipset 
  https://wiki.openstreetmap.org/wiki/GPS_Chipset

GPS와 GNSS 차이
  https://www.semiconductorstore.com/blog/2015/What-is-the-Difference-Between-GNSS-and-GPS/1550/


1.1 GPS의 PPS역할 

GPS의 Serial은 1Hz를 맞추어 Serial로 개별 Commad를 Update하지만, Serial에 대한 Latency가 존재하므로
실제로 정밀하게 시간을 맞추지 못한다.


  • PPS의 역할 및 동작 
GPS는 PPS라는 외부 Pin이 존재하며, PPS Pin의 1Hz에 맞추어 Serial의 NMEA정보는 보낸다.
하지만 PPS Pin 기준으로 1Hz마다 Serial의 Data를 전송하더라도 Latency는 존재하며, 이를  맞추기 위해서 PPS Pin에 맞추어 시간보정가능하다.

1 Pulse 다양하게 설정 될 수 있다고 함 
  https://en.wikipedia.org/wiki/Pulse-per-second_signal

1 Pulse 100ms 언급
  http://zone.ni.com/reference/en-XX/help/373629D-01/nisynclv/ppstimeprotocol/
  https://www.frontiersin.org/articles/10.3389/fbuil.2018.00082/full

GPS의 Serial 과 PPS를 이용한 NTP Server
  https://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html
  https://vanheusden.com/time/rpi_gpio_ntp/

GPS의 PPS 부분 Time Sync
  https://onlinelibrary.wiley.com/doi/pdf/10.4218/etrij.08.0106.0306


  • PPS 이용한 시간보정방법 (Latency 문제)
예를들면, 070844.389 , 7시 08분 44.389 초를 Serial를 통해 받으면 Serial Latency가 존재하므로 이 시간으로 바로 설정하면
시간이 정확하지 않지만, 다음은 분명 070845.389로 받을 것이므로, 다음 PPS 신호에 맞추어서 이 시간으로 설정하면 정확한 시간으로 설정 될 것 같다.


  • NTP의 시간보정방법
NTP Server의 시간이 정확하다는 가정하에 NTP Client는 NTP Server와 통신을 한 후 각 Time offset를 이용하여 구하는데, 의외로 재미있지만,
Network의 상황이 불안정해서 정확한 Time offset은 구하기 힘들다면 어떻게 되는지가 궁금하다.
  https://en.wikipedia.org/wiki/Network_Time_Protocol


1.2 GPS의 Antenna 

GPS에 따라 LNA의 존재 여부에 따라 각 Antenna 연결부분이 달라지며, 각 HW 부분을 확인하자.

LNA (AMP)
  https://en.wikipedia.org/wiki/Low-noise_amplifier

  • GPS의 Antenna Type
  1. Passive Antenna: Antenna에 내부에 LNA가 없음
  2. Active Antenna:  Antenna에 내부에 LNA가 있음   
Passive 와 Active Antenna 차이 
  https://techship.com/faq/difference-active-and-passive-antenna/


1.3  GPS/GNSS Serial 정보 

  • GPS/GNSS Serial Protocol 
  1. NMEA기반으로 Serial 정보
  2. Ublox Protocol
상위와 같이 두 가지로 제공을 해주는 것으로 보이며, 주로 NMEA를 기반으로 많이 사용하는 것 같다.


2. NMEA의 기본구조 

GPS의 Serial 부분에서 기본 시간정보좌표정보를 얻을 수 있으며, 별도의 PPS Pin 연결부분을 이용하여 정확히 1Hz마다 정보를 Update를 한다
Baudrate는 default 9600bps이며, 변경도 가능하다고 하다고 하지만, 변경의 의미는 크게 없을 것 같다.

기본구조 거의 동일하며, Preamble "$" 시작하여  Checksum(*2bytes) + <CR><LF>으로 종료되어진다.

  • Preamble 이후 
다음과 같이 시작이 되어지므로, 실제 분석을 하려고 하며, 이 뒤의 개별 Command를 가지고 봐야한다.
  1. GP,GN,GL : GPS + GLONASS
  2. GP,GL : GPS only
  3. GP,GN,GL : GLONASS only 

NMEA 관련내용 (ASCII Code구성)
이 부분 Manual을 자세히 읽어보면 대충 어떻게 동작하는지 쉽게 이해한다.
  https://www.gpsinformation.org/dale/nmea.htm

NMEA 의 Checksum 의 구조 
  https://nmeachecksum.eqth.net/

NMEA Command 
  https://www.rhydolabz.com/documents/25/NMEA-CommandManual_%28FTX-HW-13002%29.pdf


2.1 NMEA의 PMTK 


PMTK 설정
  https://www.sparkfun.com/datasheets/GPS/Modules/PMTK_Protocol.pdf
  https://www.rhydolabz.com/wiki/?p=16770

Satelite Search 할 경우 각 Chip마다 다를 수 있으며, 관련부분은 PMTK Command를 보면될 것 같으며, 이외에도
다양한 Command로 GPS Chip을 Control 가능한 것 같다.

세부부분은 각각의 GPS Chip의 Datasheet를 확인하자

  • 위성 Search 기능 
GLONASS satellites only
GPS satellites only
GLONASS and GPS satellites
BDS satellites only
..

$PMTK313,1*2E<CR><LF>  //Enable to search a SBAS satellite or not

2.2 NMEA 의 기본분석 

아래의 Command들 중심으로 각 검색을 하면, 각 1Hz 단위로 Update가 진행되며, 시간정보는 GPS내부에 RTC가 별도로 존재하기 때문에,
연결이 되지 않아도 시간정보를 정확하게 줄 수 있는 것으로 보인다.

  • NMEA 의 RMC로 시간과 날짜 와 좌표분석
GPS의 NMEA의 시간정보와 위치정보를 동시에 얻을 수 있으며, 안테나 문제로 연결이 안될 경우 시간정보라도 확인가능

RMC 의 시간정보 와 날짜정보 와 위치정보  
NMEA sentence format: $xxRMC,time,status,lat,NS,long,EW,spd,cog,date,mv,mvEW,posMode*cs <CR><LF>
Valid fix: $GPRMC,083559.34,A,4717.11437,N,00833.91522,E,0.004,77.52,091202,,,A*00
No fix: $GPRMC,,V,,,,,,,,,,N*00

각 Argument는 ","로 구분되며, 1Hz 주기로 Update 됨 

1st Argument (Time 분석): 083559.34
-  08시 35분 59.34초  UTC  (Local Time: Seoul +9)

2nd Argument (동작여부): A or V
-  Status A=active or V=Void.

3st/4st Argument (Latitude): 4717.11437,N
-  위도 Latitude 47 deg 17.11437' N

5st/6st Argument (Longitude): 00833.91522,E
-  경도 Longitude 008 deg 33.91522' E

9st Argument (Date 분석): 091202
-  9월 12일 2002년 


  • RMC 정보 간단히 확인
$ cat /dev/ttyxx | grep RMC   //GPS Serial 3Hz 단위 문제있음
//No fix 의 예로 상위 V로 쉽게 파악 가능하며, 1Hz 단위로 동작해야한다 
$GPRMC,070050.799,V,,,,,0.00,0.00,060180,,,N*47 // 07 시 00분 50.799초 UTC  
$GPRMC,070053.799,V,,,,,0.00,0.00,060180,,,N*44
$GPRMC,070056.799,V,,,,,0.00,0.00,060180,,,N*41
$GPRMC,070059.799,V,,,,,0.00,0.00,060180,,,N*4E
$GPRMC,070102.799,V,,,,,0.00,0.00,060180,,,N*41

$ cat /dev/ttyxx | grep RMC   //GPS Serial 1Hz 단위 문제없음
$GPRMC,064147.087,V,,,,,0.00,0.00,260620,,,N,V*38 // 06 시 41분 47.087초 UTC 이와 PPS와 연동하여 정확한 시간보정 
$GPRMC,064148.087,V,,,,,0.00,0.00,260620,,,N,V*37
$GPRMC,064149.087,V,,,,,0.00,0.00,260620,,,N,V*36
$GPRMC,064150.087,V,,,,,0.00,0.00,260620,,,N,V*3E
$GPRMC,064151.087,V,,,,,0.00,0.00,260620,,,N,V*3F
$GPRMC,064152.087,V,,,,,0.00,0.00,260620,,,N,V*3C
$GPRMC,064153.087,V,,,,,0.00,0.00,260620,,,N,V*3D
$GPRMC,064154.087,V,,,,,0.00,0.00,260620,,,N,V*3A

//상위는 baud rate를 별도로 설정을 안했으며, minicom에서 재 테스트 진행 
$ minicom -s   // 다 설정진행   Ctrl+A , Z 종료 
$ minicom -D /dev/ttyxxx    // Baudrate 만 설정 


RMC 분석
  https://www.gpsinformation.org/dale/nmea.htm#RMC

  • NMEA 의 GGA로 시간과 좌표분석 
위성을 제대로 못 찾는다면, 시간이라도 확인

GGA 의 좌표정보
NMEA sentence format: $xxGGA,time,lat,NS,long,EW,quality,numSV,HDOP,alt,M,sep,M,diffAge,diffStation*cs<CR><LF>
Valid fix: $GPGGA,092725.00,4717.11399,N,00833.91590,E,1,08,1.01,499.6,M,48.0,M,,*5B

각 Argument는 ","로 구분되며, 1Hz 주기로 Update 됨 

1st Argument (Time 분석): 092725.00
-  09시 27분 25.00초  UTC  (Local Time: Seoul +9)

2nd/3st Argument (Latitude): 4717.11399,N
-  위도 Latitude 47 deg 17.11399' N

4st/5st Argument (Longitude): 00833.91590,E
-  경도 Longitude 008 deg 33.91590' E

9st/10st Argument (Altitude): 499.6,M
-  높이/고도 Altitude  499.6 Meter above mean sea level

11st/12st Argument (일반적으로 이 정보까지는 필요없을 것 같음): 48.0,M
-  해상높이  48.0 Height of geoid (mean sea level) above WGS84



  • CGA 정보 간단히 확인
$ cat /dev/ttyxx | grep GGA   //GPS Serial 
//만약 동작하지 않는다면,아래와 같이 동작 다만 1Hz단위인지 확인 
$GPGGA,061713.087,,,,,0,0,,,M,,M,,*45 // 06 시 17분 13.087초 
$GPGGA,061714.087,,,,,0,0,,,M,,M,,*42
$GPGGA,061715.087,,,,,0,0,,,M,,M,,*43
$GPGGA,061716.087,,,,,0,0,,,M,,M,,*40
$GPGGA,061717.087,,,,,0,0,,,M,,M,,*41

GGA 분석
  https://www.gpsinformation.org/dale/nmea.htm#GGA


3. Ublox Protocol (참조)

NMEA이외에도 Ublox의 Protocol도 존재하는 것으로 보임

  https://www.sparkfun.com/datasheets/GPS/Modules/u-blox5_Protocol_Specifications(GPS.G5-X-07036).pdf
  https://gpsd.gitlab.io/gpsd/ubxtool.html


4. GPS 관련소스 및 Parsing 부분

Ublox 와 NMEA기반의 Parser가 다르며, 각 정보의 구조가 다르다.

GPS Parsing 관련소스  
  https://github.com/JeonghunLee/lora_gateway/blob/master/libloragw/src/loragw_gps.c
  https://github.com/JeonghunLee/lora_gateway/blob/master/libloragw/inc/loragw_gps.h
  https://github.com/JeonghunLee/lora_gateway/blob/master/libloragw/tst/test_loragw_gps.c