Develop#622
Merged
alexmillane merged 16 commits intomainfrom Apr 21, 2026
Merged
Conversation
## Summary Add batched multi-env placement to relation solver (`1 -> num_envs`) ## Detailed description ### Solver - `RelationSolverState` positions stored as `(num_envs, num_optimizable, 3)`; `get_position()` returns `(num_envs, 3)` - `RelationSolver._compute_total_loss()` accumulates `(num_envs,)` loss per env, returns mean of losses; per-env loss exposed via `last_loss_per_env` - All loss strategies (`On`, `NextTo`, `NoCollision`, `AtPosition`) updated to accept `(num_envs, 3)` with `(3,)` backward compat ### ObjectPlacer - `place()` accepts `num_envs` and `result_per_env`; returns `MultiEnvPlacementResult` (one `PlacementResult` per env) or a single `PlacementResult` - Pool-based placement: generates `max_placement_attempts * num_results` candidates in one batched solver call, sorts by (valid-first, lowest-loss), and selects the best `num_results` - `result_per_env=False` solves a single layout applied to all environments - `_validate_placement` skips `On`-related pairs in overlap check (fix for false-positive collisions) - `mean_loss` calculation filters out non-finite values ### Unified Placement Path - New `PosePerEnv` dataclass holds a list of `Pose` objects, one per environment - `ObjectBase._init_event_cfg` handles `PosePerEnv` via `set_object_pose_per_env`, so each object registers its own reset event for both single-env and multi-env cases - Removed `placement_events.py` — its functionality is now handled by object-level event registration - `ArenaEnvBuilder._solve_relations()` simplified: no longer builds a separate placement event cfg or distinguishes single/multi-env code paths ### Example Update - Update default objects in `gr1_table_multi_object_no_collision_environment`, add TODO for potential object collision issues after running the solver
## Summary Generalize and simplify our loco-manipulation task. ## Detailed description - Remove G1, galileo, and object specific details, to change `g1_locomanip_pick_and_place_task`, which was specific to the galileo environment, into `locomanip_pick_and_place_task`, which is general to any environment. - Required expanding our contact sensor creation to support contact _against_ objects with rigid bodies not at their root. - `LocomanipPickAndPlaceTask` is now a shallow extention of `PickAndPlaceTask`. It inherits all its functionality from the pick-and-place task, except for the mimic config, which is special for 2 hands + navigation.
## Summary Address the comments left in [Batch Suport for Relation Solver ](#512) ## Detailed description - Remove "(useful for deterministic evaluation)" - Convert NOTE to TODO(zhx06) - Fix quaternion order according to Lab 3.0
## Summary Brings `develop` up to date with `main`. --------- Signed-off-by: Clemens Volk <cvolk@nvidia.com> Signed-off-by: Lionel Gulich <lgulich@nvidia.com> Co-authored-by: Vikram Ramasamy <158473438+viiik-inside@users.noreply.github.com> Co-authored-by: qianlin <53278415+qianl-nv@users.noreply.github.com> Co-authored-by: Xinjie Yao <xyao@nvidia.com> Co-authored-by: Alex Millane <amillane@nvidia.com> Co-authored-by: lgulich <22480644+lgulich@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: isaaclab-review-bot[bot] <270793704+isaaclab-review-bot[bot]@users.noreply.github.com>
## Summary Refactors how we handle spawner objects, to separate their specification from object type ## Detailed description - Addresses #592 - Separate `ObjectType` and `SPAWNER` --------- Co-authored-by: Xinjie Yao <xyao@nvidia.com>
## Summary Add listing of the number of CPUs to the CI workflow. ## Detailed description - Further introspection of which machine we're running on. Co-authored-by: Xinjie Yao <xyao@nvidia.com>
Supersedes #573 (rebased onto `develop` due to batch solver divergence). ## Motivation No-overlap between objects was managed via explicit `NoCollision` relations that `ArenaEnvBuilder` auto-injected. This was an implementation detail leaking into the user API, and the solver had no built-in collision avoidance. ## Summary - No-overlap is now a built-in behavior of `RelationSolver`, controlled by a single `clearance_m` parameter on `RelationSolverParams` (default 1cm). - The solver computes pairwise no-overlap loss for all object pairs automatically (except anchor-anchor). - `NoCollision` class removed from the public API. - `ArenaEnvBuilder._add_pairwise_no_collision()` workaround removed. - `ObjectPlacerParams.min_separation_m` removed; validation unified to use `clearance_m`. - Stale docs and comments updated. ## Test plan - [ ] All 62 relation/placer tests pass - [x] Pre-commit checks pass --------- Signed-off-by: Clemens Volk <cvolk@nvidia.com> Signed-off-by: Lionel Gulich <lgulich@nvidia.com> Co-authored-by: Vikram Ramasamy <158473438+viiik-inside@users.noreply.github.com> Co-authored-by: qianlin <53278415+qianl-nv@users.noreply.github.com> Co-authored-by: Xinjie Yao <xyao@nvidia.com> Co-authored-by: Alex Millane <amillane@nvidia.com> Co-authored-by: lgulich <22480644+lgulich@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: isaaclab-review-bot[bot] <270793704+isaaclab-review-bot[bot]@users.noreply.github.com>
## Summary Update `AGENTS.md` to add the full test suite command. ## Detailed description - You can now ask your agent to run the full test suite, if that's something you want. --------- Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: Xinjie Yao <xyao@nvidia.com>
## Summary Move's our environment registration from a static map to the registry pattern that we use for assets etc. ## Detailed description - Using a static map meant that a user registering a new environment would have to add their environment by-hand to a static map. - Now registration is automatic when a class subclassing `ExampleEnvironment` is added to the folder in `issaclab_arena_environments`
## Summary Rename `asset_registry.py` -> `registries.py` to better reflect the fact that we now have many registries. ## Detailed description - Follows a review comment in #598
## Summary Isolate subprocess tests in their own job in CI. ## Detailed description - The subprocess-requiring tests are currently extremely unreliable and frequently hang causing the whole job to fail. - This change isolates them into their own job, which I will make optional for merging.
## Summary Experimenting with caching shaders in CI to save on long compilation times. ## Detailed description - Keyed on Isaac Sim version-only, hopefully this is specific enough. Will monitor - Results for running a single camera-requiring test: - No cache: 13 minutes ([here](https://github.com/isaac-sim/IsaacLab-Arena/actions/runs/24667595106/job/72129213471#step:15:1)) - With shaders cached: 1minute 47seconds ([here](https://github.com/isaac-sim/IsaacLab-Arena/actions/runs/24667595106/job/72133812562#step:15:1))
## Summary Calling the isaac sim warmup script appears to stall things. Removing.
## Summary Merge main into develop --------- Signed-off-by: Clemens Volk <cvolk@nvidia.com> Signed-off-by: Lionel Gulich <lgulich@nvidia.com> Co-authored-by: Vikram Ramasamy <158473438+viiik-inside@users.noreply.github.com> Co-authored-by: qianlin <53278415+qianl-nv@users.noreply.github.com> Co-authored-by: Xinjie Yao <xyao@nvidia.com> Co-authored-by: Clemens Volk <cvolk@nvidia.com> Co-authored-by: lgulich <22480644+lgulich@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: isaaclab-review-bot[bot] <270793704+isaaclab-review-bot[bot]@users.noreply.github.com> Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
## Summary Pool-based object placement with fresh layouts on environment reset ## Detailed description What changed: - Added `PlacementPool` that pre-solves valid layouts at build time and serves them on reset via `placement_events.py`. - Rewritten `ArenaEnvBuilder._solve_relations()` to use the pool, with `--resolve_on_reset` / `--no-resolve_on_reset` controlling behavior. - Added `--episode_length_s` to `gr1_table_multi_object_no_collision` for periodic resets. ## Impact - Fresh collision-free layouts on every reset, different across envs and episodes. - Solver runs once at build time (batched), not per-reset. --------- Co-authored-by: alex <amillane@nvidia.com>
qianl-nv
approved these changes
Apr 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Merge develop into main.
Detailed description
v0.2.0was branched, moving development back to main.