18.3.3 다중 인스턴스(Multi-instance) 디바이스 관리 메커니즘

18.3.3 다중 인스턴스(Multi-instance) 디바이스 관리 메커니즘

상업용 및 군사용 드론 시장에서 요구하는 신뢰성 기준이 치솟으면서, 단일 센서에 의존하는 비행 제어 시스템은 도태되었다. 최신 PX4 기체(Pixhawk 4, Cube 등)들은 치명적인 하드웨어 결함에 대비해 3중 여분(Triple-redundant) IMU와 듀얼(Dual) GPS를 장착하는 것이 기본 설계로 자리 잡았다.

uORB 미들웨어는 이처럼 동일한 역할을 하는 여러 개의 하드웨어 장치들이 뿜어내는 데이터를 충돌 없이 독립적으로 수용하고 라우팅해야 하는 중대한 과제를 안게 되었다. 이를 해결하기 위한 핵심 아키텍처가 바로 다중 인스턴스(Multi-instance) 지원 메커니즘이다.

1. 단일 인스턴스의 치명적 한계: 데이터 덮어쓰기(Overwrite)

만약 2대의 GPS가 장착된 기체에서 다중 인스턴스 개념 없이 모두가 /obj/vehicle_gps_position 이라는 단일 토픽 경로를 향해 데이터를 복사(write)해 버린다면 어떤 일이 발생할까?

GPS 1번이 위도/경도를 쓰고 간 직후, 곧바로 GPS 2번이 자신의 데이터를 그 위에 덮어써 버릴 것이다. 링 버퍼(Ring Buffer) 내부는 두 센서의 미세하게 다른 오차 데이터가 믹서기처럼 섞이게 되고, 이를 가져다 쓰는 위치 추정기(EKF2)는 노이즈가 극심한 병든 데이터를 기반으로 필터를 수렴시키려다 결국 발산(Divergence)하여 기체를 추락시키게 된다.

2. orb_advertise_multi(): 넘버링(Numbering)을 통한 격리

이러한 데이터 트래픽의 믹싱(Mixing) 현상을 원천 차단하기 위해, 센서 드라이버들은 데이터를 발행할 때 기본 orb_advertise() 대신 orb_advertise_multi() 함수를 사용해야 한다.

이 함수는 토픽 메타데이터와 함께 int *instance 라는 인스턴스 포인터 변수를 추가로 넘겨받는다. uORBDeviceMaster가 이 요청을 수신하면 다음과 같은 마법을 부린다.

  1. 동적 인스턴스 할당: 먼저 VFS 트리를 뒤져 vehicle_gps_position 노드가 몇 개나 켜져 있는지 센다. 만약 아무것도 없다면 0을, 누군가 이미 개설해 두었다면 1을 할당한다. (PX4 설정에 따라 최대 ORB_MULTI_MAX_INSTANCES, 보통 4개까지 허용된다).
  2. 경로 스탬핑(Stamping): 할당된 번호를 토픽 이름 맨 뒤에 접미사로 결합하여 /obj/vehicle_gps_position0, /obj/vehicle_gps_position1 이라는 독립적인 가상 파일 경로 두 개를 각각 격리하여 뚫어준다.
  3. 반환: 방금 할당된 번호(0 또는 1)를 포인터를 통해 센서 드라이버에게 되돌려준다.

3. 다중 인스턴스의 구독과 센서 퓨전(Sensor Fusion)

이제 구독자인 추정기(Estimator, EKF2) 입장을 살펴보자. EKF 모듈은 시스템에 GPS가 몇 대 꽂혀 있는지 미리 알 턱이 없다.

따라서 EKF는 부팅 시 루프(Loop)를 돌며 orb_exists(ORB_ID(vehicle_gps_position), 0), orb_exists(..., 1) 함수를 차례대로 찔러본다. 만약 인스턴스 0번과 1번이 모두 살아 있다면, 두 경로에 대해 모두 orb_subscribe_multi()를 호출하여 두 개의 파일 디스크립터(fd0, fd1) 파이프를 열어둔다.

비행 중 EKF는 이 두 파이프에서 독립적으로 흘러나오는 GPS 1번과 2번의 시계열 데이터를 각각 읽어 들인다. 그리고 고도의 칼만 필터(Kalman Filter) 블렌딩(Blending) 알고리즘을 거쳐 어느 GPS 데이터가 더 신뢰할 만한지 가중치 투표(Voting)를 진행하고, 하나가 먹통이 되더라도 즉각적으로 다른 파이프로 넘어가(Fail-over) 생존력 높은 자율 비행을 이어나가게 된다.

결과적으로 uORB의 다중 인스턴스 설계는 이름 끝에 숫자 하나를 붙여 파일 경로를 분리하는 지극히 단순한 아이디어로 시작되었지만, 현대 무인기의 가장 통달해야 할 아성인 하드웨어 오류 내성(Fault-tolerance) 을 소프트웨어 미들웨어 단에서 완벽하게 뒷받침해 주는 눈부신 아키텍처적 승리라 평가할 수 있다.