Repository navigation
Conversation
BioCam
force-pushed
the
core-grippers-plate-adapter-drop
branch
from
October 16, 2026 17:21
bd19387 to
272ce97
Compare
BioCam
force-pushed
the
core-grippers-plate-adapter-drop
branch
3 times, most recently
from
October 16, 2026 20:30
669d0bf to
d030445
Compare
…ripper and device Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BioCam
force-pushed
the
core-grippers-plate-adapter-drop
branch
from
October 16, 2026 23:08
d030445 to
43896e5
Compare
This branch has not been deployed
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.
The Problem
v1's CoRe grippers (STAR and Prep) each kept a fragment of legacy's placement logic and handled only a
ResourceHolder. Anything else was aimed at the destination's own origin, and the model was told the same: a plate placed onto an Alpaqua magnet was sent to the magnet's origin, 28 mm below where the magnet seats it, and a lid, aResourceStackor a rotated holder went to the wrong place too, while aTrashkept the resource in the tree. Offsets were turned by absolute rotations, so a device that is itself rotated placed and gripped off target. Legacy'smove_resourceresolved every destination type in one place; v1 had no shared equivalent, so each new gripper would have had to port it again. And v1 called the movedrop_resource, beside a module-levelplace_resourcethat updates the model.PR Content
pylabrobot/lib/pick_and_place/: legacy's logic in one place for every gripper.locations.get_pick_location/get_place_location: where a resource is, or will be, on the deck, for every destination legacy supports (ResourceHolder,PlateAdapter,ResourceStack,Lidonto itsLiddable,Trash,Coordinate, other), with legacy's rotation handling. Offsets follow the deck's axes (get_rotation_wrt), so a turned device places and grips correctly.locations.get_grip_height: how far above the resource's bottom the fingers close, from exactly one ofpickup_distance_from_top/pickup_distance_from_bottom;get_grip_location: the resource's centre at that height.assignment.assign_placed_resource: the model update, moved fromresources/resource_state.py; it seats the resource at the very location the move used.CoreGrippershold no placement or grip logic of their own.pick_up_resourcetakespickup_distance_from_toporpickup_distance_from_bottom(exactly one; the 5 mm / preferred-location default is gone).place_resourcechecks the destination before any motion, then takes the place location once for both the motion and the model. The STAR'sC0 ZP/C0 ZRtake the grip point as it is; the Prep turns it into its plate-top centre (_compute_plate_top).drop_resource→place_resourceon both;drop_resourceand the Prepmove_resourcedrop_*keywords stay as deprecated aliases, removed in the release after next._unchecked_fw_place_resource(STAR, with its simulator override), Prep_place_at.check_can_drop_resource_hereis unchanged.C0 ZP/C0 ZRparameter and the resulting model match legacy; e.g. the place onto the magnet is nowC0ZRxs05504xd0yj1133zj2162…(was…yj1137zj1881…).Layers of a pick-and-place, on any device
pick_up_resource/place_resourcelib/pick_and_place(shared)get_pick_location/get_place_location,get_grip_height,get_grip_location,assign_placed_resourceC0 ZP/C0 ZRtake the grip point_compute_plate_top: the plate-top centre_pick_up_at/_place_atC0 ZP/C0 ZRPrepPickUpPlate/PrepDropPlatePlacement logic lives only in layer 2; layer 1 takes the place location once, for the motion and the model alike. Every future gripper (iSWAP, PF400, xArm) follows the same layers and names.
Suggested review order
lib/pick_and_place/locations.pyandassignment.py- the logic.pick_up_resource/place_resourcein bothcore_grippers.py- now short.🤖 Generated with Claude Code