背景与目标(已经 maintainer 确认方向)
为 UniLab 增加 IsaacGym 物理后端。目的:方便从 IsaacGym 体系迁移项目、以及跨后端物理对比;不是效率优化项。这是必做项。
约束(maintainer 明确):
- UniLab 仓库不引入任何本地绝对路径依赖;IsaacGym 源码(本机
/home/user/ws/simulator 下)仅供本地查看参考,不进入依赖树。
- 交付物必须包含自动化配置脚本 + 指南文档,让任何一台新机器能按文档/脚本从零搭好 IsaacGym 运行时。
本 issue 是 roadmap + umbrella 规划,不直接授权开发;各 child issue 单独确认后开工。
仓库现状(已核实的事实)
- Backend 契约:
SimBackend(src/unilab/base/backend/base.py:230)是纯 numpy 接口,约 22 个 abstract 方法;生命周期 构造 → materialize() → 热路径 step/get → cleanup;热路径禁止解析 asset。
- 工厂与注册:
create_backend()(src/unilab/base/backend/__init__.py:98)、_SUPPORTED_SIM_BACKENDS = ("mujoco","mjwarp","motrix","drake")(src/unilab/base/registry.py:42);切后端走 task=<task>/<backend> 选 owner YAML。
- GPU 后端先例:
mjwarp 以 host-numpy profile 接入(GPU 物理 + 边界 H2D/D2H 拷贝),证明 GPU 后端可在不改接口前提下接入。
- IsaacGym 运行时先例:
scripts/benchmark/physics/benchmark_physics_step_isaacgym.py 通过外部环境变量(UNILAB_BENCHMARK_HOLOSOMA_DEPS / UNILAB_BENCHMARK_HSGYM_PYTHON / UNILAB_BENCHMARK_HSGYM_LIB)定位外部 Python 3.8 环境跑 benchmark——IsaacGym 不进主 venv 是既有模式。
- 工具链硬约束:主仓库
requires-python = ">=3.10,<3.14" + torch==2.7/2.9;IsaacGym Preview 4(EOL)只支持 Python 3.6–3.8。→ in-process 集成被否决,唯一可行架构是 subprocess 隔离。
- 参考实现:本机
/home/user/ws/simulator/holosoma 有完整 isaacgym 集成(src/holosoma/holosoma/simulator/isaacgym/isaacgym.py,URDF 资产 + tensor API + use_gpu_pipeline)和安装脚本(scripts/setup_isaacgym.sh,conda/mamba + py3.8 hsgym env);simtoolreal 有 uv venv --python 3.8 的轻量替代路径。均可作实现参考,不复制代码。
- sim2sim:
src/unilab/utils/sim2sim.py ALLOWLIST 已含 training.sim_backend,不需改契约文件;scripts/audit_sim2sim_contracts.py 的 PRIMARY_PAIR 需泛化。
- 测试注意点:
tests/base/test_registry.py:222 目前把 "isaacgym" 当非法后端用例,落地时需调整;conformance 参数化在 tests/base/test_backend_conformance.py:85。
架构结论
方案:subprocess 隔离后端。主进程 IsaacGymBackend 满足 SimBackend numpy 契约;物理在独立 Python 3.8 环境的 worker 子进程中跑(worker 只依赖 numpy + isaacgym);action/state 经共享内存 + 管道 IPC 批量交换。运行时定位走环境变量 + 自动探测(参照 benchmark 的 UNILAB_BENCHMARK_HSGYM_* 模式,另立 UNILAB_ISAACGYM_* 规范),仓库内零绝对路径。
因目标是迁移与物理对比而非吞吐,IPC 开销可接受;不支持的 DR / render 能力按惯例 fail-closed。IsaacGym 侧资产为 URDF,MJCF→URDF 的 sensor/keyframe 概念映射在冷路径完成。
Child issue 拆分(每个单独确认,各自满足单 issue 规模上限)
- Child 1 — 环境配置自动化 + 指南文档:
scripts/tools/ 下新增 isaacgym 运行时安装/自检脚本(miniconda 或 uv 建 py3.8 env、解包用户手动下载的 Preview 4 tarball、pip install -e isaacgym/python、import 自检、打印 export 指引);docs/sphinx/source/{en,zh_CN}/2-user_guide/3-backends/ 新增 isaacgym 页面并登记 toctree。遵循 Evidence only:只写外部环境准备与 benchmark 用法,不声称训练支持。
- Child 2 —
IsaacGymBackend 实现:src/unilab/base/backend/isaacgym/(backend + py3.8 worker 入口 + IPC 协议)+ factory/registry 接入 + env_backend_kwargs 扩展 + conformance 测试参数(无 GPU/无运行时则 skip)。
- Child 3 — 配置与 sim2sim/play 接入:
conf/<algo>/task/<task>/isaacgym.yaml(先 1 个 task)、audit_sim2sim_contracts.py 泛化、test_registry.py:222 用例调整、play 入口验证(物理对比是首要场景,优先保证 play/sim2sim 而非训练吞吐)。
永久维护成本(诚实估计)
- 一条跨进程 IPC 协议及 worker 生命周期管理(崩溃恢复、僵尸进程、GPU device 分配)的长期维护;
- 每个支持的 task × algo 一份
isaacgym.yaml,DENYLIST 字段跨后端一致(audit CI 保障);
- IsaacGym 本体 EOL:CUDA/驱动升级可能破坏 Python 3.8 运行时,届时需再投入或下线该后端;
- 文档与安装脚本需跟随 NVIDIA 分发渠道变化(Preview 4 tarball 需 developer 账号手动下载)。
背景与目标(已经 maintainer 确认方向)
为 UniLab 增加 IsaacGym 物理后端。目的:方便从 IsaacGym 体系迁移项目、以及跨后端物理对比;不是效率优化项。这是必做项。
约束(maintainer 明确):
/home/user/ws/simulator下)仅供本地查看参考,不进入依赖树。本 issue 是 roadmap + umbrella 规划,不直接授权开发;各 child issue 单独确认后开工。
仓库现状(已核实的事实)
SimBackend(src/unilab/base/backend/base.py:230)是纯 numpy 接口,约 22 个 abstract 方法;生命周期 构造 →materialize()→ 热路径 step/get → cleanup;热路径禁止解析 asset。create_backend()(src/unilab/base/backend/__init__.py:98)、_SUPPORTED_SIM_BACKENDS = ("mujoco","mjwarp","motrix","drake")(src/unilab/base/registry.py:42);切后端走task=<task>/<backend>选 owner YAML。mjwarp以 host-numpy profile 接入(GPU 物理 + 边界 H2D/D2H 拷贝),证明 GPU 后端可在不改接口前提下接入。scripts/benchmark/physics/benchmark_physics_step_isaacgym.py通过外部环境变量(UNILAB_BENCHMARK_HOLOSOMA_DEPS/UNILAB_BENCHMARK_HSGYM_PYTHON/UNILAB_BENCHMARK_HSGYM_LIB)定位外部 Python 3.8 环境跑 benchmark——IsaacGym 不进主 venv 是既有模式。requires-python = ">=3.10,<3.14"+torch==2.7/2.9;IsaacGym Preview 4(EOL)只支持 Python 3.6–3.8。→ in-process 集成被否决,唯一可行架构是 subprocess 隔离。/home/user/ws/simulator/holosoma有完整 isaacgym 集成(src/holosoma/holosoma/simulator/isaacgym/isaacgym.py,URDF 资产 + tensor API +use_gpu_pipeline)和安装脚本(scripts/setup_isaacgym.sh,conda/mamba + py3.8hsgymenv);simtoolreal有uv venv --python 3.8的轻量替代路径。均可作实现参考,不复制代码。src/unilab/utils/sim2sim.pyALLOWLIST 已含training.sim_backend,不需改契约文件;scripts/audit_sim2sim_contracts.py的PRIMARY_PAIR需泛化。tests/base/test_registry.py:222目前把"isaacgym"当非法后端用例,落地时需调整;conformance 参数化在tests/base/test_backend_conformance.py:85。架构结论
方案:subprocess 隔离后端。主进程
IsaacGymBackend满足SimBackendnumpy 契约;物理在独立 Python 3.8 环境的 worker 子进程中跑(worker 只依赖 numpy + isaacgym);action/state 经共享内存 + 管道 IPC 批量交换。运行时定位走环境变量 + 自动探测(参照 benchmark 的UNILAB_BENCHMARK_HSGYM_*模式,另立UNILAB_ISAACGYM_*规范),仓库内零绝对路径。因目标是迁移与物理对比而非吞吐,IPC 开销可接受;不支持的 DR / render 能力按惯例 fail-closed。IsaacGym 侧资产为 URDF,MJCF→URDF 的 sensor/keyframe 概念映射在冷路径完成。
Child issue 拆分(每个单独确认,各自满足单 issue 规模上限)
scripts/tools/下新增 isaacgym 运行时安装/自检脚本(miniconda 或 uv 建 py3.8 env、解包用户手动下载的 Preview 4 tarball、pip install -e isaacgym/python、import 自检、打印 export 指引);docs/sphinx/source/{en,zh_CN}/2-user_guide/3-backends/新增 isaacgym 页面并登记 toctree。遵循 Evidence only:只写外部环境准备与 benchmark 用法,不声称训练支持。IsaacGymBackend实现:src/unilab/base/backend/isaacgym/(backend + py3.8 worker 入口 + IPC 协议)+ factory/registry 接入 +env_backend_kwargs扩展 + conformance 测试参数(无 GPU/无运行时则 skip)。conf/<algo>/task/<task>/isaacgym.yaml(先 1 个 task)、audit_sim2sim_contracts.py泛化、test_registry.py:222用例调整、play 入口验证(物理对比是首要场景,优先保证 play/sim2sim 而非训练吞吐)。永久维护成本(诚实估计)
isaacgym.yaml,DENYLIST 字段跨后端一致(audit CI 保障);