18.1.1.2 발행-구독(Publish-Subscribe) 패턴 도입을 통한 논리적/시간적 디커플링(Decoupling)
강결합(Tight-coupling) 시스템이 가진 본질적인 한계를 타파하기 위해 PX4-Autopilot은 전역적인 메시지 버스(Message Bus)에 기반한 발행-구독(Publish-Subscribe, 이하 Pub-Sub) 패턴을 코어 아키텍처로 전면 도입하였다. uORB는 이 Pub-Sub 패턴을 구현한 구체적인 미들웨어의 이름이다.
Pub-Sub 패턴이 비행 제어 소프트웨어에 가져온 가장 위대한 혁신은, 시스템을 구성하는 태스크(Task)들 간의 연결 고리를 논리적(Logical) 이고 시간적(Temporal) 인 측면에서 완벽하게 분리(Decoupling)해 냈다는 점이다.
1. 논리적 디커플링 (Logical Decoupling)
논리적 디커플링은 “누가 데이터를 만들고, 누가 소비하는가?“에 대한 정보의 격리를 의미한다.
- 발행자(Publisher)의 입장:
센서 데이터(예: EKF2 필터가 뱉어내는 자세 추정값)를 생성하는 모듈은 자신의 메모리 버퍼를 채운 뒤, 단지vehicle_attitude라는 미리 약속된 이름의 토픽(Topic)으로 던지기만 하면 임무가 끝난다. 이 데이터를 제어기가 가져다 모터 출력을 낼 것인지, 로거(Logger) 모듈이 가져다 마이크로 SD 카드에 기록할 것인지, 혹은 텔레메트리 모듈이 MAVLink 패킷으로 변환해 지상 관제소(GCS)로 보낼 것인지 알 필요조차 없으며, 알 수도 없다. - 구독자(Subscriber)의 입장:
자세 제어기(Attitude Controller)는 단지vehicle_attitude토픽을 구독(Subscribe)한다. 현재 펌웨어가 이 자세 토픽을 정교한 EKF2(Extended Kalman Filter)를 통해 연산하여 올려주었는지, 구형 상보 필터(Complementary Filter)로 올렸는지, 혹은 외부 ROS 2 컴퓨터에서 VIO(Visual Inertial Odometry) 알고리즘이 연산하여 덮어썼는지 관심이 없다. 오직 구조체의 형태(struct vehicle_attitude_s)만 일치한다면 제어 알고리즘은 완벽하게 제 역할을 수행한다.
이러한 논리적 격리 덕분에, 개발자는 특정 알고리즘 모듈을 다른 모듈로 교체(Swapping)할 때 시스템의 다른 어떠한 부분도 재컴파일하거나 수정할 필요가 없다. 이는 PX4 생태계가 학계의 다양한 최신 연구 논문 알고리즘들을 거부감 없이 플러그인(Plug-in) 형태로 수용할 수 있는 기반이 되었다.
2. 시간적 디커플링 (Temporal Decoupling)
시간적 디커플링은 “언제 데이터를 쓰고, 언제 읽어갈 것인가?“에 대한 실행 속도와 블로킹(Blocking)의 분리를 의미한다.
비행 제어 시스템 내의 각 모듈은 고유한 최적의 동작 주파수(Frequency)를 갖는다.
- IMU 자이로 센서 데이터 리딩: 보통 1000Hz (1ms 주기)
- 자세 제어 루프(Attitude Control): 보통 400Hz (2.5ms 주기)
- GPS 데이터 업데이트: 보통 10Hz (100ms 주기)
만약 이들이 강결합되어 있다면, 빠른 모듈은 느린 모듈이 연산을 끝낼 때까지 대기(Wait)해야 하는 교착 상태에 빠지기 쉽다. 그러나 Pub-Sub 패턴에서 발행자와 구독자는 완전히 비동기적(Asynchronous) 으로 동작한다.
- Non-blocking 전송: 자이로 센서 드라이버는 1000Hz의 스피드로 uORB 토픽에 데이터를 무자비하게 덮어쓴다(Overwrite). 로거(Logger) 모듈이 파일 시스템 IO의 병목으로 인해 잠시 느려져서 데이터를 못 가져가더라도, 센서 드라이버는 단 1마이크로초도 기다려주지 않고 자신의 제 속도를 유지한다.
- 최신 데이터(Latest Data) 보장: 자세 제어 루프가 400Hz로 깨어날 때마다, uORB에서 즉시 꺼내보는 데이터는 “가장 최근에 업데이트된 싱싱한 데이터“이다. 만약 이전 주기와 비교하여 새 데이터가 없다면 기존 데이터를 재사용하거나, 데이터 타임아웃(Timeout) 징후로 판단하여 안전 모드(Failsafe)로 즉시 전환할 수 있는 판단력(Temporal Awareness)을 가지게 된다.
결과적으로 uORB의 도입은 수십 개의 독립적인 무한 루프 스레드(while(1))들이 각자의 생체 리듬(Hz)에 맞춰 돌아가게 만듦으로써, 전체 드론 시스템이 낼 수 있는 CPU 코어 리소스의 병렬 처리 응답성을 극한까지 끌어올렸다.