Installation — Docker (Recommended)
Docker provides a reproducible SRB environment with Isaac Sim 6.1.0 and Isaac Lab 3.0.0.
1. Clone the Repository
Clone SRB with its submodules:
git clone --recurse-submodules https://github.com/AndrejOrsula/space_robotics_bench.git
cd space_robotics_bench
Without submodules, clone normally and initialize asset repos from a Hugging Face mirror:
git clone https://github.com/AndrejOrsula/space_robotics_bench.git
cd space_robotics_bench
./assets/update.bash --source hf --repo-id <owner>/<repo>
./assets/update.bash --source hf --repo-id <owner>/<graphics-repo> --path docs/src/_graphics
2. Install Docker Engine & NVIDIA Container Toolkit
- Official instructions: Install Docker Engine
- Official instructions: Linux post-installation steps for Docker Engine
- Official instructions: Installing the NVIDIA Container Toolkit
Interactive use needs a working NVIDIA driver (nvidia-smi). GUI forwarding also needs xauth (sudo apt-get install -y xauth), an X11 session, and DISPLAY set.
Install Docker Engine and NVIDIA Container Toolkit using the official instructions or the pinned script:
./.docker/host/install_docker.bash
The helper supports Ubuntu 22.04/24.04 on amd64/arm64. It verifies the Docker repository key fingerprint (and the NVIDIA one when installing the toolkit), then installs Docker Engine/CLI 29.8.0, containerd.io 2.3.6, Buildx 0.37.1, Compose 5.6.0, rootless extras 29.8.0, and (when nvidia-smi detects a working GPU) NVIDIA Container Toolkit 1.20.0. It refuses unavailable package versions. Override pins with SRB_DOCKER_CE_VERSION, SRB_DOCKER_CLI_VERSION, SRB_DOCKER_CONTAINERD_VERSION, SRB_DOCKER_BUILDX_VERSION, SRB_DOCKER_COMPOSE_VERSION, SRB_DOCKER_ROOTLESS_EXTRAS_VERSION, or SRB_NVIDIA_TOOLKIT_VERSION; set SRB_INSTALL_NVIDIA_TOOLKIT=false to skip the toolkit. Non-interactive calls change Docker group membership only with SRB_ADD_DOCKER_GROUP=true.
If the installer adds your user to the docker group, start a new login session before relying on passwordless docker commands.
3. Run
Build the local image, then run it with the script:
SRB_IMAGE_NAME=space_robotics_bench ./.docker/build.bash 6.1.0
SRB_DOCKER_IMAGE='space_robotics_bench:6.1.0' ./.docker/run.bash
The runner resolves a local tag to its immutable image ID and never falls back to a remote tag. Default safe profile starts an interactive container with isolated networking and IPC, dropped capabilities, and no host devices or mounts. Use it for commands that do not need Isaac Sim host integration:
DOCKER_TTY=false ./.docker/run.bash srb --help
For a reviewed remote release, supply its complete registry digest; mutable tags are rejected:
SRB_DOCKER_IMAGE='<registry>/<image>@sha256:<64-hex-digest>' ./.docker/run.bash srb --help
Released images require a complete digest. Local tags resolve to image IDs only when present; missing local tags and remote mutable tags fail. join.bash selects source images with SRB_IMAGE_NAME and joins by container name; set SRB_CONTAINER_NAME consistently.
Isaac Sim needs the GPU. ROS 2 discovery and livestreaming also need host networking. Select the simulator profile:
SRB_DOCKER_PROFILE=simulator ./.docker/run.bash
The unprivileged simulator profile uses no-new-privileges, NVIDIA runtime, /dev/dri, host networking and IPC, writable simulator caches, GUI forwarding, history, and a writable /root/ws source mount by default. It has no --privileged or blanket /dev mount. Disable host networking or IPC independently:
# Bridge networking (no ROS 2 multicast discovery with host nodes)
SRB_DOCKER_PROFILE=simulator WITH_HOST_NETWORK=false ./.docker/run.bash
# Private IPC namespace with an explicit /dev/shm size (default 8g)
SRB_DOCKER_PROFILE=simulator WITH_HOST_IPC=false SRB_DOCKER_SHM_SIZE=16g ./.docker/run.bash
The trusted simulator profile enables --privileged and mounts all of /dev for hardware passthrough (cameras, serial adapters, joysticks); it prints a security warning. Use only with a locally trusted image or authenticated digest:
SRB_DOCKER_PROFILE=trusted-simulator ./.docker/run.bash
Useful variants:
# Headless simulator session
SRB_DOCKER_PROFILE=simulator WITH_GUI=false ./.docker/run.bash
# Kit-less CPU / non-GUI development path; this is not Isaac/GPU evidence
SRB_DOCKER_PROFILE=simulator WITH_GPU=false WITH_GUI=false ./.docker/run.bash
# Simulator without writable source or shell history
SRB_DOCKER_PROFILE=simulator WITH_DEV_VOLUME=false WITH_HISTORY=false ./.docker/run.bash
# Diagnostic override only; it does not prove that a usable GPU exists
SRB_DOCKER_PROFILE=simulator WITH_GPU_FORCE_NVIDIA=true ./.docker/run.bash
# Non-interactive command execution
DOCKER_TTY=false ./.docker/run.bash bash -lc "srb --help"
Pass container variables with -e. For secrets, prefer bare -e NAME: run.bash reads the exported caller value (not an internal script variable) and sends all -e values through a private temporary env-file, keeping values out of the Docker command line and ps. Empty names, whitespace or leading # in names, non-identifier bare names, and newline values exit 2; errors disclose only entry position and length. Docker sets these values at run time, so the image entrypoint still appends its own PYTHONPATH, LD_LIBRARY_PATH, PATH, and ROS entries. Override those variables inside the command instead.
To attach from another terminal while the container is still running:
./.docker/join.bash
Both scripts accept a trailing command:
SRB_DOCKER_PROFILE=simulator ./.docker/run.bash bash
./.docker/join.bash 0 fish
4. Verify Installation
If verification fails, see Troubleshooting.
Isaac Sim
Check GPU visibility:
nvidia-smi
Launch Isaac Sim:
"$HOME/isaac-sim/isaac-sim.sh"
The first launch can take a while while Isaac Sim compiles shaders and prepares the environment.
Space Robotics Bench
Check the srb command:
srb --help
srb cache update
After changing simulator pins, rebuild the image because an existing local tag may retain older dependencies. See Clean Cache before reusing caches across simulator versions.
Optional NVIDIA NGC Isaac Sim 6.1 lane
The official NGC image is an Isaac Sim compatibility probe, not an SRB image. Use an architecture-specific immutable digest, NVIDIA’s ACCEPT_EULA=Y, UID 1234:1234, /isaac-sim, and writable cache mounts; WebRTC requires --network=host. This probe does not certify SRB tasks, ROS, Rust, or source-build behavior.
The lane requires an RTX-class GPU and preflights hardware ray tracing; set SRB_REQUIRE_RTX=true to require it. GUI runs merge X credentials into ${TMPDIR:-/tmp}/srb-xauth-<project>-<user>/Xauthority, in a directory you own.
GUI Forwarding
If you expect GUI access, also verify:
echo "$DISPLAY"
test -n "$XAUTHORITY" && ls -l "$XAUTHORITY"
… continue with Basic Usage
Extras
Build a New Docker Image
If you want to build a custom Docker image, you can use the provided script:
./.docker/build.bash
The Dockerfile exports committed uv.lock with --frozen --all-extras --group image-runtime --group vcs-sources, then installs the project with --no-deps.
By default the build falls back to host networking when bridge DNS fails. Opt out with SRB_BUILD_NETWORK=default ./.docker/build.bash, or set "dns" in /etc/docker/daemon.json.
Join a Running Container
Join a running container from another terminal with the script:
./.docker/join.bash
With multiple containers, the script lists them and takes the index first. Set SRB_CONTAINER_NAME to match run.bash; it lists only <name> and <name><digits>, excluding NGC probes. For non-interactive callers such as CI, set DOCKER_TTY=false; otherwise docker exec --tty fails with the input device is not a TTY:
DOCKER_TTY=false ./.docker/join.bash 0 bash -lc "srb --help"
Development
Simulator, trusted simulator, and development profiles mount the repository workspace, so edits persist on the host. Safe does not mount the checkout.
Open the project as a Dev Container for development.
For development variables or extra bind mounts, use ./.docker/dev.bash; it wraps ./.docker/run.bash with the unprivileged simulator profile. SRB_DOCKER_PROFILE=trusted-simulator opts into --privileged and /dev, with a warning before launch. The wrapper defaults to LOG_LEVEL=info; set LOG_LEVEL=debug ./.docker/dev.bash ... for verbose Isaac and SimForge startup logs.
The wrapper persists Rust caches across containers. Host Cargo caches default to ~/.cache/space_robotics_bench/docker; set SRB_DOCKER_CACHE_DIR=/path/to/cache to change that root or SRB_CARGO_TARGET_DIR=/path/in/container to change the target path (default /root/.cache/srb/cargo-target). Do not use /root/.cargo/target as the target path.