Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 33 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ DEV_COMPOSE := docker compose --env-file deployment/env/versions.env \
-f deployment/compose/compose.dev.yaml
MOCK_COMPOSE := docker compose --env-file deployment/env/versions.env \
-f deployment/compose/compose.mock.yaml
ISAAC_ENV_FILE ?= deployment/env/.env
ISAAC_COMPOSE := docker compose --env-file deployment/env/versions.env \
--env-file $(ISAAC_ENV_FILE) -f deployment/compose/compose.isaac.yaml
BASE_PATHS := packages agents tasks evaluators tests
COLCON_ENV := COLCON_DEFAULTS_FILE=$(CURDIR)/colcon.defaults.yaml

Expand All @@ -12,7 +15,7 @@ export HOST_UID := $(shell id -u $(CURRENT_USER))
export HOST_GID := $(shell id -g $(CURRENT_USER))

.PHONY: help dev-image dev-shell dev-list dev-build dev-test dev-lint dev-check \
mock-image mock-e2e \
mock-image mock-e2e isaac-config isaac-image isaac-up isaac-gui isaac-down isaac-smoke \
list-local build-local test-local lint-local check-local

help:
Expand All @@ -26,6 +29,12 @@ help:
@echo " make dev-check Run the complete PR/CI check"
@echo " make mock-image Build the CPU mock runtime image"
@echo " make mock-e2e Run and validate the three-container mock stack"
@echo " make isaac-config Validate the Isaac Compose configuration"
@echo " make isaac-image Build the pinned Isaac env image"
@echo " make isaac-up Start the Isaac env using the configured mode"
@echo " make isaac-gui Build and run the Isaac GUI until Ctrl-C"
@echo " make isaac-down Stop the Isaac validation stack"
@echo " make isaac-smoke Run the manual GPU/ROS 2 Bridge smoke"

dev-image:
$(DEV_COMPOSE) build dev
Expand Down Expand Up @@ -54,6 +63,24 @@ mock-image:
mock-e2e:
tools/e2e/run_mock_compose.sh

isaac-config:
$(ISAAC_COMPOSE) config --quiet

isaac-image:
$(ISAAC_COMPOSE) build env

isaac-up:
$(ISAAC_COMPOSE) up --detach env

isaac-gui:
RH_ISAAC_ENV_FILE=$(ISAAC_ENV_FILE) tools/dev/run_isaac_gui.sh

isaac-down:
$(ISAAC_COMPOSE) down --remove-orphans

isaac-smoke:
RH_ISAAC_ENV_FILE=$(ISAAC_ENV_FILE) tools/e2e/run_isaac_bridge_smoke.sh

# The *-local targets are internal entry points used inside the development image.
list-local:
$(COLCON_ENV) colcon list --base-paths $(BASE_PATHS)
Expand All @@ -68,6 +95,10 @@ test-local: build-local

lint-local:
python3 tools/validation/check_repository.py
ruff check tools tests packages agents tasks evaluators
python3 tools/validation/check_isaac_skeleton.py
bash -n deployment/docker/env/entrypoint.sh \
simulators/isaac/scripts/launch.sh tools/dev/run_isaac_gui.sh \
tools/e2e/run_isaac_bridge_smoke.sh
ruff check tools tests packages agents tasks evaluators simulators

check-local: lint-local list-local test-local
34 changes: 25 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ RoboHarness 是面向机器人导航任务的快速实验、自动运行与统
严格限定为:

