안녕하세요! 오늘은 고성능 물리 엔진과 Unity 그래픽을 결합하여 강화학습 및 제어 연구에 널리 쓰이는 드론 시뮬레이터, Flightmare의 구축 과정을 정리해 보려 합니다. UZH(취리히 연대)의 **RPG(Robotics and Perception Group)**는 드론 연구 분야에서 세계 최고의 권위를 자랑하는 연구실입니다. 이들이 개발한 Flightmare는 단순한 시뮬레이터를 넘어, 실제 드론의 기동을 완벽하게 재현하기 위해 고안된 강력한 툴체인입니다. 의존성 문제가 까다로운 시뮬레이터인 만큼, Docker를 활용해 환경을 격리하고 빌드하는 효율적인 방법을 소개합니다.
1. 도입: 왜 Flightmare인가?
비전 기반의 드론 자율 주행 연구에서 가장 큰 난관은 '현실과 시뮬레이션 사이의 간극(Sim-to-Real Gap)'입니다. 취리히 연대의 **RPG(Robotics and Perception Group)**는 이 문제를 해결하기 위해 Flightmare를 공개했습니다.
Flightmare는 다음과 같은 독보적인 특징을 가집니다:
- 고속 렌더링: Unity 엔진을 활용해 초당 수천 프레임의 센서 데이터를 생성합니다.
- 유연성: 강화학습(RL)을 위한 병렬 시뮬레이션과 제어 알고리즘 검증을 위한 ROS 연동을 동시에 지원합니다.
- 물리적 정교함: RPG 그룹의 축적된 노하우가 담긴 flightlib을 통해 실제 기체의 동역학을 정교하게 모사합니다.
이번 포스팅에서는 이 강력한 시뮬레이터를 Docker를 통해 가장 깔끔하게 구축하는 방법을 공유합니다.
2. 시스템 요구 사항 및 의존성 규격 (Tech Specs)
Flightmare 빌드 성공의 90%는 버전 맞춤에 있습니다. 아래 규격을 반드시 확인하세요.
2.1 OS 및 미들웨어
| 구분 | 필수 규격 | 비고 |
| Operating System | Ubuntu 18.04 LTS (Bionic Beaver) | 20.04 이상은 별도의 가상화 권장 |
| ROS Distribution | Melodic Morenia | Catkin 빌드 시스템 기반 |
| CUDA / cuDNN | CUDA 11.1 / cuDNN 8.x | NVIDIA GPU 가속 필수 |
| Catkin Tools | python3-catkin-tools | catkin_make보다 catkin build 권장 |
2.2 Python 환경 규격 (Virtual Env)
flightmare의 강화학습 엔진인 FlightRL은 아래 명시된 패키지 버전을 정확히 요구합니다.
| 패키지명 | 버전 | 역할 |
| Python | 3.6.x | 시스템 기본 python3 버전 준수 |
| Tensorflow | 1.15.0 (1.8.0 이상 2.0.0 미만) | RL 모델 학습 및 추론 엔진 |
| OpenAI Gym | 0.11.0 | 강화학습 환경 인터페이스 |
| Stable Baselines | 2.10.1 | PPO 등 강화학습 알고리즘 구현체 |
| NumPy | 1.19.5 (1.20 미만 권장) | 수치 계산 라이브러리 |
| ruamel.yaml | < 0.16 | 설정 파일 로드용 |
2.3 C++ 및 시스템 라이브러리 규격
C++ 기반의 물리 엔진인 flightlib 빌드를 위해 아래 도구들의 버전이 중요합니다.
| 도구명 | 요구 사항 | 비고 |
| CMake | 3.10.0 이상 | 빌드 자동화 도구 |
| GCC/G++ | 7.5.0 이상 | C++11/14/17 표준 지원 필수 |
| ZeroMQ (ZMQ) | libzmq3-dev, libzmqpp-dev | Unity와 ROS 간 초고속 통신 담당 |
| OpenCV | 3.2.0 (Ubuntu 18.04 기본값) | 이미지 처리 및 센서 데이터 처리 |
| GLPK | libglpk-dev | MPC(모델 예측 제어) 최적화용 |
🛠️ 빌드 시 주의사항 (Troubleshooting Tips)
- Catkin Build 환경: Flightmare는 catkin_make 대신 **catkin build**를 사용하도록 설계되었습니다. catkin-tools를 사용하면 패키지별 격리 빌드가 가능하여 의존성 충돌을 방지할 수 있습니다.
- Pybind11 이슈: flightlib을 Python에서 불러오기 위해 pybind11을 사용합니다. 빌드 과정에서 GIT_TAG를 v2.6.1 이상으로 설정해야 최신 컴파일러와의 호환성 문제가 발생하지 않습니다.
- 가상환경(venv) 필수: 시스템의 Python 패키지와 충돌을 피하기 위해 반드시 .venv를 생성하고 pip install을 진행하세요. catkin build 시에도 가상환경이 활성화된 상태여야 Python 바인딩이 정확한 경로에 설치됩니다.
3. Docker를 활용한 개발환경 구축
3.1 Dockerfile 작성
NVIDIA GPU 가속과 GUI 출력을 완벽하게 지원하는 ubuntu18.04_cuda.Dockerfile을 생성합니다.
FROM nvidia/cuda:11.1.1-cudnn8-devel-ubuntu18.04
ENV DEBIAN_FRONTEND=noninteractive
RUN ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime && echo Asia/Seoul > /etc/timezone
# 2. GUI 및 OpenGL을 위한 필수 환경 변수 설정
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES graphics,utility,compute,display
# 3. 그래픽 드라이버 라이브러리 설치 (GLX 에러 방지)
RUN apt-get update
RUN apt-get install -y --no-install-recommends python3
RUN apt-get install -y --no-install-recommends \
lsb-release \
build-essential \
curl \
gnupg2 \
cmake \
sudo \
git \
vim \
wget \
unzip \
tmux \
ntp \
whois \
locales \
iproute2 \
net-tools \
python3-tk \
python3-dev \
python3-venv \
python3-empy \
python3-catkin-pkg \
ca-certificates \
libglpk-dev \
libzmq3-dev \
libzmqpp-dev \
libopencv-dev \
libgoogle-glog-dev \
libgflags-dev \
libglvnd0 \
libgl1 \
libglx0 \
libegl1 \
libgles2 \
mesa-utils && \
rm -rf /var/lib/apt/lists/*
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
RUN /bin/bash -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' && \
apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
# Installing ROS Melodic
RUN apt-get update
RUN apt-get install -y --no-install-recommends python-pip
RUN apt-get install -y --no-install-recommends \
python3-pip \
python3-catkin-tools python3-tk \
python-pyqt5 python-pyqt5.qtquick \
python-qt4 \
python-pyside \
ros-melodic-desktop-full \
ros-melodic-octomap-msgs \
ros-melodic-octomap-ros \
ros-melodic-joy ros-melodic-py-trees \
ros-melodic-qt-gui-py-common \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get install -y --no-install-recommends libgl1-mesa-dri libxcursor1 libxrandr2 libxinerama1 libxi6 libxss1 mesa-utils
RUN pip3 install --upgrade setuptools && \
pip3 install \
rosdistro \
rospkg \
rosdep \
rosinstall \
rosinstall-generator \
wstool \
vcstool
# Installing catkin tools
RUN rosdep init || true && rosdep update
RUN echo "source /opt/ros/melodic/setup.bash" >> /root/.bashrc && \
echo "source /root/workspace/catkin_ws/flightmare_ws/devel/setup.bash" >> /root/.bashrc && \
echo "export FLIGHTMARE_PATH=/root/workspace/catkin_ws/flightmare_ws/src/flightmare" >> /root/.bashrc && \
echo "alias svenv='source /root/workspace/catkin_ws/flightmare_ws/src/flightmare/.venv/bin/activate'" >> /root/.bashrc
# 최종 작업 디렉토리
WORKDIR /root/workspace/catkin_ws/flightmare_ws/src/flightmare/
SHELL ["/bin/bash", "-c"]
3.2 도커 이미지 빌드
sudo docker build --no-cache --force-rm -t ros:ubuntu18.04_cuda -f ubuntu18.04_cuda.Dockerfile .
3.3 컨테이너 실행
xhost +local:docker
sudo docker run -it --rm \
--name flightmare \
--hostname swift \
--network host \
--gpus all \
-e DISPLAY=$DISPLAY \
--privileged \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /home/swift/workspace:/root/workspace \
ros:ubuntu18.04_cuda /bin/bash
4. Flightmare 단계별 빌드 절차
Flightmare는 크게 **C++ 기반의 엔진(flightlib)**과 **Python 인터페이스(flightrl)**로 나뉩니다.
4.1 소스 코드 및 의존성 관리, ROS 연동 빌드(Catkin)
#flightmare 빌드
cd ~
mkdir -p ~/workspace/catkin_ws/flightmare_ws/src
cd ~/workspace/catkin_ws/flightmare_ws/src
git clone https://github.com/uzh-rpg/flightmare.git
sed -i 's|git@github.com:|https://github.com/|g' flightmare/flightros/dependencies.yaml
vcs import < flightmare/flightros/dependencies.yaml
#flightlib 빌드
cd ~/workspace/catkin_ws/flightmare_ws/src/flightmare
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip setuptools wheel
pip install gym==0.11
pip install numpy
pip install "ruamel.yaml<0.16"
pip install scikit-build
pip install opencv-python-headless==4.5.5.64
pip install "tensorflow>=1.8.0,<2.0.0"
pip install cloudpickle joblib matplotlib pandas
pip install stable-baselines==2.10.1 --no-deps
pip install cmake
cd ~/workspace/catkin_ws/flightmare_ws/src/flightmare/flightlib
sed -i 's/GIT_TAG master/GIT_TAG main/g' cmake/gtest_download.cmake
sed -i 's/GIT_TAG master/GIT_TAG v2.6.1/g' cmake/pybind11_download.cmake
pip install . --no-deps -v
deactivate
#flightmare 빌드
cd ~/workspace/catkin_ws/flightmare_ws/
catkin config --init --mkdirs --extend /opt/ros/$ROS_DISTRO --merge-devel --cmake-args -DCMAKE_BUILD_TYPE=Release
catkin build
echo "source ~/workspace/catkin_ws/flightmare_ws/devel/setup.bash" >> ~/.bashrc
echo "export FLIGHTMARE_PATH=~/workspace/catkin_ws/flightmare_ws/src/flightmare" >> ~/.bashrc
source ~/.bashrc
#flightrl 빌드
cd ~/workspace/catkin_ws/flightmare_ws/src/flightmare
source .venv/bin/activate
cd flightrl
pip install . --no-deps -v
deactivate
5. 실행 및 결과 확인
5.1 Unity 렌더러 가동
Flightmare의 그래픽 엔진은 Unity로 구현되어 있습니다. 최신 바이너리를 다운로드합니다.
wget https://github.com/uzh-rpg/flightmare/releases/latest/download/RPG_Flightmare.tar.xz
압축을 해제하고 실행합니다.
tar -xvf RPG_Flightmare.tar.xz
cd RPG_Flightmare
./RPG_Flightmare.x86_64

5.2 강화학습(RL) 시뮬레이션 실행
훈련된 모델이 Unity 화면 상에서 드론을 어떻게 제어하는지 확인할 수 있습니다.
cd ~/workspace/catkin_ws/flightmare_ws/src/flightmare/flightrl
source ~/workspace/catkin_ws/flightmare_ws/src/flightmare/.venv/bin/activate
export PYTHONPATH=$PYTHONPATH:$(pwd)
cd examples
python3 run_drone_control.py --train 0 --render 1
deactivate
시뮬레이션 실행후 학습 결과를 아래와 같이 나타내 줍니다.

5.3 ROS 연동 실행
Gazebo 물리 엔진과 Unity 그래픽 엔진을 연동하여 제어 알고리즘을 테스트합니다.
cd ~/workspace/catkin_ws/flightmare_ws/
catkin build flightros -DBUILD_SAMPLES:=ON
bash
roslaunch flightros rotors_gazebo.launch
6. 마치며
RPG 그룹의 Flightmare는 드론 연구의 생산성을 한 차원 높여주는 도구입니다. Docker를 활용한 이번 가이드가 시뮬레이션 환경 구축으로 고생하시는 많은 연구자분께 도움이 되길 바랍니다.
핵심 요약:
- RPG Flightmare는 고성능 Unity 기반 드론 시뮬레이터다.
- Docker를 사용해 ROS Melodic 및 그래픽 환경을 격리 구축할 수 있다.
- **flightlib(C++)**과 **flightrl(Python)**의 의존성을 정확히 맞춰주는 것이 빌드의 핵심이다.
'엔지니어링 > 프로그래밍' 카테고리의 다른 글
| [Flightmare 시리즈 3] 드론 자율비행, ROS 기반 Waypoint 비행 구현 (0) | 2026.01.18 |
|---|---|
| [Flightmare 시리즈 2] Docker 환경에서 C++ 프로젝트와 Unity 연동하기 (Standalone Build) (0) | 2026.01.18 |
| GIT 명령어를 사용하여 remote에 프로젝트 업로드 (0) | 2023.12.30 |
| Github.io 블로그 만들기(3) - Jekyll에 테마 적용하기 (0) | 2023.01.26 |
| Github.io 블로그 만들기(2) - Local 서버 설정 (0) | 2023.01.26 |
댓글