110 lines
3.4 KiB
Plaintext
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" ]
|