Repository navigation
Conversation
…s and approach paths The arm's configuration on mantis.arm.configuration; moves in the deck frame through the unit's stage transform, each move across guarded by a rise to the traverse height; speeds in mm/s at the nozzle; park and recovery along each zone's route; move_to_waste and move_to_wash from wherever the head stands; request_pose for every joint in the deck frame. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
BioCam
force-pushed
the
mantis-v1-04-arm-moves
branch
from
November 13, 2026 20:24
f98893f to
e6234df
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
The Mantis can bring its arm up and stop it, but not move it. A move has to be given in PyLabRobot's deck frame, where wells and resources are, while the arm turns two motors through a five-bar linkage and every unit is calibrated at the factory, its plate holder mapped by a stage transform with its own tilt and reference height. A move across the deck must first clear what stands on it, and from wherever the head ends up (any zone of the deck, the waste, a wash) the arm needs a safe way back to idle.
PR Content/Solution
The arm's configuration
mantis.arm.configuration(MantisArmConfiguration, frozen) holds the motor limits read at setup and the unit's calibration from its configuration folder or a saved file: offsets, encoder reference and correction, zones and their routes, approach paths, and the stage transform with its reference height. A block that is missing isNone, and a move that needs it refuses.Moves in the deck frame
The nozzle is the tool point. Over the plate holder the deck frame goes through the unit's exact stage transform; elsewhere through a rigid transform fitted to it. From inside the waste or a wash, every move first leaves along that path.
move_to_location(*, location, minimum_traverse_height_start=None, xy_speed, xy_acceleration, z_speed, z_acceleration)move_to_xy_position(*, x, y, minimum_traverse_height_start=None, speed, acceleration)move_to_z_position(*, z, speed, acceleration)move_to_joint_state(*, joint_state, minimum_traverse_height_start=None, ...)Guarded, as v1 STAR
Every move across is guarded: Z first rises to
minimum_traverse_height_start(default_minimum_traverse_heightwhenNone) if it stands below it, and is read back by its encoder before the arms move.Speeds in standard units
Speeds and accelerations are mm/s and mm/s² at the nozzle, each range-checked when it is set. Left
None, the arms move at the route profile.Zones, parking and recovery
The deck is divided into zones, each with its own route to idle.
park()andsetup()reach idle from any zone along that zone's route, andrecover_from_fault()stops, clears the faults and brings the arm back.The waste and the washes
move_to_waste()andmove_to_wash(*, position)work from wherever the head stands. Where it stands is read from the motors, never remembered: from inside one of these, the head first leaves along that path, and between the two washes it crosses without leaving the wash.Reads
Also
Mantis(simulation=True).On the device
A Mantis v4 on Windows (D2XX), head clear, no chip:
move_to_z_position,move_to_joint_statemove_to_xy_positionin the deck framepark()started 6.5 mm below itmove_to_waste(), thenmove_to_wash(1)from the waste, thenmove_to_wash(2)from wash 1park()out of the waste,move_to_xy_positionout of wash 2recover_from_fault()at idlestop()away from idlesetup()from LeftMiddle, RightFront, RightMiddle, LeftBack and LeftFrontNot yet on the device: moves over the wellplate; recovery from RightBack and from a zone after a power cycle;
park()out of a wash;move_to_wash(1)from wash 2;stop()from away along a zone's route; a traverse height set in the deck frame.Known, to fix in this PR
move_to_z_positionor a Z-onlymove_to_joint_statefirst move the arms out along it.recover_from_fault()andsetup()move the arms along a zone's route before Z rises.xy_speedgiven andxy_accelerationnot, the two arm motors do not end together.is_xy_reachabletakes arm-frame coordinates.MantisPoseandMantisArmConfigurationare not indocs/api; the notebook's arm cells need the unit's configuration folder to run in simulation.🤖 Generated with Claude Code