diff --git a/.gitignore b/.gitignore index b6ca0d4..728d704 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +configs/ +temp/ ## Python # Byte-compiled / optimized / DLL files diff --git a/test/experiments/prcxi.json b/test/experiments/prcxi.json new file mode 100644 index 0000000..b483a3a --- /dev/null +++ b/test/experiments/prcxi.json @@ -0,0 +1,217 @@ +{ + "nodes": [ + { + "id": "PRCXI", + "name": "PRCXI", + "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": "192.168.3.9", + "port": 9999, + "timeout": 10.0, + "setup": false, + "debug": true + }, + "data": {}, + "children": [ + "deck" + ] + }, + { + "id": "deck", + "name": "deck", + "sample_id": null, + "children": [ + "rackT1", + "plateT2", + "plateT3", + "rackT4", + "plateT5", + "plateT6" + ], + "parent": "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" + } + } + }, + { + "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": [] +} \ No newline at end of file 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) diff --git a/unilabos/app/mq.py b/unilabos/app/mq.py index 12ec2c0..3969ec4 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.debug(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/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 4faa042..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 # --------------------------------------------------------------- @@ -183,7 +185,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..e711993 100644 --- a/unilabos/devices/liquid_handling/prcxi/prcxi.py +++ b/unilabos/devices/liquid_handling/prcxi/prcxi.py @@ -1,23 +1,667 @@ -import socket, json, contextlib -from typing import Any, List, Dict, Optional +import asyncio +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, TipSpot, Trash + +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): + @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, debug=False): + 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, debug) + 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): + return 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 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) + + 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 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, + 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) + + 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 + _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 = [] + + def __init__( + self, + tablets_info: list[WorkTablets], + host: str = "127.0.0.1", + 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, 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 + 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"{int(run_time)}", + MatrixName=f"protocol_{run_time}", + MatrixCount=len(self.tablets_info), + WorkTablets=self.tablets_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) + return 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") + 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}. " + "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.""" + + 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, + 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 drop_tips(self, ops: List[Drop], use_channels: List[int] = None): + + """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, + 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 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] = [], + ): + + """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=mix_vol, + plate_no=PlateNo, + is_whole_plate=False, + hole_row=1, + hole_col=hole_col, + 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", + ) + self.steps_todo_list.append(step) + + async def aspirate(self, ops: List[SingleChannelAspiration], use_channels: List[int] = None): + + """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]), + 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): + + """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]), + 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, 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)) @@ -30,17 +674,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 +708,58 @@ 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 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") + 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 +775,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 +794,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 +814,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 +833,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 +853,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 +872,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 +892,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 +911,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 +931,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 +950,103 @@ class PRCXI9300: "AssistFun4": assist_fun4, "AssistFun5": assist_fun5, "HoleNumbers": hole_numbers, - "LiquidDispensingMethod": liquid_method + "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", + } + }) + 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)) + 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, 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 + 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, + # 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...") + # input("Press Enter to continue...") # Wait for user input before proceeding + # print("PRCXI9300Handler initialized with deck and host settings.") 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( 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 55f5246..3e9cb1d 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: @@ -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 a7fd543..88be207 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: @@ -131,10 +131,9 @@ hplc.agilent: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' 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: @@ -218,6 +215,7 @@ hplc.agilent: - finish_status - data_file type: object + version: 0.0.1 raman_home_made: class: action_value_mappings: @@ -229,7 +227,7 @@ raman_home_made: handles: [] result: {} schema: - description: ccd_time的参数schema + description: 设置CCD检测器积分时间的函数。用于配置拉曼光谱仪的信号采集时间,控制光谱数据的质量和信噪比。较长的积分时间可获得更高的信号强度和更好的光谱质量,但会增加测量时间。该函数允许根据样品特性和测量要求动态调整检测参数,优化测量效果。 properties: feedback: {} goal: @@ -253,7 +251,7 @@ raman_home_made: handles: [] result: {} schema: - description: laser_on_power的参数schema + description: 设置激光器输出功率的函数。用于控制拉曼光谱仪激光器的功率输出,调节激光强度以适应不同样品的测量需求。适当的激光功率能够获得良好的拉曼信号同时避免样品损伤。该函数支持精确的功率控制,确保测量结果的稳定性和重现性。 properties: feedback: {} goal: @@ -269,30 +267,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 +276,7 @@ raman_home_made: handles: [] result: {} schema: - description: raman_without_background的参数schema + description: 执行无背景扣除的拉曼光谱测量函数。用于直接采集样品的拉曼光谱信号,不进行背景校正处理。该函数配置积分时间和激光功率参数,获取原始光谱数据用于后续的数据处理分析。适用于对光谱数据质量要求较高或需要自定义背景处理流程的测量场景。 properties: feedback: {} goal: @@ -332,7 +306,7 @@ raman_home_made: handles: [] result: {} schema: - description: raman_without_background_average的参数schema + description: 执行多次平均的无背景拉曼光谱测量函数。通过多次测量取平均值来提高光谱数据的信噪比和测量精度,减少随机噪声影响。该函数支持自定义平均次数、积分时间、激光功率等参数,并可为样品指定名称便于数据管理。适用于对测量精度要求较高的定量分析和研究应用。 properties: feedback: {} goal: @@ -367,10 +341,9 @@ raman_home_made: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -379,7 +352,6 @@ raman_home_made: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -388,7 +360,6 @@ raman_home_made: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -407,7 +378,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: @@ -431,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 e5cfc06..98a6785 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: @@ -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 02b8014..07c802b 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: '' 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: '' 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: '' 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: @@ -580,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 ea14223..3812043 100644 --- a/unilabos/registry/devices/liquid_handler.yaml +++ b/unilabos/registry/devices/liquid_handler.yaml @@ -88,16 +88,14 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerAdd 的 JSON Schema + description: '' 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 @@ -400,16 +397,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerAspirate 的 JSON Schema + description: '' 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: @@ -1022,16 +770,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDiscardTips 的 JSON Schema + description: '' 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 @@ -1108,16 +853,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDispense 的 JSON Schema + description: '' 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 @@ -1298,16 +1040,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDropTips 的 JSON Schema + description: '' 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 @@ -1468,16 +1207,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerDropTips96 的 JSON Schema + description: '' 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 @@ -1635,16 +1371,14 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerMix 的 JSON Schema + description: '' 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 @@ -1855,16 +1588,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerMoveLid 的 JSON Schema + description: '' 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 @@ -2175,16 +1905,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerMovePlate 的 JSON Schema + description: '' 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 @@ -2490,16 +2217,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerMoveResource 的 JSON Schema + description: '' 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 @@ -2704,16 +2428,14 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerMoveTo 的 JSON Schema + description: '' 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 @@ -2854,16 +2575,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerPickUpTips 的 JSON Schema + description: '' 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 @@ -3019,16 +2737,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerPickUpTips96 的 JSON Schema + description: '' 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 @@ -3221,16 +2936,14 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerRemove 的 JSON Schema + description: '' 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 @@ -3482,16 +3194,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerReturnTips 的 JSON Schema + description: '' 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 @@ -3533,16 +3242,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerReturnTips96 的 JSON Schema + description: '' 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 @@ -3623,16 +3329,14 @@ liquid_handler: result: name: name schema: - description: ROS Action LiquidHandlerStamp 的 JSON Schema + description: '' 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 @@ -3914,16 +3617,14 @@ liquid_handler: - 0 handles: [] schema: - description: ROS Action LiquidHandlerTransfer 的 JSON Schema + description: '' 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 @@ -4390,16 +4090,14 @@ liquid_handler: handles: [] result: {} schema: - description: ROS Action LiquidHandlerTransfer 的 JSON Schema + description: '' 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 @@ -4782,57 +4479,10 @@ liquid_handler: properties: {} required: [] type: object + version: 0.0.1 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 +4535,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 +4583,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: @@ -5192,16 +4605,14 @@ liquid_handler.biomek: handles: [] result: {} schema: - description: ROS Action LiquidHandlerProtocolCreation 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerProtocolCreation_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: none_keys: items: @@ -5230,7 +4641,6 @@ liquid_handler.biomek: title: LiquidHandlerProtocolCreation_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5264,16 +4674,14 @@ liquid_handler.biomek: label: plate result: {} schema: - description: ROS Action LiquidHandlerIncubateBiomek 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerIncubateBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: time: maximum: 2147483647 @@ -5284,7 +4692,6 @@ liquid_handler.biomek: title: LiquidHandlerIncubateBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5324,16 +4731,14 @@ liquid_handler.biomek: result: name: name schema: - description: ROS Action LiquidHandlerMoveBiomek 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerMoveBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: sources: type: string @@ -5345,7 +4750,6 @@ liquid_handler.biomek: title: LiquidHandlerMoveBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5384,16 +4788,14 @@ liquid_handler.biomek: label: plate result: {} schema: - description: ROS Action LiquidHandlerOscillateBiomek 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerOscillateBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: rpm: maximum: 2147483647 @@ -5409,7 +4811,6 @@ liquid_handler.biomek: title: LiquidHandlerOscillateBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5432,22 +4833,19 @@ liquid_handler.biomek: 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 @@ -5506,16 +4904,14 @@ liquid_handler.biomek: label: targets result: {} schema: - description: ROS Action LiquidHandlerTransferBiomek 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerTransferBiomek_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: aspirate_technique: type: string @@ -5539,7 +4935,6 @@ liquid_handler.biomek: title: LiquidHandlerTransferBiomek_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -5688,16 +5083,14 @@ liquid_handler.biomek: label: Liquid Output result: {} schema: - description: ROS Action LiquidHandlerTransfer 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: LiquidHandlerTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: asp_flow_rates: items: @@ -6029,7 +5422,6 @@ liquid_handler.biomek: title: LiquidHandlerTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -6064,45 +5456,1426 @@ liquid_handler.biomek: required: - success type: object -liquid_handler.revvity: + version: 0.0.1 +liquid_handler.prcxi: class: action_value_mappings: - auto-run: + 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: - file_path: null - params: null - resource: - AichemecoHiwo: - id: AichemecoHiwo + 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: run的参数schema + description: '' + properties: + feedback: + properties: {} + required: [] + title: LiquidHandlerAspirate_Feedback + type: object + goal: + 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: + 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: {} + 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: - file_path: + asp_vols: type: string - params: + 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 - resource: - default: - AichemecoHiwo: - id: AichemecoHiwo - type: object required: - - file_path - - params + - asp_vols + - dis_vols + - reagent_sources + - targets type: object result: {} required: - goal - title: run参数 + title: add_liquid参数 + type: object + type: UniLabJsonCommandAsync + auto-create_protocol: + feedback: {} + goal: {} + goal_default: + none_keys: [] + protocol_author: '' + protocol_date: '' + protocol_description: '' + protocol_name: '' + protocol_type: '' + protocol_version: '' + handles: [] + result: {} + schema: + description: create_protocol的参数schema + properties: + feedback: {} + goal: + properties: + none_keys: + 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: [] + 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-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-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-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 + dispense: + feedback: {} + 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 + 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: '' + properties: + feedback: + properties: {} + required: [] + title: LiquidHandlerDispense_Feedback + type: object + goal: + 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: + 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: '' + properties: + feedback: + properties: {} + required: [] + title: LiquidHandlerDropTips_Feedback + type: object + goal: + 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: + 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: + 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 + 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: '' + properties: + feedback: + properties: {} + required: [] + title: LiquidHandlerMix_Feedback + type: object + goal: + 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: + 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: + 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: '' + properties: + feedback: + properties: {} + required: [] + title: LiquidHandlerPickUpTips_Feedback + type: object + goal: + 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: + 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: + reset_ok: bool + type: python + description: prcxi液体处理器设备,基于pylabrobot控制 + handles: [] + icon: icon_yiyezhan.webp + init_param_schema: + config: + properties: + debug: + default: false + type: string + 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: + reset_ok: + type: boolean + required: + - reset_ok + type: object + version: 0.0.1 +liquid_handler.revvity: + class: + action_value_mappings: run: feedback: status: status @@ -6137,10 +6910,9 @@ liquid_handler.revvity: result: success: success schema: - description: ROS Action WorkStationRun 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: gantt: type: string @@ -6152,7 +6924,6 @@ liquid_handler.revvity: title: WorkStationRun_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: params: type: string @@ -6238,7 +7009,6 @@ liquid_handler.revvity: title: WorkStationRun_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -6277,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 ea5c7e8..461fc73 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: {} @@ -85,22 +9,19 @@ mock_chiller: result: success: success 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 @@ -128,10 +49,9 @@ mock_chiller: status: status success: success schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' 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 @@ -182,10 +100,9 @@ mock_chiller: status: status success: success schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' 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 @@ -269,6 +184,7 @@ mock_chiller: - purpose - status_info type: object + version: 0.0.1 mock_filter: class: action_value_mappings: @@ -292,94 +208,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 @@ -407,10 +235,9 @@ mock_filter: message: message success: success schema: - description: ROS Action Filter 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -428,7 +255,6 @@ mock_filter: title: Filter_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: continue_heatchill: type: boolean @@ -455,7 +281,6 @@ mock_filter: title: Filter_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -482,22 +307,19 @@ mock_filter: result: success: success 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 @@ -518,22 +340,19 @@ mock_filter: result: success: success 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 @@ -624,129 +443,10 @@ mock_filter: - target_volume - status_info type: object + version: 0.0.1 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: {} @@ -803,22 +503,19 @@ mock_heater: result: success: success 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 @@ -856,10 +553,9 @@ mock_heater: result: success: success schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -868,7 +564,6 @@ mock_heater: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: pressure: type: string @@ -904,7 +599,6 @@ mock_heater: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -938,10 +632,9 @@ mock_heater: result: success: success schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -950,7 +643,6 @@ mock_heater: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -965,7 +657,6 @@ mock_heater: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -992,10 +683,9 @@ mock_heater: result: success: success schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1004,7 +694,6 @@ mock_heater: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -1013,7 +702,6 @@ mock_heater: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1091,6 +779,7 @@ mock_heater: - stir_speed - status_info type: object + version: 0.0.1 mock_pump: class: action_value_mappings: @@ -1114,126 +803,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: {} @@ -1242,22 +811,19 @@ mock_pump: result: success: success 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 @@ -1307,10 +873,9 @@ mock_pump: result: success: success schema: - description: ROS Action PumpTransfer 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -1354,7 +919,6 @@ mock_pump: title: PumpTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -1407,7 +971,6 @@ mock_pump: title: PumpTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1431,22 +994,19 @@ mock_pump: result: success: success 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 @@ -1467,22 +1027,19 @@ mock_pump: result: success: success 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 @@ -1601,6 +1158,7 @@ mock_pump: - time_remaining - status_info type: object + version: 0.0.1 mock_rotavap: class: action_value_mappings: @@ -1624,166 +1182,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: {} @@ -1814,16 +1212,14 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1832,7 +1228,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1858,16 +1253,14 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1876,7 +1269,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1902,16 +1294,14 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1920,7 +1310,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1946,16 +1335,14 @@ mock_rotavap: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -1964,7 +1351,6 @@ mock_rotavap: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1990,16 +1376,14 @@ mock_rotavap: result: success: success 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 @@ -2008,7 +1392,6 @@ mock_rotavap: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2032,22 +1415,19 @@ mock_rotavap: result: success: success 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 @@ -2068,22 +1448,19 @@ mock_rotavap: result: success: success 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 @@ -2154,149 +1531,10 @@ mock_rotavap: - target_temperature - status_info type: object + version: 0.0.1 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 @@ -2339,10 +1577,9 @@ mock_separator: result: success: success schema: - description: ROS Action Separate 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2386,7 +1623,6 @@ mock_separator: title: Separate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_vessel: type: string @@ -2445,7 +1681,6 @@ mock_separator: title: Separate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2474,16 +1709,14 @@ mock_separator: result: success: success 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 @@ -2492,7 +1725,6 @@ mock_separator: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2519,16 +1751,14 @@ mock_separator: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -2537,7 +1767,6 @@ mock_separator: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2561,22 +1790,19 @@ mock_separator: result: success: success 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 @@ -2691,29 +1917,10 @@ mock_separator: - time_remaining - status_info type: object + version: 0.0.1 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: {} @@ -2754,50 +1961,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: {} @@ -2806,22 +1969,19 @@ mock_solenoid_valve: result: success: success 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 @@ -2842,22 +2002,19 @@ mock_solenoid_valve: result: success: success 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 @@ -2880,16 +2037,14 @@ mock_solenoid_valve: result: success: success 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 @@ -2898,7 +2053,6 @@ mock_solenoid_valve: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2940,6 +2094,7 @@ mock_solenoid_valve: - status - valve_status type: object + version: 0.0.1 mock_stirrer: class: action_value_mappings: @@ -2963,98 +2118,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: {} @@ -3075,26 +2138,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: @@ -3105,16 +2148,14 @@ mock_stirrer: result: success: success 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 @@ -3123,7 +2164,6 @@ mock_stirrer: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3149,16 +2189,14 @@ mock_stirrer: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -3167,7 +2205,6 @@ mock_stirrer: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3193,16 +2230,14 @@ mock_stirrer: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -3211,7 +2246,6 @@ mock_stirrer: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3235,22 +2269,19 @@ mock_stirrer: result: success: success 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 @@ -3271,22 +2302,19 @@ mock_stirrer: result: success: success 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 @@ -3361,97 +2389,10 @@ mock_stirrer: - max_temperature - status_info type: object + version: 0.0.1 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 @@ -3470,10 +2411,9 @@ mock_stirrer_new: message: message success: success schema: - description: ROS Action StartStir 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -3488,7 +2428,6 @@ mock_stirrer_new: title: StartStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -3503,7 +2442,6 @@ mock_stirrer_new: title: StartStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3541,10 +2479,9 @@ mock_stirrer_new: result: success: success schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3553,7 +2490,6 @@ mock_stirrer_new: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: event: type: string @@ -3580,7 +2516,6 @@ mock_stirrer_new: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3612,10 +2547,9 @@ mock_stirrer_new: message: message success: success schema: - description: ROS Action StopStir 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -3627,7 +2561,6 @@ mock_stirrer_new: title: StopStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -3636,7 +2569,6 @@ mock_stirrer_new: title: StopStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3717,6 +2649,7 @@ mock_stirrer_new: - progress - status_info type: object + version: 0.0.1 mock_vacuum: class: action_value_mappings: @@ -3740,154 +2673,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: {} @@ -3896,22 +2681,19 @@ mock_vacuum: result: success: success 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 @@ -3934,16 +2716,14 @@ mock_vacuum: result: success: success 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 @@ -3952,7 +2732,6 @@ mock_vacuum: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3976,22 +2755,19 @@ mock_vacuum: result: success: success 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 @@ -4014,16 +2790,14 @@ mock_vacuum: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -4032,7 +2806,6 @@ mock_vacuum: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4056,22 +2829,19 @@ mock_vacuum: result: success: success 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 @@ -4092,22 +2862,19 @@ mock_vacuum: result: success: success 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 @@ -4128,22 +2895,19 @@ mock_vacuum: result: success: success 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 @@ -4210,3 +2974,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 e556bc8..3823524 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: {} @@ -270,10 +198,9 @@ moveit.arm_slider: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' 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 @@ -316,10 +241,9 @@ moveit.arm_slider: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' 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 @@ -362,10 +284,9 @@ moveit.arm_slider: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' 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: @@ -427,6 +346,7 @@ moveit.arm_slider: model: mesh: arm_slider type: device + version: 0.0.1 moveit.toyo_xyz: class: action_value_mappings: @@ -546,30 +466,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 +518,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: {} @@ -699,10 +547,9 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -711,7 +558,6 @@ moveit.toyo_xyz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -720,7 +566,6 @@ moveit.toyo_xyz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -745,10 +590,9 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -757,7 +601,6 @@ moveit.toyo_xyz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -766,7 +609,6 @@ moveit.toyo_xyz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -791,10 +633,9 @@ moveit.toyo_xyz: handles: [] result: {} schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -803,7 +644,6 @@ moveit.toyo_xyz: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -812,7 +652,6 @@ moveit.toyo_xyz: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -831,7 +670,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: @@ -856,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 9549705..3ac61fc 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: @@ -127,10 +103,9 @@ rotavap.one: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' 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: @@ -185,6 +158,7 @@ rotavap.one: properties: {} required: [] type: object + version: 0.0.1 separator.homemade: class: action_value_mappings: @@ -208,38 +182,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 +210,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: {} @@ -335,10 +253,9 @@ separator.homemade: result: success: success schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -347,7 +264,6 @@ separator.homemade: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: event: type: string @@ -374,7 +290,6 @@ separator.homemade: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -401,13 +316,12 @@ separator.homemade: goal_default: command: '' handles: [] - result": + result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -416,7 +330,6 @@ separator.homemade: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -425,7 +338,6 @@ separator.homemade: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -444,7 +356,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: @@ -468,3 +380,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 dc50dde..18fbd14 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: @@ -158,16 +134,14 @@ solenoid_valve: 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 @@ -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: @@ -218,29 +191,10 @@ solenoid_valve: - status - valve_position type: object + version: 0.0.1 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 +235,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: {} @@ -332,22 +266,19 @@ solenoid_valve.mock: 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 @@ -367,22 +298,19 @@ solenoid_valve.mock: 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 @@ -400,7 +328,7 @@ solenoid_valve.mock: status: str valve_position: str type: python - description: Mock solenoid valve + description: 模拟电磁阀设备,用于系统测试和开发调试。该设备模拟真实电磁阀的开关操作和状态变化,提供与实际设备相同的控制接口和反馈机制。支持流体路径的虚拟控制,便于在没有实际硬件的情况下进行流体系统的集成测试和算法验证。适用于系统开发、流程调试和培训演示等场景。 handles: - data_type: fluid handler_key: in @@ -431,6 +359,7 @@ solenoid_valve.mock: - status - valve_position type: object + version: 0.0.1 syringe_pump_with_valve.runze: class: action_value_mappings: @@ -825,7 +754,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: @@ -875,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 51b59c2..d947de6 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: @@ -67,10 +43,9 @@ agv.SEER: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' 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: @@ -130,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 72f0155..82fa0dd 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: @@ -123,10 +99,9 @@ robotic_arm.UR: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' 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: @@ -197,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 8a3be30..383bcff 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: @@ -379,10 +379,9 @@ gripper.misumi_rz: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' 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: @@ -447,6 +444,7 @@ gripper.misumi_rz: required: - status type: object + version: 0.0.1 gripper.mock: class: action_value_mappings: @@ -461,7 +459,7 @@ gripper.mock: handles: [] result: {} schema: - description: edit_id的参数schema + description: 模拟夹爪资源ID编辑函数。用于测试和演示资源管理功能,模拟修改夹爪资源的标识信息。该函数接收工作流名称、参数和资源对象,模拟真实的资源更新过程并返回修改后的资源信息。适用于系统测试和开发调试场景。 properties: feedback: {} goal: @@ -484,38 +482,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 @@ -532,10 +498,9 @@ gripper.mock: effort: torque position: position schema: - description: ROS Action GripperCommand 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: effort: type: number @@ -553,7 +518,6 @@ gripper.mock: title: GripperCommand_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: properties: @@ -571,7 +535,6 @@ gripper.mock: title: GripperCommand_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: effort: type: number @@ -600,7 +563,7 @@ gripper.mock: torque: float velocity: float type: python - description: Mock gripper + description: 模拟夹爪设备,用于系统测试和开发调试。该设备模拟真实夹爪的位置、速度、力矩等物理特性,支持虚拟的抓取和移动操作。提供与真实夹爪相同的接口和状态反馈,便于在没有实际硬件的情况下进行系统集成测试和算法验证。适用于软件开发、系统调试和培训演示等场景。 handles: [] icon: '' init_param_schema: @@ -624,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 fa98ca9..c33cace 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: @@ -166,10 +114,9 @@ linear_motion.grbl: handles: [] result: {} schema: - description: ROS Action NavigateThroughPoses 的 JSON Schema + description: '' 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: {} @@ -401,10 +346,9 @@ linear_motion.grbl: handles: [] result: {} schema: - description: ROS Action SingleJointPosition 的 JSON Schema + description: '' 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: @@ -524,6 +466,7 @@ linear_motion.grbl: - position - spindle_speed type: object + version: 0.0.1 motor.iCL42: class: action_value_mappings: @@ -537,7 +480,7 @@ motor.iCL42: handles: [] result: {} schema: - description: execute_run_motor的参数schema + description: 步进电机执行运动函数。直接执行电机运动命令,包括位置设定、速度控制和路径规划。该函数处理底层的电机控制协议,消除警告信息,设置运动参数并启动电机运行。适用于需要直接控制电机运动的应用场景。 properties: feedback: {} goal: @@ -566,7 +509,7 @@ motor.iCL42: handles: [] result: {} schema: - description: init_device的参数schema + description: iCL42电机设备初始化函数。建立与iCL42步进电机驱动器的串口通信连接,配置通信参数包括波特率、数据位、校验位等。该函数是电机使用前的必要步骤,确保驱动器处于可控状态并准备接收运动指令。 properties: feedback: {} goal: @@ -589,7 +532,7 @@ motor.iCL42: handles: [] result: {} schema: - description: run_motor的参数schema + description: 步进电机运动控制函数。根据指定的运动模式、目标位置和速度参数控制电机运动。支持多种运动模式和精确的位置控制,自动处理运动轨迹规划和执行。该函数提供异步执行和状态反馈,确保运动的准确性和可靠性。 properties: feedback: {} goal: @@ -621,10 +564,9 @@ motor.iCL42: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -633,7 +575,6 @@ motor.iCL42: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -642,7 +583,6 @@ motor.iCL42: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -664,7 +604,7 @@ motor.iCL42: motor_position: int success: bool type: python - description: iCL42 motor + description: iCL42步进电机驱动器,用于实验室设备的精密线性运动控制。该设备通过串口通信控制iCL42型步进电机驱动器,支持多种运动模式和精确的位置、速度控制。具备位置反馈、运行状态监控和故障检测功能。适用于自动进样器、样品传送、精密定位平台等需要准确线性运动控制的实验室自动化设备。 handles: [] icon: '' init_param_schema: @@ -691,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 07d1d1d..4476a02 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: @@ -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 6c60670..fe4ad5b 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: {} @@ -143,10 +119,9 @@ chiller: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' 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: @@ -201,6 +174,7 @@ chiller: properties: {} required: [] type: object + version: 0.0.1 heaterstirrer.dalong: class: action_value_mappings: @@ -224,50 +198,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 +250,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 @@ -391,10 +273,9 @@ heaterstirrer.dalong: result: success: success schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -403,7 +284,6 @@ heaterstirrer.dalong: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: pressure: type: string @@ -439,7 +319,6 @@ heaterstirrer.dalong: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -468,10 +347,9 @@ heaterstirrer.dalong: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -480,7 +358,6 @@ heaterstirrer.dalong: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -489,7 +366,6 @@ heaterstirrer.dalong: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -515,10 +391,9 @@ heaterstirrer.dalong: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -527,7 +402,6 @@ heaterstirrer.dalong: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -536,7 +410,6 @@ heaterstirrer.dalong: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -560,7 +433,7 @@ heaterstirrer.dalong: temp_target: float temp_warning: float type: python - description: DaLong heater stirrer + description: 大龙加热搅拌器,集成加热和搅拌双重功能的实验室设备。该设备通过串口通信控制,支持精确的温度调节、搅拌速度控制和安全保护功能。具备实时温度监测、目标温度设定、安全温度报警等特性。适用于化学合成、样品制备、反应控制等需要同时进行加热和搅拌的实验操作,提供稳定均匀的反应环境。 handles: [] icon: '' init_param_schema: @@ -596,6 +469,7 @@ heaterstirrer.dalong: - temp_warning - temp_target type: object + version: 0.0.1 tempsensor: class: action_value_mappings: @@ -707,30 +581,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: @@ -741,10 +591,9 @@ tempsensor: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -753,7 +602,6 @@ tempsensor: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -762,7 +610,6 @@ tempsensor: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -782,7 +629,7 @@ tempsensor: status_types: value: float type: python - description: Temperature sensor + description: 高精度温度传感器设备,用于实验室环境和设备的温度监测。该传感器通过Modbus RTU协议与控制系统通信,提供实时准确的温度数据。具备高精度测量、报警温度设定、数据稳定性好等特点。适用于反应器监控、环境温度监测、设备保护等需要精确温度测量的实验场景,为实验安全和数据可靠性提供保障。 handles: [] icon: '' init_param_schema: @@ -809,3 +656,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 7239432..85aefdc 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: {} @@ -112,22 +48,19 @@ gas_source.mock: 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 @@ -147,22 +80,19 @@ gas_source.mock: 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 @@ -184,16 +114,14 @@ gas_source.mock: 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 @@ -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 @@ -246,29 +173,10 @@ gas_source.mock: required: - status type: object + version: 0.0.1 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 +217,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: {} @@ -360,22 +224,19 @@ vacuum_pump.mock: 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 @@ -395,22 +256,19 @@ vacuum_pump.mock: 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 @@ -432,16 +290,14 @@ vacuum_pump.mock: 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 @@ -450,7 +306,6 @@ vacuum_pump.mock: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -470,7 +325,7 @@ vacuum_pump.mock: status_types: status: str type: python - description: Mock vacuum pump + description: 模拟真空泵设备,用于系统测试和开发调试。该设备模拟真实真空泵的抽气功能和状态控制,支持真空系统的启停操作和状态监测。提供与真实真空泵相同的接口和控制逻辑,便于在没有实际硬件的情况下进行真空系统的集成测试。适用于真空工艺调试、软件开发和实验流程验证等场景。 handles: - data_key: fluid_in data_source: handle @@ -494,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 d165649..0a263b4 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: {} @@ -98,10 +62,9 @@ virtual_centrifuge: message: message success: success schema: - description: ROS Action Centrifuge 的 JSON Schema + description: '' 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 @@ -231,6 +192,7 @@ virtual_centrifuge: - progress - message type: object + version: 0.0.1 virtual_column: class: action_value_mappings: @@ -274,38 +236,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 @@ -331,10 +261,9 @@ virtual_column: return_info: current_status success: success schema: - description: ROS Action RunColumn 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: progress: type: number @@ -346,7 +275,6 @@ virtual_column: title: RunColumn_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: column: type: string @@ -379,7 +307,6 @@ virtual_column: title: RunColumn_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -469,6 +396,7 @@ virtual_column: - progress - current_status type: object + version: 0.0.1 virtual_filter: class: action_value_mappings: @@ -492,54 +420,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: {} @@ -588,10 +468,9 @@ virtual_filter: return_info: message success: success schema: - description: ROS Action Filter 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -609,7 +488,6 @@ virtual_filter: title: Filter_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: continue_heatchill: type: boolean @@ -636,7 +514,6 @@ virtual_filter: title: Filter_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -734,6 +611,7 @@ virtual_filter: - max_stir_speed - max_volume type: object + version: 0.0.1 virtual_gas_source: class: action_value_mappings: @@ -757,26 +635,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: {} @@ -837,50 +695,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: {} @@ -888,22 +702,19 @@ virtual_gas_source: 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 @@ -923,22 +734,19 @@ virtual_gas_source: 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 @@ -960,16 +768,14 @@ virtual_gas_source: 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 @@ -978,7 +784,6 @@ virtual_gas_source: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1025,6 +830,7 @@ virtual_gas_source: required: - status type: object + version: 0.0.1 virtual_heatchill: class: action_value_mappings: @@ -1048,106 +854,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: {} @@ -1193,10 +899,9 @@ virtual_heatchill: result: success: success schema: - description: ROS Action HeatChill 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1205,7 +910,6 @@ virtual_heatchill: title: HeatChill_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: pressure: type: string @@ -1241,7 +945,6 @@ virtual_heatchill: title: HeatChill_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -1275,10 +978,9 @@ virtual_heatchill: result: success: success schema: - description: ROS Action HeatChillStart 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1287,7 +989,6 @@ virtual_heatchill: title: HeatChillStart_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -1302,7 +1003,6 @@ virtual_heatchill: title: HeatChillStart_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1329,10 +1029,9 @@ virtual_heatchill: result: success: success schema: - description: ROS Action HeatChillStop 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1341,7 +1040,6 @@ virtual_heatchill: title: HeatChillStop_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -1350,7 +1048,6 @@ virtual_heatchill: title: HeatChillStop_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1413,6 +1110,7 @@ virtual_heatchill: - stir_speed - remaining_time type: object + version: 0.0.1 virtual_multiway_valve: class: action_value_mappings: @@ -1544,30 +1242,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: {} @@ -1612,30 +1286,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: {} @@ -1670,10 +1320,9 @@ virtual_multiway_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1682,7 +1331,6 @@ virtual_multiway_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -1691,7 +1339,6 @@ virtual_multiway_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1717,10 +1364,9 @@ virtual_multiway_valve: result: success: success schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -1729,7 +1375,6 @@ virtual_multiway_valve: title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -1738,7 +1383,6 @@ virtual_multiway_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -1887,6 +1531,7 @@ virtual_multiway_valve: - flow_path - info type: object + version: 0.0.1 virtual_pump: class: action_value_mappings: @@ -1970,66 +1615,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 @@ -2041,16 +1626,14 @@ virtual_pump: result: success: success schema: - description: ROS Action FloatSingleInput 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: FloatSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: float_in: type: number @@ -2059,7 +1642,6 @@ virtual_pump: title: FloatSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2109,10 +1691,9 @@ virtual_pump: result: success: success schema: - description: ROS Action PumpTransfer 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2156,7 +1737,6 @@ virtual_pump: title: PumpTransfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -2209,7 +1789,6 @@ virtual_pump: title: PumpTransfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2291,6 +1870,7 @@ virtual_pump: - transferred_volume - current_status type: object + version: 0.0.1 virtual_rotavap: class: action_value_mappings: @@ -2314,46 +1894,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: 180.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: 180.0 - type: number - vessel: - type: string - required: - - vessel - type: object - result: {} - required: - - goal - title: evaporate参数 - type: object - type: UniLabJsonCommandAsync auto-initialize: feedback: {} goal: {} @@ -2396,10 +1936,9 @@ virtual_rotavap: message: message success: success schema: - description: ROS Action Evaporate 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2443,7 +1982,6 @@ virtual_rotavap: title: Evaporate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: pressure: type: number @@ -2467,7 +2005,6 @@ virtual_rotavap: title: Evaporate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -2570,6 +2107,7 @@ virtual_rotavap: - max_rotation_speed - remaining_time type: object + version: 0.0.1 virtual_separator: class: action_value_mappings: @@ -2613,78 +2151,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 @@ -2726,10 +2192,9 @@ virtual_separator: message: message success: success schema: - description: ROS Action Separate 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_device: type: string @@ -2773,7 +2238,6 @@ virtual_separator: title: Separate_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: from_vessel: type: string @@ -2832,7 +2296,6 @@ virtual_separator: title: Separate_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -2938,6 +2401,7 @@ virtual_separator: - progress - message type: object + version: 0.0.1 virtual_solenoid_valve: class: action_value_mappings: @@ -2961,26 +2425,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: {} @@ -3040,54 +2484,117 @@ virtual_solenoid_valve: - 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: + type: UniLabJsonCommandAsync + auto-reset: feedback: {} goal: {} goal_default: {} handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: reset的参数schema + properties: + feedback: {} + goal: + properties: {} + required: [] + type: object + result: {} + required: + - goal + 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: {} + goal_default: {} + handles: [] + result: {} + schema: + description: toggle的参数schema + properties: + feedback: {} + goal: + properties: {} + required: [] + type: object + result: {} + required: + - goal + title: toggle参数 + type: object + type: UniLabJsonCommand + close: + feedback: {} + goal: + command: CLOSED + goal_default: + command: '' + handles: [] + result: + success: success + schema: + description: ROS Action SendCmd 的 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 @@ -3107,22 +2614,19 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: ROS Action EmptyIn 的 JSON Schema + description: ROS Action SendCmd 的 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 @@ -3144,16 +2648,14 @@ virtual_solenoid_valve: handles: [] result: {} schema: - description: ROS Action StrSingleInput 的 JSON Schema + description: ROS Action SendCmd 的 JSON Schema properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: StrSingleInput_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: string: type: string @@ -3162,7 +2664,6 @@ virtual_solenoid_valve: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -3190,16 +2691,14 @@ virtual_solenoid_valve: message: message valve_position: valve_position schema: - description: ROS Action SendCmd 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: {} required: [] title: SendCmd_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: command: type: string @@ -3208,7 +2707,6 @@ virtual_solenoid_valve: title: SendCmd_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: success: type: boolean @@ -3281,180 +2779,6 @@ virtual_solenoid_valve: - valve_position - state type: object -virtual_solid_dispenser: - class: - action_value_mappings: - add_solid: - feedback: - current_status: status - progress: progress - goal: - mass: mass - mol: mol - purpose: purpose - reagent: reagent - vessel: vessel - goal_default: - mass: '' - mol: '' - purpose: '' - reagent: '' - vessel: '' - handles: [] - result: - message: message - return_info: return_info - success: success - schema: - description: ROS Action AddSolid 的 JSON Schema - properties: - feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 - properties: - current_status: - type: string - progress: - type: number - required: - - current_status - - progress - title: AddSolid_Feedback - type: object - goal: - description: Action 目标 - 从客户端发送到服务器 - properties: - mass: - type: string - mol: - type: string - purpose: - type: string - reagent: - type: string - vessel: - type: string - required: - - vessel - - reagent - - mass - - mol - - purpose - title: AddSolid_Goal - type: object - result: - description: Action 结果 - 完成后从服务器发送到客户端 - properties: - message: - type: string - return_info: - type: string - success: - type: boolean - required: - - success - - message - - return_info - title: AddSolid_Result - type: object - required: - - goal - title: AddSolid - type: object - type: AddSolid - auto-add_solid: - feedback: {} - goal: {} - goal_default: - mass: '' - mol: '' - purpose: '' - reagent: '' - vessel: main_reactor - handles: [] - result: {} - schema: - description: add_solid的参数schema - type: object - type: UniLabJsonCommandAsync - auto-cleanup: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: cleanup的参数schema - type: object - type: UniLabJsonCommandAsync - auto-initialize: - feedback: {} - goal: {} - goal_default: {} - handles: [] - result: {} - schema: - description: initialize的参数schema - type: object - type: UniLabJsonCommandAsync - module: unilabos.devices.virtual.virtual_solid_dispenser:VirtualSolidDispenser - status_types: - current_reagent: str - dispensed_amount: float - status: str - total_operations: int - type: python - description: Virtual Solid Dispenser for Add Protocol Solid Reagents - handles: - - data_key: SolidIn - data_source: handle - data_type: resource - description: 固体试剂进料口 - handler_key: SolidIn - io_type: target - label: SolidIn - side: WEST - - data_key: SolidOut - data_source: executor - data_type: resource - description: 固体试剂出料口 - handler_key: SolidOut - io_type: source - label: SolidOut - side: EAST - icon: '' - init_param_schema: - config: - properties: - config: - type: object - device_id: - type: string - max_capacity: - default: 100.0 - description: 最大加样容量 (g) - type: number - precision: - default: 0.001 - description: 加样精度 (g) - type: number - required: [] - type: object - data: - properties: - current_reagent: - type: string - dispensed_amount: - type: number - status: - type: string - total_operations: - type: integer - required: - - status - - current_reagent - - dispensed_amount - - total_operations - type: object virtual_stirrer: class: action_value_mappings: @@ -3498,94 +2822,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 @@ -3601,10 +2837,9 @@ virtual_stirrer: result: success: success schema: - description: ROS Action StartStir 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_speed: type: number @@ -3619,7 +2854,6 @@ virtual_stirrer: title: StartStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: purpose: type: string @@ -3634,7 +2868,6 @@ virtual_stirrer: title: StartStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3672,10 +2905,9 @@ virtual_stirrer: result: success: success schema: - description: ROS Action Stir 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: status: type: string @@ -3684,7 +2916,6 @@ virtual_stirrer: title: Stir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: event: type: string @@ -3711,7 +2942,6 @@ virtual_stirrer: title: Stir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3741,10 +2971,9 @@ virtual_stirrer: result: success: success schema: - description: ROS Action StopStir 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -3756,7 +2985,6 @@ virtual_stirrer: title: StopStir_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: vessel: type: string @@ -3765,7 +2993,6 @@ virtual_stirrer: title: StopStir_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -3835,6 +3062,7 @@ virtual_stirrer: - is_stirring - remaining_time type: object + version: 0.0.1 virtual_transfer_pump: class: action_value_mappings: @@ -4096,33 +3324,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: {} @@ -4143,36 +3344,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 @@ -4189,10 +3360,9 @@ virtual_transfer_pump: message: message success: success schema: - description: ROS Action SetPumpPosition 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_position: type: number @@ -4207,7 +3377,6 @@ virtual_transfer_pump: title: SetPumpPosition_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: max_velocity: type: number @@ -4219,7 +3388,6 @@ virtual_transfer_pump: title: SetPumpPosition_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -4270,10 +3438,9 @@ virtual_transfer_pump: message: message success: success schema: - description: ROS Action Transfer 的 JSON Schema + description: '' properties: feedback: - description: Action 反馈 - 执行过程中从服务器发送到客户端 properties: current_status: type: string @@ -4288,7 +3455,6 @@ virtual_transfer_pump: title: Transfer_Feedback type: object goal: - description: Action 目标 - 从客户端发送到服务器 properties: amount: type: string @@ -4326,7 +3492,6 @@ virtual_transfer_pump: title: Transfer_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: message: type: string @@ -4400,6 +3565,7 @@ virtual_transfer_pump: - remaining_capacity - pump_info type: object + version: 0.0.1 virtual_vacuum_pump: class: action_value_mappings: @@ -4423,26 +3589,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: {} @@ -4503,50 +3649,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: {} @@ -4554,22 +3656,19 @@ virtual_vacuum_pump: 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 @@ -4589,22 +3688,19 @@ virtual_vacuum_pump: 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 @@ -4626,16 +3722,14 @@ virtual_vacuum_pump: 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 @@ -4644,7 +3738,6 @@ virtual_vacuum_pump: title: StrSingleInput_Goal type: object result: - description: Action 结果 - 完成后从服务器发送到客户端 properties: return_info: type: string @@ -4691,3 +3784,4 @@ virtual_vacuum_pump: required: - status type: object + version: 0.0.1 diff --git a/unilabos/registry/devices/zhida_hplc.yaml b/unilabos/registry/devices/zhida_hplc.yaml index 644ab7f..dc1e013 100644 --- a/unilabos/registry/devices/zhida_hplc.yaml +++ b/unilabos/registry/devices/zhida_hplc.yaml @@ -8,22 +8,19 @@ zhida_hplc: 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 @@ -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: {} @@ -127,22 +80,19 @@ zhida_hplc: 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 @@ -164,16 +114,14 @@ zhida_hplc: 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 @@ -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: @@ -230,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 c5a6981..f496e0f 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 @@ -63,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)) ), @@ -84,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)) ), @@ -99,18 +101,25 @@ 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, "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": [], @@ -161,6 +170,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 +331,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"], @@ -313,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: @@ -348,6 +405,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() @@ -365,9 +430,15 @@ class Registry: "goal_default": {i["name"]: i["default"] for i in v["args"]}, "handles": [], } + # 不生成已配置action的动作 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__" @@ -471,6 +542,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 f0e9468..230ad1f 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=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", ""), @@ -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,66 @@ 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]: + +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 定义 """ - 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": description, + "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 +780,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 +803,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 4b7eb07..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) @@ -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/nodes/presets/host_node.py b/unilabos/ros/nodes/presets/host_node.py index 0cb3db7..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: @@ -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] diff --git a/unilabos/ros/nodes/presets/protocol_node.py b/unilabos/ros/nodes/presets/protocol_node.py index 033cbd3..5c8ffbd 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: 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']}") 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()