28.6.3.2. 전방 천이(Front Transition) 및 후방 천이(Back Transition) 시의 비행 모드 상태 강제 동기화

28.6.3.2. 전방 천이(Front Transition) 및 후방 천이(Back Transition) 시의 비행 모드 상태 강제 동기화

수직이착륙기(VTOL)가 하늘에 떠올라 멀티로터(MC) 모드에서 고정익(FW) 모드로 변신하는 과정을 전방 천이(Front Transition), 반대로 고속 순항을 마치고 호버링 궤도에 진입하기 위해 FW 모드에서 MC 모드로 돌아오는 과정을 후방 천이(Back Transition) 라고 부른다.

PX4-Autopilot의 듀얼 펌웨어 아키텍처(MC 제어기와 FW 제어기가 동시 가동되는 구조) 하에서, 천이 과정은 두 이질적인 상태 머신(State Machine)이 찰나의 순간에 바통을 주고받는 매우 위험하고 불안정한 비행 구간이다. 만약 이 과정에서 두 제어기의 상태가 조금이라도 어긋나면(예: MC는 끝났다고 생각하는데 FW는 아직 순항 속도를 내지 않을 때), 기체는 즉각 실속(Stall)하거나 공중제비를 돌며 추락하게 된다.

본 절에서는 PX4가 이러한 치명적인 비동기 현상을 막기 위해 어떻게 비행 모드 상태를 “강제 동기화(Forced Synchronization)“하는지 소스 코드 레벨에서 추적한다.


1. 전방 천이(Front Transition: MC \rightarrow FW)의 상태 동기화

조종사가 스위치를 변경하거나, 임무(Mission) 웨이포인트 알고리즘이 천이 명령을 내리면, commander 모듈을 거쳐 vtol_att_control 모듈에 전방 천이 진입(Transition_Front) 지시가 떨어진다.

이 순간, 시스템 전역에는 강제적인 상태 록아웃(State Lock-out) 피드백 루프가 전파된다.

1.1 is_vtol_transition 플래그의 발동

천이가 시작되면 vehicle_status uORB 토픽의 is_vtol_transition 불리언(Boolean) 필드가 true로 점프한다.
이 플래그는 PX4 생태계 내의 모든 안전장치와 궤적 생성기(Trajectory Generator)에 다음과 같은 제약 조건을 동시에, 그리고 강제적으로 뿌린다.

  1. 위치 궤적 제어 정지: mc_pos_control은 이 플래그를 감지하는 즉시, 3D 공간을 따라가던 웨이포인트 위치 추종 로직을 완전히 멈추고 맹목적인 “고도 유지(Altitude Hold) 및 자세 제어(Attitude Control)” 로 강등(Degradation)된다. 기체가 천이하는 동안 위치 제어기가 개입하여 급격한 요(Yaw)나 롤(Roll)을 치는 것을 원천 차단하기 위함이다.
  2. FW 스로틀의 강제 탈취: vtol_att_controlfw_att_control로 하여금 TECS의 고도/속도 제산 루프를 잠시 무시하게 만들고, 푸셔(Pusher) 스로틀 값을 파라미터 VT_F_TRANS_THR (전방 천이 스로틀 값) 수준으로 무조건 강제 고정(Override)시켜 버린다. 오직 대기속도(Airspeed)를 확보하는 액셀러레이터 역할만 수행하도록 고정익 제어기를 노예화(Enslavement)하는 것이다.

1.2 종료 조건 검사 (Exit Condition)

전방 천이는 타이머(Time)가 아닌 철저히 에너지 상태(대기속도) 에 의해 종료점이 동기화된다. 피토관(Pitot Tube) 등에서 측정한 대기속도(indicated_airspeed)가 천이 완료 파라미터(VT_ARSP_TRANS)를 확고히 넘어서는 순간, is_vtol_transitionfalse로 떨어지며 기체 상태(vehicle_type)는 공식적으로 VEHICLE_TYPE_FIXED_WING으로 승격된다.


2. 후방 천이(Back Transition: FW \rightarrow MC)의 상태 동기화

고속으로 날아오던 기체가 갑자기 호버링(Hovering)을 하려면 비행기가 공중에서 급브레이크를 밟아야 한다. 후방 천이는 전방 천이보다 역학적으로 훨씬 까다롭다. 날개의 양력이 급속도로 사라지는 동안, 꺼져있던 리프트(Hover) 모터 4개가 서서히 제 역할을 넘겨받아야 하기 때문이다.

