일반적인 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의 역할 및 동작
하지만 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 문제)
시간이 정확하지 않지만, 다음은 분명 070845.389로 받을 것이므로, 다음 PPS 신호에 맞추어서 이 시간으로 설정하면 정확한 시간으로 설정 될 것 같다.
- NTP의 시간보정방법
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
- Passive Antenna: Antenna에 내부에 LNA가 없음
- Active Antenna: Antenna에 내부에 LNA가 있음
https://techship.com/faq/difference-active-and-passive-antenna/
1.3 GPS/GNSS Serial 정보
- GPS/GNSS Serial Protocol
- NMEA기반으로 Serial 정보
- Ublox Protocol
2. NMEA의 기본구조
GPS의 Serial 부분에서 기본 시간정보와 좌표정보를 얻을 수 있으며, 별도의 PPS Pin 연결부분을 이용하여 정확히 1Hz마다 정보를 Update를 한다
Baudrate는 default 9600bps이며, 변경도 가능하다고 하다고 하지만, 변경의 의미는 크게 없을 것 같다.
기본구조 거의 동일하며, Preamble "$" 시작하여 Checksum(*2bytes) + <CR><LF>으로 종료되어진다.
- Preamble 이후
- GP,GN,GL : GPS + GLONASS
- GP,GL : GPS only
- 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 기능
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로 시간과 날짜 와 좌표분석
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