Skip to content

[isaac] R7 Phase 1: umbrella tracker for split of #31 #42

@yinsong1986

Description

@yinsong1986

Umbrella tracker — splitting #31 into 5 child PRs

#31 is the canonical R7 Phase 1 'Isaac Sim backend skeleton' PR (12 files changed, +2,827/-6, 9 review threads, 4 R-rounds). It is correct as a single piece of work but operationally hostile to review at this size — simulation.py alone is 1,097 LOC. Splitting it into 5 dependency-ordered child PRs lets reviewers focus on one subsystem at a time, keeps git bisect useful, and follows the same precedent established on strands-labs/robots#195 → #220-#228 (tracked by robots#219).

Scope (recap from #31)

Phase 1 of the Isaac Sim backend (R7): skeleton + entry-point + tests, no GPU required for CI. Full implementation (stages, sensors, replicator, fleet) follows in subsequent phase PRs.

Concern Module Phase 1 status
Entry-point discovery pyproject.toml, isaac/__init__.py ✅ working
Config validation isaac/config.py (IsaacConfig) ✅ working
Procedural USD builders isaac/procedural.py (SO-100 / Panda / G1) ✅ builders return shapes; articulation defects deferred to Phase 2
SimEngine lifecycle (init / is_available / cleanup) isaac/simulation.py ✅ working
World creation / spawning / observation / render isaac/simulation.py ⚠️ silent-success on procedural add_robot; get_observation returns {} (R2/R4 disclosure documented)
GPU integration tests/test_gpu_integ.py gated on STRANDS_GPU_TEST=1
Documentation docs/backends/isaac.md ✅ install + usage + Phase 1 status banner

Solution shape

PEP 562 lazy imports throughout (zero omni overhead on import strands_robots_sim); SimulationApp singleton; headless=True default; thread-safe via threading.RLock; is_available() returns (bool, str|None); no binary assets (procedural robots built from code); GPU tests gated behind @pytest.mark.gpu + STRANDS_GPU_TEST=1. R1 narrowed is_available() to probe omni.isaac.kit specifically; R1 added unknown-kwarg rejection; R1 dropped unsafe __del__; R1 narrowed 4 bare-except sites; R2 corrected G1 DOF count + added Phase 1 doc disclosure banner; R4 added distinguishable WARNING/DEBUG diagnostic logs across get_observation's four silent-empty modes (typo / forgotten create_world / Phase 1 articulation None / ambiguous robot_name).

Child PRs (in landing order)

  • PR-1 (#44) feat(isaac): [isaac] extras + entry-point + PEP 562 lazy import (1/5 of #31 split)pyproject.toml ([isaac] extras + entry-points + pytest>=7.0 dev/hatch deps + gpu pytest marker), isaac/__init__.py (PEP 562 lazy stub), isaac/tests/__init__.py. ~68 LOC. Demonstrates entry-point discovery without any simulation code. Lands first.
  • PR-2 (#45) feat(isaac): IsaacConfig dataclass with validation (2/5 of #31 split)isaac/config.py. ~116 LOC. Pure dataclass, no omni deps. R1's "reject unknown kwargs" pin lives here (from_kwargs classmethod). Branched off PR-1.
  • PR-3 (#46) feat(isaac): procedural USD builders (SO-100, Panda, G1) (3/5 of #31 split)isaac/procedural.py + carved tests/test_procedural_g1_dof.py. ~331 LOC. R2's G1-DOF=21 truth-source pin lives here. Branched off PR-1; parallel-mergeable with PR-2.
  • PR-4 (#47) feat(isaac): IsaacSimulation backend (lifecycle + observation + render) (4/5 of #31 split)isaac/simulation.py + remaining tests/test_unit.py + tests/test_entrypoint.py + tests/test_get_observation_diagnostic_logs.py + tests/test_gpu_integ.py. ~2,000 LOC. Carries R1's omni.isaac.kit-specific probe + no-__del__ + narrow except + R4's get_observation diagnostic logging. Branched off PR-3 (depends on PR-2's config.py + PR-3's procedural.py).
  • PR-5 (#48) docs(isaac): backend reference + Phase 1 status banner (5/5 of #31 split)docs/backends/isaac.md + carved tests/test_phase1_doc_banner.py. ~288 LOC. R2's Phase-1-status disclosure banner about silent-success methods. Parallel-mergeable with PR-4.

Dependency graph

PR-1 (#44, entry-point + extras + lazy import)  ──┐
                                                   ├──► PR-2 (#45, config dataclass)        ──┐
                                                   └──► PR-3 (#46, procedural USD builders) ──┤
                                                                                              ├──► PR-4 (#47, IsaacSimulation backend) ──┐
                                                                                              │                                          │
                                                                                  PR-5 (#48, docs)  ───────────────────────────────────────┴──► close #31

PR-1 (#44) lands first.
PR-2 (#45) / PR-3 (#46) land in parallel after PR-1.
PR-4 (#47) needs PR-2 + PR-3.
PR-5 (#48) is parallel-mergeable with PR-4 (docs only, no code dep).
This issue closes when PR-5 (#48) lands and #31 is closed with a redirect comment.

Carved test files (split-specific bookkeeping)

test_phase1_doc_honesty.py from #31 was carved into two files so each parallel slice is CI-green standalone:

Source class on #31 New file Lands in
TestG1DOFCount (3 tests) tests/test_procedural_g1_dof.py PR-3 (#46)
TestIsaacDocsPhase1Banner (3 tests) tests/test_phase1_doc_banner.py PR-5 (#48)

Combined coverage equals the original file.

Review-thread bookkeeping

The 9 review threads on #31 stay open until the corresponding child PR closes them; child PRs cite the original #31 thread URL when resolving (mirrors #195's R-round practice). The R1/R2/R3 (merge)/R4 commit chronicle on #31 is the forensic source of truth — child PRs cherry-pick the relevant content from cagataycali/feat/isaac-sim (HEAD befb1e3).

CI expectations

Closing condition

Closes when PR-5 (#48) lands and #31 is closed with a redirect comment to the 5 child PRs.


Tracking child of #31. Following the precedent set by robots#195 → #220-#228.

Metadata

Metadata

Assignees

No one assigned

    Labels

    isaac-simNVIDIA Isaac Sim backendtrackingUmbrella / tracking issue

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions