Docker Services¶
AirStack's robot stack is containerized using Docker Compose. The compose files live under robot/docker/ and are organized into a base layer shared by all targets and profile-specific services for each deployment target.
File Structure¶
robot/docker/
├── robot-base-docker-compose.yaml # Shared base service definition
├── docker-compose.yaml # Platform-specific service definitions
└── .bashrc # Bash config mounted into every container
Service Hierarchy¶
All robot services inherit from the shared robot_base service defined in robot-base-docker-compose.yaml. Platform-specific services then extend robot_base and override only what differs for that target.
robot_base (robot-base-docker-compose.yaml)
│
├── robot-desktop (profile: desktop) x86-64 desktop / simulation
│ └── simple-robot (profile: simple) desktop + simple sim override
│ └── robot-test (profile: test) desktop + colcon test override
│
├── robot-voxl (profile: voxl) ModalAI VOXL platform
├── robot-l4t (profile: l4t) NVIDIA Jetson (Linux for Tegra)
└── zed-l4t (profile: l4t) ZED camera driver on Jetson
Base Service (robot_base)¶
robot_base provides defaults that every robot container shares:
| Aspect | Details |
|---|---|
| GPU access | NVIDIA GPU reserved via the deploy.resources section |
| Display | DISPLAY, QT_X11_NO_MITSHM, and X11 socket mounted for GUI tools |
| Source tree | The entire AirStack/ repo is bind-mounted at /root/AirStack inside the container |
| ROS workspace | common/ros_packages is mounted into the ROS 2 workspace src/common |
| Shell config | .bashrc and inputrc are bind-mounted so the developer experience is consistent across rebuilds |
| Bags | robot/bags/ is mounted at /bags for recording and playback |
| Launch variables | All *_LAUNCH_PACKAGE / *_LAUNCH_FILE environment variables are forwarded from the host .env file |
Platform Profiles¶
Select a profile by passing --profile <name> to docker compose (or via the airstack CLI).
desktop — x86-64 development machine¶
This is the DEFAULT profile as specified by COMPOSE_PROFILES=desktop in the root level .env file. It will run by default if no profile is passed or with airstack up --profile desktop. Use this profile when developing or running simulations on an x86-64 Linux workstation.
- Image:
...:v<TAG>_robot-x86-64_<MODE> - Base image:
nvidia/cuda:13.0.2-base-ubuntu22.04 - Network: isolated
airstack_networkbridge (prevents conflicts with other developers on the same LAN) - SSH: host ports
2223–2243forwarded to port22in each container, one port per robot replica - Scaling:
NUM_ROBOTSenv var controls the number of replicas (default: 1) - Robot identity: derived from the Docker container name →
ROBOT_NAME_SOURCE=container_name - Auto-launch: controlled by
AUTOLAUNCH(default:true); starts atmuxsession that runs the ROS 2 launch file
simple — desktop + simple simulator¶
Runs with airstack up --profile simple. Extends desktop with SIM_TYPE=simple, intended for the lightweight built-in simulator.
voxl — ModalAI VOXL¶
Runs with airstack up --profile voxl. Use this profile when deploying on a ModalAI VOXL flight computer.
- Image:
...:v<TAG>_robot-voxl_<MODE> - Base image:
ubuntu:22.04(no CUDA; VOXL has its own compute stack) - Skipped components: OpenVDB, MACVO, TensorRT
- Network:
host(relies on the physical network for DDS discovery) - Robot identity: derived from the device hostname →
ROBOT_NAME_SOURCE=hostname
l4t — NVIDIA Jetson (Linux for Tegra)¶
Runs with airstack up --profile l4t. Use this profile when deploying on an NVIDIA Jetson device running L4T.
- Image:
...:v<TAG>_robot-l4t_<MODE> - Base image:
nvcr.io/nvidia/l4t-jetpack:r36.4.0 - Network:
host - IPC:
host(needed for shared-memory DDS transports on Jetson) - Storage:
/media/airlab/Storage/airstack_collectionmounted at/bags - Robot identity: derived from the device hostname →
ROBOT_NAME_SOURCE=hostname
A companion service zed-l4t (also under the l4t profile) runs only the ZED stereo camera driver in a separate container, keeping camera drivers isolated from the main autonomy stack.
test — CI / colcon test runner¶
Extends desktop but overrides the container command to run colcon test and exit with the test result code. Useful in CI pipelines.
Environment Variables¶
Key variables are set in the project's .env file and forwarded into the container:
| Variable | Description |
|---|---|
DOCKER_IMAGE_TAG |
Image version tag |
DOCKER_IMAGE_BUILD_MODE |
Build mode (e.g. release, dev) |
PROJECT_DOCKER_REGISTRY |
Docker registry prefix |
PROJECT_NAME |
Project / image name |
NUM_ROBOTS |
Number of robot replicas (desktop only, default 1) |
AUTOLAUNCH |
Whether to auto-start the ROS 2 stack on container start (default true) |
ROBOT_LAUNCH_PACKAGE / ROBOT_LAUNCH_FILE |
Top-level ROS 2 launch target |
OFFBOARD_BASE_PORT / ONBOARD_BASE_PORT |
MAVLink UDP port base values (desktop/sim only) |
ROBOT_NAME_MAP_CONFIG_FILE |
YAML mapping config used to resolve a name to ROBOT_NAME and ROS_DOMAIN_ID (default: default_robot_name_map.yaml) |
See Robot Identity for how ROBOT_NAME and ROS_DOMAIN_ID are derived automatically inside the container from these profiles.