MAVSDK-Python 프로그래밍 완벽 가이드 [제2편]: MAVSDK-Python 개발 환경 설정
안녕하세요! 자율비행 연구와 드론 애플리케이션 개발에 매진하고 계신 대학생, 연구원 여러분. 지난 1편에서는 MAVSDK의 개념과 프로그래밍을 위한 기초 전제 조건들을 가볍게 살펴보았습니다.
이전 시간에 우리는 pip3 install mavsdk라는 간단한 명령어로 패키지를 설치하고 가상 드론을 띄워 보았습니다. 하지만 실제 연구 환경에서는 **라즈베리파이(Raspberry Pi)나 젯슨 나노(Jetson Nano)**와 같은 ARM 기반의 임베디드 보드에 환경을 구축하거나, **Windows 노트북에서 Linux 서버에 구동된 시뮬레이터를 원격으로 제어(Remote Control)**해야 하는 등 훨씬 복잡한 상황을 마주하게 됩니다.
따라서 이번 **[제2편: MAVSDK-Python 개발 환경 설정]**에서는 단순한 패키지 설치를 넘어, 소스 코드를 직접 복제하여 빌드하는 방법과 원격 제어의 핵심인 **’MAVSDK Server’**를 직접 구축하고 연동하는 전문적인 과정을 친절하고 상세하게 안내해 드리겠습니다.
자, 그럼 본격적으로 연구 환경을 탄탄하게 다져볼까요?
1. MAVSDK-Python 소스 코드 기반 개발 환경 구축
단순히 라이브러리를 사용하는 것을 넘어 내부 코드를 분석하거나 커스텀 기능을 추가해야 하는 연구원이라면, GitHub 저장소에서 소스 코드를 직접 받아 빌드하는 방식을 추천합니다.
터미널을 열고 아래의 단계별 명령어를 차근차근 따라 해 보세요.
① Git 저장소 복제 및 필수 패키지 설치
먼저 MAVSDK-Python 코드를 다운로드하고 의존성 패키지를 설치합니다. gRPC 통신에 필요한 프로토콜 버퍼(protobuf) 플러그인도 함께 설정합니다.
# MAVSDK-Python Git 저장소 복제 (서브모듈 포함)
cd ~
git clone https://github.com/mavlink/MAVSDK-Python --recursive
cd MAVSDK-Python
# 프로토콜 버퍼 플러그인 필수 구성 요소 설치
cd proto/pb_plugins
pip3 install -r requirements.txt
cd ../..
# 개발 및 실행에 필요한 Python 패키지 설치
pip3 install -r requirements.txt -r requirements-dev.txt
② gRPC 코드 생성 및 아키텍처 설정
MAVSDK는 내부적으로 gRPC 통신을 사용합니다. 이를 위해 .proto 파일로부터 파이썬 코드를 생성하는 과정이 필요합니다.
# 코드 생성 스크립트 실행
./other/tools/run_protoc.sh
💡 연구원 팁 (임베디드 보드 사용자): 만약 여러분이 젯슨 나노나 라즈베리파이와 같은 ARM 임베디드 컴퓨터에 환경을 구축 중이라면, 환경 변수를 명시해 주어야 합니다. 일반 PC(x86_64) 사용자는 이 단계를 건너뛰셔도 좋습니다.
# 64비트 ARM OS(Ubuntu 20.04 64bit 등)를 사용하는 경우
export MAVSDK_SERVER_ARCH=aarch64
# 32비트 ARM OS를 사용하는 경우는 armv7l 을 입력합니다.
③ 라이브러리 빌드 및 설치 확인 마지막으로 파이썬 라이브러리를 빌드하고 시스템에 설치합니다. -e 옵션을 주어 개발자 모드(Editable mode)로 설치하면 소스 코드를 수정할 때마다 즉시 반영되어 연구 개발에 매우 유리합니다.
python3 setup.py build
pip3 install -e .
# 정상적으로 설치되었는지 버전 및 정보 확인
pip3 show mavsdk
2. MAVSDK의 심장, ‘mavsdk_server’의 통신 원리 이해
환경 구축을 마쳤다면, 이제 코드가 어떻게 드론과 통신하는지 그 ‘속사정’을 알아야 합니다.
MAVSDK-Python은 파이썬 스크립트가 직접 드론(PX4)과 UDP 통신을 하는 구조가 아닙니다. 그 중간에는 반드시 **mavsdk_server**라는 C++ 기반의 백엔드(Backend) 프로그램이 존재합니다.
- Python 스크립트는 내부적으로
mavsdk_server와 gRPC (기본 포트: 50051) 방식으로 통신합니다. - **
mavsdk_server**는 이 명령을 받아 MAVLink 메시지로 변환한 뒤, 드론(PX4 시뮬레이터 또는 실제 기체)과 UDP (기본 포트: 14540) 방식으로 통신합니다.

