MAVSDK-Python 프로그래밍 완벽 가이드 [제3편]: 리모트 통신을 위한 MAVSDK Server 구축
안녕하세요! 자율비행 드론 제어 및 애플리케이션 개발에 매진하고 계신 대학생, 그리고 연구원 여러분 환영합니다.
지난 시간까지 우리는 MAVSDK-Python의 기본 개념을 익히고, 로컬 환경에서 드론을 이륙시키는 간단한 맛보기 코드를 실행해 보았습니다. 하지만 실제 연구실 환경이나 필드 테스트를 상상해 봅시다. 무거운 3D 시뮬레이터(Gazebo, ROS 등)나 실제 PX4 비행 제어기(FC)는 고성능 리눅스 PC나 드론 내부의 컴패니언 컴퓨터(Companion Computer)에서 실행되고, 여러분이 코드를 작성하고 제어하는 환경은 윈도우 노트북이나 별도의 워크스테이션일 확률이 높습니다.
이렇게 “드론(또는 시뮬레이터)이 있는 컴퓨터”와 “Python 코드가 실행되는 컴퓨터”가 서로 다를 때, 우리는 어떻게 통신해야 할까요?
이번 **[제3편: 리모트 통신을 위한 MAVSDK Server 구축]**에서는 바로 이러한 원격 제어 환경을 완벽하게 세팅하기 위해, 통신의 중추 역할을 하는 **’MAVSDK Server’**를 직접 빌드하고 연동하는 전문적인 과정을 아주 상세히 알아보겠습니다.
1. 왜 MAVSDK Server가 필요한가요? (통신 아키텍처의 이해)
MAVSDK-Python 스크립트는 드론(PX4)과 직접 UDP 통신을 하여 명령을 내리는 구조가 아닙니다. 그 중간에는 반드시 MAVSDK Server라는 C++ 기반의 백엔드(Backend) 프로그램이 존재하여 통신을 중계합니다.
기본적으로 System() 클래스를 생성하여 await drone.connect()를 실행하면, Python 라이브러리가 사용자 몰래 백그라운드에서 이 mavsdk_server를 자동 실행해 줍니다.
하지만 원격 컴퓨터에서 드론을 제어하려면 다음과 같은 구조로 통신망을 수동 설정해 주어야 합니다.
- 사용자의 노트북 (Python 스크립트 실행): 내부 네트워크를 통해 리눅스 PC(MAVSDK Server)의 **gRPC 포트(50051)**로 접속합니다.
- 리눅스 PC (MAVSDK Server + PX4 시뮬레이터): MAVSDK Server는 윈도우 노트북으로부터 gRPC 명령을 받아, 내부의 PX4 비행 제어기와 **UDP 포트(14540)**로 통신하며 실제 MAVLink 명령을 전달합니다.

