28.2.3.2. 입력 데이터 유효성(Validity) 및 타임아웃(Timeout) 검사
PX4의 Flight Mode Manager (이하 FMM) 데몬은 센서 데이터를 그저 게걸스럽게 삼켜 자식 FlightTask 객체들에게 토해내는 단순한 데이터 전달 파이프(Data Pipe)가 아니다.
자율 비행 시스템에 있어 **“수학적으로 오염되었거나 유통기한이 지난 썩은 센서 데이터는, 데이터가 아예 없는 것보다 백배 천배 기체 생존에 치명적이다”**라는 절대 명제를 방어하기 위해, FMM은 C++ 코드 레벨에서 잔혹할 정도로 깐깐한 입력 데이터 유효성(Validity) 및 타임아웃(Timeout) 검열 톨게이트 로직을 내장하고 있다.
1. uORB 헤더의 Timestamp 기반 타임아웃(Timeout) 판독
FMM Run() 루프가 잠에서 깨어나 가장 먼저 하는 일은 uORB::Subscription 객체를 두들겨 패 캐시를 업데이트하는 일이다. 그러나 데이터가 최신으로 들어왔다(updated() == true)고 해서 FMM이 곧이곧대로 그것을 신뢰하지는 않는다.
- Timestamp의 절대적 권위:
모든 PX4 통합 센서 데이터 토픽(.msg) 구조체 첫 번째 바이트에는 발행 순간의 절대 찰나를 기록한timestamp(uint64_t 마이크로초) 변수가 박혀 있다. - 잔혹한 유통기한 뺄셈 수학:
FMM은 현재 자신의 OS 틱 베이스 시간(hrt_absolute_time())에서 방금 읽어 들인 센서 구조체의timestamp를 뺀다(Delta Time). 그리고 이 값이 센서 도메인별로 미리 하드코딩된 ’최대 허용 타임아웃 임계값(Timeout Threshold)’을 단 1마이크로초라도 넘겼는지 검열한다.
예를 들어, 조종기 스틱 데이터(manual_control_setpoint)의 타임아웃 허용치가 500ms(0.5초)로 설정되어 있다면, 방금 버스에서 꺼낸 데이터라 할지라도 그 발행 타임스탬프가 0.5초 이전의 낡은 것이라면 FMM은 이를 폐기 처분한다. - Stale Data(유통기한 경과) 선언:
타임아웃 임계점을 넘긴 데이터는 즉각 ‘Stale(썩은)’ 플래그가 매겨지며, FMM 본체는 이를 정상적인 자식 수학 객체(예:FlightTaskManual)에게 넘겨주는 것을 거부하고, 텔레메트리를 통해 GCS(지상 관제소)에RC_LOST혹은DATALINK_LOSS같은 치명적 알람을 띄우며 FMM 자체를 비상 안전 모드(Failsafe Task)로 강제 스위칭(Hot-swapping) 시켜버린다.
2. 데이터 값의 유효성(Validity) 및 물리적 한계치 검문 (Sanity Check)
데이터가 신선하다(Not Stale)고 해서 검증이 끝나는 것은 아니다. EKF2 모듈 내부의 행렬 연산이 꼬이거나 센서 글리치(Glitch)가 발생해 물리적으로 말도 안 되는 데이터가 넘어오는 상황을 대비해야 한다.
- NaN(Not-a-Number) 및 무한대(Infinity) 킬 스위치:
C++ 부동소수점(Float) 연산 생태계에서 위치 데이터 값에NaN이나INF가 섞여 들어오면, 자식 객체의 궤적 PID 산출 결과 역시 즉각NaN으로 박살 나며 모터 출력단에 악성 명령을 쏟아낼 수 있다. FMM은 이를 방어하기 위해PX4_ISFINITE()같은 매크로를 활용하여 들어온 위치/속도 벡터 행렬값들이 수학적으로 정상적인 범위의 실수인지 문지기처럼 필터링한다. - 물리적 센서 제약 조건 검증:
예를 들어 고도계(Barometer) 기준을 넘어서는 비정상적인 수십 킬로미터 단위의 고도 점프(Z-axis Jump) 쓰레기 데이터가 들어왔을 때, FMM 단에서 이 델타 편차(Variance)가 드론의 물리적 가속 한계를 넘어서는 비정상 튀어오름(Outlier)이라고 판단되면 이 데이터를 유효하지 않음(Invalid)으로 강제 마스킹(Masking)해버린다.
3. 유효성 검증 실패(Invalidity) 시의 아키텍처적 격리(Isolation) 처리
이 깐깐한 타임아웃과 밸리디티(Validity) 톨게이트를 통과하지 못한 센서 데이터 세트를 넘겨받은 FMM 본체는 절대 당황하여 OS 커널 레벨 패닉(Panic)을 일으켜 뻗어버리지 않는다.
- 플래그 비트(Flag Bit) 강등:
해당 센서 항목(예:local_position_valid) 비트를false로 꺾어버린다. - 자식 팩토리의 자기 방어권 보장:
이valid플래그가 꺾인 통합 상태 구조체를 주입받은 현재의FlightTask자식 객체(예: 자동 미션 비행 태스크)는, 자신의update()함수 첫 줄에서 필수 센서의valid플래그가 꺼져 있음을 확인하는 순간, 궤적 매트릭스 계산을 즉시 보이콧(거부)하며false컴플레인 리턴을 위로 뱉어낸다. - FMM 부모의 동적 포인터 핫스와핑(Fallback 스위칭):
자식 객체가 계산 불능 앓는 소리를 내며false를 뱉어내면, 부모인 FMM 데몬 본체는 눈 하나 깜짝하지 않고 현재의 화려한FlightTaskAutoMission객체 포인터를 산채로delete소멸시켜버린다.
그리고 망가진 현재 데이터 상황(예: GPS가 튀어 위치는 모르지만 자이로 자세는 살아있는 상태)에서도 유일하게 생존 비행이 가능한 깡통 수학 객체인FlightTaskManualAltitude(고도만 강제로 유지하며 버티는 모드)를 램 공간에 다이내믹 새로 뽑아내(new) 찰나의 순간에 포인터를 이어 붙여버린다.
이것이 FMM 데몬이 오염된 센서 데이터를 맞아 죽어가면서도 끝까지 기체의 평형 끈을 놓지 않고 우아하게 안전망(Fallback Net)을 펼쳐내는 객체 지향 다형성(Polymorphism) 폴백(Fallback) 방어 아키텍처의 극치다.