Include option for delta stage in microscope initialisation

This commit is contained in:
Samuel McDermott 2020-09-06 17:38:57 +01:00
parent 5e9e8cb2a3
commit 6dcd6601c4
2 changed files with 12 additions and 9 deletions

View file

@ -12,7 +12,7 @@ from openflexure_microscope.captures import CaptureManager
from openflexure_microscope.stage.mock import MissingStage from openflexure_microscope.stage.mock import MissingStage
from openflexure_microscope.camera.mock import MissingCamera from openflexure_microscope.camera.mock import MissingCamera
from openflexure_microscope.stage.sanga import SangaStage from openflexure_microscope.stage.sanga import SangaStage, SangaDeltaStage
try: try:
from openflexure_microscope.camera.pi import PiCameraStreamer from openflexure_microscope.camera.pi import PiCameraStreamer
@ -111,10 +111,18 @@ class Microscope:
stage_port = configuration["stage"].get("port") stage_port = configuration["stage"].get("port")
if stage_type in ("SangaBoard", "SangaStage"): if stage_type in ("SangaBoard", "SangaStage"):
try: try:
logging.info("Trying SangaStage")
self.stage = SangaStage(port=stage_port) self.stage = SangaStage(port=stage_port)
except Exception as e: except Exception as e:
logging.error(e) logging.error(e)
logging.warning("No compatible Sangaboard hardware found.") logging.warning("No compatible Sangaboard hardware found.")
elif stage_type in ("SangaDeltaStage"):
try:
logging.info("Trying SangaDeltaStage")
self.stage = SangaDeltaStage(port=stage_port)
except Exception as e:
logging.error(e)
logging.warning("No compatible Sangaboard hardware found.")
logging.info("Handling fallbacks") logging.info("Handling fallbacks")
### Fallbacks ### Fallbacks

View file

@ -108,10 +108,6 @@ class SangaStage(BaseStage):
axis: None (for 3-axis moves) or one of 'x','y','z' axis: None (for 3-axis moves) or one of 'x','y','z'
backlash: (default: True) whether to correct for backlash. backlash: (default: True) whether to correct for backlash.
""" """
if axis is not None:
displacement = self.steps_to_array(displacement, axis)
with self.lock: with self.lock:
logging.debug(f"Moving sangaboard by {displacement}") logging.debug(f"Moving sangaboard by {displacement}")
if not backlash or self.backlash is None: if not backlash or self.backlash is None:
@ -193,7 +189,6 @@ class SangaStage(BaseStage):
print("Move completed, raising exception...") print("Move completed, raising exception...")
raise value # Propagate the exception raise value # Propagate the exception
class SangaDeltaStage(SangaStage): class SangaDeltaStage(SangaStage):
def __init__(self, port=None, flex_h=80, flex_a=50, flex_b=50, camera_angle=0, **kwargs): def __init__(self, port=None, flex_h=80, flex_a=50, flex_b=50, camera_angle=0, **kwargs):
self.flex_h = flex_h self.flex_h = flex_h
@ -208,13 +203,15 @@ class SangaDeltaStage(SangaStage):
[0, 0, 1] [0, 0, 1]
]) ])
logging.debug(self.R_camera)
# Transformation matrix converting delta into cartesian # Transformation matrix converting delta into cartesian
x_fac = -1 * np.multiply(np.divide(2, np.sqrt(3)), np.divide(self.flex_b, self.flex_h)) x_fac = -1 * np.multiply(np.divide(2, np.sqrt(3)), np.divide(self.flex_b, self.flex_h))
y_fac = -1 * np.divide(self.flex_b, self.flex_h) y_fac = -1 * np.divide(self.flex_b, self.flex_h)
z_fac = np.multiply(np.divide(1, 3), np.divide(self.flex_b, self.flex_a)) z_fac = np.multiply(np.divide(1, 3), np.divide(self.flex_b, self.flex_a))
self.Tvd = np.array([ self.Tvd = np.array([
[x_fac, -x_fac, 0], [-x_fac, x_fac, 0],
[0.5 * y_fac, 0.5 * y_fac, -y_fac], [0.5 * y_fac, 0.5 * y_fac, -y_fac],
[z_fac, z_fac, z_fac] [z_fac, z_fac, z_fac]
]) ])
@ -234,8 +231,6 @@ class SangaDeltaStage(SangaStage):
return [int(p) for p in position] return [int(p) for p in position]
def move_rel(self, displacement, axis=None, backlash=True): def move_rel(self, displacement, axis=None, backlash=True):
if axis is not None:
displacement = self.steps_to_array(displacement, axis)
# Transform into camera coordinates # Transform into camera coordinates
displacement = np.dot(self.R_camera, displacement) displacement = np.dot(self.R_camera, displacement)