mirror of
https://github.com/dptech-corp/Uni-Lab-OS.git
synced 2025-12-17 04:51:10 +00:00
24 high level liquidhandler (#28)
* unify liquid_handler definition * remove default values * Dev Sync (#25) * Update README and MQTTClient for installation instructions and code improvements * feat: 支持local_config启动 add: 增加对crt path的说明,为传入config.py的相对路径 move: web component * add: registry description * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * feat: node_info_update srv fix: OTDeck cant create * close #12 feat: slave node registry * feat: show machine name fix: host node registry not uploaded * feat: add hplc registry * feat: add hplc registry * fix: hplc status typo * fix: devices/ * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * fix: device.class possible null * fix: HPLC additions with online service * fix: slave mode spin not working * fix: slave mode spin not working * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * feat: 多ProtocolNode 允许子设备ID相同 feat: 上报发现的ActionClient feat: Host重启动,通过discover机制要求slaveNode重新注册,实现信息及时上报 * feat: 支持env设置config * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * Device visualization (#14) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: missing hostname in devices_names fix: upload_file for model file * fix: missing paho-mqtt package bump version to 0.9.0 * fix startup add ResourceCreateFromOuter.action * fix type hint * update actions * update actions * host node add_resource_from_outer fix cmake list * pass device config to device class * add: bind_parent_ids to resource create action fix: message convert string * fix: host node should not be re_discovered * feat: resource tracker support dict * feat: add more necessary params * feat: fix boolean null in registry action data * feat: add outer resource * 编写mesh添加action * feat: append resource * add action * feat: vis 2d for plr * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate * Device visualization (#22) * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * add 3d visualization * 完成在main中启动设备可视化 完成在main中启动设备可视化,并输出物料ID:mesh的对应关系resource_model 添加物料模型管理类,遍历物料与resource_model,完成TF数据收集 * 完成TF发布 * 修改模型方向,在yaml中添加变换属性 * 添加物料tf变化时,发送topic到前端 另外修改了物料初始化的方法,防止在tf还未发布时提前建立物料模型与发布话题 * 添加关节发布节点与物料可视化节点进入unilab * 使用json启动plr与3D模型仿真 * 完成启动OT并联动rviz * 修复rviz位置问题, 修复rviz位置问题, 在无tf变动时减缓发送频率 在backend中添加物料跟随方法 * fix: running logic * fix: running logic * fix: missing ot * 在main中直接初始化republisher和物料的mesh节点 * 将joint_republisher和resource_mesh_manager添加进 main_slave_run.py中 * 编写mesh添加action * add action * fix * fix: browser on rviz * fix: cloud bridge error fallback to local * fix: salve auto run rviz * 初始化两个plate --------- Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: wznln <18435084+Xuwznln@users.noreply.github.com> * fix: multi channel * fix: aspirate * fix: aspirate * fix: aspirate * fix: aspirate * 提交 * fix: jobadd * fix: jobadd * fix: msg converter * tijiao * add resource creat easy action * identify debug msg * mq client id --------- Co-authored-by: Harvey Que <Q-Query@outlook.com> Co-authored-by: zhangshixiang <@zhangshixiang> Co-authored-by: q434343 <73513873+q434343@users.noreply.github.com> * remove default behavior for visualization * change liquidhandler name * resource create from outer easy * add easy resource creation * easy resource creation logic * remove wrongly debug msg from others * remove wrongly debug msg from others * add missing action clients * fix device_id * fix slot_on_deck * fix registry typo * complete require packages msg converter support array string implements create resource logic * 修复port输入 * fix: remove dirty actions --------- Co-authored-by: Junhan Chang <changjh@pku.edu.cn> Co-authored-by: Harvey Que <Q-Query@outlook.com> Co-authored-by: q434343 <73513873+q434343@users.noreply.github.com>
This commit is contained in:
@@ -1,11 +1,96 @@
|
||||
liquid_handler:
|
||||
description: Liquid handler device controlled by pylabrobot
|
||||
class:
|
||||
module: pylabrobot.liquid_handling:LiquidHandler
|
||||
module: unilabos.devices.liquid_handling.liquid_handler_abstract:LiquidHandlerAbstract
|
||||
type: python
|
||||
status_types:
|
||||
name: String
|
||||
action_value_mappings:
|
||||
remove:
|
||||
type: LiquidHandlerRemove
|
||||
goal:
|
||||
vols: vols
|
||||
sources: sources
|
||||
waste_liquid: 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
|
||||
feedback: { }
|
||||
result: { }
|
||||
add_liquid:
|
||||
type: LiquidHandlerAdd
|
||||
goal:
|
||||
asp_vols: asp_vols
|
||||
dis_vols: dis_vols
|
||||
reagent_sources: reagent_sources
|
||||
targets: 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
|
||||
mix_time: mix_time
|
||||
mix_vol: mix_vol
|
||||
mix_rate: mix_rate
|
||||
mix_liquid_height: mix_liquid_height
|
||||
none_keys: none_keys
|
||||
feedback: { }
|
||||
result: { }
|
||||
transfer_liquid:
|
||||
type: LiquidHandlerTransfer
|
||||
goal:
|
||||
asp_vols: asp_vols
|
||||
dis_vols: dis_vols
|
||||
sources: sources
|
||||
targets: targets
|
||||
tip_racks: tip_racks
|
||||
use_channels: use_channels
|
||||
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
|
||||
feedback: { }
|
||||
result: { }
|
||||
mix:
|
||||
type: LiquidHandlerMix
|
||||
goal:
|
||||
targets: targets
|
||||
mix_time: mix_time
|
||||
mix_vol: mix_vol
|
||||
height_to_bottom: height_to_bottom
|
||||
offsets: offsets
|
||||
mix_rate: mix_rate
|
||||
none_keys: none_keys
|
||||
feedback: { }
|
||||
result: { }
|
||||
move_to:
|
||||
type: LiquidHandlerMoveTo
|
||||
goal:
|
||||
well: well
|
||||
dis_to_top: dis_to_top
|
||||
channel: channel
|
||||
feedback: { }
|
||||
result: { }
|
||||
aspirate:
|
||||
type: LiquidHandlerAspirate
|
||||
goal:
|
||||
@@ -170,127 +255,6 @@ liquid_handler:
|
||||
- name
|
||||
additionalProperties: false
|
||||
|
||||
dp_liquid_handler:
|
||||
description: 通用液体处理
|
||||
class:
|
||||
module: unilabos.devices.liquid_handling.action_definition:DPLiquidHandler
|
||||
type: python
|
||||
status_types:
|
||||
status: String
|
||||
action_value_mappings:
|
||||
remove_liquid:
|
||||
type: DPLiquidHandlerRemoveLiquid
|
||||
goal:
|
||||
vols: vols
|
||||
sources: sources
|
||||
waste_liquid: 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
|
||||
feedback: {}
|
||||
result: {}
|
||||
add_liquid:
|
||||
type: DPLiquidHandlerAddLiquid
|
||||
goal:
|
||||
asp_vols: asp_vols
|
||||
dis_vols: dis_vols
|
||||
reagent_sources: reagent_sources
|
||||
targets: 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
|
||||
mix_time: mix_time
|
||||
mix_vol: mix_vol
|
||||
mix_rate: mix_rate
|
||||
mix_liquid_height: mix_liquid_height
|
||||
none_keys: none_keys
|
||||
feedback: {}
|
||||
result: {}
|
||||
transfer_liquid:
|
||||
type: DPLiquidHandlerTransferLiquid
|
||||
goal:
|
||||
asp_vols: asp_vols
|
||||
dis_vols: dis_vols
|
||||
sources: sources
|
||||
targets: targets
|
||||
tip_racks: tip_racks
|
||||
use_channels: use_channels
|
||||
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
|
||||
feedback: {}
|
||||
result: {}
|
||||
custom_delay:
|
||||
type: DPLiquidHandlerCustomDelay
|
||||
goal:
|
||||
seconds: seconds
|
||||
msg: msg
|
||||
feedback: {}
|
||||
result: {}
|
||||
touch_tip:
|
||||
type: DPLiquidHandlerTouchTip
|
||||
goal:
|
||||
targets: targets
|
||||
feedback: {}
|
||||
result: {}
|
||||
mix:
|
||||
type: DPLiquidHandlerMix
|
||||
goal:
|
||||
targets: targets
|
||||
mix_time: mix_time
|
||||
mix_vol: mix_vol
|
||||
height_to_bottom: height_to_bottom
|
||||
offsets: offsets
|
||||
mix_rate: mix_rate
|
||||
none_keys: none_keys
|
||||
feedback: {}
|
||||
result: {}
|
||||
set_tiprack:
|
||||
type: DPLiquidHandlerSetTiprack
|
||||
goal:
|
||||
tip_racks: tip_racks
|
||||
feedback: {}
|
||||
result: {}
|
||||
move_to:
|
||||
type: DPLiquidHandlerMoveTo
|
||||
goal:
|
||||
well: well
|
||||
dis_to_top: dis_to_top
|
||||
channel: channel
|
||||
feedback: {}
|
||||
result: {}
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
description: 物料名
|
||||
required:
|
||||
- name
|
||||
|
||||
liquid_handler.revvity:
|
||||
class:
|
||||
module: unilabos.devices.liquid_handling.revvity:Revvity
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import io
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
@@ -7,10 +6,9 @@ from typing import Any
|
||||
|
||||
import yaml
|
||||
|
||||
from unilabos.utils import logger
|
||||
from unilabos.ros.msgs.message_converter import msg_converter_manager, ros_action_to_json_schema
|
||||
from unilabos.utils import logger
|
||||
from unilabos.utils.decorator import singleton
|
||||
from unilabos.utils.type_check import TypeEncoder
|
||||
|
||||
DEFAULT_PATHS = [Path(__file__).absolute().parent]
|
||||
|
||||
@@ -21,10 +19,12 @@ class Registry:
|
||||
self.registry_paths = DEFAULT_PATHS.copy() # 使用copy避免修改默认值
|
||||
if registry_paths:
|
||||
self.registry_paths.extend(registry_paths)
|
||||
action_type = self._replace_type_with_class(
|
||||
"ResourceCreateFromOuter", "host_node", f"动作 add_resource_from_outer"
|
||||
self.ResourceCreateFromOuter = self._replace_type_with_class(
|
||||
"ResourceCreateFromOuter", "host_node", f"动作 create_resource_detailed"
|
||||
)
|
||||
self.ResourceCreateFromOuterEasy = self._replace_type_with_class(
|
||||
"ResourceCreateFromOuterEasy", "host_node", f"动作 create_resource"
|
||||
)
|
||||
schema = ros_action_to_json_schema(action_type)
|
||||
self.device_type_registry = {
|
||||
"host_node": {
|
||||
"description": "UniLabOS主机节点",
|
||||
@@ -33,7 +33,7 @@ class Registry:
|
||||
"type": "python",
|
||||
"status_types": {},
|
||||
"action_value_mappings": {
|
||||
"add_resource_from_outer": {
|
||||
"create_resource_detailed": {
|
||||
"type": msg_converter_manager.search_class("ResourceCreateFromOuter"),
|
||||
"goal": {
|
||||
"resources": "resources",
|
||||
@@ -46,7 +46,26 @@ class Registry:
|
||||
"result": {
|
||||
"success": "success"
|
||||
},
|
||||
"schema": schema
|
||||
"schema": ros_action_to_json_schema(self.ResourceCreateFromOuter)
|
||||
},
|
||||
"create_resource": {
|
||||
"type": msg_converter_manager.search_class("ResourceCreateFromOuterEasy"),
|
||||
"goal": {
|
||||
"res_id": "res_id",
|
||||
"class_name": "class_name",
|
||||
"parent": "parent",
|
||||
"device_id": "device_id",
|
||||
"bind_locations": "bind_locations",
|
||||
"liquid_input_slot": "liquid_input_slot[]",
|
||||
"liquid_type": "liquid_type[]",
|
||||
"liquid_volume": "liquid_volume[]",
|
||||
"slot_on_deck": "slot_on_deck",
|
||||
},
|
||||
"feedback": {},
|
||||
"result": {
|
||||
"success": "success"
|
||||
},
|
||||
"schema": ros_action_to_json_schema(self.ResourceCreateFromOuterEasy)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,35 +1,35 @@
|
||||
agilent_1_reservoir_290ml:
|
||||
description: Agilent 1 reservoir 290ml
|
||||
class:
|
||||
module: pylabrobot.resources.opentrons.reserviors:agilent_1_reservoir_290ml
|
||||
module: pylabrobot.resources.opentrons.reservoirs:agilent_1_reservoir_290ml
|
||||
type: pylabrobot
|
||||
|
||||
axygen_1_reservoir_90ml:
|
||||
description: Axygen 1 reservoir 90ml
|
||||
class:
|
||||
module: pylabrobot.resources.opentrons.reserviors:axygen_1_reservoir_90ml
|
||||
module: pylabrobot.resources.opentrons.reservoirs:axygen_1_reservoir_90ml
|
||||
type: pylabrobot
|
||||
|
||||
nest_12_reservoir_15ml:
|
||||
description: Nest 12 reservoir 15ml
|
||||
class:
|
||||
module: pylabrobot.resources.opentrons.reserviors:nest_12_reservoir_15ml
|
||||
module: pylabrobot.resources.opentrons.reservoirs:nest_12_reservoir_15ml
|
||||
type: pylabrobot
|
||||
|
||||
nest_1_reservoir_195ml:
|
||||
description: Nest 1 reservoir 195ml
|
||||
class:
|
||||
module: pylabrobot.resources.opentrons.reserviors:nest_1_reservoir_195ml
|
||||
module: pylabrobot.resources.opentrons.reservoirs:nest_1_reservoir_195ml
|
||||
type: pylabrobot
|
||||
|
||||
nest_1_reservoir_290ml:
|
||||
description: Nest 1 reservoir 290ml
|
||||
class:
|
||||
module: pylabrobot.resources.opentrons.reserviors:nest_1_reservoir_290ml
|
||||
module: pylabrobot.resources.opentrons.reservoirs:nest_1_reservoir_290ml
|
||||
type: pylabrobot
|
||||
|
||||
usascientific_12_reservoir_22ml:
|
||||
description: USAScientific 12 reservoir 22ml
|
||||
class:
|
||||
module: pylabrobot.resources.opentrons.reserviors:usascientific_12_reservoir_22ml
|
||||
module: pylabrobot.resources.opentrons.reservoirs:usascientific_12_reservoir_22ml
|
||||
type: pylabrobot
|
||||
|
||||
Reference in New Issue
Block a user