fix(manip): sync the pick/place gripper on feedback and verify the grasp - #3701
Conversation
Codecov Report❌ Patch coverage is
@@ Coverage Diff @@
## main #3701 +/- ##
==========================================
+ Coverage 77.98% 78.00% +0.01%
==========================================
Files 1296 1298 +2
Lines 124870 125110 +240
Branches 10901 10930 +29
==========================================
+ Hits 97383 97586 +203
- Misses 24315 24353 +38
+ Partials 3172 3171 -1
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 2 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Greptile SummaryThis change replaces fixed gripper delays with feedback-based settlement, adds grasp verification, and reports gripper command failures more clearly. A settled gripper readback is currently accepted as a completed opening without confirming that the jaws reached the requested open position. If the gripper stalls partway open, pick and place can continue with partially closed jaws, potentially interfering with approach, release, or retraction. T-Rex validation blockedThe deterministic partial-opening reproduction could not execute the gripper method because the Python package Confidence Score: 4/5Do not merge until opening completion verifies that the settled gripper position is sufficiently close to the requested open position. The affected success path accepts any available settled readback without comparing it with the configured open target. The dedicated runtime reproduction was blocked before the method could run, but the control flow establishes the incomplete-opening path. Files Needing Attention: dimos/manipulation/pick_and_place_module.py, especially the settled-feedback success branch in _open_gripper.
What T-Rex did
Reviews (1): Last reviewed commit: "fix(manip): sync the pick/place gripper ..." | Re-trigger Greptile |
83efbd1 to
4ad9909
Compare
d249e9d to
a4244f5
Compare
The pick/place flow synchronized with wall-clock sleeps: 0.5s after the pre-grasp open, 1.5s after the close, 1.0s after the release. Nothing ever checked the object was held, so a slow close got truncated, a fast one wasted time, and a missed grasp sailed on to the lift. Each sleep becomes a deadline poll on the measured gripper readback, matching the PlanExecutionManager.wait style. A close now also classifies where the jaws stalled: readback settling above closed+empty_epsilon and below open-open_margin means an object is in the way, at or below the low edge means an empty grasp, and expiry fails loudly. Thresholds live on RobotModelConfig.grasp_verification alongside the other per-robot pick tunables, and verification is on by default.
a4244f5 to
0c535a6
Compare
The defect
dimos/manipulation/pick_and_place_module.pysynchronized the gripper with wall-clock sleeps, and nothing anywhere verified a grasp::543time.sleep(0.5):561time.sleep(1.5)# Wait for gripper to close:652time.sleep(1.0)Open-loop timing means a slow close gets truncated and a fast one wastes time. Worse, a missed grasp sailed straight on to the lift.
The mechanism
Gripper readback is measured, not an echo of the command
Each sleep is now a deadline poll that settles the readback, matching the house style of
PlanExecutionManager.wait(dimos/manipulation/execution_manager.py:212)Tests
test_grasp_verification.py(13) — the poll helper against a mocked readback with an injected clock: settle, stall band, timeout, never-travelled, late readback, band edges, config validation.