### 0.0.1 다중 인스턴스(Multi-instance) 퍼블리싱: ORB_ID(sensor_gps)의 인스턴스 0번(Primary)과 1번(Secondary) 할당 로직
상업용 매핑(Mapping) 드론이나 정밀 농업용 방제 드론은 단일 GPS의 고장(Failure)이나 전파 교란(Jamming)에 대비하여, 기체의 전방과 후방에 각각 1대씩 총 2대(Dual)의 GPS 수신기를 장착하는 것이 표준 설계가 되었다.
PX4의 uORB 아키텍처는 이러한 다중 센서 하드웨어를 소프트웨어 단에서 충돌 없이 우아하게 수용하기 위해 다중 인스턴스(Multi-instance) 퍼블리싱 메커니즘을 지원한다. 한 지붕(ORB_ID(sensor_gps)) 아래 여러 세입자(Instance 0, 1, 2…)가 고유 문패를 달고 동거하는 구조를 파헤친다.
0.1 인스턴스(Instance)의 개념과 동적 할당
PX4 커맨드 라인(CLI)에서 사용자가 gps start -d /dev/ttyS0 명령으로 첫 번째 드라이버를 띄우고, 곧이어 gps start -d /dev/ttyS1을 입력하여 두 번째 드라이버 스레드를 띄웠다고 가정하자. 두 스레드는 완전히 독립된 메모리 공간에서 각자의 직렬 포트를 파싱하지만, 파싱이 끝난 뒤 데이터를 쏘아 올릴 uORB 토픽의 이름은 sensor_gps로 완전히 동일하다.
단일 인스턴스 구조였다면 후발 주자가 선발 주자의 데이터를 무참히 덮어쓰겠지만(Overwrite), uORB는 orb_advertise_multi()라는 특별한 포스터(Advertiser) 함수를 제공한다.
- 첫 번째 스레드가
orb_advertise_multi함수를 호출하며 “빈방 있나요?” 묻는다. uORB 코어는 비어있는인스턴스 0번(Primary) 슬롯의 핸들을 쥐여 준다. - 두 번째 스레드가 호출하면, uORB는 0번 방이 찼음을 확인하고
인스턴스 1번(Secondary) 핸들을 내어준다. - 이로써 각 스레드는 자신이 0번인지 1번인지 자신의 ’인스턴스 번호’를 자각하게 되며, 이후
orb_publish()호출 시 이 핸들을 제출하여 자신만의 전용 슬롯을 평화롭게 업데이트한다.
0.2 Primary와 Secondary의 철학적 차이 부재(Absence)
여기서 매우 중요한 PX4 아키텍처의 설계 철학이 드러난다. 드라이버 계층에서는 **“어느 것이 Primary(메인)이고 어느 것이 Secondary(서브)인가?”**라는 가치 판단을 절대 하지 않는다.
- 단지 운영체제 부팅 시 스크립트에 의해 먼저 코드가 실행된 놈이 0번 인스턴스 슬롯을 우연히 선점했을 뿐이다.
- 인스턴스 0번이라고 해서 무조건 데이터의 품질(HDOP)이 좋거나 기체의 조종석에 가까운 메인 GPS라는 보장은 코드 어디에도 존재하지 않는다.
- 드라이버의 임무는 그저 파싱된 바이트를 구조체에 담아 자신이 배정받은 슬롯(0번 또는 1번)에 성실히 밀어 넣는 기능 노동(Blue-collar) 역할로 제한된다.
0.3 블렌딩(Blending) 모듈로의 위임(Delegation)
그렇다면 두 인스턴스(0번과 1번)가 동시에 퍼블리싱되고 있을 때, 과연 EKF2 추정기는 누구의 말을 들어야 할까? 이 가치 판단(White-collar)의 역할은 드라이버 계층을 완전히 벗어난 EKF2 모듈의 융합 매니저(Fusion Manager) 에게 위임되어 있다.
- 구독자(Subscriber)인 EKF2 모듈 내부의 GPS 선택 로직은 부팅 시
orb_exists(ORB_ID(sensor_gps), 0)과orb_exists(..., 1)을 확인하여 두 개의 센서가 살아서 고동치고 있음을 파악한다. - 이후 EKF2는 두 인스턴스의 데이터를 모두 구독(Subscribe)한다. 그리고 두 데이터의
eph(수평 오차),epv(수직 오차), 위성 개수(satellites_used), Jamming 지수 등을 벤치마킹하여 실시간으로 더 퀄리티가 좋은 인스턴스를 동적으로 Primary로 승격시켜(Dynamic Selection) 칼만 필터에 인입시키거나, 두 데이터를 가중 평균 내는 GPS Blending 알고리즘을 수행한다.
결과적으로 uORB의 다중 인스턴스 할당 로직은, “데이터의 수집(드라이버)“과 “데이터의 평가(추정기)“를 물리적인 uORB 토픽 배열을 통해 완벽하게 이격(Separation of Concerns)시킴으로써, 기체의 고장 내성(Fault Tolerance)을 극대화하는 소프트웨어 아키텍처의 찬란한 결실이다.