### 0.0.1 `sensor_gps.msg` uORB 토픽의 구조체(Struct) 메모리 레이아웃 및 각 필드(epv, eph, vel_ned)의 의미

### 0.0.1 sensor_gps.msg uORB 토픽의 구조체(Struct) 메모리 레이아웃 및 각 필드(epv, eph, vel_ned)의 의미

uORB 파이프라인의 핏줄을 타고 흐르는 핵심 적혈구는 바로 sensor_gps.msg 파일로부터 자동 생성(Code Generation)되는 C++ 구조체, struct sensor_gps_s 이다.
이 구조체는 단순히 데이터 번들(Bundle)을 넘어, EKF2 추정기와의 계약(Contract)이자, 센서 융합 수학의 초기 입력 벡터 블록으로 기능한다. PX4는 메모리 효율성을 극대화하기 위해 이 레이아웃을 바이트 패딩(Padding) 관점에서 매우 치밀하게 설계했다.

0.1 구조체(Struct) 메모리 정렬(Alignment)과 패딩 최적화

임베디드 타겟(ARM Cortex-M 등)에서 uORB 메시지는 수백, 수천 번 복사(Copy)되며 네트워크를 돌아다닌다. 따라서 이 구조체는 버스 대역폭을 낭비하지 않도록 크기가 큰 8바이트(64-bit) 자료형부터 1바이트(8-bit) 자료형 순서로 내림차순 정렬되어 있다.

  • 가장 선두에는 동기화의 핵심인 uint64_t timestampuint64_t timestamp_time_relative가 배치된다.
  • 이어서 고정밀 나노 디그리(Nano-degree) 위경도를 표현하기 위한 int32_t lat, lon (위도/경도 \times 10^7)과 1밀리미터 해상도의 고도를 나타내는 int32_t alt가 자리한다.
  • 구조체 하단부에는 패딩 낭비를 막기 위해 uint8_t fix_type, satellites_used 같은 1바이트짜리 상태 플래그들이 촘촘하게 박혀 있다.
  • 결과적으로 C++ 컴파일러(GCC)가 삽입하는 더미 패딩(Dummy Padding) 바이트가 제로(Zero)에 가깝도록 최적화되어 있어, 메모리 복사(memcpy) 시 CPU 오버헤드가 극도로 억제된다.

0.2 가로/세로 오차 공분산의 씨앗: ephepv

순수한 위도/경도/고도 값만큼이나 EKF2 칼만 필터 입장에서 사활이 걸린 데이터가 바로 관측 잡음 모델을 구성하는 eph (Estimated Position Horizontal)와 epv (Estimated Position Vertical) 필드다.

  • eph (수평 위치 오차 반경): GPS 수신기가 자체적으로 평가한 수평면(위경도) 상의 오차 반경(미터 단위)이다. 위성들의 기하학적 배치(HDOP)가 나쁘거나 다중 경로(Multipath) 반사가 심할 때 이 수치는 급증한다.
  • epv (수직 위치 오차 반경): 위성이 하늘(=머리 위)에만 쏠려 있는 태생적 한계 탓에, GPS의 고도 오차는 항상 수평 오차보다 1.5배~2배가량 크다. 이 필드는 기압계(Barometer) 데이터와 GPS 고도 데이터를 융합할 때, 기압계를 더 믿을지 GPS를 더 믿을지 결정짓는 칼만 게인(Kalman Gain) 가중치 분배의 핵심 척도(Variance)가 된다.
  • EKF2는 ephepv가 미리 설정된 한계 파라미터(예: EKF2_GPS_HMAX 5.0m)를 초과하면, 해당 GPS 데이터 전체를 쓰레기(Garbage)로 간주하고 융합 제단(Fusion Altar)에서 매몰차게 내쳐버린다(GPS Rejection).

0.3 기구학적 예측의 무기: vel_n_m_s, vel_e_m_s, vel_d_m_s

좌표(위치) 데이터는 필연적으로 지연(Latency)과 잡음(Noise)의 산물이지만, 위성 반송파 위상 변이나 도플러 파생(Doppler Shift) 효과를 통해 추출된 속도(Velocity) 데이터는 기체의 궤적을 예측하는 데 있어 측위 데이터보다 훨씬 선명하고 즉각적인 정보를 제공한다.

  • vel_n_m_s (북쪽 지향 속도), vel_e_m_s (동쪽 지향 속도), vel_d_m_s (아래쪽 지향 속도): 이 세 가지 float 필드는 기체의 NED(North-East-Down) 로컬 프레임 기준 3차원 속도 벡터를 미터퍼세크(m/s) 단위로 나타낸다.
  • 추정기(Estimator)는 이 속도 벡터를 단순한 위치 미분으로 얻지 않고, 가속도계(Accelerometer)의 적분 오류인 속도 표류(Velocity Drift)를 교정하는 데 직접적으로 사용한다. 기체가 바람에 휩쓸려 옆으로 밀리는(Crab) 현상, 즉 측면 슬립(Sideslip)을 감지하고 모터 믹서에 보상 신호를 내려주는 근거가 바로 이 NED 속도 벡터에 있다.

이처럼 sensor_gps_s 구조체의 필드 하나하나는 단순한 센서 출력값이 아니라, 센서 융합 수학 모델의 상태 벡터(State Vector) 갱신이라는 엄중한 임무를 띠고 EKF2 행렬 속으로 배열되는 기하학적 블록들인 것이다.