Add an optional build-time, sim-free gate to keep only the object layouts a robot can actually reach, using cuRobo IK (Part 2/3)#914
Conversation
3134be9 to
314de34
Compare
zhx06
left a comment
There was a problem hiding this comment.
Focused pass on the reachability-solver interface — i.e. how the IK gate validates the geometry-valid layouts. The plumbing (registry indirection, geometry-first short-circuit, reject-&-refill) is clean and keeps core vendor-agnostic. My main concern is that the current IK check is pose-residual only and does not yet enforce the collision world it goes to some trouble to build, so "IK reachable" doesn't actually validate the geometric/collision feasibility a grasp needs. Inline notes below.
zhx06
left a comment
There was a problem hiding this comment.
Follow-up focused on the relation-solver side of the interface — where the gate actually plugs into PooledObjectPlacer. The predicate hook itself is a clean seam, but the placement of the call inside the refill loop has a real efficiency cost, and the Callable[..., bool] contract hides a mutation. Notes inline.
zhx06
left a comment
There was a problem hiding this comment.
A few more fixable items on the core relation-solver side (the geometry path that feeds the gate), independent of cuRobo.
alexmillane
left a comment
There was a problem hiding this comment.
Thanks for putting this together. Great that it's working!
I've left a few comments. I think we need to investigate the class heirachy and see how we can build this into the solver such that's not passed in from the top level.
a4d6455 to
102eaa0
Compare
6abe142 to
79a991d
Compare
102eaa0 to
efb689e
Compare
e4ef360 to
9794812
Compare
efb689e to
c7a5fde
Compare
Greptile SummaryThis PR adds an optional build-time IK-reachability gate to the placement pool: before storing a candidate layout, a
Confidence Score: 3/5The gated-validator mechanics and sim-free IK solver are well-implemented, but the activation path wires the check for all environments with a cuRobo-registered embodiment rather than only those that request it. configure_reachability_validator builds the GPU solver and installs the validator regardless of enabled_checks. Since build_validators includes all extra_validators when enabled_checks is None, this silently enables IK reachability for environments that never opted in — potentially causing refill loops or very slow pool fills as a behavioral regression. isaaclab_arena_curobo/ik_reachability_validator.py and isaaclab_arena/environments/arena_env_builder.py need the enabled_checks guard before the solver is built. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[ArenaEnvBuilder._make_placement_params] --> B[configure_reachability_validator]
B -->|cuRobo unavailable| C[no-op return False]
B -->|cuRobo available + embodiment has config| D[build_reachability_validator]
D --> E[SimFreeIKSolver created on GPU]
E --> F[ReachabilityValidator wraps predicate]
F --> G[appended to extra_validators]
G --> H[build_validators]
H -->|enabled_checks=None| I[ALL extra_validators included]
H -->|enabled_checks set without ik_reachable| J[filtered out but solver already built]
H -->|enabled_checks includes ik_reachable| K[validator included]
I --> L[ObjectPlacer._validate_candidates]
K --> L
L --> M[Pass 1 non-gated validators]
M --> N[Pass 2 gated ReachabilityValidator on geometry-passing subset]
N -->|all pass| O[layout stored]
N -->|any fail| P[layout rejected refill loop]
|
alexmillane
left a comment
There was a problem hiding this comment.
Review round 2.
Looking good. I have quite a few comments and questions.
Happy to have another look when you're ready.
alexmillane
left a comment
There was a problem hiding this comment.
Thanks for cleaning this all up. it's looking much better. clean!
I had a couple of questions around the structure of the validator, but you're clear to merge.
qianl-nv
left a comment
There was a problem hiding this comment.
Thanks for multi rounds of updates. LGTM!
- Add curobo_frame_utils/curobo_ik_utils and standalone_ik_layout_validator: a build-time, SimApp-free top-down-grasp IK reachability check over pooled layouts. - Replace ik_utils with the standalone/live IK split; refresh curobo_planner_utils and placement_pool_ik_validation accordingly. - Add EmbodimentBase.get_base_pose, utils/device.resolve_cuda_device, the --validate_reachability CLI flag, and ArenaEnvBuilderCfg fields. - Add reachability_validator_registry.resolve_reachability_validator to discover an extension's make_reachability_validator entry point, keeping cuRobo out of core. Signed-off-by: Xinjie Yao <xyao@nvidia.com>
- Add ReachabilityValidator (check IK_REACHABLE) wrapping the extension-supplied per-layout predicate on ObjectPlacerParams.reachability_validator, so reachability flows through the same registry, check-name, and required_checks machinery as the geometry validators instead of a bespoke pool-level gate. - Make the validator opt-in (enabled_by_default only once a predicate is provisioned) and gated: object_placer runs gated validators only on candidates that already pass the required non-gated checks, so cuRobo IK never runs on geometry-rejected layouts. - Because IK_REACHABLE is a required check, PlacementResult.success reflects reachability and the existing pool reject-and-refill needs no special-casing. - Wire --validate_reachability through ArenaEnvBuilder to provision the predicate and enable/require the check; port the reachability pool tests to the new contract. Signed-off-by: Xinjie Yao <xyao@nvidia.com>
Declare a task_constraint (pick_object + optional place_destination) in the env graph YAML and thread its target object ids through ObjectPlacerParams so the build-time IK reachability gate checks only the task-relevant objects instead of every movable object. - New TaskConstraintSpec with target_object_ids() extractor (pick always; place destination only when it names an object) - ArenaEnvGraphSpec validates the constraint's ids against known assets - ReachabilityValidator focuses on target_object_ids, falling back to all movable objects when unset - Example task_constraint added to banana_on_plate.yaml Signed-off-by: Xinjie Yao <xyao@nvidia.com>
fa1ec61 to
a03d53f
Compare
Summary
Today the solver only checks that objects fit geometrically, before placement event. This MR adds a second, optional check: a layout is stored only when it passes geometry and the robot can reach a top-down grasp at every movable object. The placement loop keeps re-sampling until every env has enough reachable layouts.
Detailed description
How to
Run in curobo image (-c). Include ik_reachability in enabled_checks
Logs will show how many layouts are rejected after validation upon each refill
[placement] Validated 50 candidate layout(s); passed per check: on_relation=48/50, next_to=50/50, not_next_to=50/50, face_to=50/50, no_overlap=41/50, ik_reachable=1/40


(Green dots: reachable voxels, red bbox: objects unreachable by eef)
Note
TODO