STARBackend: create 96-head mix96#1096
Open
BioCam wants to merge 4 commits into
Open
Conversation
Mixes in place with the rigid 96-head, built on the head96_experimental_aspirate / head96_experimental_dispense primitives. Moves X/Y over a target (declared as an explicit a1_coordinate or an aspirate96-style resource, plus offset), descends in two stages (descent_speed to just above the well, then swap_speed in), runs mix.repetitions symmetric surface-following aspirate/dispense cycles between the floor and the surface-following distance above it, settles, then retracts at swap_speed before the traverse out. v1 supports only LLDMode.OFF. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reorder mix96 parameters (and the docstring Args to match) by the chronological order in which they take effect as the command runs, so the signature mirrors the execution flow. Reword the LLD guard message to drop the "v1" version tag. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Two minimal orchestration tests for the highest-risk mix96 failure modes: the experimental command's minimum_height is the resolved tip-bottom floor (cavity_bottom + offset.z), and the careful descent starts surface following at floor + surface_following_distance so the stroke spans [floor, floor+sf] and never drives below the floor. Sub-primitives are mocked via a shared _stub_mix96_motion helper. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mix96 drives the 96-head over the deck with H0 direct-drive moves, which - unlike the C0 core-96 commands - do not raise the single pipetting channels to safe Z at firmware level. A channel left lowered would then sweep through the X/Y traverse, so mix96 now clears all channels to safe Z (C0 ZA) before moving. The test stub mocks that call alongside the other primitives. Also correct the mix96 docstring's target-declaration list to a blank-line-delimited RST bullet list, which the docs build (warnings-as-errors) was rejecting as an unexpected indentation. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
Creates
mix96- in-place mixing with the rigid 96-head, built on thehead96_experimental_aspirate/head96_experimental_dispenseprimitives. It positions the head over a target and runs repeated surface-following aspirate / dispense cycles, taking the mix parameters directly rather than a liquid class. Builds on #1089 (the experimental aspirate / dispense), #1081 (thehead96_move_xacceleration control), and #1086 / #1088 (the tip-bottom Z reference and per-drive speed / acceleration scoping).The target is declared in exactly one of two ways, like
aspirate96: an explicita1_coordinate, or aresource(a Plate - head A1 over well A1 - a Container, or a list of Wells) plusoffset. All Z is tip-bottom referenced: the declared Z (or a well's cavity_bottom) is the floor, the deepest the tip end reaches, andoffset.zlifts the whole stroke off it.Motion: parks the iSWAP, traverses to a start height, moves X/Y (X acceleration dialled down below y=200 mm, the low-Y zone where the head is cantilevered off the X-drive), descends in two stages (
descent_speedto just above the well, thenswap_speedinto it), runsmix.repetitionssymmetric cycles between the floor andsurface_following_distanceabove it, waitssettling_time, then retracts atswap_speedbefore the traverse out.lld_modecurrently accepts onlyLLDMode.OFF; liquid-level-driven auto surface following (computing the surface-following distance from a cLLD probe) is planned as a follow-up.Validated on hardware: the surface-following primitive this builds on moved the tip exactly 8 mm down and back, repeatably with no drift (#1089).
Tests: two minimal orchestration assertions for the highest-risk paths - the experimental command's
minimum_heightresolves to the tip-bottom floor (a well's cavity_bottom plusoffset.z), and the careful descent starts surface following at floor +surface_following_distanceso the stroke spans [floor, floor+sf] and never drives below the floor.