28.4.4.2 센서 복구 시 지연 시간(Hysteresis Timer) 적용 및 이전 모드로의 안전 복귀(Auto-Recovery) 로직
인플라이트(In-flight) 장애 극복의 핵심은 시스템이 오류 상실(Loss)을 감지하고 하위 모드로 신속히 강하(Fallback)하는 것뿐만 아니라, 장애 원인이 해소되어 센서 데이터가 유효한 상태로 되돌아왔을 때 기체를 어떻게 다시 정상 상태로 복구시킬 것인가에 달려 있다. PX4-Autopilot은 이 과정에서 조종사의 혼란을 가중시킬 수 있는 잦은 모드 전환(Mode Flapping)을 방지하기 위해 히스테리시스 지연 시간(Hysteresis Timer) 과 보수적인 자동 복귀(Auto-Recovery) 설계 철학을 적용하고 있다.
본 절에서는 장애 상황에서 벗어난 이후 기체의 비행 모드가 다시 상향 복구되는 과정의 타이밍 제어 로직과 아키텍처적 특성을 분석한다.
1. 히스테리시스 타이머(Hysteresis Timer)의 개념과 필요성
센서 신호, 특히 GPS 전파나 비전 센서의 광학 트래킹 신호는 경계선(Threshold) 부근에서 끊임없이 흔들리는 특성을 지닌다. 잡음(Noise)이나 다중 경로(Multipath)에 의해 신호 품질이 일시적으로 기준치 이상으로 올라왔다 내려가기를 반복할 때, 시스템이 이에 즉각적으로 반응하여 “강하 \rightarrow 복귀 \rightarrow 강하 \rightarrow 복귀“를 반복한다면 기체 제어가 심각하게 불안정해지는 이른바 모드 핑퐁(Mode Ping-pong) 현상 이 발생한다.
PX4 커맨더(Commander) 모듈은 이러한 제어기 내 불안정성을 타개하기 위해 히스테리시스(Hysteresis) 메커니즘을 소프트웨어 타이머를 통해 구현한다.
- 히스테리시스 원리: 단순히 현재 순간의 데이터 유효성만 보지 않고, “데이터가 유효한 상태를 일정 시간(\Delta t) 이상 연속적으로 유지했는가?“를 평가한다.
- 적용: EKF2 모듈이 제공하는 상태 플래그(
flags.local_position_valid등)가true로 회복되었다 하더라도, 커맨더 측에 내장된 카운터(복구 지연 타이머)가 소진될 때까지는 여전히 강하된 하위 모드(예: Altitude)를 강제 유지한다.
2. 모드 자동 복귀(Auto-Recovery) 아키텍처 및 철학
기체의 센서 이상이 타임아웃을 거쳐 완전히 복구되었다고 판별될 때, 원래 비행 중이던 모드(예: Position 또는 Mission)로 시스템 개입 없이 스스로 되돌아가는 기능을 자동 복귀(Auto-Recovery) 라고 부른다.
2.1 조종사 우선주의 (Pilot in the Loop)
PX4-Autopilot의 근간을 이루는 가장 강력한 모드 천이 철학 중 하나는 “예측 불가능한 자동 모드 전환은 배제한다” 는 점이다.
- 센서 장애로 인해 조종사(또는 GCS)가 의도하지 않은 강제 모드 강하(예: Position \rightarrow Altitude)가 발생하면, 조종사는 본능적으로 스틱을 조작하여 수동으로 기체를 억류하려 시도할 것이다.
- 만약 조종사가 스로틀과 피치를 움직여 기체를 통제하고 있는 도중에, 시스템이 독단적으로 다시 Position 모드로 확 넘어간다면, 제어기(Position Controller)가 스틱 입력을 위치 제어용 커맨드로 해석하게 되어 기체가 급발진(Lurch)하는 2차 사고가 날 위험이 높다.
2.2 보수적인 복귀 로직 구현
따라서 PX4 소스 코드 상에서 페일세이프 회복 시퀀스는 기본적으로 “자동 복귀(Auto-Recovery) 비활성화” 에 가까운 매우 보수적인 스탠스를 취한다.
- 명시적 해제 요구: 일단 페일세이프 상태 머신에 의해 모드가 강하되면, 이후 GPS가 복구되더라도 기체는 강하된 모드(Altitude 또는 Stabilize)에 그대로 머무른다.
- 조종사의 모드 전환 트리거: 조종사(또는 MAVLink RC/GCS) 측에서 수동으로 RC 조종기의 비행 모드 스위치를 한 번 다른 곳으로 돌렸다가 다시 Position 모드로 전환(Toggle)해야만 원래의 상위 모드로 넘어간다. 이는 “조종사가 현재 시스템이 정상임을 인지하고 제어 전환을 허가함“이라는 명시적 승인 행위로 간주된다.
- 예외 - Mission 모드: 자동 임무 비행(Mission) 중 발생한 일시적 글리치 단절에 대해서는, 관련 파라미터 튜닝과 웨이포인트(Waypoint) 지속성 정책에 따라 데이터 링크나 GPS 복구 시 자동으로 복귀하여 남은 임무를 이어가도록 허용하는 파이프라인도 지원된다.
3. 타이머 로직의 소스 코드 레벨 분석
커맨더 모듈 내 Failsafe 평가 루프는 마이크로초(microsecond) 단위의 hrt_absolute_time() (NuttX High Resolution Timer)을 사용하여 히스테리시스 로직을 구동한다.
// Commander 내부 히스테리시스 회복 타이머 개념 예제
uint64_t now = hrt_absolute_time();
if (estimator_status.local_position_valid) {
if (_last_valid_time == 0) {
_last_valid_time = now; // 처음 유효성 감지
}
// 복구 지연 타이머(Hysteresis) 통과 확인
if (now - _last_valid_time > _params.recovery_delay_us) {
_failsafe_state.position_recovery_ready = true;
}
} else {
// 단 한순간이라도 valid가 깨지면 타이머 리셋 (엄격한 연속성 체크)
_last_valid_time = 0;
_failsafe_state.position_recovery_ready = false;
}
위 로직의 핵심은 else 구문에 있다. 조건이 단 1 밀리초라도 깨지면 타이머가 리셋되므로, 완전히 깨끗한(Clean) 환경이 보장될 때까지 복구 준비 상태를 허가하지 않는다.
4. ArduPilot과의 비교
- PX4 (현저한 보수성): “일단 모드가 떨어지면 시스템이 함부로 원상 복구하지 않는다.” 조종사의 스위치 토글이 있어야만 상위 모드로의 재활성화를 인가하는 특성이 두드러진다.
- ArduPilot (유연한 복구 지원): ArduPilot의 EKF Failsafe 등은 상황에 따라 조금 더 유연하다. ‘EKF 복구(Recovery)’ 이벤트가 발생하면, 이전에 조종사가 조작 중이던 모드가 Loiter나 PosHold였다면 이를 즉시 돌려주는 옵션(파라미터 기반)이 있어 사용성에 초점을 맞추기도 한다. 하지만 최신 버전에 들어서면서 드론의 물리적 충돌 방지를 위해 점진적으로 PX4와 유사한 보수적 관점을 도입하고 있다.
5. 지상 관제소(GCS)에서의 모니터링
센서 데이터가 유효 구간 내로 돌아오면, QGroundControl은 MAVLink 프로토콜의 SYS_STATUS나 EXTENDED_SYS_STATE 메시지를 통해 센서 아이콘의 붉은색 알람(Error indicator)을 해제하고 녹색으로 되돌린다.
그러나 비행 모드 뱃지는 현재 떨어져 있는 하위 모드(예: Altitude)에 그쳐 있으므로, 운영자는 텔레메트리 화면 중앙에 뜨는 상태 텍스트(“Position lock regained, ready for position control” 등)를 육안으로 식별하고, 상단의 비행 모드 드롭다운 메뉴를 클릭하여 수동으로 Position이나 Mission을 재지정해야 한다.
히스테리시스 타이머와 보수적인 모드 복구 정책은 언뜻 보기에 매우 답답하고 매뉴얼 개입을 강제하는 것처럼 보일 수 있다. 하지만 결함 환경 하에서 우발적인 자율 제어 급가속(Bumpless transfer 오류)으로 인해 치명타를 입는 것을 설계 원천 단위에서 방어하기 위해서는 타협할 수 없는 항공 로봇 소프트웨어의 표준 설계 원칙이다.