35.1.2. 다계층(Multi-tier) 소프트웨어 아키텍처: 코어(Core), 백엔드(Backend), 프론트엔드(Frontend) 계층 분리
드론 비행 제어 및 지상 관제 시스템(GCS) 영역에서 로직의 모듈화(Modularity)는 시스템 안정성과 이식성을 결정짓는 가장 중요한 아키텍처 지표이다. MAVSDK는 PX4-Autopilot 생태계 내에서 MAVLink 통신을 단순히 래핑(Wrapping)하는 수준을 넘어, 코어(Core), 백엔드(Backend), 그리고 프론트엔드(Frontend)로 철저히 분리된 다계층(Multi-tier) 아키텍처를 채택하였다. 본 절에서는 이러한 계층 분리가 무인 항공기(UAS) 소프트웨어 엔지니어링 관점에서 어떠한 이점을 제공하는지 분석한다.
1. 3계층(3-Tier) 아키텍처 모티프 및 설계 배경
MAVLink 기반의 비행 제어기 연동 스크립트는 과거 단일 언어(일반적으로 Python 또는 C++) 플랫폼에 강하게 종속되는 단일 계층(Monolithic) 구조를 띠었다. 이는 iOS 도우미 앱, Android 관제 시스템, 또는 데이터 사이언스를 위한 Python 환경 등 각기 다른 프로그래밍 환경마다 복잡한 MAVLink 파서를 재작성해야 하는 중복 투자를 초래하였다.
MAVSDK는 C++17 기반의 공통 통신 라이브러리(Core)를 중심축으로 삼고, 그 위를 구글의 gRPC 프레임워크 기반 프록시(Backend)로 덮은 뒤, 그 껍데기를 다시 각 프로그래밍 언어의 래퍼(Frontend)로 제공하는 우아한 3계층 해법을 고안했다.
graph TD
subgraph Frontend Layer
PY[Python Client]
SW[Swift Client]
JV[Java Client]
end
subgraph Backend Layer
GRPC[gRPC Server<br/>Protocol Buffers IDL]
end
subgraph Core Layer
SYS[System Manager]
MAV[MAVLink 2.0 Parser]
UDP[UDP/TCP/Serial I/O]
end
PX4[PX4-Autopilot <br/>Firmware v1.14.x]
PY -->|HTTP/2| GRPC
SW -->|HTTP/2| GRPC
JV -->|HTTP/2| GRPC
GRPC -->|C++ Native Call| SYS
SYS --> MAV
MAV --> UDP
UDP <-->|MAVLink Packets| PX4
2. 코어 계층 (Core Layer): 하드웨어 타이머와 MAVLink 제어
코어 계층은 MAVSDK의 가장 깊숙한 심장부로서, C++17 표준으로 고안된 네이티브 라이브러리 형식(libmavsdk.so 등)으로 구동된다.
여기서는 gRPC 통신이나 상위 비즈니스 로직에 대한 어떠한 정보도 가지지 않는다. 오직 다음과 같은 저수준 유한 상태 머신(FSM)과 I/O 블로킹 처리만을 담당한다.
- 포식스(POSIX) 소켓/시리얼 I/O 스레딩: UART, UDP, TCP 채널에 대한 하드웨어 입력 인터럽트 및 폴링(Polling) 루프를 전담한다.
- MAVLink 2.0 무결성: 수신된 바이트 열을 MAVLink 헤더, 페이로드로 스캐닝(Scanning)하며 SHA-256 서명 검증 및 CRC 확인 로직을 수행한다.
- 플러그인 매니저(Plugin Manager): Action, Mission, Telemetry 등 20여 종의 엑세스 플러그인을 독립적 메모리 공간에 적재(Load)하여 동적 다형성(Polymorphism)을 확보한다.
3. 백엔드 계층 (Backend Layer): gRPC 로컬 루프백 호스팅 및 언어 중립성
백엔드 계층의 주된 목표는 “언어 중립적(Language-agnostic) 통신 브릿지“의 수행이다. MAVSDK 코어를 동적 링킹(Dynamic Linking) 방식으로 품은 채로, 백엔드 서버 프로그램(mavsdk_server)이 OS 백그라운드 프로세스로 구동된다.
- 로컬 호스트(Localhost) 바인딩: 백엔드 서버는 일반적으로
localhost:50051포트에 gRPC 서버를 개방한다. - 프로토콜 버퍼(Protobuf) 메시지 브로커: 코어에서 추출한 텔레메트리 데이터(예: \vert Attitude \vert 구조체)를 프로토콜 버퍼의 이진 포맷으로 직렬화(Serialization)하여 HTTP/2 스트리밍으로 프론트엔드로 밀어 넣는다(Push).
- 마이크로 트랜잭션 수위 조절: 프론트엔드의 명령(예: 이동 명령)이 지나치게 고주파수로 들어올 경우, 백엔드 서버 측 큐에서 트래픽을 정돈하여 코어의 링 버퍼 오버플로우를 보호한다.
4. 프론트엔드 계층 (Frontend Layer): 객체 지향적 API 래퍼
프론트엔드 계층은 실제 GCS 개발자나 영상 처리, 딥러닝 엔지니어가 직접 마주하는 소프트웨어 환경이다. 언어별(Python, Swift, Java, C#)로 제공되는 라이브러리를 pip_install 등의 패키지 매니저로 설치하여 구동한다.
이 계층의 코드는 내부적으로 아무런 하드웨어 통신을 하지 않는다. 모든 함수 내부 구현(Implementation)은 gRPC 클라이언트 스텁(Stub)을 거쳐 백엔드에 원격 프로시저 호출(RPC)을 발생시킬 뿐이다.
파이썬 생태계에서는 프론트엔드가 비동기 구조(asyncio)와 문맥 관리자(async for) 패턴을 사용하여, 블로킹 없이 다수의 기체(Swarm) 텔레메트리를 구독하는 코루틴(Coroutine) 시뮬레이션 환경을 완벽히 제공한다.
5. 결론 및 3계층 아키텍처의 확장성(Scalability) 시사점
결론적으로 MAVSDK가 채택한 다계층(Multi-tier) 아키텍처는 초기 설정 과정에서 mavsdk_server 데몬 프로세스를 구동해야 한다는 약간의 운영 오버헤드를 수반한다. 그러나 그 대가로 Ardupilot 환경에서 극복하기 힘들었던 크로스 컴파일(Cross-compiling) 부담의 경감, 동시성(Concurrency) 성능의 대폭 향상, 그리고 시스템 이식의 무한한 확장성을 확보해냈다. 특히, 단일 에지 컴퓨터(Raspberry Pi) 내에서 프론트엔드(Python 객체 인식 알고리즘)와 백엔드(통신)를 분리하여 CPU 코어 할당량(Affinity)을 조정하는 방식의 고급 파이프라인 설계가 가능해졌다는 점은 현대 딥러닝 기반 자율 비행 시스템 아키텍처에 있어 기념비적인 성과이다.