Reset position to starting point when CSM is cancelled
NB there's a confusing feature, where stage.move will fail after the task has been cancelled, because it is cancellable. For now, we can work around it by passing `block_cancellation` but this may want to be solved more generally in LabThings
This commit is contained in:
parent
552fde45ed
commit
26f5b1955e
1 changed files with 12 additions and 5 deletions
|
|
@ -26,7 +26,7 @@ from labthings_picamera2.thing import StreamingPiCamera2
|
||||||
from labthings_sangaboard import SangaboardThing
|
from labthings_sangaboard import SangaboardThing
|
||||||
|
|
||||||
from labthings_fastapi.dependencies.thing import direct_thing_client_dependency
|
from labthings_fastapi.dependencies.thing import direct_thing_client_dependency
|
||||||
from labthings_fastapi.dependencies.invocation import InvocationLogger
|
from labthings_fastapi.dependencies.invocation import InvocationCancelledError, InvocationLogger
|
||||||
from labthings_fastapi.types.numpy import NDArray, denumpify, DenumpifyingDict
|
from labthings_fastapi.types.numpy import NDArray, denumpify, DenumpifyingDict
|
||||||
from labthings_fastapi.decorators import thing_action, thing_property
|
from labthings_fastapi.decorators import thing_action, thing_property
|
||||||
from labthings_fastapi.thing import Thing
|
from labthings_fastapi.thing import Thing
|
||||||
|
|
@ -158,6 +158,7 @@ class CameraStageMapper(Thing):
|
||||||
def calibrate_1d(
|
def calibrate_1d(
|
||||||
self,
|
self,
|
||||||
hw: HardwareInterfaceDep,
|
hw: HardwareInterfaceDep,
|
||||||
|
stage: Stage,
|
||||||
logger: InvocationLogger,
|
logger: InvocationLogger,
|
||||||
direction: Tuple[float, float, float],
|
direction: Tuple[float, float, float],
|
||||||
) -> DenumpifyingDict:
|
) -> DenumpifyingDict:
|
||||||
|
|
@ -166,23 +167,29 @@ class CameraStageMapper(Thing):
|
||||||
tracker = Tracker(hw.grab_image, hw.get_position, settle=hw.settle)
|
tracker = Tracker(hw.grab_image, hw.get_position, settle=hw.settle)
|
||||||
direction_array: np.ndarray = np.array(direction)
|
direction_array: np.ndarray = np.array(direction)
|
||||||
|
|
||||||
result: dict = calibrate_backlash_1d(tracker, move, direction_array, logger=logger)
|
starting_position = stage.position
|
||||||
|
try:
|
||||||
|
result: dict = calibrate_backlash_1d(tracker, move, direction_array, logger=logger)
|
||||||
|
except InvocationCancelledError as e:
|
||||||
|
logger.info("Returning to starting position")
|
||||||
|
stage.move_absolute(**starting_position, block_cancellation=True)
|
||||||
|
raise e
|
||||||
result["move_history"] = move.history
|
result["move_history"] = move.history
|
||||||
result["image_resolution"] = hw.grab_image().shape[:2]
|
result["image_resolution"] = hw.grab_image().shape[:2]
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@thing_action
|
@thing_action
|
||||||
def calibrate_xy(
|
def calibrate_xy(
|
||||||
self, hw: HardwareInterfaceDep, logger: InvocationLogger
|
self, hw: HardwareInterfaceDep, stage: Stage, logger: InvocationLogger
|
||||||
) -> DenumpifyingDict:
|
) -> DenumpifyingDict:
|
||||||
"""Move the microscope's stage in X and Y, to calibrate its relationship to the camera
|
"""Move the microscope's stage in X and Y, to calibrate its relationship to the camera
|
||||||
|
|
||||||
This performs two 1d calibrations in x and y, then combines their results.
|
This performs two 1d calibrations in x and y, then combines their results.
|
||||||
"""
|
"""
|
||||||
logger.info("Calibrating X axis:")
|
logger.info("Calibrating X axis:")
|
||||||
cal_x: dict = self.calibrate_1d(hw, logger, (1, 0, 0))
|
cal_x: dict = self.calibrate_1d(hw, stage, logger, (1, 0, 0))
|
||||||
logger.info("Calibrating Y axis:")
|
logger.info("Calibrating Y axis:")
|
||||||
cal_y: dict = self.calibrate_1d(hw, logger, (0, 1, 0))
|
cal_y: dict = self.calibrate_1d(hw, stage, logger, (0, 1, 0))
|
||||||
logger.info("Calibration complete, updating metadata.")
|
logger.info("Calibration complete, updating metadata.")
|
||||||
|
|
||||||
# Combine X and Y calibrations to make a 2D calibration
|
# Combine X and Y calibrations to make a 2D calibration
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue