Skip to content

Commit

Permalink
chore(api): clean up lld hardware layer (#15200)
Browse files Browse the repository at this point in the history
<!--
Thanks for taking the time to open a pull request! Please make sure
you've read the "Opening Pull Requests" section of our Contributing
Guide:


https://github.com/Opentrons/opentrons/blob/edge/CONTRIBUTING.md#opening-pull-requests

To ensure your code is reviewed quickly and thoroughly, please fill out
the sections below to the best of your ability!
-->

# Overview

This PR removes some uneeded arguments and fixes a few #FIXME that were
hanging around

<!--
Use this section to describe your pull-request at a high level. If the
PR addresses any open issues, please tag the issues here.
-->

# Test Plan

<!--
Use this section to describe the steps that you took to test your Pull
Request.
If you did not perform any testing provide justification why.

OT-3 Developers: You should default to testing on actual physical
hardware.
Once again, if you did not perform testing against hardware, justify
why.

Note: It can be helpful to write a test plan before doing development

Example Test Plan (HTTP API Change)

- Verified that new optional argument `dance-party` causes the robot to
flash its lights, move the pipettes,
then home.
- Verified that when you omit the `dance-party` option the robot homes
normally
- Added protocol that uses `dance-party` argument to G-Code Testing
Suite
- Ran protocol that did not use `dance-party` argument and everything
was successful
- Added unit tests to validate that changes to pydantic model are
correct

-->

# Changelog

<!--
List out the changes to the code in this PR. Please try your best to
categorize your changes and describe what has changed and why.

Example changelog:
- Fixed app crash when trying to calibrate an illegal pipette
- Added state to API to track pipette usage
- Updated API docs to mention only two pipettes are supported

IMPORTANT: MAKE SURE ANY BREAKING CHANGES ARE PROPERLY COMMUNICATED
-->

# Review requests

<!--
Describe any requests for your reviewers here.
-->

# Risk assessment

<!--
Carefully go over your pull request and look at the other parts of the
codebase it may affect. Look for the possibility, even if you think it's
small, that your change may affect some other part of the system - for
instance, changing return tip behavior in protocol may also change the
behavior of labware calibration.

Identify the other parts of the system your codebase may affect, so that
in addition to your own review and testing, other people who may not
have the system internalized as much as you can focus their attention
and testing there.
-->
  • Loading branch information
ryanthecoder authored May 23, 2024
1 parent d5eb9c7 commit 9a877ec
Show file tree
Hide file tree
Showing 10 changed files with 31 additions and 31 deletions.
2 changes: 0 additions & 2 deletions api/src/opentrons/config/defaults_ot3.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
DEFAULT_LIQUID_PROBE_SETTINGS: Final[LiquidProbeSettings] = LiquidProbeSettings(
starting_mount_height=100,
max_z_distance=40,
min_z_distance=5,
mount_speed=10,
plunger_speed=5,
sensor_threshold_pascals=40,
Expand Down Expand Up @@ -337,7 +336,6 @@ def _build_default_liquid_probe(
"starting_mount_height", default.starting_mount_height
),
max_z_distance=from_conf.get("max_z_distance", default.max_z_distance),
min_z_distance=from_conf.get("min_z_distance", default.min_z_distance),
mount_speed=from_conf.get("mount_speed", default.mount_speed),
plunger_speed=from_conf.get("plunger_speed", default.plunger_speed),
sensor_threshold_pascals=from_conf.get(
Expand Down
1 change: 0 additions & 1 deletion api/src/opentrons/config/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,6 @@ class OutputOptions(int, Enum):
class LiquidProbeSettings:
starting_mount_height: float
max_z_distance: float
min_z_distance: float
mount_speed: float
plunger_speed: float
sensor_threshold_pascals: float
Expand Down
9 changes: 7 additions & 2 deletions api/src/opentrons/hardware_control/backends/ot3controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@
LiquidNotFoundError,
CommunicationError,
PythonException,
UnsupportedHardwareCommand,
)

from .subsystem_manager import SubsystemManager
Expand Down Expand Up @@ -1367,12 +1368,16 @@ async def liquid_probe(
probe: InstrumentProbeType = InstrumentProbeType.PRIMARY,
) -> float:
if output_option == OutputOptions.sync_buffer_to_csv:
assert (
if (
self._subsystem_manager.device_info[
SubSystem.of_mount(mount)
].revision.tertiary
== "1"
)
):
raise UnsupportedHardwareCommand(
"Liquid Probe not supported on this pipette firmware"
)

head_node = axis_to_node(Axis.by_mount(mount))
tool = sensor_node_for_pipette(OT3Mount(mount.value))
csv_output = bool(output_option.value & OutputOptions.stream_to_csv.value)
Expand Down
19 changes: 14 additions & 5 deletions api/src/opentrons/hardware_control/ot3api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2580,13 +2580,22 @@ async def liquid_probe(
if probe_settings.aspirate_while_sensing:
await self._move_to_plunger_bottom(mount, rate=1.0)
else:
# TODO: shorten this distance by only moving just far enough
# to account for the specified "max-z-distance"
# find the ideal travel distance by multiplying the plunger speed
# by the time it will take to complete the z move.
ideal_travel = probe_settings.plunger_speed * (
probe_settings.max_z_distance / probe_settings.mount_speed
)

# TODO limit the z distance to the max allowed by the plunger travel at this speed.
# or here is probably the ideal place to implement multi-probe
assert (
instrument.plunger_positions.bottom - ideal_travel
>= instrument.plunger_positions.top
)
target_point = instrument.plunger_positions.bottom - ideal_travel
target_pos = target_position_from_plunger(
checked_mount, instrument.plunger_positions.top, self._current_position
checked_mount, target_point, self._current_position
)
# FIXME: this should really be the slower "aspirate" speed,
# but this is still in testing phase so let's bias towards speed
max_speeds = self.config.motion_settings.default_max_speed
speed = max_speeds[self.gantry_load][OT3AxisKind.P]
await self._move(target_pos, speed=speed, acquire_lock=True)
Expand Down
1 change: 0 additions & 1 deletion api/tests/opentrons/config/ot3_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,6 @@
"liquid_sense": {
"starting_mount_height": 80,
"max_z_distance": 20,
"min_z_distance": 3,
"mount_speed": 10,
"plunger_speed": 10,
"sensor_threshold_pascals": 17,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,6 @@ def fake_liquid_settings() -> LiquidProbeSettings:
return LiquidProbeSettings(
starting_mount_height=100,
max_z_distance=15,
min_z_distance=5,
mount_speed=40,
plunger_speed=10,
sensor_threshold_pascals=15,
Expand Down
15 changes: 10 additions & 5 deletions api/tests/opentrons/hardware_control/test_ot3_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,6 @@ def fake_liquid_settings() -> LiquidProbeSettings:
return LiquidProbeSettings(
starting_mount_height=100,
max_z_distance=15,
min_z_distance=10,
mount_speed=40,
plunger_speed=10,
sensor_threshold_pascals=15,
Expand Down Expand Up @@ -776,12 +775,19 @@ async def test_liquid_probe(
pipette_node: Axis,
mount: OT3Mount,
fake_liquid_settings: LiquidProbeSettings,
mock_instrument_handlers: Tuple[MagicMock],
mock_current_position_ot3: AsyncMock,
mock_ungrip: AsyncMock,
mock_move_to_plunger_bottom: AsyncMock,
) -> None:
mock_ungrip.return_value = None
instr_data = AttachedPipette(
config=load_pipette_data.load_definition(
PipetteModelType("p1000"), PipetteChannelType(1), PipetteVersionType(3, 4)
),
id="fakepip",
)
await ot3_hardware.cache_pipette(mount, instr_data, None)
pipette = ot3_hardware.hardware_pipettes[mount.to_mount()]
assert pipette
await ot3_hardware.add_tip(mount, 100)
await ot3_hardware.home()
mock_move_to.return_value = None

Expand All @@ -800,7 +806,6 @@ async def test_liquid_probe(
fake_settings_aspirate = LiquidProbeSettings(
starting_mount_height=100,
max_z_distance=15,
min_z_distance=5,
mount_speed=40,
plunger_speed=10,
sensor_threshold_pascals=15,
Expand Down
12 changes: 0 additions & 12 deletions hardware-testing/hardware_testing/gravimetric/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,6 @@ class PhotometricConfig(VolumetricConfig):
1: {
50: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 11,
"plunger_speed": 21,
"sensor_threshold_pascals": 150,
Expand All @@ -99,7 +98,6 @@ class PhotometricConfig(VolumetricConfig):
8: {
50: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 11,
"plunger_speed": 21,
"sensor_threshold_pascals": 150,
Expand All @@ -110,21 +108,18 @@ class PhotometricConfig(VolumetricConfig):
1: {
50: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 5,
"plunger_speed": 10,
"sensor_threshold_pascals": 200,
},
200: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 5,
"plunger_speed": 10,
"sensor_threshold_pascals": 200,
},
1000: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 5,
"plunger_speed": 11,
"sensor_threshold_pascals": 150,
Expand All @@ -133,21 +128,18 @@ class PhotometricConfig(VolumetricConfig):
8: {
50: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 5,
"plunger_speed": 10,
"sensor_threshold_pascals": 200,
},
200: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 5,
"plunger_speed": 10,
"sensor_threshold_pascals": 200,
},
1000: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 5,
"plunger_speed": 11,
"sensor_threshold_pascals": 150,
Expand All @@ -156,21 +148,18 @@ class PhotometricConfig(VolumetricConfig):
96: {
50: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 5,
"plunger_speed": 10,
"sensor_threshold_pascals": 200,
},
200: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 5,
"plunger_speed": 10,
"sensor_threshold_pascals": 200,
},
1000: {
"max_z_distance": 20,
"min_z_distance": 5,
"mount_speed": 5,
"plunger_speed": 11,
"sensor_threshold_pascals": 150,
Expand All @@ -189,7 +178,6 @@ def _get_liquid_probe_settings(
return LiquidProbeSettings(
starting_mount_height=well.top().point.z,
max_z_distance=min(well.depth, lqid_cfg["max_z_distance"]),
min_z_distance=lqid_cfg["min_z_distance"],
mount_speed=lqid_cfg["mount_speed"],
plunger_speed=lqid_cfg["plunger_speed"],
sensor_threshold_pascals=lqid_cfg["sensor_threshold_pascals"],
Expand Down
1 change: 0 additions & 1 deletion hardware-testing/hardware_testing/liquid_sense/execute.py
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,6 @@ def _run_trial(run_args: RunArgs, tip: int, well: Well, trial: int) -> float:
lps = LiquidProbeSettings(
starting_mount_height=start_height,
max_z_distance=z_dist,
min_z_distance=lqid_cfg["min_z_distance"],
mount_speed=run_args.z_speed,
plunger_speed=plunger_speed,
sensor_threshold_pascals=lqid_cfg["sensor_threshold_pascals"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1377,7 +1377,6 @@ async def _test_liquid_probe(
probe_settings = LiquidProbeSettings(
starting_mount_height=start_pos.z,
max_z_distance=max_z_distance_machine_coords, # FIXME: deck coords
min_z_distance=0, # FIXME: remove
mount_speed=probe_cfg.mount_speed,
plunger_speed=probe_cfg.plunger_speed,
sensor_threshold_pascals=probe_cfg.sensor_threshold_pascals,
Expand Down

0 comments on commit 9a877ec

Please sign in to comment.