vla / docs /simulator_backends.md
anhtld's picture
Initial commit: DoVLA-CIL codebase (h=16 breakthrough)
adc02fa verified
|
Raw
History Blame
4.12 kB
# Simulator Backends
DoVLA-CIL uses a small simulator interface so the same CIL pipeline can run on a toy symbolic
backend today and real physics backends later.
## Interface
Every backend implements:
```python
seed(seed)
reset_task(task, scene=None)
serialize_state()
restore_state(state_blob)
render_observation()
get_symbolic_state()
execute_action_chunk(action)
close()
```
The critical requirement is exact reset. `serialize_state()` and `restore_state()` must restore the
same simulator state for every candidate action in a group.
## Registry
```python
from dovla_cil.sim.registry import list_backends, create_backend
print(list_backends()) # toy, maniskill, genesis
sim = create_backend("toy")
```
The registry lists optional backends without importing their heavy packages. Missing optional
dependencies raise helpful errors only when instantiated.
Shared config:
```yaml
sim:
backend: toy
seed: 0
params: {}
```
## Toy Backend
`toy` is a deterministic symbolic 2D tabletop backend. It supports:
- object positions
- robot end-effector and gripper state
- `move_to`, `grasp`, `release`, `push`, `place_at`, `open`, `close`
- exact pickle state serialization
- symbolic relations such as `inside`, `near`, `next_to`, `left_of`, `right_of`, `behind`,
`in_front_of`, `lifted`, `opened`, `closed`, and `grasped`
- simplified mass/friction effects for low-friction, heavy-object, and sticky-drawer stress tests
- out-of-workspace instability markers for irreversible-failure smoke cases
The toy backend is for smoke tests and local development only. It is not a physics benchmark and
does not justify real robot claims.
## ManiSkill3 Backend and Lattice Engine
`maniskill` lives in `dovla_cil/sim/maniskill_backend.py`. Importing the module does not require
ManiSkill3. Instantiating the backend checks for the package and raises an install hint if missing.
Config fields:
- `env_id`
- `obs_mode`
- `control_mode`
- `render_mode`
- `num_envs`
- `sim_backend`
Implementation checklist:
1. Install ManiSkill3 in the runtime environment.
2. Map each `TaskSpec.family` and predicate set to a ManiSkill environment and reset options.
3. Translate `SceneSpec` object poses, seeds, camera pose, and task metadata into environment reset.
4. Implement exact simulator and RNG serialization.
5. Translate `ActionChunk` values into the configured control mode.
6. Render observations and store large images by reference when needed.
7. Build `get_symbolic_state()` from object poses, articulation states, robot state, and contacts.
8. Return `RolloutResult` with before/after symbolic states, contacts, trajectory metadata, and
simulator diagnostics.
The generic `SimulatorBackend` wrapper remains a placeholder for arbitrary `TaskSpec` mapping.
The research path in `dovla_cil/generation/maniskill_lattice.py` is concrete: it restores official
ManiSkill HDF5 environment states, executes same-state action lattices with GPU PhysX, verifies
restore error, stores measured before/after states, and supports six explicit task profiles. RGB is
rendered later from those persisted states by `maniskill_render.py`, avoiding CUDA/Vulkan device
ordinal coupling on shared or MIG GPUs.
## Genesis Skeleton
`genesis` follows the same optional-dependency pattern in `dovla_cil/sim/genesis_backend.py`.
Config fields:
- `scene_backend`
- `render_mode`
- `num_envs`
- `dt`
- `substeps`
- `params`
Implementation checklist:
1. Install Genesis in the runtime environment.
2. Map task objects to bodies, articulations, materials, and robot assets.
3. Apply `SceneSpec` object poses, camera pose, lighting seed, physics seed, and metadata.
4. Replace placeholder pickle state with exact Genesis world, robot, and RNG serialization.
5. Translate `ActionChunk` values into robot controls or scripted skills.
6. Render observations and expose symbolic state for reward/effect extraction.
7. Return contacts, trajectory, before/after state, and simulator diagnostics.
The Genesis wrapper exists so large-scale code paths can discover the backend name and fail cleanly
until a real adapter is implemented.