즉, 리눅스 장비(드론 측)에 언제든 외부 접속을 받아줄 수 있는 ‘독립적인 MAVSDK Server’를 항상 띄워두어야 한다는 뜻입니다. 자, 그럼 지금부터 리눅스 환경에 접속하여 이 서버를 직접 만들어보겠습니다!
2. MAVSDK Server 직접 빌드하기
이 작업은 PX4 시뮬레이터나 실제 드론이 연결되어 있는 리눅스(Ubuntu) 컴퓨터에서 수행해야 합니다. 코어 서버는 C++로 작성되어 있으므로 소스 코드를 다운로드하여 직접 컴파일(빌드)하는 과정을 거칩니다.
1️⃣ 필수 의존 패키지 설치
먼저 터미널을 열고, 빌드에 필요한 C++ 컴파일러와 gRPC, 프로토콜 버퍼(protobuf) 등의 필수 라이브러리를 설치합니다. 이 과정은 시스템에 통신 인프라를 구축하는 기초 공사입니다.
sudo apt update && sudo apt upgrade -y
sudo apt install -y cmake ninja-build g++ git \
protobuf-compiler libprotobuf-dev \
libgrpc++-dev libgrpc-dev \
libssl-dev curl unzip
2️⃣ MAVSDK C++ 소스 코드 다운로드
의존성 설치가 끝났다면, MAVSDK의 핵심 C++ 소스 코드를 GitHub에서 다운로드합니다. --recursive 옵션을 반드시 주어 하위 모듈까지 빠짐없이 받아야 합니다.
cd ~
git clone https://github.com/mavlink/MAVSDK.git --recursive
cd MAVSDK
3️⃣ CMake 설정 (핵심 포인트!)
기본적으로 MAVSDK 라이브러리를 빌드할 때 서버(Server) 기능은 제외된 상태로 설정되어 있습니다. 따라서 우리는 cmake 명령어를 통해 서버 기능을 켜주어야 합니다. 옵션에 -DBUILD_MAVSDK_SERVER=ON이 들어가는 것을 꼭 확인하세요.
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_MAVSDK_SERVER=ON -Bbuild/default -S.
4️⃣ 병렬 빌드 수행
구성이 완료되었으면 실제 컴파일을 진행합니다. 소스 코드가 방대하므로 -j8 (CPU 코어 8개 사용) 옵션을 주어 병렬로 빠르게 빌드합니다. 사용하시는 컴퓨터의 사양에 따라 -j4 등으로 조절하셔도 됩니다.
cmake --build build/default -j8
빌드가 100% 완료될 때까지 잠시 기다려 주세요. ☕
5️⃣ 빌드 결과물 확인 및 이동
빌드가 성공적으로 끝나면 실행 파일이 생성됩니다. 이 파일을 리눅스 시스템 어디에서나 쉽게 실행할 수 있도록 /usr/local/bin 폴더로 복사해 줍니다.
sudo cp ~/MAVSDK/build/default/src/mavsdk_server/src/mavsdk_server /usr/local/bin/
이제 터미널에 mavsdk_server -p 50051을 입력해 보세요. 오류 없이 실행된다면 여러분은 완벽하게 MAVSDK Server를 구축하신 겁니다!
3. 연구의 질을 높이는 팁: Server 자동 실행 (systemd 설정)
매번 드론 실험을 할 때마다 리눅스 PC 터미널을 열고 mavsdk_server를 타이핑하는 것은 연구원들에게 매우 번거로운 일입니다. 리눅스의 데몬 관리자인 systemd를 활용하면, 컴퓨터가 켜질 때마다 백그라운드에서 자동으로 서버가 실행되도록 만들 수 있습니다. 이 과정은 선택 사항이지만 강력히 추천합니다.
터미널에서 아래 명령어를 입력하여 새로운 서비스 파일을 생성합니다.
sudo nano /etc/systemd/system/mavsdk_server.service
에디터 창이 열리면 아래의 내용을 그대로 복사하여 붙여넣습니다. (참고: User=$USER 부분은 그대로 두거나, 오류가 발생하면 여러분의 실제 리눅스 로그인 계정명으로 변경하세요.)
[Unit]
Description=MAVSDK Server
After=network.target
[Service]
ExecStart=/usr/local/bin/mavsdk_server -p 50051
Restart=always
User=$USER
[Install]
WantedBy=multi-user.target
작성이 끝났으면 Ctrl+O, Enter를 눌러 저장하고, Ctrl+X를 눌러 에디터를 빠져나옵니다. 그 후 아래 세 줄의 명령어로 서비스를 시스템에 등록하고 활성화합니다.
sudo systemctl daemon-reload
sudo systemctl enable mavsdk_server
sudo systemctl start mavsdk_server
이제 이 리눅스 컴퓨터는 365일 언제나 외부의 원격 접속을 받아들일 준비가 끝났습니다!
4. 원격지에서 Python으로 드론 접속하기
서버 구축이 모두 끝났습니다. 이제 여러분의 **윈도우 노트북(또는 외부 컴퓨터)**으로 돌아와서 Python 코드를 작성할 차례입니다.
코드를 작성할 때 가장 주의해야 할 점은 연결 설정 부분입니다. 이전에는 drone.connect(system_address="udp://:14540")를 사용했지만, 원격 접속 시에는 MAVSDK Server가 이미 UDP 통신을 담당하고 있으므로 Python은 gRPC로 서버에만 접속하면 됩니다.
아래의 예제 코드를 작성해 봅시다. IP 주소는 MAVSDK Server가 설치된 리눅스 PC의 IP로 반드시 변경해 주셔야 합니다.
import asyncio
from mavsdk import System
async def run():
# 💡 핵심: 내부의 mavsdk_server를 실행하지 않고, 원격 서버의 gRPC(50051) 포트로 접속!
# "172.21.77.220" 부분을 반드시 여러분의 리눅스 PC IP 주소로 변경하세요.
drone = System(mavsdk_server_address="172.21.77.220", port=50051)
# system_address 매개변수는 생략합니다. (서버가 이미 UDP 14540으로 통신 중이므로 자동 감지)
print("원격 리눅스 PC의 MAVSDK Server에 연결을 시도합니다...")
await drone.connect()
# 드론 연결 상태를 실시간으로 모니터링
print("드론(SITL)의 응답을 기다리는 중...")
async for state in drone.core.connection_state():
if state.is_connected:
print("✅ 축하합니다! 원격 드론에 성공적으로 연결되었습니다!")
break
# 여기에 이륙(Takeoff), 텔레메트리(Telemetry) 등의 임무 코드를 추가하시면 됩니다.
if __name__ == "__main__":
asyncio.run(run())
코드를 실행했을 때 성공 메시지가 출력된다면, 드론의 통신 병목이나 시뮬레이터의 물리적 한계를 벗어나 자유로운 원격 연구가 가능해진 것입니다!

만약 연결에 실패하거나 콘솔에 Connection failed: Invalid connection URL 등의 에러가 발생한다면, 리눅스 PC의 방화벽 설정(포트 50051 개방)을 확인하거나 IP 주소가 정확한지 점검해 보시기 바랍니다.
마무리하며
이번 제3편에서는 심화된 드론 연구 환경을 구축하기 위해 필수적인 리모트 통신용 MAVSDK Server 직접 빌드 방법과 자동 실행(systemd) 설정, 그리고 Python 연동법까지 세밀하게 다루어 보았습니다.
이제 여러분은 어떤 제약적인 하드웨어 환경에서도 유연하게 드론과 통신할 수 있는 인프라를 갖추게 되었습니다. 하드웨어와 서버, 통신 설정이라는 거대한 산을 성공적으로 넘으신 것을 축하드립니다!
다음 **[제4편]**에서는 드론을 프로그래밍 방식으로 완벽히 제어하기 위해 반드시 넘어야 할 산, 파이썬의 핵심 비동기 문법인 “asyncio”의 이해에 대해 아주 쉽고 깊이 있게 알아보도록 하겠습니다.
진행하시면서 막히는 부분이나 궁금한 점이 있다면 언제든 댓글을 남겨주세요. 연구원 여러분의 성공적인 비행을 응원합니다. 감사합니다!

Author: maponarooo, CEO of QUAD Drone Lab
Date: March 3, 2026
