Files
2026-08-03 16:37:10 +08:00

110 lines
3.4 KiB
Plaintext

# Gazebo Harmonic + Betaflight SITL simulation container
# Provides a complete simulation environment for testing Betaflight firmware
# without physical hardware.
#
# Communication:
# SITL ←→ Gazebo via UDP (ports 9002/9003)
# SITL ←→ Configurator via TCP/WebSocket (port 5761/6761)
# SITL ←→ RC input via UDP (port 9004)
FROM ubuntu:24.04
ENV DEBIAN_FRONTEND=noninteractive
# Base tools
RUN apt-get update && \
apt-get install -y --no-install-recommends \
locales \
git \
ca-certificates \
curl \
wget \
sudo \
bash \
bash-completion \
nano \
btop \
build-essential \
cmake \
pkg-config \
clang-18 \
python3 \
python3-pip \
python3-websockify \
&& rm -rf /var/lib/apt/lists/*
# Generate locale
RUN sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
locale-gen
ENV LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8
# Install cppzmq before Gazebo repo (needed for gz-transport linking)
RUN apt-get update && \
apt-get install -y --no-install-recommends cppzmq-dev && \
rm -rf /var/lib/apt/lists/*
# Install Gazebo Harmonic from OSRF packages
RUN curl -fsSL https://packages.osrfoundation.org/gazebo.gpg | \
dd of=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg && \
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable noble main" | \
tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null && \
apt-get update && \
apt-get install -y --no-install-recommends \
gz-harmonic \
libgz-sim8-dev \
libgz-plugin2-dev \
libgz-math7-dev \
libgz-transport13-dev \
libgz-msgs10-dev \
&& rm -rf /var/lib/apt/lists/*
# Betaflight firmware build dependencies (for SITL target)
RUN apt-get update && \
apt-get install -y --no-install-recommends \
python-is-python3 \
libblocksruntime-dev \
xxd \
&& rm -rf /var/lib/apt/lists/*
# Set clang alternatives
RUN update-alternatives --install /usr/bin/clang clang /usr/bin/clang-18 100 && \
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-18 100
# Reuse Ubuntu's default user (UID/GID 1000) or create devpod
ARG USERNAME=devpod
RUN if id -u 1000 >/dev/null 2>&1; then \
EXISTING=$(id -nu 1000) && \
usermod -l $USERNAME -d /home/$USERNAME -m $EXISTING 2>/dev/null || true && \
groupmod -n $USERNAME $(id -gn 1000) 2>/dev/null || true; \
else \
groupadd --gid 1000 $USERNAME && \
useradd --uid 1000 --gid 1000 -m $USERNAME --shell /bin/bash; \
fi && \
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER $USERNAME
# Clone and build the Betaflight Gazebo bridge plugin
ARG AEROLOOP_REF=a6c16d2d653932a96ced279522ba39b6da15f78c
RUN git clone --branch gz https://github.com/betaflight/aeroloop_gazebo.git /home/$USERNAME/aeroloop_gazebo && \
cd /home/$USERNAME/aeroloop_gazebo && \
git checkout "$AEROLOOP_REF" && \
cd plugins && \
mkdir build && cd build && \
cmake .. && \
make -j$(nproc)
# Set Gazebo environment for aeroloop models and plugins
ENV SDF_PATH="/home/$USERNAME/aeroloop_gazebo/models"
ENV GZ_SIM_RESOURCE_PATH="/home/$USERNAME/aeroloop_gazebo/worlds"
ENV GZ_SIM_SYSTEM_PLUGIN_PATH="/home/$USERNAME/aeroloop_gazebo/plugins/build"
WORKDIR /workspace
# Default: start bash (user launches SITL + Gazebo manually)
CMD [ "bash" ]