### 0.0.1 PX4의 독립 프로세스 모듈 및 uORB IPC 방식 vs Ardupilot의 `AP_GPS` 백엔드 라이브러리 스레드 직접 폴링 방식

### 0.0.1 PX4의 독립 프로세스 모듈 및 uORB IPC 방식 vs Ardupilot의 AP_GPS 백엔드 라이브러리 스레드 직접 폴링 방식

드라이버가 GPS 데이터를 메모리로 끌어올렸다면, 그다음 과제는 이 데이터를 목 빠지게 기다리고 있는 융합 알고리즘(EKF)에게 어떻게 전달할 것인가다. 이 프로세스 간 통신(Inter-Process Communication, IPC) 구조는 두 펌웨어의 아키텍처 철학이 가장 극명하게 나뉘는 전쟁터다.

0.1 PX4의 ‘화성에서 온’ uORB (Publish / Subscribe IPC)

PX4 생태계는 지독할 만큼 철저한 비동기 출판-구독(Publish/Subscribe) 패턴인 uORB (Micro Object Request Broker) 통신망 위에 세워져 있다. ROS(Robot Operating System)의 토픽(Topic) 통신 구조를 떠올리면 정확하다.

  • 블라인드 인터페이스(Blind Interface): src/drivers/gps 모듈 데몬은 시리얼 포트에서 파싱을 끝낸 좌표 데이터를 sensor_gps 라는 상자(Topic)에 담아 uORB 우체국에 던져놓고(Publish) 곧바로 자기 할 일(다음 바이트 읽기)을 하러 돌아간다. 이 데이터 상자를 누가 가져가서 어떻게 쓰는지, 심지어 아무도 안 가져가는지조차 GPS 드라이버는 전혀 알지 못한다.
  • 비동기적 우아함: 반대편에 있는 EKF2 모듈 역시 GPS 모듈이 존재하는지 모른다. 그저 uORB에 sensor_gps 토픽이 활성화되면 구독(Subscribe)하여 최신 데이터를 빼갈 뿐이다. 이러한 완벽한 분리(Decoupling) 덕분에, 개발자는 손쉽게 기존 GPS 드라이버를 꺼버리고 완전히 새로운 커스텀 외부(External) 애플리케이션을 만들어 sensor_gps 토픽을 강제로 허위 발행(Spoofing)하는 시뮬레이션 환경을 10초 만에 구축할 수 있다. 소스 코드 의존성이 0(Zero)에 수렴하기 때문이다.

0.2 Ardupilot의 ‘금성에서 온’ AP_GPS (객체 지향적 폴링 및 직접 참조)

Ardupilot은 uORB 같은 광역 메시지 버스를 두는 것을 자원 낭비(Overhead)이자 추적하기 어려운 복잡성으로 간주하는 전통적인 임베디드 시각을 견지해 왔다. 그 결과물은 강력한 C++ 객체 지향(OOP) 백엔드 라이브러리 직접 폴링(Direct Polling) 구조다.

  • 포인터 주소 공유: 루트 스케줄러를 관장하는 메인 클래스는 AP_GPS 라는 거대한 GPS 관리자 싱글톤(Singleton) 객체의 포인터를 참조하고 있다. 그리고 자신에게 할당된 사이클(update()) 구동 시점에 정확히 이 포인터를 타고 들어가 1번 수신기와 2번 수신기의 상태를 묻는다(Polling).
  • 동기적 확정성(Deterministic): 데이터를 가져오는 행위 자체가 철저히 타이머 기반의 스케줄러 시간표에 종속되어 있다. 따라서 어떤 메모리를 언제 읽고 쓰는지 개발자가 눈으로 따라가기(Tracing) 매우 명료하다.
  • 데이터를 얻기 위해 PX4처럼 uORB 미들웨어를 거쳐 락(Lock)을 걸고 메시지를 복사(Copy)하는 복잡한 과정이 생략된다. 그저 메모리 공간의 변수 주소를 직접 읽어버리면 그만이다. 이는 극한의 실행 속도와 메모리 절약을 가져온다. 그러나 반대급부로 AP_GPS 라이브러리의 구조가 바뀌면 메인 알고리즘 소스 코드 여러 곳에 컴파일 에러가 터지는 강한 결합도(Tight Coupling)를 감수해야 한다.

0.3 통신 오버헤드(Overhead)와 유지보수성의 스펙트럼

PX4의 메시지 패싱(Message Passing) 과 Ardupilot의 메모리 셰어링(Memory Sharing) 은 컴퓨터 공학 IPC 역사상 가장 오래된 라이벌이다.

  • PX4는 매번 구조체를 복사해야 하는 미세한 uORB CPU 오버헤드를 지불하는 대신, 60~70개가 넘는 다양한 모듈들이 마치 레고 블록처럼 손쉽게 떼었다 붙였다 할 수 있는 거대한 범용 생태계의 기틀을 마련했다.
  • Ardupilot은 이러한 중간 상인을 모두 잘라내어 C++ 객체 참조의 속도와 결정론(Determinism)을 확보함으로써, 상대적으로 낮은 스펙의 마이크로컨트롤러(MCU)에서도 신뢰할 수 있고 꽉 짜인(Tightly Integrated) 극단의 퍼포먼스를 뽑아내는 방향으로 진화해 온 것이다.