후방 천이 명령 하달 시(Transition_Back), vtol_att_control의 동기화 상태 머신은 다음과 같이 구동된다.

  1. MC 리프트 모터 웨이크업(Wake-up): 가장 먼저 MC 자세 제어기의 스로틀을 VT_B_TRANS_THR 파라미터 셋으로 강제 부팅시킨다. (약간의 아이들 링보다 조금 더 큰 수준)
  2. 공기역학적 브레이킹 제어권(FW): 속도를 줄이기 위해 푸셔(전진) 모터를 0으로 차단하고, fw_att_control에 명령을 내려 기체의 피치를 확 들어올린다(Pitch Up). 이른바 플레어(Flare) 자세를 만들어 기체의 뱃가죽으로 공기 저항(에어브레이크)을 받아 강제 감속을 유도한다.
  3. 혼합(Blend) 오차 동기화: 속도가 줄어들면서 양력이 빠져 기체가 아래로 쳐지려 하는 고도 오차(Altitude Error)를 MC 위치 제어기가 피드백 받아, 줄어든 양력만큼 스로틀 개방을 비례적으로 늘리며(Spool-up) 기체의 고도를 동기화하여 붙잡는다.

2.1 블라인드 타임아웃 종료 (Blind Timeout)

후방 천이는 대기속도 센서를 신뢰하기 힘들다. 기체가 피치를 심하게 들어 올리면 피토관으로 들어오는 바람의 각도가 심하게 꺾여(High Angle of Attack) 대기속도 측정이 매우 부정확해지기 때문이다.
따라서 PX4의 후방 천이 종료 로직은 보통 대기속도가 아니라 타임아웃(Timeout, 파라미터 VT_B_TRANS_DUR) 기반으로 상태를 강제 스냅샷 종료한다. 시간이 되면 무조건 vehicle_typeVEHICLE_TYPE_ROTARY_WING으로 강제 오버라이트(Overwrite)하고 후방 천이 플래그를 꺼버린다.


3. Commander 모듈과의 상태 전이 검증 (Health Check)

만약 천이 과정에서 vtol_att_control이 어떤 이유로 꼬여 무한 루프에 빠지거나, 강풍으로 인해 기체가 정해진 천이 시간(VT_TRANS_TIMEOUT) 안에 목표 속도에 도달하지 못하면 어떻게 될까?

메인 두뇌인 commander.cpp 모듈은 이 천이 상태(is_vtol_transition)가 지정된 한계 시간을 초과하여 지속되는지를 지속적인 백그라운드 틱(Tick)으로 감시하고 있다.
만약 에러 임계치를 돌파하면, Commander는 현재 수행 중인 모든 자율 임무를 취소시켜 버리고 강제적으로 Return mode(또는 Land mode) 로 시스템을 강제 이관함과 동시에, VTOL 모듈에게 천이 중단(Transition Abort) 및 쿼드 모드 강제 복귀(Quad Choke/Fallback) 시그널을 방송한다.

이처럼 상태 동기화는 모듈 안에서의 가중치 계산뿐 아니라 상용 여객기에 버금갈 정도로 엄격하게 시스템 전역의 파수꾼(Watcher)과 결합하여 구현되어 있다.


4. ArduPilot 대비 상태 동기화의 구조적 차이점

  • ArduPilot (단일 스레드 State Machine): ArduPilot의 QuadPlane 코드는 기본적으로 ArduPlane 메인 루프 관할 안에 종속되어 있다. 천이 과정(Transition State) 자체가 단순히 Plane 코드 내의 switch-case 분기문의 하나로 관리된다. 따라서 Plane 코드가 Copter 코드를 명시적으로 함수 호출(Function Call)하여 구동시키는 직렬적 동기화 구조를 띤다.
  • PX4 (uORB 버스 기반 퍼블릭 락 시스템): PX4는 다수의 비동기 프로세스 데몬(mc_pos_control, fw_pos_control_l1, navigator 등)이 각자 동작하다가, vtol_att_control이 uORB 버스에 is_vtol_transition = true 불꽃을 펑 터뜨리는 순간 이 플래그를 구독(Subscriber)하고 있던 모든 자율 모듈들이 각자 스코프 내에서 알아서 기능을 제한(Lock-down)하는 구조다. 이는 고도의 느슨한 결합(Loosely Coupled)과 확장성을 가져오는 모듈형 OS 아키텍처 다운 세련된 상태 동기화 방식이다.