Chapter 28. PX4 비행 모드(Flight Mode) 시스템 아키텍처
- 28.1. PX4 비행 모드(Flight Mode) 시스템 아키텍처 개요
- 28.1.1. 제어 스택 내 비행 모드의 위상 및 추상화 모델
- 28.1.1.1. Estimator-Controller 분리 아키텍처에서의 중간 계층 역할
- 28.1.1.1.1. 상태 추정(State Estimation) 데이터와 제어 목표(Setpoint) 간의 디커플링 원리
- 28.1.1.1.2. 다중 제어기(Position, Attitude, Rate) 요구사항에 맞춘 독립적 궤적 생성 메커니즘
- 28.1.1.2. 사용자 입력(User Intent) 모델링 및 정규화(Normalization) 프로세스
- 28.1.1.2.1.
manual_control_setpoint uORB 토픽의 구조와 물리적 의미
- 28.1.1.2.2. RC 스틱의 Raw PWM 값을 [-1.0, 1.0] 범위로 매핑하는 캘리브레이션 연산
- 28.1.1.2.3. 스틱 엑스포넨셜(Exponential) 및 데드존(Deadzone) 필터링 수학적 모델
- 28.1.2. PX4 Navigation State (
nav_state) 상태 머신 구조
- 28.1.2.1.
vehicle_status.msg 내 NAVIGATION_STATE_* 열거형 상수 심층 분석
- 28.1.2.1.1. 수동 제어 상태 군:
MANUAL, ALTCTL, POSCTL, ACRO, STAB
- 28.1.2.1.2. 자동 제어 상태 군:
AUTO_MISSION, AUTO_LOITER, AUTO_RTL, AUTO_TAKEOFF, AUTO_LAND
- 28.1.2.1.3. 비상 및 특수 상태 군:
OFFBOARD, DESCEND, TERMINATION
- 28.1.2.2. Navigation State와 내부 실행 모듈(Flight Task) 간의 비동기 매핑 아키텍처
- 28.1.3. Ardupilot 비행 모드 아키텍처와의 소스 코드 레벨 비교
- 28.1.3.1. C++ 다형성(Polymorphism) 활용 측면의 비교
- 28.1.3.1.1. PX4의 플러그인 기반 다이나믹 태스크 스위칭(Dynamic Task Switching) 구조
- 28.1.3.1.2. Ardupilot의
mode.cpp 중심 하드코딩된 거대 제어 루프(Monolithic Loop) 구조
- 28.1.3.2. 데이터 버스(Data Bus) 의존성 차이
- 28.1.3.2.1. PX4의 uORB Publish/Subscribe 비동기 통신망 기반의 모드 독립성
- 28.1.3.2.2. Ardupilot의 전역 변수(Global Variable) 및 싱글톤(Singleton) 객체 참조 방식
- 28.2. Flight Mode Manager (
flight_mode_manager) 핵심 모듈 분석
- 28.2.1. 모듈 스케줄링 및 운영체제(NuttX) 레벨의 통합 구조
- 28.2.1.1.
px4::WorkItem 클래스 상속을 통한 Work Queue 스케줄링 메커니즘
- 28.2.1.1.1.
wq:nav_and_controllers 큐 내에서의 Flight Mode Manager 우선순위(Priority) 배정
- 28.2.1.2. 모듈 초기화(
init()) 및 런타임 시작(start()) 루틴의 메모리 할당 검증
- 28.2.2. 소스 코드 디렉터리 및 빌드 시스템(
src/modules/flight_mode_manager)
- 28.2.2.1.
FlightModeManager.hpp / FlightModeManager.cpp 메인 클래스 해부
- 28.2.2.1.1. 의존성 주입(Dependency Injection) 및 내부 상태 변수(State Variables) 구조
- 28.2.2.2.
CMakeLists.txt 파일 분석 및 조건부 컴파일(Conditional Compilation) 옵션
- 28.2.2.2.1. 메모리 제약 환경(예: Pixhawk 1/2)을 위한 특정 Flight Task 빌드 제외 로직
- 28.2.3. 메인 제어 루프(
Run()) 실행 파이프라인
- 28.2.3.1. uORB 토픽 폴링(Polling) 및 동기화 메커니즘
- 28.2.3.1.1
vehicle_local_position 토픽 업데이트 인터럽트에 의한 루프 깨우기(Wake-up) 로직
- 28.2.3.1.2
hrt_abstime 기반 정밀 델타 타임(dt) 계산 및 지터(Jitter) 보상
- 28.2.3.2. 입력 데이터 유효성(Validity) 및 타임아웃(Timeout) 검사
- 28.2.3.2.1 센서 데이터 지연(Latency) 발생 시 제어기 발산 방지용 데이터 폐기 로직
- 28.2.4. Commander 모듈과의 상태 동기화 프로토콜
- 28.2.4.1.
vehicle_control_mode.msg 기반의 제어 권한 위임 체계
- 28.2.4.1.1
flag_control_manual_enabled, flag_control_auto_enabled 플래그 파싱 및 검증
- 28.2.4.2. 상태 불일치(State Mismatch) 감지 및 비상 복구(Fallback) 통신 루프
- 28.3. Flight Task 프레임워크 객체 지향 설계 및 C++ 추상화
- 28.3.1.
FlightTask 기본 클래스(Base Class)의 템플릿 메서드 패턴(Template Method Pattern)
- 28.3.1.1.
updateInitialize(), update(), activate() 가상 함수(Virtual Function)의 생명주기
- 28.3.1.1.1
activate(): Task 전환 시 초기 상태 동기화 및 적분기(Integrator) 리셋 로직
- 28.3.1.1.2
updateInitialize(): 매 루프 센서/사용자 입력 데이터의 내부 버퍼 갱신 및 전처리
- 28.3.1.1.3
update(): 순수 가상 함수(Pure Virtual)에 가까운 핵심 Setpoint 연산 인터페이스
- 28.3.1.2. 공통 uORB 데이터 구독(Subscription) 및 캐싱(Caching) 멤버 구조
- 28.3.2. 파생 클래스(Derived Classes)의 계층적 상속 구조 및 알고리즘
- 28.3.2.1.
FlightTaskManual 상속 트리의 궤적 생성 알고리즘
- 28.3.2.1.1
FlightTaskManualPosition: 조종기 스틱 입력을 가속도 제한(Jerk-limited) 속도 명령으로 변환하는 동역학 모델
- 28.3.2.1.2
FlightTaskManualAltitude: Z축 스로틀 매핑 및 호버링(Hover) 추력 자동 보상 로직
- 28.3.2.2.
FlightTaskAuto 상속 트리의 자율 비행 알고리즘
- 28.3.2.2.1
FlightTaskAutoMapper: position_setpoint_triplet 수신 및 현재-다음 웨이포인트 간 보간(Interpolation)
- 28.3.2.2.2
FlightTaskAutoLine: Line-of-sight 추종, Cross-track 에러 최소화 및 L1 가이던스(L1 Guidance) 로직 적용
- 28.3.2.3. 특수 기동 및 비상 태스크 아키텍처
- 28.3.2.3.1
FlightTaskOrbit: 목표 반경(Radius) 유지 및 구심 가속도 연산을 위한 원운동(Circular Kinematics) 궤적 생성
- 28.3.2.3.2
FlightTaskFailsafe: GPS 상실 또는 데이터 링크 단절 시 위치 추정 에러를 고려한 안전 하강(Safe Descent) 모델
- 28.3.3. 메모리 최적화 및 인스턴스 라이프사이클 관리
- 28.3.3.1. 힙(Heap) 파편화 방지를 위한
task_union 메모리 정적 할당(Static Allocation) 모델
- 28.3.3.1.1 Placement
new 연산자를 활용한 고정 메모리 공간 내 객체 교체(Swap) 메커니즘
- 28.3.3.2. Flight Task 객체의 소멸자(Destructor) 처리 및 리소스 반환 안전성 검증
- 28.3.4. 출력 계층: Controller 층으로의 제어 목표(Setpoint) 하달
- 28.3.4.1.
trajectory_setpoint.msg 메시지 생성 및 패킹(Packing) 아키텍처
- 28.3.4.1.1 위치(Position), 속도(Velocity), 가속도(Acceleration), 저크(Jerk) 피드포워드(Feedforward) 데이터 융합
- 28.3.4.1.2 NaN(Not a Number) 처리를 통한 특정 축(Axis) 제어 무시(Ignore) 매커니즘 구현
- 28.4. 비행 모드 전환(Mode Transition) 및 상태 천이 제어
- 28.4.1. 전환 트리거(Trigger) 및 이벤트 처리 파이프라인
- 28.4.1.1. MAVLink 명령어(
MAV_CMD_DO_SET_MODE), RC 스위치, Offboard API 입력의 다중화기(Multiplexer)
- 28.4.1.2. Commander 내 State Machine의 모드 변경 요청 평가 및 수락/거부(Accept/Reject) 판별
- 28.4.2. 모드 활성화 전제 조건(Activation Pre-conditions) 엄격 검증
- 28.4.2.1.
estimator_status의 비트마스크(Bitmask) 플래그를 통한 센서 융합 신뢰도(Confidence) 확인
- 28.4.2.1.1 글로벌 위치(GPS), 로컬 위치(VIO), 고도(Baro/LiDAR) 데이터 유효성 조합 조건표 분석
- 28.4.2.2.
FlightTask::checkActivationConditions() 오버라이딩을 통한 모드별 커스텀 제약 조건 검사
- 28.4.3. 상태 천이 충격 완화: 스무딩(Smoothing) 및 범프리스 트랜스퍼(Bumpless Transfer)
- 28.4.3.1. 모드 스위칭 시 발생하는 제어 목표값(Setpoint)의 계단 현상(Step Change) 수학적 억제 기법
- 28.4.3.1.1 현재 기체 상태(Actual State)를 신규 모드의 초기 제어 목표로 강제 주입(Initialization Reset)
- 28.4.3.2. 위치 제어기 내부의 Slew Rate Limiter 및 궤적 생성기(Trajectory Generator) 동기화
- 28.4.3.2.1. Jerk 한계치(Limit) 초기화 및 최대 가속도 제약을 통한 구동기(Actuator) 포화(Saturation) 방지
- 28.4.4. 인플라이트(In-flight) 장애 발생 시 모드 강하(Mode Fallback) 보호 루틴
- 28.4.4.1. GPS 수신 불량(Jamming/Spoofing) 시 Position 모드에서 Altitude 또는 Stabilize 모드로의 자동 강하
- 28.4.4.2 센서 복구 시 지연 시간(Hysteresis Timer) 적용 및 이전 모드로의 안전 복귀(Auto-Recovery) 로직
- 28.5 uORB 제어 플래그(Control Flags)와 내부 컴포넌트 라우팅
- 28.5.1
vehicle_control_mode.msg 플래그 심층 해부
- 28.5.1.1
flag_control_position_enabled: 3D 공간 위치 제어기(Position Controller) 활성화 트리거
- 28.5.1.2
flag_control_velocity_enabled: 속도 제어 루프 진입 조건 및 로컬 프레임 매핑
- 28.5.1.3
flag_control_altitude_enabled: Z축 독립 제어 및 기압계/레이저 고도계 융합 제어 플래그
- 28.5.1.4
flag_control_attitude_enabled 및 flag_control_rates_enabled: 하위 자세/각속도 루프 바이패스(Bypass) 제어
- 28.5.2. 플래그 조합에 따른 다단(Cascade) PID 제어 루프의 동적 스위칭 아키텍처
- 28.5.2.1 위치 제어기(
mc_pos_control 등) 최상단에서 플래그를 해석하여 특정 PID 연산을 스킵(Skip)하는 최적화
- 28.5.2.2. Offboard 모드에서의 플래그 다이렉트 주입(Direct Injection) 및 제어 권한 탈취 메커니즘
- 28.5.3. 모드 상태 브로드캐스팅 및 GCS(Ground Control Station) 피드백 체계
- 28.5.3.1.
mavlink_messages.cpp 내 vehicle_status.nav_state의 MAVLink HEARTBEAT 직렬화(Serialization) 매핑
- 28.5.3.2. MAVLink
custom_mode 필드의 비트 시프트(Bit Shift) 연산 및 서브 모드(Sub-mode) 인코딩 방식
- 28.6. 기체 동역학 유형별(Vehicle Specific) 모드 아키텍처 분화
- 28.6.1. 멀티로터(Multicopter, MC): 전방위(Omnidirectional) 궤적 제어 중심의 모드 설계
- 28.6.1.1. 수평(XY) 제어와 수직(Z) 제어의 완전한 디커플링(Decoupling) 및 비동기 Setpoint 융합
- 28.6.1.2. 요(Yaw) 축의 독립적 궤적(Heading Setpoint) 생성과 회전익 고유의 브레이킹(Braking) 모션 제어
- 28.6.2. 고정익(Fixed-wing, FW): 에너지 보존 법칙 기반의 결합 제어(Coupled Control) 모드
- 28.6.2.1. TECS(Total Energy Control System)와 Flight Mode 간의 데이터 교환 추상화 한계성 분석
- 28.6.2.1.1. 피치(Pitch)와 스로틀(Throttle)을 고도(Altitude) 및 대기속도(Airspeed)로 매핑하는 역학적 종속성
- 28.6.2.2. 고정익 특화 이착륙 모드(Takeoff/Land)의 활주로(Runway) 상태 머신 및 플레어(Flare) 알고리즘
- 28.6.3. 수직이착륙기(VTOL): 듀얼 펌웨어 아키텍처 융합 및 천이(Transition) 모드 관리
- 28.6.3.1.
VtolAttitudeControl 모듈 내 멀티로터 제어 출력과 고정익 제어 출력의 가중치 믹싱(Weight Mixing) 알고리즘
- 28.6.3.2. 전방 천이(Front Transition) 및 후방 천이(Back Transition) 시의 비행 모드 상태 강제 동기화
- 28.6.3.3. 대기속도 센서 고장 시 VTOL 천이 중단(Abort) 및 MC 모드 강제 복귀(Fallback) 안전 루틴
- 28.7. 커스텀 비행 모드(Custom Flight Mode) 및 Task 확장을 위한 소스 코드 수정 지침서
- 28.7.1. 1단계: 신규 Navigation State 정의 및 uORB 통신망 구축
- 28.7.1.1.
vehicle_status.msg 내 NAVIGATION_STATE_CUSTOM_XXX 상수 할당 및 주석 규칙
- 28.7.1.2. uORB 메시지 생성 스크립트 빌드 과정 및 의존 모듈(Dependency) 갱신 절차
- 28.7.2. 2단계:
FlightTaskCustom 파생 클래스 템플릿 작성 및 물리 모델링
- 28.7.2.1. 디렉토리 생성(
src/modules/flight_mode_manager/tasks/Custom) 및 CMakeLists.txt 소스 등록
- 28.7.2.2.
initialize(), updateInitialize() 구현을 통한 커스텀 센서 데이터 수신 및 상태 검증
- 28.7.2.3.
update() 내 핵심 수학적 궤적 생성 로직 작성 및 _trajectory_setpoint 버퍼 출력 바인딩
- 28.7.3. 3단계: Commander 및 Flight Mode Manager에 신규 컴포넌트 등록 및 스위칭
- 28.7.3.1.
commander.cpp의 모드 유효성 검사 루틴(main_state_transition()) 내 신규 State 허용 조건 분기 추가
- 28.7.3.2.
FlightModeManager.cpp의 Switch-case 구문 내 _flight_tasks.switchTask(FlightTaskIndex::Custom) 인스턴스화
- 28.7.4. 4단계: MAVLink 인터페이스 연동 및 관제 시스템(GCS) UI 반영
- 28.7.4.1. PX4 펌웨어 내
mavlink_receiver.cpp의 MAV_CMD_DO_SET_MODE 파서(Parser) 수정 및 매핑
- 28.7.4.2. QGroundControl 백엔드 소스(
PX4FirmwarePlugin.cc)의 flightModes() 딕셔너리 수정을 통한 UI 모드 이름 노출 구현