Merge remote-tracking branch 'origin/dev' into device_visualization

# Conflicts:
#	README.md
#	README_zh.md
#	recipes/ros-humble-unilabos-msgs/recipe.yaml
#	recipes/unilabos/recipe.yaml
#	setup.py
#	unilabos/devices/liquid_handling/biomek.py
#	unilabos/devices/liquid_handling/biomek_test.py
#	unilabos/devices/liquid_handling/complete_biomek_protocol_0608.json
#	unilabos/registry/devices/liquid_handler.yaml
#	unilabos/registry/registry.py
#	unilabos/ros/msgs/message_converter.py
#	unilabos_msgs/action/LiquidHandlerMoveBiomek.action
#	unilabos_msgs/action/LiquidHandlerTransferBiomek.action
This commit is contained in:
Xuwznln
2025-06-09 17:04:41 +08:00
2 changed files with 13 additions and 25 deletions

View File

@@ -10,6 +10,7 @@ from pylabrobot.resources import (
Container, Container,
Coordinate, Coordinate,
) )
import copy
from unilabos_msgs.msg import Resource from unilabos_msgs.msg import Resource
from unilabos.ros.nodes.resource_tracker import DeviceNodeResourceTracker # type: ignore from unilabos.ros.nodes.resource_tracker import DeviceNodeResourceTracker # type: ignore
@@ -61,7 +62,7 @@ class LiquidHandlerBiomek:
'LocalPattern': True, 'LocalPattern': True,
'Operation': 'Aspirate', 'Operation': 'Aspirate',
'OverrideHeight': False, 'OverrideHeight': False,
'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True),
'Prototype': 'MC P300 High', 'Prototype': 'MC P300 High',
'ReferencedPattern': '', 'ReferencedPattern': '',
'RowsFirst': False, 'RowsFirst': False,
@@ -450,8 +451,8 @@ class LiquidHandlerBiomek:
""" """
items = [] items = []
asp_params = self.aspirate_techniques.get(aspirate_techniques, {}) asp_params = copy.deepcopy(self.aspirate_techniques[aspirate_techniques])
dis_params = self.dispense_techniques.get(dispense_techniques, {}) dis_params = copy.deepcopy(self.dispense_techniques[dispense_techniques])
asp_params['Position'] = source asp_params['Position'] = source
dis_params['Position'] = target dis_params['Position'] = target
@@ -564,7 +565,7 @@ class LiquidHandlerBiomek:
if __name__ == "__main__": if __name__ == "__main__":
print("=== Biomek完整流程测试 ===") print("=== Biomek完整流程测试 ===")
print("包含: 仪器设置 + 完整实验步骤") print("包含: 仪器设置 + 完整实验步骤")
@@ -968,15 +969,6 @@ if __name__ == "__main__":
"liquid_volume": [], "liquid_volume": [],
"liquid_input_wells": [] "liquid_input_wells": []
}, },
{
"id": "working plate on P12",
"parent": "deck",
"slot_on_deck": "P12",
"class_name": "BCDeep96Round",
"liquid_type": [],
"liquid_volume": [],
"liquid_input_wells": []
},
{ {
"id": "working plate on P13", "id": "working plate on P13",
"parent": "deck", "parent": "deck",

View File

@@ -15,6 +15,7 @@ from typing import List, Sequence, Optional, Union, Literal
import json import json
import pathlib import pathlib
from typing import Sequence, Optional, List, Union, Literal from typing import Sequence, Optional, List, Union, Literal
import copy
@@ -67,7 +68,7 @@ class LiquidHandlerBiomek:
'LocalPattern': True, 'LocalPattern': True,
'Operation': 'Aspirate', 'Operation': 'Aspirate',
'OverrideHeight': False, 'OverrideHeight': False,
'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True), 'Pattern': (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True),
'Prototype': 'MC P300 High', 'Prototype': 'MC P300 High',
'ReferencedPattern': '', 'ReferencedPattern': '',
'RowsFirst': False, 'RowsFirst': False,
@@ -351,8 +352,9 @@ class LiquidHandlerBiomek:
""" """
items = [] items = []
asp_params = self.aspirate_techniques.get(aspirate_techniques, {}) asp_params = copy.deepcopy(self.aspirate_techniques[aspirate_techniques])
dis_params = self.dispense_techniques.get(dispense_techniques, {}) dis_params = copy.deepcopy(self.dispense_techniques[dispense_techniques])
asp_params['Position'] = source asp_params['Position'] = source
dis_params['Position'] = target dis_params['Position'] = target
@@ -403,7 +405,9 @@ class LiquidHandlerBiomek:
transfer_params["Solvent"] = 'Water' transfer_params["Solvent"] = 'Water'
transfer_params["TipLocation"] = tip_rack transfer_params["TipLocation"] = tip_rack
tmp={'transfer': transfer_params} tmp={'transfer': transfer_params}
self.temp_protocol["steps"].append(tmp) self.temp_protocol["steps"].append(tmp)
return return
@@ -872,15 +876,6 @@ if __name__ == "__main__":
"liquid_volume": [], "liquid_volume": [],
"liquid_input_wells": [] "liquid_input_wells": []
}, },
{
"id": "working plate on P12",
"parent": "deck",
"slot_on_deck": "P12",
"class_name": "BCDeep96Round",
"liquid_type": [],
"liquid_volume": [],
"liquid_input_wells": []
},
{ {
"id": "working plate on P13", "id": "working plate on P13",
"parent": "deck", "parent": "deck",
@@ -968,6 +963,7 @@ if __name__ == "__main__":
print(f"步骤 {step['step_number']}: {description}") print(f"步骤 {step['step_number']}: {description}")
if operation == 'transfer': if operation == 'transfer':
handler.transfer_biomek( handler.transfer_biomek(
source=parameters['source'], source=parameters['source'],
target=parameters['target'], target=parameters['target'],