feat(tasks): add declarative physical handover - #505
Conversation
Greptile SummaryThe PR adds a declarative Dual-UR5 handover task and introduces phase-aware physical held-object guards with row-local state reconciliation. It also aligns simulation runner cadence, preserves position-controller preload during settling, and fixes solver configuration construction.
Confidence Score: 5/5The PR appears safe to merge, with no concrete blocking or independently actionable non-blocking issue identified. The new guard path correlates fresh evidence to the active attempt and waypoint, preserves healthy batch rows during reconciliation, and enforces timeout recovery before further command dispatch; the solver and handover configuration paths are likewise consistent with their callers and tests.
|
| Filename | Overview |
|---|---|
| embodichain/lab/sim/atomic_actions/execution.py | Adds correlated phase-aware guard requests/results, row-local relation invalidation, and retry or external-recovery transitions. |
| embodichain/lab/sim/atomic_actions/runner.py | Invokes held-object guards before due commands and supports suppressing observed-position holds during effect verification. |
| embodichain/lab/sim/skills/compiler.py | Grounds Pick, Place, and HandOver held-object invariants against named trajectory segments and physical effect monitors. |
| embodichain/lab/sim/skills/runtime.py | Collects phase-scoped evidence, computes loss masks, and produces authorized removal-only state reconciliation. |
| embodichain/lab/gym/envs/expert_program/simulation_policies.py | Preserves drive targets for active settling rows while holding inactive rows at measured positions. |
| embodichain/lab/sim/solvers/base_solver.py | Passes recognized concrete configuration fields through construction so subclass post-initialization observes finalized values. |
| embodichain_tasks/embodichain_tasks/tableware/hand_over.py | Defines the declarative Dual-UR5/PGI handover environment, calibrated physical scene, profile, and registration. |
| embodichain_tasks/configs/expert_program/tableware/hand_over.yaml | Declares the Pick-to-HandOver workflow, settling policy, and delivery-pose validator. |
| embodichain_tasks/configs/gym/hand_over/dual_ur5.json | Adds the runnable task configuration with dual-arm geometry, controller parameters, and contact dynamics. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Declarative Pick / HandOver call] --> B[Compiler grounds motion and effect guards]
B --> C[ExecutionRunner obtains fresh observation]
C --> D{Held-object guard passes?}
D -- Yes --> E[Dispatch next command]
D -- Loss with retry --> F[Invalidate failed-row relation]
F --> G[Replan within retry budget]
D -- Loss without retry --> H[Emit recovery required]
E --> I[Terminal physical effect verification]
I --> J[Commit verified state]
J --> K[Wait-stable using live target qpos]
K --> L[Validate delivered object pose]
Reviews (1): Last reviewed commit: "feat(atomic-actions): guard in-flight he..." | Re-trigger Greptile
Description
Stack
feat/expert-program-registration-runtime-catalogAdd the Dual-UR5/PGI declarative HandOver vertical slice, its exact pose/effect integration, and real contact-dynamics acceptance coverage. The runtime guards held objects in flight and detects physical loss instead of hiding it with a synthetic attachment.
The layer also fixes solver configuration construction so finalized parameters reach subclasses correctly. HandOver completes through ordinary commands, physical evidence, settling, and validation without simulator-side object repair.
Refs #471
Refs #474
Type of change
Screenshots
Not applicable.
Validation
tests/gym/envs/tasks/test_hand_over.py, simulation-handover/policy tests, atomic runner/session tests, and solver testsChecklist