- Simulator:NVIDIA Isaac Sim
- Robot:Unitree Go2
- Robot:ANYmal C
- Agent:ROS 2 Keyboard Agent
- Task:PointNav
- Evaluation:Simple Navigation Evaluation
Expand Down Expand Up @@ -79,6 +79,26 @@ make dev-lint
make mock-e2e
```

PR13 的 Isaac backend / 原生 ROS 2 Bridge 骨架使用:

```bash
cp deployment/env/.env.example deployment/env/.env
# 阅读 NVIDIA EULA 后,将 ACCEPT_EULA 改为 Y。
make isaac-config
make isaac-smoke
```

本地 Linux X11 图形会话可直接运行:

```bash
make isaac-gui
```

首次配置 GPU 开发机请按
[PR13 Isaac 开发环境与调整记录](docs/guides/isaac-pr13-development-environment.md)
区分宿主机、运行基线和本地 consent 配置,再执行
[NVIDIA Container Toolkit 安装指南](docs/guides/nvidia-container-toolkit-host-setup.md)。

开发容器只是临时工具环境,不属于 RoboHarness 的运行服务。详细说明见
[部署与开发环境](deployment/README.md)和
[开发平台 ADR](docs/adr/0001-development-platform.md)。
Expand All @@ -89,13 +109,9 @@ make mock-e2e
三个独立容器,等待 ROS 图和三个 Episode 结果完成,校验产物后自动清理服务。
结果和容器日志保存在 `.build/mock-e2e/`。

面向 Isaac Sim 的完整 MVP 运行方式仍将在后续 PR 中补齐:

```bash
cp deployment/env/.env.example deployment/env/.env
docker compose --env-file deployment/env/.env \
-f deployment/compose/compose.yaml up --build
```
当前 Isaac profile 只验证 pinned image、Kit application、原生 Bridge、`/clock`
与跨容器 DDS discovery;它不包含 ANYmal C、运控、完整 Env reset 或 MVP E2E。
完整运行方式仍将在 PR14–PR17 中补齐。

运行链:

Expand Down Expand Up @@ -126,4 +142,4 @@ MVP 不实现 Gazebo、Nav2、Reactive/RL/VLA/VLN Agent、其他机器人、复

## License

License 尚未确定。在明确许可证之前,请勿假定仓库内容可被再分发;引入 Go2/Isaac 资源时也必须单独核对其许可证与再分发条件。
License 尚未确定。在明确许可证之前,请勿假定仓库内容可被再分发;引入 ANYmal C/Isaac 资源时也必须单独核对其许可证与再分发条件。
2 changes: 1 addition & 1 deletion configs/experiments/mvp.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
schema_version: 1
experiment:
name: go2_keyboard_pointnav
name: anymal_c_keyboard_pointnav
execution_mode: manual
episodes:
- episode_id: "0000"
Expand Down
76 changes: 75 additions & 1 deletion deployment/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ RoboHarness keeps development and execution concerns in separate images:
| --- | --- | --- | --- |
| `roboharness-dev` | edit, build, lint, and test the monorepo | yes | Colcon, compiler, CMake, Ruff |
| `roboharness-mock-runtime` | execute the installed CPU mock stack | no | no repository lint/dev layer |
| `roboharness-isaac-env` | run the Isaac backend and native ROS 2 Bridge | no | no repository lint/dev layer |

The mock runtime image is built with a multi-stage Dockerfile. Its builder
stage compiles the required Colcon packages, while the final stage copies only
Expand Down Expand Up @@ -67,4 +68,77 @@ container snapshots, ROS graph snapshots, and Compose logs are retained under
`.build/mock-e2e/`; the stack is always removed on exit.

This CPU image is a reproducible protocol and orchestration reference, not an
Isaac production image. Isaac/GPU versions and images remain the scope of PR 13.
Isaac production image.

## Isaac backend skeleton

PR 13 pins the Linux x86_64 Isaac Sim image to both version and manifest:

```text
nvcr.io/nvidia/isaac-sim:4.5.0
sha256:c2f47dc82a7714af08d3766efe80ac9d084c2b37b5d0dfbd074797ec56390fc7
```

The env image adds only the installed `rh_interfaces` overlay and the
`simulators/isaac` application files. It contains no source workspace, Isaac
Lab, ANYmal C binding, policy training tools, Agent, Task, Evaluator, or
Experiment implementation. The `rh.isaac` extension enables the native
`isaacsim.ros2.bridge`, creates the simulation-clock Action Graph, and publishes
the platform Env status as `STARTING` or `ERROR`. It deliberately cannot claim
`READY` before PR 14 and PR 16 provide the robot binding and full Env contract.

Create the local consent/configuration file and explicitly accept NVIDIA's EULA:

```bash
cp deployment/env/.env.example deployment/env/.env
# Edit deployment/env/.env and set ACCEPT_EULA=Y after reviewing the EULA.
make isaac-config
make isaac-image
make isaac-up
```

On a local Linux X11 session, run the foreground GUI workflow without changing
the default headless value in `.env`:

```bash
make isaac-gui
```

The GUI helper validates `DISPLAY`, temporarily grants only the container root
user local X access, and cleans up both Compose and the added X access on exit.

`compose.isaac.yaml` uses host networking and a shared host IPC namespace for
the Linux-only PR 13 Fast DDS smoke, passes through all NVIDIA GPUs, and
persists shader/content caches in named volumes. Sharing IPC is required for
Fast DDS shared-memory user data; discovery alone can work across isolated IPC
namespaces while `/clock` delivery fails. `bridge-observer` is a
validation-profile helper, not a fourth runtime service. Stop the stack with
`make isaac-down`.

The bounded manual validation command is:

```bash
make isaac-smoke
```

It checks the host driver and Docker runtime, builds the pinned image, starts an
external ROS 2 Humble observer, receives one `/clock` message, checks the Env
status topic and container stability, and writes evidence under
`.build/isaac-smoke/`. See the
[PR 13 validation guide](../docs/guides/isaac-pr13-validation.md) for host
requirements, GUI launch, evidence contents, and limitations. Developers
preparing a new machine should first follow the
[NVIDIA Container Toolkit host setup guide](../docs/guides/nvidia-container-toolkit-host-setup.md).

The complete separation between host configuration, repository pins, local
consent, and implementation changes is recorded in the
[PR 13 development environment notes](../docs/guides/isaac-pr13-development-environment.md).
The 2026-08-24 smoke passed on Ubuntu 22.04.5/kernel 6.8 with driver
`580.173.02`, NVIDIA Container Toolkit `1.20.0`, Docker Engine `29.7.2`, and
Compose `5.5.0`. These are validation evidence, not blanket minimum versions
for every host.

Isaac Sim 4.5.0, Ubuntu 22.04, and ROS 2 Humble are the selected runtime
baseline. The MVP later uses the ANYmal C locomotion policy bundled with Isaac
Sim, so Isaac Lab is not installed in the runtime image. Policy training or
export tooling will be selected and pinned separately if required.
62 changes: 62 additions & 0 deletions deployment/compose/compose.isaac.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
name: roboharness-isaac

x-isaac-environment: &isaac-environment
ACCEPT_EULA: ${ACCEPT_EULA:-N}
PRIVACY_CONSENT: ${PRIVACY_CONSENT:-N}
ROS_DISTRO: ${RH_ROS_DISTRO}
ROS_DOMAIN_ID: ${RH_ISAAC_ROS_DOMAIN_ID:-42}
ROS_LOCALHOST_ONLY: "0"
RMW_IMPLEMENTATION: rmw_fastrtps_cpp

services:
env:
image: ${RH_ISAAC_ENV_IMAGE}
build:
context: ../..
dockerfile: deployment/docker/env/Dockerfile
args:
ISAAC_SIM_IMAGE: ${RH_ISAAC_SIM_IMAGE}
ROS_BASE_IMAGE: ${RH_ROS_BASE_IMAGE}
init: true
restart: "no"
stop_grace_period: 30s
network_mode: host
ipc: host
gpus: all
shm_size: 2gb
environment:
<<: *isaac-environment
DISPLAY: ${DISPLAY:-}
command: ["${RH_ISAAC_MODE:-headless}"]
volumes:
- isaac-kit-cache:/isaac-sim/kit/cache
- isaac-ov-cache:/root/.cache/ov
- isaac-pip-cache:/root/.cache/pip
- isaac-gl-cache:/root/.cache/nvidia/GLCache
- isaac-compute-cache:/root/.nv/ComputeCache
- isaac-data:/root/.local/share/ov/data
- isaac-logs:/root/.nvidia-omniverse/logs
- /tmp/.X11-unix:/tmp/.X11-unix:rw

bridge-observer:
profiles: ["validation"]
image: ${RH_ROS_BASE_IMAGE}
init: true
restart: "no"
network_mode: host
ipc: host
environment:
ROS_DISTRO: ${RH_ROS_DISTRO}
ROS_DOMAIN_ID: ${RH_ISAAC_ROS_DOMAIN_ID:-42}
ROS_LOCALHOST_ONLY: "0"
RMW_IMPLEMENTATION: rmw_fastrtps_cpp
command: ["sleep", "infinity"]

volumes:
isaac-kit-cache:
isaac-ov-cache:
isaac-pip-cache:
isaac-gl-cache:
isaac-compute-cache:
isaac-data:
isaac-logs:
56 changes: 56 additions & 0 deletions deployment/docker/env/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
ARG ROS_BASE_IMAGE=public.ecr.aws/docker/library/ros:humble-ros-base-jammy
ARG ISAAC_SIM_IMAGE=nvcr.io/nvidia/isaac-sim:4.5.0

FROM ${ROS_BASE_IMAGE} AS ros-builder

SHELL ["/bin/bash", "-o", "pipefail", "-c"]

RUN apt-get update \
&& apt-get install --no-install-recommends -y \
build-essential \
cmake \
python3-colcon-common-extensions \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /workspace/roboharness
COPY packages/rh_interfaces packages/rh_interfaces

RUN source /opt/ros/humble/setup.bash \
&& colcon build \
--merge-install \
--install-base /opt/roboharness \
--base-paths packages \
--packages-select rh_interfaces

FROM ${ISAAC_SIM_IMAGE} AS isaac-env

ARG ISAAC_SIM_IMAGE

LABEL org.opencontainers.image.title="RoboHarness Isaac environment" \
org.opencontainers.image.description="Isaac Sim 4.5 backend and native ROS 2 Bridge" \
org.opencontainers.image.version="4.5.0" \
org.opencontainers.image.base.name="${ISAAC_SIM_IMAGE}"

USER root

COPY --from=ros-builder /opt/roboharness /opt/roboharness
COPY simulators/isaac /opt/roboharness/simulators/isaac
COPY deployment/docker/env/entrypoint.sh /usr/local/bin/roboharness-isaac-entrypoint

RUN chmod 0755 \
/usr/local/bin/roboharness-isaac-entrypoint \
/opt/roboharness/simulators/isaac/scripts/launch.sh

ENV RH_ISAAC_ROOT=/isaac-sim \
RH_ISAAC_APPS=/isaac-sim/apps \
RH_ISAAC_BASE_APP=/isaac-sim/apps/isaacsim.exp.base.kit \
RH_ISAAC_APP=/opt/roboharness/simulators/isaac/apps/rh.kit \
RH_ISAAC_EXTENSIONS=/opt/roboharness/simulators/isaac/extensions \
RH_ROS_PYTHON_PATH=/opt/roboharness/local/lib/python3.10/dist-packages \
AMENT_PREFIX_PATH=/opt/roboharness \
PYTHONPATH=/opt/roboharness/local/lib/python3.10/dist-packages \
LD_LIBRARY_PATH=/opt/roboharness/lib

WORKDIR /isaac-sim
ENTRYPOINT ["/usr/local/bin/roboharness-isaac-entrypoint"]
CMD ["headless"]
9 changes: 9 additions & 0 deletions deployment/docker/env/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -eo pipefail

if [[ "${ACCEPT_EULA:-N}" != "Y" ]]; then
echo "Isaac Sim EULA is not accepted. Set ACCEPT_EULA=Y in deployment/env/.env." >&2
exit 64
fi

exec /opt/roboharness/simulators/isaac/scripts/launch.sh "$@"
12 changes: 12 additions & 0 deletions deployment/env/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Copy this file to deployment/env/.env before running the Isaac profile.
# Setting ACCEPT_EULA=Y confirms acceptance of the NVIDIA Omniverse EULA for
# the Isaac Sim container. RoboHarness never enables this automatically.
ACCEPT_EULA=N

# Y opts in to NVIDIA data collection; N keeps it disabled.
PRIVACY_CONSENT=N

# headless is the PR 13 validation default. `make isaac-gui` overrides this
# value only for its own process and requires a local DISPLAY/X11 socket.
RH_ISAAC_MODE=headless
DISPLAY=
21 changes: 18 additions & 3 deletions deployment/env/versions.env
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,21 @@ RH_VALIDATED_MAKE_VERSION=4.3
RH_VALIDATED_COLCON_CORE_VERSION=0.21.0
RH_VALIDATED_RUFF_VERSION=0.11.13

# Exact Isaac Sim, NVIDIA driver, and production image versions are validated
# and pinned by PR 13. Do not infer them from the CPU development image.
RH_ISAAC_SIM_VERSION=UNVERIFIED_UNTIL_PR13
# The Isaac runtime baseline is selected for the Ubuntu 22.04 / ROS 2 Humble
# project platform. PR 13 validates the exact image digest, host driver, and
# GPU runtime; do not infer those from the CPU development image.
RH_ISAAC_SIM_VERSION=4.5.0
RH_ISAAC_SIM_IMAGE=nvcr.io/nvidia/isaac-sim:4.5.0@sha256:c2f47dc82a7714af08d3766efe80ac9d084c2b37b5d0dfbd074797ec56390fc7
RH_ISAAC_ENV_IMAGE=roboharness-isaac-env:4.5.0
RH_ISAAC_REFERENCE_ROBOT=anymal_c
RH_ISAAC_ROS_DOMAIN_ID=42
RH_ISAAC_MIN_DRIVER_VERSION=535.129.03
RH_ISAAC_KERNEL_6_8_DRIVER_VERSION=535.216.01
RH_ISAAC_VALIDATED_DRIVER_VERSION=580.173.02
RH_ISAAC_VALIDATED_CONTAINER_TOOLKIT_VERSION=1.20.0
RH_ISAAC_VALIDATED_DOCKER_ENGINE_VERSION=29.7.2
RH_ISAAC_VALIDATED_DOCKER_COMPOSE_VERSION=5.5.0

# The MVP deploys the ANYmal C policy bundled with Isaac Sim. Isaac Lab is not
# installed in the runtime image; add and pin it only if policy training or
# export becomes a confirmed requirement.
Loading
Loading