1편에서 작성했던 맛보기 코드 중 await drone.connect(system_address="udp://:14540")를 떠올려 보세요. 파이썬 코드에서 System() 클래스를 생성할 때 매개변수를 비워두면, 파이썬 라이브러리가 백그라운드에서 알아서 mavsdk_server -p 50051을 실행시켜 줍니다. 덕분에 우리는 복잡한 서버 구동 과정을 신경 쓰지 않고 편하게 프로그래밍할 수 있었던 것입니다.
3. 리모트 통신을 위한 MAVSDK Server 직접 구축하기
하지만 연구를 하다 보면 파이썬 스크립트가 실행되는 컴퓨터와 시뮬레이터(SITL)가 구동되는 컴퓨터가 다를 때가 많습니다. 예를 들어, 무거운 3D 시뮬레이터인 ROS/Gazebo는 고성능 리눅스 데스크톱에서 돌리고, 자율비행 알고리즘 제어 코드는 개발자의 윈도우 노트북에서 실행하고 싶은 경우입니다.
이럴 때는 파이썬이 자동으로 서버를 띄워주기를 기대할 수 없으므로, 리눅스 환경에 독립적인 MAVSDK Server를 직접 빌드하여 띄워두어야 합니다. 과정이 조금 길지만, 한 번 구축해 두면 원격 제어 연구에 엄청난 자유도를 줍니다.
① 필수 의존 패키지 설치
서버는 C++로 작성되어 있으므로 다양한 컴파일러와 라이브러리가 필요합니다.
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
② MAVSDK C++ 소스 코드 다운로드 및 CMake 설정
여기서는 Python 래퍼가 아닌, 코어 모듈인 MAVSDK C++ 저장소를 다운로드합니다. 기본적으로 서버 기능은 꺼져 있기 때문에 CMake 옵션에서 -DBUILD_MAVSDK_SERVER=ON을 반드시 추가해야 합니다.
git clone https://github.com/mavlink/MAVSDK.git --recursive
cd MAVSDK
# CMake 구성 (mavsdk_server 빌드 활성화)
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DBUILD_MAVSDK_SERVER=ON -Bbuild/default -S.
③ 병렬 빌드 및 실행 파일 이동
빌드 시간을 단축하기 위해 CPU 코어를 여러 개(-j8) 사용하여 컴파일을 진행합니다. 빌드가 완료되면 터미널 어디서든 실행할 수 있도록 파일을 /usr/local/bin으로 복사합니다.
# 8개의 CPU 코어를 사용하여 병렬 빌드
cmake --build build/default -j8
# 시스템 디렉터리로 복사
sudo cp ~/MAVSDK/build/default/src/mavsdk_server/src/mavsdk_server /usr/local/bin/
이제 터미널에 mavsdk_server -p 50051이라고 입력하면 단독으로 서버가 실행되는 것을 확인할 수 있습니다!
4. 편의성을 위한 MAVSDK Server 자동 실행 (systemd 설정)
매번 드론을 테스트할 때마다 터미널을 열어 서버를 수동으로 켜는 것은 번거롭습니다. 리눅스의 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일 언제든 외부의 파이썬 코드를 받아들일 준비가 끝났습니다!
5. 원격 환경에서 Python 코드 연동 테스트
서버 구축이 끝났으니, 이제 원격 컴퓨터(예: 여러분의 노트북)에서 파이썬 코드를 작성하여 리눅스 PC의 드론을 제어해 보겠습니다.
코드를 작성할 때 가장 중요한 차이점은 System() 클래스 초기화 방식입니다. 파이썬이 로컬에서 자체적으로 서버를 띄우지 않고, 우리가 방금 구축한 리눅스 서버의 IP 주소로 접속하도록 명시해야 합니다.
import asyncio
from mavsdk import System
async def run():
# 💡 핵심 포인트: 원격 MAVSDK Server의 IP와 포트(gRPC)를 지정합니다.
# 예시 IP "172.21.77.220" 부분을 여러분의 리눅스 PC IP로 변경하세요.
drone = System(mavsdk_server_address="172.21.77.220", port=50051)
# 서버에 연결을 시도합니다. (내장 서버를 자동 실행하지 않음)
await drone.connect()
print("원격 MAVSDK 서버를 통해 드론과 연결 중입니다...")
# 드론 통신 상태 점검
async for state in drone.core.connection_state():
if state.is_connected:
print("-- 원격 드론 연결 성공!")
break
# 간단한 연결 테스트이므로 여기서 종료
print("-- 테스트를 종료합니다.")
if __name__ == "__main__":
asyncio.run(run())
스크립트를 실행했을 때 “– 원격 드론 연결 성공!” 메시지가 뜬다면, 여러분은 윈도우/맥/리눅스를 넘나들며 공간의 제약 없이 자유롭게 드론을 제어할 수 있는 완벽한 아키텍처를 완성하신 것입니다!
마치며
이번 2편에서는 전문적인 연구 개발을 위해 필수적인 MAVSDK-Python 소스 기반 환경 구축부터, 통신의 중추 역할을 하는 mavsdk_server의 원리와 리모트 통신 구축법까지 꽤 깊이 있는 내용들을 다루어 보았습니다.
이 환경 설정 과정이 다소 길고 에러를 만날 수도 있지만, 자율비행 드론의 통신 구조(gRPC와 UDP)를 이해하고 네트워크를 자유자재로 다룰 수 있게 되는 매우 가치 있는 시간이었을 것입니다.
이제 완벽한 무대(개발 환경)가 세팅되었으니, 본격적인 연기를 펼칠 차례입니다. 다음 **[제3편: Python ‘asyncio’ 완벽 이해 및 주요 클래스 알아보기]**에서는 MAVSDK 프로그래밍의 핵심 문법인 비동기 프로그래밍(asyncio)과 다양한 제어 라이브러리(Telemetry, Action 등)에 대해 알기 쉽게 파헤쳐 보겠습니다.
질문이나 오류가 발생했다면 언제든 댓글로 남겨주세요. 다음 편에서 뵙겠습니다. 감사합니다!

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