Skip to content

Repository files navigation

Open-RMF — compiled images for ease of use

Open-source project, maintained and supported by Nexsoss. Licensed under Apache-2.0 — see LICENSE and NOTICE.

Pre-built, ready-to-run Docker images for the Open-RMF ecosystem: the ROS 2 simulation/fleet adapter stack, the REST API server, the web dashboard, and the RMF Site Editor.

Pick the branch that matches your ROS 2 distribution (e.g. branch lyrical for > ROS 2 lyrical). Each branch pins the matching ROS_DISTRO build-arg in the Dockerfiles.


Table of contents


Images are layered. Dockerfile.rmf is a shared base that compiles the core RMF packages from repos/rmf.repos. Dockerfile.rmf-sim and Dockerfile.rmf-api-server both derive from that base — they add only the apt/pip packages and build steps specific to their role. GUI/Qt/GL/X11/Gazebo packages and flask-socketio live in rmf-sim only; the api-server image is slimmer and has no GUI dependencies.

Four services come up under docker-compose. The first three are backend, the fourth is the web UI. All run headless; GUIs are launched separately on the host via rocker (see below).

Service Image built from Role
rmf-base docker/Dockerfile.rmf Shared base: ROS 2 + RMF core packages from rmf.repos. Build-only; never runs.
rmf-sim docker/Dockerfile.rmf-sim Base + Gazebo + Qt/GL/X11 + rmf_demos/rmf_simulation from rmf-sim.repos
zenoh-router eclipse/zenoh:... Zenoh router run from upstream zenoh image
api-server docker/Dockerfile.rmf-api-server rmf-webAPI server
rmf-web docker/Dockerfile.rmf-web-dashboard Static build of the rmf-dashboard-framework demo dashboard
rmf-site-editor(GUI) docker/Dockerfile.site-editor RMF Site Editor desktop; build-only, launched via rocker

A shared ./maps directory is mounted into rmf so that maps authored in the Site Editor (also written into ./maps) are visible to the simulator without any manual copying.


Prerequisites

On the host machine:

Clone the repo and switch to the branch matching your ROS distro:

git clone https://github.com/nexsoss/Open-RMF.git
cd Open-RMF
git checkout lyrical   # or whichever ROS 2 distro branch you need

Build

The whole stack is one command. docker compose build (or compose up --buildon first run) builds each image in dependency order. Because the derived images (rmf, api-server) depend on the base, build the base first or rely on Compose's dependency resolution:

docker compose -f docker-compose.local.yaml build rmf-base    # build the shared base explicitly (recommended)
docker compose -f docker-compose.local.yaml build             # then build the rest

To build only a subset:

docker compose -f docker-compose.local.yaml build rmf-sim        # just the RMF sim / fleet adapter image
docker compose -f docker-compose.local.yaml build rmf-api-server # just the REST API image
docker compose -f docker-compose.local.yaml build rmf-web        # just the dashboard image

The zenoh-router service pulls a prebuilt image.

Run

Add an empty directory to your path, so as to be able to mount the maps:

mkdir -p maps

Bring the whole stack up in the background:

docker compose -f docker-compose.local.yaml up -d

OR, if you want to use pre-built images -

docker compose up -d

This starts rmfzenoh-routerapi-serverrmf-web in the correct order.

To watch logs:

docker compose logs -f               # all services
docker compose logs -f rmf-sim       # just the RMF sim

Accessing the services

Service URL (from the host) Notes
rmf-web http://localhost:3000 Open-RMF web dashboard
rmf-api-server http://localhost:8000 REST API (FastAPI / uvicorn)
rmf-api-server ws://localhost:8080 WebSocket for live RMF state
zenoh-router (internal only — no published port) Zenoh router

Stop / tear down

docker compose down            # stop and remove containers + the network

Running GUI tools via rocker

GUI applications (RMF Site Editor, and Gazebo/RViz when visually debugging the simulation) are not part of docker-compose. They run on the host via rocker, which injects X11 / GPU configuration at container launch time. Compose stays clean and headless.

1. Install rocker (on the host, not inside any container)

sudo apt-get install python3-rocker
# or
pip install rocker

2. RMF Site Editor

The site-editor image is published as quay.io/nexsoss/open-rmf:rmf-site-editor. You can either pull the published image (recommended — no Rust toolchain needed) or build it locally.

Pull from quay.io and launch:

docker pull quay.io/nexsoss/open-rmf:rmf-site-editor

# Without an NVIDIA GPU:
rocker --x11 --user --volume ./maps:/root/site_maps \
    -- quay.io/nexsoss/open-rmf:rmf-site-editor

# With an NVIDIA GPU:
rocker --nvidia --x11 --user --volume ./maps:/root/site_maps \
    -- quay.io/nexsoss/open-rmf:rmf-site-editor

Or build locally

docker build -f docker/Dockerfile.site-editor \
    -t quay.io/nexsoss/open-rmf:rmf-site-editor .

# Then launch with rocker using the same image reference as above:
rocker --x11 --user --volume ./maps:/root/site_maps \
    -- quay.io/nexsoss/open-rmf:rmf-site-editor

Exported map files (.building.yaml / SDF) land in ./maps on the host.

3. Debugging Gazebo / RViz

rmf runs headless by default under compose. To visually debug Gazebo or RViz, launch the same image manually via rocker instead of changing anything in docker-compose.yaml.

docker pull quay.io/nexsoss/open-rmf:lyrical_rmf-sim

rocker --nvidia --x11 --user \
    --volume ./maps:/home/ws_rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps \
    -- quay.io/nexsoss/open-rmf:lyrical_rmf-sim \
    bash -c "source /opt/ros/lyrical/setup.bash && \
             source /home/ws_rmf/install/setup.bash && \
             ros2 launch rmf_demos_gz office.launch.xml headless:=0"

rocker flag reference

Flag Purpose
--x11 Forwards the host X server into the container automatically
--nvidia Injects NVIDIA driver libraries and GLX support for GPU rendering
--user Runs the container as your host UID/GID (avoids root-owned files)
--volume Mounts a host directory into the container

Notes & troubleshooting

  • rocker builds a temporary derived image on top of the one you pass in; your original image (e.g. rmf-site-editor:lyrical) is never modified.
  • docker-compose.yaml has no site-editor service and no X11 wiring on rmf — both are launched manually via rocker only when a GUI is actually needed.
  • rmf image patches rmf_visualization_schedule's visualization.launch.xml to set respawn="true" respawn_delay="2" on the schedule_visualizer_node. This is a workaround for upstream segfaults (open-rmf/rmf#546, open-rmf/rmf#637). The patch lives in the base (Dockerfile.rmf) because rmf_visualization is built from rmf.repos, not rmf-sim.repos.
  • Dashboard build pins specific versions of react, react-dom, and react-router via pnpm.overrides in Dockerfile.rmf-web-dashboard. If you upgrade rmf-web, re-check that those overrides are still needed.
  • API server pins for pydantic and asyncpg are intentionally relaxed to >= in Dockerfile.rmf-api-server. Keep an eye on this if you bump rmf-web.

About

Compiled Open-RMF images for ease of use, by Nexsoss

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors