18.2.2.4 `timestamp` (uint64_t) 필드의 필수 포함 규칙과 시간 동기화에서의 역할

18.2.2.4 timestamp (uint64_t) 필드의 필수 포함 규칙과 시간 동기화에서의 역할

PX4-Autopilot의 uORB 생태계에서, 새로운 센서나 제어 메시지를 정의하기 위해 .msg 파일을 작성할 때 지켜야 할 가장 우선되고 절대적인 규칙이 하나 있다. 그것은 바로 구조체의 첫 번째 필드로 반드시 uint64 timestamp 변수를 선언해야 한다는 것이다.

이 규칙은 권장 사항이 아니다. 앞서 살펴본 px4_generate_messages.py 스크립트는 렉시컬 분석 단계에서 첫 번째 필드가 timestamp가 아니면 즉시 파싱 에러(Parsing Error)를 발생시키고 펌웨어 빌드를 무자비하게 중단시켜 버린다.

왜 PX4 설계자들은 이토록 강압적인 제약을 시스템의 근간에 새겨 넣었을까? 그 해답은 항공우주 소프트웨어에서 ’시간(Time)’이 지니는 본질적인 의미와 메모리 레이아웃 구조의 절묘한 결합에 있다.

1. 마이크로초 단위의 생명선: uint64_t 의 선택

timestamp 변수는 시스템이 부팅된 후 경과한 시간을 마이크로초(\mu s, 100만 분의 1초) 단위로 저장한다.

만약 이를 메모리를 아끼기 위해 32비트 변수(uint32_t)로 지정했다면 어떤 일이 벌어질까? 2^{32} 마이크로초는 약 4,294초, 즉 71.58분에 불과하다. 드론이 공중에 뜬 지 1시간 12분이 경과하는 순간 타이머가 0으로 오버플로우(Overflow)되면서, 센서의 시계열이 거꾸로 흐르는 현상이 발생해 칼만 필터(EKF) 알고리즘이 붕괴하고 기체는 곧바로 제어 불능 상태에 빠져 추락하게 된다.

반면, 64비트(uint64_t)를 사용하면 오버플로우까지 약 58만 년이 걸리므로 영구적인 시간의 연속성을 보장받을 수 있다. C++로 변환된 후에는 uint64_t로 고정되어 하드웨어 아키텍처와 무관하게 언제나 8바이트의 공간을 안정적으로 점유한다.

2. 데이터 지연(Latency)의 척도와 센서 퓨전(Sensor Fusion)

자율 비행의 핵심인 센서 퓨전(ECL/EKF2)은 다양한 센서들을 융합할 때 “이 데이터가 언제 측정되었는가?” 에 절대적으로 의존한다.

  • 자이로스코프 데이터는 1밀리초 전에 들어오고, GPS 데이터는 100밀리초 전에 들어왔다면, 두 데이터를 동일 선상의 시간에 두고 융합해서는 위치 추정이 완전히 어긋난다.
  • 발행자(Publisher)가 자신이 측정한 시각을 timestamp 필드에 각인하여 uORB에 던지면, 구독자인 EKF는 이 타임스탬프를 읽어 현재 시간과의 차이(Age of Data)를 계산하고 과거의 버퍼(Delay Buffer)를 보정하는 지연 보상 연산을 정밀하게 수행한다.

3. Offset +0 배열의 마법: O(1) 타임스탬프 접근

이 규칙의 진정한 위력은 앞선 18.2.2.3절에서 설명한 ‘데이터 크기 내림차순 정렬’ 알고리즘과 만날 때 발휘된다.

timestamp는 8바이트(uint64_t)로 PX4 생태계에서 가장 덩치가 큰 자료형 중 하나이며, 스크립트 강제 규칙에 의해 가장 첫 번째 줄에 선언된다. 따라서 C++ 컴파일 과정을 거치면, 패딩이 있든 없든 어떤 토픽의 구조체이든지 timestamp 필드의 메모리 오프셋(Offset)은 무조건 +0 번지로 고정된다.

이러한 레이아웃 형태는 uORB 코어 매니저에게 엄청난 혜택을 준다. uORB 내부 코어 엔진은 자신이 현재 나르고 있는 메시지가 가속도 센서인지, 배터리 정보인지 구체적인 타입(Type)을 알 필요가 없다. 그저 포인터를 캐스팅(Casting)하지 않은 상태, 즉 원시 바이트(Raw Byte) 포인터의 맨 앞 8바이트만 읽어내면(*(uint64_t*)payload) 해당 메시지가 언제 발행된 것인지 즉각적으로 판독할 수 있다.

이처럼 timestamp 필수 포함 규칙은 단순한 코딩 컨벤션을 넘어, 비행 파라미터의 절대적 신뢰성을 담보하고 코어 미들웨어의 라우팅 퍼포먼스를 극대화하는 가장 근원적이고 파괴적인 아키텍처적 결단이라 할 수 있다.