21.8. 응용 설계: 다중 상태(FSM) 기반 페이로드 자동 제어 모듈 개발

21.8. 응용 설계: 다중 상태(FSM) 기반 페이로드 자동 제어 모듈 개발

지금까지 우리는 PX4 시스템의 심장부를 이루는 네 가지 핵심 기둥을 마스터했다.

  1. ModuleBase를 통한 데몬 스레드 구동 체계
  2. ModuleParams를 통한 QGC 커스텀 파라미터 조작
  3. WorkQueue를 통한 락프리(Lock-free) 주기적 타이머 스케줄링
  4. uORB를 통한 빛의 속도의 센서/이벤트 비동기 통신

그렇다면 이 강력한 무기들을 어떻게 조합해야 실전에서 돈이 되는(Commercial) ’쓸만한 모듈’을 만들어낼 수 있을까?
이 장에서는 단순히 LED를 깜빡이는 수준을 넘어서, 실제로 산업용 드론에 탑재할 법한 **“지능형 페이로드(Payload) 투하 자동 제어 모듈”**을 처음부터 끝까지 설계하고 구현해 볼 것이다.

1. 시나리오: 자동 방제/구호물자 투하 드론 탑재 모듈

우리가 만들 커스텀 모듈(payload_autodrop)의 동작 요구사항은 다음과 같다.

  • 임무: 드론이 특정 고도와 특정 GPS 좌표(목표 지점)에 도달하면, 기계식 서보(Servo) 모터를 움직여 방제약(또는 구호물자)의 밸브를 자동으로 연다.
  • 안전 조건: 드론의 비행 모드가 반드시 ‘Auto(자동 비행)’ 상태여야 하며, ’이륙(Takeoff)’이 완전히 끝난 공중 상태에서만 밸브가 열려야 한다. (지상에서 약이 새는 것을 방지)
  • 사용자 조작: QGroundControl(QGC)에서 언제든지 파라미터를 바꿔 목표 고도(Drop Altitude)와 투하 지속 시간(Drop Duration)을 라이브로 변경할 수 있어야 한다.

이러한 복잡한 요구사항을 엉성한 if-else 문의 나열로 코딩하면, 언젠가 비행 모드를 바꾸는 순간 약이 거꾸로 쏟아지는 재앙이 발생한다.
복잡한 상태를 안전하고 예측 가능하게 제어하기 위해 시스템 공학의 꽃, 유한 상태 기계(Finite State Machine, FSM) 아키텍처를 우리의 C++ 모듈 뼈대 위에 이식할 것이다.

2. 모듈 아키텍처의 밑그림

이 복합 모듈 하나를 완성하기 위해, 우리는 앞서 배운 지식들을 아래와 같이 입체적으로 조립할 것이다.

  1. 입력 통신망 (uORB Subscription)
  • 기체의 현재 위치, 고도가 필요하다: vehicle_local_position_s 토픽 구독
  • 현재 비행 모드와 시동 상태가 필요하다: vehicle_status_s 토픽 구독
  1. 출력 통신망 (uORB Publication)
  • 서보 모터를 징징 움직여야 한다: actuator_controls_s 또는 vehicle_command_s 토픽 발행
  1. 내부 두뇌 (FSM & WorkQueue)
  • ScheduledWorkItem을 상속받아 50Hz(20ms) 주기로 FSM 두뇌를 깨워 현재 상태를 평가한다.
  1. 사용자 인터페이스 (ModuleParams)
  • TARGET_ALT(투하 고도), DROP_SEC(투하 시간) 파라미터를 정의하고 실시간으로 조율한다.

설계도는 완벽하게 그려졌다. 이제 백지상태의 소스 코드에서 시작하여 이 인공지능 모듈에 생명을 불어넣는 첫 단계, ’실시간 입력 토픽 해석’과 ’안전한 상태 천이(State Transition) 조건’을 21.8.1장에서부터 세밀하게 파헤쳐보자.