refactor(manipulation): compose canonical pick and place - #3715
refactor(manipulation): compose canonical pick and place#3715ruthwikdasyam wants to merge 6 commits into
Conversation
❌ 1 Tests Failed:
View the top 1 failed test(s) by shortest run time
To view more test analytics, go to the Test Analytics Dashboard |
c313d61 to
6e9d305
Compare
8efb261 to
28e0f4a
Compare
Greptile SummaryThis change replaces the inherited pick-and-place implementation with composed scene registration, grasp generation, and manipulation services, and wires the new skills into real and simulated xArm blueprints. The held-object scan-and-place flow, blueprint imports, movement capability declarations, and targeted pick-and-place tests completed successfully. However, a failed plan for the first grasp proposal stops the operation instead of trying later ranked proposals that may be reachable. Confidence Score: 4/5Not ready to merge because a reachable object can be left unpicked when the highest-ranked grasp is not plannable. The failure was reproduced with a realistic-fake workflow harness that exercised an unplannable first grasp and a plan-valid second grasp. The targeted unit suite passed, but it does not cover retrying ranked grasp proposals after a planning failure. Files Needing Attention: dimos/manipulation/pick_and_place_module.py needs a bounded ranked-grasp retry path, with corresponding coverage in dimos/manipulation/test_pick_and_place_unit.py.
What T-Rex did
|
| candidate = candidates.candidates[0] | ||
| grasp = self._apply_yaw_policy( | ||
| PoseStamped( | ||
| ts=candidates.header.timestamp, | ||
| frame_id=candidates.header.frame_id, | ||
| position=candidate.pose.position, | ||
| orientation=candidate.pose.orientation, | ||
| ), | ||
| group, | ||
| ) | ||
| pregrasp = self._offset_pose(grasp, self.config.pregrasp_offset) | ||
| if failure := self._open_gripper(group, "pre-grasp open"): | ||
| return failure | ||
| if failure := self._move(pregrasp, group): | ||
| return failure |
There was a problem hiding this comment.
Ranked grasp fallback is never attempted
pick_object selects only candidates.candidates[0] and returns when that candidate's pregrasp plan fails. Later ranked proposals are never considered, even if one is reachable. The executed harness provided two proposals, made rank 0 unplannable, and observed PLANNING_FAILED after planning only rank 0; the plan-valid rank-1 proposal was not attempted. Iterate through a bounded set of ranked candidates and return GRASP_ATTEMPTS_EXHAUSTED only after all eligible proposals have failed.
Artifacts
Focused PR 3715 capability workflow review harness
- Authored realistic-fake harness that executes ranked pick fallback, scan-while-holding then place, and blueprint/capability composition checks; it is the executable proof source.
Base workflow pick retry implementation
- Captured base revision pick implementation showing its loop over up to five grasp candidates and continuation after an approach planning failure; the comparison establishes the removed fallback behavior.
PR 3715 composed workflow harness output
- Captured output from the executed PR harness: rank 0 planning failed without trying rank 1, while the holding scan then place flow and blueprint/capability checks succeeded; the takeaway is one reproducible retry regression.
PR 3715 targeted pick and place unit suite
- Captured output from the existing targeted pick/place unit suite, which completed successfully with 17 passing tests; the takeaway is that current tests do not cover ranked planning fallback.
Real and simulated xArm blueprint import output
- Captured output from importing the real and MuJoCo simulated xArm perception blueprints; both imported as Blueprint objects, confirming practical composition importability.
28e0f4a to
7cf1338
Compare
| # plunging deep and colliding with the object body. | ||
| _TALL_OBJECT_MIN_HEIGHT = 0.06 | ||
| class PickAndPlaceModuleConfig(ModuleConfig): | ||
| planning_frame: str = "world" |
There was a problem hiding this comment.
| planning_frame: str = "world" | |
| planning_frame: str = "base_link" |
| class PickAndPlaceModuleConfig(ModuleConfig): | ||
| planning_frame: str = "world" | ||
| pregrasp_offset: float = Field(default=0.10, gt=0.0) | ||
| yaw_policy: Literal["generated", "preserve_current"] = "generated" |
There was a problem hiding this comment.
Should be a heuristic grasp config
Summary
Stack
ruthwik/feat/osr-owlvit-edgetam).Validation
TMPDIR=/dev/shm uv run --no-sync pytest dimos/manipulation/test_pick_and_place_unit.py dimos/perception/experimental/test_object_scene_registration_temporal.py dimos/robot/test_all_blueprints_generation.py -qDeliberately Deferred