From ce8667f937f1aa275902ae1e5a9e6cd5c8d2c91f Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Sun, 6 Jul 2025 18:39:40 +0800 Subject: [PATCH 01/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=AD=E6=9E=90?= =?UTF-8?q?=E4=BB=AA=E5=99=A8=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 190 +++++ .../liquid_handler_abstract.py | 2 +- .../devices/liquid_handling/prcxi/prcxi.py | 566 +++++++++++-- unilabos/registry/devices/liquid_handler.yaml | 510 ++++++++++++ unilabos/registry/devices/work_station.yaml | 750 +++++++++--------- unilabos/ros/nodes/base_device_node.py | 7 + unilabos/ros/utils/driver_creator.py | 6 +- 7 files changed, 1577 insertions(+), 454 deletions(-) create mode 100644 test/experiments/prcxi.json diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json new file mode 100644 index 0000000..72ea23b --- /dev/null +++ b/test/experiments/prcxi.json @@ -0,0 +1,190 @@ +{ + "nodes": [ + { + "id": "PLR_STATION_PRCXI", + "name": "PLR_LH_TEST", + "parent": null, + "type": "device", + "class": "liquid_handler.prcxi", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "deck": { + "_resource_child_name": "deck", + "_resource_type": "unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Deck" + }, + "host": "127.0.0.1", + "port": 9999, + "timeout": 10.0, + "setup": false + }, + "data": {}, + "children": [ + "deck" + ] + }, + { + "id": "deck", + "name": "deck", + "sample_id": null, + "children": [ + "rackT1", + "plateT2", + "plateT3", + "rackT4", + "plateT5" + ], + "parent": "PLR_STATION_PRCXI", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Deck" + }, + "data": {} + }, + { + "id": "rackT1", + "name": "rackT1", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "80652665f6a54402b2408d50b40398df", + "Code": "ZX-001-1000", + "Name": "1000μL Tip头", + "SummaryName": "1000μL Tip头", + "PipetteHeight": 100, + "materialEnum": 1 + } + } + }, + { + "id": "plateT2", + "name": "plateT2", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f" + } + } + }, + { + "id": "plateT3", + "name": "plateT3", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f" + } + } + }, + { + "id": "rackT4", + "name": "rackT4", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "80652665f6a54402b2408d50b40398df", + "Code": "ZX-001-1000", + "Name": "1000μL Tip头", + "SummaryName": "1000μL Tip头", + "PipetteHeight": 100, + "materialEnum": 1 + } + } + }, + { + "id": "plateT5", + "name": "plateT5", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f" + } + } + } + ], + "links": [] +} \ No newline at end of file diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 4faa042..54257ac 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -183,7 +183,7 @@ class LiquidHandlerAbstract(LiquidHandler): spread: Literal["wide", "tight", "custom"] = "wide", is_96_well: bool = False, mix_stage: Optional[Literal["none", "before", "after", "both"]] = "none", - mix_times: Optional[List(int)] = None, + mix_times: Optional[List[int]] = None, mix_vol: Optional[int] = None, mix_rate: Optional[int] = None, mix_liquid_height: Optional[float] = None, diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 0093c0f..25180cf 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1,17 +1,456 @@ -import socket, json, contextlib -from typing import Any, List, Dict, Optional +import collections +import contextlib +import json +import socket +import time +from typing import Any, List, Dict, Optional, TypedDict, Union, Sequence, Iterator, Literal + +from pylabrobot.liquid_handling import ( + LiquidHandlerBackend, + Pickup, + SingleChannelAspiration, + Drop, + SingleChannelDispense, + PickupTipRack, + DropTipRack, + MultiHeadAspirationPlate, +) +from pylabrobot.liquid_handling.standard import ( + MultiHeadAspirationContainer, + MultiHeadDispenseContainer, + MultiHeadDispensePlate, + ResourcePickup, + ResourceMove, + ResourceDrop, +) +from pylabrobot.resources import Tip, Deck, Plate, Well, TipRack, Resource, Container, Coordinate + +from unilabos.devices.liquid_handling.liquid_handler_abstract import LiquidHandlerAbstract class PRCXIError(RuntimeError): """Lilith 返回 Success=false 时抛出的业务异常""" -class PRCXI9300: +class Material(TypedDict): # 和Plate同关系 + uuid: str + Code: Optional[str] + Name: Optional[str] + SummaryName: Optional[str] + PipetteHeight: Optional[int] + materialEnum: Optional[int] - def __init__(self, host: str = "127.0.0.1", port: int = 9999, - timeout: float = 10.0) -> None: + +class WorkTablets(TypedDict): + Number: int + Code: str + Material: Dict[str, Any] + + +class MatrixInfo(TypedDict): + MatrixId: str + MatrixName: str + MatrixCount: int + WorkTablets: list[WorkTablets] + + +class PRCXI9300Deck(Deck): + """PRCXI 9300 的专用 Deck 类,继承自 Deck。 + + 该类定义了 PRCXI 9300 的工作台布局和槽位信息。 + """ + + def __init__(self, name: str, size_x: float, size_y: float, size_z: float): + super().__init__(name, size_x, size_y, size_z) + self.slots = [None] * 6 # PRCXI 9300 有 6 个槽位 + + +class PRCXI9300Container(Plate): + """PRCXI 9300 的专用 Deck 类,继承自 Deck。 + + 该类定义了 PRCXI 9300 的工作台布局和槽位信息。 + """ + + def __init__(self, name: str, size_x: float, size_y: float, size_z: float, category: str): + super().__init__(name, size_x, size_y, size_z, category=category, ordering=collections.OrderedDict()) + self._unilabos_state = {} + + def load_state(self, state: Dict[str, Any]) -> None: + """从给定的状态加载工作台信息。""" + super().load_state(state) + self._unilabos_state = state + + def serialize_state(self) -> Dict[str, Dict[str, Any]]: + data = super().serialize_state() + data.update(self._unilabos_state) + return data + + +class PRCXI9300Handler(LiquidHandlerAbstract): + def __init__(self, deck: Deck, host: str, port: int, timeout: float, setup=True): + tablets_info = [] + count = 0 + for child in deck.children: + if "Material" in child._unilabos_state: + count += 1 + tablets_info.append( + WorkTablets(Number=count, Code=f"T{count}", Material=child._unilabos_state["Material"]) + ) + self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, setup) + super().__init__(backend=self._unilabos_backend, deck=deck) + + async def create_protocol( + self, + protocol_name: str, + protocol_description: str, + protocol_version: str, + protocol_author: str, + protocol_date: str, + protocol_type: str, + none_keys: List[str] = [], + ): + self._unilabos_backend.create_protocol(protocol_name) + + async def run_protocol(self): + self._unilabos_backend.run_protocol() + + async def remove_liquid( + self, + vols: List[float], + sources: Sequence[Container], + waste_liquid: Optional[Container] = None, + *, + use_channels: Optional[List[int]] = None, + flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Optional[Literal["wide", "tight", "custom"]] = "wide", + delays: Optional[List[int]] = None, + is_96_well: Optional[bool] = False, + top: Optional[List[float]] = None, + none_keys: List[str] = [], + ): + return await super().remove_liquid( + vols, + sources, + waste_liquid, + use_channels=use_channels, + flow_rates=flow_rates, + offsets=offsets, + liquid_height=liquid_height, + blow_out_air_volume=blow_out_air_volume, + spread=spread, + delays=delays, + is_96_well=is_96_well, + top=top, + none_keys=none_keys, + ) + + async def add_liquid( + self, + asp_vols: Union[List[float], float], + dis_vols: Union[List[float], float], + reagent_sources: Sequence[Container], + targets: Sequence[Container], + *, + use_channels: Optional[List[int]] = None, + flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Optional[Literal["wide", "tight", "custom"]] = "wide", + is_96_well: bool = False, + delays: Optional[List[int]] = None, + mix_time: Optional[int] = None, + mix_vol: Optional[int] = None, + mix_rate: Optional[int] = None, + mix_liquid_height: Optional[float] = None, + none_keys: List[str] = [], + ): + return await super().add_liquid( + asp_vols, + dis_vols, + reagent_sources, + targets, + use_channels=use_channels, + flow_rates=flow_rates, + offsets=offsets, + liquid_height=liquid_height, + blow_out_air_volume=blow_out_air_volume, + spread=spread, + is_96_well=is_96_well, + delays=delays, + mix_time=mix_time, + mix_vol=mix_vol, + mix_rate=mix_rate, + mix_liquid_height=mix_liquid_height, + none_keys=none_keys, + ) + + async def transfer_liquid( + self, + sources: Sequence[Container], + targets: Sequence[Container], + tip_racks: Sequence[TipRack], + *, + use_channels: Optional[List[int]] = None, + asp_vols: Union[List[float], float], + dis_vols: Union[List[float], float], + asp_flow_rates: Optional[List[Optional[float]]] = None, + dis_flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + touch_tip: bool = False, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Literal["wide", "tight", "custom"] = "wide", + is_96_well: bool = False, + mix_stage: Optional[Literal["none", "before", "after", "both"]] = "none", + mix_times: Optional[List[int]] = None, + mix_vol: Optional[int] = None, + mix_rate: Optional[int] = None, + mix_liquid_height: Optional[float] = None, + delays: Optional[List[int]] = None, + none_keys: List[str] = [], + ): + return await super().transfer_liquid( + sources, + targets, + tip_racks, + use_channels=use_channels, + asp_vols=asp_vols, + dis_vols=dis_vols, + asp_flow_rates=asp_flow_rates, + dis_flow_rates=dis_flow_rates, + offsets=offsets, + touch_tip=touch_tip, + liquid_height=liquid_height, + blow_out_air_volume=blow_out_air_volume, + spread=spread, + is_96_well=is_96_well, + mix_stage=mix_stage, + mix_times=mix_times, + mix_vol=mix_vol, + mix_rate=mix_rate, + mix_liquid_height=mix_liquid_height, + delays=delays, + none_keys=none_keys, + ) + + async def custom_delay(self, seconds=0, msg=None): + return await super().custom_delay(seconds, msg) + + async def touch_tip(self, targets: Sequence[Container]): + return await super().touch_tip(targets) + + async def mix( + self, + targets: Sequence[Container], + mix_time: int = None, + mix_vol: Optional[int] = None, + height_to_bottom: Optional[float] = None, + offsets: Optional[Coordinate] = None, + mix_rate: Optional[float] = None, + none_keys: List[str] = [], + ): + return await super().mix(targets, mix_time, mix_vol, height_to_bottom, offsets, mix_rate, none_keys) + + def iter_tips(self, tip_racks: Sequence[TipRack]) -> Iterator[Resource]: + return super().iter_tips(tip_racks) + + def set_tiprack(self, tip_racks: Sequence[TipRack]): + super().set_tiprack(tip_racks) + + async def move_to(self, well: Well, dis_to_top: float = 0, channel: int = 0): + return await super().move_to(well, dis_to_top, channel) + + +class PRCXI9300Backend(LiquidHandlerBackend): + """PRCXI 9300 的后端实现,继承自 LiquidHandlerBackend。 + + 该类提供了与 PRCXI 9300 设备进行通信的基本方法,包括方案管理、自动化控制、运行状态查询等。 + """ + + _num_channels = 8 # 默认通道数为 8 + matrix_info: MatrixInfo + protocol_name: str + steps_todo_list = [] + + def __init__( + self, + tablets_info: list[WorkTablets], + host: str = "127.0.0.1", + port: int = 9999, + timeout: float = 10.0, + setup=True, + ) -> None: + super().__init__() + self.tablets_info = tablets_info + self.api_client = PRCXI9300Api(host, port, timeout) self.host, self.port, self.timeout = host, port, timeout + self._num_channels = 8 + self._execute_setup = setup + def create_protocol(self, protocol_name): + self.protocol_name = protocol_name + self.steps_todo_list = [] + + def run_protocol(self): + run_time = time.time() + self.matrix_info = MatrixInfo( + MatrixId=f"matrix_{run_time}", + MatrixName=f"protocol_{run_time}", + MatrixCount=len(self.tablets_info), + WorkTablets=self.tablets_info, + ) + self.api_client.add_WorkTablet_Matrix(self.matrix_info) + solution_id = self.api_client.add_solution( + f"protocol_{run_time}", self.matrix_info["MatrixId"], self.steps_todo_list + ) + self.api_client.load_solution(solution_id) + self.api_client.start() + + @classmethod + def check_channels(cls, use_channels: List[int]) -> List[int]: + """检查通道是否符合要求,PRCXI9300Backend 只支持所有 8 个通道。""" + if use_channels != [0, 1, 2, 3, 4, 5, 6, 7]: + print("PRCXI9300Backend only supports all 8 channels, using default [0, 1, 2, 3, 4, 5, 6, 7].") + return [0, 1, 2, 3, 4, 5, 6, 7] + return use_channels + + async def setup(self): + await super().setup() + try: + if self._execute_setup: + self.api_client.call("IAutomation", "Reset") + except ConnectionRefusedError as e: + raise RuntimeError( + f"Failed to connect to PRCXI9300 API at {self.host}:{self.port}. " + "Please ensure the PRCXI9300 service is running." + ) from e + + async def stop(self): + self.api_client.call("IAutomation", "Stop") + + async def pick_up_tips(self, ops: List[Pickup], use_channels: List[int] = None): + """Pick up tips from the specified resource.""" + # 12列,要PickUp A-H 1 + # PlateNo = 1-6 # 2行3列 + PlateNo = 1 # 第一块板 + hole_col = 2 # 第二列的8个孔 + step = self.api_client.Load( + "Left", + dosage=0, + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + print("PRCXI9300Backend pick_up_tips logged.") + + async def drop_tips(self, ops: List[Drop], use_channels: List[int] = None): + PlateNo = 1 + hole_col = 2 + step = self.api_client.UnLoad( + "Left", + dosage=0, + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + allow_drop = False + for s in self.steps_todo_list: + if s.get("Function") == "Load": + self.steps_todo_list.append(step) + allow_drop = True + break + if not allow_drop: + raise ValueError("No matching Load step found for drop_tips.") + print("PRCXI9300Backend drop_tips logged.") + + async def aspirate(self, ops: List[SingleChannelAspiration], use_channels: List[int] = None): + volumes = [op.volume for op in ops] + print(f"PRCXI9300Backend aspirate volumes: {volumes[0]} -> {int(volumes[0])} μL") + PlateNo = 1 + hole_col = 2 + step = self.api_client.Imbibing( + "Left", + dosage=int(volumes[0]), + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + + async def dispense(self, ops: List[SingleChannelDispense], use_channels: List[int] = None): + volumes = [op.volume for op in ops] + print(f"PRCXI9300Backend dispense volumes: {volumes[0]} -> {int(volumes[0])} μL") + PlateNo = 1 + hole_col = 2 + step = self.api_client.Tapping( + "Left", + dosage=int(volumes[0]), + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + + async def pick_up_tips96(self, pickup: PickupTipRack): + raise NotImplementedError("The PRCXI backend does not support the 96 head.") + + async def drop_tips96(self, drop: DropTipRack): + raise NotImplementedError("The PRCXI backend does not support the 96 head.") + + async def aspirate96(self, aspiration: Union[MultiHeadAspirationPlate, MultiHeadAspirationContainer]): + raise NotImplementedError("The Opentrons backend does not support the 96 head.") + + async def dispense96(self, dispense: Union[MultiHeadDispensePlate, MultiHeadDispenseContainer]): + raise NotImplementedError("The Opentrons backend does not support the 96 head.") + + async def pick_up_resource(self, pickup: ResourcePickup): + raise NotImplementedError("The Opentrons backend does not support the robotic arm.") + + async def move_picked_up_resource(self, move: ResourceMove): + raise NotImplementedError("The Opentrons backend does not support the robotic arm.") + + async def drop_resource(self, drop: ResourceDrop): + raise NotImplementedError("The Opentrons backend does not support the robotic arm.") + + def can_pick_up_tip(self, channel_idx: int, tip: Tip) -> bool: + return True # PRCXI9300Backend does not have tip compatibility issues + + def serialize(self) -> dict: + raise NotImplementedError() + + @property + def num_channels(self) -> int: + return self._num_channels + + +class PRCXI9300Api: + def __init__(self, host: str = "127.0.0.1", port: int = 9999, timeout: float = 10.0) -> None: + self.host, self.port, self.timeout = host, port, timeout @staticmethod def _len_prefix(n: int) -> bytes: @@ -30,17 +469,30 @@ class PRCXI9300: if not chunk: break if first: - chunk, first = chunk[8:], False + chunk, first = chunk[8:], False chunks.append(chunk) return b"".join(chunks).decode() - def _call(self, service: str, method: str, - params: Optional[list] = None) -> Any: + # ---------------------------------------------------- 方案相关(ISolution) + def list_solutions(self) -> List[Dict[str, Any]]: + """GetSolutionList""" + return self.call("ISolution", "GetSolutionList") + + def load_solution(self, solution_id: str) -> bool: + """LoadSolution""" + return self.call("ISolution", "LoadSolution", [solution_id]) + + def add_solution(self, name: str, matrix_id: str, steps: List[Dict[str, Any]]) -> str: + """AddSolution → 返回新方案 GUID""" + return self.call("ISolution", "AddSolution", [name, matrix_id, steps]) + + # ---------------------------------------------------- 自动化控制(IAutomation) + def start(self) -> bool: + return self.call("IAutomation", "Start") + + def call(self, service: str, method: str, params: Optional[list] = None) -> Any: payload = json.dumps( - {"ServiceName": service, - "MethodName": method, - "Paramters": params or []}, - separators=(",", ":") + {"ServiceName": service, "MethodName": method, "Paramters": params or []}, separators=(",", ":") ) resp = json.loads(self._raw_request(payload)) if not resp.get("Success", False): @@ -51,87 +503,53 @@ class PRCXI9300: except (TypeError, json.JSONDecodeError): return data - # ---------------------------------------------------- 方案相关(ISolution) - def list_solutions(self) -> List[Dict[str, Any]]: - """GetSolutionList""" - return self._call("ISolution", "GetSolutionList") - - def load_solution(self, solution_id: str) -> bool: - """LoadSolution""" - return self._call("ISolution", "LoadSolution", [solution_id]) - - def add_solution(self, name: str, matrix_id: str, - steps: List[Dict[str, Any]]) -> str: - """AddSolution → 返回新方案 GUID""" - return self._call("ISolution", "AddSolution", - [name, matrix_id, steps]) - - # ---------------------------------------------------- 自动化控制(IAutomation) - def start(self) -> bool: - return self._call("IAutomation", "Start") - - def stop(self) -> bool: - """Stop""" - return self._call("IAutomation", "Stop") - - def reset(self) -> bool: - """Reset""" - return self._call("IAutomation", "Reset") - def pause(self) -> bool: """Pause""" - return self._call("IAutomation", "Pause") + return self.call("IAutomation", "Pause") def resume(self) -> bool: """Resume""" - return self._call("IAutomation", "Resume") + return self.call("IAutomation", "Resume") def get_error_code(self) -> Optional[str]: """GetErrorCode""" - return self._call("IAutomation", "GetErrorCode") + return self.call("IAutomation", "GetErrorCode") def clear_error_code(self) -> bool: """RemoveErrorCodet""" - return self._call("IAutomation", "RemoveErrorCodet") + return self.call("IAutomation", "RemoveErrorCodet") # ---------------------------------------------------- 运行状态(IMachineState) def step_state_list(self) -> List[Dict[str, Any]]: """GetStepStateList""" - return self._call("IMachineState", "GetStepStateList") + return self.call("IMachineState", "GetStepStateList") def step_status(self, seq_num: int) -> Dict[str, Any]: """GetStepStatus""" - return self._call("IMachineState", "GetStepStatus", [seq_num]) + return self.call("IMachineState", "GetStepStatus", [seq_num]) def step_state(self, seq_num: int) -> Dict[str, Any]: """GetStepState""" - return self._call("IMachineState", "GetStepState", [seq_num]) + return self.call("IMachineState", "GetStepState", [seq_num]) def axis_location(self, axis_num: int = 1) -> Dict[str, Any]: """GetLocation""" - return self._call("IMachineState", "GetLocation", [axis_num]) + return self.call("IMachineState", "GetLocation", [axis_num]) # ---------------------------------------------------- 版位矩阵(IMatrix) def list_matrices(self) -> List[Dict[str, Any]]: """GetWorkTabletMatrices""" - return self._call("IMatrix", "GetWorkTabletMatrices") + return self.call("IMatrix", "GetWorkTabletMatrices") def matrix_by_id(self, matrix_id: str) -> Dict[str, Any]: """GetWorkTabletMatrixById""" - return self._call("IMatrix", "GetWorkTabletMatrixById", [matrix_id]) - - def add_WorkTablet_Matrix(self,matrix): - return self._call("IMatrix", "AddWorkTabletMatrix", [matrix]) + return self.call("IMatrix", "GetWorkTabletMatrixById", [matrix_id]) - # ---------------------------------------------------- 一键运行 - def run_solution(self, solution_id: str, channel_idx: int = 1) -> None: - self.load_solution(solution_id) - self.start(channel_idx) - -# ---------------------------------------------------- 单点动作 + def add_WorkTablet_Matrix(self, matrix: MatrixInfo): + return self.call("IMatrix", "AddWorkTabletMatrix", [matrix]) def Load( - self, + self, axis: str, dosage: int, plate_no: int, @@ -147,7 +565,7 @@ class PRCXI9300: assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", - liquid_method: str = "NormalDispense" + liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { "StepAxis": axis, @@ -166,11 +584,11 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "LiquidDispensingMethod": liquid_method, } def Imbibing( - self, + self, axis: str, dosage: int, plate_no: int, @@ -186,7 +604,7 @@ class PRCXI9300: assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", - liquid_method: str = "NormalDispense" + liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { "StepAxis": axis, @@ -205,12 +623,11 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "LiquidDispensingMethod": liquid_method, } - def Tapping( - self, + self, axis: str, dosage: int, plate_no: int, @@ -226,7 +643,7 @@ class PRCXI9300: assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", - liquid_method: str = "NormalDispense" + liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { "StepAxis": axis, @@ -245,12 +662,11 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "LiquidDispensingMethod": liquid_method, } - def Blending( - self, + self, axis: str, dosage: int, plate_no: int, @@ -266,7 +682,7 @@ class PRCXI9300: assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", - liquid_method: str = "NormalDispense" + liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { "StepAxis": axis, @@ -285,11 +701,11 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "LiquidDispensingMethod": liquid_method, } def UnLoad( - self, + self, axis: str, dosage: int, plate_no: int, @@ -305,7 +721,7 @@ class PRCXI9300: assist_fun3: str = "", assist_fun4: str = "", assist_fun5: str = "", - liquid_method: str = "NormalDispense" + liquid_method: str = "NormalDispense", ) -> Dict[str, Any]: return { "StepAxis": axis, @@ -324,5 +740,5 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "LiquidDispensingMethod": liquid_method, } diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index ea14223..046c52b 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6064,6 +6064,516 @@ liquid_handler.biomek: required: - success type: object +liquid_handler.prcxi: + class: + action_value_mappings: + auto-add_liquid: + feedback: {} + goal: {} + goal_default: + asp_vols: null + blow_out_air_volume: null + delays: null + dis_vols: null + flow_rates: null + is_96_well: false + liquid_height: null + mix_liquid_height: null + mix_rate: null + mix_time: null + mix_vol: null + none_keys: [] + offsets: null + reagent_sources: null + spread: wide + targets: null + use_channels: null + handles: [] + result: {} + schema: + description: add_liquid的参数schema + properties: + feedback: {} + goal: + properties: + asp_vols: + type: string + blow_out_air_volume: + type: string + delays: + type: string + dis_vols: + type: string + flow_rates: + type: string + is_96_well: + default: false + type: boolean + liquid_height: + type: string + mix_liquid_height: + type: string + mix_rate: + type: string + mix_time: + type: string + mix_vol: + type: string + none_keys: + default: [] + type: array + offsets: + type: string + reagent_sources: + type: string + spread: + default: wide + type: string + targets: + type: string + use_channels: + type: string + required: + - asp_vols + - dis_vols + - reagent_sources + - targets + type: object + result: {} + required: + - goal + title: add_liquid参数 + type: object + type: UniLabJsonCommandAsync + auto-create_protocol: + feedback: {} + goal: {} + goal_default: + none_keys: [] + protocol_author: null + protocol_date: null + protocol_description: null + protocol_name: null + protocol_type: null + protocol_version: null + handles: [] + result: {} + schema: + description: create_protocol的参数schema + properties: + feedback: {} + goal: + properties: + none_keys: + default: [] + type: array + protocol_author: + type: string + protocol_date: + type: string + protocol_description: + type: string + protocol_name: + type: string + protocol_type: + type: string + protocol_version: + type: string + required: + - protocol_name + - protocol_description + - protocol_version + - protocol_author + - protocol_date + - protocol_type + type: object + result: {} + required: + - goal + title: create_protocol参数 + type: object + type: UniLabJsonCommandAsync + auto-custom_delay: + feedback: {} + goal: {} + goal_default: + msg: null + seconds: 0 + handles: [] + result: {} + schema: + description: custom_delay的参数schema + properties: + feedback: {} + goal: + properties: + msg: + type: string + seconds: + default: 0 + type: string + required: [] + type: object + result: {} + required: + - goal + title: custom_delay参数 + type: object + type: UniLabJsonCommandAsync + auto-iter_tips: + feedback: {} + goal: {} + goal_default: + tip_racks: null + handles: [] + result: {} + schema: + description: iter_tips的参数schema + properties: + feedback: {} + goal: + properties: + tip_racks: + type: string + required: + - tip_racks + type: object + result: {} + required: + - goal + title: iter_tips参数 + type: object + type: UniLabJsonCommand + auto-mix: + feedback: {} + goal: {} + goal_default: + height_to_bottom: null + mix_rate: null + mix_time: null + mix_vol: null + none_keys: [] + offsets: null + targets: null + handles: [] + result: {} + schema: + description: mix的参数schema + properties: + feedback: {} + goal: + properties: + height_to_bottom: + type: string + mix_rate: + type: string + mix_time: + type: integer + mix_vol: + type: string + none_keys: + default: [] + type: array + offsets: + type: string + targets: + type: string + required: + - targets + type: object + result: {} + required: + - goal + title: mix参数 + type: object + type: UniLabJsonCommandAsync + auto-move_to: + feedback: {} + goal: {} + goal_default: + channel: 0 + dis_to_top: 0 + well: null + handles: [] + result: {} + schema: + description: move_to的参数schema + properties: + feedback: {} + goal: + properties: + channel: + default: 0 + type: integer + dis_to_top: + default: 0 + type: number + well: + type: string + required: + - well + type: object + result: {} + required: + - goal + title: move_to参数 + type: object + type: UniLabJsonCommandAsync + auto-remove_liquid: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: null + delays: null + flow_rates: null + is_96_well: false + liquid_height: null + none_keys: [] + offsets: null + sources: null + spread: wide + top: null + use_channels: null + vols: null + waste_liquid: null + handles: [] + result: {} + schema: + description: remove_liquid的参数schema + properties: + feedback: {} + goal: + properties: + blow_out_air_volume: + type: string + delays: + type: string + flow_rates: + type: string + is_96_well: + default: false + type: string + liquid_height: + type: string + none_keys: + default: [] + type: array + offsets: + type: string + sources: + type: string + spread: + default: wide + type: string + top: + type: string + use_channels: + type: string + vols: + type: array + waste_liquid: + type: string + required: + - vols + - sources + type: object + result: {} + required: + - goal + title: remove_liquid参数 + type: object + type: UniLabJsonCommandAsync + auto-run_protocol: + feedback: {} + goal: {} + goal_default: {} + handles: [] + result: {} + schema: + description: run_protocol的参数schema + properties: + feedback: {} + goal: + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: run_protocol参数 + type: object + type: UniLabJsonCommandAsync + auto-set_tiprack: + feedback: {} + goal: {} + goal_default: + tip_racks: null + handles: [] + result: {} + schema: + description: set_tiprack的参数schema + properties: + feedback: {} + goal: + properties: + tip_racks: + type: string + required: + - tip_racks + type: object + result: {} + required: + - goal + title: set_tiprack参数 + type: object + type: UniLabJsonCommand + auto-touch_tip: + feedback: {} + goal: {} + goal_default: + targets: null + handles: [] + result: {} + schema: + description: touch_tip的参数schema + properties: + feedback: {} + goal: + properties: + targets: + type: string + required: + - targets + type: object + result: {} + required: + - goal + title: touch_tip参数 + type: object + type: UniLabJsonCommandAsync + auto-transfer_liquid: + feedback: {} + goal: {} + goal_default: + asp_flow_rates: null + asp_vols: null + blow_out_air_volume: null + delays: null + dis_flow_rates: null + dis_vols: null + is_96_well: false + liquid_height: null + mix_liquid_height: null + mix_rate: null + mix_stage: none + mix_times: null + mix_vol: null + none_keys: [] + offsets: null + sources: null + spread: wide + targets: null + tip_racks: null + touch_tip: false + use_channels: null + handles: [] + result: {} + schema: + description: transfer_liquid的参数schema + properties: + feedback: {} + goal: + properties: + asp_flow_rates: + type: string + asp_vols: + type: string + blow_out_air_volume: + type: string + delays: + type: string + dis_flow_rates: + type: string + dis_vols: + type: string + is_96_well: + default: false + type: boolean + liquid_height: + type: string + mix_liquid_height: + type: string + mix_rate: + type: string + mix_stage: + default: none + type: string + mix_times: + type: string + mix_vol: + type: string + none_keys: + default: [] + type: array + offsets: + type: string + sources: + type: string + spread: + default: wide + type: string + targets: + type: string + tip_racks: + type: string + touch_tip: + default: false + type: boolean + use_channels: + type: string + required: + - sources + - targets + - tip_racks + - asp_vols + - dis_vols + type: object + result: {} + required: + - goal + title: transfer_liquid参数 + type: object + type: UniLabJsonCommandAsync + module: unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Handler + status_types: {} + type: python + description: prcxi液体处理器设备,基于pylabrobot控制 + handles: [] + icon: icon_yiyezhan.webp + init_param_schema: + config: + properties: + deck: + type: string + host: + type: string + port: + type: integer + setup: + default: true + type: string + timeout: + type: number + required: + - deck + - host + - port + - timeout + type: object + data: + properties: {} + required: [] + type: object liquid_handler.revvity: class: action_value_mappings: diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index 5941645..ed8b86f 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -356,6 +356,85 @@ workstation: title: Add type: object type: Add + AdjustPHProtocol: + feedback: {} + goal: + ph_value: ph_value + reagent: reagent + vessel: vessel + goal_default: + ph_value: 0.0 + reagent: '' + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + - data_key: reagent + data_source: handle + data_type: resource + handler_key: reagent + label: Reagent + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action AdjustPH 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: AdjustPH_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + ph_value: + type: number + reagent: + type: string + vessel: + type: string + required: + - vessel + - ph_value + - reagent + title: AdjustPH_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: AdjustPH_Result + type: object + required: + - goal + title: AdjustPH + type: object + type: AdjustPH CentrifugeProtocol: feedback: {} goal: @@ -751,6 +830,75 @@ workstation: title: Dissolve type: object type: Dissolve + DryProtocol: + feedback: {} + goal: + compound: compound + vessel: vessel + goal_default: + compound: '' + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action Dry 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: Dry_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + compound: + type: string + vessel: + type: string + required: + - compound + - vessel + title: Dry_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Dry_Result + type: object + required: + - goal + title: Dry + type: object + type: Dry EvacuateAndRefillProtocol: feedback: {} goal: @@ -1399,6 +1547,80 @@ workstation: title: HeatChillStop type: object type: HeatChillStop + HydrogenateProtocol: + feedback: {} + goal: + temp: temp + time: time + vessel: vessel + goal_default: + temp: '' + time: '' + vessel: '' + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action Hydrogenate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: Hydrogenate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + temp: + type: string + time: + type: string + vessel: + type: string + required: + - temp + - time + - vessel + title: Hydrogenate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Hydrogenate_Result + type: object + required: + - goal + title: Hydrogenate + type: object + type: Hydrogenate PumpTransferProtocol: feedback: {} goal: @@ -1554,6 +1776,159 @@ workstation: title: PumpTransfer type: object type: PumpTransfer + RecrystallizeProtocol: + feedback: {} + goal: + ratio: ratio + solvent1: solvent1 + solvent2: solvent2 + vessel: vessel + volume: volume + goal_default: + ratio: '' + solvent1: '' + solvent2: '' + vessel: '' + volume: 0.0 + handles: + input: + - data_key: vessel + data_source: handle + data_type: resource + handler_key: Vessel + label: Vessel + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent1 + label: Solvent 1 + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent2 + label: Solvent 2 + output: + - data_key: vessel + data_source: executor + data_type: resource + handler_key: VesselOut + label: Vessel + result: {} + schema: + description: ROS Action Recrystallize 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: Recrystallize_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + ratio: + type: string + solvent1: + type: string + solvent2: + type: string + vessel: + type: string + volume: + type: number + required: + - ratio + - solvent1 + - solvent2 + - vessel + - volume + title: Recrystallize_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: Recrystallize_Result + type: object + required: + - goal + title: Recrystallize + type: object + type: Recrystallize + ResetHandlingProtocol: + feedback: {} + goal: + solvent: solvent + goal_default: + solvent: '' + handles: + input: + - data_key: solvent + data_source: handle + data_type: resource + handler_key: solvent + label: Solvent + output: [] + result: {} + schema: + description: ROS Action ResetHandling 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: + progress: + type: number + status: + type: string + required: + - status + - progress + title: ResetHandling_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + solvent: + type: string + required: + - solvent + title: ResetHandling_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + message: + type: string + return_info: + type: string + success: + type: boolean + required: + - success + - message + - return_info + title: ResetHandling_Result + type: object + required: + - goal + title: ResetHandling + type: object + type: ResetHandling RunColumnProtocol: feedback: {} goal: @@ -2355,381 +2730,6 @@ workstation: title: initialize_device参数 type: object type: UniLabJsonCommand - AdjustPHProtocol: - feedback: {} - goal: - vessel: vessel - ph_value: ph_value - reagent: reagent - goal_default: - vessel: '' - ph_value: 7.0 - reagent: '' - handles: - input: - - data_key: vessel - data_source: handle - data_type: resource - handler_key: Vessel - label: Vessel - - data_key: reagent - data_source: handle - data_type: resource - handler_key: reagent - label: Reagent - output: - - data_key: vessel - data_source: executor - data_type: resource - handler_key: VesselOut - label: Vessel - result: {} - schema: - description: ROS Action AdjustPH 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - status: - type: string - progress: - type: number - required: - - status - - progress - title: AdjustPH_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - vessel: - type: string - ph_value: - type: number - reagent: - type: string - required: - - vessel - - ph_value - - reagent - title: AdjustPH_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: AdjustPH_Result - type: object - required: - - goal - title: AdjustPH - type: object - type: AdjustPH - ResetHandlingProtocol: - feedback: {} - goal: - solvent: solvent - goal_default: - solvent: '' - handles: - input: - - data_key: solvent - data_source: handle - data_type: resource - handler_key: solvent - label: Solvent - output: [] - result: {} - schema: - description: ROS Action ResetHandling 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - status: - type: string - progress: - type: number - required: - - status - - progress - title: ResetHandling_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - solvent: - type: string - required: - - solvent - title: ResetHandling_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: ResetHandling_Result - type: object - required: - - goal - title: ResetHandling - type: object - type: ResetHandling - DryProtocol: - feedback: {} - goal: - compound: compound - vessel: vessel - goal_default: - compound: '' - vessel: '' - handles: - input: - - data_key: vessel - data_source: handle - data_type: resource - handler_key: Vessel - label: Vessel - output: - - data_key: vessel - data_source: executor - data_type: resource - handler_key: VesselOut - label: Vessel - result: {} - schema: - description: ROS Action Dry 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - status: - type: string - progress: - type: number - required: - - status - - progress - title: Dry_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - compound: - type: string - vessel: - type: string - required: - - compound - - vessel - title: Dry_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: Dry_Result - type: object - required: - - goal - title: Dry - type: object - type: Dry - HydrogenateProtocol: - feedback: {} - goal: - temp: temp - time: time - vessel: vessel - goal_default: - temp: '' - time: '' - vessel: '' - handles: - input: - - data_key: vessel - data_source: handle - data_type: resource - handler_key: Vessel - label: Vessel - output: - - data_key: vessel - data_source: executor - data_type: resource - handler_key: VesselOut - label: Vessel - result: {} - schema: - description: ROS Action Hydrogenate 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - status: - type: string - progress: - type: number - required: - - status - - progress - title: Hydrogenate_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - temp: - type: string - time: - type: string - vessel: - type: string - required: - - temp - - time - - vessel - title: Hydrogenate_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: Hydrogenate_Result - type: object - required: - - goal - title: Hydrogenate - type: object - type: Hydrogenate - RecrystallizeProtocol: - feedback: {} - goal: - ratio: ratio - solvent1: solvent1 - solvent2: solvent2 - vessel: vessel - volume: volume - goal_default: - ratio: '' - solvent1: '' - solvent2: '' - vessel: '' - volume: 0.0 - handles: - input: - - data_key: vessel - data_source: handle - data_type: resource - handler_key: Vessel - label: Vessel - - data_key: solvent - data_source: handle - data_type: resource - handler_key: solvent1 - label: Solvent 1 - - data_key: solvent - data_source: handle - data_type: resource - handler_key: solvent2 - label: Solvent 2 - output: - - data_key: vessel - data_source: executor - data_type: resource - handler_key: VesselOut - label: Vessel - result: {} - schema: - description: ROS Action Recrystallize 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - status: - type: string - progress: - type: number - required: - - status - - progress - title: Recrystallize_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - ratio: - type: string - solvent1: - type: string - solvent2: - type: string - vessel: - type: string - volume: - type: number - required: - - ratio - - solvent1 - - solvent2 - - vessel - - volume - title: Recrystallize_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: Recrystallize_Result - type: object - required: - - goal - title: Recrystallize - type: object - type: Recrystallize module: unilabos.ros.nodes.presets.protocol_node:ROS2ProtocolNode status_types: {} type: ros2 diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index 4b7eb07..d4ea392 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -923,11 +923,18 @@ class ROS2DeviceNode: driver_class.__module__.startswith("pylabrobot") or driver_class.__name__ == "LiquidHandlerAbstract" or driver_class.__name__ == "LiquidHandlerBiomek" + or driver_class.__name__ == "PRCXI9300Handler" ) # TODO: 要在创建之前预先请求服务器是否有当前id的物料,放到resource_tracker中,让pylabrobot进行创建 # 创建设备类实例 if use_pylabrobot_creator: + # 先对pylabrobot的子资源进行加载,不然subclass无法认出 + # 在下方对于加载Deck等Resource要手动import + # noinspection PyUnresolvedReferences + from unilabos.devices.liquid_handling.prcxi.prcxi import PRCXI9300Deck + # noinspection PyUnresolvedReferences + from unilabos.devices.liquid_handling.prcxi.prcxi import PRCXI9300Container self._driver_creator = PyLabRobotCreator( driver_class, children=children, resource_tracker=self.resource_tracker ) diff --git a/unilabos/ros/utils/driver_creator.py b/unilabos/ros/utils/driver_creator.py index 7fd726b..c76cc3b 100644 --- a/unilabos/ros/utils/driver_creator.py +++ b/unilabos/ros/utils/driver_creator.py @@ -148,7 +148,7 @@ class PyLabRobotCreator(DeviceClassCreator[T]): contain_model = not issubclass(target_type, Deck) resource, target_type = self._process_resource_mapping(resource, target_type) resource_instance: Resource = resource_ulab_to_plr(resource, contain_model) - + states[prefix_path] = resource_instance.serialize_all_state() # 使用 prefix_path 作为 key 存储资源状态 if to_dict: serialized = resource_instance.serialize() @@ -199,7 +199,7 @@ class PyLabRobotCreator(DeviceClassCreator[T]): spect = inspect.signature(deserialize_method) spec_args = spect.parameters for param_name, param_value in data.copy().items(): - if "_resource_child_name" in param_value and "_resource_type" not in param_value: + if isinstance(param_value, dict) and "_resource_child_name" in param_value and "_resource_type" not in param_value: arg_value = spec_args[param_name].annotation data[param_name]["_resource_type"] = self.device_cls.__module__ + ":" + arg_value logger.debug(f"自动补充 _resource_type: {data[param_name]['_resource_type']}") @@ -230,7 +230,7 @@ class PyLabRobotCreator(DeviceClassCreator[T]): spect = inspect.signature(self.device_cls.__init__) spec_args = spect.parameters for param_name, param_value in data.copy().items(): - if "_resource_child_name" in param_value and "_resource_type" not in param_value: + if isinstance(param_value, dict) and "_resource_child_name" in param_value and "_resource_type" not in param_value: arg_value = spec_args[param_name].annotation data[param_name]["_resource_type"] = self.device_cls.__module__ + ":" + arg_value logger.debug(f"自动补充 _resource_type: {data[param_name]['_resource_type']}") From 50282664e0b4c6291232e3f874b02c809160c899 Mon Sep 17 00:00:00 2001 From: q434343 <73513873+q434343@users.noreply.github.com> Date: Tue, 8 Jul 2025 15:49:35 +0800 Subject: [PATCH 02/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9moveit=5Finterface?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E5=9C=A8mqtt=E4=B8=8A=E6=8A=A5=E6=97=B6?= =?UTF-8?q?=E5=8F=91=E9=80=81=E4=B8=80=E4=B8=AA=E6=97=B6=E9=97=B4=E6=88=B3?= =?UTF-8?q?=EF=BC=8C=E6=96=B9=E4=BE=BF=E7=BD=91=E9=A1=B5=E7=AB=AF=E5=AF=B9?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E7=AD=9B=E9=80=89=20(#62)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update README and MQTTClient for installation instructions and code improvements * feat: 支持local_config启动 add: 增加对crt path的说明,为传入config.py的相对路径 move: web component * add: registry description * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * feat: node_info_update srv fix: OTDeck cant create * close #12 feat: slave node registry * feat: show machine name fix: host node registry not uploaded * feat: add hplc registry * feat: add hplc registry * fix: hplc status typo * fix: devices/ * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * fix: device.class possible null * fix: HPLC additions with online service * fix: slave mode spin not working * fix: slave mode spin not working * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * feat: 多ProtocolNode 允许子设备ID相同 feat: 上报发现的ActionClient feat: Host重启动,通过discover机制要求slaveNode重新注册,实现信息及时上报 * feat: 支持env设置config * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * Device visualization (#14) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: missing hostname in devices_names fix: upload_file for model file * fix: missing paho-mqtt package bump version to 0.9.0 * fix startup add ResourceCreateFromOuter.action * fix type hint * update actions * update actions * host node add_resource_from_outer fix cmake list * pass device config to device class * add: bind_parent_ids to resource create action fix: message convert string * fix: host node should not be re_discovered * feat: resource tracker support dict * feat: add more necessary params * feat: fix boolean null in registry action data * feat: add outer resource * 编写mesh添加action * feat: append resource * add action * feat: vis 2d for plr * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate * Device visualization (#22) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * 编写mesh添加action * add action * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: multi channel * fix: aspirate * fix: aspirate * fix: aspirate * fix: aspirate * 提交 * fix: jobadd * fix: jobadd * fix: msg converter * tijiao * add resource creat easy action * identify debug msg * mq client id * 提取lh的joint发布 * unify liquid_handler definition * 修改物料跟随与物料添加逻辑 修改物料跟随与物料添加逻辑 将joint_publisher类移出lh的backends,但仍需要对lh的backends进行一些改写 * Revert "修改物料跟随与物料添加逻辑" This reverts commit 498c997ad764263366f6d6207e0722fbc7a909a8. * Reapply "修改物料跟随与物料添加逻辑" This reverts commit 3a60d2ae8125a7b24506bb681e3baaf69f2ebf6b. * Revert "Merge remote-tracking branch 'upstream/dev' into device_visualization" This reverts commit fa727220afa8546b84f1763730818d6360c26251, reversing changes made to 498c997ad764263366f6d6207e0722fbc7a909a8. * 修改物料放下时的方法,如果选择 修改物料放下时的方法, 如果选择drop_trash,则删除物料显示 如果选择drop,则让其解除连接 * unilab添加moveit启动 1,整合所有moveit节点到一个move_group中,并整合所有的controller依次激活 2,添加pymoveit2的节点,使用json可直接启动 3,修改机械臂规划方式,添加约束,让冗余关节不会进行过多移动 * 修改物体attach时,多次赋值当前时间导致卡顿问题, * Revert "修改物体attach时,多次赋值当前时间导致卡顿问题," This reverts commit 56d45b94f55d1339d54d9725ffe3c8cca7cbb73a. * Reapply "修改物体attach时,多次赋值当前时间导致卡顿问题," This reverts commit 07d9db20c3b43bc8af048b9e2c4af210ec16d446. * 添加缺少物料:"plate_well_G12", * add * fix tip resource data * liquid states * change to debug level * Revert "change to debug level" This reverts commit 5d9953c3e58d9f33818f21232c3fdcc30a4f766c. * Reapply "change to debug level" This reverts commit 2487bb6ffc6590b2da13a3dd5226825e0a164993. * fix tip resource data * add full device * add moveit yaml * 修复moveit 增加post_init阶段,给予ros_node反向 * remove necessary node * fix moveit action client * remove necessary imports * Update moveit_interface.py * fix handler_key uppercase * json add liquids * fix setup * add * change to "sources" and "targets" for lh * bump version * remove parent's parent link * change arm's name * change name * fix ik error * 修改moveit_interface,并在mqtt上报时发送一个时间戳 --------- Co-authored-by: Harvey Que Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: Junhan Chang --- unilabos/app/mq.py | 4 ++-- unilabos/devices/ros_dev/moveit_interface.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/unilabos/app/mq.py b/unilabos/app/mq.py index 061add2..c569c04 100644 --- a/unilabos/app/mq.py +++ b/unilabos/app/mq.py @@ -163,10 +163,10 @@ class MQTTClient: # status = device_status.get(device_id, {}) if self.mqtt_disable: return - status = {"data": device_status.get(device_id, {}), "device_id": device_id} + status = {"data": device_status.get(device_id, {}), "device_id": device_id, "timestamp": time.time()} address = f"labs/{MQConfig.lab_id}/devices/" self.client.publish(address, json.dumps(status), qos=2) - logger.debug(f"Device status published: address: {address}, {status}") + logger.info(f"Device status published: address: {address}, {status}") def publish_job_status(self, feedback_data: dict, job_id: str, status: str, return_info: Optional[str] = None): if self.mqtt_disable: diff --git a/unilabos/devices/ros_dev/moveit_interface.py b/unilabos/devices/ros_dev/moveit_interface.py index d065403..81c2d11 100644 --- a/unilabos/devices/ros_dev/moveit_interface.py +++ b/unilabos/devices/ros_dev/moveit_interface.py @@ -17,7 +17,7 @@ class MoveitInterface: tf_buffer: Buffer tf_listener: TransformListener - def __init__(self, moveit_type, joint_poses, rotation=None, device_config=None): + def __init__(self, moveit_type, joint_poses, rotation=None, device_config=None, **kwargs): self.device_config = device_config self.rotation = rotation self.data_config = json.load( From e2052d4a2c1ee4a7ff46702027e5189e730f487d Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:11:44 +0800 Subject: [PATCH 03/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 72ea23b..153d9db 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -1,8 +1,8 @@ { "nodes": [ { - "id": "PLR_STATION_PRCXI", - "name": "PLR_LH_TEST", + "id": "中析PRCXI", + "name": "PLR_PRCXI", "parent": null, "type": "device", "class": "liquid_handler.prcxi", From 18f6685e183eec3e0dc1fdb63943a4fd35fd52f3 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:36:46 +0800 Subject: [PATCH 04/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 153d9db..e29ac04 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -1,7 +1,7 @@ { "nodes": [ { - "id": "中析PRCXI", + "id": "PRCXI", "name": "PLR_PRCXI", "parent": null, "type": "device", From 61ee4465423c2fb8d6d7315e283bf5c558efe7f4 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:42:01 +0800 Subject: [PATCH 05/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index e29ac04..737ba32 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -2,7 +2,7 @@ "nodes": [ { "id": "PRCXI", - "name": "PLR_PRCXI", + "name": "PRCXI", "parent": null, "type": "device", "class": "liquid_handler.prcxi", @@ -37,7 +37,7 @@ "rackT4", "plateT5" ], - "parent": "PLR_STATION_PRCXI", + "parent": "PRCXI", "type": "device", "class": "", "position": { @@ -46,7 +46,7 @@ "z": 0 }, "config": { - "type": "PRCXI9300Deck" + "type": "PRCXI9300DeckPRCXI" }, "data": {} }, From 644feced55d2d3f3a8dc0110199ba7368b80a71d Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 15:50:30 +0800 Subject: [PATCH 06/19] =?UTF-8?q?=E4=BF=AE=E6=AD=A3prcxi=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/experiments/prcxi.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 737ba32..7a26531 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -46,7 +46,7 @@ "z": 0 }, "config": { - "type": "PRCXI9300DeckPRCXI" + "type": "PRCXI9300Deck" }, "data": {} }, From 5a2cc2d7097c61c4626d5e2eb8594f919c4d1f38 Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Fri, 11 Jul 2025 16:00:45 +0800 Subject: [PATCH 07/19] =?UTF-8?q?=E6=9B=B4=E6=96=B0PRCXI=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=B8=BB=E6=9C=BA=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E5=92=8C=E8=AE=BE=E7=BD=AE=E7=8A=B6=E6=80=81=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A4=BA=E4=BE=8B=E7=94=A8=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + test/experiments/prcxi.json | 4 +- .../devices/liquid_handling/prcxi/prcxi.py | 63 +++++++++++++++++++ 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b6ca0d4..9ba3b0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +configs/ ## Python # Byte-compiled / optimized / DLL files diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 7a26531..4078756 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -16,10 +16,10 @@ "_resource_child_name": "deck", "_resource_type": "unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Deck" }, - "host": "127.0.0.1", + "host": "192.168.3.9", "port": 9999, "timeout": 10.0, - "setup": false + "setup": true }, "data": {}, "children": [ diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 25180cf..e7e3129 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1,3 +1,4 @@ +import asyncio import collections import contextlib import json @@ -742,3 +743,65 @@ class PRCXI9300Api: "HoleNumbers": hole_numbers, "LiquidDispensingMethod": liquid_method, } + + +if __name__ == "__main__": + # Example usage + deck = PRCXI9300Deck(name="PRCXI Deck", size_x=100, size_y=100, size_z=100) + plate1 = PRCXI9300Container(name="rackT1", size_x=50, size_y=50, size_z=10, category="plate") + plate1.load_state({ + "Material": { + "uuid": "80652665f6a54402b2408d50b40398df", + "Code": "ZX-001-1000", + "Name": "1000μL Tip头", + "SummaryName": "1000μL Tip头", + "PipetteHeight": 100, + "materialEnum": 1 + } + }) + + plate2 = PRCXI9300Container(name="plateT2", size_x=50, size_y=50, size_z=10, category="plate") + plate2.load_state({ + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + } + }) + + plate3 = PRCXI9300Container(name="plateT3", size_x=50, size_y=50, size_z=10, category="plate") + plate3.load_state({ + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + } + }) + + plate4 = PRCXI9300Container(name="rackT4", size_x=50, size_y=50, size_z=10, category="plate") + plate4.load_state({ + "Material": { + "uuid": "80652665f6a54402b2408d50b40398df", + "Code": "ZX-001-1000", + "Name": "1000μL Tip头", + "SummaryName": "1000μL Tip头", + "PipetteHeight": 100, + "materialEnum": 1 + } + }) + + plate5 = PRCXI9300Container(name="plateT5", size_x=50, size_y=50, size_z=10, category="plate") + plate5.load_state({ + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + } + }) + deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) + deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) + + handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=True) + asyncio.run(handler.setup()) # Initialize the handler and setup the connection + + + + input("Press Enter to continue...") # Wait for user input before proceeding + print("PRCXI9300Handler initialized with deck and host settings.") From b85722f44dfc27b08672c71546ab98cf2d7ba2aa Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:09:53 +0800 Subject: [PATCH 08/19] add pickup tips for prcxi --- .../devices/liquid_handling/prcxi/prcxi.py | 28 +- unilabos/registry/devices/liquid_handler.yaml | 321 ++++++++++++++++++ 2 files changed, 348 insertions(+), 1 deletion(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index e7e3129..cc097e5 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -24,7 +24,7 @@ from pylabrobot.liquid_handling.standard import ( ResourceMove, ResourceDrop, ) -from pylabrobot.resources import Tip, Deck, Plate, Well, TipRack, Resource, Container, Coordinate +from pylabrobot.resources import Tip, Deck, Plate, Well, TipRack, Resource, Container, Coordinate, TipSpot from unilabos.devices.liquid_handling.liquid_handler_abstract import LiquidHandlerAbstract @@ -259,6 +259,32 @@ class PRCXI9300Handler(LiquidHandlerAbstract): def iter_tips(self, tip_racks: Sequence[TipRack]) -> Iterator[Resource]: return super().iter_tips(tip_racks) + async def pick_up_tips(self, tip_spots: List[TipSpot], use_channels: Optional[List[int]] = None, + offsets: Optional[List[Coordinate]] = None, **backend_kwargs): + return await super().pick_up_tips(tip_spots, use_channels, offsets, **backend_kwargs) + + async def aspirate(self, resources: Sequence[Container], vols: List[float], + use_channels: Optional[List[int]] = None, flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Literal["wide", "tight", "custom"] = "wide", **backend_kwargs): + return await super().aspirate(resources, vols, use_channels, flow_rates, offsets, liquid_height, + blow_out_air_volume, spread, **backend_kwargs) + + async def dispense(self, resources: Sequence[Container], vols: List[float], + use_channels: Optional[List[int]] = None, flow_rates: Optional[List[Optional[float]]] = None, + offsets: Optional[List[Coordinate]] = None, + liquid_height: Optional[List[Optional[float]]] = None, + blow_out_air_volume: Optional[List[Optional[float]]] = None, + spread: Literal["wide", "tight", "custom"] = "wide", **backend_kwargs): + return await super().dispense(resources, vols, use_channels, flow_rates, offsets, liquid_height, + blow_out_air_volume, spread, **backend_kwargs) + + async def discard_tips(self, use_channels: Optional[List[int]] = None, allow_nonzero_volume: bool = True, + offsets: Optional[List[Coordinate]] = None, **backend_kwargs): + return await super().discard_tips(use_channels, allow_nonzero_volume, offsets, **backend_kwargs) + def set_tiprack(self, tip_racks: Sequence[TipRack]): super().set_tiprack(tip_racks) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 046c52b..5ba410d 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6145,6 +6145,53 @@ liquid_handler.prcxi: title: add_liquid参数 type: object type: UniLabJsonCommandAsync + auto-aspirate: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: null + flow_rates: null + liquid_height: null + offsets: null + resources: null + spread: wide + use_channels: null + vols: null + handles: [] + result: {} + schema: + description: aspirate的参数schema + properties: + feedback: {} + goal: + properties: + blow_out_air_volume: + type: string + flow_rates: + type: string + liquid_height: + type: string + offsets: + type: string + resources: + type: string + spread: + default: wide + type: string + use_channels: + type: string + vols: + type: array + required: + - resources + - vols + type: object + result: {} + required: + - goal + title: aspirate参数 + type: object + type: UniLabJsonCommandAsync auto-create_protocol: feedback: {} goal: {} @@ -6220,6 +6267,83 @@ liquid_handler.prcxi: title: custom_delay参数 type: object type: UniLabJsonCommandAsync + auto-discard_tips: + feedback: {} + goal: {} + goal_default: + allow_nonzero_volume: true + offsets: null + use_channels: null + handles: [] + result: {} + schema: + description: discard_tips的参数schema + properties: + feedback: {} + goal: + properties: + allow_nonzero_volume: + default: true + type: boolean + offsets: + type: string + use_channels: + type: string + required: [] + type: object + result: {} + required: + - goal + title: discard_tips参数 + type: object + type: UniLabJsonCommandAsync + auto-dispense: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: null + flow_rates: null + liquid_height: null + offsets: null + resources: null + spread: wide + use_channels: null + vols: null + handles: [] + result: {} + schema: + description: dispense的参数schema + properties: + feedback: {} + goal: + properties: + blow_out_air_volume: + type: string + flow_rates: + type: string + liquid_height: + type: string + offsets: + type: string + resources: + type: string + spread: + default: wide + type: string + use_channels: + type: string + vols: + type: array + required: + - resources + - vols + type: object + result: {} + required: + - goal + title: dispense参数 + type: object + type: UniLabJsonCommandAsync auto-iter_tips: feedback: {} goal: {} @@ -6319,6 +6443,36 @@ liquid_handler.prcxi: title: move_to参数 type: object type: UniLabJsonCommandAsync + auto-pick_up_tips: + feedback: {} + goal: {} + goal_default: + offsets: null + tip_spots: null + use_channels: null + handles: [] + result: {} + schema: + description: pick_up_tips的参数schema + properties: + feedback: {} + goal: + properties: + offsets: + type: string + tip_spots: + type: array + use_channels: + type: string + required: + - tip_spots + type: object + result: {} + required: + - goal + title: pick_up_tips参数 + type: object + type: UniLabJsonCommandAsync auto-remove_liquid: feedback: {} goal: {} @@ -6544,6 +6698,173 @@ liquid_handler.prcxi: title: transfer_liquid参数 type: object type: UniLabJsonCommandAsync + pick_up_tips: + feedback: {} + goal: + offsets: offsets + tip_spots: tip_spots + use_channels: use_channels + goal_default: + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + tip_spots: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + use_channels: + - 0 + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerPickUpTips_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + tip_spots: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - tip_spots + - use_channels + - offsets + title: LiquidHandlerPickUpTips_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerPickUpTips_Result + type: object + required: + - goal + title: LiquidHandlerPickUpTips + type: object + type: LiquidHandlerPickUpTips module: unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Handler status_types: {} type: python From cd9e7ef12c3a6479c361edafa7fa85adb4d628ac Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:30:56 +0800 Subject: [PATCH 09/19] =?UTF-8?q?=E4=BB=BB=E6=84=8F=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=83=BD=E5=BA=94=E8=AF=A5=E8=BF=94=E5=9B=9E?= =?UTF-8?q?failed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/app/controler.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/unilabos/app/controler.py b/unilabos/app/controler.py index 730578e..7a74691 100644 --- a/unilabos/app/controler.py +++ b/unilabos/app/controler.py @@ -1,8 +1,10 @@ import json +import traceback import uuid from unilabos.app.model import JobAddReq, JobData from unilabos.ros.nodes.presets.host_node import HostNode +from unilabos.utils.type_check import serialize_result_info def get_resources() -> tuple: @@ -33,5 +35,10 @@ def job_add(req: JobAddReq) -> JobData: if "command" in action_args: action_args = action_args["command"] # print(f"job_add:{req.device_id} {action_name} {action_kwargs}") - HostNode.get_instance().send_goal(req.device_id, action_type=action_type, action_name=action_name, action_kwargs=action_args, goal_uuid=req.job_id, server_info=req.server_info) + try: + HostNode.get_instance().send_goal(req.device_id, action_type=action_type, action_name=action_name, action_kwargs=action_args, goal_uuid=req.job_id, server_info=req.server_info) + except Exception as e: + for bridge in HostNode.get_instance().bridges: + if hasattr(bridge, "publish_job_status"): + bridge.publish_job_status({}, req.job_id, "failed", serialize_result_info(traceback.format_exc(), False, {})) return JobData(jobId=req.job_id) From 72c67ba25c7fbf8b3587129d83b4a087b0d52156 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:33:55 +0800 Subject: [PATCH 10/19] =?UTF-8?q?=E4=BB=BB=E6=84=8F=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=83=BD=E5=BA=94=E8=AF=A5=E8=BF=94=E5=9B=9E?= =?UTF-8?q?failed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/ros/nodes/presets/host_node.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index 0cb3db7..29cdea9 100644 --- a/unilabos/ros/nodes/presets/host_node.py +++ b/unilabos/ros/nodes/presets/host_node.py @@ -603,8 +603,7 @@ class HostNode(BaseROS2DeviceNode): if action_name == "test_latency" and server_info is not None: self.server_latest_timestamp = server_info.get("send_timestamp", 0.0) if action_id not in self._action_clients: - self.lab_logger().error(f"[Host Node] ActionClient {action_id} not found.") - return + raise ValueError(f"ActionClient {action_id} not found.") action_client: ActionClient = self._action_clients[action_id] From 25960c2ed5fae33a4659af2b45ab5da1d213527a Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Fri, 11 Jul 2025 18:10:21 +0800 Subject: [PATCH 11/19] Add plateT6 to PRCXI configuration and enhance error handling in liquid handling --- test/experiments/prcxi.json | 28 +++- .../liquid_handler_abstract.py | 4 +- .../devices/liquid_handling/prcxi/prcxi.py | 123 +++++++++++++++--- unilabos/ros/msgs/message_converter.py | 2 +- 4 files changed, 135 insertions(+), 22 deletions(-) diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index 4078756..e362558 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -35,7 +35,8 @@ "plateT2", "plateT3", "rackT4", - "plateT5" + "plateT5", + "plateT6" ], "parent": "PRCXI", "type": "device", @@ -184,6 +185,31 @@ "uuid": "57b1e4711e9e4a32b529f3132fc5931f" } } + }, + { + "id": "plateT6", + "name": "plateT6", + "sample_id": null, + "children": [], + "parent": "deck", + "type": "device", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Container", + "size_x": 120.98, + "size_y": 82.12, + "size_z": 50.3 + }, + "data": { + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f" + } + } } ], "links": [] diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 54257ac..dc8757b 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -1,5 +1,6 @@ from __future__ import annotations +import traceback from typing import List, Sequence, Optional, Literal, Union, Iterator import asyncio @@ -117,7 +118,7 @@ class LiquidHandlerAbstract(LiquidHandler): pass # This mode is not verified. else: if len(asp_vols) != len(targets): - raise ValueError("Length of `vols` must match `targets`.") + raise ValueError(f"Length of `asp_vols` {len(asp_vols)} must match `targets` {len(targets)}.") tip = next(self.current_tip) await self.pick_up_tips(tip) @@ -160,6 +161,7 @@ class LiquidHandlerAbstract(LiquidHandler): await self.discard_tips() except Exception as e: + traceback.print_exc() raise RuntimeError(f"Liquid addition failed: {e}") from e # --------------------------------------------------------------- diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index cc097e5..6dd6e71 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -88,6 +88,12 @@ class PRCXI9300Container(Plate): class PRCXI9300Handler(LiquidHandlerAbstract): + @property + def reset_ok(self) -> bool: + """检查设备是否已重置成功。""" + return self._unilabos_backend.is_reset_ok + + def __init__(self, deck: Deck, host: str, port: int, timeout: float, setup=True): tablets_info = [] count = 0 @@ -102,18 +108,18 @@ class PRCXI9300Handler(LiquidHandlerAbstract): async def create_protocol( self, - protocol_name: str, - protocol_description: str, - protocol_version: str, - protocol_author: str, - protocol_date: str, - protocol_type: str, + protocol_name: str = "", + protocol_description: str = "", + protocol_version: str = "", + protocol_author: str = "", + protocol_date: str = "", + protocol_type: str = "", none_keys: List[str] = [], ): self._unilabos_backend.create_protocol(protocol_name) async def run_protocol(self): - self._unilabos_backend.run_protocol() + return self._unilabos_backend.run_protocol() async def remove_liquid( self, @@ -299,6 +305,13 @@ class PRCXI9300Backend(LiquidHandlerBackend): """ _num_channels = 8 # 默认通道数为 8 + _is_reset_ok = False + + @property + def is_reset_ok(self) -> bool: + self._is_reset_ok = self.api_client.get_reset_status() + return self._is_reset_ok + matrix_info: MatrixInfo protocol_name: str steps_todo_list = [] @@ -323,19 +336,24 @@ class PRCXI9300Backend(LiquidHandlerBackend): self.steps_todo_list = [] def run_protocol(self): + assert self.is_reset_ok, "PRCXI9300Backend is not reset successfully. Please call setup() first." run_time = time.time() self.matrix_info = MatrixInfo( - MatrixId=f"matrix_{run_time}", + MatrixId=f"{int(run_time)}", MatrixName=f"protocol_{run_time}", MatrixCount=len(self.tablets_info), WorkTablets=self.tablets_info, ) - self.api_client.add_WorkTablet_Matrix(self.matrix_info) + print(json.dumps(self.matrix_info, indent=2)) + res = self.api_client.add_WorkTablet_Matrix(self.matrix_info) + assert res["Success"], f"Failed to create matrix: {res.get('Message', 'Unknown error')}" + print(f"PRCXI9300Backend created matrix with ID: {self.matrix_info['MatrixId']}, result: {res}") solution_id = self.api_client.add_solution( f"protocol_{run_time}", self.matrix_info["MatrixId"], self.steps_todo_list ) + print(f"PRCXI9300Backend created solution with ID: {solution_id}") self.api_client.load_solution(solution_id) - self.api_client.start() + return self.api_client.start() @classmethod def check_channels(cls, use_channels: List[int]) -> List[int]: @@ -350,6 +368,10 @@ class PRCXI9300Backend(LiquidHandlerBackend): try: if self._execute_setup: self.api_client.call("IAutomation", "Reset") + while not self.is_reset_ok: + print("Waiting for PRCXI9300 to reset...") + await asyncio.sleep(1) + print("PRCXI9300 reset successfully.") except ConnectionRefusedError as e: raise RuntimeError( f"Failed to connect to PRCXI9300 API at {self.host}:{self.port}. " @@ -363,6 +385,18 @@ class PRCXI9300Backend(LiquidHandlerBackend): """Pick up tips from the specified resource.""" # 12列,要PickUp A-H 1 # PlateNo = 1-6 # 2行3列 + print("!!!!!!!!!" * 10) + print(ops, "====="*10) + # plate: PRCXI9300Container = ops[0].resource.parent.parent + # deck: PRCXI9300Deck = plate.parent + # plate_index = deck.children.index(plate) + # tipspot = ops[0].resource + # tipspot_index = tipspot.parent.children.index(tipspot) + # print(f"PRCXI9300Backend pick_up_tips: plate_index={plate_index}, tipspot_index={tipspot_index}") + # print(f"PRCXI9300Backend pick_up_tips: plate_index={plate_index}, plate.name={plate.name}") + # print(plate._unilabos_state["Material"]) + # for op in ops: + # print(f"PRCXI9300Backend pick_up_tips: {op.resource.name}") PlateNo = 1 # 第一块板 hole_col = 2 # 第二列的8个孔 step = self.api_client.Load( @@ -406,10 +440,11 @@ class PRCXI9300Backend(LiquidHandlerBackend): print("PRCXI9300Backend drop_tips logged.") async def aspirate(self, ops: List[SingleChannelAspiration], use_channels: List[int] = None): - volumes = [op.volume for op in ops] - print(f"PRCXI9300Backend aspirate volumes: {volumes[0]} -> {int(volumes[0])} μL") - PlateNo = 1 - hole_col = 2 + volumes = [1] + # volumes = [op.volume for op in ops] + # print(f"PRCXI9300Backend aspirate volumes: {volumes[0]} -> {int(volumes[0])} μL") + PlateNo = 2 + hole_col = 4 step = self.api_client.Imbibing( "Left", dosage=int(volumes[0]), @@ -425,9 +460,10 @@ class PRCXI9300Backend(LiquidHandlerBackend): self.steps_todo_list.append(step) async def dispense(self, ops: List[SingleChannelDispense], use_channels: List[int] = None): - volumes = [op.volume for op in ops] - print(f"PRCXI9300Backend dispense volumes: {volumes[0]} -> {int(volumes[0])} μL") - PlateNo = 1 + volumes = [1] + # volumes = [op.volume for op in ops] + # print(f"PRCXI9300Backend dispense volumes: {volumes[0]} -> {int(volumes[0])} μL") + PlateNo = 2 hole_col = 2 step = self.api_client.Tapping( "Left", @@ -542,6 +578,11 @@ class PRCXI9300Api: """GetErrorCode""" return self.call("IAutomation", "GetErrorCode") + def get_reset_status(self) -> Optional[str]: + """GetErrorCode""" + res = self.call("IAutomation", "GetResetStatus") + return not res + def clear_error_code(self) -> bool: """RemoveErrorCodet""" return self.call("IAutomation", "RemoveErrorCodet") @@ -818,15 +859,59 @@ if __name__ == "__main__": "uuid": "57b1e4711e9e4a32b529f3132fc5931f", } }) + plate6 = PRCXI9300Container(name="plateT6", size_x=50, size_y=50, size_z=10, category="plate") + plate6.load_state({ + "Material": { + "uuid": "57b1e4711e9e4a32b529f3132fc5931f", + } + }) + + from pylabrobot.resources.opentrons.tip_racks import tipone_96_tiprack_200ul + from pylabrobot.resources.opentrons.plates import corning_96_wellplate_360ul_flat + tip_rack = tipone_96_tiprack_200ul("TipRack") + well_containers = corning_96_wellplate_360ul_flat("Plate") + # from pprint import pprint + # pprint(well_containers.children) + plate1.assign_child_resource(tip_rack, location=Coordinate(0, 0, 0)) + plate2.assign_child_resource(well_containers, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate1, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate2, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate3, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) - - handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=True) + deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) + input("debug....") + handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False) + handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection + asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection + input("Creating protocol...") + # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.aspirate(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.dispense(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + # asyncio.run(handler.drop_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + asyncio.run(handler.pick_up_tips([], [], [])) + asyncio.run(handler.aspirate([], [], [])) + asyncio.run(handler.dispense([], [], [])) + asyncio.run(handler.drop_tips([], [], [])) + # asyncio.run(handler.add_liquid( + # asp_vols=[100]*8, + # dis_vols=[100]*8, + # reagent_sources=well_containers.children[-8:], + # targets=well_containers.children[:8], + # use_channels=[0, 1, 2, 3, 4, 5, 6, 7], + # flow_rates=[None] * 8, + # offsets=[Coordinate(0, 0, 0)] * 8, + # liquid_height=[None] * 8, + # blow_out_air_volume=[None] * 8, + # spread="wide", + # )) + input("pick_up_tips add step") + asyncio.run(handler.run_protocol()) # Run the protocol + input("Running protocol...") + print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info + input("Press Enter to continue...") # Wait for user input before proceeding diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index f0e9468..9dceef8 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -132,7 +132,7 @@ _msg_converter: Dict[Type, Any] = { Bool: lambda x: Bool(data=bool(x)), str: str, String: lambda x: String(data=str(x)), - Point: lambda x: Point(x=x.x, y=x.y, z=x.z) if not isinstance(x, dict) else Point(x=x.get("x", 0.0), y=x.get("y", 0.0), z=x.get("z", 0.0)), + Point: lambda x: Point(x=x.x, y=x.y, z=x.z) if not isinstance(x, dict) else Point(x=float(x.get("x", 0.0)), y=float(x.get("y", 0.0)), z=float(x.get("z", 0.0))), Resource: lambda x: Resource( id=x.get("id", ""), name=x.get("name", ""), From 7b68545db362a54680e4143aa48e5dd03f44ff00 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:11:44 +0800 Subject: [PATCH 12/19] prcxi blending --- .../devices/liquid_handling/prcxi/prcxi.py | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 6dd6e71..547a868 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -24,7 +24,7 @@ from pylabrobot.liquid_handling.standard import ( ResourceMove, ResourceDrop, ) -from pylabrobot.resources import Tip, Deck, Plate, Well, TipRack, Resource, Container, Coordinate, TipSpot +from pylabrobot.resources import Tip, Deck, Plate, Well, TipRack, Resource, Container, Coordinate, TipSpot, Trash from unilabos.devices.liquid_handling.liquid_handler_abstract import LiquidHandlerAbstract @@ -260,7 +260,7 @@ class PRCXI9300Handler(LiquidHandlerAbstract): mix_rate: Optional[float] = None, none_keys: List[str] = [], ): - return await super().mix(targets, mix_time, mix_vol, height_to_bottom, offsets, mix_rate, none_keys) + return await self._unilabos_backend.mix(targets, mix_time, mix_vol, height_to_bottom, offsets, mix_rate, none_keys) def iter_tips(self, tip_racks: Sequence[TipRack]) -> Iterator[Resource]: return super().iter_tips(tip_racks) @@ -278,6 +278,11 @@ class PRCXI9300Handler(LiquidHandlerAbstract): return await super().aspirate(resources, vols, use_channels, flow_rates, offsets, liquid_height, blow_out_air_volume, spread, **backend_kwargs) + async def drop_tips(self, tip_spots: Sequence[Union[TipSpot, Trash]], use_channels: Optional[List[int]] = None, + offsets: Optional[List[Coordinate]] = None, allow_nonzero_volume: bool = False, + **backend_kwargs): + return await super().drop_tips(tip_spots, use_channels, offsets, allow_nonzero_volume, **backend_kwargs) + async def dispense(self, resources: Sequence[Container], vols: List[float], use_channels: Optional[List[int]] = None, flow_rates: Optional[List[Optional[float]]] = None, offsets: Optional[List[Coordinate]] = None, @@ -439,6 +444,33 @@ class PRCXI9300Backend(LiquidHandlerBackend): raise ValueError("No matching Load step found for drop_tips.") print("PRCXI9300Backend drop_tips logged.") + async def mix( + self, + targets: Sequence[Container], + mix_time: int = None, + mix_vol: Optional[int] = None, + height_to_bottom: Optional[float] = None, + offsets: Optional[Coordinate] = None, + mix_rate: Optional[float] = None, + none_keys: List[str] = [], + ): + volumes = [1] + PlateNo = 2 + hole_col = 2 + step = self.api_client.Blending( + "Left", + dosage=int(volumes[0]), + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + blending_times=0, + balance_height=0, + plate_or_hole=f"H{hole_col}-8,T{PlateNo}", + hole_numbers="1,2,3,4,5,6,7,8", + ) + self.steps_todo_list.append(step) + async def aspirate(self, ops: List[SingleChannelAspiration], use_channels: List[int] = None): volumes = [1] # volumes = [op.volume for op in ops] @@ -893,6 +925,7 @@ if __name__ == "__main__": asyncio.run(handler.pick_up_tips([], [], [])) asyncio.run(handler.aspirate([], [], [])) asyncio.run(handler.dispense([], [], [])) + asyncio.run(handler.mix([], mix_time=3, mix_vol=10, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) asyncio.run(handler.drop_tips([], [], [])) # asyncio.run(handler.add_liquid( From 0e11dacead770ec30b4adf69082beda03af85845 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:15:41 +0800 Subject: [PATCH 13/19] assert blending_times > 0 --- unilabos/devices/liquid_handling/prcxi/prcxi.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 547a868..b28f0d2 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -457,6 +457,8 @@ class PRCXI9300Backend(LiquidHandlerBackend): volumes = [1] PlateNo = 2 hole_col = 2 + blending_times = 1 + assert blending_times > 0 step = self.api_client.Blending( "Left", dosage=int(volumes[0]), @@ -464,7 +466,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): is_whole_plate=False, hole_row=1, hole_col=hole_col, - blending_times=0, + blending_times=blending_times, balance_height=0, plate_or_hole=f"H{hole_col}-8,T{PlateNo}", hole_numbers="1,2,3,4,5,6,7,8", From 5d214ebcd83a958b9126d88829479ff447d45c50 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:20:50 +0800 Subject: [PATCH 14/19] update prcxi --- unilabos/registry/devices/liquid_handler.yaml | 807 +++++++++++++++++- 1 file changed, 791 insertions(+), 16 deletions(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 5ba410d..617723d 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6067,6 +6067,202 @@ liquid_handler.biomek: liquid_handler.prcxi: class: action_value_mappings: + aspirate: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: + - 0.0 + flow_rates: + - 0.0 + liquid_height: + - 0.0 + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + resources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + use_channels: + - 0 + vols: + - 0.0 + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerAspirate 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerAspirate_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + blow_out_air_volume: + items: + type: number + type: array + flow_rates: + items: + type: number + type: array + liquid_height: + items: + type: number + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + resources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + vols: + items: + type: number + type: array + required: + - resources + - vols + - use_channels + - flow_rates + - offsets + - liquid_height + - blow_out_air_volume + - spread + title: LiquidHandlerAspirate_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerAspirate_Result + type: object + required: + - goal + title: LiquidHandlerAspirate + type: object + type: LiquidHandlerAspirate auto-add_liquid: feedback: {} goal: {} @@ -6197,12 +6393,12 @@ liquid_handler.prcxi: goal: {} goal_default: none_keys: [] - protocol_author: null - protocol_date: null - protocol_description: null - protocol_name: null - protocol_type: null - protocol_version: null + protocol_author: '' + protocol_date: '' + protocol_description: '' + protocol_name: '' + protocol_type: '' + protocol_version: '' handles: [] result: {} schema: @@ -6215,24 +6411,24 @@ liquid_handler.prcxi: default: [] type: array protocol_author: + default: '' type: string protocol_date: + default: '' type: string protocol_description: + default: '' type: string protocol_name: + default: '' type: string protocol_type: + default: '' type: string protocol_version: + default: '' type: string - required: - - protocol_name - - protocol_description - - protocol_version - - protocol_author - - protocol_date - - protocol_type + required: [] type: object result: {} required: @@ -6344,6 +6540,40 @@ liquid_handler.prcxi: title: dispense参数 type: object type: UniLabJsonCommandAsync + auto-drop_tips: + feedback: {} + goal: {} + goal_default: + allow_nonzero_volume: false + offsets: null + tip_spots: null + use_channels: null + handles: [] + result: {} + schema: + description: drop_tips的参数schema + properties: + feedback: {} + goal: + properties: + allow_nonzero_volume: + default: false + type: boolean + offsets: + type: string + tip_spots: + type: string + use_channels: + type: string + required: + - tip_spots + type: object + result: {} + required: + - goal + title: drop_tips参数 + type: object + type: UniLabJsonCommandAsync auto-iter_tips: feedback: {} goal: {} @@ -6698,6 +6928,547 @@ liquid_handler.prcxi: title: transfer_liquid参数 type: object type: UniLabJsonCommandAsync + dispense: + feedback: {} + goal: {} + goal_default: + blow_out_air_volume: + - 0 + flow_rates: + - 0.0 + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + resources: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + spread: '' + use_channels: + - 0 + vols: + - 0.0 + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerDispense 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerDispense_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + blow_out_air_volume: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + flow_rates: + items: + type: number + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + resources: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + spread: + type: string + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + vols: + items: + type: number + type: array + required: + - resources + - vols + - use_channels + - flow_rates + - offsets + - blow_out_air_volume + - spread + title: LiquidHandlerDispense_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerDispense_Result + type: object + required: + - goal + title: LiquidHandlerDispense + type: object + type: LiquidHandlerDispense + drop_tips: + feedback: {} + goal: {} + goal_default: + allow_nonzero_volume: false + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + tip_spots: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + use_channels: + - 0 + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerDropTips 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerDropTips_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + allow_nonzero_volume: + type: boolean + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + tip_spots: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + use_channels: + items: + maximum: 2147483647 + minimum: -2147483648 + type: integer + type: array + required: + - tip_spots + - use_channels + - offsets + - allow_nonzero_volume + title: LiquidHandlerDropTips_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerDropTips_Result + type: object + required: + - goal + title: LiquidHandlerDropTips + type: object + type: LiquidHandlerDropTips + mix: + feedback: {} + goal: {} + goal_default: + height_to_bottom: 0.0 + mix_rate: 0.0 + mix_time: 0 + mix_vol: 0 + none_keys: + - '' + offsets: + - x: 0.0 + y: 0.0 + z: 0.0 + targets: + - category: '' + children: [] + config: '' + data: '' + id: '' + name: '' + parent: '' + pose: + orientation: + w: 1.0 + x: 0.0 + y: 0.0 + z: 0.0 + position: + x: 0.0 + y: 0.0 + z: 0.0 + sample_id: '' + type: '' + handles: [] + result: {} + schema: + description: ROS Action LiquidHandlerMix 的 JSON Schema + properties: + feedback: + description: Action 反馈 - 执行过程中从服务器发送到客户端 + properties: {} + required: [] + title: LiquidHandlerMix_Feedback + type: object + goal: + description: Action 目标 - 从客户端发送到服务器 + properties: + height_to_bottom: + type: number + mix_rate: + type: number + mix_time: + maximum: 2147483647 + minimum: -2147483648 + type: integer + mix_vol: + maximum: 2147483647 + minimum: -2147483648 + type: integer + none_keys: + items: + type: string + type: array + offsets: + items: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + type: array + targets: + items: + properties: + category: + type: string + children: + items: + type: string + type: array + config: + type: string + data: + type: string + id: + type: string + name: + type: string + parent: + type: string + pose: + properties: + orientation: + properties: + w: + type: number + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + - w + title: Quaternion + type: object + position: + properties: + x: + type: number + y: + type: number + z: + type: number + required: + - x + - y + - z + title: Point + type: object + required: + - position + - orientation + title: Pose + type: object + sample_id: + type: string + type: + type: string + required: + - id + - name + - sample_id + - children + - parent + - type + - category + - pose + - config + - data + title: Resource + type: object + type: array + required: + - targets + - mix_time + - mix_vol + - height_to_bottom + - offsets + - mix_rate + - none_keys + title: LiquidHandlerMix_Goal + type: object + result: + description: Action 结果 - 完成后从服务器发送到客户端 + properties: + return_info: + type: string + success: + type: boolean + required: + - return_info + - success + title: LiquidHandlerMix_Result + type: object + required: + - goal + title: LiquidHandlerMix + type: object + type: LiquidHandlerMix pick_up_tips: feedback: {} goal: @@ -6866,7 +7637,8 @@ liquid_handler.prcxi: type: object type: LiquidHandlerPickUpTips module: unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Handler - status_types: {} + status_types: + reset_ok: bool type: python description: prcxi液体处理器设备,基于pylabrobot控制 handles: [] @@ -6892,8 +7664,11 @@ liquid_handler.prcxi: - timeout type: object data: - properties: {} - required: [] + properties: + reset_ok: + type: boolean + required: + - reset_ok type: object liquid_handler.revvity: class: From 694a779c6659d845b61611769737d96191c01906 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:43:11 +0800 Subject: [PATCH 15/19] update prcxi registry --- unilabos/registry/devices/liquid_handler.yaml | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 617723d..8dfd600 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -6069,7 +6069,15 @@ liquid_handler.prcxi: action_value_mappings: aspirate: feedback: {} - goal: {} + goal: + blow_out_air_volume: blow_out_air_volume + end_delay: end_delay + flow_rates: flow_rates + liquid_height: liquid_height + offsets: offsets + resources: resources + use_channels: use_channels + vols: vols goal_default: blow_out_air_volume: - 0.0 @@ -6930,7 +6938,14 @@ liquid_handler.prcxi: type: UniLabJsonCommandAsync dispense: feedback: {} - goal: {} + goal: + blow_out_air_volume: blow_out_air_volume + flow_rates: flow_rates + offsets: offsets + resources: resources + spread: spread + use_channels: use_channels + vols: vols goal_default: blow_out_air_volume: - 0 @@ -7289,7 +7304,14 @@ liquid_handler.prcxi: type: LiquidHandlerDropTips mix: feedback: {} - goal: {} + goal: + height_to_bottom: height_to_bottom + mix_rate: mix_rate + mix_time: mix_time + mix_vol: mix_vol + none_keys: none_keys + offsets: offsets + targets: targets goal_default: height_to_bottom: 0.0 mix_rate: 0.0 From 4456529cfbaf5c2dba3f890b07a0d67d2f753eed Mon Sep 17 00:00:00 2001 From: Guangxin Zhang Date: Mon, 14 Jul 2025 15:23:31 +0800 Subject: [PATCH 16/19] Update prcxi.py to fit the function in unilabos. --- .../devices/liquid_handling/prcxi/prcxi.py | 225 +++++++++++++----- unilabos/utils/log.py | 4 +- 2 files changed, 161 insertions(+), 68 deletions(-) diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index b28f0d2..9e2b35b 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -275,6 +275,7 @@ class PRCXI9300Handler(LiquidHandlerAbstract): liquid_height: Optional[List[Optional[float]]] = None, blow_out_air_volume: Optional[List[Optional[float]]] = None, spread: Literal["wide", "tight", "custom"] = "wide", **backend_kwargs): + return await super().aspirate(resources, vols, use_channels, flow_rates, offsets, liquid_height, blow_out_air_volume, spread, **backend_kwargs) @@ -349,7 +350,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): MatrixCount=len(self.tablets_info), WorkTablets=self.tablets_info, ) - print(json.dumps(self.matrix_info, indent=2)) + #print(json.dumps(self.matrix_info, indent=2)) res = self.api_client.add_WorkTablet_Matrix(self.matrix_info) assert res["Success"], f"Failed to create matrix: {res.get('Message', 'Unknown error')}" print(f"PRCXI9300Backend created matrix with ID: {self.matrix_info['MatrixId']}, result: {res}") @@ -388,22 +389,30 @@ class PRCXI9300Backend(LiquidHandlerBackend): async def pick_up_tips(self, ops: List[Pickup], use_channels: List[int] = None): """Pick up tips from the specified resource.""" - # 12列,要PickUp A-H 1 - # PlateNo = 1-6 # 2行3列 - print("!!!!!!!!!" * 10) - print(ops, "====="*10) - # plate: PRCXI9300Container = ops[0].resource.parent.parent - # deck: PRCXI9300Deck = plate.parent - # plate_index = deck.children.index(plate) - # tipspot = ops[0].resource - # tipspot_index = tipspot.parent.children.index(tipspot) - # print(f"PRCXI9300Backend pick_up_tips: plate_index={plate_index}, tipspot_index={tipspot_index}") - # print(f"PRCXI9300Backend pick_up_tips: plate_index={plate_index}, plate.name={plate.name}") - # print(plate._unilabos_state["Material"]) - # for op in ops: - # print(f"PRCXI9300Backend pick_up_tips: {op.resource.name}") - PlateNo = 1 # 第一块板 - hole_col = 2 # 第二列的8个孔 + + if len(ops) != 8: + raise ValueError(f"PRCXI9300Backend pick_up_tips: Expected 8 pickups, got {len(ops)}") + + plate_indexes = [] + for op in ops: + plate = op.resource.parent.parent + deck = plate.parent + plate_index = deck.children.index(plate) + plate_indexes.append(plate_index) + if len(set(plate_indexes)) != 1: + raise ValueError("All pickups must be from the same plate. Found different plates: " + str(plate_indexes)) + + tip_columns = [] + for op in ops: + tipspot = op.resource + tipspot_index = tipspot.parent.children.index(tipspot) + tip_columns.append(tipspot_index // 8) + if len(set(tip_columns)) != 1: + raise ValueError("All pickups must be from the same tip column. Found different columns: " + str(tip_columns)) + + PlateNo = plate_indexes[0] + 1 + hole_col = tip_columns[0] + 1 + step = self.api_client.Load( "Left", dosage=0, @@ -417,11 +426,35 @@ class PRCXI9300Backend(LiquidHandlerBackend): hole_numbers="1,2,3,4,5,6,7,8", ) self.steps_todo_list.append(step) - print("PRCXI9300Backend pick_up_tips logged.") + async def drop_tips(self, ops: List[Drop], use_channels: List[int] = None): - PlateNo = 1 - hole_col = 2 + + """Pick up tips from the specified resource.""" + + if len(ops) != 8: + raise ValueError(f"PRCXI9300Backend drop_tips: Expected 8 pickups, got {len(ops)}") + + plate_indexes = [] + for op in ops: + plate = op.resource.parent.parent + deck = plate.parent + plate_index = deck.children.index(plate) + plate_indexes.append(plate_index) + if len(set(plate_indexes)) != 1: + raise ValueError("All drop_tips must be from the same plate. Found different plates: " + str(plate_indexes)) + + tip_columns = [] + for op in ops: + tipspot = op.resource + tipspot_index = tipspot.parent.children.index(tipspot) + tip_columns.append(tipspot_index // 8) + if len(set(tip_columns)) != 1: + raise ValueError("All drop_tips must be from the same tip column. Found different columns: " + str(tip_columns)) + + PlateNo = plate_indexes[0] + 1 + hole_col = tip_columns[0] + 1 + step = self.api_client.UnLoad( "Left", dosage=0, @@ -434,15 +467,7 @@ class PRCXI9300Backend(LiquidHandlerBackend): plate_or_hole=f"H{hole_col}-8,T{PlateNo}", hole_numbers="1,2,3,4,5,6,7,8", ) - allow_drop = False - for s in self.steps_todo_list: - if s.get("Function") == "Load": - self.steps_todo_list.append(step) - allow_drop = True - break - if not allow_drop: - raise ValueError("No matching Load step found for drop_tips.") - print("PRCXI9300Backend drop_tips logged.") + self.steps_todo_list.append(step) async def mix( self, @@ -454,19 +479,41 @@ class PRCXI9300Backend(LiquidHandlerBackend): mix_rate: Optional[float] = None, none_keys: List[str] = [], ): - volumes = [1] - PlateNo = 2 - hole_col = 2 - blending_times = 1 - assert blending_times > 0 + + """Mix liquid in the specified resources.""" + + if len(targets) != 8: + raise ValueError(f"PRCXI9300Backend aspirate: Expected 8 aspirate, got {len(targets)}") + + plate_indexes = [] + for op in targets: + deck = op.parent.parent.parent + plate = op.parent.parent + plate_index = deck.children.index(plate) + plate_indexes.append(plate_index) + + if len(set(plate_indexes)) != 1: + raise ValueError("All pickups must be from the same plate. Found different plates: " + str(plate_indexes)) + + tip_columns = [] + for op in targets: + tipspot_index = op.parent.children.index(op) + tip_columns.append(tipspot_index // 8) + + if len(set(tip_columns)) != 1: + raise ValueError("All pickups must be from the same tip column. Found different columns: " + str(tip_columns)) + + PlateNo = plate_indexes[0] + 1 + hole_col = tip_columns[0] + 1 + assert mix_time > 0 step = self.api_client.Blending( "Left", - dosage=int(volumes[0]), + dosage=mix_vol, plate_no=PlateNo, is_whole_plate=False, hole_row=1, hole_col=hole_col, - blending_times=blending_times, + blending_times=mix_time, balance_height=0, plate_or_hole=f"H{hole_col}-8,T{PlateNo}", hole_numbers="1,2,3,4,5,6,7,8", @@ -474,11 +521,38 @@ class PRCXI9300Backend(LiquidHandlerBackend): self.steps_todo_list.append(step) async def aspirate(self, ops: List[SingleChannelAspiration], use_channels: List[int] = None): - volumes = [1] - # volumes = [op.volume for op in ops] - # print(f"PRCXI9300Backend aspirate volumes: {volumes[0]} -> {int(volumes[0])} μL") - PlateNo = 2 - hole_col = 4 + + """Aspirate liquid from the specified resources.""" + + if len(ops) != 8: + raise ValueError(f"PRCXI9300Backend aspirate: Expected 8 aspirate, got {len(ops)}") + + plate_indexes = [] + for op in ops: + plate = op.resource.parent.parent + deck = plate.parent + plate_index = deck.children.index(plate) + plate_indexes.append(plate_index) + + if len(set(plate_indexes)) != 1: + raise ValueError("All pickups must be from the same plate. Found different plates: " + str(plate_indexes)) + + tip_columns = [] + for op in ops: + tipspot = op.resource + tipspot_index = tipspot.parent.children.index(tipspot) + tip_columns.append(tipspot_index // 8) + + if len(set(tip_columns)) != 1: + raise ValueError("All pickups must be from the same tip column. Found different columns: " + str(tip_columns)) + + volumes = [op.volume for op in ops] + if len(set(volumes)) != 1: + raise ValueError("All aspirate volumes must be the same. Found different volumes: " + str(volumes)) + + PlateNo = plate_indexes[0] + 1 + hole_col = tip_columns[0] + 1 + step = self.api_client.Imbibing( "Left", dosage=int(volumes[0]), @@ -493,12 +567,40 @@ class PRCXI9300Backend(LiquidHandlerBackend): ) self.steps_todo_list.append(step) + async def dispense(self, ops: List[SingleChannelDispense], use_channels: List[int] = None): - volumes = [1] - # volumes = [op.volume for op in ops] - # print(f"PRCXI9300Backend dispense volumes: {volumes[0]} -> {int(volumes[0])} μL") - PlateNo = 2 - hole_col = 2 + + """Dispense liquid into the specified resources.""" + + if len(ops) != 8: + raise ValueError(f"PRCXI9300Backend dispense: Expected 8 dispense, got {len(ops)}") + + plate_indexes = [] + for op in ops: + plate = op.resource.parent.parent + deck = plate.parent + plate_index = deck.children.index(plate) + plate_indexes.append(plate_index) + + if len(set(plate_indexes)) != 1: + raise ValueError("All dispense must be from the same plate. Found different plates: " + str(plate_indexes)) + + tip_columns = [] + for op in ops: + tipspot = op.resource + tipspot_index = tipspot.parent.children.index(tipspot) + tip_columns.append(tipspot_index // 8) + + if len(set(tip_columns)) != 1: + raise ValueError("All dispense must be from the same tip column. Found different columns: " + str(tip_columns)) + + volumes = [op.volume for op in ops] + if len(set(volumes)) != 1: + raise ValueError("All dispense volumes must be the same. Found different volumes: " + str(volumes)) + + PlateNo = plate_indexes[0] + 1 + hole_col = tip_columns[0] + 1 + step = self.api_client.Tapping( "Left", dosage=int(volumes[0]), @@ -914,22 +1016,17 @@ if __name__ == "__main__": deck.assign_child_resource(plate4, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) - input("debug....") + handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False) handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection - input("Creating protocol...") - # asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - # asyncio.run(handler.aspirate(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - # asyncio.run(handler.dispense(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - # asyncio.run(handler.drop_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) - asyncio.run(handler.pick_up_tips([], [], [])) - asyncio.run(handler.aspirate([], [], [])) - asyncio.run(handler.dispense([], [], [])) - asyncio.run(handler.mix([], mix_time=3, mix_vol=10, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) - asyncio.run(handler.drop_tips([], [], [])) - + asyncio.run(handler.pick_up_tips(tip_rack.children[:8],[0,1,2,3,4,5,6,7])) + asyncio.run(handler.aspirate(well_containers.children[:8],[50]*8, [0,1,2,3,4,5,6,7])) + asyncio.run(handler.dispense(well_containers.children[:8],[50]*8,[0,1,2,3,4,5,6,7])) + asyncio.run(handler.drop_tips(tip_rack.children[8:16],[0,1,2,3,4,5,6,7])) + asyncio.run(handler.mix(well_containers.children[:8], mix_time=3, mix_vol=50, height_to_bottom=0.5, offsets=Coordinate(0, 0, 0), mix_rate=100)) + print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info # asyncio.run(handler.add_liquid( # asp_vols=[100]*8, # dis_vols=[100]*8, @@ -942,12 +1039,8 @@ if __name__ == "__main__": # blow_out_air_volume=[None] * 8, # spread="wide", # )) - input("pick_up_tips add step") + # input("pick_up_tips add step") asyncio.run(handler.run_protocol()) # Run the protocol - input("Running protocol...") - print(json.dumps(handler._unilabos_backend.steps_todo_list, indent=2)) # Print matrix info - - - - input("Press Enter to continue...") # Wait for user input before proceeding - print("PRCXI9300Handler initialized with deck and host settings.") + # input("Running protocol...") + # input("Press Enter to continue...") # Wait for user input before proceeding + # print("PRCXI9300Handler initialized with deck and host settings.") diff --git a/unilabos/utils/log.py b/unilabos/utils/log.py index 61c95a1..eb04fd0 100644 --- a/unilabos/utils/log.py +++ b/unilabos/utils/log.py @@ -148,7 +148,7 @@ def configure_logger(): """配置日志记录器""" # 获取根日志记录器 root_logger = logging.getLogger() - root_logger.setLevel(logging.DEBUG) # 修改为DEBUG以显示所有级别 + root_logger.setLevel(logging.INFO) # 修改为DEBUG以显示所有级别 # 移除已存在的处理器 for handler in root_logger.handlers[:]: @@ -156,7 +156,7 @@ def configure_logger(): # 创建控制台处理器 console_handler = logging.StreamHandler() - console_handler.setLevel(logging.DEBUG) # 修改为DEBUG以显示所有级别 + console_handler.setLevel(logging.INFO) # 修改为DEBUG以显示所有级别 # 使用自定义的颜色格式化器 color_formatter = ColoredFormatter() From 10cb645191a149057a726118871ccb826b701aeb Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:56:34 +0800 Subject: [PATCH 17/19] =?UTF-8?q?=E4=B8=8D=E7=94=9F=E6=88=90=E5=B7=B2?= =?UTF-8?q?=E9=85=8D=E7=BD=AEaction=E7=9A=84=E5=8A=A8=E4=BD=9C=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0prcxi=E7=9A=84debug=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + test/experiments/prcxi.json | 3 ++- .../devices/liquid_handling/prcxi/prcxi.py | 18 ++++++++++++------ unilabos/registry/registry.py | 3 ++- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 9ba3b0e..728d704 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ configs/ +temp/ ## Python # Byte-compiled / optimized / DLL files diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json index e362558..b483a3a 100644 --- a/test/experiments/prcxi.json +++ b/test/experiments/prcxi.json @@ -19,7 +19,8 @@ "host": "192.168.3.9", "port": 9999, "timeout": 10.0, - "setup": true + "setup": false, + "debug": true }, "data": {}, "children": [ diff --git a/unilabos/devices/liquid_handling/prcxi/prcxi.py b/unilabos/devices/liquid_handling/prcxi/prcxi.py index 9e2b35b..e711993 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -91,10 +91,11 @@ class PRCXI9300Handler(LiquidHandlerAbstract): @property def reset_ok(self) -> bool: """检查设备是否已重置成功。""" + if self._unilabos_backend.debug: + return True return self._unilabos_backend.is_reset_ok - - def __init__(self, deck: Deck, host: str, port: int, timeout: float, setup=True): + def __init__(self, deck: Deck, host: str, port: int, timeout: float, setup=True, debug=False): tablets_info = [] count = 0 for child in deck.children: @@ -103,7 +104,7 @@ class PRCXI9300Handler(LiquidHandlerAbstract): tablets_info.append( WorkTablets(Number=count, Code=f"T{count}", Material=child._unilabos_state["Material"]) ) - self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, setup) + self._unilabos_backend = PRCXI9300Backend(tablets_info, host, port, timeout, setup, debug) super().__init__(backend=self._unilabos_backend, deck=deck) async def create_protocol( @@ -329,13 +330,15 @@ class PRCXI9300Backend(LiquidHandlerBackend): port: int = 9999, timeout: float = 10.0, setup=True, + debug=False, ) -> None: super().__init__() self.tablets_info = tablets_info - self.api_client = PRCXI9300Api(host, port, timeout) + self.api_client = PRCXI9300Api(host, port, timeout, debug) self.host, self.port, self.timeout = host, port, timeout self._num_channels = 8 self._execute_setup = setup + self.debug = debug def create_protocol(self, protocol_name): self.protocol_name = protocol_name @@ -648,14 +651,17 @@ class PRCXI9300Backend(LiquidHandlerBackend): class PRCXI9300Api: - def __init__(self, host: str = "127.0.0.1", port: int = 9999, timeout: float = 10.0) -> None: + def __init__(self, host: str = "127.0.0.1", port: int = 9999, timeout: float = 10.0, debug: bool = False) -> None: self.host, self.port, self.timeout = host, port, timeout + self.debug = debug @staticmethod def _len_prefix(n: int) -> bytes: return bytes.fromhex(format(n, "016x")) def _raw_request(self, payload: str) -> str: + if self.debug: + return " " with contextlib.closing(socket.socket()) as sock: sock.settimeout(self.timeout) sock.connect((self.host, self.port)) @@ -1017,7 +1023,7 @@ if __name__ == "__main__": deck.assign_child_resource(plate5, location=Coordinate(0, 0, 0)) deck.assign_child_resource(plate6, location=Coordinate(0, 0, 0)) - handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False) + handler = PRCXI9300Handler(deck=deck, host="192.168.3.9", port=9999, timeout=10.0, setup=False, debug=True) handler.set_tiprack([tip_rack]) # Set the tip rack for the handler asyncio.run(handler.setup()) # Initialize the handler and setup the connection asyncio.run(handler.create_protocol(protocol_name="Test Protocol")) # Initialize the backend and setup the connection diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index c5a6981..96d74d8 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -365,7 +365,8 @@ class Registry: "goal_default": {i["name"]: i["default"] for i in v["args"]}, "handles": [], } - for k, v in enhanced_info["action_methods"].items() + # 不生成已配置action的动作 + for k, v in enhanced_info["action_methods"].items() if k not in device_config["class"]["action_value_mappings"] } ) device_config["init_param_schema"] = {} From f9aae441747c4d12a7c69a65265a931e92dc0fb4 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Wed, 16 Jul 2025 01:05:16 +0800 Subject: [PATCH 18/19] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=A1=A8=E7=89=88=E6=9C=AC=E5=8F=82=E6=95=B0=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=B0=86auto-=E6=8C=87=E4=BB=A4=E4=BA=BA=E5=B7=A5?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=90=8E=E9=9D=9Eauto=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E7=94=9F=E6=88=90=E4=BA=BA=E5=B7=A5=E5=B7=B2=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E7=9A=84=E6=8C=87=E4=BB=A4=EF=BC=8C=E5=8F=96=E6=B6=88=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E7=9A=84description=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/devices/camera.yaml | 6 +- .../devices/characterization_optic.yaml | 52 +- unilabos/registry/devices/hotel.yaml | 2 +- .../registry/devices/laiyu_add_solid.yaml | 221 +-- unilabos/registry/devices/liquid_handler.yaml | 879 +----------- unilabos/registry/devices/mock_devices.yaml | 1245 ----------------- unilabos/registry/devices/moveit_config.yaml | 166 +-- .../devices/organic_miscellaneous.yaml | 95 +- unilabos/registry/devices/pump_and_valve.yaml | 79 +- unilabos/registry/devices/robot_agv.yaml | 31 +- unilabos/registry/devices/robot_arm.yaml | 37 +- unilabos/registry/devices/robot_gripper.yaml | 54 +- .../registry/devices/robot_linear_motion.yaml | 77 +- unilabos/registry/devices/sim_nodes.yaml | 2 +- unilabos/registry/devices/temperature.yaml | 161 +-- .../registry/devices/vacuum_and_purge.yaml | 150 +- unilabos/registry/devices/virtual_device.yaml | 877 ------------ unilabos/registry/devices/work_station.yaml | 78 -- unilabos/registry/devices/zhida_hplc.yaml | 59 +- unilabos/registry/registry.py | 86 +- unilabos/ros/msgs/message_converter.py | 170 +-- unilabos/ros/nodes/base_device_node.py | 2 +- unilabos/ros/nodes/presets/host_node.py | 2 +- unilabos/ros/nodes/presets/protocol_node.py | 2 +- 24 files changed, 247 insertions(+), 4286 deletions(-) diff --git a/unilabos/registry/devices/camera.yaml b/unilabos/registry/devices/camera.yaml index 55f5246..788e714 100644 --- a/unilabos/registry/devices/camera.yaml +++ b/unilabos/registry/devices/camera.yaml @@ -8,7 +8,7 @@ camera: handles: [] result: {} schema: - description: destroy_node的参数schema + description: 用于安全地关闭摄像头设备,释放摄像头资源,停止视频采集和发布服务。调用此函数将清理OpenCV摄像头连接并销毁ROS2节点。 properties: feedback: {} goal: @@ -28,7 +28,7 @@ camera: handles: [] result: {} schema: - description: timer_callback的参数schema + description: 定时器回调函数的参数schema。此函数负责定期采集摄像头视频帧,将OpenCV格式的图像转换为ROS Image消息格式,并发布到指定的视频话题。默认以10Hz频率执行,确保视频流的连续性和实时性。 properties: feedback: {} goal: @@ -44,7 +44,7 @@ camera: module: unilabos.ros.nodes.presets.camera:VideoPublisher status_types: {} type: ros2 - description: '' + description: VideoPublisher摄像头设备节点,用于实时视频采集和流媒体发布。该设备通过OpenCV连接本地摄像头(如USB摄像头、内置摄像头等),定时采集视频帧并将其转换为ROS2的sensor_msgs/Image消息格式发布到视频话题。主要用于实验室自动化系统中的视觉监控、图像分析、实时观察等应用场景。支持可配置的摄像头索引、发布频率等参数。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/characterization_optic.yaml b/unilabos/registry/devices/characterization_optic.yaml index a7fd543..a627c9e 100644 --- a/unilabos/registry/devices/characterization_optic.yaml +++ b/unilabos/registry/devices/characterization_optic.yaml @@ -8,7 +8,7 @@ hplc.agilent: handles: [] result: {} schema: - description: check_status的参数schema + description: 检查安捷伦HPLC设备状态的函数。用于监控设备的运行状态、连接状态、错误信息等关键指标。该函数定期查询设备状态,确保系统稳定运行,及时发现和报告设备异常。适用于自动化流程中的设备监控、故障诊断、系统维护等场景。 properties: feedback: {} goal: @@ -29,7 +29,7 @@ hplc.agilent: handles: [] result: {} schema: - description: extract_data_from_txt的参数schema + description: 从文本文件中提取分析数据的函数。用于解析安捷伦HPLC生成的结果文件,提取峰面积、保留时间、浓度等关键分析数据。支持多种文件格式的自动识别和数据结构化处理,为后续数据分析和报告生成提供标准化的数据格式。适用于批量数据处理、结果验证、质量控制等分析工作流程。 properties: feedback: {} goal: @@ -55,7 +55,7 @@ hplc.agilent: handles: [] result: {} schema: - description: start_sequence的参数schema + description: 启动安捷伦HPLC分析序列的函数。用于执行预定义的分析方法序列,包括样品进样、色谱分离、检测等完整的分析流程。支持参数配置、资源分配、工作流程管理等功能,实现全自动的样品分析。适用于批量样品处理、标准化分析、质量检测等需要连续自动分析的应用场景。 properties: feedback: {} goal: @@ -83,7 +83,7 @@ hplc.agilent: handles: [] result: {} schema: - description: try_close_sub_device的参数schema + description: 尝试关闭HPLC子设备的函数。用于安全地关闭泵、检测器、进样器等各个子模块,确保设备正常断开连接并保护硬件安全。该函数提供错误处理和状态确认机制,避免强制关闭可能造成的设备损坏。适用于设备维护、系统重启、紧急停机等需要安全关闭设备的场景。 properties: feedback: {} goal: @@ -106,7 +106,7 @@ hplc.agilent: handles: [] result: {} schema: - description: try_open_sub_device的参数schema + description: 尝试打开HPLC子设备的函数。用于初始化和连接泵、检测器、进样器等各个子模块,建立设备通信并进行自检。该函数提供连接验证和错误恢复机制,确保子设备正常启动并准备就绪。适用于设备初始化、系统启动、设备重连等需要建立设备连接的场景。 properties: feedback: {} goal: @@ -134,7 +134,6 @@ hplc.agilent: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -143,7 +142,6 @@ hplc.agilent: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -152,7 +150,6 @@ hplc.agilent: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -179,7 +176,7 @@ hplc.agilent: status_text: str success: bool type: python - description: HPLC device + description: 安捷伦高效液相色谱(HPLC)分析设备,用于复杂化合物的分离、检测和定量分析。该设备通过UI自动化技术控制安捷伦ChemStation软件,实现全自动的样品分析流程。具备序列启动、设备状态监控、数据文件提取、结果处理等功能。支持多样品批量处理和实时状态反馈,适用于药物分析、环境检测、食品安全、化学研究等需要高精度色谱分析的实验室应用。 handles: [] icon: '' init_param_schema: @@ -229,7 +226,7 @@ raman_home_made: handles: [] result: {} schema: - description: ccd_time的参数schema + description: 设置CCD检测器积分时间的函数。用于配置拉曼光谱仪的信号采集时间,控制光谱数据的质量和信噪比。较长的积分时间可获得更高的信号强度和更好的光谱质量,但会增加测量时间。该函数允许根据样品特性和测量要求动态调整检测参数,优化测量效果。 properties: feedback: {} goal: @@ -253,7 +250,7 @@ raman_home_made: handles: [] result: {} schema: - description: laser_on_power的参数schema + description: 设置激光器输出功率的函数。用于控制拉曼光谱仪激光器的功率输出,调节激光强度以适应不同样品的测量需求。适当的激光功率能够获得良好的拉曼信号同时避免样品损伤。该函数支持精确的功率控制,确保测量结果的稳定性和重现性。 properties: feedback: {} goal: @@ -269,30 +266,6 @@ raman_home_made: title: laser_on_power参数 type: object type: UniLabJsonCommand - auto-raman_cmd: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: raman_cmd的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: raman_cmd参数 - type: object - type: UniLabJsonCommand auto-raman_without_background: feedback: {} goal: {} @@ -302,7 +275,7 @@ raman_home_made: handles: [] result: {} schema: - description: raman_without_background的参数schema + description: 执行无背景扣除的拉曼光谱测量函数。用于直接采集样品的拉曼光谱信号,不进行背景校正处理。该函数配置积分时间和激光功率参数,获取原始光谱数据用于后续的数据处理分析。适用于对光谱数据质量要求较高或需要自定义背景处理流程的测量场景。 properties: feedback: {} goal: @@ -332,7 +305,7 @@ raman_home_made: handles: [] result: {} schema: - description: raman_without_background_average的参数schema + description: 执行多次平均的无背景拉曼光谱测量函数。通过多次测量取平均值来提高光谱数据的信噪比和测量精度,减少随机噪声影响。该函数支持自定义平均次数、积分时间、激光功率等参数,并可为样品指定名称便于数据管理。适用于对测量精度要求较高的定量分析和研究应用。 properties: feedback: {} goal: @@ -370,7 +343,6 @@ raman_home_made: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -379,7 +351,6 @@ raman_home_made: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -388,7 +359,6 @@ raman_home_made: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -407,7 +377,7 @@ raman_home_made: module: unilabos.devices.raman_uv.home_made_raman:RamanObj status_types: {} type: python - description: Raman spectroscopy device + description: 拉曼光谱分析设备,用于物质的分子结构和化学成分表征。该设备集成激光器和CCD检测器,通过串口通信控制激光功率和光谱采集。具备背景扣除、多次平均、自动数据处理等功能,支持高精度的拉曼光谱测量。适用于材料表征、化学分析、质量控制、研究开发等需要分子指纹识别和结构分析的实验应用。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/hotel.yaml b/unilabos/registry/devices/hotel.yaml index e5cfc06..95d23bd 100644 --- a/unilabos/registry/devices/hotel.yaml +++ b/unilabos/registry/devices/hotel.yaml @@ -5,7 +5,7 @@ hotel.thermo_orbitor_rs2_hotel: status_types: rotation: String type: python - description: Thermo Orbitor RS2 Hotel + description: Thermo Orbitor RS2 Hotel容器设备,用于实验室样品的存储和管理。该设备通过HotelContainer类实现容器的旋转控制和状态监控,主要用于存储实验样品、试剂瓶或其他实验器具,支持旋转功能以便于样品的自动化存取。适用于需要有序存储和快速访问大量样品的实验室自动化场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/laiyu_add_solid.yaml b/unilabos/registry/devices/laiyu_add_solid.yaml index 02b8014..5421a5f 100644 --- a/unilabos/registry/devices/laiyu_add_solid.yaml +++ b/unilabos/registry/devices/laiyu_add_solid.yaml @@ -15,16 +15,14 @@ laiyu_add_solid: result: actual_mass_mg: actual_mass_mg schema: - description: ROS Action SolidDispenseAddPowderTube 的 JSON Schema + description: 向目标粉筒位置添加固体粉末。该函数通过Modbus RTU协议与设备通信,控制粉末分装机将指定质量的粉末添加到目标粉筒位置。支持精确称量和批量处理,适用于实验室化学试剂的自动分装。 properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: SolidDispenseAddPowderTube_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: compound_mass: type: number @@ -41,7 +39,6 @@ laiyu_add_solid: title: SolidDispenseAddPowderTube_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: actual_mass_mg: type: number @@ -60,38 +57,6 @@ laiyu_add_solid: title: SolidDispenseAddPowderTube type: object type: SolidDispenseAddPowderTube - auto-add_powder_tube: - feedback: {} - goal: {} - goal_default: - compound_mass: null - powder_tube_number: null - target_tube_position: null - handles: [] - result: {} - schema: - description: add_powder_tube的参数schema - properties: - feedback: {} - goal: - properties: - compound_mass: - type: string - powder_tube_number: - type: string - target_tube_position: - type: string - required: - - powder_tube_number - - target_tube_position - - compound_mass - type: object - result: {} - required: - - goal - title: add_powder_tube参数 - type: object - type: UniLabJsonCommand auto-calculate_crc: feedback: {} goal: {} @@ -100,7 +65,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: calculate_crc的参数schema + description: Modbus CRC-16校验码计算函数。计算Modbus RTU通信协议所需的CRC-16校验码,确保数据传输的完整性和可靠性。该函数实现标准的CRC-16算法,用于构造完整的Modbus指令帧。 properties: feedback: {} goal: @@ -116,154 +81,6 @@ laiyu_add_solid: title: calculate_crc参数 type: object type: UniLabJsonCommand - auto-discharge: - feedback: {} - goal: {} - goal_default: - float_in: null - handles: [] - result: {} - schema: - description: discharge的参数schema - properties: - feedback: {} - goal: - properties: - float_in: - type: number - required: - - float_in - type: object - result: {} - required: - - goal - title: discharge参数 - type: object - type: UniLabJsonCommand - auto-move_to_plate: - feedback: {} - goal: {} - goal_default: - string: null - handles: [] - result: {} - schema: - description: move_to_plate的参数schema - properties: - feedback: {} - goal: - properties: - string: - type: string - required: - - string - type: object - result: {} - required: - - goal - title: move_to_plate参数 - type: object - type: UniLabJsonCommand - auto-move_to_xyz: - feedback: {} - goal: {} - goal_default: - x: null - y: null - z: null - handles: [] - result: {} - schema: - description: move_to_xyz的参数schema - properties: - feedback: {} - goal: - properties: - x: - type: number - y: - type: number - z: - type: number - required: - - x - - y - - z - type: object - result: {} - required: - - goal - title: move_to_xyz参数 - type: object - type: UniLabJsonCommand - auto-pick_powder_tube: - feedback: {} - goal: {} - goal_default: - int_input: null - handles: [] - result: {} - schema: - description: pick_powder_tube的参数schema - properties: - feedback: {} - goal: - properties: - int_input: - type: integer - required: - - int_input - type: object - result: {} - required: - - goal - title: pick_powder_tube参数 - type: object - type: UniLabJsonCommand - auto-put_powder_tube: - feedback: {} - goal: {} - goal_default: - int_input: null - handles: [] - result: {} - schema: - description: put_powder_tube的参数schema - properties: - feedback: {} - goal: - properties: - int_input: - type: integer - required: - - int_input - type: object - result: {} - required: - - goal - title: put_powder_tube参数 - type: object - type: UniLabJsonCommand - auto-reset: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: reset的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: reset参数 - type: object - type: UniLabJsonCommand auto-send_command: feedback: {} goal: {} @@ -272,7 +89,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: send_command的参数schema + description: Modbus指令发送函数。构造完整的Modbus RTU指令帧(包含CRC校验),发送给分装设备并等待响应。该函数处理底层通信协议,确保指令的正确传输和响应接收,支持最长3分钟的响应等待时间。 properties: feedback: {} goal: @@ -297,16 +114,14 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: 执行出料操作,传入出料质量(单位0.1mg) properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -315,7 +130,6 @@ laiyu_add_solid: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -340,16 +154,14 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: 移动到某个孔板位置。 properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -358,7 +170,6 @@ laiyu_add_solid: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -387,16 +198,14 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action Point3DSeparateInput 的 JSON Schema + description: 按照坐标移动,单位为0.1mm properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: Point3DSeparateInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: x: type: number @@ -411,7 +220,6 @@ laiyu_add_solid: title: Point3DSeparateInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -436,16 +244,14 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action IntSingleInput 的 JSON Schema + description: 装载粉筒,传入粉筒编号 properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: IntSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: int_input: maximum: 2147483647 @@ -456,7 +262,6 @@ laiyu_add_solid: title: IntSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -481,16 +286,14 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action IntSingleInput 的 JSON Schema + description: 放回粉筒 properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: IntSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: int_input: maximum: 2147483647 @@ -501,7 +304,6 @@ laiyu_add_solid: title: IntSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -524,22 +326,19 @@ laiyu_add_solid: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: 重置指令 properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -556,7 +355,7 @@ laiyu_add_solid: status_types: status: str type: python - description: Laiyu Add Solid + description: 来渝固体粉末自动分装设备,用于实验室化学试剂的精确称量和分装。该设备通过Modbus RTU协议与控制系统通信,集成了精密天平、三轴运动平台、粉筒管理系统等组件。支持多种粉末试剂的自动拿取、精确称量、定点分装和归位操作。具备高精度称量、位置控制和批量处理能力,适用于化学合成、药物研发、材料制备等需要精确固体试剂配制的实验室应用场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 8dfd600..8e56225 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -91,13 +91,11 @@ liquid_handler: description: ROS Action LiquidHandlerAdd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerAdd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: asp_vols: items: @@ -333,7 +331,6 @@ liquid_handler: title: LiquidHandlerAdd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -403,13 +400,11 @@ liquid_handler: description: ROS Action LiquidHandlerAspirate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerAspirate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: blow_out_air_volume: items: @@ -538,7 +533,6 @@ liquid_handler: title: LiquidHandlerAspirate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -554,84 +548,6 @@ liquid_handler: title: LiquidHandlerAspirate type: object type: LiquidHandlerAspirate - auto-add_liquid: - feedback: {} - goal: {} - goal_default: - asp_vols: null - blow_out_air_volume: null - delays: null - dis_vols: null - flow_rates: null - is_96_well: false - liquid_height: null - mix_liquid_height: null - mix_rate: null - mix_time: null - mix_vol: null - none_keys: [] - offsets: null - reagent_sources: null - spread: wide - targets: null - use_channels: null - handles: [] - result: {} - schema: - description: add_liquid的参数schema - properties: - feedback: {} - goal: - properties: - asp_vols: - type: string - blow_out_air_volume: - type: string - delays: - type: string - dis_vols: - type: string - flow_rates: - type: string - is_96_well: - default: false - type: boolean - liquid_height: - type: string - mix_liquid_height: - type: string - mix_rate: - type: string - mix_time: - type: string - mix_vol: - type: string - none_keys: - default: [] - type: string - offsets: - type: string - reagent_sources: - type: string - spread: - default: wide - type: string - targets: - type: string - use_channels: - type: string - required: - - asp_vols - - dis_vols - - reagent_sources - - targets - type: object - result: {} - required: - - goal - title: add_liquid参数 - type: object - type: UniLabJsonCommandAsync auto-create_protocol: feedback: {} goal: {} @@ -646,7 +562,7 @@ liquid_handler: handles: [] result: {} schema: - description: create_protocol的参数schema + description: 创建实验协议函数。用于建立新的液体处理实验协议,定义协议名称、描述、版本、作者、日期等基本信息。该函数支持协议模板化管理,便于实验流程的标准化和重复性。适用于实验设计、方法开发、标准操作程序建立等需要协议管理的应用场景。 properties: feedback: {} goal: @@ -689,7 +605,7 @@ liquid_handler: handles: [] result: {} schema: - description: custom_delay的参数schema + description: 自定义延时函数。在实验流程中插入可配置的等待时间,用于满足特定的反应时间、孵育时间或设备稳定时间要求。支持自定义延时消息和秒数设置,提供流程控制和时间管理功能。适用于酶反应等待、温度平衡、样品孵育等需要时间控制的实验步骤。 properties: feedback: {} goal: @@ -715,7 +631,7 @@ liquid_handler: handles: [] result: {} schema: - description: iter_tips的参数schema + description: 吸头迭代函数。用于自动管理和切换吸头架中的吸头,实现批量实验中的吸头自动分配和追踪。该函数监控吸头使用状态,自动切换到下一个可用吸头位置,确保实验流程的连续性。适用于高通量实验、批量处理、自动化流水线等需要大量吸头管理的应用场景。 properties: feedback: {} goal: @@ -731,81 +647,6 @@ liquid_handler: title: iter_tips参数 type: object type: UniLabJsonCommand - auto-mix: - feedback: {} - goal: {} - goal_default: - height_to_bottom: null - mix_rate: null - mix_time: null - mix_vol: null - none_keys: [] - offsets: null - targets: null - handles: [] - result: {} - schema: - description: mix的参数schema - properties: - feedback: {} - goal: - properties: - height_to_bottom: - type: string - mix_rate: - type: string - mix_time: - type: integer - mix_vol: - type: string - none_keys: - default: [] - type: string - offsets: - type: string - targets: - type: string - required: - - targets - type: object - result: {} - required: - - goal - title: mix参数 - type: object - type: UniLabJsonCommandAsync - auto-move_to: - feedback: {} - goal: {} - goal_default: - channel: 0 - dis_to_top: 0 - well: null - handles: [] - result: {} - schema: - description: move_to的参数schema - properties: - feedback: {} - goal: - properties: - channel: - default: 0 - type: integer - dis_to_top: - default: 0 - type: number - well: - type: string - required: - - well - type: object - result: {} - required: - - goal - title: move_to参数 - type: object - type: UniLabJsonCommandAsync auto-remove_liquid: feedback: {} goal: {} @@ -826,7 +667,7 @@ liquid_handler: handles: [] result: {} schema: - description: remove_liquid的参数schema + description: 液体移除操作函数。从指定容器位置移除液体并转移到废液容器中。支持多源位置批量操作、流速控制、液面高度检测、96孔板模式等功能。可配置延时、吹气体积、位置偏移等参数,确保液体完全移除和容器清洁。适用于样品清洗、废液处理、容器清空等实验清理操作。 properties: feedback: {} goal: @@ -878,7 +719,7 @@ liquid_handler: handles: [] result: {} schema: - description: set_tiprack的参数schema + description: 吸头架设置函数。用于配置和初始化液体处理系统的吸头架信息,包括吸头架位置、类型、容量等参数。该函数建立吸头资源管理系统,为后续的吸头选择和使用提供基础配置。适用于系统初始化、吸头架更换、实验配置等需要吸头资源管理的操作场景。 properties: feedback: {} goal: @@ -902,7 +743,7 @@ liquid_handler: handles: [] result: {} schema: - description: touch_tip的参数schema + description: 吸头碰触函数。控制移液器吸头轻触容器边缘或底部,用于去除吸头外壁附着的液滴,提高移液精度和减少污染。该函数支持多目标位置操作,可配置碰触参数和位置偏移。适用于精密移液、减少液体残留、防止交叉污染等需要提高移液质量的实验操作。 properties: feedback: {} goal: @@ -918,99 +759,6 @@ liquid_handler: title: touch_tip参数 type: object type: UniLabJsonCommandAsync - auto-transfer_liquid: - feedback: {} - goal: {} - goal_default: - asp_flow_rates: null - asp_vols: null - blow_out_air_volume: null - delays: null - dis_flow_rates: null - dis_vols: null - is_96_well: false - liquid_height: null - mix_liquid_height: null - mix_rate: null - mix_stage: none - mix_times: null - mix_vol: null - none_keys: [] - offsets: null - sources: null - spread: wide - targets: null - tip_racks: null - touch_tip: false - use_channels: null - handles: [] - result: {} - schema: - description: transfer_liquid的参数schema - properties: - feedback: {} - goal: - properties: - asp_flow_rates: - type: string - asp_vols: - type: string - blow_out_air_volume: - type: string - delays: - type: string - dis_flow_rates: - type: string - dis_vols: - type: string - is_96_well: - default: false - type: boolean - liquid_height: - type: string - mix_liquid_height: - type: string - mix_rate: - type: string - mix_stage: - default: none - type: string - mix_times: - type: string - mix_vol: - type: string - none_keys: - default: [] - type: string - offsets: - type: string - sources: - type: string - spread: - default: wide - type: string - targets: - type: string - tip_racks: - type: string - touch_tip: - default: false - type: boolean - use_channels: - type: string - required: - - sources - - targets - - tip_racks - - asp_vols - - dis_vols - type: object - result: {} - required: - - goal - title: transfer_liquid参数 - type: object - type: UniLabJsonCommandAsync discard_tips: feedback: {} goal: @@ -1025,13 +773,11 @@ liquid_handler: description: ROS Action LiquidHandlerDiscardTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDiscardTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: use_channels: items: @@ -1044,7 +790,6 @@ liquid_handler: title: LiquidHandlerDiscardTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1111,13 +856,11 @@ liquid_handler: description: ROS Action LiquidHandlerDispense 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDispense_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: blow_out_air_volume: items: @@ -1243,7 +986,6 @@ liquid_handler: title: LiquidHandlerDispense_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1301,13 +1043,11 @@ liquid_handler: description: ROS Action LiquidHandlerDropTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDropTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: allow_nonzero_volume: type: boolean @@ -1416,7 +1156,6 @@ liquid_handler: title: LiquidHandlerDropTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1471,13 +1210,11 @@ liquid_handler: description: ROS Action LiquidHandlerDropTips96 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDropTips96_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: allow_nonzero_volume: type: boolean @@ -1575,7 +1312,6 @@ liquid_handler: title: LiquidHandlerDropTips96_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1638,13 +1374,11 @@ liquid_handler: description: ROS Action LiquidHandlerMix 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMix_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: height_to_bottom: type: number @@ -1764,7 +1498,6 @@ liquid_handler: title: LiquidHandlerMix_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1858,13 +1591,11 @@ liquid_handler: description: ROS Action LiquidHandlerMoveLid 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMoveLid_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: destination_offset: properties: @@ -2080,7 +1811,6 @@ liquid_handler: title: LiquidHandlerMoveLid_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2178,13 +1908,11 @@ liquid_handler: description: ROS Action LiquidHandlerMovePlate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMovePlate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: destination_offset: properties: @@ -2415,7 +2143,6 @@ liquid_handler: title: LiquidHandlerMovePlate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2493,13 +2220,11 @@ liquid_handler: description: ROS Action LiquidHandlerMoveResource 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMoveResource_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: destination_offset: properties: @@ -2656,7 +2381,6 @@ liquid_handler: title: LiquidHandlerMoveResource_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2707,13 +2431,11 @@ liquid_handler: description: ROS Action LiquidHandlerMoveTo 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMoveTo_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: channel: maximum: 2147483647 @@ -2801,7 +2523,6 @@ liquid_handler: title: LiquidHandlerMoveTo_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2857,13 +2578,11 @@ liquid_handler: description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerPickUpTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: offsets: items: @@ -2969,7 +2688,6 @@ liquid_handler: title: LiquidHandlerPickUpTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3022,13 +2740,11 @@ liquid_handler: description: ROS Action LiquidHandlerPickUpTips96 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerPickUpTips96_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: offset: properties: @@ -3123,7 +2839,6 @@ liquid_handler: title: LiquidHandlerPickUpTips96_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3224,13 +2939,11 @@ liquid_handler: description: ROS Action LiquidHandlerRemove 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerRemove_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: blow_out_air_volume: items: @@ -3453,7 +3166,6 @@ liquid_handler: title: LiquidHandlerRemove_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3485,13 +3197,11 @@ liquid_handler: description: ROS Action LiquidHandlerReturnTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerReturnTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: allow_nonzero_volume: type: boolean @@ -3507,7 +3217,6 @@ liquid_handler: title: LiquidHandlerReturnTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3536,13 +3245,11 @@ liquid_handler: description: ROS Action LiquidHandlerReturnTips96 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerReturnTips96_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: allow_nonzero_volume: type: boolean @@ -3551,7 +3258,6 @@ liquid_handler: title: LiquidHandlerReturnTips96_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3626,13 +3332,11 @@ liquid_handler: description: ROS Action LiquidHandlerStamp 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerStamp_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: aspiration_flow_rate: type: number @@ -3795,7 +3499,6 @@ liquid_handler: title: LiquidHandlerStamp_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3917,13 +3620,11 @@ liquid_handler: description: ROS Action LiquidHandlerTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: asp_flow_rates: items: @@ -4255,7 +3956,6 @@ liquid_handler: title: LiquidHandlerTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4393,13 +4093,11 @@ liquid_handler: description: ROS Action LiquidHandlerTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: asp_flow_rates: items: @@ -4731,7 +4429,6 @@ liquid_handler: title: LiquidHandlerTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4785,54 +4482,6 @@ liquid_handler: liquid_handler.biomek: class: action_value_mappings: - auto-create_protocol: - feedback: {} - goal: {} - goal_default: - none_keys: [] - protocol_author: null - protocol_date: null - protocol_description: null - protocol_name: null - protocol_type: null - protocol_version: null - handles: [] - result: {} - schema: - description: create_protocol的参数schema - properties: - feedback: {} - goal: - properties: - none_keys: - default: [] - type: array - protocol_author: - type: string - protocol_date: - type: string - protocol_description: - type: string - protocol_name: - type: string - protocol_type: - type: string - protocol_version: - type: string - required: - - protocol_name - - protocol_description - - protocol_version - - protocol_author - - protocol_date - - protocol_type - type: object - result: {} - required: - - goal - title: create_protocol参数 - type: object - type: UniLabJsonCommand auto-create_resource: feedback: {} goal: {} @@ -4885,30 +4534,6 @@ liquid_handler.biomek: title: create_resource参数 type: object type: UniLabJsonCommand - auto-incubation_biomek: - feedback: {} - goal: {} - goal_default: - time: null - handles: [] - result: {} - schema: - description: incubation_biomek的参数schema - properties: - feedback: {} - goal: - properties: - time: - type: integer - required: - - time - type: object - result: {} - required: - - goal - title: incubation_biomek参数 - type: object - type: UniLabJsonCommand auto-instrument_setup_biomek: feedback: {} goal: {} @@ -4957,219 +4582,6 @@ liquid_handler.biomek: title: instrument_setup_biomek参数 type: object type: UniLabJsonCommand - auto-move_biomek: - feedback: {} - goal: {} - goal_default: - source: null - target: null - handles: [] - result: {} - schema: - description: move_biomek的参数schema - properties: - feedback: {} - goal: - properties: - source: - type: string - target: - type: string - required: - - source - - target - type: object - result: {} - required: - - goal - title: move_biomek参数 - type: object - type: UniLabJsonCommand - auto-oscillation_biomek: - feedback: {} - goal: {} - goal_default: - rpm: null - time: null - handles: [] - result: {} - schema: - description: oscillation_biomek的参数schema - properties: - feedback: {} - goal: - properties: - rpm: - type: integer - time: - type: integer - required: - - rpm - - time - type: object - result: {} - required: - - goal - title: oscillation_biomek参数 - type: object - type: UniLabJsonCommand - auto-run_protocol: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: run_protocol的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: run_protocol参数 - type: object - type: UniLabJsonCommand - auto-transfer_biomek: - feedback: {} - goal: {} - goal_default: - aspirate_techniques: null - dispense_techniques: null - source: null - target: null - tip_rack: null - volume: null - handles: [] - result: {} - schema: - description: transfer_biomek的参数schema - properties: - feedback: {} - goal: - properties: - aspirate_techniques: - type: string - dispense_techniques: - type: string - source: - type: string - target: - type: string - tip_rack: - type: string - volume: - type: number - required: - - source - - target - - tip_rack - - volume - - aspirate_techniques - - dispense_techniques - type: object - result: {} - required: - - goal - title: transfer_biomek参数 - type: object - type: UniLabJsonCommand - auto-transfer_liquid: - feedback: {} - goal: {} - goal_default: - asp_flow_rates: null - asp_vols: null - blow_out_air_volume: null - delays: null - dis_flow_rates: null - dis_vols: null - is_96_well: false - liquid_height: null - mix_liquid_height: null - mix_rate: null - mix_stage: none - mix_times: null - mix_vol: null - none_keys: [] - offsets: null - sources: null - spread: wide - targets: null - tip_racks: null - touch_tip: false - use_channels: null - handles: [] - result: {} - schema: - description: transfer_liquid的参数schema - properties: - feedback: {} - goal: - properties: - asp_flow_rates: - type: string - asp_vols: - type: string - blow_out_air_volume: - type: string - delays: - type: string - dis_flow_rates: - type: string - dis_vols: - type: string - is_96_well: - default: false - type: boolean - liquid_height: - type: string - mix_liquid_height: - type: string - mix_rate: - type: string - mix_stage: - default: none - type: string - mix_times: - type: string - mix_vol: - type: string - none_keys: - default: [] - type: array - offsets: - type: string - sources: - type: string - spread: - default: wide - type: string - targets: - type: string - tip_racks: - type: string - touch_tip: - default: false - type: boolean - use_channels: - type: string - required: - - sources - - targets - - tip_racks - - asp_vols - - dis_vols - type: object - result: {} - required: - - goal - title: transfer_liquid参数 - type: object - type: UniLabJsonCommand create_protocol: feedback: {} goal: @@ -5195,13 +4607,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerProtocolCreation 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerProtocolCreation_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: none_keys: items: @@ -5230,7 +4640,6 @@ liquid_handler.biomek: title: LiquidHandlerProtocolCreation_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5267,13 +4676,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerIncubateBiomek 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerIncubateBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: time: maximum: 2147483647 @@ -5284,7 +4691,6 @@ liquid_handler.biomek: title: LiquidHandlerIncubateBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5327,13 +4733,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerMoveBiomek 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMoveBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: sources: type: string @@ -5345,7 +4749,6 @@ liquid_handler.biomek: title: LiquidHandlerMoveBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5387,13 +4790,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerOscillateBiomek 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerOscillateBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: rpm: maximum: 2147483647 @@ -5409,7 +4810,6 @@ liquid_handler.biomek: title: LiquidHandlerOscillateBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5435,19 +4835,16 @@ liquid_handler.biomek: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5509,13 +4906,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerTransferBiomek 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerTransferBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: aspirate_technique: type: string @@ -5539,7 +4934,6 @@ liquid_handler.biomek: title: LiquidHandlerTransferBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5691,13 +5085,11 @@ liquid_handler.biomek: description: ROS Action LiquidHandlerTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: asp_flow_rates: items: @@ -6029,7 +5421,6 @@ liquid_handler.biomek: title: LiquidHandlerTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -6120,13 +5511,11 @@ liquid_handler.prcxi: description: ROS Action LiquidHandlerAspirate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerAspirate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: blow_out_air_volume: items: @@ -6255,7 +5644,6 @@ liquid_handler.prcxi: title: LiquidHandlerAspirate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -6349,53 +5737,6 @@ liquid_handler.prcxi: title: add_liquid参数 type: object type: UniLabJsonCommandAsync - auto-aspirate: - feedback: {} - goal: {} - goal_default: - blow_out_air_volume: null - flow_rates: null - liquid_height: null - offsets: null - resources: null - spread: wide - use_channels: null - vols: null - handles: [] - result: {} - schema: - description: aspirate的参数schema - properties: - feedback: {} - goal: - properties: - blow_out_air_volume: - type: string - flow_rates: - type: string - liquid_height: - type: string - offsets: - type: string - resources: - type: string - spread: - default: wide - type: string - use_channels: - type: string - vols: - type: array - required: - - resources - - vols - type: object - result: {} - required: - - goal - title: aspirate参数 - type: object - type: UniLabJsonCommandAsync auto-create_protocol: feedback: {} goal: {} @@ -6501,87 +5842,6 @@ liquid_handler.prcxi: title: discard_tips参数 type: object type: UniLabJsonCommandAsync - auto-dispense: - feedback: {} - goal: {} - goal_default: - blow_out_air_volume: null - flow_rates: null - liquid_height: null - offsets: null - resources: null - spread: wide - use_channels: null - vols: null - handles: [] - result: {} - schema: - description: dispense的参数schema - properties: - feedback: {} - goal: - properties: - blow_out_air_volume: - type: string - flow_rates: - type: string - liquid_height: - type: string - offsets: - type: string - resources: - type: string - spread: - default: wide - type: string - use_channels: - type: string - vols: - type: array - required: - - resources - - vols - type: object - result: {} - required: - - goal - title: dispense参数 - type: object - type: UniLabJsonCommandAsync - auto-drop_tips: - feedback: {} - goal: {} - goal_default: - allow_nonzero_volume: false - offsets: null - tip_spots: null - use_channels: null - handles: [] - result: {} - schema: - description: drop_tips的参数schema - properties: - feedback: {} - goal: - properties: - allow_nonzero_volume: - default: false - type: boolean - offsets: - type: string - tip_spots: - type: string - use_channels: - type: string - required: - - tip_spots - type: object - result: {} - required: - - goal - title: drop_tips参数 - type: object - type: UniLabJsonCommandAsync auto-iter_tips: feedback: {} goal: {} @@ -6606,49 +5866,6 @@ liquid_handler.prcxi: title: iter_tips参数 type: object type: UniLabJsonCommand - auto-mix: - feedback: {} - goal: {} - goal_default: - height_to_bottom: null - mix_rate: null - mix_time: null - mix_vol: null - none_keys: [] - offsets: null - targets: null - handles: [] - result: {} - schema: - description: mix的参数schema - properties: - feedback: {} - goal: - properties: - height_to_bottom: - type: string - mix_rate: - type: string - mix_time: - type: integer - mix_vol: - type: string - none_keys: - default: [] - type: array - offsets: - type: string - targets: - type: string - required: - - targets - type: object - result: {} - required: - - goal - title: mix参数 - type: object - type: UniLabJsonCommandAsync auto-move_to: feedback: {} goal: {} @@ -6681,36 +5898,6 @@ liquid_handler.prcxi: title: move_to参数 type: object type: UniLabJsonCommandAsync - auto-pick_up_tips: - feedback: {} - goal: {} - goal_default: - offsets: null - tip_spots: null - use_channels: null - handles: [] - result: {} - schema: - description: pick_up_tips的参数schema - properties: - feedback: {} - goal: - properties: - offsets: - type: string - tip_spots: - type: array - use_channels: - type: string - required: - - tip_spots - type: object - result: {} - required: - - goal - title: pick_up_tips参数 - type: object - type: UniLabJsonCommandAsync auto-remove_liquid: feedback: {} goal: {} @@ -6986,13 +6173,11 @@ liquid_handler.prcxi: description: ROS Action LiquidHandlerDispense 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDispense_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: blow_out_air_volume: items: @@ -7118,7 +6303,6 @@ liquid_handler.prcxi: title: LiquidHandlerDispense_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -7171,13 +6355,11 @@ liquid_handler.prcxi: description: ROS Action LiquidHandlerDropTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerDropTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: allow_nonzero_volume: type: boolean @@ -7286,7 +6468,6 @@ liquid_handler.prcxi: title: LiquidHandlerDropTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -7349,13 +6530,11 @@ liquid_handler.prcxi: description: ROS Action LiquidHandlerMix 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMix_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: height_to_bottom: type: number @@ -7475,7 +6654,6 @@ liquid_handler.prcxi: title: LiquidHandlerMix_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -7530,13 +6708,11 @@ liquid_handler.prcxi: description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerPickUpTips_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: offsets: items: @@ -7642,7 +6818,6 @@ liquid_handler.prcxi: title: LiquidHandlerPickUpTips_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -7668,6 +6843,9 @@ liquid_handler.prcxi: init_param_schema: config: properties: + debug: + default: false + type: string deck: type: string host: @@ -7695,42 +6873,6 @@ liquid_handler.prcxi: liquid_handler.revvity: class: action_value_mappings: - auto-run: - feedback: {} - goal: {} - goal_default: - file_path: null - params: null - resource: - AichemecoHiwo: - id: AichemecoHiwo - handles: [] - result: {} - schema: - description: run的参数schema - properties: - feedback: {} - goal: - properties: - file_path: - type: string - params: - type: string - resource: - default: - AichemecoHiwo: - id: AichemecoHiwo - type: object - required: - - file_path - - params - type: object - result: {} - required: - - goal - title: run参数 - type: object - type: UniLabJsonCommand run: feedback: status: status @@ -7768,7 +6910,6 @@ liquid_handler.revvity: description: ROS Action WorkStationRun 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: gantt: type: string @@ -7780,7 +6921,6 @@ liquid_handler.revvity: title: WorkStationRun_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: params: type: string @@ -7866,7 +7006,6 @@ liquid_handler.revvity: title: WorkStationRun_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index 4341434..be57ffa 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -1,82 +1,6 @@ mock_chiller: class: action_value_mappings: - auto-emergency_stop: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: emergency_stop的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: emergency_stop参数 - type: object - type: UniLabJsonCommand - auto-heat_chill_start: - feedback: {} - goal: {} - goal_default: - purpose: null - temp: null - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_start的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - type: string - temp: - type: number - vessel: - type: string - required: - - vessel - - temp - - purpose - type: object - result: {} - required: - - goal - title: heat_chill_start参数 - type: object - type: UniLabJsonCommand - auto-heat_chill_stop: - feedback: {} - goal: {} - goal_default: - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_stop的参数schema - properties: - feedback: {} - goal: - properties: - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: heat_chill_stop参数 - type: object - type: UniLabJsonCommand emergency_stop: feedback: {} goal: {} @@ -88,19 +12,16 @@ mock_chiller: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -131,7 +52,6 @@ mock_chiller: description: ROS Action HeatChillStart 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -140,7 +60,6 @@ mock_chiller: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -155,7 +74,6 @@ mock_chiller: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -185,7 +103,6 @@ mock_chiller: description: ROS Action HeatChillStop 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -194,7 +111,6 @@ mock_chiller: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -203,7 +119,6 @@ mock_chiller: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -292,94 +207,6 @@ mock_filter: title: emergency_stop参数 type: object type: UniLabJsonCommand - auto-filter: - feedback: {} - goal: {} - goal_default: - continue_heatchill: false - filtrate_vessel: null - stir: false - stir_speed: 0.0 - temp: 25.0 - vessel: null - volume: 0.0 - handles: [] - result: {} - schema: - description: filter的参数schema - properties: - feedback: {} - goal: - properties: - continue_heatchill: - default: false - type: boolean - filtrate_vessel: - type: string - stir: - default: false - type: boolean - stir_speed: - default: 0.0 - type: number - temp: - default: 25.0 - type: number - vessel: - type: string - volume: - default: 0.0 - type: number - required: - - vessel - - filtrate_vessel - type: object - result: {} - required: - - goal - title: filter参数 - type: object - type: UniLabJsonCommand - auto-replace_filter: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: replace_filter的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: replace_filter参数 - type: object - type: UniLabJsonCommand - auto-stop_filtering: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: stop_filtering的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: stop_filtering参数 - type: object - type: UniLabJsonCommand filter: feedback: current_status: current_status @@ -410,7 +237,6 @@ mock_filter: description: ROS Action Filter 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -428,7 +254,6 @@ mock_filter: title: Filter_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: continue_heatchill: type: boolean @@ -455,7 +280,6 @@ mock_filter: title: Filter_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -485,19 +309,16 @@ mock_filter: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -521,19 +342,16 @@ mock_filter: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -627,126 +445,6 @@ mock_filter: mock_heater: class: action_value_mappings: - auto-emergency_stop: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: emergency_stop的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: emergency_stop参数 - type: object - type: UniLabJsonCommand - auto-heat_chill: - feedback: {} - goal: {} - goal_default: - purpose: Unknown - stir: false - stir_speed: 0.0 - temp: null - time: null - vessel: null - handles: [] - result: {} - schema: - description: heat_chill的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - default: Unknown - type: string - stir: - default: false - type: boolean - stir_speed: - default: 0.0 - type: number - temp: - type: number - time: - type: number - vessel: - type: string - required: - - vessel - - temp - - time - type: object - result: {} - required: - - goal - title: heat_chill参数 - type: object - type: UniLabJsonCommand - auto-heat_chill_start: - feedback: {} - goal: {} - goal_default: - purpose: null - temp: null - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_start的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - type: string - temp: - type: number - vessel: - type: string - required: - - vessel - - temp - - purpose - type: object - result: {} - required: - - goal - title: heat_chill_start参数 - type: object - type: UniLabJsonCommand - auto-heat_chill_stop: - feedback: {} - goal: {} - goal_default: - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_stop的参数schema - properties: - feedback: {} - goal: - properties: - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: heat_chill_stop参数 - type: object - type: UniLabJsonCommand auto-set_heating_power: feedback: {} goal: {} @@ -806,19 +504,16 @@ mock_heater: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -855,7 +550,6 @@ mock_heater: description: ROS Action HeatChill 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -864,7 +558,6 @@ mock_heater: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -888,7 +581,6 @@ mock_heater: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -922,7 +614,6 @@ mock_heater: description: ROS Action HeatChillStart 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -931,7 +622,6 @@ mock_heater: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -946,7 +636,6 @@ mock_heater: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -976,7 +665,6 @@ mock_heater: description: ROS Action HeatChillStop 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -985,7 +673,6 @@ mock_heater: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -994,7 +681,6 @@ mock_heater: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1095,126 +781,6 @@ mock_pump: title: emergency_stop参数 type: object type: UniLabJsonCommand - auto-pause_pump: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: pause_pump的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: pause_pump参数 - type: object - type: UniLabJsonCommand - auto-pump_transfer: - feedback: {} - goal: {} - goal_default: - amount: '' - from_vessel: null - rinsing_repeats: 0 - rinsing_solvent: '' - rinsing_volume: 0.0 - solid: false - time: 0.0 - to_vessel: null - viscous: false - volume: null - handles: [] - result: {} - schema: - description: pump_transfer的参数schema - properties: - feedback: {} - goal: - properties: - amount: - default: '' - type: string - from_vessel: - type: string - rinsing_repeats: - default: 0 - type: integer - rinsing_solvent: - default: '' - type: string - rinsing_volume: - default: 0.0 - type: number - solid: - default: false - type: boolean - time: - default: 0.0 - type: number - to_vessel: - type: string - viscous: - default: false - type: boolean - volume: - type: number - required: - - from_vessel - - to_vessel - - volume - type: object - result: {} - required: - - goal - title: pump_transfer参数 - type: object - type: UniLabJsonCommand - auto-reset_volume_counter: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: reset_volume_counter的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: reset_volume_counter参数 - type: object - type: UniLabJsonCommand - auto-resume_pump: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: resume_pump的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: resume_pump参数 - type: object - type: UniLabJsonCommand pause_pump: feedback: {} goal: {} @@ -1226,19 +792,16 @@ mock_pump: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1286,7 +849,6 @@ mock_pump: description: ROS Action PumpTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1330,7 +892,6 @@ mock_pump: title: PumpTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -1368,7 +929,6 @@ mock_pump: title: PumpTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1395,19 +955,16 @@ mock_pump: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1431,19 +988,16 @@ mock_pump: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1585,166 +1139,6 @@ mock_rotavap: title: emergency_stop参数 type: object type: UniLabJsonCommand - auto-set_pump_time: - feedback: {} - goal: {} - goal_default: - time_seconds: null - handles: [] - result: {} - schema: - description: set_pump_time的参数schema - properties: - feedback: {} - goal: - properties: - time_seconds: - type: number - required: - - time_seconds - type: object - result: {} - required: - - goal - title: set_pump_time参数 - type: object - type: UniLabJsonCommand - auto-set_rotate_speed: - feedback: {} - goal: {} - goal_default: - speed: null - handles: [] - result: {} - schema: - description: set_rotate_speed的参数schema - properties: - feedback: {} - goal: - properties: - speed: - type: number - required: - - speed - type: object - result: {} - required: - - goal - title: set_rotate_speed参数 - type: object - type: UniLabJsonCommand - auto-set_rotate_time: - feedback: {} - goal: {} - goal_default: - time_seconds: null - handles: [] - result: {} - schema: - description: set_rotate_time的参数schema - properties: - feedback: {} - goal: - properties: - time_seconds: - type: number - required: - - time_seconds - type: object - result: {} - required: - - goal - title: set_rotate_time参数 - type: object - type: UniLabJsonCommand - auto-set_temperature: - feedback: {} - goal: {} - goal_default: - temperature: null - handles: [] - result: {} - schema: - description: set_temperature的参数schema - properties: - feedback: {} - goal: - properties: - temperature: - type: number - required: - - temperature - type: object - result: {} - required: - - goal - title: set_temperature参数 - type: object - type: UniLabJsonCommand - auto-set_timer: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_timer的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_timer参数 - type: object - type: UniLabJsonCommand - auto-start_pump: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: start_pump的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: start_pump参数 - type: object - type: UniLabJsonCommand - auto-start_rotation: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: start_rotation的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: start_rotation参数 - type: object - type: UniLabJsonCommand auto-stop_all_operations: feedback: {} goal: {} @@ -1778,13 +1172,11 @@ mock_rotavap: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1793,7 +1185,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1822,13 +1213,11 @@ mock_rotavap: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1837,7 +1226,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1866,13 +1254,11 @@ mock_rotavap: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1881,7 +1267,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1910,13 +1295,11 @@ mock_rotavap: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1925,7 +1308,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1954,13 +1336,11 @@ mock_rotavap: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -1969,7 +1349,6 @@ mock_rotavap: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1996,19 +1375,16 @@ mock_rotavap: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2032,19 +1408,16 @@ mock_rotavap: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2118,146 +1491,6 @@ mock_rotavap: mock_separator: class: action_value_mappings: - auto-separate: - feedback: {} - goal: {} - goal_default: - from_vessel: null - product_phase: null - purpose: null - repeats: 1 - separation_vessel: null - settling_time: 60.0 - solvent: '' - solvent_volume: 0.0 - stir_speed: 0.0 - stir_time: 0.0 - through: '' - to_vessel: null - waste_phase_to_vessel: '' - handles: [] - result: {} - schema: - description: separate的参数schema - properties: - feedback: {} - goal: - properties: - from_vessel: - type: string - product_phase: - type: string - purpose: - type: string - repeats: - default: 1 - type: integer - separation_vessel: - type: string - settling_time: - default: 60.0 - type: number - solvent: - default: '' - type: string - solvent_volume: - default: 0.0 - type: number - stir_speed: - default: 0.0 - type: number - stir_time: - default: 0.0 - type: number - through: - default: '' - type: string - to_vessel: - type: string - waste_phase_to_vessel: - default: '' - type: string - required: - - purpose - - product_phase - - from_vessel - - separation_vessel - - to_vessel - type: object - result: {} - required: - - goal - title: separate参数 - type: object - type: UniLabJsonCommand - auto-set_valve: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_valve的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_valve参数 - type: object - type: UniLabJsonCommand - auto-shake: - feedback: {} - goal: {} - goal_default: - shake_time: null - handles: [] - result: {} - schema: - description: shake的参数schema - properties: - feedback: {} - goal: - properties: - shake_time: - type: number - required: - - shake_time - type: object - result: {} - required: - - goal - title: shake参数 - type: object - type: UniLabJsonCommand - auto-stop_operations: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: stop_operations的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: stop_operations参数 - type: object - type: UniLabJsonCommand separate: feedback: current_device: current_device @@ -2299,7 +1532,6 @@ mock_separator: description: ROS Action Separate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2343,7 +1575,6 @@ mock_separator: title: Separate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_vessel: type: string @@ -2390,7 +1621,6 @@ mock_separator: title: Separate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2419,13 +1649,11 @@ mock_separator: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -2434,7 +1662,6 @@ mock_separator: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2464,13 +1691,11 @@ mock_separator: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -2479,7 +1704,6 @@ mock_separator: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2506,19 +1730,16 @@ mock_separator: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2636,26 +1857,6 @@ mock_separator: mock_solenoid_valve: class: action_value_mappings: - auto-close_valve: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close_valve的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close_valve参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -2696,50 +1897,6 @@ mock_solenoid_valve: title: is_open参数 type: object type: UniLabJsonCommand - auto-open_valve: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open_valve的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open_valve参数 - type: object - type: UniLabJsonCommand - auto-set_valve_status: - feedback: {} - goal: {} - goal_default: - status: null - handles: [] - result: {} - schema: - description: set_valve_status的参数schema - properties: - feedback: {} - goal: - properties: - status: - type: string - required: - - status - type: object - result: {} - required: - - goal - title: set_valve_status参数 - type: object - type: UniLabJsonCommand close_valve: feedback: {} goal: {} @@ -2751,19 +1908,16 @@ mock_solenoid_valve: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2787,19 +1941,16 @@ mock_solenoid_valve: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2825,13 +1976,11 @@ mock_solenoid_valve: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -2840,7 +1989,6 @@ mock_solenoid_valve: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2905,98 +2053,6 @@ mock_stirrer: title: emergency_stop参数 type: object type: UniLabJsonCommand - auto-heating_control: - feedback: {} - goal: {} - goal_default: - heating_state: 'On' - handles: [] - result: {} - schema: - description: heating_control的参数schema - properties: - feedback: {} - goal: - properties: - heating_state: - default: 'On' - type: string - required: [] - type: object - result: {} - required: - - goal - title: heating_control参数 - type: object - type: UniLabJsonCommand - auto-set_stir_speed: - feedback: {} - goal: {} - goal_default: - speed: null - handles: [] - result: {} - schema: - description: set_stir_speed的参数schema - properties: - feedback: {} - goal: - properties: - speed: - type: number - required: - - speed - type: object - result: {} - required: - - goal - title: set_stir_speed参数 - type: object - type: UniLabJsonCommand - auto-set_temperature: - feedback: {} - goal: {} - goal_default: - temperature: null - handles: [] - result: {} - schema: - description: set_temperature的参数schema - properties: - feedback: {} - goal: - properties: - temperature: - type: number - required: - - temperature - type: object - result: {} - required: - - goal - title: set_temperature参数 - type: object - type: UniLabJsonCommand - auto-start_stirring: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: start_stirring的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: start_stirring参数 - type: object - type: UniLabJsonCommand auto-stop_all_operations: feedback: {} goal: {} @@ -3017,26 +2073,6 @@ mock_stirrer: title: stop_all_operations参数 type: object type: UniLabJsonCommand - auto-stop_stirring: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: stop_stirring的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: stop_stirring参数 - type: object - type: UniLabJsonCommand heating_control: feedback: {} goal: @@ -3050,13 +2086,11 @@ mock_stirrer: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -3065,7 +2099,6 @@ mock_stirrer: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3094,13 +2127,11 @@ mock_stirrer: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -3109,7 +2140,6 @@ mock_stirrer: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3138,13 +2168,11 @@ mock_stirrer: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -3153,7 +2181,6 @@ mock_stirrer: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3180,19 +2207,16 @@ mock_stirrer: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3216,19 +2240,16 @@ mock_stirrer: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3306,94 +2327,6 @@ mock_stirrer: mock_stirrer_new: class: action_value_mappings: - auto-start_stir: - feedback: {} - goal: {} - goal_default: - purpose: '' - stir_speed: 0.0 - vessel: null - handles: [] - result: {} - schema: - description: start_stir的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - default: '' - type: string - stir_speed: - default: 0.0 - type: number - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: start_stir参数 - type: object - type: UniLabJsonCommand - auto-stir: - feedback: {} - goal: {} - goal_default: - settling_time: null - stir_speed: null - stir_time: null - handles: [] - result: {} - schema: - description: stir的参数schema - properties: - feedback: {} - goal: - properties: - settling_time: - type: number - stir_speed: - type: number - stir_time: - type: number - required: - - stir_time - - stir_speed - - settling_time - type: object - result: {} - required: - - goal - title: stir参数 - type: object - type: UniLabJsonCommand - auto-stop_stir: - feedback: {} - goal: {} - goal_default: - vessel: null - handles: [] - result: {} - schema: - description: stop_stir的参数schema - properties: - feedback: {} - goal: - properties: - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: stop_stir参数 - type: object - type: UniLabJsonCommand start_stir: feedback: current_speed: stir_speed @@ -3415,7 +2348,6 @@ mock_stirrer_new: description: ROS Action StartStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -3430,7 +2362,6 @@ mock_stirrer_new: title: StartStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -3445,7 +2376,6 @@ mock_stirrer_new: title: StartStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3482,7 +2412,6 @@ mock_stirrer_new: description: ROS Action Stir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3491,7 +2420,6 @@ mock_stirrer_new: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: settling_time: type: number @@ -3506,7 +2434,6 @@ mock_stirrer_new: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3538,7 +2465,6 @@ mock_stirrer_new: description: ROS Action StopStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -3550,7 +2476,6 @@ mock_stirrer_new: title: StopStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -3559,7 +2484,6 @@ mock_stirrer_new: title: StopStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3663,154 +2587,6 @@ mock_vacuum: title: emergency_stop参数 type: object type: UniLabJsonCommand - auto-pause_vacuum: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: pause_vacuum的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: pause_vacuum参数 - type: object - type: UniLabJsonCommand - auto-power_control: - feedback: {} - goal: {} - goal_default: - power_state: 'On' - handles: [] - result: {} - schema: - description: power_control的参数schema - properties: - feedback: {} - goal: - properties: - power_state: - default: 'On' - type: string - required: [] - type: object - result: {} - required: - - goal - title: power_control参数 - type: object - type: UniLabJsonCommand - auto-resume_vacuum: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: resume_vacuum的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: resume_vacuum参数 - type: object - type: UniLabJsonCommand - auto-set_vacuum_level: - feedback: {} - goal: {} - goal_default: - vacuum_level: null - handles: [] - result: {} - schema: - description: set_vacuum_level的参数schema - properties: - feedback: {} - goal: - properties: - vacuum_level: - type: number - required: - - vacuum_level - type: object - result: {} - required: - - goal - title: set_vacuum_level参数 - type: object - type: UniLabJsonCommand - auto-start_vacuum: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: start_vacuum的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: start_vacuum参数 - type: object - type: UniLabJsonCommand - auto-stop_vacuum: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: stop_vacuum的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: stop_vacuum参数 - type: object - type: UniLabJsonCommand - auto-vent_to_atmosphere: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: vent_to_atmosphere的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: vent_to_atmosphere参数 - type: object - type: UniLabJsonCommand pause_vacuum: feedback: {} goal: {} @@ -3822,19 +2598,16 @@ mock_vacuum: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3860,13 +2633,11 @@ mock_vacuum: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -3875,7 +2646,6 @@ mock_vacuum: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3902,19 +2672,16 @@ mock_vacuum: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3940,13 +2707,11 @@ mock_vacuum: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -3955,7 +2720,6 @@ mock_vacuum: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3982,19 +2746,16 @@ mock_vacuum: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4018,19 +2779,16 @@ mock_vacuum: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4054,19 +2812,16 @@ mock_vacuum: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string diff --git a/unilabos/registry/devices/moveit_config.yaml b/unilabos/registry/devices/moveit_config.yaml index e556bc8..2166887 100644 --- a/unilabos/registry/devices/moveit_config.yaml +++ b/unilabos/registry/devices/moveit_config.yaml @@ -117,30 +117,6 @@ moveit.arm_slider: title: moveit_task参数 type: object type: UniLabJsonCommand - auto-pick_and_place: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: pick_and_place的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: pick_and_place参数 - type: object - type: UniLabJsonCommand auto-post_init: feedback: {} goal: {} @@ -193,54 +169,6 @@ moveit.arm_slider: title: resource_manager参数 type: object type: UniLabJsonCommand - auto-set_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_position参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand auto-wait_for_resource_action: feedback: {} goal: {} @@ -273,7 +201,6 @@ moveit.arm_slider: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -282,7 +209,6 @@ moveit.arm_slider: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -291,7 +217,6 @@ moveit.arm_slider: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -319,7 +244,6 @@ moveit.arm_slider: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -328,7 +252,6 @@ moveit.arm_slider: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -337,7 +260,6 @@ moveit.arm_slider: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -365,7 +287,6 @@ moveit.arm_slider: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -374,7 +295,6 @@ moveit.arm_slider: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -383,7 +303,6 @@ moveit.arm_slider: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -402,7 +321,7 @@ moveit.arm_slider: module: unilabos.devices.ros_dev.moveit_interface:MoveitInterface status_types: {} type: python - description: Arm with Slider + description: 机械臂与滑块运动系统,基于MoveIt2运动规划框架的多自由度机械臂控制设备。该系统集成机械臂和线性滑块,通过ROS2和MoveIt2实现精确的轨迹规划和协调运动控制。支持笛卡尔空间和关节空间的运动规划、碰撞检测、逆运动学求解等功能。适用于复杂的pick-and-place操作、精密装配、多工位协作等需要高精度多轴协调运动的实验室自动化应用。 handles: [] icon: '' init_param_schema: @@ -546,30 +465,6 @@ moveit.toyo_xyz: title: moveit_task参数 type: object type: UniLabJsonCommand - auto-pick_and_place: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: pick_and_place的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: pick_and_place参数 - type: object - type: UniLabJsonCommand auto-post_init: feedback: {} goal: {} @@ -622,54 +517,6 @@ moveit.toyo_xyz: title: resource_manager参数 type: object type: UniLabJsonCommand - auto-set_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_position参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand auto-wait_for_resource_action: feedback: {} goal: {} @@ -702,7 +549,6 @@ moveit.toyo_xyz: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -711,7 +557,6 @@ moveit.toyo_xyz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -720,7 +565,6 @@ moveit.toyo_xyz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -748,7 +592,6 @@ moveit.toyo_xyz: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -757,7 +600,6 @@ moveit.toyo_xyz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -766,7 +608,6 @@ moveit.toyo_xyz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -794,7 +635,6 @@ moveit.toyo_xyz: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -803,7 +643,6 @@ moveit.toyo_xyz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -812,7 +651,6 @@ moveit.toyo_xyz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -831,7 +669,7 @@ moveit.toyo_xyz: module: unilabos.devices.ros_dev.moveit_interface:MoveitInterface status_types: {} type: python - description: Toyo XYZ + description: 东洋XYZ三轴运动平台,基于MoveIt2运动规划框架的精密定位设备。该设备通过ROS2和MoveIt2实现三维空间的精确运动控制,支持复杂轨迹规划、多点定位、速度控制等功能。具备高精度定位、平稳运动、实时轨迹监控等特性。适用于精密加工、样品定位、检测扫描、自动化装配等需要高精度三维运动控制的实验室和工业应用场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index 00e7550..041bfb0 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -93,30 +93,6 @@ rotavap.one: title: set_rotate_time参数 type: object type: UniLabJsonCommand - auto-set_timer: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_timer的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_timer参数 - type: object - type: UniLabJsonCommand set_timer: feedback: {} goal: @@ -130,7 +106,6 @@ rotavap.one: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -139,7 +114,6 @@ rotavap.one: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -148,7 +122,6 @@ rotavap.one: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -167,7 +140,7 @@ rotavap.one: module: unilabos.devices.rotavap.rotavap_one:RotavapOne status_types: {} type: python - description: Rotavap device + description: 旋转蒸发仪设备,用于有机化学实验中的溶剂回收和浓缩操作。该设备通过串口通信控制,集成旋转和真空泵功能,支持定时控制和自动化操作。具备旋转速度调节、真空度控制、温度管理等功能,实现高效的溶剂蒸发和回收。适用于有机合成、天然产物提取、药物制备等需要溶剂去除和浓缩的实验室应用场景。 handles: [] icon: '' init_param_schema: @@ -208,38 +181,6 @@ separator.homemade: title: read_sensor_loop参数 type: object type: UniLabJsonCommand - auto-stir: - feedback: {} - goal: {} - goal_default: - settling_time: 10 - stir_speed: 300 - stir_time: 10 - handles: [] - result: {} - schema: - description: stir的参数schema - properties: - feedback: {} - goal: - properties: - settling_time: - default: 10 - type: number - stir_speed: - default: 300 - type: number - stir_time: - default: 10 - type: number - required: [] - type: object - result: {} - required: - - goal - title: stir参数 - type: object - type: UniLabJsonCommand auto-valve_open: feedback: {} goal: {} @@ -268,30 +209,6 @@ separator.homemade: title: valve_open参数 type: object type: UniLabJsonCommand - auto-valve_open_cmd: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: valve_open_cmd的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: valve_open_cmd参数 - type: object - type: UniLabJsonCommand auto-write: feedback: {} goal: {} @@ -334,7 +251,6 @@ separator.homemade: description: ROS Action Stir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -343,7 +259,6 @@ separator.homemade: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: settling_time: type: number @@ -358,7 +273,6 @@ separator.homemade: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -382,13 +296,12 @@ separator.homemade: goal_default: command: '' handles: [] - result": + result: success: success schema: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -397,7 +310,6 @@ separator.homemade: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -406,7 +318,6 @@ separator.homemade: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -425,7 +336,7 @@ separator.homemade: module: unilabos.devices.separator.homemade_grbl_conductivity:SeparatorController status_types: {} type: python - description: Separator device with homemade grbl controller + description: 液-液分离器设备,基于自制Grbl控制器的自动化分离系统。该设备集成搅拌、沉降、阀门控制和电导率传感器,通过串口通信实现精确的分离操作控制。支持自动搅拌、分层沉降、基于传感器反馈的智能分液等功能。适用于有机化学中的萃取分离、相分离、液-液提取等需要精确分离控制的实验应用。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index dc50dde..72e3e16 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -125,30 +125,6 @@ solenoid_valve: title: send_command参数 type: object type: UniLabJsonCommand - auto-set_valve_position: - feedback: {} - goal: {} - goal_default: - position: null - handles: [] - result: {} - schema: - description: set_valve_position的参数schema - properties: - feedback: {} - goal: - properties: - position: - type: string - required: - - position - type: object - result: {} - required: - - goal - title: set_valve_position参数 - type: object - type: UniLabJsonCommand set_valve_position: feedback: {} goal: @@ -161,13 +137,11 @@ solenoid_valve: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -176,7 +150,6 @@ solenoid_valve: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -197,7 +170,7 @@ solenoid_valve: status: str valve_position: str type: python - description: Solenoid valve + description: 电磁阀控制设备,用于精确的流体路径控制和开关操作。该设备通过串口通信控制电磁阀的开关状态,支持远程操作和状态监测。具备快速响应、可靠密封、状态反馈等特性,广泛应用于流体输送、样品进样、路径切换等需要精确流体控制的实验室自动化应用。 handles: [] icon: '' init_param_schema: @@ -221,26 +194,6 @@ solenoid_valve: solenoid_valve.mock: class: action_value_mappings: - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -281,26 +234,6 @@ solenoid_valve.mock: title: is_open参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommand auto-set_valve_position: feedback: {} goal: {} @@ -335,19 +268,16 @@ solenoid_valve.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -370,19 +300,16 @@ solenoid_valve.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -400,7 +327,7 @@ solenoid_valve.mock: status: str valve_position: str type: python - description: Mock solenoid valve + description: 模拟电磁阀设备,用于系统测试和开发调试。该设备模拟真实电磁阀的开关操作和状态变化,提供与实际设备相同的控制接口和反馈机制。支持流体路径的虚拟控制,便于在没有实际硬件的情况下进行流体系统的集成测试和算法验证。适用于系统开发、流程调试和培训演示等场景。 handles: - data_type: fluid handler_key: in @@ -825,7 +752,7 @@ syringe_pump_with_valve.runze: velocity_grade: String velocity_init: String type: python - description: Runze Syringe pump with valve + description: 润泽精密注射泵设备,集成阀门控制的高精度流体输送系统。该设备通过串口通信控制,支持多种运行模式和精确的体积控制。具备可变速度控制、精密定位、阀门切换、实时状态监控等功能。适用于微量液体输送、精密进样、流速控制、化学反应进料等需要高精度流体操作的实验室自动化应用。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/robot_agv.yaml b/unilabos/registry/devices/robot_agv.yaml index 51b59c2..7f04d9c 100644 --- a/unilabos/registry/devices/robot_agv.yaml +++ b/unilabos/registry/devices/robot_agv.yaml @@ -11,7 +11,7 @@ agv.SEER: handles: [] result: {} schema: - description: send的参数schema + description: AGV底层通信命令发送函数。通过TCP socket连接向AGV发送底层控制命令,支持pose(位置)、status(状态)、nav(导航)等命令类型。用于获取AGV当前位置坐标、运行状态或发送导航指令。该函数封装了AGV的通信协议,将命令转换为十六进制数据包并处理响应解析。 properties: feedback: {} goal: @@ -33,30 +33,6 @@ agv.SEER: title: send参数 type: object type: UniLabJsonCommand - auto-send_nav_task: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: send_nav_task的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: send_nav_task参数 - type: object - type: UniLabJsonCommand send_nav_task: feedback: {} goal: @@ -70,7 +46,6 @@ agv.SEER: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -79,7 +54,6 @@ agv.SEER: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -88,7 +62,6 @@ agv.SEER: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -109,7 +82,7 @@ agv.SEER: pose: list status: str type: python - description: SEER AGV + description: SEER AGV自动导引车设备,用于实验室内物料和设备的自主移动运输。该AGV通过TCP socket与导航系统通信,具备精确的定位和路径规划能力。支持实时位置监控、状态查询和导航任务执行,可在预设的实验室环境中自主移动至指定位置。适用于样品运输、设备转移、多工位协作等实验室自动化物流场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/robot_arm.yaml b/unilabos/registry/devices/robot_arm.yaml index 72f0155..de5b677 100644 --- a/unilabos/registry/devices/robot_arm.yaml +++ b/unilabos/registry/devices/robot_arm.yaml @@ -8,7 +8,7 @@ robotic_arm.UR: handles: [] result: {} schema: - description: arm_init的参数schema + description: 机械臂初始化函数。执行UR机械臂的完整初始化流程,包括上电、释放制动器、解除保护停止状态等。该函数确保机械臂从安全停止状态恢复到可操作状态,是机械臂使用前的必要步骤。初始化完成后机械臂将处于就绪状态,可以接收后续的运动指令。 properties: feedback: {} goal: @@ -29,7 +29,7 @@ robotic_arm.UR: handles: [] result: {} schema: - description: load_pose_data的参数schema + description: 从JSON字符串加载位置数据函数。接收包含机械臂位置信息的JSON格式字符串,解析并存储位置数据供后续运动任务使用。位置数据通常包含多个预定义的工作位置坐标,用于实现精确的多点运动控制。适用于动态配置机械臂工作位置的场景。 properties: feedback: {} goal: @@ -53,7 +53,7 @@ robotic_arm.UR: handles: [] result: {} schema: - description: load_pose_file的参数schema + description: 从文件加载位置数据函数。读取指定的JSON文件并加载其中的机械臂位置信息。该函数支持从外部配置文件中获取预设的工作位置,便于位置数据的管理和重用。适用于需要从固定配置文件中读取复杂位置序列的应用场景。 properties: feedback: {} goal: @@ -69,30 +69,6 @@ robotic_arm.UR: title: load_pose_file参数 type: object type: UniLabJsonCommand - auto-move_pos_task: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: move_pos_task的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: move_pos_task参数 - type: object - type: UniLabJsonCommand auto-reload_pose: feedback: {} goal: {} @@ -100,7 +76,7 @@ robotic_arm.UR: handles: [] result: {} schema: - description: reload_pose的参数schema + description: 重新加载位置数据函数。重新读取并解析之前设置的位置文件,更新内存中的位置数据。该函数用于在位置文件被修改后刷新机械臂的位置配置,无需重新初始化整个系统。适用于动态更新机械臂工作位置的场景。 properties: feedback: {} goal: @@ -126,7 +102,6 @@ robotic_arm.UR: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -135,7 +110,6 @@ robotic_arm.UR: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -144,7 +118,6 @@ robotic_arm.UR: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -167,7 +140,7 @@ robotic_arm.UR: gripper_pose: float gripper_status: str type: python - description: UR robotic arm + description: Universal Robots机械臂设备,用于实验室精密操作和自动化作业。该设备集成了UR机械臂本体、Robotiq夹爪和RTDE通信接口,支持六自由度精确运动控制和力觉反馈。具备实时位置监控、状态反馈、轨迹规划等功能,可执行复杂的多点位运动任务。适用于样品抓取、精密装配、实验器具操作等需要高精度和高重复性的实验室自动化场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/robot_gripper.yaml b/unilabos/registry/devices/robot_gripper.yaml index 8a3be30..03592b6 100644 --- a/unilabos/registry/devices/robot_gripper.yaml +++ b/unilabos/registry/devices/robot_gripper.yaml @@ -51,7 +51,7 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: gripper_move的参数schema + description: 夹爪抓取运动控制函数。控制夹爪的开合运动,支持位置、速度、力矩的精确设定。位置参数控制夹爪开合程度,速度参数控制运动快慢,力矩参数控制夹持强度。该函数提供安全的力控制,避免损坏被抓取物体,适用于各种形状和材质的物品抓取。 properties: feedback: {} goal: @@ -80,7 +80,7 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: init_gripper的参数schema + description: 夹爪初始化函数。执行Misumi RZ夹爪的完整初始化流程,包括Modbus通信建立、电机参数配置、传感器校准等。该函数确保夹爪系统从安全状态恢复到可操作状态,是夹爪使用前的必要步骤。初始化完成后夹爪将处于就绪状态,可接收抓取和旋转指令。 properties: feedback: {} goal: @@ -169,7 +169,7 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: node_gripper_move的参数schema + description: 节点夹爪移动任务函数。接收逗号分隔的命令字符串,解析位置、速度、力矩参数并执行夹爪抓取动作。该函数等待运动完成并返回执行结果,提供同步的运动控制接口。适用于需要可靠完成确认的精密抓取操作。 properties: feedback: {} goal: @@ -193,7 +193,7 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: node_rotate_move的参数schema + description: 节点旋转移动任务函数。接收逗号分隔的命令字符串,解析角度、速度、力矩参数并执行夹爪旋转动作。该函数等待旋转完成并返回执行结果,提供同步的旋转控制接口。适用于需要精确角度定位和完成确认的旋转操作。 properties: feedback: {} goal: @@ -251,7 +251,7 @@ gripper.misumi_rz: handles: [] result: {} schema: - description: rotate_move_abs的参数schema + description: 夹爪绝对位置旋转控制函数。控制夹爪主轴旋转到指定的绝对角度位置,支持360度连续旋转。位置参数指定目标角度,速度参数控制旋转速率,力矩参数设定旋转阻力限制。该函数提供高精度的角度定位,适用于需要精确方向控制的操作场景。 properties: feedback: {} goal: @@ -382,7 +382,6 @@ gripper.misumi_rz: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -391,7 +390,6 @@ gripper.misumi_rz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -400,7 +398,6 @@ gripper.misumi_rz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -420,7 +417,7 @@ gripper.misumi_rz: status_types: status: str type: python - description: Misumi RZ gripper + description: Misumi RZ系列电子夹爪设备,集成旋转和抓取双重功能的精密夹爪系统。该设备通过Modbus RTU协议与控制系统通信,支持位置、速度、力矩的精确控制。具备高精度的位置反馈、实时状态监控和故障检测功能。适用于需要精密抓取和旋转操作的实验室自动化场景,如样品管理、精密装配、器件操作等应用。 handles: [] icon: '' init_param_schema: @@ -461,7 +458,7 @@ gripper.mock: handles: [] result: {} schema: - description: edit_id的参数schema + description: 模拟夹爪资源ID编辑函数。用于测试和演示资源管理功能,模拟修改夹爪资源的标识信息。该函数接收工作流名称、参数和资源对象,模拟真实的资源更新过程并返回修改后的资源信息。适用于系统测试和开发调试场景。 properties: feedback: {} goal: @@ -484,38 +481,6 @@ gripper.mock: title: edit_id参数 type: object type: UniLabJsonCommand - auto-push_to: - feedback: {} - goal: {} - goal_default: - position: null - torque: null - velocity: 0.0 - handles: [] - result: {} - schema: - description: push_to的参数schema - properties: - feedback: {} - goal: - properties: - position: - type: number - torque: - type: number - velocity: - default: 0.0 - type: number - required: - - position - - torque - type: object - result: {} - required: - - goal - title: push_to参数 - type: object - type: UniLabJsonCommand push_to: feedback: effort: torque @@ -535,7 +500,6 @@ gripper.mock: description: ROS Action GripperCommand 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: effort: type: number @@ -553,7 +517,6 @@ gripper.mock: title: GripperCommand_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: properties: @@ -571,7 +534,6 @@ gripper.mock: title: GripperCommand_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: effort: type: number @@ -600,7 +562,7 @@ gripper.mock: torque: float velocity: float type: python - description: Mock gripper + description: 模拟夹爪设备,用于系统测试和开发调试。该设备模拟真实夹爪的位置、速度、力矩等物理特性,支持虚拟的抓取和移动操作。提供与真实夹爪相同的接口和状态反馈,便于在没有实际硬件的情况下进行系统集成测试和算法验证。适用于软件开发、系统调试和培训演示等场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/robot_linear_motion.yaml b/unilabos/registry/devices/robot_linear_motion.yaml index fa98ca9..52f673e 100644 --- a/unilabos/registry/devices/robot_linear_motion.yaml +++ b/unilabos/registry/devices/robot_linear_motion.yaml @@ -8,7 +8,7 @@ linear_motion.grbl: handles: [] result: {} schema: - description: initialize的参数schema + description: CNC设备初始化函数。执行Grbl CNC的完整初始化流程,包括归零操作、轴校准和状态复位。该函数将所有轴移动到原点位置(0,0,0),确保设备处于已知的参考状态。初始化完成后设备进入空闲状态,可接收后续的运动指令。 properties: feedback: {} goal: @@ -21,30 +21,6 @@ linear_motion.grbl: title: initialize参数 type: object type: UniLabJsonCommand - auto-move_through_points: - feedback: {} - goal: {} - goal_default: - positions: null - handles: [] - result: {} - schema: - description: move_through_points的参数schema - properties: - feedback: {} - goal: - properties: - positions: - type: array - required: - - positions - type: object - result: {} - required: - - goal - title: move_through_points参数 - type: object - type: UniLabJsonCommand auto-set_position: feedback: {} goal: {} @@ -53,7 +29,7 @@ linear_motion.grbl: handles: [] result: {} schema: - description: set_position的参数schema + description: CNC绝对位置设定函数。控制CNC设备移动到指定的三维坐标位置(x,y,z)。该函数支持安全限位检查,防止超出设备工作范围。移动过程中会监控设备状态,确保安全到达目标位置。适用于精确定位和轨迹控制操作。 properties: feedback: {} goal: @@ -69,34 +45,6 @@ linear_motion.grbl: title: set_position参数 type: object type: UniLabJsonCommand - auto-set_spindle_speed: - feedback: {} - goal: {} - goal_default: - max_velocity: 500 - spindle_speed: null - handles: [] - result: {} - schema: - description: set_spindle_speed的参数schema - properties: - feedback: {} - goal: - properties: - max_velocity: - default: 500 - type: number - spindle_speed: - type: number - required: - - spindle_speed - type: object - result: {} - required: - - goal - title: set_spindle_speed参数 - type: object - type: UniLabJsonCommand auto-stop_operation: feedback: {} goal: {} @@ -104,7 +52,7 @@ linear_motion.grbl: handles: [] result: {} schema: - description: stop_operation的参数schema + description: CNC操作停止函数。立即停止当前正在执行的所有CNC运动,包括轴移动和主轴旋转。该函数用于紧急停止或任务中断,确保设备和工件的安全。停止后设备将保持当前位置,等待新的指令。 properties: feedback: {} goal: @@ -169,7 +117,6 @@ linear_motion.grbl: description: ROS Action NavigateThroughPoses 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_pose: properties: @@ -290,7 +237,6 @@ linear_motion.grbl: title: NavigateThroughPoses_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: behavior_tree: type: string @@ -371,7 +317,6 @@ linear_motion.grbl: title: NavigateThroughPoses_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: result: properties: {} @@ -404,7 +349,6 @@ linear_motion.grbl: description: ROS Action SingleJointPosition 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: error: type: number @@ -444,7 +388,6 @@ linear_motion.grbl: title: SingleJointPosition_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: max_velocity: type: number @@ -472,7 +415,6 @@ linear_motion.grbl: title: SingleJointPosition_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: {} required: [] title: SingleJointPosition_Result @@ -488,7 +430,7 @@ linear_motion.grbl: spindle_speed: float status: str type: python - description: Grbl CNC + description: Grbl数控机床(CNC)设备,用于实验室精密加工和三轴定位操作。该设备基于Grbl固件,通过串口通信控制步进电机实现X、Y、Z三轴的精确运动。支持绝对定位、轨迹规划、主轴控制和实时状态监控。具备安全限位保护和运动平滑控制功能。适用于精密钻孔、铣削、雕刻、样品制备等需要高精度定位和加工的实验室应用场景。 handles: [] icon: '' init_param_schema: @@ -537,7 +479,7 @@ motor.iCL42: handles: [] result: {} schema: - description: execute_run_motor的参数schema + description: 步进电机执行运动函数。直接执行电机运动命令,包括位置设定、速度控制和路径规划。该函数处理底层的电机控制协议,消除警告信息,设置运动参数并启动电机运行。适用于需要直接控制电机运动的应用场景。 properties: feedback: {} goal: @@ -566,7 +508,7 @@ motor.iCL42: handles: [] result: {} schema: - description: init_device的参数schema + description: iCL42电机设备初始化函数。建立与iCL42步进电机驱动器的串口通信连接,配置通信参数包括波特率、数据位、校验位等。该函数是电机使用前的必要步骤,确保驱动器处于可控状态并准备接收运动指令。 properties: feedback: {} goal: @@ -589,7 +531,7 @@ motor.iCL42: handles: [] result: {} schema: - description: run_motor的参数schema + description: 步进电机运动控制函数。根据指定的运动模式、目标位置和速度参数控制电机运动。支持多种运动模式和精确的位置控制,自动处理运动轨迹规划和执行。该函数提供异步执行和状态反馈,确保运动的准确性和可靠性。 properties: feedback: {} goal: @@ -624,7 +566,6 @@ motor.iCL42: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -633,7 +574,6 @@ motor.iCL42: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -642,7 +582,6 @@ motor.iCL42: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -664,7 +603,7 @@ motor.iCL42: motor_position: int success: bool type: python - description: iCL42 motor + description: iCL42步进电机驱动器,用于实验室设备的精密线性运动控制。该设备通过串口通信控制iCL42型步进电机驱动器,支持多种运动模式和精确的位置、速度控制。具备位置反馈、运行状态监控和故障检测功能。适用于自动进样器、样品传送、精密定位平台等需要准确线性运动控制的实验室自动化设备。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/sim_nodes.yaml b/unilabos/registry/devices/sim_nodes.yaml index 07d1d1d..c2bfa44 100644 --- a/unilabos/registry/devices/sim_nodes.yaml +++ b/unilabos/registry/devices/sim_nodes.yaml @@ -285,7 +285,7 @@ lh_joint_publisher: module: unilabos.devices.ros_dev.liquid_handler_joint_publisher:LiquidHandlerJointPublisher status_types: {} type: ros2 - description: '' + description: 液体处理器关节发布器,用于ROS2仿真系统中的液体处理设备运动控制。该节点通过发布关节状态驱动仿真模型中的机械臂运动,支持三维坐标到关节空间的逆运动学转换、多关节协调控制、资源跟踪和TF变换。具备精确的位置控制、速度调节、pick-and-place操作等功能。适用于液体处理系统的虚拟仿真、运动规划验证、系统集成测试等应用场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index 68a4f5e..7eb157c 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -89,30 +89,6 @@ chiller: title: modbus_crc参数 type: object type: UniLabJsonCommand - auto-set_temperature: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_temperature的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_temperature参数 - type: object - type: UniLabJsonCommand auto-stop: feedback: {} goal: {} @@ -146,7 +122,6 @@ chiller: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -155,7 +130,6 @@ chiller: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -164,7 +138,6 @@ chiller: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -183,7 +156,7 @@ chiller: module: unilabos.devices.temperature.chiller:Chiller status_types: {} type: python - description: Chiller + description: 实验室制冷设备,用于精确的温度控制和冷却操作。该设备通过Modbus RTU协议与控制系统通信,支持精确的温度设定和监控。具备快速降温、恒温控制和温度保持功能,广泛应用于需要低温环境的化学反应、样品保存、结晶操作等实验场景。提供稳定可靠的冷却性能,确保实验过程的温度精度。 handles: [] icon: '' init_param_schema: @@ -224,50 +197,6 @@ heaterstirrer.dalong: title: close参数 type: object type: UniLabJsonCommand - auto-heatchill: - feedback: {} - goal: {} - goal_default: - purpose: reaction - stir: true - stir_speed: 300 - temp: null - time: 3600 - vessel: null - handles: [] - result: {} - schema: - description: heatchill的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - default: reaction - type: string - stir: - default: true - type: boolean - stir_speed: - default: 300 - type: number - temp: - type: number - time: - default: 3600 - type: number - vessel: - type: string - required: - - vessel - - temp - type: object - result: {} - required: - - goal - title: heatchill参数 - type: object - type: UniLabJsonCommand auto-set_stir_speed: feedback: {} goal: {} @@ -320,54 +249,6 @@ heaterstirrer.dalong: title: set_temp_inner参数 type: object type: UniLabJsonCommand - auto-set_temp_target: - feedback: {} - goal: {} - goal_default: - temp: null - handles: [] - result: {} - schema: - description: set_temp_target的参数schema - properties: - feedback: {} - goal: - properties: - temp: - type: string - required: - - temp - type: object - result: {} - required: - - goal - title: set_temp_target参数 - type: object - type: UniLabJsonCommand - auto-set_temp_warning: - feedback: {} - goal: {} - goal_default: - temp: null - handles: [] - result: {} - schema: - description: set_temp_warning的参数schema - properties: - feedback: {} - goal: - properties: - temp: - type: string - required: - - temp - type: object - result: {} - required: - - goal - title: set_temp_warning参数 - type: object - type: UniLabJsonCommand heatchill: feedback: status: status @@ -390,7 +271,6 @@ heaterstirrer.dalong: description: ROS Action HeatChill 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -399,7 +279,6 @@ heaterstirrer.dalong: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -423,7 +302,6 @@ heaterstirrer.dalong: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -452,7 +330,6 @@ heaterstirrer.dalong: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -461,7 +338,6 @@ heaterstirrer.dalong: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -470,7 +346,6 @@ heaterstirrer.dalong: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -499,7 +374,6 @@ heaterstirrer.dalong: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -508,7 +382,6 @@ heaterstirrer.dalong: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -517,7 +390,6 @@ heaterstirrer.dalong: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -541,7 +413,7 @@ heaterstirrer.dalong: temp_target: float temp_warning: float type: python - description: DaLong heater stirrer + description: 大龙加热搅拌器,集成加热和搅拌双重功能的实验室设备。该设备通过串口通信控制,支持精确的温度调节、搅拌速度控制和安全保护功能。具备实时温度监测、目标温度设定、安全温度报警等特性。适用于化学合成、样品制备、反应控制等需要同时进行加热和搅拌的实验操作,提供稳定均匀的反应环境。 handles: [] icon: '' init_param_schema: @@ -688,30 +560,6 @@ tempsensor: title: send_prototype_command参数 type: object type: UniLabJsonCommand - auto-set_warning: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_warning的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_warning参数 - type: object - type: UniLabJsonCommand set_warning: feedback: {} goal: @@ -725,7 +573,6 @@ tempsensor: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -734,7 +581,6 @@ tempsensor: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -743,7 +589,6 @@ tempsensor: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -763,7 +608,7 @@ tempsensor: status_types: value: float type: python - description: Temperature sensor + description: 高精度温度传感器设备,用于实验室环境和设备的温度监测。该传感器通过Modbus RTU协议与控制系统通信,提供实时准确的温度数据。具备高精度测量、报警温度设定、数据稳定性好等特点。适用于反应器监控、环境温度监测、设备保护等需要精确温度测量的实验场景,为实验安全和数据可靠性提供保障。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/devices/vacuum_and_purge.yaml b/unilabos/registry/devices/vacuum_and_purge.yaml index 7239432..e284f38 100644 --- a/unilabos/registry/devices/vacuum_and_purge.yaml +++ b/unilabos/registry/devices/vacuum_and_purge.yaml @@ -1,26 +1,6 @@ gas_source.mock: class: action_value_mappings: - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -61,50 +41,6 @@ gas_source.mock: title: is_open参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - string: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - string: - type: string - required: - - string - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand close: feedback: {} goal: {} @@ -115,19 +51,16 @@ gas_source.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -150,19 +83,16 @@ gas_source.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -187,13 +117,11 @@ gas_source.mock: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -202,7 +130,6 @@ gas_source.mock: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -222,7 +149,7 @@ gas_source.mock: status_types: status: str type: python - description: Mock gas source + description: 模拟气体源设备,用于系统测试和开发调试。该设备模拟真实气体源的开关控制和状态监测功能,支持气体供应的启停操作。提供与真实气体源相同的接口和状态反馈,便于在没有实际硬件的情况下进行系统集成测试和算法验证。适用于气路系统调试、软件开发和实验流程验证等场景。 handles: - data_key: fluid_out data_source: executor @@ -249,26 +176,6 @@ gas_source.mock: vacuum_pump.mock: class: action_value_mappings: - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommand auto-is_closed: feedback: {} goal: {} @@ -309,50 +216,6 @@ vacuum_pump.mock: title: is_open参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - string: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - string: - type: string - required: - - string - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand close: feedback: {} goal: {} @@ -363,19 +226,16 @@ vacuum_pump.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -398,19 +258,16 @@ vacuum_pump.mock: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -435,13 +292,11 @@ vacuum_pump.mock: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -450,7 +305,6 @@ vacuum_pump.mock: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -470,7 +324,7 @@ vacuum_pump.mock: status_types: status: str type: python - description: Mock vacuum pump + description: 模拟真空泵设备,用于系统测试和开发调试。该设备模拟真实真空泵的抽气功能和状态控制,支持真空系统的启停操作和状态监测。提供与真实真空泵相同的接口和控制逻辑,便于在没有实际硬件的情况下进行真空系统的集成测试。适用于真空工艺调试、软件开发和实验流程验证等场景。 handles: - data_key: fluid_in data_source: handle diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 8894314..095628c 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -1,42 +1,6 @@ virtual_centrifuge: class: action_value_mappings: - auto-centrifuge: - feedback: {} - goal: {} - goal_default: - speed: null - temp: 25.0 - time: null - vessel: null - handles: [] - result: {} - schema: - description: centrifuge的参数schema - properties: - feedback: {} - goal: - properties: - speed: - type: number - temp: - default: 25.0 - type: number - time: - type: number - vessel: - type: string - required: - - vessel - - speed - - time - type: object - result: {} - required: - - goal - title: centrifuge参数 - type: object - type: UniLabJsonCommandAsync auto-cleanup: feedback: {} goal: {} @@ -101,7 +65,6 @@ virtual_centrifuge: description: ROS Action Centrifuge 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -119,7 +82,6 @@ virtual_centrifuge: title: Centrifuge_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: speed: type: number @@ -137,7 +99,6 @@ virtual_centrifuge: title: Centrifuge_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -274,38 +235,6 @@ virtual_column: title: initialize参数 type: object type: UniLabJsonCommandAsync - auto-run_column: - feedback: {} - goal: {} - goal_default: - column: null - from_vessel: null - to_vessel: null - handles: [] - result: {} - schema: - description: run_column的参数schema - properties: - feedback: {} - goal: - properties: - column: - type: string - from_vessel: - type: string - to_vessel: - type: string - required: - - from_vessel - - to_vessel - - column - type: object - result: {} - required: - - goal - title: run_column参数 - type: object - type: UniLabJsonCommandAsync run_column: feedback: current_status: current_status @@ -328,7 +257,6 @@ virtual_column: description: ROS Action RunColumn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -340,7 +268,6 @@ virtual_column: title: RunColumn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: column: type: string @@ -355,7 +282,6 @@ virtual_column: title: RunColumn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -468,54 +394,6 @@ virtual_filter: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-filter: - feedback: {} - goal: {} - goal_default: - continue_heatchill: false - filtrate_vessel: '' - stir: false - stir_speed: 300.0 - temp: 25.0 - vessel: null - volume: 0.0 - handles: [] - result: {} - schema: - description: filter的参数schema - properties: - feedback: {} - goal: - properties: - continue_heatchill: - default: false - type: boolean - filtrate_vessel: - default: '' - type: string - stir: - default: false - type: boolean - stir_speed: - default: 300.0 - type: number - temp: - default: 25.0 - type: number - vessel: - type: string - volume: - default: 0.0 - type: number - required: - - vessel - type: object - result: {} - required: - - goal - title: filter参数 - type: object - type: UniLabJsonCommandAsync auto-initialize: feedback: {} goal: {} @@ -567,7 +445,6 @@ virtual_filter: description: ROS Action Filter 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -585,7 +462,6 @@ virtual_filter: title: Filter_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: continue_heatchill: type: boolean @@ -612,7 +488,6 @@ virtual_filter: title: Filter_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -733,26 +608,6 @@ virtual_gas_source: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -813,50 +668,6 @@ virtual_gas_source: title: is_open参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - string: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - string: - type: string - required: - - string - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand close: feedback: {} goal: {} @@ -867,19 +678,16 @@ virtual_gas_source: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -902,19 +710,16 @@ virtual_gas_source: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -939,13 +744,11 @@ virtual_gas_source: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -954,7 +757,6 @@ virtual_gas_source: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1024,106 +826,6 @@ virtual_heatchill: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-heat_chill: - feedback: {} - goal: {} - goal_default: - purpose: null - stir: null - stir_speed: null - temp: null - time: null - vessel: null - handles: [] - result: {} - schema: - description: heat_chill的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - type: string - stir: - type: boolean - stir_speed: - type: number - temp: - type: number - time: - type: number - vessel: - type: string - required: - - vessel - - temp - - time - - stir - - stir_speed - - purpose - type: object - result: {} - required: - - goal - title: heat_chill参数 - type: object - type: UniLabJsonCommandAsync - auto-heat_chill_start: - feedback: {} - goal: {} - goal_default: - purpose: null - temp: null - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_start的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - type: string - temp: - type: number - vessel: - type: string - required: - - vessel - - temp - - purpose - type: object - result: {} - required: - - goal - title: heat_chill_start参数 - type: object - type: UniLabJsonCommandAsync - auto-heat_chill_stop: - feedback: {} - goal: {} - goal_default: - vessel: null - handles: [] - result: {} - schema: - description: heat_chill_stop的参数schema - properties: - feedback: {} - goal: - properties: - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: heat_chill_stop参数 - type: object - type: UniLabJsonCommandAsync auto-initialize: feedback: {} goal: {} @@ -1168,7 +870,6 @@ virtual_heatchill: description: ROS Action HeatChill 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1177,7 +878,6 @@ virtual_heatchill: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1201,7 +901,6 @@ virtual_heatchill: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1235,7 +934,6 @@ virtual_heatchill: description: ROS Action HeatChillStart 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1244,7 +942,6 @@ virtual_heatchill: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1259,7 +956,6 @@ virtual_heatchill: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1289,7 +985,6 @@ virtual_heatchill: description: ROS Action HeatChillStop 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1298,7 +993,6 @@ virtual_heatchill: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -1307,7 +1001,6 @@ virtual_heatchill: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1501,30 +1194,6 @@ virtual_multiway_valve: title: reset参数 type: object type: UniLabJsonCommand - auto-set_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_position参数 - type: object - type: UniLabJsonCommand auto-set_to_port: feedback: {} goal: {} @@ -1569,30 +1238,6 @@ virtual_multiway_valve: title: set_to_pump_position参数 type: object type: UniLabJsonCommand - auto-set_valve_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_valve_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_valve_position参数 - type: object - type: UniLabJsonCommand auto-switch_between_pump_and_port: feedback: {} goal: {} @@ -1630,7 +1275,6 @@ virtual_multiway_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1639,7 +1283,6 @@ virtual_multiway_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -1648,7 +1291,6 @@ virtual_multiway_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1677,7 +1319,6 @@ virtual_multiway_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1686,7 +1327,6 @@ virtual_multiway_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -1695,7 +1335,6 @@ virtual_multiway_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1927,66 +1566,6 @@ virtual_pump: title: initialize参数 type: object type: UniLabJsonCommandAsync - auto-transfer: - feedback: {} - goal: {} - goal_default: - amount: '' - from_vessel: null - rinsing_repeats: 0 - rinsing_solvent: '' - rinsing_volume: 0.0 - solid: false - time: 0.0 - to_vessel: null - viscous: false - volume: null - handles: [] - result: {} - schema: - description: transfer的参数schema - properties: - feedback: {} - goal: - properties: - amount: - default: '' - type: string - from_vessel: - type: string - rinsing_repeats: - default: 0 - type: integer - rinsing_solvent: - default: '' - type: string - rinsing_volume: - default: 0.0 - type: number - solid: - default: false - type: boolean - time: - default: 0.0 - type: number - to_vessel: - type: string - viscous: - default: false - type: boolean - volume: - type: number - required: - - from_vessel - - to_vessel - - volume - type: object - result: {} - required: - - goal - title: transfer参数 - type: object - type: UniLabJsonCommandAsync set_valve_position: feedback: status: status @@ -2001,13 +1580,11 @@ virtual_pump: description: ROS Action FloatSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -2016,7 +1593,6 @@ virtual_pump: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2064,7 +1640,6 @@ virtual_pump: description: ROS Action PumpTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2108,7 +1683,6 @@ virtual_pump: title: PumpTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -2146,7 +1720,6 @@ virtual_pump: title: PumpTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2251,46 +1824,6 @@ virtual_rotavap: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-evaporate: - feedback: {} - goal: {} - goal_default: - pressure: 0.1 - stir_speed: 100.0 - temp: 60.0 - time: 1800.0 - vessel: null - handles: [] - result: {} - schema: - description: evaporate的参数schema - properties: - feedback: {} - goal: - properties: - pressure: - default: 0.1 - type: number - stir_speed: - default: 100.0 - type: number - temp: - default: 60.0 - type: number - time: - default: 1800.0 - type: number - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: evaporate参数 - type: object - type: UniLabJsonCommandAsync auto-initialize: feedback: {} goal: {} @@ -2337,7 +1870,6 @@ virtual_rotavap: description: ROS Action Evaporate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2381,7 +1913,6 @@ virtual_rotavap: title: Evaporate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: pressure: type: number @@ -2402,7 +1933,6 @@ virtual_rotavap: title: Evaporate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2548,78 +2078,6 @@ virtual_separator: title: initialize参数 type: object type: UniLabJsonCommandAsync - auto-separate: - feedback: {} - goal: {} - goal_default: - from_vessel: null - product_phase: null - purpose: null - repeats: 1 - separation_vessel: null - settling_time: 300.0 - solvent: '' - solvent_volume: 50.0 - stir_speed: 300.0 - stir_time: 30.0 - through: '' - to_vessel: null - waste_phase_to_vessel: '' - handles: [] - result: {} - schema: - description: separate的参数schema - properties: - feedback: {} - goal: - properties: - from_vessel: - type: string - product_phase: - type: string - purpose: - type: string - repeats: - default: 1 - type: integer - separation_vessel: - type: string - settling_time: - default: 300.0 - type: number - solvent: - default: '' - type: string - solvent_volume: - default: 50.0 - type: number - stir_speed: - default: 300.0 - type: number - stir_time: - default: 30.0 - type: number - through: - default: '' - type: string - to_vessel: - type: string - waste_phase_to_vessel: - default: '' - type: string - required: - - purpose - - product_phase - - from_vessel - - separation_vessel - - to_vessel - type: object - result: {} - required: - - goal - title: separate参数 - type: object - type: UniLabJsonCommandAsync separate: feedback: current_status: status @@ -2660,7 +2118,6 @@ virtual_separator: description: ROS Action Separate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2704,7 +2161,6 @@ virtual_separator: title: Separate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_vessel: type: string @@ -2751,7 +2207,6 @@ virtual_separator: title: Separate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2877,26 +2332,6 @@ virtual_solenoid_valve: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommandAsync auto-initialize: feedback: {} goal: {} @@ -2937,26 +2372,6 @@ virtual_solenoid_valve: title: is_closed参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommandAsync auto-reset: feedback: {} goal: {} @@ -2977,53 +2392,6 @@ virtual_solenoid_valve: title: reset参数 type: object type: UniLabJsonCommandAsync - auto-set_state: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_state的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: - - command - type: object - result: {} - required: - - goal - title: set_state参数 - type: object - type: UniLabJsonCommandAsync - auto-set_valve_position: - feedback: {} - goal: {} - goal_default: - command: null - handles: [] - result: {} - schema: - description: set_valve_position的参数schema - properties: - feedback: {} - goal: - properties: - command: - type: string - required: [] - type: object - result: {} - required: - - goal - title: set_valve_position参数 - type: object - type: UniLabJsonCommandAsync auto-toggle: feedback: {} goal: {} @@ -3057,7 +2425,6 @@ virtual_solenoid_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3066,7 +2433,6 @@ virtual_solenoid_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -3075,7 +2441,6 @@ virtual_solenoid_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3104,7 +2469,6 @@ virtual_solenoid_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3113,7 +2477,6 @@ virtual_solenoid_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -3122,7 +2485,6 @@ virtual_solenoid_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3151,7 +2513,6 @@ virtual_solenoid_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3160,7 +2521,6 @@ virtual_solenoid_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -3169,7 +2529,6 @@ virtual_solenoid_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3198,7 +2557,6 @@ virtual_solenoid_valve: description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3207,7 +2565,6 @@ virtual_solenoid_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -3216,7 +2573,6 @@ virtual_solenoid_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3330,94 +2686,6 @@ virtual_stirrer: title: initialize参数 type: object type: UniLabJsonCommandAsync - auto-start_stir: - feedback: {} - goal: {} - goal_default: - purpose: null - stir_speed: null - vessel: null - handles: [] - result: {} - schema: - description: start_stir的参数schema - properties: - feedback: {} - goal: - properties: - purpose: - type: string - stir_speed: - type: number - vessel: - type: string - required: - - vessel - - stir_speed - - purpose - type: object - result: {} - required: - - goal - title: start_stir参数 - type: object - type: UniLabJsonCommandAsync - auto-stir: - feedback: {} - goal: {} - goal_default: - settling_time: null - stir_speed: null - stir_time: null - handles: [] - result: {} - schema: - description: stir的参数schema - properties: - feedback: {} - goal: - properties: - settling_time: - type: number - stir_speed: - type: number - stir_time: - type: number - required: - - stir_time - - stir_speed - - settling_time - type: object - result: {} - required: - - goal - title: stir参数 - type: object - type: UniLabJsonCommandAsync - auto-stop_stir: - feedback: {} - goal: {} - goal_default: - vessel: null - handles: [] - result: {} - schema: - description: stop_stir的参数schema - properties: - feedback: {} - goal: - properties: - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: stop_stir参数 - type: object - type: UniLabJsonCommandAsync start_stir: feedback: status: status @@ -3436,7 +2704,6 @@ virtual_stirrer: description: ROS Action StartStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -3451,7 +2718,6 @@ virtual_stirrer: title: StartStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -3466,7 +2732,6 @@ virtual_stirrer: title: StartStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3503,7 +2768,6 @@ virtual_stirrer: description: ROS Action Stir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3512,7 +2776,6 @@ virtual_stirrer: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: settling_time: type: number @@ -3527,7 +2790,6 @@ virtual_stirrer: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3557,7 +2819,6 @@ virtual_stirrer: description: ROS Action StopStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -3569,7 +2830,6 @@ virtual_stirrer: title: StopStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -3578,7 +2838,6 @@ virtual_stirrer: title: StopStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3909,33 +3168,6 @@ virtual_transfer_pump: title: set_max_velocity参数 type: object type: UniLabJsonCommand - auto-set_position: - feedback: {} - goal: {} - goal_default: - max_velocity: null - position: null - handles: [] - result: {} - schema: - description: set_position的参数schema - properties: - feedback: {} - goal: - properties: - max_velocity: - type: number - position: - type: number - required: - - position - type: object - result: {} - required: - - goal - title: set_position参数 - type: object - type: UniLabJsonCommandAsync auto-stop_operation: feedback: {} goal: {} @@ -3956,36 +3188,6 @@ virtual_transfer_pump: title: stop_operation参数 type: object type: UniLabJsonCommandAsync - auto-transfer: - feedback: {} - goal: {} - goal_default: - aspirate_velocity: null - dispense_velocity: null - volume: null - handles: [] - result: {} - schema: - description: transfer的参数schema - properties: - feedback: {} - goal: - properties: - aspirate_velocity: - type: number - dispense_velocity: - type: number - volume: - type: number - required: - - volume - type: object - result: {} - required: - - goal - title: transfer参数 - type: object - type: UniLabJsonCommandAsync set_position: feedback: current_position: current_position @@ -4005,7 +3207,6 @@ virtual_transfer_pump: description: ROS Action SetPumpPosition 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_position: type: number @@ -4020,7 +3221,6 @@ virtual_transfer_pump: title: SetPumpPosition_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: max_velocity: type: number @@ -4032,7 +3232,6 @@ virtual_transfer_pump: title: SetPumpPosition_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -4086,7 +3285,6 @@ virtual_transfer_pump: description: ROS Action Transfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -4101,7 +3299,6 @@ virtual_transfer_pump: title: Transfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -4139,7 +3336,6 @@ virtual_transfer_pump: title: Transfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -4236,26 +3432,6 @@ virtual_vacuum_pump: title: cleanup参数 type: object type: UniLabJsonCommandAsync - auto-close: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: close的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: close参数 - type: object - type: UniLabJsonCommand auto-initialize: feedback: {} goal: {} @@ -4316,50 +3492,6 @@ virtual_vacuum_pump: title: is_open参数 type: object type: UniLabJsonCommand - auto-open: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: open的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: open参数 - type: object - type: UniLabJsonCommand - auto-set_status: - feedback: {} - goal: {} - goal_default: - string: null - handles: [] - result: {} - schema: - description: set_status的参数schema - properties: - feedback: {} - goal: - properties: - string: - type: string - required: - - string - type: object - result: {} - required: - - goal - title: set_status参数 - type: object - type: UniLabJsonCommand close: feedback: {} goal: {} @@ -4370,19 +3502,16 @@ virtual_vacuum_pump: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4405,19 +3534,16 @@ virtual_vacuum_pump: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4442,13 +3568,11 @@ virtual_vacuum_pump: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -4457,7 +3581,6 @@ virtual_vacuum_pump: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index ed8b86f..dbfe017 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -57,7 +57,6 @@ workstation: description: ROS Action AGVTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -66,7 +65,6 @@ workstation: title: AGVTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_repo: properties: @@ -226,7 +224,6 @@ workstation: title: AGVTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -289,7 +286,6 @@ workstation: description: ROS Action Add 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -301,7 +297,6 @@ workstation: title: Add_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -337,7 +332,6 @@ workstation: title: Add_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -389,7 +383,6 @@ workstation: description: ROS Action AdjustPH 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -401,7 +394,6 @@ workstation: title: AdjustPH_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: ph_value: type: number @@ -416,7 +408,6 @@ workstation: title: AdjustPH_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -465,7 +456,6 @@ workstation: description: ROS Action Centrifuge 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -483,7 +473,6 @@ workstation: title: Centrifuge_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: speed: type: number @@ -501,7 +490,6 @@ workstation: title: Centrifuge_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -557,7 +545,6 @@ workstation: description: ROS Action Clean 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -601,7 +588,6 @@ workstation: title: Clean_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: repeats: maximum: 2147483647 @@ -624,7 +610,6 @@ workstation: title: Clean_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -677,7 +662,6 @@ workstation: description: ROS Action CleanVessel 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -689,7 +673,6 @@ workstation: title: CleanVessel_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: repeats: maximum: 2147483647 @@ -712,7 +695,6 @@ workstation: title: CleanVessel_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -772,7 +754,6 @@ workstation: description: ROS Action Dissolve 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -784,7 +765,6 @@ workstation: title: Dissolve_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -811,7 +791,6 @@ workstation: title: Dissolve_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -856,7 +835,6 @@ workstation: description: ROS Action Dry 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -868,7 +846,6 @@ workstation: title: Dry_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: compound: type: string @@ -880,7 +857,6 @@ workstation: title: Dry_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -927,7 +903,6 @@ workstation: description: ROS Action EvacuateAndRefill 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -971,7 +946,6 @@ workstation: title: EvacuateAndRefill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: gas: type: string @@ -988,7 +962,6 @@ workstation: title: EvacuateAndRefill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1036,7 +1009,6 @@ workstation: description: ROS Action Evaporate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1080,7 +1052,6 @@ workstation: title: Evaporate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: pressure: type: number @@ -1101,7 +1072,6 @@ workstation: title: Evaporate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1163,7 +1133,6 @@ workstation: description: ROS Action Filter 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -1181,7 +1150,6 @@ workstation: title: Filter_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: continue_heatchill: type: boolean @@ -1208,7 +1176,6 @@ workstation: title: Filter_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1278,7 +1245,6 @@ workstation: description: ROS Action FilterThrough 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1290,7 +1256,6 @@ workstation: title: FilterThrough_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: eluting_repeats: maximum: 2147483647 @@ -1319,7 +1284,6 @@ workstation: title: FilterThrough_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1372,7 +1336,6 @@ workstation: description: ROS Action HeatChill 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1381,7 +1344,6 @@ workstation: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1405,7 +1367,6 @@ workstation: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1449,7 +1410,6 @@ workstation: description: ROS Action HeatChillStart 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1458,7 +1418,6 @@ workstation: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1473,7 +1432,6 @@ workstation: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1513,7 +1471,6 @@ workstation: description: ROS Action HeatChillStop 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1522,7 +1479,6 @@ workstation: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -1531,7 +1487,6 @@ workstation: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1575,7 +1530,6 @@ workstation: description: ROS Action Hydrogenate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1587,7 +1541,6 @@ workstation: title: Hydrogenate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: temp: type: string @@ -1602,7 +1555,6 @@ workstation: title: Hydrogenate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1678,7 +1630,6 @@ workstation: description: ROS Action PumpTransfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1722,7 +1673,6 @@ workstation: title: PumpTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -1760,7 +1710,6 @@ workstation: title: PumpTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1818,7 +1767,6 @@ workstation: description: ROS Action Recrystallize 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1830,7 +1778,6 @@ workstation: title: Recrystallize_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: ratio: type: string @@ -1851,7 +1798,6 @@ workstation: title: Recrystallize_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1889,7 +1835,6 @@ workstation: description: ROS Action ResetHandling 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1901,7 +1846,6 @@ workstation: title: ResetHandling_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: solvent: type: string @@ -1910,7 +1854,6 @@ workstation: title: ResetHandling_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1967,7 +1910,6 @@ workstation: description: ROS Action RunColumn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -1979,7 +1921,6 @@ workstation: title: RunColumn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: column: type: string @@ -1994,7 +1935,6 @@ workstation: title: RunColumn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2076,7 +2016,6 @@ workstation: description: ROS Action Separate 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2120,7 +2059,6 @@ workstation: title: Separate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_vessel: type: string @@ -2167,7 +2105,6 @@ workstation: title: Separate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2211,7 +2148,6 @@ workstation: description: ROS Action StartStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -2226,7 +2162,6 @@ workstation: title: StartStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -2241,7 +2176,6 @@ workstation: title: StartStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2288,7 +2222,6 @@ workstation: description: ROS Action Stir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -2297,7 +2230,6 @@ workstation: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: settling_time: type: number @@ -2312,7 +2244,6 @@ workstation: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2352,7 +2283,6 @@ workstation: description: ROS Action StopStir 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -2364,7 +2294,6 @@ workstation: title: StopStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -2373,7 +2302,6 @@ workstation: title: StopStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2449,7 +2377,6 @@ workstation: description: ROS Action Transfer 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -2464,7 +2391,6 @@ workstation: title: Transfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -2502,7 +2428,6 @@ workstation: title: Transfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2576,7 +2501,6 @@ workstation: description: ROS Action WashSolid 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -2588,7 +2512,6 @@ workstation: title: WashSolid_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: filtrate_vessel: type: string @@ -2623,7 +2546,6 @@ workstation: title: WashSolid_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string diff --git a/unilabos/registry/devices/zhida_hplc.yaml b/unilabos/registry/devices/zhida_hplc.yaml index 644ab7f..62f1e06 100644 --- a/unilabos/registry/devices/zhida_hplc.yaml +++ b/unilabos/registry/devices/zhida_hplc.yaml @@ -11,19 +11,16 @@ zhida_hplc: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -36,26 +33,6 @@ zhida_hplc: title: EmptyIn type: object type: EmptyIn - auto-abort: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: abort的参数schema - properties: - feedback: {} - goal: - properties: {} - required: [] - type: object - result: {} - required: - - goal - title: abort参数 - type: object - type: UniLabJsonCommand auto-close: feedback: {} goal: {} @@ -63,7 +40,7 @@ zhida_hplc: handles: [] result: {} schema: - description: close的参数schema + description: HPLC设备连接关闭函数。安全地断开与智达HPLC设备的TCP socket连接,释放网络资源。该函数确保连接的正确关闭,避免网络资源泄露。通常在设备使用完毕或系统关闭时调用。 properties: feedback: {} goal: @@ -83,7 +60,7 @@ zhida_hplc: handles: [] result: {} schema: - description: connect的参数schema + description: HPLC设备连接建立函数。与智达HPLC设备建立TCP socket通信连接,配置通信超时参数。该函数是设备使用前的必要步骤,建立成功后可进行状态查询、方法获取、任务启动等操作。连接失败时会抛出异常。 properties: feedback: {} goal: @@ -96,30 +73,6 @@ zhida_hplc: title: connect参数 type: object type: UniLabJsonCommand - auto-start: - feedback: {} - goal: {} - goal_default: - text: null - handles: [] - result: {} - schema: - description: start的参数schema - properties: - feedback: {} - goal: - properties: - text: - type: string - required: - - text - type: object - result: {} - required: - - goal - title: start参数 - type: object - type: UniLabJsonCommand get_methods: feedback: {} goal: {} @@ -130,19 +83,16 @@ zhida_hplc: description: ROS Action EmptyIn 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: EmptyIn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: {} required: [] title: EmptyIn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -167,13 +117,11 @@ zhida_hplc: description: ROS Action StrSingleInput 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -182,7 +130,6 @@ zhida_hplc: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -203,7 +150,7 @@ zhida_hplc: methods: dict status: dict type: python - description: Zhida HPLC + description: 智达高效液相色谱(HPLC)分析设备,用于实验室样品的分离、检测和定量分析。该设备通过TCP socket与HPLC控制系统通信,支持远程控制和状态监控。具备自动进样、梯度洗脱、多检测器数据采集等功能,可执行复杂的色谱分析方法。适用于化学分析、药物检测、环境监测、生物样品分析等需要高精度分离分析的实验室应用场景。 handles: [] icon: '' init_param_schema: diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 96d74d8..7725cec 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -2,6 +2,8 @@ import copy import io import os import sys +import inspect +import importlib from pathlib import Path from typing import Any, Dict, List @@ -99,6 +101,12 @@ class Registry: } ] }, + # todo: support nested keys, switch to non ros message schema + "placeholder_keys": { + "res_id": "unilabos_resources", # 将当前实验室的全部物料id作为下拉框可选择 + "device_id": "unilabos_devices", # 将当前实验室的全部设备id作为下拉框可选择 + "parent": "unilabos_devices", # 将当前实验室的全部设备id作为下拉框可选择 + }, }, "test_latency": { "type": self.EmptyIn, @@ -161,6 +169,54 @@ class Registry: else: logger.debug(f"[UniLab Registry] Res File-{i+1}/{len(files)} Not Valid YAML File: {file.absolute()}") + def _extract_class_docstrings(self, module_string: str) -> Dict[str, str]: + """ + 从模块字符串中提取类和方法的docstring信息 + + Args: + module_string: 模块字符串,格式为 "module.path:ClassName" + + Returns: + 包含类和方法docstring信息的字典 + """ + docstrings = {"class_docstring": "", "methods": {}} + + if not module_string or ":" not in module_string: + return docstrings + + try: + module_path, class_name = module_string.split(":", 1) + + # 动态导入模块 + module = importlib.import_module(module_path) + + # 获取类 + if hasattr(module, class_name): + cls = getattr(module, class_name) + + # 获取类的docstring + class_doc = inspect.getdoc(cls) + if class_doc: + docstrings["class_docstring"] = class_doc.strip() + + # 获取所有方法的docstring + for method_name, method in inspect.getmembers(cls, predicate=inspect.isfunction): + method_doc = inspect.getdoc(method) + if method_doc: + docstrings["methods"][method_name] = method_doc.strip() + + # 也获取属性方法的docstring + for method_name, method in inspect.getmembers(cls, predicate=lambda x: isinstance(x, property)): + if hasattr(method, "fget") and method.fget: + method_doc = inspect.getdoc(method.fget) + if method_doc: + docstrings["methods"][method_name] = method_doc.strip() + + except Exception as e: + logger.warning(f"[UniLab Registry] 无法提取docstring信息,模块: {module_string}, 错误: {str(e)}") + + return docstrings + def _replace_type_with_class(self, type_name: str, device_id: str, field_name: str) -> Any: """ 将类型名称替换为实际的类对象 @@ -274,15 +330,13 @@ class Registry: param_type = arg_info.get("type", "") param_default = arg_info.get("default") param_required = arg_info.get("required", True) - schema["properties"][param_name] = self._generate_schema_from_info( - param_name, param_type, param_default - ) + schema["properties"][param_name] = self._generate_schema_from_info(param_name, param_type, param_default) if param_required: schema["required"].append(param_name) return { "title": f"{method_name}参数", - "description": f"{method_name}的参数schema", + "description": f"", "type": "object", "properties": {"goal": schema, "feedback": {}, "result": {}}, "required": ["goal"], @@ -348,6 +402,14 @@ class Registry: sorted(device_config["class"]["status_types"].items()) ) if complete_registry: + # 保存原有的description信息 + old_descriptions = {} + for action_name, action_config in device_config["class"]["action_value_mappings"].items(): + if "description" in action_config.get("schema", {}): + description = action_config["schema"]["description"] + if len(description): + old_descriptions[action_name] = action_config["schema"]["description"] + device_config["class"]["action_value_mappings"] = { k: v for k, v in device_config["class"]["action_value_mappings"].items() @@ -366,9 +428,14 @@ class Registry: "handles": [], } # 不生成已配置action的动作 - for k, v in enhanced_info["action_methods"].items() if k not in device_config["class"]["action_value_mappings"] + for k, v in enhanced_info["action_methods"].items() + if k not in device_config["class"]["action_value_mappings"] } ) + + # 恢复原有的description信息(auto开头的不修改) + for action_name, description in old_descriptions.items(): + device_config["class"]["action_value_mappings"][action_name]["schema"]["description"] = description device_config["init_param_schema"] = {} device_config["init_param_schema"]["config"] = self._generate_unilab_json_command_schema( enhanced_info["init_params"], "__init__" @@ -432,6 +499,8 @@ class Registry: } if "registry_type" not in device_config: device_config["registry_type"] = "device" + if "version" not in device_config: + device_config["version"] = "0.0.1" device_config["file_path"] = str(file.absolute()).replace("\\", "/") device_config["registry_type"] = "device" logger.debug( @@ -472,6 +541,13 @@ class Registry: }, **schema["properties"]["goal"]["properties"], } + # 将 placeholder_keys 信息添加到 schema 中 + if "placeholder_keys" in action_config and action_config.get("schema", {}).get( + "properties", {} + ).get("goal", {}): + action_config["schema"]["properties"]["goal"]["_unilabos_placeholder_info"] = action_config[ + "placeholder_keys" + ] msg = {"id": device_id, **device_info_copy} devices.append(msg) diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index 9dceef8..5e0bb08 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -132,7 +132,11 @@ _msg_converter: Dict[Type, Any] = { Bool: lambda x: Bool(data=bool(x)), str: str, String: lambda x: String(data=str(x)), - Point: lambda x: Point(x=x.x, y=x.y, z=x.z) if not isinstance(x, dict) else Point(x=float(x.get("x", 0.0)), y=float(x.get("y", 0.0)), z=float(x.get("z", 0.0))), + Point: lambda x: ( + Point(x=x.x, y=x.y, z=x.z) + if not isinstance(x, dict) + else Point(x=float(x.get("x", 0.0)), y=float(x.get("y", 0.0)), z=float(x.get("z", 0.0))) + ), Resource: lambda x: Resource( id=x.get("id", ""), name=x.get("name", ""), @@ -142,7 +146,13 @@ _msg_converter: Dict[Type, Any] = { type=x.get("type", ""), category=x.get("class", "") or x.get("type", ""), pose=( - Pose(position=Point(x=float(x.get("position", {}).get("x", 0.0)), y=float(x.get("position", {}).get("y", 0.0)), z=float(x.get("position", {}).get("z", 0.0)))) + Pose( + position=Point( + x=float(x.get("position", {}).get("x", 0.0)), + y=float(x.get("position", {}).get("y", 0.0)), + z=float(x.get("position", {}).get("z", 0.0)), + ) + ) if x.get("position", None) is not None else Pose() ), @@ -151,6 +161,7 @@ _msg_converter: Dict[Type, Any] = { ), } + def json_or_yaml_loads(data: str) -> Any: try: return json.loads(data) @@ -161,6 +172,7 @@ def json_or_yaml_loads(data: str) -> Any: pass raise e + # ROS消息到Python转换器 _msg_converter_back: Dict[Type, Any] = { float: float, @@ -571,30 +583,30 @@ from unilabos.utils.import_manager import ImportManager from unilabos.config.config import ROSConfig basic_type_map = { - 'bool': {'type': 'boolean'}, - 'int8': {'type': 'integer', 'minimum': -128, 'maximum': 127}, - 'uint8': {'type': 'integer', 'minimum': 0, 'maximum': 255}, - 'int16': {'type': 'integer', 'minimum': -32768, 'maximum': 32767}, - 'uint16': {'type': 'integer', 'minimum': 0, 'maximum': 65535}, - 'int32': {'type': 'integer', 'minimum': -2147483648, 'maximum': 2147483647}, - 'uint32': {'type': 'integer', 'minimum': 0, 'maximum': 4294967295}, - 'int64': {'type': 'integer'}, - 'uint64': {'type': 'integer', 'minimum': 0}, - 'double': {'type': 'number'}, - 'float': {'type': 'number'}, - 'float32': {'type': 'number'}, - 'float64': {'type': 'number'}, - 'string': {'type': 'string'}, - 'boolean': {'type': 'boolean'}, - 'char': {'type': 'string', 'maxLength': 1}, - 'byte': {'type': 'integer', 'minimum': 0, 'maximum': 255}, + "bool": {"type": "boolean"}, + "int8": {"type": "integer", "minimum": -128, "maximum": 127}, + "uint8": {"type": "integer", "minimum": 0, "maximum": 255}, + "int16": {"type": "integer", "minimum": -32768, "maximum": 32767}, + "uint16": {"type": "integer", "minimum": 0, "maximum": 65535}, + "int32": {"type": "integer", "minimum": -2147483648, "maximum": 2147483647}, + "uint32": {"type": "integer", "minimum": 0, "maximum": 4294967295}, + "int64": {"type": "integer"}, + "uint64": {"type": "integer", "minimum": 0}, + "double": {"type": "number"}, + "float": {"type": "number"}, + "float32": {"type": "number"}, + "float64": {"type": "number"}, + "string": {"type": "string"}, + "boolean": {"type": "boolean"}, + "char": {"type": "string", "maxLength": 1}, + "byte": {"type": "integer", "minimum": 0, "maximum": 255}, } -def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str=None) -> Dict[str, Any]: +def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str = None) -> Dict[str, Any]: """ 将 ROS 字段类型转换为 JSON Schema 类型定义 - + Args: type_info: ROS 类型 slot_type: ROS 类型 @@ -603,10 +615,7 @@ def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str=None) -> 对应的 JSON Schema 类型定义 """ if isinstance(type_info, UnboundedSequence): - return { - 'type': 'array', - 'items': ros_field_type_to_json_schema(type_info.value_type) - } + return {"type": "array", "items": ros_field_type_to_json_schema(type_info.value_type)} if isinstance(type_info, NamespacedType): cls_name = ".".join(type_info.namespaces) + ":" + type_info.name type_class = msg_converter_manager.get_class(cls_name) @@ -614,20 +623,20 @@ def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str=None) -> elif isinstance(type_info, BasicType): return ros_field_type_to_json_schema(type_info.typename) elif isinstance(type_info, UnboundedString): - return basic_type_map['string'] + return basic_type_map["string"] elif isinstance(type_info, str): if type_info in basic_type_map: return basic_type_map[type_info] # 处理时间和持续时间类型 - if type_info in ('time', 'duration', 'builtin_interfaces/Time', 'builtin_interfaces/Duration'): + if type_info in ("time", "duration", "builtin_interfaces/Time", "builtin_interfaces/Duration"): return { - 'type': 'object', - 'properties': { - 'sec': {'type': 'integer', 'description': '秒'}, - 'nanosec': {'type': 'integer', 'description': '纳秒'} + "type": "object", + "properties": { + "sec": {"type": "integer", "description": "秒"}, + "nanosec": {"type": "integer", "description": "纳秒"}, }, - 'required': ['sec', 'nanosec'] + "required": ["sec", "nanosec"], } else: return ros_message_to_json_schema(type_info) @@ -638,9 +647,7 @@ def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str=None) -> # 'type': 'array', # 'items': ros_field_type_to_json_schema(item_type) # } - - # # 处理复杂类型(尝试加载并处理) # try: # # 如果它是一个完整的消息类型规范 (包名/msg/类型名) @@ -655,34 +662,31 @@ def ros_field_type_to_json_schema(type_info: Type | str, slot_type: str=None) -> # logger.debug(f"无法解析类型 {field_type}: {str(e)}") # return {'type': 'object', 'description': f'未知类型: {field_type}'} + def ros_message_to_json_schema(msg_class: Any) -> Dict[str, Any]: """ 将 ROS 消息类转换为 JSON Schema - + Args: msg_class: ROS 消息类 - + Returns: 对应的 JSON Schema 定义 """ - schema = { - 'type': 'object', - 'properties': {}, - 'required': [] - } - + schema = {"type": "object", "properties": {}, "required": []} + # 获取类名作为标题 - if hasattr(msg_class, '__name__'): - schema['title'] = msg_class.__name__ - + if hasattr(msg_class, "__name__"): + schema["title"] = msg_class.__name__ + # 获取消息的字段和字段类型 try: for ind, slot_info in enumerate(msg_class._fields_and_field_types.items()): slot_name, slot_type = slot_info type_info = msg_class.SLOT_TYPES[ind] field_schema = ros_field_type_to_json_schema(type_info, slot_type) - schema['properties'][slot_name] = field_schema - schema['required'].append(slot_name) + schema["properties"][slot_name] = field_schema + schema["required"].append(slot_name) # if hasattr(msg_class, 'get_fields_and_field_types'): # fields_and_types = msg_class.get_fields_and_field_types() # @@ -707,61 +711,65 @@ def ros_message_to_json_schema(msg_class: Any) -> Dict[str, Any]: # schema['required'].append(clean_name) except Exception as e: # 如果获取字段类型失败,添加错误信息 - schema['description'] = f"解析消息字段时出错: {str(e)}" + schema["description"] = f"解析消息字段时出错: {str(e)}" logger.error(f"解析 {msg_class.__name__} 消息字段失败: {str(e)}") - + return schema + def ros_action_to_json_schema(action_class: Any) -> Dict[str, Any]: """ 将 ROS Action 类转换为 JSON Schema - + Args: action_class: ROS Action 类 - + Returns: 完整的 JSON Schema 定义 """ - if not hasattr(action_class, 'Goal') or not hasattr(action_class, 'Feedback') or not hasattr(action_class, 'Result'): + if ( + not hasattr(action_class, "Goal") + or not hasattr(action_class, "Feedback") + or not hasattr(action_class, "Result") + ): raise ValueError(f"{action_class.__name__} 不是有效的 ROS Action 类") - + # 创建基础 schema schema = { - 'title': action_class.__name__, - 'description': f"ROS Action {action_class.__name__} 的 JSON Schema", - 'type': 'object', - 'properties': { - 'goal': { - 'description': 'Action 目标 - 从客户端发送到服务器', + "title": action_class.__name__, + "description": f"ROS Action {action_class.__name__} 的 JSON Schema", + "type": "object", + "properties": { + "goal": { + # 'description': 'Action 目标 - 从客户端发送到服务器', **ros_message_to_json_schema(action_class.Goal) }, - 'feedback': { - 'description': 'Action 反馈 - 执行过程中从服务器发送到客户端', + "feedback": { + # 'description': 'Action 反馈 - 执行过程中从服务器发送到客户端', **ros_message_to_json_schema(action_class.Feedback) }, - 'result': { - 'description': 'Action 结果 - 完成后从服务器发送到客户端', + "result": { + # 'description': 'Action 结果 - 完成后从服务器发送到客户端', **ros_message_to_json_schema(action_class.Result) - } + }, }, - 'required': ['goal'] + "required": ["goal"], } - + return schema + def convert_ros_action_to_jsonschema( - action_name_or_type: Union[str, Type], - output_file: Optional[str] = None, - format: str = 'json' + action_name_or_type: Union[str, Type], output_file: Optional[str] = None, format: str = "json" ) -> Dict[str, Any]: """ 将 ROS Action 类型转换为 JSON Schema,并可选地保存到文件 - + Args: action_name_or_type: ROS Action 类型名称或类 output_file: 可选,输出 JSON Schema 的文件路径 format: 输出格式,'json' 或 'yaml' - + Returns: JSON Schema 定义(字典) """ @@ -771,21 +779,21 @@ def convert_ros_action_to_jsonschema( action_type = get_ros_type_by_msgname(action_name_or_type) else: action_type = action_name_or_type - + # 生成 JSON Schema schema = ros_action_to_json_schema(action_type) - + # 如果指定了输出文件,将 Schema 保存到文件 if output_file: - if format.lower() == 'json': - with open(output_file, 'w', encoding='utf-8') as f: + if format.lower() == "json": + with open(output_file, "w", encoding="utf-8") as f: json.dump(schema, f, indent=2, ensure_ascii=False) - elif format.lower() == 'yaml': - with open(output_file, 'w', encoding='utf-8') as f: + elif format.lower() == "yaml": + with open(output_file, "w", encoding="utf-8") as f: yaml.safe_dump(schema, f, default_flow_style=False, allow_unicode=True) else: raise ValueError(f"不支持的格式: {format},请使用 'json' 或 'yaml'") - + return schema @@ -794,14 +802,14 @@ if __name__ == "__main__": # 示例:转换 NavigateToPose action try: from nav2_msgs.action import NavigateToPose - + # 转换为 JSON Schema 并打印 schema = convert_ros_action_to_jsonschema(NavigateToPose) print(json.dumps(schema, indent=2, ensure_ascii=False)) - + # 保存到文件 # convert_ros_action_to_jsonschema(NavigateToPose, "navigate_to_pose_schema.json") - + # 或者使用字符串形式的 action 名称 # schema = convert_ros_action_to_jsonschema("nav2_msgs/action/NavigateToPose") except ImportError: diff --git a/unilabos/ros/nodes/base_device_node.py b/unilabos/ros/nodes/base_device_node.py index d4ea392..b226edc 100644 --- a/unilabos/ros/nodes/base_device_node.py +++ b/unilabos/ros/nodes/base_device_node.py @@ -307,7 +307,7 @@ class BaseROS2DeviceNode(Node, Generic[T]): # 创建动作服务 if self.create_action_server: for action_name, action_value_mapping in self._action_value_mappings.items(): - if action_name.startswith("auto-"): + if action_name.startswith("auto-") or str(action_value_mapping.get("type", "")).startswith("UniLabJsonCommand"): continue self.create_ros_action_server(action_name, action_value_mapping) diff --git a/unilabos/ros/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index 29cdea9..c7c273d 100644 --- a/unilabos/ros/nodes/presets/host_node.py +++ b/unilabos/ros/nodes/presets/host_node.py @@ -459,7 +459,7 @@ class HostNode(BaseROS2DeviceNode): self.devices_instances[device_id] = d # noinspection PyProtectedMember for action_name, action_value_mapping in d._ros_node._action_value_mappings.items(): - if action_name.startswith("auto-"): + if action_name.startswith("auto-") or str(action_value_mapping.get("type", "")).startswith("UniLabJsonCommand"): continue action_id = f"/devices/{device_id}/{action_name}" if action_id not in self._action_clients: diff --git a/unilabos/ros/nodes/presets/protocol_node.py b/unilabos/ros/nodes/presets/protocol_node.py index f8921da..d2eab27 100644 --- a/unilabos/ros/nodes/presets/protocol_node.py +++ b/unilabos/ros/nodes/presets/protocol_node.py @@ -134,7 +134,7 @@ class ROS2ProtocolNode(BaseROS2DeviceNode): if d is not None and hasattr(d, "ros_node_instance"): node = d.ros_node_instance for action_name, action_mapping in node._action_value_mappings.items(): - if action_name.startswith("auto-"): + if action_name.startswith("auto-") or str(action_mapping.get("type", "")).startswith("UniLabJsonCommand"): continue action_id = f"/devices/{device_id_abs}/{action_name}" if action_id not in self._action_clients: From 540c5e94b78f8e5faa05b754bf3449b68b8c54e5 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Wed, 16 Jul 2025 09:46:32 +0800 Subject: [PATCH 19/19] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E8=A1=A8=E7=89=88=E6=9C=AC=E5=8F=82=E6=95=B0=EF=BC=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=B0=86auto-=E6=8C=87=E4=BB=A4=E4=BA=BA=E5=B7=A5?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=90=8E=E9=9D=9Eauto=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E7=94=9F=E6=88=90=E4=BA=BA=E5=B7=A5=E5=B7=B2=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E7=9A=84=E6=8C=87=E4=BB=A4=EF=BC=8C=E5=8F=96=E6=B6=88=E4=B8=8D?= =?UTF-8?q?=E5=BF=85=E8=A6=81=E7=9A=84description=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unilabos/registry/device_comms/serial.yaml | 1 + unilabos/registry/devices/camera.yaml | 1 + .../devices/characterization_optic.yaml | 6 +- unilabos/registry/devices/hotel.yaml | 1 + .../registry/devices/laiyu_add_solid.yaml | 15 +-- unilabos/registry/devices/liquid_handler.yaml | 68 ++++++------- unilabos/registry/devices/mock_devices.yaml | 96 ++++++++++--------- unilabos/registry/devices/moveit_config.yaml | 14 +-- .../devices/organic_miscellaneous.yaml | 8 +- unilabos/registry/devices/pump_and_valve.yaml | 9 +- unilabos/registry/devices/robot_agv.yaml | 3 +- unilabos/registry/devices/robot_arm.yaml | 3 +- unilabos/registry/devices/robot_gripper.yaml | 6 +- .../registry/devices/robot_linear_motion.yaml | 8 +- unilabos/registry/devices/sim_nodes.yaml | 1 + unilabos/registry/devices/temperature.yaml | 13 ++- .../registry/devices/vacuum_and_purge.yaml | 14 +-- unilabos/registry/devices/virtual_device.yaml | 67 +++++++------ unilabos/registry/devices/work_station.yaml | 53 +++++----- unilabos/registry/devices/zhida_hplc.yaml | 7 +- unilabos/registry/registry.py | 11 ++- unilabos/ros/msgs/message_converter.py | 5 +- 22 files changed, 233 insertions(+), 177 deletions(-) diff --git a/unilabos/registry/device_comms/serial.yaml b/unilabos/registry/device_comms/serial.yaml index 97e6051..4e8f776 100644 --- a/unilabos/registry/device_comms/serial.yaml +++ b/unilabos/registry/device_comms/serial.yaml @@ -100,3 +100,4 @@ serial: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/camera.yaml b/unilabos/registry/devices/camera.yaml index 788e714..3e9cb1d 100644 --- a/unilabos/registry/devices/camera.yaml +++ b/unilabos/registry/devices/camera.yaml @@ -67,3 +67,4 @@ camera: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/characterization_optic.yaml b/unilabos/registry/devices/characterization_optic.yaml index a627c9e..88be207 100644 --- a/unilabos/registry/devices/characterization_optic.yaml +++ b/unilabos/registry/devices/characterization_optic.yaml @@ -131,7 +131,7 @@ hplc.agilent: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -215,6 +215,7 @@ hplc.agilent: - finish_status - data_file type: object + version: 0.0.1 raman_home_made: class: action_value_mappings: @@ -340,7 +341,7 @@ raman_home_made: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -401,3 +402,4 @@ raman_home_made: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/hotel.yaml b/unilabos/registry/devices/hotel.yaml index 95d23bd..98a6785 100644 --- a/unilabos/registry/devices/hotel.yaml +++ b/unilabos/registry/devices/hotel.yaml @@ -29,3 +29,4 @@ hotel.thermo_orbitor_rs2_hotel: model: mesh: thermo_orbitor_rs2_hotel type: device + version: 0.0.1 diff --git a/unilabos/registry/devices/laiyu_add_solid.yaml b/unilabos/registry/devices/laiyu_add_solid.yaml index 5421a5f..07c802b 100644 --- a/unilabos/registry/devices/laiyu_add_solid.yaml +++ b/unilabos/registry/devices/laiyu_add_solid.yaml @@ -15,7 +15,7 @@ laiyu_add_solid: result: actual_mass_mg: actual_mass_mg schema: - description: 向目标粉筒位置添加固体粉末。该函数通过Modbus RTU协议与设备通信,控制粉末分装机将指定质量的粉末添加到目标粉筒位置。支持精确称量和批量处理,适用于实验室化学试剂的自动分装。 + description: '' properties: feedback: properties: {} @@ -114,7 +114,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 执行出料操作,传入出料质量(单位0.1mg) + description: '' properties: feedback: properties: {} @@ -154,7 +154,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 移动到某个孔板位置。 + description: '' properties: feedback: properties: {} @@ -198,7 +198,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 按照坐标移动,单位为0.1mm + description: '' properties: feedback: properties: {} @@ -244,7 +244,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 装载粉筒,传入粉筒编号 + description: '' properties: feedback: properties: {} @@ -286,7 +286,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 放回粉筒 + description: '' properties: feedback: properties: {} @@ -326,7 +326,7 @@ laiyu_add_solid: handles: [] result: {} schema: - description: 重置指令 + description: '' properties: feedback: properties: {} @@ -379,3 +379,4 @@ laiyu_add_solid: required: - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/liquid_handler.yaml b/unilabos/registry/devices/liquid_handler.yaml index 8e56225..3812043 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -88,7 +88,7 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerAdd 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -397,7 +397,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerAspirate 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -770,7 +770,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDiscardTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -853,7 +853,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDispense 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1040,7 +1040,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDropTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1207,7 +1207,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDropTips96 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1371,7 +1371,7 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerMix 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1588,7 +1588,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerMoveLid 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1905,7 +1905,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerMovePlate 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2217,7 +2217,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerMoveResource 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2428,7 +2428,7 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerMoveTo 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2575,7 +2575,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2737,7 +2737,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerPickUpTips96 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2936,7 +2936,7 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerRemove 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3194,7 +3194,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerReturnTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3242,7 +3242,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerReturnTips96 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3329,7 +3329,7 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerStamp 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3617,7 +3617,7 @@ liquid_handler: - 0 handles: [] schema: - description: ROS Action LiquidHandlerTransfer 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4090,7 +4090,7 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerTransfer 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4479,6 +4479,7 @@ liquid_handler: properties: {} required: [] type: object + version: 0.0.1 liquid_handler.biomek: class: action_value_mappings: @@ -4604,7 +4605,7 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: ROS Action LiquidHandlerProtocolCreation 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4673,7 +4674,7 @@ liquid_handler.biomek: label: plate result: {} schema: - description: ROS Action LiquidHandlerIncubateBiomek 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4730,7 +4731,7 @@ liquid_handler.biomek: result: name: name schema: - description: ROS Action LiquidHandlerMoveBiomek 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4787,7 +4788,7 @@ liquid_handler.biomek: label: plate result: {} schema: - description: ROS Action LiquidHandlerOscillateBiomek 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4832,7 +4833,7 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -4903,7 +4904,7 @@ liquid_handler.biomek: label: targets result: {} schema: - description: ROS Action LiquidHandlerTransferBiomek 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -5082,7 +5083,7 @@ liquid_handler.biomek: label: Liquid Output result: {} schema: - description: ROS Action LiquidHandlerTransfer 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -5455,6 +5456,7 @@ liquid_handler.biomek: required: - success type: object + version: 0.0.1 liquid_handler.prcxi: class: action_value_mappings: @@ -5508,7 +5510,7 @@ liquid_handler.prcxi: handles: [] result: {} schema: - description: ROS Action LiquidHandlerAspirate 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -6170,7 +6172,7 @@ liquid_handler.prcxi: handles: [] result: {} schema: - description: ROS Action LiquidHandlerDispense 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -6352,7 +6354,7 @@ liquid_handler.prcxi: handles: [] result: {} schema: - description: ROS Action LiquidHandlerDropTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -6527,7 +6529,7 @@ liquid_handler.prcxi: handles: [] result: {} schema: - description: ROS Action LiquidHandlerMix 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -6705,7 +6707,7 @@ liquid_handler.prcxi: handles: [] result: {} schema: - description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -6870,6 +6872,7 @@ liquid_handler.prcxi: required: - reset_ok type: object + version: 0.0.1 liquid_handler.revvity: class: action_value_mappings: @@ -6907,7 +6910,7 @@ liquid_handler.revvity: result: success: success schema: - description: ROS Action WorkStationRun 的 JSON Schema + description: '' properties: feedback: properties: @@ -7044,3 +7047,4 @@ liquid_handler.revvity: - success - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/mock_devices.yaml b/unilabos/registry/devices/mock_devices.yaml index be57ffa..5bfe5d7 100644 --- a/unilabos/registry/devices/mock_devices.yaml +++ b/unilabos/registry/devices/mock_devices.yaml @@ -9,7 +9,7 @@ mock_chiller: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -49,7 +49,7 @@ mock_chiller: status: status success: success schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: properties: @@ -100,7 +100,7 @@ mock_chiller: status: status success: success schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: properties: @@ -184,6 +184,7 @@ mock_chiller: - purpose - status_info type: object + version: 0.0.1 mock_filter: class: action_value_mappings: @@ -234,7 +235,7 @@ mock_filter: message: message success: success schema: - description: ROS Action Filter 的 JSON Schema + description: '' properties: feedback: properties: @@ -306,7 +307,7 @@ mock_filter: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -339,7 +340,7 @@ mock_filter: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -442,6 +443,7 @@ mock_filter: - target_volume - status_info type: object + version: 0.0.1 mock_heater: class: action_value_mappings: @@ -501,7 +503,7 @@ mock_heater: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -547,7 +549,7 @@ mock_heater: result: success: success schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: properties: @@ -611,7 +613,7 @@ mock_heater: result: success: success schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: properties: @@ -662,7 +664,7 @@ mock_heater: result: success: success schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: properties: @@ -758,6 +760,7 @@ mock_heater: - stir_speed - status_info type: object + version: 0.0.1 mock_pump: class: action_value_mappings: @@ -789,7 +792,7 @@ mock_pump: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -846,7 +849,7 @@ mock_pump: result: success: success schema: - description: ROS Action PumpTransfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -952,7 +955,7 @@ mock_pump: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -985,7 +988,7 @@ mock_pump: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1116,6 +1119,7 @@ mock_pump: - time_remaining - status_info type: object + version: 0.0.1 mock_rotavap: class: action_value_mappings: @@ -1169,7 +1173,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1210,7 +1214,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1251,7 +1255,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1292,7 +1296,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1333,7 +1337,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1372,7 +1376,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1405,7 +1409,7 @@ mock_rotavap: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1488,6 +1492,7 @@ mock_rotavap: - target_temperature - status_info type: object + version: 0.0.1 mock_separator: class: action_value_mappings: @@ -1529,7 +1534,7 @@ mock_separator: result: success: success schema: - description: ROS Action Separate 的 JSON Schema + description: '' properties: feedback: properties: @@ -1646,7 +1651,7 @@ mock_separator: result: success: success schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1688,7 +1693,7 @@ mock_separator: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1727,7 +1732,7 @@ mock_separator: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1854,6 +1859,7 @@ mock_separator: - time_remaining - status_info type: object + version: 0.0.1 mock_solenoid_valve: class: action_value_mappings: @@ -1905,7 +1911,7 @@ mock_solenoid_valve: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1938,7 +1944,7 @@ mock_solenoid_valve: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1973,7 +1979,7 @@ mock_solenoid_valve: result: success: success schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2030,6 +2036,7 @@ mock_solenoid_valve: - status - valve_status type: object + version: 0.0.1 mock_stirrer: class: action_value_mappings: @@ -2083,7 +2090,7 @@ mock_stirrer: result: success: success schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2124,7 +2131,7 @@ mock_stirrer: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2165,7 +2172,7 @@ mock_stirrer: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2204,7 +2211,7 @@ mock_stirrer: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2237,7 +2244,7 @@ mock_stirrer: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2324,6 +2331,7 @@ mock_stirrer: - max_temperature - status_info type: object + version: 0.0.1 mock_stirrer_new: class: action_value_mappings: @@ -2345,7 +2353,7 @@ mock_stirrer_new: message: message success: success schema: - description: ROS Action StartStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2409,7 +2417,7 @@ mock_stirrer_new: result: success: success schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2462,7 +2470,7 @@ mock_stirrer_new: message: message success: success schema: - description: ROS Action StopStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2564,6 +2572,7 @@ mock_stirrer_new: - progress - status_info type: object + version: 0.0.1 mock_vacuum: class: action_value_mappings: @@ -2595,7 +2604,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2630,7 +2639,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2669,7 +2678,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2704,7 +2713,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2743,7 +2752,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2776,7 +2785,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2809,7 +2818,7 @@ mock_vacuum: result: success: success schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -2888,3 +2897,4 @@ mock_vacuum: - max_pump_speed - status_info type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/moveit_config.yaml b/unilabos/registry/devices/moveit_config.yaml index 2166887..3823524 100644 --- a/unilabos/registry/devices/moveit_config.yaml +++ b/unilabos/registry/devices/moveit_config.yaml @@ -198,7 +198,7 @@ moveit.arm_slider: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -241,7 +241,7 @@ moveit.arm_slider: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -284,7 +284,7 @@ moveit.arm_slider: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -346,6 +346,7 @@ moveit.arm_slider: model: mesh: arm_slider type: device + version: 0.0.1 moveit.toyo_xyz: class: action_value_mappings: @@ -546,7 +547,7 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -589,7 +590,7 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -632,7 +633,7 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -694,3 +695,4 @@ moveit.toyo_xyz: model: mesh: toyo_xyz type: device + version: 0.0.1 diff --git a/unilabos/registry/devices/organic_miscellaneous.yaml b/unilabos/registry/devices/organic_miscellaneous.yaml index 041bfb0..aca63df 100644 --- a/unilabos/registry/devices/organic_miscellaneous.yaml +++ b/unilabos/registry/devices/organic_miscellaneous.yaml @@ -103,7 +103,7 @@ rotavap.one: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -158,6 +158,7 @@ rotavap.one: properties: {} required: [] type: object + version: 0.0.1 separator.homemade: class: action_value_mappings: @@ -248,7 +249,7 @@ separator.homemade: result: success: success schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: properties: @@ -299,7 +300,7 @@ separator.homemade: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -360,3 +361,4 @@ separator.homemade: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/pump_and_valve.yaml b/unilabos/registry/devices/pump_and_valve.yaml index 72e3e16..18fbd14 100644 --- a/unilabos/registry/devices/pump_and_valve.yaml +++ b/unilabos/registry/devices/pump_and_valve.yaml @@ -134,7 +134,7 @@ solenoid_valve: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -191,6 +191,7 @@ solenoid_valve: - status - valve_position type: object + version: 0.0.1 solenoid_valve.mock: class: action_value_mappings: @@ -265,7 +266,7 @@ solenoid_valve.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -297,7 +298,7 @@ solenoid_valve.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -358,6 +359,7 @@ solenoid_valve.mock: - status - valve_position type: object + version: 0.0.1 syringe_pump_with_valve.runze: class: action_value_mappings: @@ -802,3 +804,4 @@ syringe_pump_with_valve.runze: - position - plunger_position type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/robot_agv.yaml b/unilabos/registry/devices/robot_agv.yaml index 7f04d9c..d947de6 100644 --- a/unilabos/registry/devices/robot_agv.yaml +++ b/unilabos/registry/devices/robot_agv.yaml @@ -43,7 +43,7 @@ agv.SEER: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -103,3 +103,4 @@ agv.SEER: - pose - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/robot_arm.yaml b/unilabos/registry/devices/robot_arm.yaml index de5b677..82fa0dd 100644 --- a/unilabos/registry/devices/robot_arm.yaml +++ b/unilabos/registry/devices/robot_arm.yaml @@ -99,7 +99,7 @@ robotic_arm.UR: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -170,3 +170,4 @@ robotic_arm.UR: - arm_status - gripper_status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/robot_gripper.yaml b/unilabos/registry/devices/robot_gripper.yaml index 03592b6..383bcff 100644 --- a/unilabos/registry/devices/robot_gripper.yaml +++ b/unilabos/registry/devices/robot_gripper.yaml @@ -379,7 +379,7 @@ gripper.misumi_rz: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -444,6 +444,7 @@ gripper.misumi_rz: required: - status type: object + version: 0.0.1 gripper.mock: class: action_value_mappings: @@ -497,7 +498,7 @@ gripper.mock: effort: torque position: position schema: - description: ROS Action GripperCommand 的 JSON Schema + description: '' properties: feedback: properties: @@ -586,3 +587,4 @@ gripper.mock: - torque - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/robot_linear_motion.yaml b/unilabos/registry/devices/robot_linear_motion.yaml index 52f673e..c33cace 100644 --- a/unilabos/registry/devices/robot_linear_motion.yaml +++ b/unilabos/registry/devices/robot_linear_motion.yaml @@ -114,7 +114,7 @@ linear_motion.grbl: handles: [] result: {} schema: - description: ROS Action NavigateThroughPoses 的 JSON Schema + description: '' properties: feedback: properties: @@ -346,7 +346,7 @@ linear_motion.grbl: handles: [] result: {} schema: - description: ROS Action SingleJointPosition 的 JSON Schema + description: '' properties: feedback: properties: @@ -466,6 +466,7 @@ linear_motion.grbl: - position - spindle_speed type: object + version: 0.0.1 motor.iCL42: class: action_value_mappings: @@ -563,7 +564,7 @@ motor.iCL42: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -630,3 +631,4 @@ motor.iCL42: - is_executing_run - success type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/sim_nodes.yaml b/unilabos/registry/devices/sim_nodes.yaml index c2bfa44..4476a02 100644 --- a/unilabos/registry/devices/sim_nodes.yaml +++ b/unilabos/registry/devices/sim_nodes.yaml @@ -309,3 +309,4 @@ lh_joint_publisher: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/temperature.yaml b/unilabos/registry/devices/temperature.yaml index 7eb157c..2da45fd 100644 --- a/unilabos/registry/devices/temperature.yaml +++ b/unilabos/registry/devices/temperature.yaml @@ -119,7 +119,7 @@ chiller: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -174,6 +174,7 @@ chiller: properties: {} required: [] type: object + version: 0.0.1 heaterstirrer.dalong: class: action_value_mappings: @@ -268,7 +269,7 @@ heaterstirrer.dalong: result: success: success schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: properties: @@ -327,7 +328,7 @@ heaterstirrer.dalong: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -371,7 +372,7 @@ heaterstirrer.dalong: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -449,6 +450,7 @@ heaterstirrer.dalong: - temp_warning - temp_target type: object + version: 0.0.1 tempsensor: class: action_value_mappings: @@ -570,7 +572,7 @@ tempsensor: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -635,3 +637,4 @@ tempsensor: required: - value type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/vacuum_and_purge.yaml b/unilabos/registry/devices/vacuum_and_purge.yaml index e284f38..85aefdc 100644 --- a/unilabos/registry/devices/vacuum_and_purge.yaml +++ b/unilabos/registry/devices/vacuum_and_purge.yaml @@ -48,7 +48,7 @@ gas_source.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -80,7 +80,7 @@ gas_source.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -114,7 +114,7 @@ gas_source.mock: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -173,6 +173,7 @@ gas_source.mock: required: - status type: object + version: 0.0.1 vacuum_pump.mock: class: action_value_mappings: @@ -223,7 +224,7 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -255,7 +256,7 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -289,7 +290,7 @@ vacuum_pump.mock: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -348,3 +349,4 @@ vacuum_pump.mock: required: - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/virtual_device.yaml b/unilabos/registry/devices/virtual_device.yaml index 095628c..d8f8f19 100644 --- a/unilabos/registry/devices/virtual_device.yaml +++ b/unilabos/registry/devices/virtual_device.yaml @@ -62,7 +62,7 @@ virtual_centrifuge: message: message success: success schema: - description: ROS Action Centrifuge 的 JSON Schema + description: '' properties: feedback: properties: @@ -192,6 +192,7 @@ virtual_centrifuge: - progress - message type: object + version: 0.0.1 virtual_column: class: action_value_mappings: @@ -254,7 +255,7 @@ virtual_column: return_info: current_status success: success schema: - description: ROS Action RunColumn 的 JSON Schema + description: '' properties: feedback: properties: @@ -371,6 +372,7 @@ virtual_column: - progress - current_status type: object + version: 0.0.1 virtual_filter: class: action_value_mappings: @@ -442,7 +444,7 @@ virtual_filter: return_info: message success: success schema: - description: ROS Action Filter 的 JSON Schema + description: '' properties: feedback: properties: @@ -585,6 +587,7 @@ virtual_filter: - max_stir_speed - max_volume type: object + version: 0.0.1 virtual_gas_source: class: action_value_mappings: @@ -675,7 +678,7 @@ virtual_gas_source: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -707,7 +710,7 @@ virtual_gas_source: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -741,7 +744,7 @@ virtual_gas_source: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -803,6 +806,7 @@ virtual_gas_source: required: - status type: object + version: 0.0.1 virtual_heatchill: class: action_value_mappings: @@ -867,7 +871,7 @@ virtual_heatchill: result: success: success schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: properties: @@ -931,7 +935,7 @@ virtual_heatchill: result: success: success schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: properties: @@ -982,7 +986,7 @@ virtual_heatchill: result: success: success schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: properties: @@ -1063,6 +1067,7 @@ virtual_heatchill: - stir_speed - remaining_time type: object + version: 0.0.1 virtual_multiway_valve: class: action_value_mappings: @@ -1272,7 +1277,7 @@ virtual_multiway_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -1316,7 +1321,7 @@ virtual_multiway_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -1483,6 +1488,7 @@ virtual_multiway_valve: - flow_path - info type: object + version: 0.0.1 virtual_pump: class: action_value_mappings: @@ -1577,7 +1583,7 @@ virtual_pump: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -1637,7 +1643,7 @@ virtual_pump: result: success: success schema: - description: ROS Action PumpTransfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -1801,6 +1807,7 @@ virtual_pump: - transferred_volume - current_status type: object + version: 0.0.1 virtual_rotavap: class: action_value_mappings: @@ -1867,7 +1874,7 @@ virtual_rotavap: message: message success: success schema: - description: ROS Action Evaporate 的 JSON Schema + description: '' properties: feedback: properties: @@ -2035,6 +2042,7 @@ virtual_rotavap: - max_rotation_speed - remaining_time type: object + version: 0.0.1 virtual_separator: class: action_value_mappings: @@ -2115,7 +2123,7 @@ virtual_separator: message: message success: success schema: - description: ROS Action Separate 的 JSON Schema + description: '' properties: feedback: properties: @@ -2309,6 +2317,7 @@ virtual_separator: - progress - message type: object + version: 0.0.1 virtual_solenoid_valve: class: action_value_mappings: @@ -2422,7 +2431,7 @@ virtual_solenoid_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -2466,7 +2475,7 @@ virtual_solenoid_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -2510,7 +2519,7 @@ virtual_solenoid_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -2554,7 +2563,7 @@ virtual_solenoid_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: properties: @@ -2643,6 +2652,7 @@ virtual_solenoid_valve: - valve_position - state type: object + version: 0.0.1 virtual_stirrer: class: action_value_mappings: @@ -2701,7 +2711,7 @@ virtual_stirrer: result: success: success schema: - description: ROS Action StartStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2765,7 +2775,7 @@ virtual_stirrer: result: success: success schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2816,7 +2826,7 @@ virtual_stirrer: result: success: success schema: - description: ROS Action StopStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2907,6 +2917,7 @@ virtual_stirrer: - is_stirring - remaining_time type: object + version: 0.0.1 virtual_transfer_pump: class: action_value_mappings: @@ -3204,7 +3215,7 @@ virtual_transfer_pump: message: message success: success schema: - description: ROS Action SetPumpPosition 的 JSON Schema + description: '' properties: feedback: properties: @@ -3282,7 +3293,7 @@ virtual_transfer_pump: message: message success: success schema: - description: ROS Action Transfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -3409,6 +3420,7 @@ virtual_transfer_pump: - remaining_capacity - pump_info type: object + version: 0.0.1 virtual_vacuum_pump: class: action_value_mappings: @@ -3499,7 +3511,7 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3531,7 +3543,7 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3565,7 +3577,7 @@ virtual_vacuum_pump: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -3627,3 +3639,4 @@ virtual_vacuum_pump: required: - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/work_station.yaml b/unilabos/registry/devices/work_station.yaml index dbfe017..91e4c4f 100644 --- a/unilabos/registry/devices/work_station.yaml +++ b/unilabos/registry/devices/work_station.yaml @@ -54,7 +54,7 @@ workstation: handles: [] result: {} schema: - description: ROS Action AGVTransfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -283,7 +283,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Add 的 JSON Schema + description: '' properties: feedback: properties: @@ -380,7 +380,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action AdjustPH 的 JSON Schema + description: '' properties: feedback: properties: @@ -453,7 +453,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Centrifuge 的 JSON Schema + description: '' properties: feedback: properties: @@ -542,7 +542,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Clean 的 JSON Schema + description: '' properties: feedback: properties: @@ -659,7 +659,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action CleanVessel 的 JSON Schema + description: '' properties: feedback: properties: @@ -751,7 +751,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Dissolve 的 JSON Schema + description: '' properties: feedback: properties: @@ -832,7 +832,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Dry 的 JSON Schema + description: '' properties: feedback: properties: @@ -900,7 +900,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action EvacuateAndRefill 的 JSON Schema + description: '' properties: feedback: properties: @@ -1006,7 +1006,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Evaporate 的 JSON Schema + description: '' properties: feedback: properties: @@ -1130,7 +1130,7 @@ workstation: label: Filtrate Vessel result: {} schema: - description: ROS Action Filter 的 JSON Schema + description: '' properties: feedback: properties: @@ -1242,7 +1242,7 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action FilterThrough 的 JSON Schema + description: '' properties: feedback: properties: @@ -1333,7 +1333,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: properties: @@ -1407,7 +1407,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: properties: @@ -1468,7 +1468,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: properties: @@ -1527,7 +1527,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Hydrogenate 的 JSON Schema + description: '' properties: feedback: properties: @@ -1627,7 +1627,7 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action PumpTransfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -1764,7 +1764,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Recrystallize 的 JSON Schema + description: '' properties: feedback: properties: @@ -1832,7 +1832,7 @@ workstation: output: [] result: {} schema: - description: ROS Action ResetHandling 的 JSON Schema + description: '' properties: feedback: properties: @@ -1907,7 +1907,7 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action RunColumn 的 JSON Schema + description: '' properties: feedback: properties: @@ -2013,7 +2013,7 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action Separate 的 JSON Schema + description: '' properties: feedback: properties: @@ -2145,7 +2145,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action StartStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2219,7 +2219,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2280,7 +2280,7 @@ workstation: label: Vessel result: {} schema: - description: ROS Action StopStir 的 JSON Schema + description: '' properties: feedback: properties: @@ -2374,7 +2374,7 @@ workstation: label: To Vessel result: {} schema: - description: ROS Action Transfer 的 JSON Schema + description: '' properties: feedback: properties: @@ -2498,7 +2498,7 @@ workstation: label: Filtrate Vessel result: {} schema: - description: ROS Action WashSolid 的 JSON Schema + description: '' properties: feedback: properties: @@ -2679,3 +2679,4 @@ workstation: properties: {} required: [] type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/zhida_hplc.yaml b/unilabos/registry/devices/zhida_hplc.yaml index 62f1e06..dc1e013 100644 --- a/unilabos/registry/devices/zhida_hplc.yaml +++ b/unilabos/registry/devices/zhida_hplc.yaml @@ -8,7 +8,7 @@ zhida_hplc: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -80,7 +80,7 @@ zhida_hplc: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -114,7 +114,7 @@ zhida_hplc: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: '' properties: feedback: properties: {} @@ -177,3 +177,4 @@ zhida_hplc: - status - methods type: object + version: 0.0.1 diff --git a/unilabos/registry/registry.py b/unilabos/registry/registry.py index 7725cec..f496e0f 100644 --- a/unilabos/registry/registry.py +++ b/unilabos/registry/registry.py @@ -65,7 +65,7 @@ class Registry: }, "feedback": {}, "result": {"success": "success"}, - "schema": ros_action_to_json_schema(self.ResourceCreateFromOuter), + "schema": ros_action_to_json_schema(self.ResourceCreateFromOuter, '用于创建或更新物料资源,每次传入多个物料信息。'), "goal_default": yaml.safe_load( io.StringIO(get_yaml_from_goal_type(self.ResourceCreateFromOuter.Goal)) ), @@ -86,7 +86,7 @@ class Registry: }, "feedback": {}, "result": {"success": "success"}, - "schema": ros_action_to_json_schema(self.ResourceCreateFromOuterEasy), + "schema": ros_action_to_json_schema(self.ResourceCreateFromOuterEasy, '用于创建或更新物料资源,每次传入一个物料信息。'), "goal_default": yaml.safe_load( io.StringIO(get_yaml_from_goal_type(self.ResourceCreateFromOuterEasy.Goal)) ), @@ -113,12 +113,13 @@ class Registry: "goal": {}, "feedback": {}, "result": {"latency_ms": "latency_ms", "time_diff_ms": "time_diff_ms"}, - "schema": ros_action_to_json_schema(self.EmptyIn), + "schema": ros_action_to_json_schema(self.EmptyIn, '用于测试延迟的动作,返回延迟时间和时间差。'), "goal_default": {}, "handles": {}, }, }, }, + "version": "0.0.1", "icon": "icon_device.webp", "registry_type": "device", "handles": [], @@ -367,6 +368,8 @@ class Registry: # 在添加到注册表前处理类型替换 for device_id, device_config in data.items(): # 添加文件路径信息 - 使用规范化的完整文件路径 + if "version" not in device_config: + device_config["version"] = "0.0.1" if "description" not in device_config: device_config["description"] = "" if "icon" not in device_config: @@ -499,8 +502,6 @@ class Registry: } if "registry_type" not in device_config: device_config["registry_type"] = "device" - if "version" not in device_config: - device_config["version"] = "0.0.1" device_config["file_path"] = str(file.absolute()).replace("\\", "/") device_config["registry_type"] = "device" logger.debug( diff --git a/unilabos/ros/msgs/message_converter.py b/unilabos/ros/msgs/message_converter.py index 5e0bb08..230ad1f 100644 --- a/unilabos/ros/msgs/message_converter.py +++ b/unilabos/ros/msgs/message_converter.py @@ -717,12 +717,13 @@ def ros_message_to_json_schema(msg_class: Any) -> Dict[str, Any]: return schema -def ros_action_to_json_schema(action_class: Any) -> Dict[str, Any]: +def ros_action_to_json_schema(action_class: Any, description="") -> Dict[str, Any]: """ 将 ROS Action 类转换为 JSON Schema Args: action_class: ROS Action 类 + description: 描述 Returns: 完整的 JSON Schema 定义 @@ -737,7 +738,7 @@ def ros_action_to_json_schema(action_class: Any) -> Dict[str, Any]: # 创建基础 schema schema = { "title": action_class.__name__, - "description": f"ROS Action {action_class.__name__} 的 JSON Schema", + "description": description, "type": "object", "properties": { "goal": {