### 0.0.1 주요 문장 구조: $GPGGA, $GPRMC, $GPVTG 페이로드 문자열 분리 및 형변환(Casting) 비용
PX4-Autopilot의 NMEA 스니퍼(Sniffer) 모듈이 GPS 센서와 성공적으로 직렬(Serial) 연결을 맺고 동기화(Sync)되면, 쏟아지는 수십 종의 NMEA 문장들 중에서 무인기 항법에 필수적인 3대 심층 문장만을 선별하여 파싱(Parsing)한다. 이 핵심 문장들은 3차원 위치를 담는 $GPGGA, 속도 및 필수 측위 정보를 담는 $GPRMC, 그리고 지면 대역 속도(Ground Speed)의 정밀도를 책임지는 $GPVTG이다.
이들 페이로드(Payload)를 조각내고 숫자로 형변환(Casting)하는 과정은 PX4의 RTOS 환경에서 무시 못 할 연산 비용(Cost)을 발생시킨다.
0.1 $GPGGA (Global Positioning System Fix Data) 문장 파싱
$GPGGA는 위성 항법 시스템에서 가장 널리 사용되는 기본 메시지로, 위도, 경도, 시간, 그리고 GPS의 신호 품질을 종합적으로 담고 있다.
- 문장 구조 예시:
$GPGGA,HHMMSS.SS,llll.llll,N,yyyyy.yyyy,E,Q,NN,D.D,H.H,M,G.G,M,A.A,RRRR*XX
(시간, 위도, 북/남, 경도, 동/서, 픽스 퀄리티, 위성 개수, HDOP, 해발 고도, 미터 표기, 지오이드 높이, _, DGPS 업데이트 시간, DGPS Station ID *체크섬) - 분리 및 변환 오버헤드:
좌표를 나타내는llll.llll문자열(도-분 Format:DDMM.MMMM)을 EKF2 추정기가 사용하는 도(Degree,int32_t10^7 스케일) 스케일로 변환하는 작업이 연산량의 절반 이상을 차지한다.
- 쉼표(
,)를 기준으로 위치 포인터를 전진시키며 문자 배열을 분할(Tokenizing)한다. - 앞에서부터 두 글자(
DD)를 정수로 끊어 ’도(Degree)’로 삼는다. - 뒤의 문자열(
MM.MMMM)을 정수로 변환한 뒤 60으로 나누어 ’도(Degree)’로 환산(Casting)한다.
PX4의nmea.cpp는 이 과정에서 무거운atof()함수 대신 문자 단위로 숫자 10을 곱해가는 룩업(Lookup) 기반의 고속 매크로 연산을 동원하여 컨텍스트 스위칭 타임을 극단적으로 억제한다.
0.2 $GPRMC (Recommended Minimum Specific GNSS Data) 문장 파싱
$GPRMC 문장은 NMEA를 지원하는 어떠한 GPS 수신기라도 필수적으로 내뱉어야 하는 권장 최소 데이터이다. 항법 계산에 필수적인 속도와 방향을 포함하고 있어 $GPGGA와 상호 보완적으로 구독(Subscribe)된다.
- 문장 구조 예시:
$GPRMC,HHMMSS.SS,A,llll.llll,N,yyyyy.yyyy,E,S.S,C.C,DDMMYY,,,A*XX - 속도 형변환(Velocity Casting) 비용:
여기에 표기된 속도 벡터인S.S값은 SI 단위계인m/s가 아니라 해상 마일 기준인 노트(Knot) 단위의 문자열이다. FC 시스템은 이 문자열 텍스트를 정수로 추출한 직후, 0.514444를 곱하여(또는 이와 동차인 정수비율 곱/나눗셈을 수행하여)m/s단위로 스케일링하는 재가공 절차를 거친다. 이러한 단위 환산 부동 소수점(Floating Point) 보정 수학 연산이 누적되면 비행 제어 루프의 마이크로초(us) 단위 딜레이를 유발하게 된다.
0.3 $GPVTG (Course Over Ground and Ground Speed) 문장 파싱
$GPVTG는 오로지 대지 속도(Ground Speed)와 진행 방위(Course)만을 전달하기 위해 존재한다. $GPRMC에도 속도 정보가 있지만, $GPVTG는 픽스(Fix)가 완전히 튀는 상황에서도 도플러 천이(Doppler Shift) 효과만을 집계하여 극도로 빠르고 상대적으로 정확한 2D 속도 벡터를 보장한다.
- 진행 방위 분해능 연산: 문장에 포함된
True Track made good각도는 이동 궤적을 자북(Magnetic North)이 아닌 진북(True North) 기준으로 던져준다. PX4는 이 숫자 문자열을 파싱한 즉시, 기체 내부의declination(자기편각) 파라미터 값과 대역 대조하여 로컬 항법 프레임(NED Frame)에 맞도록 벡터를 회전 변환(Rotation Matrix)해야 한다. - 파싱 트리의 스케줄링(Scheduling): PX4 NMEA 드라이버는 버퍼에서
$GPVTG식별자가 감지되면 위도/경도 파싱은 과감히 건너뛰고 오직 속도 블록 4개만을 파싱하도록 분기 예측(Branch Prediction) 루틴을 짠다. 이는 하나의 완전한 GPS uORB 메시지(vehicle_gps_position_s) 뭉치를 빌드하기 위해$GPGGA,$GPRMC,$GPVTG조각들을 캐시(Cache)에 쥐고 있다가, 세 문장의 조립이 끝나는 순간 타이머 인터럽트를 걸어 EKF2로 한 번에 푸시(Push)하는 스케줄링 전략을 취한다.