From 75f09034ffb2a9fae002a459127c576b9d583774 Mon Sep 17 00:00:00 2001 From: Xuwznln <18435084+Xuwznln@users.noreply.github.com> Date: Tue, 18 Nov 2025 13:32:09 +0800 Subject: [PATCH] update docs, test examples fix liquid_handler init bug --- MANIFEST.in | 1 + docs/advanced_usage/configuration.md | 746 +++++++ docs/advanced_usage/image/copy_aksk.gif | Bin 0 -> 538417 bytes docs/advanced_usage/working_directory.md | 218 ++ docs/concepts/01-communication-instruction.md | 2 +- docs/developer_guide/action_includes.md | 816 ++++++-- docs/developer_guide/add_device.md | 904 +++++++- .../{device_driver.md => add_old_device.md} | 149 +- docs/developer_guide/add_registry.md | 1118 ++++++++++ .../battery_plc_workstation.md} | 80 +- .../image_battery_plc}/unilab_new_yaml.png | Bin .../unilab_registry_process.png | Bin .../image_battery_plc}/unilab_sys_status.png | Bin .../materials_construction_guide.md | 6 +- .../{ => examples}/materials_tutorial.md | 8 +- .../workstation_architecture.md | 14 +- docs/developer_guide/networking_overview.md | 595 ++++++ docs/index.md | 4 +- docs/intro.md | 44 +- docs/user_guide/best_practice.md | 1837 +++++++++++++++++ docs/user_guide/configuration.md | 442 ---- docs/user_guide/graph_files.md | 860 ++++++++ docs/user_guide/image/test_latency_result.png | Bin 0 -> 24102 bytes .../user_guide/image/test_latency_running.png | Bin 0 -> 46811 bytes .../image/test_latency_select_device.png | Bin 0 -> 24102 bytes docs/user_guide/installation.md | 562 ++++- docs/user_guide/launch.md | 82 +- docs/user_guide/quick_install_guide.md | 197 -- unilabos/app/main.py | 5 + .../liquid_handler_abstract.py | 49 +- unilabos/test/__init__.py | 0 .../test}/commands/resource_add.md | 0 ...nard_flow_batchreact_single_pumpvalve.json | 0 {test => unilabos/test}/experiments/HPLC.json | 0 .../test}/experiments/HT_hiwo.json | 0 .../test}/experiments/ICCAS506.json | 0 .../add_protocol_test_station.json | 0 .../centrifuge_protocol_test_station.json | 0 .../clean_vessel_protocol_test_station.json | 0 .../dual_valve_pump_test_station.json | 0 .../evacuateandrefill_test_station.json | 0 .../evaporate_protocol_test_station.json | 0 .../filter_protocol_test_station.json | 0 .../heatchill_protocol_test_station.json | 0 ...mptransfer_filterthrough_test_station.json | 0 .../pumptransfer_test_station.json | 0 .../run_column_protocol_test_station.json | 0 .../simple_stir_heatchill_test_station.json | 0 .../test}/experiments/biomek.json | 0 .../test}/experiments/camera.json | 0 .../comprehensive_protocol/checklist.md | 0 .../comprehensive_slim.json | 0 .../comprehensive_station.json | 0 .../experiments/deis_control_config.yaml | 0 .../test}/experiments/devices.json | 0 .../dispensing_station_bioyond.json | 0 .../test}/experiments/empty_devices.json | 0 .../test}/experiments/laiyu_liquid.json | 0 .../test}/experiments/lidocaine-graph.json | 0 .../experiments/mock_devices/mock_all.json | 0 .../mock_devices/mock_chiller.json | 0 .../experiments/mock_devices/mock_filter.json | 0 .../experiments/mock_devices/mock_heater.json | 0 .../experiments/mock_devices/mock_pump.json | 0 .../mock_devices/mock_rotavap.json | 0 .../mock_devices/mock_separator.json | 0 .../mock_devices/mock_solenoid_valve.json | 0 .../mock_devices/mock_stirrer.json | 0 .../mock_devices/mock_stirrer_new.json | 0 .../experiments/mock_devices/mock_vacuum.json | 0 .../mock_protocol/addteststation.json | 0 .../mock_protocol/centrifugeteststation.json | 0 .../mock_protocol/cleanvesselteststation.json | 0 .../mock_protocol/dissolveteststation.json | 0 .../mock_protocol/filterteststation.json | 0 .../filterthroughteststation.json | 0 .../mock_protocol/heatchillteststation.json | 0 .../mock_protocol/runcolumnteststation.json | 0 .../mock_protocol/stirteststation.json | 0 .../mock_protocol/transferteststation.json | 0 .../mock_protocol/washsolidteststation.json | 0 .../test}/experiments/mock_reactor.json | 0 .../test}/experiments/opcua_example.json | 0 .../test}/experiments/plr_test.json | 0 .../test}/experiments/plr_test_converted.json | 0 .../experiments/plr_test_converted_slim.json | 0 .../test}/experiments/prcxi_9300.json | 0 .../test}/experiments/prcxi_9320.json | 0 .../test}/experiments/prcxi_9320_visual.json | 0 .../experiments/reaction_station_bioyond.json | 0 .../reaction_station_bioyond_test.json | 0 {test => unilabos/test}/experiments/test.json | 0 .../test}/experiments/test_copy.json | 0 .../test}/experiments/test_laiyu.json | 0 .../test}/experiments/test_laiyu_v.json | 0 .../test}/experiments/test_moveit.json | 0 .../test}/experiments/workshop.json | 0 unilabos/test/registry/__init__.py | 0 .../test}/registry/example_devices.py | 0 unilabos/test/resources/__init__.py | 0 .../bioyond_materials_liquidhandling_1.json | 0 .../bioyond_materials_liquidhandling_2.json | 0 .../resources/bioyond_materials_reaction.json | 0 .../test}/resources/test_bottle_carrier.py | 0 .../test}/resources/test_converter_bioyond.py | 0 .../test}/resources/test_itemized_carrier.py | 0 .../test}/resources/test_resourcetreeset.py | 0 unilabos/test/ros/__init__.py | 0 {test => unilabos/test}/ros/msgs/__init__.py | 0 .../test}/ros/msgs/test_basic.py | 0 .../test}/ros/msgs/test_conversion.py | 0 .../test}/ros/msgs/test_mapping.py | 0 .../test}/ros/msgs/test_runner.py | 0 unilabos/test/workflow/__init__.py | 0 .../test}/workflow/example_bio.json | 0 .../test}/workflow/example_bio_graph.png | Bin .../test}/workflow/example_prcxi.json | 0 .../test}/workflow/example_prcxi_graph.png | Bin .../example_prcxi_graph_20251022_1359.png | Bin .../test}/workflow/merge_workflow.py | 0 120 files changed, 7713 insertions(+), 1026 deletions(-) create mode 100644 docs/advanced_usage/configuration.md create mode 100644 docs/advanced_usage/image/copy_aksk.gif create mode 100644 docs/advanced_usage/working_directory.md rename docs/developer_guide/{device_driver.md => add_old_device.md} (78%) create mode 100644 docs/developer_guide/add_registry.md rename docs/developer_guide/{add_batteryPLC.md => examples/battery_plc_workstation.md} (61%) rename docs/developer_guide/{image_add_batteryPLC => examples/image_battery_plc}/unilab_new_yaml.png (100%) rename docs/developer_guide/{image_add_batteryPLC => examples/image_battery_plc}/unilab_registry_process.png (100%) rename docs/developer_guide/{image_add_batteryPLC => examples/image_battery_plc}/unilab_sys_status.png (100%) rename docs/developer_guide/{ => examples}/materials_construction_guide.md (98%) rename docs/developer_guide/{ => examples}/materials_tutorial.md (96%) rename docs/developer_guide/{ => examples}/workstation_architecture.md (97%) create mode 100644 docs/developer_guide/networking_overview.md create mode 100644 docs/user_guide/best_practice.md delete mode 100644 docs/user_guide/configuration.md create mode 100644 docs/user_guide/graph_files.md create mode 100644 docs/user_guide/image/test_latency_result.png create mode 100644 docs/user_guide/image/test_latency_running.png create mode 100644 docs/user_guide/image/test_latency_select_device.png delete mode 100644 docs/user_guide/quick_install_guide.md create mode 100644 unilabos/test/__init__.py rename {test => unilabos/test}/commands/resource_add.md (100%) rename {test => unilabos/test}/experiments/Grignard_flow_batchreact_single_pumpvalve.json (100%) rename {test => unilabos/test}/experiments/HPLC.json (100%) rename {test => unilabos/test}/experiments/HT_hiwo.json (100%) rename {test => unilabos/test}/experiments/ICCAS506.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/add_protocol_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/centrifuge_protocol_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/clean_vessel_protocol_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/dual_valve_pump_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/evacuateandrefill_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/evaporate_protocol_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/filter_protocol_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/heatchill_protocol_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/pumptransfer_filterthrough_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/pumptransfer_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/run_column_protocol_test_station.json (100%) rename {test => unilabos/test}/experiments/Protocol_Test_Station/simple_stir_heatchill_test_station.json (100%) rename {test => unilabos/test}/experiments/biomek.json (100%) rename {test => unilabos/test}/experiments/camera.json (100%) rename {test => unilabos/test}/experiments/comprehensive_protocol/checklist.md (100%) rename {test => unilabos/test}/experiments/comprehensive_protocol/comprehensive_slim.json (100%) rename {test => unilabos/test}/experiments/comprehensive_protocol/comprehensive_station.json (100%) rename {test => unilabos/test}/experiments/deis_control_config.yaml (100%) rename {test => unilabos/test}/experiments/devices.json (100%) rename {test => unilabos/test}/experiments/dispensing_station_bioyond.json (100%) rename {test => unilabos/test}/experiments/empty_devices.json (100%) rename {test => unilabos/test}/experiments/laiyu_liquid.json (100%) rename {test => unilabos/test}/experiments/lidocaine-graph.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_all.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_chiller.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_filter.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_heater.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_pump.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_rotavap.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_separator.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_solenoid_valve.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_stirrer.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_stirrer_new.json (100%) rename {test => unilabos/test}/experiments/mock_devices/mock_vacuum.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/addteststation.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/centrifugeteststation.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/cleanvesselteststation.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/dissolveteststation.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/filterteststation.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/filterthroughteststation.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/heatchillteststation.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/runcolumnteststation.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/stirteststation.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/transferteststation.json (100%) rename {test => unilabos/test}/experiments/mock_protocol/washsolidteststation.json (100%) rename {test => unilabos/test}/experiments/mock_reactor.json (100%) rename {test => unilabos/test}/experiments/opcua_example.json (100%) rename {test => unilabos/test}/experiments/plr_test.json (100%) rename {test => unilabos/test}/experiments/plr_test_converted.json (100%) rename {test => unilabos/test}/experiments/plr_test_converted_slim.json (100%) rename {test => unilabos/test}/experiments/prcxi_9300.json (100%) rename {test => unilabos/test}/experiments/prcxi_9320.json (100%) rename {test => unilabos/test}/experiments/prcxi_9320_visual.json (100%) rename {test => unilabos/test}/experiments/reaction_station_bioyond.json (100%) rename {test => unilabos/test}/experiments/reaction_station_bioyond_test.json (100%) rename {test => unilabos/test}/experiments/test.json (100%) rename {test => unilabos/test}/experiments/test_copy.json (100%) rename {test => unilabos/test}/experiments/test_laiyu.json (100%) rename {test => unilabos/test}/experiments/test_laiyu_v.json (100%) rename {test => unilabos/test}/experiments/test_moveit.json (100%) rename {test => unilabos/test}/experiments/workshop.json (100%) create mode 100644 unilabos/test/registry/__init__.py rename {test => unilabos/test}/registry/example_devices.py (100%) create mode 100644 unilabos/test/resources/__init__.py rename {test => unilabos/test}/resources/bioyond_materials_liquidhandling_1.json (100%) rename {test => unilabos/test}/resources/bioyond_materials_liquidhandling_2.json (100%) rename {test => unilabos/test}/resources/bioyond_materials_reaction.json (100%) rename {test => unilabos/test}/resources/test_bottle_carrier.py (100%) rename {test => unilabos/test}/resources/test_converter_bioyond.py (100%) rename {test => unilabos/test}/resources/test_itemized_carrier.py (100%) rename {test => unilabos/test}/resources/test_resourcetreeset.py (100%) create mode 100644 unilabos/test/ros/__init__.py rename {test => unilabos/test}/ros/msgs/__init__.py (100%) rename {test => unilabos/test}/ros/msgs/test_basic.py (100%) rename {test => unilabos/test}/ros/msgs/test_conversion.py (100%) rename {test => unilabos/test}/ros/msgs/test_mapping.py (100%) rename {test => unilabos/test}/ros/msgs/test_runner.py (100%) create mode 100644 unilabos/test/workflow/__init__.py rename {test => unilabos/test}/workflow/example_bio.json (100%) rename {test => unilabos/test}/workflow/example_bio_graph.png (100%) rename {test => unilabos/test}/workflow/example_prcxi.json (100%) rename {test => unilabos/test}/workflow/example_prcxi_graph.png (100%) rename {test => unilabos/test}/workflow/example_prcxi_graph_20251022_1359.png (100%) rename {test => unilabos/test}/workflow/merge_workflow.py (100%) diff --git a/MANIFEST.in b/MANIFEST.in index aa1a5d87..d81945e6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ +recursive-include unilabos/test * recursive-include unilabos/registry *.yaml recursive-include unilabos/app/web/static * recursive-include unilabos/app/web/templates * diff --git a/docs/advanced_usage/configuration.md b/docs/advanced_usage/configuration.md new file mode 100644 index 00000000..d1fdb69e --- /dev/null +++ b/docs/advanced_usage/configuration.md @@ -0,0 +1,746 @@ +# Uni-Lab 配置指南 + +本文档详细介绍 Uni-Lab 配置文件的结构、配置项、命令行覆盖和环境变量的使用方法。 + +## 配置文件概述 + +Uni-Lab 使用 Python 格式的配置文件(`.py`),默认为 `unilabos_data/local_config.py`。配置文件采用类属性的方式定义各种配置项,比 YAML 或 JSON 提供更多的灵活性,包括支持注释、条件逻辑和复杂数据结构。 + +## 获取实验室密钥 + +在配置文件或启动命令中,您需要提供实验室的访问密钥(ak)和私钥(sk)。 + +**获取方式:** + +进入 [Uni-Lab 实验室](https://uni-lab.bohrium.com),点击左下角的头像,在实验室详情中获取所在实验室的 ak 和 sk: + +![copy_aksk.gif](image/copy_aksk.gif) + +## 配置文件格式 + +### 默认配置示例 + +首次使用时,系统会自动创建一个基础配置文件 `local_config.py`: + +```python +# unilabos的配置文件 + +class BasicConfig: + ak = "" # 实验室网页给您提供的ak代码 + sk = "" # 实验室网页给您提供的sk代码 + + +# WebSocket配置,一般无需调整 +class WSConfig: + reconnect_interval = 5 # 重连间隔(秒) + max_reconnect_attempts = 999 # 最大重连次数 + ping_interval = 30 # ping间隔(秒) +``` + +### 完整配置示例 + +您可以根据需要添加更多配置选项: + +```python +#!/usr/bin/env python +# coding=utf-8 +"""Uni-Lab 配置文件""" + +# 基础配置 +class BasicConfig: + ak = "" # 实验室访问密钥 + sk = "" # 实验室私钥 + working_dir = "" # 工作目录(通常自动设置) + config_path = "" # 配置文件路径(自动设置) + is_host_mode = True # 是否为主站模式 + slave_no_host = False # 从站模式下是否跳过等待主机服务 + upload_registry = False # 是否上传注册表 + machine_name = "undefined" # 机器名称(自动获取) + vis_2d_enable = False # 是否启用2D可视化 + enable_resource_load = True # 是否启用资源加载 + communication_protocol = "websocket" # 通信协议 + log_level = "DEBUG" # 日志级别:TRACE, DEBUG, INFO, WARNING, ERROR, CRITICAL + +# WebSocket配置 +class WSConfig: + reconnect_interval = 5 # 重连间隔(秒) + max_reconnect_attempts = 999 # 最大重连次数 + ping_interval = 30 # ping间隔(秒) + +# OSS上传配置 +class OSSUploadConfig: + api_host = "" # API主机地址 + authorization = "" # 授权信息 + init_endpoint = "" # 初始化端点 + complete_endpoint = "" # 完成端点 + max_retries = 3 # 最大重试次数 + +# HTTP配置 +class HTTPConfig: + remote_addr = "https://uni-lab.bohrium.com/api/v1" # 远程服务器地址 + +# ROS配置 +class ROSConfig: + modules = [ + "std_msgs.msg", + "geometry_msgs.msg", + "control_msgs.msg", + "control_msgs.action", + "nav2_msgs.action", + "unilabos_msgs.msg", + "unilabos_msgs.action", + ] # 需要加载的ROS模块 +``` + +## 配置优先级 + +配置项的生效优先级从高到低为: + +1. **命令行参数**:最高优先级 +2. **环境变量**:中等优先级 +3. **配置文件**:基础优先级 + +这意味着命令行参数会覆盖环境变量和配置文件,环境变量会覆盖配置文件。 + +## 推荐配置方式 + +根据参数特性,不同配置项有不同的推荐配置方式: + +### 建议通过命令行指定的参数(不需要写入配置文件) + +以下参数推荐通过命令行或环境变量指定,**一般不需要在配置文件中配置**: + +| 参数 | 命令行参数 | 原因 | +| ----------------- | ------------------- | ------------------------------------ | +| `ak` / `sk` | `--ak` / `--sk` | **安全考虑**:避免敏感信息泄露 | +| `working_dir` | `--working_dir` | **灵活性**:不同环境可能使用不同目录 | +| `is_host_mode` | `--is_slave` | **运行模式**:由启动场景决定,不固定 | +| `slave_no_host` | `--slave_no_host` | **运行模式**:从站特殊配置,按需使用 | +| `upload_registry` | `--upload_registry` | **临时操作**:仅首次启动或更新时需要 | +| `vis_2d_enable` | `--2d_vis` | **调试功能**:按需临时启用 | +| `remote_addr` | `--addr` | **环境切换**:测试/生产环境快速切换 | + +**推荐用法示例:** + +```bash +# 标准启动命令(所有必要参数通过命令行指定) +unilab --ak your_ak --sk your_sk -g graph.json + +# 测试环境 +unilab --addr test --ak your_ak --sk your_sk -g graph.json + +# 从站模式 +unilab --is_slave --ak your_ak --sk your_sk + +# 首次启动上传注册表 +unilab --ak your_ak --sk your_sk -g graph.json --upload_registry +``` + +### 适合在配置文件中配置的参数 + +以下参数适合在配置文件中配置,通常不会频繁更改: + +| 参数 | 配置类 | 说明 | +| ------------------------ | ----------- | ---------------------- | +| `log_level` | BasicConfig | 日志级别配置 | +| `reconnect_interval` | WSConfig | WebSocket 重连间隔 | +| `max_reconnect_attempts` | WSConfig | WebSocket 最大重连次数 | +| `ping_interval` | WSConfig | WebSocket 心跳间隔 | +| `modules` | ROSConfig | ROS 模块列表 | + +**配置文件示例(推荐最小配置):** + +```python +# unilabos的配置文件 + +class BasicConfig: + log_level = "INFO" # 生产环境建议 INFO,调试时用 DEBUG + +# WebSocket配置,一般保持默认即可 +class WSConfig: + reconnect_interval = 5 + max_reconnect_attempts = 999 + ping_interval = 30 +``` + +**注意:** `ak` 和 `sk` 不建议写在配置文件中,始终通过命令行参数或环境变量传递。 + +## 命令行参数覆盖配置 + +Uni-Lab 允许通过命令行参数覆盖配置文件中的设置,提供更灵活的配置方式。 + +### 支持命令行覆盖的配置项 + +| 配置类 | 配置字段 | 命令行参数 | 说明 | +| ------------- | ----------------- | ------------------- | -------------------------------- | +| `BasicConfig` | `ak` | `--ak` | 实验室访问密钥 | +| `BasicConfig` | `sk` | `--sk` | 实验室私钥 | +| `BasicConfig` | `working_dir` | `--working_dir` | 工作目录路径 | +| `BasicConfig` | `is_host_mode` | `--is_slave` | 主站模式(参数为从站模式,取反) | +| `BasicConfig` | `slave_no_host` | `--slave_no_host` | 从站模式下跳过等待主机服务 | +| `BasicConfig` | `upload_registry` | `--upload_registry` | 启动时上传注册表信息 | +| `BasicConfig` | `vis_2d_enable` | `--2d_vis` | 启用 2D 可视化 | +| `HTTPConfig` | `remote_addr` | `--addr` | 远程服务地址 | + +### 特殊命令行参数 + +除了直接覆盖配置项的参数外,还有一些特殊的命令行参数: + +| 参数 | 说明 | +| ------------------- | ------------------------------------ | +| `--config` | 指定配置文件路径 | +| `--port` | Web 服务端口(不影响配置文件) | +| `--disable_browser` | 禁用自动打开浏览器(不影响配置文件) | +| `--visual` | 可视化工具选择(不影响配置文件) | +| `--skip_env_check` | 跳过环境检查(不影响配置文件) | + +### 命令行覆盖使用示例 + +```bash +# 通过命令行覆盖认证信息 +unilab --ak "new_access_key" --sk "new_secret_key" -g graph.json + +# 覆盖服务器地址 +unilab --ak ak --sk sk --addr "https://custom.server.com/api/v1" -g graph.json + +# 启用从站模式并跳过等待主机 +unilab --is_slave --slave_no_host --ak ak --sk sk + +# 启用上传注册表和2D可视化 +unilab --upload_registry --2d_vis --ak ak --sk sk -g graph.json + +# 组合使用多个覆盖参数 +unilab --ak "key" --sk "secret" --addr "test" --upload_registry --2d_vis -g graph.json +``` + +### 预设环境地址 + +`--addr` 参数支持以下预设值,会自动转换为对应的完整 URL: + +- `test` → `https://uni-lab.test.bohrium.com/api/v1` +- `uat` → `https://uni-lab.uat.bohrium.com/api/v1` +- `local` → `http://127.0.0.1:48197/api/v1` +- 其他值 → 直接使用作为完整 URL + +## 配置选项详解 + +### 1. BasicConfig - 基础配置 + +基础配置包含了系统运行的核心参数: + +| 参数 | 类型 | 默认值 | 说明 | +| ------------------------ | ---- | ------------- | ------------------------------------------ | +| `ak` | str | `""` | 实验室访问密钥(必需) | +| `sk` | str | `""` | 实验室私钥(必需) | +| `working_dir` | str | `""` | 工作目录,通常自动设置 | +| `config_path` | str | `""` | 配置文件路径,自动设置 | +| `is_host_mode` | bool | `True` | 是否为主站模式 | +| `slave_no_host` | bool | `False` | 从站模式下是否跳过等待主机服务 | +| `upload_registry` | bool | `False` | 启动时是否上传注册表信息 | +| `machine_name` | str | `"undefined"` | 机器名称,自动从 hostname 获取(不可配置) | +| `vis_2d_enable` | bool | `False` | 是否启用 2D 可视化 | +| `enable_resource_load` | bool | `True` | 是否启用资源加载 | +| `communication_protocol` | str | `"websocket"` | 通信协议,固定为 websocket | +| `log_level` | str | `"DEBUG"` | 日志级别 | + +#### 日志级别选项 + +- `TRACE` - 追踪级别(最详细) +- `DEBUG` - 调试级别(默认) +- `INFO` - 信息级别 +- `WARNING` - 警告级别 +- `ERROR` - 错误级别 +- `CRITICAL` - 严重错误级别(最简略) + +#### 认证配置(ak / sk) + +`ak` 和 `sk` 是必需的认证参数: + +1. **获取方式**:在 [Uni-Lab 官网](https://uni-lab.bohrium.com) 注册实验室后获得 +2. **配置方式**: + - **命令行参数**:`--ak "your_key" --sk "your_secret"`(最高优先级,推荐) + - **环境变量**:`UNILABOS_BASICCONFIG_AK` 和 `UNILABOS_BASICCONFIG_SK` + - **配置文件**:在 `BasicConfig` 类中设置(不推荐,安全风险) +3. **安全注意**:请妥善保管您的密钥信息,不要提交到版本控制 + +**推荐做法**: + +- **开发环境**:使用命令行参数或环境变量 +- **生产环境**:使用环境变量 +- **临时测试**:使用命令行参数 + +### 2. WSConfig - WebSocket 配置 + +WebSocket 是 Uni-Lab 的主要通信方式: + +| 参数 | 类型 | 默认值 | 说明 | +| ------------------------ | ---- | ------ | ------------------ | +| `reconnect_interval` | int | `5` | 断线重连间隔(秒) | +| `max_reconnect_attempts` | int | `999` | 最大重连次数 | +| `ping_interval` | int | `30` | 心跳检测间隔(秒) | + +### 3. HTTPConfig - HTTP 配置 + +HTTP 客户端配置用于与云端服务通信: + +| 参数 | 类型 | 默认值 | 说明 | +| ------------- | ---- | -------------------------------------- | ------------ | +| `remote_addr` | str | `"https://uni-lab.bohrium.com/api/v1"` | 远程服务地址 | + +**预设环境地址**: + +- 生产环境:`https://uni-lab.bohrium.com/api/v1`(默认) +- 测试环境:`https://uni-lab.test.bohrium.com/api/v1` +- UAT 环境:`https://uni-lab.uat.bohrium.com/api/v1` +- 本地环境:`http://127.0.0.1:48197/api/v1` + +### 4. OSSUploadConfig - OSS 上传配置 + +对象存储服务配置,用于文件上传功能: + +| 参数 | 类型 | 默认值 | 说明 | +| ------------------- | ---- | ------ | -------------------- | +| `api_host` | str | `""` | OSS API 主机地址 | +| `authorization` | str | `""` | 授权认证信息 | +| `init_endpoint` | str | `""` | 上传初始化端点 | +| `complete_endpoint` | str | `""` | 上传完成端点 | +| `max_retries` | int | `3` | 上传失败最大重试次数 | + +### 5. ROSConfig - ROS 配置 + +配置 ROS 消息转换器需要加载的模块: + +| 配置项 | 类型 | 默认值 | 说明 | +| --------- | ---- | ---------- | ------------ | +| `modules` | list | 见下方示例 | ROS 模块列表 | + +**默认模块列表:** + +```python +class ROSConfig: + modules = [ + "std_msgs.msg", # 标准消息类型 + "geometry_msgs.msg", # 几何消息类型 + "control_msgs.msg", # 控制消息类型 + "control_msgs.action", # 控制动作类型 + "nav2_msgs.action", # 导航动作类型 + "unilabos_msgs.msg", # UniLab 自定义消息类型 + "unilabos_msgs.action", # UniLab 自定义动作类型 + ] +``` + +您可以根据实际使用的设备和功能添加其他 ROS 模块。 + +## 环境变量配置 + +Uni-Lab 支持通过环境变量覆盖配置文件中的设置。 + +### 环境变量命名规则 + +``` +UNILABOS_<配置类名>_<配置项名> +``` + +**注意:** + +- 环境变量名不区分大小写 +- 配置类名和配置项名都会转换为大写进行匹配 + +### 设置环境变量 + +#### Linux / macOS + +```bash +# 临时设置(当前终端) +export UNILABOS_BASICCONFIG_LOG_LEVEL=INFO +export UNILABOS_BASICCONFIG_AK="your_access_key" +export UNILABOS_BASICCONFIG_SK="your_secret_key" + +# 永久设置(添加到 ~/.bashrc 或 ~/.zshrc) +echo 'export UNILABOS_BASICCONFIG_LOG_LEVEL=INFO' >> ~/.bashrc +source ~/.bashrc +``` + +#### Windows (cmd) + +```cmd +# 临时设置 +set UNILABOS_BASICCONFIG_LOG_LEVEL=INFO +set UNILABOS_BASICCONFIG_AK=your_access_key + +# 永久设置(系统环境变量) +setx UNILABOS_BASICCONFIG_LOG_LEVEL INFO +``` + +#### Windows (PowerShell) + +```powershell +# 临时设置 +$env:UNILABOS_BASICCONFIG_LOG_LEVEL="INFO" +$env:UNILABOS_BASICCONFIG_AK="your_access_key" + +# 永久设置 +[Environment]::SetEnvironmentVariable("UNILABOS_BASICCONFIG_LOG_LEVEL", "INFO", "User") +``` + +### 环境变量类型转换 + +系统会根据配置项的原始类型自动转换环境变量值: + +| 原始类型 | 转换规则 | +| -------- | --------------------------------------- | +| `bool` | "true", "1", "yes" → True;其他 → False | +| `int` | 转换为整数 | +| `float` | 转换为浮点数 | +| `str` | 直接使用字符串值 | + +**示例:** + +```bash +# 布尔值 +export UNILABOS_BASICCONFIG_IS_HOST_MODE=true # 将设置为 True +export UNILABOS_BASICCONFIG_IS_HOST_MODE=false # 将设置为 False + +# 整数 +export UNILABOS_WSCONFIG_RECONNECT_INTERVAL=10 # 将设置为 10 + +# 字符串 +export UNILABOS_BASICCONFIG_LOG_LEVEL=INFO # 将设置为 "INFO" +``` + +### 环境变量示例 + +```bash +# 设置基础配置 +export UNILABOS_BASICCONFIG_AK="your_access_key" +export UNILABOS_BASICCONFIG_SK="your_secret_key" +export UNILABOS_BASICCONFIG_IS_HOST_MODE="true" + +# 设置WebSocket配置 +export UNILABOS_WSCONFIG_RECONNECT_INTERVAL="10" +export UNILABOS_WSCONFIG_MAX_RECONNECT_ATTEMPTS="500" + +# 设置HTTP配置 +export UNILABOS_HTTPCONFIG_REMOTE_ADDR="https://uni-lab.test.bohrium.com/api/v1" +``` + +## 配置文件使用方法 + +### 1. 使用默认配置文件(推荐) + +系统会自动查找并加载配置文件: + +```bash +# 直接启动,使用默认的 unilabos_data/local_config.py +unilab --ak your_ak --sk your_sk -g graph.json +``` + +查找顺序: + +1. 环境变量 `UNILABOS_BASICCONFIG_CONFIG_PATH` 指定的路径 +2. 工作目录下的 `local_config.py` +3. 首次使用时会引导创建配置文件 + +### 2. 指定配置文件启动 + +```bash +# 使用指定配置文件启动 +unilab --config /path/to/your/config.py --ak ak --sk sk -g graph.json +``` + +### 3. 配置文件验证 + +系统启动时会自动验证配置文件: + +- **语法检查**:确保 Python 语法正确 +- **类型检查**:验证配置项类型是否匹配 +- **加载确认**:控制台输出加载成功信息 + +## 常用配置场景 + +### 场景 1:调整日志级别 + +**配置文件方式:** + +```python +class BasicConfig: + log_level = "INFO" # 生产环境建议使用 INFO 或 WARNING +``` + +**环境变量方式:** + +```bash +export UNILABOS_BASICCONFIG_LOG_LEVEL=INFO +unilab --ak ak --sk sk -g graph.json +``` + +**命令行方式**(需要配置文件已包含): + +```bash +# 配置文件无直接命令行参数,需通过环境变量 +UNILABOS_BASICCONFIG_LOG_LEVEL=INFO unilab --ak ak --sk sk -g graph.json +``` + +### 场景 2:配置 WebSocket 重连 + +**配置文件方式:** + +```python +class WSConfig: + reconnect_interval = 10 # 增加重连间隔到 10 秒 + max_reconnect_attempts = 100 # 减少最大重连次数到 100 次 +``` + +**环境变量方式:** + +```bash +export UNILABOS_WSCONFIG_RECONNECT_INTERVAL=10 +export UNILABOS_WSCONFIG_MAX_RECONNECT_ATTEMPTS=100 +``` + +### 场景 3:切换服务器环境 + +**配置文件方式:** + +```python +class HTTPConfig: + remote_addr = "https://uni-lab.test.bohrium.com/api/v1" +``` + +**环境变量方式:** + +```bash +export UNILABOS_HTTPCONFIG_REMOTE_ADDR=https://uni-lab.test.bohrium.com/api/v1 +``` + +**命令行方式(推荐):** + +```bash +unilab --addr test --ak your_ak --sk your_sk -g graph.json +``` + +### 场景 4:从站模式配置 + +**配置文件方式:** + +```python +class BasicConfig: + is_host_mode = False # 从站模式 + slave_no_host = True # 不等待主机服务 +``` + +**命令行方式(推荐):** + +```bash +unilab --is_slave --slave_no_host --ak your_ak --sk your_sk +``` + +## 最佳实践 + +### 1. 安全配置 + +**不要在配置文件中存储敏感信息** + +- ❌ **不推荐**:在配置文件中明文存储 ak/sk +- ✅ **推荐**:使用环境变量或命令行参数 + +```bash +# 生产环境 - 使用环境变量(推荐) +export UNILABOS_BASICCONFIG_AK="your_access_key" +export UNILABOS_BASICCONFIG_SK="your_secret_key" +unilab -g graph.json + +# 或使用命令行参数 +unilab --ak "your_access_key" --sk "your_secret_key" -g graph.json +``` + +**其他安全建议:** + +- 不要将包含密钥的配置文件提交到版本控制系统 +- 限制配置文件权限:`chmod 600 local_config.py` +- 定期更换访问密钥 +- 使用 `.gitignore` 排除配置文件 + +### 2. 多环境配置 + +为不同环境创建不同的配置文件: + +``` +configs/ +├── base_config.py # 基础配置(非敏感) +├── dev_config.py # 开发环境 +├── test_config.py # 测试环境 +├── prod_config.py # 生产环境 +└── example_config.py # 示例配置 +``` + +**环境切换示例**: + +```bash +# 本地开发环境 +unilab --config configs/dev_config.py --addr local --ak ak --sk sk -g graph.json + +# 测试环境 +unilab --config configs/test_config.py --addr test --ak ak --sk sk --upload_registry -g graph.json + +# 生产环境 +unilab --config configs/prod_config.py --ak "$PROD_AK" --sk "$PROD_SK" -g graph.json +``` + +### 3. 配置管理 + +**配置文件最佳实践:** + +- 保持配置文件简洁,只包含需要修改的配置项 +- 为配置项添加注释说明其作用 +- 定期检查和更新配置文件 +- 版本控制仅保存示例配置,不包含实际密钥 + +**命令行参数优先使用场景:** + +- 临时测试不同配置 +- CI/CD 流水线中的动态配置 +- 不同环境间快速切换 +- 敏感信息的安全传递 + +### 4. 灵活配置策略 + +**基础配置文件 + 命令行覆盖**的推荐方式: + +```python +# base_config.py - 基础配置(非敏感信息) +class BasicConfig: + # 非敏感配置写在文件中 + is_host_mode = True + upload_registry = False + vis_2d_enable = False + log_level = "INFO" + +class WSConfig: + reconnect_interval = 5 + max_reconnect_attempts = 999 + ping_interval = 30 +``` + +```bash +# 启动时通过命令行覆盖关键参数 +unilab --config base_config.py \ + --ak "$AK" \ + --sk "$SK" \ + --addr "test" \ + --upload_registry \ + --2d_vis \ + -g graph.json +``` + +## 故障排除 + +### 1. 配置文件加载失败 + +**错误信息**:`[ENV] 配置文件 xxx 不存在` + +**解决方法**: + +- 确认配置文件路径正确 +- 检查文件权限是否可读 +- 确保配置文件是 `.py` 格式 +- 使用绝对路径或相对于当前目录的路径 + +### 2. 语法错误 + +**错误信息**:`[ENV] 加载配置文件 xxx 失败` + +**解决方法**: + +- 检查 Python 语法是否正确 +- 确认类名和字段名拼写正确 +- 验证缩进是否正确(使用空格而非制表符) +- 确保字符串使用引号包裹 + +### 3. 认证失败 + +**错误信息**:`后续运行必须拥有一个实验室` + +**解决方法**: + +- 确认 `ak` 和 `sk` 已正确配置 +- 检查密钥是否有效(未过期或撤销) +- 确认网络连接正常 +- 验证密钥是否来自正确的实验室 + +### 4. 环境变量不生效 + +**解决方法**: + +- 确认环境变量名格式正确(`UNILABOS_<类名>_<字段名>`) +- 检查环境变量是否已正确设置(`echo $VARIABLE_NAME`) +- 重启终端或重新加载环境变量 +- 确认环境变量值的类型正确 + +### 5. 命令行参数不生效 + +**错误现象**:设置了命令行参数但配置没有生效 + +**解决方法**: + +- 确认参数名拼写正确(如 `--ak` 而不是 `--access_key`) +- 检查参数格式是否正确(布尔参数如 `--is_slave` 不需要值) +- 确认参数位置正确(所有参数都应在 `unilab` 之后) +- 查看启动日志确认参数是否被正确解析 +- 检查是否有配置文件或环境变量与之冲突 + +### 6. 配置优先级混淆 + +**错误现象**:不确定哪个配置生效 + +**解决方法**: + +- 记住优先级:**命令行参数 > 环境变量 > 配置文件** +- 使用 `--ak` 和 `--sk` 参数时会看到提示信息:"传入了 ak 参数,优先采用传入参数!" +- 检查启动日志中的配置加载信息 +- 临时移除低优先级配置来测试高优先级配置是否生效 +- 使用 `printenv | grep UNILABOS` 查看所有相关环境变量 + +## 配置验证 + +### 检查配置是否生效 + +启动 Uni-Lab 时,控制台会输出配置加载信息: + +``` +[ENV] 配置文件 /path/to/config.py 加载成功 +[ENV] 设置 BasicConfig.log_level = INFO +传入了ak参数,优先采用传入参数! +传入了sk参数,优先采用传入参数! +``` + +### 常见配置错误 + +1. **配置文件格式错误** + + ``` + [ENV] 加载配置文件 /path/to/config.py 失败 + ``` + + **解决方案**:检查 Python 语法,确保配置类定义正确 + +2. **环境变量格式错误** + + ``` + [ENV] 环境变量格式不正确:UNILABOS_INVALID_VAR + ``` + + **解决方案**:确保环境变量遵循 `UNILABOS_<类名>_<字段名>` 格式 + +3. **类或字段不存在** + ``` + [ENV] 未找到类:UNKNOWNCONFIG + [ENV] 类 BasicConfig 中未找到字段:UNKNOWN_FIELD + ``` + **解决方案**:检查配置类名和字段名是否正确 + +## 相关文档 + +- [工作目录详解](working_directory.md) +- [启动参数详解](../user_guide/launch.md) +- [快速安装指南](../user_guide/quick_install_guide.md) diff --git a/docs/advanced_usage/image/copy_aksk.gif b/docs/advanced_usage/image/copy_aksk.gif new file mode 100644 index 0000000000000000000000000000000000000000..760dd0116261248110140a913c35ecfe019638b4 GIT binary patch literal 538417 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�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

`074?u6Uoj71aTaCqIQUTS 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�E8Tlbg=tYbvb5LdWB}M@wGa%|iaAyNmZh9=uTg7kV z8hR34L#G~Jf?r_C{Vtk+f4bHaN3T{MAauSpoFyH{87O?YH(g;lQXVLBeKZ={_&~YD za@$oNm*m106gUjPnUxn3e2)zUuK$n{Eqe2=BNTc0@|si{UC4t#MsnpPIN*Q*bIC8_ z<4x+fZCMa%_1h0~J@YVf2gJMZHwLfQ!sz@!bP@D9dKQsPFa%u`SL*BaNS;P!OGgUx zo$Oe=GoP$D+{b!LsMvG;Jg6LzZ(h6tk5FC$NW8%+QAJ8WKM{8vb3NK{`d@yMama1{ zFa7vk>lE`$p@J00oW6oor;gi#bo=pLn+(?_p~4LRwZ6hk$|Xc$_GhBh!rwu(!ge|2 z7_2rvsj?WwM)3~7c9|p_uicn8<_0MRDLMx4@-?Gj6n0opR#q3m27%S0()QGEr8wQJ z`=3Z;Kc&jGChCyXcVOE)k|&dU%+q?VTC_|BC68QEfJR~Yw`agv{w>mSRT)9L3Z zUb1LHm6fc-i9tnoHyQdp}&_(uxdXb7{MNG(2ge zHpeOJ!1=IH+4)MkS+9do%g9xpv>ctxkE*b@s)xdRib`4&UENd`eN}E+AMU_FK!m0c zoE^yXM~6WBh#^~DN^l={zE@YD8a_H*tm9!JM;{0uSNQPM%Bdp#0H4&*604a4TL#ul z>$|tq%ou-ts2Qj86M@g#=4RB+ITnV!n|C38Nuj8!5jJb+HUG`q)_Z_sqImFV8YWi) z^GK6C8tOT4Qg}N*3c*{&ARHwBfbQ<|$uhHHE6siBi5UBpws9vn!K86c_Xtt7M_Uq( z@(Ve_Lzo3ri_2sM>d4iD7tb$a#-k$>&43`PSu8>uUk ztUDTfu(er?%nJ=}iu;*yjNeBO7F*e+2AhTP{uch7pYuhq;a@)g3wt9NFI`u6JBCh6 zgR!((0$T{?4_7ol3qmJ5*}4?YD1!w$@}`|`u8{Z97S!|eZN)?&(F{V0v0fqFeuZChi5izQSPUJK`jyE zXPoc&FT+#gZ`hMvS;*wwNZ*onGyM8hJyLi;udFNeA$2^Rk*~yl$kF0SpM&;&KTMmJ zm?Pg)n^iG@Y)u+*qpq_niuuv1rq|iPKK+b(>8t1yy}9wuHwWiuku(eT*mnzf&e)$PW~-k@j1EEe%7sF)jZY65N}L#& z{KG^+?RD{d8$K^Qa(4hp?pxJXw0gWwl`TQ zRparxDYAc@sQ-+8JO<+#o>cu_b@^UziBXw@PT7;NN%Q9qf$yw_wmh|Uazy3GC^qA5 z2VK22&v?HWb(7mhU7bhI#4nd@<}V%f+Ua!41I0=$Ud$sp7;DR;Vh)UH3}?<0%gRz0 z*=x!H7YCLud-z-L7P&s(?=PdC-w3hL^ilMsPFH%A#n_0Q zgpfw-JQ1GS?I!iUWC<@FTL?C-EPe_jPMyX6D%e%Te(**1V3y;DOcJBX`zXVMHS$iu z9-g2w=aP-zi)*jzgv;N@`6}h%yX$pI(pE!vbvI7vg#IZop2f$NZZLhI=vR&9`B@0r zWcC}{{4ejYl2+uS+zyAJaKyN~7dL}WWv@#0s zz*LtX(Mwxvoe*!1&v^Ua^a2Ly&* z#eL{zGO=;86kVrW7VK@X;~4sa%%elu|5Fe@V@;yoWKt9QeQ?r?#b`z<|pkU#}edp_@b+Kc=3f1?c4hYu8XYg=ADlccclrB z7isch`?|+|k1c=C3$g}nyZKfdp(IMS*D-%&)GQ^cB6=B!foV=5IP$U4la`&X&Q&1uNO(bwLsIAzmry%Xy; z!x_%Tm4jkp)4e5IdqZdOmU4}baqS(e1wGFiyTALLfVfr`aGz^bxyi#itw-$URmi&tJ{LZ=jnz;gQ>jGZuf{{<) zs(-ISEKc$*8G|fD!g54l^rDRGqT`lgbGc+a>LgO{9u9NahSwza=sAwovliElFH}C# zSxIT8l}%BWE>cRb87zFH`+K<+pu5dLdv%s zYZ)PPj7~iT_G>mSOIt2`HqK{^pYUxz-4(bJZ9~Ym-B@kir?*^rw%r*EJ?Lyb<+h!L znY=W&J+W=Qytcjkm^{L^JsfO(g9`tTGlenvJug&f-1hIV4d^f2GRoJUvkhD;1n)8F zoNWgl6@Gr=Nn-4L#%BIPX%|e#9L(CY^Mz+8n6v0Bzg>vj&R0d|Zw7Xu7R;eNK>Ju5 z3pZw)kRsc#BD>g~@W`F-@ywB_c9GRPk&Q*+9XmF)cF|#5QT;_R)66kmJ2889->-@y zA9te9cA#6#KaT8v(Cz+UEsmpPNnk8a;ADaF7bk{o`Wo2#RTp~37ABQ%|BNq8cC$}% zV@i4oVFaqhoAQS+C0w7QT6bgVt0SG7n`QJ=HH~<6(K;Qr<8~}#{5O4tUzv+Pp00;qq zAOKJV0FD445CG(VYXTwxAS3{S1VE7hI1+$B0+9b-C>RI;g8*O%01O3y;Q%lK07e49 z03a9$1cQKJ2oMYfg5f|g0tiL|!2l2#2m*sZU7zhD_AYcdt z426K<5HJD)Mnb>RI@gP>pt6byxe;ZQIF3PwV~05}*32ZP{X2pkNBgW+&60uDyP z!2kpphya5SUERekYETB3`K(BNH78kMk2ug01OC#fdDWF z00srX-~bo`07C*`03Zwqgn@uC2oMGZ!r(v{0tiC_VE_;e2!eq?FbD_+1;OAT7y<-C zf?xm$33PVC+05}W?hk@WQ z2pk55!{Bfj0uDpMVE_aSh=73*FbDz$MZn+)7ybA1A!6oi6bZ&;iZ!sQ61_hTi~ThvGZki?ku*xRrL%wRCSb+`wPo{lpVs>`lm%wH^+}v=!J({bOrP|VX zxsUkcxIEm_bbY+i8HIYI_P6==d}pG>bmVV~e|&-Cz=+fQ2j~07)0vlnS)YTRB;4}L z0e6I$*}>1r1Xn_^`F-AgeZ^WoYm0d`V-iAW6Y(yL^s#r<|7{raS_Cl3j?P1YIx*)X zTjtJM6n78vdNl8}-Fl3mh5V{K)zwUHxHtyZ2K1Q$VkSyC?OS{kE{n(U389+>OszZNYyAS zmD8UIakj&nNef4(+6Cu*rem=-M134cOoHugo7kyEaQzG<|<6=~X-05Nr#8h@Ma0RE6 z9Z^4rqqiyPI$cib*_K^S8|gX?FlvN5O|+s%In^4W&`v(}5li`8&6C&AaW8nxbbk`@ z++Ng()I^}%O6L4t;?Hy(Lf+l1lHQ83twq=6e-bm`<-C=ORCD$-7*B;y|LIy+ ziuHwObR7-JFHg3QDvdah3>sEEXufo*a3T8P&-JMBB=SJsuCFtPZtd2+No+5ze`QCc zvBH6R5G9Qkd30bLV@3g@zqdd4VPuhM4?t7SR>sEQe<7qEOcx(Q0(;qxos?&G@FzPu zwwLb3k=oa{)L0nO^?A&ocm6u9``z?~4v3ON@wHhK%8DB!LETMrx*wSX3U0j7RUS+00^FpAW}zr7%dKB})4&ufJ-WAL&%KfXfO^&-I75n?ebaX|z_U+*)>tg*hDO_u;|&VGNQLVv z=Zn$Ji0f4j$UZ53oS@s%v7k{A4Ybpt|2@*&tdTEY`wLB9C?>FMh0Yeh9jQNSQPF}f zwZR(>KyvbaRj70{ArGj)*#1e{v1kpj>c*}YKkpcp=_nq1=_EaviVV6US?pe*S)-M!aTAj^tx@Eu2J-SW; zUz(MuJ3mp{%%gNBpXUMogeRGI%jwvq`2HD}di$cUn{|Z0aM3DMz#Mn_jk^Y_1MP>D zR`%dD70@ca{148bo7#pcTn8vs0n z6ggb{`&s25-#XFf&!F>?{O`Ht`L1Rv>t0f|DAXA8W%T=(RUKtv`)&=MOT0RGFhAiK z{H~K)6)oHGf%r?n7Sor@dWTdJzk}P)m2(ZT7CVFMMa~?|64;BVYg8Gd_@}RWHw|@j zJ6nr;$c+Spn||N-$f(Zv!oC~&DpZY(KW!+Vi|LdaKlXb8Ki6;I!8+yaaNp<8JZUZk zU{|~ymsY=CDvw^js;iSIQ@6HB(mD^P?wkyMLT^)RaJLdj`2VygBJlYZ{t5PiduR&3 zQqvr7$23jW(25{9$@=S6r#H@&Kvjt9-wRfWUu<8m9pCBbMZ65@Jk?Ybq`s~rM4P~7 zbCYW2HkSH{7A)ZYr$hHq(kH`47-QWDtIz`Pr83EkT`sxoGxuPBYmfO_EW@^7mHKao zq4Mnl;b9*GVrLA^)|C~^Ea$AnM}X*u1l(`))iHk20qO%32%g2F!kmTk0($;9tI<2P z*4Tg63WO1JQ`Uu)0X2P?sg++x{;hJO_hD1J4lqV2QWf}?p{XTzgNZQJX7hy=Z3q;} ztnFT-qo4C)6^4>UfK|iA>fC%A^c z>pe|?E$!A;Z}no=Lf6*w*b8ch8I9H%cQ|RHxd#36JKVos$+{Ez?0Xo_xjncLN;WG- z)JJtj9v`Fex$!Cva}0_>=<@3853J4~R)|k8Pk)>Wx&e1zzd`vV#C`lhI_Afc0u2e{ z=4446;7y2;cT3ZAJ1t1aw02b9eXV9k_P$R^0nJ#gIL=egMfa9mwBe`cpEwi!*9EVW z!gHgoSYBH)gxFFDnl&T^tj0O_B@s{%GE*cQjQ#Y&;-gPV4ls|`=u5UqNcgf#?j!W; zemp6xm?g&mTK%+o-?YY*wC0Aizq4s=w`m;|>0LtUJ^JbYeAD|= z(gz#ThiB7AZ_~#qGA4HkTji7UD993Kb#@aoX5V?SlXFX=HZt5!c`yD%lbw2Qu+Z!Y zDeCJc?-!FoF;c0=GEcE+9!E7vcTKM;$Up06ed)A+5`;WA$bL$VVx(qcHfCebW#isu z<5T`75dKYM@SDW%H(BcMr{E~%+;8f;-?WrDZ-sN{403>eIgF_}%#Ar(ECg451hK_G zAF#;g`%FIEQDYaUT3`AI%#rnc%_JPl5!>^}I?aimF_9F`QyvrgC6h&Ao~OtfsrB9M z<6feMFj;|b{#%}(>JEwe@`NYF`JAg@K1KNzmI6Ts0^7NS7aub1446NA#k1w*x+vyZ zA@bQ26wM6^#e)5wuNKDUC3OG^*1HM^2ooF?ZJ$Z!hoNAkCCunzVQ6$J)VZ||jWjR`Mb)vg$<(yc970p`tuDuL$m;XDYO8PYA+#nGn ziok*?b|=w{B0}}4{^xON&Z%g;X;obdH7kAl2M^_G#{~TI!rWQ@r|;l|JbbGP_^d3) zuS#lwSYNnEUD((`-dJb~E_ot+Y$w{$Esil|P9v*7IRzK8_AbEypJ6+>gN^+ev^g8W znr1P>vYJ3oIE7Masb8rx8}XfR0&kQ;P6Y*z+-EBY2%K zycTT?f3n6IhspEVs0tQ8LD^FYj6~dBr0_R-rBh>rlzG`QwxGHnnC+{;th@G$cj1N? zyl#vd(V>meX@0?I{+zd5B`HcR6O2IHeBTuG}mSmo~ z;3!mO?Qw zl6X3EE<$4mO*k6;)5cCUTMbt0CoYF+d~n2fVsx~%LZQge#H>r@4%8in0SI zys!~ohx-MKUsoa9tLDb~uUW_9Q$y}FFQBq-{o1!u3S**K@K=o$BfIuTu(y?=QEbuY znVwdLT=c6IiCOaM7o}B^tewQC%@(3M_~htBZNsCX<O-mg1=HX-uymGx=WrpU< zo4y~&ow0}HvT>bPHq{qi3$<_INZY+~>$M_DHdC=w&s)KXMu$A$3^r4@nIT_Iu#WSd z=DIuNxu3s^otL}(l1OwD;DB0)@Nw6cBITB>0SjVyfb1dorNZP7vANrJAxfsjg{I6- zJ<-VF;igI6cP%>dEjCDjA#}9j1Np59#rRR|%eGbrckQ*;HFkDBaW&%ja@^SH!tU;4 zS0VOz0S&P?a_&8P>Uhu=_BL-Z;={X+m!dAEPsfLqJg(m?_j7+N^BJxF3f`QKA!)J3 zpKmf`)R?(>b!KRpT8V!BYZkygyff8iPcN{G{D2izk=lYD|7or`FwO|qMJ1zz`u^8( z%?zJsC!lmBcu;(JQs8{rJV=|ZdRs}B(FjL&p*RW95*kom7yz3N&|~JtX0Q<43V)tp z#=(RYz7_HFp!QH52Ol+UR#RCSg`5N54ZshHtRQWKtM#AtB90kD)3)t2Mn9K*(uS4z z%TF5$^V+KbKO$))9B%^NdRnKtH#FaPOOCoNCD%&r)$X8uC7_Mv{^i%_ST{&j7Ze;wlxbRW_8u(&k~AM>&x(XLab@j_P}r#d$wdEo+y|9g(BST-IGrleVMCkxW(M z5dKX&=N+*4Qhn6wm0x)7BSGBJoDgzPxymOw7V#8eh5g+VrR{;M67ACLwGNB1^6x~% z>_w>l)LYuWOJ41aC8YjqTX%o3k!#_k3XO8#Erss(({B5z98wc*SmPeaRr&OY3luqT zMi=fJ?fwshKzqN)@l5Ut5$pLZ>hNw7wr=AsRjWC4JKMF1Pjv>V6&YL$P=f z+fVvN<;m{l%g*U`X7Cyz@1YavZs9KpVY39$3Yw6}Mn|5F=dh)x@37Ls-TvjUy{Hnu z5q%AIw5mw2ViNTKju5QrG_olW?`TuWD+LehN)di9ee?4(&y4XFvEj32^{vC~K1i`G zqbr{f6p!)^K?a&2K@3Z%fEE&8qeGeyaUa2bnH~09Aof)sabhQS+BOiRFb4jx1zzuP zMuzWlKTs$>m_8{{lVvz@U-xj%>zwZ6PtOp+UhoHdR953px?&^`xK$G3{{PO;R7VU?J7 z2n#r@=b`}dPoTXm0Rn8YRZGgIEn2o{YPiLoz<&V>YLT)fqZEu=S{VcxQshXIB~6}0 znNsCSmMvYrgc(!jOqw-q-o%+RB}JYTV^$1luV&AIGNb53npEjhrcIqbg&I}rRH`kd zTorl~=&!6h|Jjl<#%BPZ3%8JJwMk3YO;XUdC1p@cT!U@f83fzv9~mjO#)@pUuoWpS zn|>K2<#w=JkZ@T+oJi4DWLu;DksEKn&1C6Xd#t6i(n?S7%{nU`WMNmX6Hh8 zY}&K`iT-t|*&tV%w|&(H9$ffv;>C?0cY3sQ6e&k@R_uzBXX3(>H&=|Z79`^Ugg+V_ zB}FKyf&mC_Vr8(^+J6kM>o&-06v)6I?Q!o;O6Vww+sSTbWsCWMB4aay1PY*?Eh>`Y zAEAmes2&7?%Im-Y{Nc+MKN<5qpyildF zY)OoxO$?O6GLXj5gsd?n(Ty>%1hNGoO)4T~6M-HA=`Wr@Qtg+FL}HK>%>t{)rwkeN zE6R#mkz|Xuc0_H9^eobnA~NTS%glnV((pw)@5D1t5aHu(rrYY&Gf+VXCA3i2m_t$j zEAv*uEdU%f^6MWd^a6?@8hxs0M~hf#uN8uXl0>hA`n&ExHxC-)sx|{F%u}-J+=Prx z_>>pm3jhL?=GPtOR&4eMsso$u>$CeCsvw_E3sBu5lvP@r=_-9Yj+ZfM3`>t z3dKYN`1V?H$0fI1;$qZRrmfN)sV9-@aqAy{;zf|JC!L(oz3vv2VpsI;n<#(`+odSH zO`fffqF>rcwKE3=8|~S<{&|xlNid4h;=;O=%;5%G(S$1*OFhsYEkpv;T$NX5**N$X z^^>TSTc){Yn{U1;iRN^IjwOMf{VQH@IYn^CObenBzrGx1gNU_ZS`3jwaf|@8knmuWb9I;^wC0X$*}L_4=ZQiEQ0JqlLPP=4zT;9?Rk3wF@|gCA6h;uIBt zKD8uA$ZAuTytE{cQR>M z>NKUm^hraHu}(;MvcQ0W(27@75%eSc3OJRzScP!=CX17K*Ca{%uY-JqbNF`Fh&RtOw4IoWJ z6f7ALSCes&FMjzePZradBcx&UY&5-NHq)7TLln=>D4pBLQB11;yk#6oc1>Qs2aXVw zV>ZKCO$%AmloPz>Gu64ymtay|8r-BozEwtc*3+IK0_9M4qf9A^^OXH;)IWRa&u)5i zpr@RrLAeRRb23z%_k`#%U&c>rrY52n#i)yPM$ey26FKNyT%*RhP=|Wcp>xb=O2O#P z5^2&Pf>UWsWjdSera*~n%yksRenaNLfa+IMwWhqyg%2&2> zma)8LEq9sAU-ojC!8~R$mzm6GHglTMyk<4GnaykFt5%3oVjtJ}P{<-Gd<9|J=Pm6ME2vM)aW-Eoep?y3vV#^r9U-X-HFA(v`;ar8OOCPFuRunf~;qJw0kr zlUmfJM)j#x9cosay49%;HAq9LNf_JN)=B}gZg0Koo9UEiq2+b3pF&^m?b+D>Id-y< zy=-MSo7vBHcC?{AZE07V+Sj&rwz0i!ZFig7-}ZL6!98wqmz&(@Hg~$wy>4~4o89j| z_EL~LS$cz{*22a&NpelpllI%+{|0!#1wL^9f*0K22S<3q6~1tWH{9V5hj_##K5>fw z`ze3QcgB?xVU2e@rSsmf$3_^N{=Vpzr$TMMwJJRGxH}6PxKzXCBD=8xo>J9l=Mpde&98bgg%s<6Q?k z&OpxLu-6&HIWBwJ@5FVr+u7x9hkLm|Zq>LS80&S%JBxOn_a6KFDa9jZ;1?x$!Vli? zg-8716`y#18-tv{l{N**DdCqU%^PLC%=S3fS(vRNsrAPhgRWJBo z)0*#QH~CWh5yjWn{v`G|jEWm<`@VDkHz{c6eb|9NP7P1p-oX#>-MyFlhBp6|&W9!R zO&a~@SD*UVpMLhMxqV)8-(B8!<@dWke({$-{O6ZG_|s2*^jly1>|ek6_clHzZ-f3VS=#n!(`PGta87+~Khs zTrTB9qaE|X7MvhD(=F>7LIm@>rb8e8ig2}8k%)5!|!rg;I`Eo#g8pAqdIsIBD$RayER4x^i zvk3#lw9738q{BkQt{OxvMT9#(Bqg3$Fe!Azuxdjr*{4c0M3E>V!J-Hw)WqIe!r%(U zvV+8ml0?ZWMJkNFzuBu*?7Bl_E%<^(F27{yILY(?!m@L@CO|V0=0` zjKQxkM&i1|&dS4Ov^8Edi4%lI(Go-v%f)JhIaxd|VADonv^U?wLzvJO95IPpu@#p< zo9{SB+MBU#{6_FH!#UJ2x{F7*8pfaMM3o?g1W3oa0D$EY2~q$8#37I5krPcx5Yk}C zBtQVPC=JpG2?;;~K(U4YBuD^^)JUnhN3`Nb@hYp1+^kV-M3*1~07w9Vv;_djo@|MN zfJ7DmKmeJf$pna>1fa>8)XAJg$*fpO1W=xXX$72203=8NAb3cVXb0xVmccM8yeTkf zd8rT+$(5SNWIU0o6vkG(sTy&KRzONtC`trC%CbZNB?p4qi)XO~qeOz4EXvXR7z99^$Z!{wL=ZZ`l>~@_ir@=h2%X4~f`Cj9XlaK8 zkf82JN|GQ2mK+KHDG*I|bQGlYNtsm0+yny5v`WXKM>I6PdSlMB%Exlr$7w_?24 zizI-_=|nLdOvVHh(7S3zF%+*PU{LYM9q}|JUZIaDNCFC_P#JMgiV#jxV9@rcO}AJG z_t`Kh(3vE#g`woh-n=H9{0@pZNw*Ns>#zl+{0{^;im})N0QkcLtsrT%!q(zZySheK zgvXJ{NCa?{2J=URi43qj8OPK}9d(eibQAHsNEj{1uW-l|vIhxB%mkUyNqH9Z6iCT1 zPB{Y5vH=4B0Jx6D1Oh7&&%>CKcHm0`4N{@wL>gneJH^Lvq(sLNt|&+V2|ZoIJ~qXoVzT1&kCG^T<(8`G?%xP4g_%NIg_j$xWE5%>_Xc zq!i8oO-+B~Q=Pj?vP#7biq)X1P8qvSf+>rNbkTyu3{7Cup8zBNUq4p+(`_w zWYe=C1Bc8CN&$`9R35xpi^)LDQT>N8*iJc$%rVhX)^U)d84fkjv|E$RzM1l%$lO1Og}xrvN}oc9qwtn^jMY!jpZgT&0mX`%(7sRe@O6 zpFsf2pqOIKSqYe%WkpydK#=Spnn&T4dgv232@Ifo7J}4GWI0NU{Z%AIRA=o=AP|dx zs0YIgfLcHTzl@_gWm$L4)919)u!SnkbS};e+5}*vTmgWm;n!6$O^P{Gntap*;E4)# z69D*})|pv~@K#C@PEHvQ6`hVlrHC9A53cZsO`y`RIMdzn*iw7Xd@lnw7Md?(< z%T+0tEk;s8mhCiA`;?o2B-RDN5i-Dx)}7MvT&2rkQ}+RYcIXMm)eAQzSHXnZRYd^* z$^cOFDNX>$-F=0Q2-r^4{7oPzThFB#WTe$Zbl$8=P+U~oif~B2b=>7VT}nyRSn`Ps ztqAdL1po+4EdT(>c@pzQf;sVtQ7~MeV9}om0H7U<+I*TB{awbvNmXqf;GAA+Ap?kD z2m*cxHIa^#Jwk^Kxd7IxlB3F)Aw=w?*(4y1qWlQZh}JEsby3v*(0#*5Rb zC4p!MR?s6}8lJBx8xpzSkcAI$8ma3*&jJDDwL=nwBxN(<70KMGWO`0e4CRcX*KxE= z^h+nr-6M-5sppH?o@tPS+9qup2%UMxR;~)3P>@y-CVRk@T#<p7!Dzxn>;c{ev%H=4= zL{sTx%?&Ac7OS4{6<+$3Jw_u1M#SR##e?SOK;}xW+SLofW(7>>6_FYLgfM5rV5DYt z<^`6)h*qiU-As<&tT|GUNxs5mKAC~;V|MO}9R=xQ8q%%|=9Z4BIZ6^a8?4V2DkjYdOz9BM2Q5EqC(Cukf zo@!5eWoP_q!YXQ#h7Ob7=^Punv0kTXenqyvE1EW7;XP-qR^pJ5>R3h+=a2xnZYFpp zu$cDilv6M>Y0;9-m88Dwr7mdbL}-)v)4`^hs1|I=ekPPs5W4V*npTjVE>c3?Xv;Px zk51c~I8neb*_BA`k|+&=c9d2q9h&$ov?0tvsqC3}#@oiPY+@w;*%6AiwGr3uMn4p7 zN_uGt{%n*OA1b*R!@%i;H06>A42nt&NsyYfP?hLl6@`>;jhG71m0N+d*F-e7zqVYB=8OZR)~=yRuA-^i6jB#ksy!x2#SV52>_i{Uyc%u?lK z^y)(gp|DoamjGe(P7DW03;}5q^1x<63KF=94pKPp7X65YKn?p~95bPqavz1%rr$QA zm$>M&XBVVv-3*3s3+@IjEf@o;~rh-Kql{t*cp z47uR)kqCE0mJ|&Ubx%H-%@GKp86DfD7X~TS}g^e0&o8fgpEOq>?qjqxFPi5Lt1m}I)w@Z8B7%>WA=9t+8tr0&pr zEPoOMsf&>je1`C$(Gd_x;U#I2b*iTqE6I%i#!&O#LVD-IYd!VGrUxUyj*~T&5)d8PxGwsg^D-**hPI{iFsZPr&OtB1_{hYPmHWM`5zq*PQ4ma zfg4ic_462=Iw6SKo{}*i4BAJf@tBLE0SGDf{{0IOU`v2n1Pca`Ldqb-hz3b%X=kt? zsf7l~NV!Nb02zauwk)(IrPW7>n;;UjXKR#}RuCy#4Djn>fK38ZZiyn(q|5;JNOctI z(4WvPMFW&PY0%ylgiMLnoY_js7JCx6a_#E%E7-7N$C52;_AJ`8YRfW&sC6yVg$v&X zhyu}WM7(hK^6l&QFW|s}2NN!A_%P!C#Db+Trn{HnFUMaAvg)|-7uJPaR(@2<%4I7p zn|}Q>sqmxDf$gNUWB9LD>(WwerSy0;EL-}ue@lhI>S*}hm$n8 z`QvJ_8T5-L%z0FvL$u{qA5*slV3JV(4E0`cZ3RHlK>Cd*5N;P*R?uu7wPVXuM1i-P zVkxS)B8!4q_!L~l5kz8(HQIP1jydYMBac1in1mF1^;M8$ll`*^b{Z+QkQ8HR^iW%s zO{K*^A6+%jRWi<15pS!FQk)e3tU$z=7Ev%J(Qoo`2V#XS*+L2_nw*5(QdgNNg=hp_ zg&uh*dQ?zoNiM_+DM(5o*HDGxIT42?=*c3Jsi zT#Uw5j}~HT$Ix*MK{bkRM3NDOf)kMft4=kwVi$NMcKQ#YBSmQItwhQ6kv$(C*_=mD zDTQ93K1w?+wPd|mWNJ>a>UixML?fkM@bMBe^P*F&pj5VCG6|{vWa{cF;MzggQ zAh~thZP<&E#VF&Ycl-S};DHN1_+CqyDI{M+j`b0SN*-E}7EWq(Z?YL(*)VN;PX5u; zj!BqPtPKs#(tIW*d{JcyR}LVT0Z3WUiyt8fUXXKgOtVav8zkjHj~g_GB&7ezu!VV+ zR;5bV;g*uV@j=O~^F*h_(MM;}9^`Hgr6lr<;$5_HLy<1OJVW|oN-OMF-LyrL?8+9L zL8JJ-Jgkl-8x-OH`RgydTaU@OZdeevzX1}kfCfAuTF&Jc$Nb!v|I|hkI<{1iNp+B<3)CVO-?& z8d${}&MQgKpN76W8Yodw9bYo^p~Seds$o+RbG4 zY>xS6=}mLG(|j=;CI6yhPm{XTrq&-v&pa2k;P}+8e)VYi`xyViy4JS7HIFc@7DeK^ z*S>bIBvC7B)&9EJ#y<9}$J0?Xw;I{be)a%my*GoX6x!ClHnMe{E=^;*+ujEMoUj*2 z>~E91+@wx*rsr!Ay&$gH=6*N47Zc|p(K_DtzPEl!_2Ngz7~lT>_hD|F+I<7O;07lk zx_AA*G#|X-4hIXIIfPO(KfK}=ADp()qNUJYyyFK4wY#%5ZjY0^+SNH)4WC*&z6jwTl1ZFJJ_KXH^F%>^r0IXzRO-U%ZaY^SHoQ46kj^jqrNza z_#)_4mJ7$Fu60+3o8DI6I@oEBa*Z#1-Ss_t*wZfKrl+faYJdCEUzBx2a~tknQ9 z7Z=-i4H19L{qv@`cIGuN7oDHJ^$7HN=clgh!@Iurold>#k#76l7clf~mx$gtCX}iR zrI^FlitwL_eB&#>_{b-I@}bXs=|6w@)p!2!vETgYTR;2U*FN>VKmG1+fBfJlfB4IP z{qM8i{Ow=A`{NJ)`HP?a>aRck@2~&#^B?{GKR*DzU;g!90LtG0{+|Hu9|9Vn0v4eC z5nuvBAOlL^10tVL_(Qej-i+`b2M$ozi5o{*pa`ng2$moTo}dY)APTOa3br5%zMu=n zAPml+4AvkG-k=TUAP(-J4)!1q{-6&AArKCs5Eda39-$E?Arc<{VdZJy=a?N7qFo10 zVYT>Prcoglnp%=MVd-U|7j{eDxkz)s&KQ;<8J?jTrXd=xp&GU!8@{0%#vvTep&ZsB z9p0fG<{=*Lp&s@jAO4{q1|lF1q97I`As(V3CL$s(q9QipqA6P7eW4^yi{TxHh#}e~ z5*plK;wEY$Cw`(QhGHg;VkeR!D4L=umZB=2;wq*hE54#D#v&@tVk^=jEZU+h)}k)n z;x6VQFaDx01|u#GV=odTFdAblc2?a@A~W{LaMI1Z#>SRht*C1B7Vn5`N@dSx^+LLrClBeZHr2{*iuWp;pcseEug&HXfZtB7rvLn9Li!foFoYXMSeq<2|VD zO{CXRsCXKvwM--DVW{2R=bqWbfO;rJ-W=T(2XvC?s%Ug-=xS-Fi?$w!0vEN- zsB)UXh$g95>RW%7r<2-UfWB9dPH8?8 zseB1%03;-qzMWb6PZNIWNb2Z@8YY?EorU(-m8R)BYH4n9X@|Ng&n>B*H7T7IDDbi8 zN9L*8u_&8Yx5xi;~4AAOHa1Y62j^q>KUrd{x&Z zK&}oet`_UCCcsk&tFbQYvC;(qWGXLxjj$#F5GZR=J;j-f2d5gU2xhCS{u-RZ7?&Pt z6n<;X*{SeEs94m(!z2L!WEMnFYiPCq0uV&NCXB(uj6}ZTD*~w5FJS6Q+^fFgD;aFU zt|~|?000muEC8$$5U@roco7g>YeN75{`Xjs$VP#%N}RBwh!z0Ap`^#N4(iI@SGe*UmwM^gp6h~2oT81X z`xMF+xGPq`D*`YGqL4unkUDFmtQfHA$0kcLydjNpJ zfC&Ql>Y-qT*LqPD-KxPR!9QpL82~{Nw89ohO%!Y_R&+!=C@Zlh%tE+paA*Yp9FZ(l z$=3b@834fW-pj2nMe1syp_1L^nZO!;w0w94cB!L9@ZME|6==w=XXl&28>-N%Cm%eNJ z&Xtu^tNEU6M5wRhEkufbu*(6efSxWv+^W~Ihp=|dI<*TB)IvQJD@cgaCXj;H#>E%_ zfKVta5M%{VAVC7$QA;fUEg1ay?p@EG6Tol-M+Pi7CbBf zghWqV?hkWI^$fD`5^Jui8Nzl1u10_>_iK8z#IgoJ1k|t3HU#Gim?i}9yx?&BCII|A zD^axY^3;Q{N@*vr7#N3Tbwy#jJ@dn%FSCg7hN(>a&eYBNE{Gt25z}h|v=Q2nf`CkL zIqM0WU=93S#4kMmOcVeBS;5J|-ZK=Vh+K?;2UA$+N|3v*L^~)fLSWq-TeF)%Y08!a zLepH!0_lbZEqTN&>EZ83^lK>LVvPC#*+aB)MoSu|grSaxYnTU?l$@qa1uKy)+3P_70&u_VX^6fZ>7jtKzt z%oRs5ay0Ci_^({tYHT2Dtst_1-R~Wz2dD}Zu-G&~a7#u=2LK=eZjkd&ubJs?DMP>Y z#jR-yZ)ufuZ862Ks$%N1YQ$eF^1J#B0CbA}GP0fkfaDxRVHZaa6Giq4EfcTwM+oav zz40thafDp|@nC~cuEKQp(zQq_7HMaUX-DjLDqDZjUipeP)0J_|;i-}_iTpw?!}=|z z=5awlF~~}Q1qVq4ENsshumnVbZ)nJ?+ZVx ze@|;;e*_Wx@PGR^u98UH4DV{F@{#B&{@e>IcSz%E?}y9Wq0aS>H{2&{oP(nAk*%ea@mPqFPZ+1NlS$8b5iQy-IjVtI@j}FiJV?ce zQt+&|YKORdDy5f~n~5X2Tx;2d4cU~7+2+jol?P{=Bb;@lm32^)cL1xOh3|=??w;S< zLxXbBq4|z2I^zA=)#>@6e|ZsYHsxf6hcmj{p6S_6`nv`76+Ss3O&X_rI;F!7pl{BD ztP(2-I+H?#Ht(pCo4UE#wS3b$*hPmIX@zw_g_$3@sLT2^V|GK6J`@9c3xt3$T_u8?`d%>67vOi4Pu=ukBJHV^( z1|~eVCAyP~Eyb5xbkxIU6iSD9dpG?%d|qUiXMC-Jy3<9x$yXeR5pNwg3pLq7s{=d2 zOT2%se6iU&w(kgve;b8^MLo!*Jp}z&RApD5P{q{8=WzUg5qhEb^qk_nr5!xM-O3eR z{dq{lONjSOu+5E2gd2&*TZIKwl+5Y8$z~9ivzR?uw8uyk74eo#hOe)FY{J-w#V=ru zWVARtW57GzS`O>sbU8+=d811Q19{$|h2q zv}_U>z#lQ)`)2WkUt5zCG{cL3q=D&?ZaSGhIlxUQsPoYMYI+bcwt5>mR)w-4cYgeyNQ%XS^ zl_$fZ0d}G_+DekGh5txt8Knj3zqw-(Ds3fkB;S@s6B-R*Pm0C>zod{^=qvHUf(r?c zdimHRWw=t>EhIR0<-ffX1%7^Mw4D@IVks70Seg{iv;l1S9bJ|n$F!K$2B17x^~|NC zw&d0=_^nRFpl#|TqjKRENx6Fm*xOF0Xn_%Z=_HtWAnw@#$Y@%w)@a!P3BRUSzaHyS z_rz(!Kg>D#d$;WI=hwfVe}Dh~0Su6%D5P+TDx>J@?7f|O)2SXUS~-opiptt6JEO)( z%br@e6UdgJCfaEtTPmzYCws`CPOvSss4f5#1+#9Worr3MIEzmIyvV$vdiu$&oi-CJ zGM923#g-`S5m7kZT6?deEynVxmHTWHthNt*5^*n$NMr>z;x>a!s07I~3ZyLm`H{Gt zJ}it!f!c}C7W$+ta}ygiqf4hzq=0YAJ+~mP6)jYZh`8908*I$t(v&E!1w&&_z)2~s zYC-ejI|`}=$1*SgPXz+C(osn*)zni_O*N~q$h=9gUs|1U!P4sbN3HPqZv=ghW*bI}^D3!_ztWjX)>n^N7tCNC6qhj-trJcqjjJ(q7 z;mIB?nskp=fod7n+bRWHZm+P^0x6{cSh-BsNI@%Y*aT_+)MDQj|6zsO;wl;zv`vOp zEK(^XN$Fc;1zL_lV3XYy({BkXtF#UUPAND$gWC&IXjN_5<*BlbHKqlreA(ukan4!i zowrJ&KuZU!?<0kvtC3psa@<6xBYy%3J-s9{y2*=d(Zt{_IDU&Li*&6e3K-XVT3TF# zv*jmmb!rDff(#~wD5K)?a>FQE8!WC?;@pA^nU`KDwr>a8f)ra6CYn)`&b-c?%I&zU>MaTc-14G!8tMIxAoa)z#8N_vVkyUQ zd%+!13?rf6ohMr1^CG3>1FNUd?2BbI;~CMIMvh2|K%&}I(9UNoiRnZW88V6%XGD;T z?FCALQ5#zRSeB(|AqsdBh!jqy6kD{z78c?E*q|hFkSzd5A@(>384Qveiwy2;z}gGK zJY<@GFeYoS*@7nU)<~>{W)qk^2*~;f8ziO0bQ5XCa%%BA9J%W!WQc-W8hOb(HS1sh z7=tF3CJ{l23^XvOG6%4`(wZdje4LD+6C24A5iXmY|g#2g7L_Uv+HdNz3zhb>jWe+EA1n5B#noxyeg?v(Z)%B{h zm$&_6WIV~$j7}4x_@Pd5fkISTmQt|}TG2@X;FIs{VUjVl;}`sc%}Fl8EYJMUN&(2u z^2~Ee+R>Czr!3Y&ByqCBU1ST?VG>XOV3@7~=2R0Mt7wcuvN(vvj;IQ$Tgc4QC*G)t zA{Xf$q6BgpsT%BlB&q5`c3IMm{B13L5{!9HL)3k_2WlpY4JZZjw4Jb~Ow@u5t`4aZ znBEC}4@qP~Cj$XOD%btcI2>f`H^aTZqC% zis+Zypl)ciW0&!kVyLtPsdKM664>0cE^I+hW9E70@m^!Pof@)ZbbF1;bm9-lROhs& zLnI=Rxh|!FNqRh)=36W`nAl86R~FUNiu@)8+|qSWnHf}Tuqcw(2F! zoM8?Bv!P@WjB+RJnYR4*A!K+6#6|&{nIb1GsAUuXj1tt1G-*05W)4Yt(kt4nbSci6 zB1nPsL(JjHBIGgGU{JddR@5zqWl;!S)561tkOGrZ7=`|VimWj_$A=od%xjzlWXN$0 zS_q=)j=LKGpC$}`uzk&Ib}5iJ2Ou-z(hZe%^VT4BCw4sjN4!82Br{L2g@#GXb_JO% z#r*U{Wd+ZaPuDLqcX7j&Hr_%aixVl?kMdRj-gDyO0QGaOPiF`!XNfP2&`4xYh5kpTj*?ENG25T@K7XPb^FMrWy6Zs zIvY>Q#FfGBgOJzV6*5x5_D3?O<}FN4c}Q7~+XllYV0}arZ#%b>+GkOJemcSwmMlR- zwGdHVnByfk`N_A^;Wy4F#6%1yEhj3ku*_O*&+TK30?4kPzLa7q$r{2_@=U=rGAxl) z(9oesF>K?!=bNDKpu(cR(2zDHls2`KoHY_n6kQ{G#m#FzXz&v<$|&R6dPulxu0uhr zVk87pSVn=^`$13t&I_9u2*JtLJf+0w8Pkoybu*T*Bhq)y4vQwhwj7y93$ce!6wp=D zU1Xi+&@M%J$2l_UaoOkco%j6byW%sFy9$m)309Tp?p{+Xa&W&p(Ob>a>@p>*9%%@x z`SpG8_d0yq;cY^y7r*krZxkoWYHXm-tj9GC@&Ihl{q?v1{Z}%+lxY4tr6W>hc+Wzh53sIy?k|NgK4F0ccog#vG=2Yv7W|Br@v@B@J` zjvP<{0nh}GjtGNA36aGDw@3g3umC?W1LZ>qA&?4>5CxNO1{DhaTt)tBV)Vf94ABsc zRBns}BGd9i3W-G1tRh<~iw?_2Kj1J8XOIOe%snVe4*@X{G0Q1bBGf!f5D_sE6;Tc; zq6J-$DL!QpC2e|GLi9w97?Cj<0g4ro5E2D~{**Bq zrE!h_9Ap3P5C^9*8@179JTd-2aT~!g8f#D%GvyS+@f^`nJ(w{*$dD$;F&*Ji1#gk` zSS}vz@gCWu8^_QO@v$E{kq|lS9VZMM{jneoa^?Q24l_D3wwhCU^EP!eH+ge6eX}=#^EZVv zIEiyOjk7qB^Ej0=Ihk`gowGTi^Est6I*YRr+e7}Ku{5=lJ&ckutNn-+mk(&!ad^?J}+%O&+|U*Ge6%GKlf8V=aWDG(?9F8KM6EI3v@sY zG(iz`LFuqT<&!}l)IsS}LID&)Cp1Da^g=bXLMhZf^KhUFb2~+JJ*ZME-0MXD69+|A zG(}l-MP0N-Vf001G)8H3Ms2i4ar8!YG)H-KM}4$Mf%Hd(G)RebNR6~ek@QHFG)b9s zNu9Jwq161cf>ShWM6DDotno^5!Le+1Ua%ZQQOog?aWan zRZ-s~_a@adH?Aed(dsU>Q$1}#3}--GVoyD_EQh63QT0TeUMKBp_J9wOn7uBz@Ifv65Un!iKDsQ`I$IPo+{(k}_MuR^^o< zhh>TKwO>ocJvh@}fmQSpNni~YK;A$ zwqq%FDLUj{^)w|twkPG~P)jytf01@nHZb4v?|cShTXtr*l6Fi>DDjnMWl~;7OlN%- zDE|S5IwDqLxfiYCGmMz0nX$xeP zy4GiD#Mtt5Y#nx7#Z@-Ywq%Wi6bd!~h_-DV@@QegDZo}~1t&EB=~iIVrZyOsS!aT3 z`*s^;E@GynaO1Ug;8t;QwHih5T8A}qDR*)$H*X~ub1PSKFE?{NcXL0tb3u1>MYnW0 z_jE%SbxBusO*eI2cXeO4bzygQWw&-&*Jp57a&s4KcQ6*1-O6-_<;Y{fD;&j2Y7)U zxPc*9fg_lKCAfkq_<|qUf-@L{38Y?IVs5W@BJFlgH5PjRIahjh*K$#Kg+rHxE7yfp zxP@i-g=aX1Y50b1IEQ(+hIbf;dsv54*oT7{h;vtni27@i?5iAvzUjw7>vKzh_Segz1WP!Sag-OBLa7g%P@qm(s3R(H8R#Q z>bQ>O_>MPgkMWp}`FM}>_>bq!s)|bnbaD`bV$0z?pSxz@%qd7F8e zo11x>wYi(c`J1J=oUeJD)ij;K*_)v`oXPo|-`SnpnVr`eo$EQC>Dip+`JU(5p7lAO z;klpjxtLcndtoA&MKz(LcA;ajdL3G!8yccXcA^E>jVaoqE83tm`k@*6qBmNiGn%6# zx}!rHq%qo}?RB9)nxt7`rAPXuJzAt=+N522rdhhCOZui|I;UZpr)|2YPuhBMI;h=o zR9Tv!k$MynI;oj@DFJdNp86FBda4Dws`>e<|Jk1d8mqTDtErl+_t~qhI;&^ms}Fjt zyE?7ITCD+kt=+n<;aaQTTCU^Ttl65EiMgr&*R@}lTCe>&84da-`ueXMGq2y6ghiIH z6??H6yRl`$umM$62HUYIyRt3&vhy{t(R#Dv8nca=v!`NeJ$tlCyR=QaPTlpiReQBr zyR}m_ScBQF=UTSw8nkJfu5tUeb=$Ui8?3qcobP(KeLJ^%Tdap$xQ#oxgS)tw`?&i# zDMZ_~rF*)mySfY7y0JUEwR^iqbh4FuwwW8eoqN2$ySB-@xyzflhr6u9+q}~oxzRhm z#rwV6TfOP~yyqHBxqH9)yTASWzX3eJ1$@B&da%9wwJ96234FmByuls(!67`tC49o? z^1vzl!ZAFCT(G`8s8NJaR{m~&k(j|S;DZSDy{n9Z#(=~n5Ila?8 z{nJ4`)J1*NNxjrf{nSxC)m44fS-sU={ncST)@6OxX}#8M{nl|k*L8i@dA-+t{nvp# z*oA%AiM`m3{n(K`*_D0SnZ4Qno&DLNJ=&#x+Nr(Tt^L}uJ=?W?+qu2lz5Uz4J>128 z+{wM%&HdcbJ>AuP-Pyg}-TmF+J>KPg-s!#G?fu^IJ>T_x-}$}Y{r%qoKHvp@;0eCq z4gTN}KH(L9;TgW+9sc1VKH?>Q;wir3E&k#$KI1ih<2kZT{wQKIe6Q=Xt*8eg5ZxKInyh=!w4QjsED7KIxTy z>6yOio&M>eKI)}@>Z!i!t^Vq$$$`z5eULKJ3MQ?8(0D&Hn7sKJC?h?b*KV z-Tv+2KJMjy?&-en?f&ln@jmbMe((9d@BRMo0YC5sfA9&v@D2a)5kK+ly=7M%>e98_ zkcQv^f?Ei|8bYw(Av6SccXv;4cXxM(#%Y{Jf(3VXcMVB^;DmlzYwc(6ecm(18RL9@ z_!0M277V-Hl(eYab z{#!xdLdEAoqvJvceqkVRY2tHf(Q#=5zqAv$a`L%y>$viQU-=1K2l-rwbzDcmuj2%6 zl6-E`I&QMyH+cfLg+8~X9k)>UZH>TPgU?-a$6Xuz?wi1Uuh0Ep$Neb$ep2Aitk0jt zjz6pLKbry%yFL$x9SMG7e&VBeviTi8Hl5nO8*eXRydUOR;$Gmj>=v%lJ?$esWptfcr5FK$L&4p`;v(~ z;Rq7`@b{%th0+Ww7j^Tyz*-5E?|)M}69soNXPW#?<`@UFjwcH-X*Z5<#)#L5~^F!0G&7KHSf#?s-XS*XA zd_GwGEx!+E%C$P8`M+MCtbFx=V|{GBKHVA45QzEMc6;%C`K!+hf%f~G-^a@xF#;VA zf9~(@;4k!j5wXPe{g5d__5IP_4d@48eMEs91meny8w3&Ph8hIpMCFAAQ+T6LDM9XE z8ivtk54>cAFHoU|ziUS+kbLuCBp1oK7Fr<60IS`i<#|9cjzx*0pAeu%3p0-Aif%#z zXjLra#Vg99ZiOlWHmDzapFxu#2F@@O0Kc<@X&M@C7)`R=lA&paE%JbIx?0b;*^UhjoEI$`Zc#LPC}B~M?u}+? z=kKg(k&~AlUS=CHMBGVhY%MfI+mV`X35B(Dg0NBbQ3K=JZ`}`}U071-*{BPKa_JvL zalp9GBm}MNr`#`1aA8EKv;g=FE<6Z0f=v0Xek)pQF%+UL70wT(w;CrH@s_e}J!9kC z7SN*pwp|IZK6?Q=e?Vt3WM5mh?og)%TXmu_kEk^uN^~0GdfI;b(n~Neg7$5MRxtRR z`or{4FI9~6Jo5=PHn<-yEMY(VuAsMyzy0>kev~tyw_*eui|}LgBm6^LoiL4Hb=^*(X zOv{ZkxvV;lW4f%li$NN|UV0~7bN)YNTsP7EY_PYGK(g4|!2-Ij%hqzXu{*JPA30_) zowORKrTL=V4wSUkCf0o-qTwwE(Ggkh$6QivlS`H3-mLXxi%eW6EzdE&iWa?S_xNRA zB@6r2C%5b&4tX_xUpgUaz$c!wzvg+7)0Oc-tV3)3PqCu$Pn^?DXSs*b;glHfwDITI zZQ@PEFW^}l5svQnmku{=Qa$VA@Z|Fp$My$QY>{IR-Mf{2o>t5+euB5J#E<$rQMTxP zETl4l%-2-Uqp5v~zUv2}4YVgLj0R9+;9OF~2R=K)bfvN045BBBqX&QX#9z!o|1AC* z6PG#&)RXtZ0Vs4(iv4=c|Ftl8apxsqDu3Vd zk1zg4_fdh0>~}u#;maOuI941boAvfpMG5w3mR&T!(hzqMx%WdYb2tX*4LSUPg1f7R zQUgdzV1_av%!U$)ic>&wu^=uY$tHjlm`$?C)kD=1=MaDwibaPy^m}14ns21w%~gqz zK(Kw%E{^dfR%tJuWld~F1&t4phNM_DPPkNEA@h1dpT41e!e{EeTkkOGtH|1v?DvK2 zO7x#DMcC73jAIy6XnTZ2&!g(+(Y$Te5VkmT$ldnK;vXLD=fic(n^V~5T?YvVOV;PM-p`S~;GK+g z-*;OWrlsOQn|g$4GNw&qluDF3fJ5ESA#dBTK1wW3rSj7GtZJ7^eq`xY3W;jQ# z<@xdYxX=FO0|1$R!$;Q(H z{wqH{L0%NJo2aa6v74lBTDqI8?R>bKq96QU`RRM<*0969j4yql{Y=L>i~TIuz0&<` z&&&VGPY)!pJje^BEj!4M*djLRVOmz_v#)3tM4@fwB_GxM>vna*G-5r zp488%TAeg3n3kWwR-BJd8aIL&e>CkRTm5L}J0a?%M;HkG@wK}qL>K^>;d@DZ*;B&Y zdcQS?#)wD*o(Q|Vr!xBXC;aVBmxDCGxEY-1n`GPVSf_txa|H<(x7055ELR8eN2>~rFj)q~5d zDis&)D3Mc*eJRBsRW_}@qSt^~m+FE#pM`m`Owxb7%R6elGajZ@yl-o6KiOG9``Wd9 z;;=b%_2YwFu-N+V-*IX=^^rLJ;(yLpmfzoA4TZdTxc=($xm}_;VTE_Oxvr!A1X><* zcJn(%_~FmiKHTfiy@zqzZ}>6=ph^tfeeu(mgf;bnAhhG|^)EjHp49uT`H$BU)&4JA zHGxLgf1p|KtBH`tt!PUA5Xn}z&7&b^yb`$lpr zZ^DYP^#?9`{fQ+1m+3R<{BPp0E~;C3zXFFayn20JD3sC4Ie`lQVqf^pj|mFMM3*%E zB`gv(&@6$Gh_NS?n>BgTOXs~IfmuFtwAVX5goUoXmOWeLtb`X6b zOy--yTGt|cebq?sDG~yCwU&Cn5PoFaD<{{Q=pi_wMbh@34tc&TglCvieU0+jE5T|N zcUcJz@o!U#7MapsJL_xp#6SFeU>r0Lsjl)F!byix8sg0*^ZQU)gkjsL#i<*BLtqp7 zp?S0f;}Y1Q71qzs3KS*BbpIa{WAQKmjxrrJ0(Tj_pLu8&!+-Y+>o^K zKQsqxxqyC&D%akZoNrmWsB|4I*S#8=Z@;~$^2Myse=fDqMRHjkDpO%dIK0ruds!13 zRbfmgwK$}CS(`dqVaheUIOcv?mx~EC7n53=O24cxk%3yO4KK~LTsBlkL9NZCmY3j5 zm$0T$sIANJ^4jfXV<%?imk_CyEt0FI0hvnsl;M><-mB(`s7l9TsnsLRtCoe)O6SJm z)gSIxUpFwTT>GWg&eE@14`iy`=ZDuWTdvxEMOAt3ORe87UA142R(W3yuRq*gbpWuc zeVk^Id<#j;;=*liozry6z$xs}ANG*~Id=?xw`52^Evx!p*qu zp_i=*R~y+P_kK0mU@`Sk`q`X#z9 zb6R5dd*XW_F$L(}3Rzr!H%#mWo?M#VmLz&v>k?Pmm+3M(q3Nx8w&E?yK*#ffNGeX-1mrPkfj!WazJIC^61akspI)!5W8 z^TR&lZskC>v1NYrhx6CF)nCz#t@|=R-IwpyuE!eNuSS1*-`%YPUNm(+m;L2WdcT1p z*VIKg_A8k0eiJ*UsfSMXG+gU`i)g&5kIVa~64uH#VhZX2oGF3+E#?LloRDWIh11@< z_`~kQyXFBIit`kux?S>|!C^bwpIJGIyEnxY|3H;SKyZ`$^SbDC#N zu$+pQGuI?TZYFDNopQ!K4rmG80kjO*wOnn-U;&=i$%k|II{rh29EpYPO6N)s&qJR1 zo6$C1hpcC-yN+CU?SIyswb9oY80I}zwV>B+5ss&y{5&g0WpDhHKQe@ba7<#>-uOGN zt){)Y6BK%NYtQxYJ4TNGXxz(fGG+Cw+NbUN^q-qV)AmcmZ-1I31a8+zA-`8>TaT9C zdG@|sKV7$NJ2QHWF>0h(X^D9_DUPvSgRfm7A$T_^jC;*`blk-^US6G<33%_b>)lNz zf7~zq>2~R{e7o5HQE;N;&t}fUb(qhGhnS9&v%5zq&VkL*y!Wx1Z+42!FD{?6eowR} zn~f_k>}%gB7aO>kH-fo0L5a;Xb;TcM9>~|;=-eKdL_YH_HdikGmnr^zTz*?Fe)yq& zEaE=XFh2@$Uru#J6e9moF8>b$z6-Q|I7ERj7JS~R2NI(M2rT$D7YEMt1TH1}ex&zT zAo9Eo@nH1HTXq=oLYK8 z^+M_s*-SB%K6d}Zk}A_4WGid~FrN$tN+_9*B>$Twg)Hbz#!!DC76<-^C8ZS4b@C^i z2j5hsRQdDAe^^pXQQ2)ML_Cgpl(9!hI{L`42>2;62P@XPqB>iA<=CK#jO>MHX z>2I_eUmMlBoSE&^B0Q04b=_;qPY8I3%q%+HpLq5>=iR;0@8gB(CEdsj58I!Mk1Q!O z&9)D}P7kJ!BYDzqw0B1{%5&t_cRrtA56?Z$zqYPU0M3LPQh)HxCk0R*KFRx|5s0k@ z>=M)G38OC6J~lNAUAcC@+8VVzDBU?XLtn&E4H6JaPDutpxl{GTnd9l-d{V5q9+y%S zzRK~9Mtx7|%8uNO?GG`>ArJIH4Wt$q;8srDk~2Gat?vDX$MVu~>0oDc;A3v@u_ zlpDRDKQc%p3Zmb?FLlC#2F8`tBq)u&q$FC40rZuE3dH|hTg2v@iqR(6XTygq0FR$; zZvvo4B{cROlkR0jR1Id2t&t&@X<*tzi$(D*CZkd1;z=rgCPGh{HDamm?%SH}Hce=4 zF&p|J?2QoLQ6&cmt+J?YO!!9~rgOyimUP6|Q&vAE&28(Q-kFxwLSu2iFk0_PZMAPA zSwivBYs0F(y`&Y-@ld{OF-K&wY(at|HY(EgAlY)iazdyNr~%JWMC^7`7KD@!9PWxj znV4V!CWw)H2dcxr+bU>B4ogQMG0^&#k0(&HoiyX;60Nz@FPTG38i3`)^cmZ1&<1Oh zczjnpoUsGJbU)Kl!Qqri=Hwl}+}W|cR4nJzzW_H#qt-5x+vY;O-siYsrADjI*> z9#{9jyZc^0Z+myrv|oAmqxI^?-OtYF%=f=~2tVJS4$xKIpN(++yg#21WB&7dM(y*T ziv_c)KbI>mKmS~9gfKr`?>Im<=n<4jKHpHnjnJ_Xs)c^_L9R!<+hIiH07PIZGsDc) z-ApDxpWW|~5#(6DK3pB>TY>aNo*sP`EUW^8gGvPNKP@~PPHMz(1EOesNk_C33I2od zC4kyqzX8J^fc_x;67l90+KbB?oEvk;M7dZd^3s! z@{!|@wU3e!FCJFX835P2JV z!Aqh%CI%A;CQkZD)kI_G@aqo6+S5cUX&S$GrGg5VeF@c(g>O&xhYqw^k{aI{z9tSE z*4e8~hGiDAgb+*Wx8tT13DYu2G>;gQ)N%Jj(z51AWSZRK#<$cLae7FMu8N;$)O|1F zN|KN@O=eGP!7H}z9F%1$bKvY4F=cK9jk~wAbDoS8WB(k4r&#|#Xw21O^Jm3A`!S%5FQwW&D9l%A)1g%AWValQwa(!t+%k`WSv45VFwtStI(y1 zOBLD|i5xAbGQBr|ShAjpDtQbFSmFQ*R3G;_{}igooX4mNtK=cFre~K8P)eXc0vTkE zqgpga8Z3)KJ)M?7=OKkm3+9yZp;IZ*&IR;I6IIqSu{!e$bCm7h^Ha&XY5OLk^>)5^ z#qy6L^;06H)`&q(O=9`$eU&DHo!P|-t;#i#hD6P~c0@B*W2w_`m;4#b(Qz@r(Rjj? zQpf-(?y?a7%nTK2Gpx~P)et~?yh4ftga}E0N6jN$Oi^}8xrn8d7%V>u_yc0J?b_;>LI0KCn4P6I@EoJcBDb4zBrOxTKl>nG<%}1C9#IA_plJ$3;HpTQoWobvE4Y+D(_rTtt@mT?wR;i1BEfnTHB>kI z7p#)8IhyXP4-Vgob*zCcmvQ0};&zl~=Znef!dHbf`T$fwY^O+jR?3<&5&68X9l9w# z7#9Gb?A5{LaMcRIQRPq!qR~w?bOLDZ=eSaJnQl0HLa&v%jhYoSUGcW^~SOo;1sf)*{d-shP=DY{VzU5$h;U$VpElC?DH zAzM%54jOn zRpF{=T1cI8%wT;5lklBXwuBEKefg#t_S4`le+e!2^=-OY>wKKlL>%Ain{5Ief2)Ge zfftgo%}AWmQ=cl4szt)+hEVMS7{%`8;;%ILti4qi6Tp1WO10m(V>ga4lpqv-qjjpFpov_FX+Lzb*Nt zo~-ucW{gY{wL|!d#MI7c4mf}Uavf1J872}(kwjl#s+9Dh;3$)1YJa+1{Z)Hlvr~~& zB^#qDxzt?lOr3J6Ce!fc;S_{seMp734yu!9eqI#i-dHtS$<*zRe?My_o$CFvU}adH zS+6&iqpy&!nQdj*fe!sofAe|A0AmCv#fd9qbiCx5qw44_yLq&}5h?Nqb!WcxY=`5^ zd(Ah8>xC-$dll)|N85cKdLxl(_71~h%Zt3tUt2C_he(sx9!Pgj=LSQH;RNHncU@h6 zCdD~2+`f*{^V|JgG4k)P?ku>d=sG&MeYSfh_a_~IY-YJ0lqS^c{`08nv0j}bO$p`* z(jk*B_kLX2K2W=Z4RC!PR~-GKc|7K$fpBAa=%Z4TD`B(J8wI?2;2fjp+6&#LUox-F z0>fI(CVhnM7uMrm@irzhYx(_-Pq?g(kBU#!xR V^+jmDp2};!N`e6@{gl8x3=( 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%0DCK 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 **注意**:这是 ROS2 nav2_msgs 的标准 Wait action,与 unilabos_msgs 的 Wait action 不同。 ```yaml #goal definition @@ -532,7 +1109,6 @@ builtin_interfaces/Duration total_elapsed_time --- #feedback definition builtin_interfaces/Duration time_left - ``` ----- +--- diff --git a/docs/developer_guide/add_device.md b/docs/developer_guide/add_device.md index 0cec54da..dc95274f 100644 --- a/docs/developer_guide/add_device.md +++ b/docs/developer_guide/add_device.md @@ -1,10 +1,18 @@ -# 添加新设备 +# 添加设备:编写驱动 -在 Uni-Lab 中,设备(Device)是实验操作的基础单元。Uni-Lab 使用**注册表机制**来兼容管理种类繁多的设备驱动程序。回顾 {ref}`instructions` 中的概念,抽象的设备对外拥有【话题】【服务】【动作】三种通信机制,因此将设备添加进 Uni-Lab,实际上是将设备驱动中的三种机制映射到 Uni-Lab 标准指令集上。 +在 Uni-Lab 中,设备(Device)是实验操作的基础单元。Uni-Lab 使用**注册表机制**来兼容管理种类繁多的设备驱动程序。抽象的设备对外拥有【话题】【服务】【动作】三种通信机制,因此将设备添加进 Uni-Lab,实际上是将设备驱动中的这三种机制映射到 Uni-Lab 标准指令集上。 -能被 Uni-Lab 添加的驱动程序类型有以下种类: +> **💡 提示:** 本文档介绍如何使用已有的设备驱动(SDK)。若设备没有现成的驱动程序,需要自己开发驱动,请参考 {doc}`add_old_device`。 -1. Python Class,如 +## 支持的驱动类型 + +Uni-Lab 支持以下两种驱动程序: + +### 1. Python Class(推荐) + +Python 类设备驱动在完成注册表后可以直接在 Uni-Lab 中使用,无需额外编译。 + +**示例:** ```python class MockGripper: @@ -31,12 +39,11 @@ class MockGripper: def status(self) -> str: return self._status - # 会被自动识别的设备动作,接入 Uni-Lab 时会作为 ActionServer 接受任意控制者的指令 @status.setter def status(self, target): self._status = target - # 需要在注册表添加的设备动作,接入 Uni-Lab 时会作为 ActionServer 接受任意控制者的指令 + # 会被自动识别的设备动作,接入 Uni-Lab 时会作为 ActionServer 接受任意控制者的指令 def push_to(self, position: float, torque: float, velocity: float = 0.0): self._status = "Running" current_pos = self.position @@ -53,9 +60,11 @@ class MockGripper: self._status = "Idle" ``` -Python 类设备驱动在完成注册表后可以直接在 Uni-Lab 使用。 +### 2. C# Class -2. C# Class,如 +C# 驱动设备在完成注册表后,需要调用 Uni-Lab C# 编译后才能使用(仅需一次)。 + +**示例:** ```csharp using System; @@ -84,7 +93,7 @@ public class MockGripper position = currentPos + (Position - currentPos) / 20 * (i + 1); torque = Torque / (20 - i); velocity = Velocity; - await Task.Delay((int)(moveTime * 1000 / 20)); // Convert seconds to milliseconds + await Task.Delay((int)(moveTime * 1000 / 20)); } torque = Torque; status = "Idle"; @@ -92,12 +101,16 @@ public class MockGripper } ``` -C# 驱动设备在完成注册表后,需要调用 Uni-Lab C# 编译后才能使用,但只需一次。 +--- -## 快速开始:使用注册表编辑器(推荐) +## 快速开始:两种方式添加设备 + +### 方式 1:使用注册表编辑器(推荐) 推荐使用 Uni-Lab-OS 自带的可视化编辑器,它能自动分析您的设备驱动并生成大部分配置: +**步骤:** + 1. 启动 Uni-Lab-OS 2. 在浏览器中打开"注册表编辑器"页面 3. 选择您的 Python 设备驱动文件 @@ -106,13 +119,18 @@ C# 驱动设备在完成注册表后,需要调用 Uni-Lab C# 编译后才能 6. 点击"生成注册表",复制生成的内容 7. 保存到 `devices/` 目录下 ---- +**优点:** -## 手动编写注册表(简化版) +- 自动识别设备属性和方法 +- 可视化界面,易于操作 +- 自动生成完整配置 +- 减少手动配置错误 + +### 方式 2:手动编写注册表(简化版) 如果需要手动编写,只需要提供两个必需字段,系统会自动补全其余内容: -### 最小配置示例 +**最小配置示例:** ```yaml my_device: # 设备唯一标识符 @@ -121,22 +139,22 @@ my_device: # 设备唯一标识符 type: python # 驱动类型 ``` -### 注册表文件位置 +**注册表文件位置:** - 默认路径:`unilabos/registry/devices` -- 自定义路径:启动时使用 `--registry` 参数指定 -- 可将多个设备写在同一个 yaml 文件中 +- 自定义路径:启动时使用 `--registry_path` 参数指定 +- 可将多个设备写在同一个 YAML 文件中 -### 系统自动生成的内容 +**系统自动生成的内容:** 系统会自动分析您的 Python 驱动类并生成: -- `status_types`:从 `get_*` 方法自动识别状态属性 +- `status_types`:从 `@property` 装饰的方法自动识别状态属性 - `action_value_mappings`:从类方法自动生成动作映射 - `init_param_schema`:从 `__init__` 方法分析初始化参数 - `schema`:前端显示用的属性类型定义 -### 完整结构概览 +**完整结构概览:** ```yaml my_device: @@ -151,4 +169,848 @@ my_device: schema: {} # 自动生成 ``` -详细的注册表编写指南和高级配置,请参考{doc}`yaml 注册表编写指南 `。 +> 💡 **提示:** 详细的注册表编写指南和高级配置,请参考 {doc}`03_add_device_registry`。 + +--- + +## Python 类结构要求 + +Uni-Lab 设备驱动是一个 Python 类,需要遵循以下结构: + +```python +from typing import Dict, Any + +class MyDevice: + """设备类文档字符串 + + 说明设备的功能、连接方式等 + """ + + def __init__(self, config: Dict[str, Any]): + """初始化设备 + + Args: + config: 配置字典,来自图文件或注册表 + """ + self.port = config.get('port', '/dev/ttyUSB0') + self.baudrate = config.get('baudrate', 9600) + self._status = "idle" + # 初始化硬件连接 + + @property + def status(self) -> str: + """设备状态(会自动广播)""" + return self._status + + def my_action(self, param: float) -> Dict[str, Any]: + """执行动作 + + Args: + param: 参数说明 + + Returns: + {"success": True, "result": ...} + """ + # 执行设备操作 + return {"success": True} +``` + +## 状态属性 vs 动作方法 + +### 状态属性(@property) + +状态属性会被自动识别并定期广播: + +```python +@property +def temperature(self) -> float: + """当前温度""" + return self._read_temperature() + +@property +def status(self) -> str: + """设备状态: idle, running, error""" + return self._status + +@property +def is_ready(self) -> bool: + """设备是否就绪""" + return self._status == "idle" +``` + +**特点**: + +- 使用`@property`装饰器 +- 只读,不能有参数 +- 自动添加到注册表的`status_types` +- 定期发布到 ROS2 topic + +### 动作方法 + +动作方法是设备可以执行的操作: + +```python +def start_heating(self, target_temp: float, rate: float = 1.0) -> Dict[str, Any]: + """开始加热 + + Args: + target_temp: 目标温度(°C) + rate: 升温速率(°C/min) + + Returns: + {"success": bool, "message": str} + """ + self._status = "heating" + self._target_temp = target_temp + # 发送命令到硬件 + return {"success": True, "message": f"Heating to {target_temp}°C"} + +async def async_operation(self, duration: float) -> Dict[str, Any]: + """异步操作(长时间运行) + + Args: + duration: 持续时间(秒) + """ + # 使用 self.sleep 而不是 asyncio.sleep(ROS2 异步机制) + await self.sleep(duration) + return {"success": True} +``` + +**特点**: + +- 普通方法或 async 方法 +- 返回 Dict 类型的结果 +- 自动注册为 ROS2 Action +- 支持参数和返回值 + +### 返回值设计指南 + +> **⚠️ 重要:返回值会自动显示在前端** +> +> 动作方法的返回值(字典)会自动显示在 Web 界面的工作流执行结果中。因此,**强烈建议**设计结构化、可读的返回值字典。 + +**推荐的返回值结构:** + +```python +def my_action(self, param: float) -> Dict[str, Any]: + """执行操作""" + try: + # 执行操作... + result = self._do_something(param) + + return { + "success": True, # 必需:操作是否成功 + "message": "操作完成", # 推荐:用户友好的消息 + "result": result, # 可选:具体结果数据 + "param_used": param, # 可选:记录使用的参数 + # 其他有用的信息... + } + except Exception as e: + return { + "success": False, + "error": str(e), + "message": "操作失败" + } +``` + +**最佳实践示例(参考 `host_node.test_latency`):** + +```python +def test_latency(self) -> Dict[str, Any]: + """测试网络延迟 + + 返回值会在前端显示,包含详细的测试结果 + """ + # 执行测试... + avg_rtt_ms = 25.5 + avg_time_diff_ms = 10.2 + test_count = 5 + + # 返回结构化的测试结果 + return { + "status": "success", # 状态标识 + "avg_rtt_ms": avg_rtt_ms, # 平均往返时间 + "avg_time_diff_ms": avg_time_diff_ms, # 平均时间差 + "max_time_error_ms": 5.3, # 最大误差 + "task_delay_ms": 15.7, # 任务延迟 + "test_count": test_count, # 测试次数 + } +``` + +**前端显示效果:** + +当用户在 Web 界面执行工作流时,返回的字典会以 JSON 格式显示在结果面板中: + +```json +{ + "status": "success", + "avg_rtt_ms": 25.5, + "avg_time_diff_ms": 10.2, + "max_time_error_ms": 5.3, + "task_delay_ms": 15.7, + "test_count": 5 +} +``` + +**返回值设计建议:** + +1. **始终包含 `success` 字段**:布尔值,表示操作是否成功 +2. **包含 `message` 字段**:字符串,提供用户友好的描述 +3. **使用有意义的键名**:使用描述性的键名(如 `avg_rtt_ms` 而不是 `v1`) +4. **包含单位**:在键名中包含单位(如 `_ms`、`_ml`、`_celsius`) +5. **记录重要参数**:返回使用的关键参数值,便于追溯 +6. **错误信息详细**:失败时包含 `error` 字段和详细的错误描述 +7. **避免返回大数据**:不要返回大型数组或二进制数据,这会影响前端性能 + +**错误处理示例:** + +```python +def risky_operation(self, param: float) -> Dict[str, Any]: + """可能失败的操作""" + if param < 0: + return { + "success": False, + "error": "参数不能为负数", + "message": f"无效参数: {param}", + "param": param + } + + try: + result = self._execute(param) + return { + "success": True, + "message": "操作成功", + "result": result, + "param": param + } + except IOError as e: + return { + "success": False, + "error": "通信错误", + "message": str(e), + "device_status": self._status + } +``` + +## 特殊参数类型:ResourceSlot 和 DeviceSlot + +Uni-Lab 提供特殊的参数类型,用于在方法中声明需要选择资源或设备。 + +### 导入类型 + +```python +from unilabos.registry.placeholder_type import ResourceSlot, DeviceSlot +from typing import List +``` + +### ResourceSlot - 资源选择 + +用于需要选择物料资源的场景: + +```python +def pipette_liquid( + self, + source: ResourceSlot, # 单个源容器 + target: ResourceSlot, # 单个目标容器 + volume: float +) -> Dict[str, Any]: + """从源容器吸取液体到目标容器 + + Args: + source: 源容器(前端会显示资源选择下拉框) + target: 目标容器(前端会显示资源选择下拉框) + volume: 体积(μL) + """ + print(f"Pipetting {volume}μL from {source.id} to {target.id}") + return {"success": True} +``` + +**多选示例**: + +```python +def mix_multiple( + self, + containers: List[ResourceSlot], # 多个容器选择 + speed: float +) -> Dict[str, Any]: + """混合多个容器 + + Args: + containers: 容器列表(前端会显示多选下拉框) + speed: 混合速度 + """ + for container in containers: + print(f"Mixing {container.name}") + return {"success": True} +``` + +### DeviceSlot - 设备选择 + +用于需要选择其他设备的场景: + +```python +def coordinate_with_device( + self, + other_device: DeviceSlot, # 单个设备选择 + command: str +) -> Dict[str, Any]: + """与另一个设备协同工作 + + Args: + other_device: 协同设备(前端会显示设备选择下拉框) + command: 命令 + """ + print(f"Coordinating with {other_device.name}") + return {"success": True} +``` + +**多设备示例**: + +```python +def sync_devices( + self, + devices: List[DeviceSlot], # 多个设备选择 + sync_signal: str +) -> Dict[str, Any]: + """同步多个设备 + + Args: + devices: 设备列表(前端会显示多选下拉框) + sync_signal: 同步信号 + """ + for dev in devices: + print(f"Syncing {dev.name}") + return {"success": True} +``` + +### 完整示例:液体处理工作站 + +```python +from unilabos.registry.placeholder_type import ResourceSlot, DeviceSlot +from typing import List, Dict, Any + +class LiquidHandler: + """液体处理工作站""" + + def __init__(self, config: Dict[str, Any]): + self.simulation = config.get('simulation', False) + self._status = "idle" + + @property + def status(self) -> str: + return self._status + + def transfer_liquid( + self, + source: ResourceSlot, # 源容器选择 + target: ResourceSlot, # 目标容器选择 + volume: float, + tip: ResourceSlot = None # 可选的枪头选择 + ) -> Dict[str, Any]: + """转移液体 + + 前端效果: + - source: 下拉框,列出所有可用容器 + - target: 下拉框,列出所有可用容器 + - volume: 数字输入框 + - tip: 下拉框(可选),列出所有枪头 + """ + self._status = "transferring" + + # source和target会被解析为实际的资源对象 + print(f"Transferring {volume}μL") + print(f" From: {source.id} ({source.name})") + print(f" To: {target.id} ({target.name})") + + if tip: + print(f" Using tip: {tip.id}") + + # 执行实际的液体转移 + # ... + + self._status = "idle" + return { + "success": True, + "volume_transferred": volume, + "source_id": source.id, + "target_id": target.id + } + + def multi_dispense( + self, + source: ResourceSlot, # 单个源 + targets: List[ResourceSlot], # 多个目标 + volumes: List[float] + ) -> Dict[str, Any]: + """从一个源分配到多个目标 + + 前端效果: + - source: 单选下拉框 + - targets: 多选下拉框(可选择多个容器) + - volumes: 数组输入(每个目标对应一个体积) + """ + results = [] + for target, vol in zip(targets, volumes): + print(f"Dispensing {vol}μL to {target.name}") + results.append({ + "target": target.id, + "volume": vol + }) + + return { + "success": True, + "dispense_results": results + } + + def test_with_balance( + self, + target: ResourceSlot, # 容器 + balance: DeviceSlot # 天平设备 + ) -> Dict[str, Any]: + """使用天平测量容器 + + 前端效果: + - target: 容器选择下拉框 + - balance: 设备选择下拉框(仅显示天平类型) + """ + print(f"Weighing {target.name} on {balance.name}") + + # 可以调用balance的方法 + # weight = balance.get_weight() + + return { + "success": True, + "container": target.id, + "balance_used": balance.id + } +``` + +### 工作原理 + +#### 1. 类型识别 + +注册表扫描方法签名时: + +```python +def my_method(self, resource: ResourceSlot, device: DeviceSlot): + pass +``` + +系统识别到`ResourceSlot`和`DeviceSlot`类型。 + +#### 2. 自动添加 placeholder_keys + +在注册表中自动生成: + +```yaml +my_device: + class: + action_value_mappings: + my_method: + goal: + resource: resource + device: device + placeholder_keys: + resource: unilabos_resources # 自动添加! + device: unilabos_devices # 自动添加! +``` + +#### 3. 前端 UI 生成 + +- `unilabos_resources`: 渲染为资源选择下拉框 +- `unilabos_devices`: 渲染为设备选择下拉框 + +#### 4. 运行时解析 + +用户选择资源/设备后,实际调用时会传入完整的资源/设备对象: + +```python +# 用户在前端选择了 plate_1 +# 运行时,source参数会收到完整的Resource对象 +source.id # "plate_1" +source.name # "96孔板" +source.type # "resource" +source.class_ # "corning_96_wellplate_360ul_flat" +``` + +## 支持的通信方式 + +### 1. 串口(Serial) + +```python +import serial + +class SerialDevice: + def __init__(self, config: Dict[str, Any]): + self.port = config['port'] + self.baudrate = config.get('baudrate', 9600) + self.ser = serial.Serial( + port=self.port, + baudrate=self.baudrate, + timeout=1 + ) + + def send_command(self, cmd: str) -> str: + """发送命令并读取响应""" + self.ser.write(f"{cmd}\r\n".encode()) + response = self.ser.readline().decode().strip() + return response + + def __del__(self): + if hasattr(self, 'ser') and self.ser.is_open: + self.ser.close() +``` + +### 2. TCP/IP Socket + +```python +import socket + +class TCPDevice: + def __init__(self, config: Dict[str, Any]): + self.host = config['host'] + self.port = config['port'] + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.sock.connect((self.host, self.port)) + + def send_command(self, cmd: str) -> str: + self.sock.sendall(cmd.encode()) + response = self.sock.recv(1024).decode() + return response +``` + +### 3. Modbus + +```python +from pymodbus.client import ModbusTcpClient + +class ModbusDevice: + def __init__(self, config: Dict[str, Any]): + self.host = config['host'] + self.port = config.get('port', 502) + self.client = ModbusTcpClient(self.host, port=self.port) + self.client.connect() + + def read_register(self, address: int) -> int: + result = self.client.read_holding_registers(address, 1) + return result.registers[0] + + def write_register(self, address: int, value: int): + self.client.write_register(address, value) +``` + +### 4. OPC UA + +```python +from opcua import Client + +class OPCUADevice: + def __init__(self, config: Dict[str, Any]): + self.url = config['url'] + self.client = Client(self.url) + self.client.connect() + + def read_node(self, node_id: str): + node = self.client.get_node(node_id) + return node.get_value() + + def write_node(self, node_id: str, value): + node = self.client.get_node(node_id) + node.set_value(value) +``` + +### 5. HTTP/RPC + +```python +import requests + +class HTTPDevice: + def __init__(self, config: Dict[str, Any]): + self.base_url = config['url'] + self.auth_token = config.get('token') + + def send_command(self, endpoint: str, data: Dict) -> Dict: + url = f"{self.base_url}/{endpoint}" + headers = {'Authorization': f'Bearer {self.auth_token}'} + response = requests.post(url, json=data, headers=headers) + return response.json() +``` + +## 异步 vs 同步方法 + +### 同步方法(适合快速操作) + +```python +def quick_operation(self, param: float) -> Dict[str, Any]: + """快速操作,立即返回""" + result = self._do_something(param) + return {"success": True, "result": result} +``` + +### 异步方法(适合耗时操作) + +```python +async def long_operation(self, duration: float) -> Dict[str, Any]: + """长时间运行的操作""" + self._status = "running" + + # 使用 ROS2 提供的 sleep 方法(而不是 asyncio.sleep) + await self.sleep(duration) + + # 可以在过程中发送feedback + # 需要配合ROS2 Action的feedback机制 + + self._status = "idle" + return {"success": True, "duration": duration} +``` + +> **⚠️ 重要提示:ROS2 异步机制 vs Python asyncio** +> +> Uni-Lab 的设备驱动虽然使用 `async def` 语法,但**底层是 ROS2 的异步机制,而不是 Python 的 asyncio**。 +> +> **不能使用的 asyncio 功能:** +> +> - ❌ `asyncio.sleep()` - 会导致 ROS2 事件循环阻塞 +> - ❌ `asyncio.create_task()` - 任务不会被 ROS2 正确调度 +> - ❌ `asyncio.gather()` - 无法与 ROS2 集成 +> - ❌ 其他 asyncio 标准库函数 +> +> **应该使用的方法(继承自 BaseROS2DeviceNode):** +> +> - ✅ `await self.sleep(seconds)` - ROS2 兼容的睡眠 +> - ✅ `await self.create_task(func, **kwargs)` - ROS2 兼容的任务创建 +> - ✅ ROS2 的 Action/Service 回调机制 +> +> **示例:** +> +> ```python +> async def complex_operation(self, duration: float) -> Dict[str, Any]: +> """正确使用 ROS2 异步方法""" +> self._status = "processing" +> +> # ✅ 正确:使用 self.sleep +> await self.sleep(duration) +> +> # ✅ 正确:创建并发任务 +> task = await self.create_task(self._background_work) +> +> # ❌ 错误:不要使用 asyncio +> # await asyncio.sleep(duration) # 这会导致问题! +> # task = asyncio.create_task(...) # 这也不行! +> +> self._status = "idle" +> return {"success": True} +> +> async def _background_work(self): +> """后台任务""" +> await self.sleep(1.0) +> self.lab_logger().info("Background work completed") +> ``` +> +> **为什么不能混用?** +> +> ROS2 使用 `rclpy` 的事件循环来管理所有异步操作。如果使用 `asyncio` 的函数,这些操作会在不同的事件循环中运行,导致: +> +> - ROS2 回调无法正确执行 +> - 任务可能永远不会完成 +> - 程序可能死锁或崩溃 +> +> **参考实现:** +> +> `BaseROS2DeviceNode` 提供的方法定义(`base_device_node.py:563-572`): +> +> ```python +> async def sleep(self, rel_time: float, callback_group=None): +> """ROS2 兼容的异步睡眠""" +> if callback_group is None: +> callback_group = self.callback_group +> await ROS2DeviceNode.async_wait_for(self, rel_time, callback_group) +> +> @classmethod +> async def create_task(cls, func, trace_error=True, **kwargs) -> Task: +> """ROS2 兼容的任务创建""" +> return ROS2DeviceNode.run_async_func(func, trace_error, **kwargs) +> ``` + +## 错误处理 + +### 基本错误处理 + +```python +def operation_with_error_handling(self, param: float) -> Dict[str, Any]: + """带错误处理的操作""" + try: + result = self._risky_operation(param) + return { + "success": True, + "result": result + } + except ValueError as e: + return { + "success": False, + "error": "Invalid parameter", + "message": str(e) + } + except IOError as e: + self._status = "error" + return { + "success": False, + "error": "Communication error", + "message": str(e) + } +``` + +### 自定义异常 + +```python +class DeviceError(Exception): + """设备错误基类""" + pass + +class DeviceNotReadyError(DeviceError): + """设备未就绪""" + pass + +class DeviceTimeoutError(DeviceError): + """设备超时""" + pass + +class MyDevice: + def operation(self) -> Dict[str, Any]: + if self._status != "idle": + raise DeviceNotReadyError(f"Device is {self._status}") + + # 执行操作 + return {"success": True} +``` + +## 最佳实践 + +### 1. 类型注解 + +```python +from typing import Dict, Any, Optional, List + +def method( + self, + param1: float, + param2: str, + optional_param: Optional[int] = None +) -> Dict[str, Any]: + """完整的类型注解有助于自动生成注册表""" + pass +``` + +### 2. 文档字符串 + +```python +def method(self, param: float) -> Dict[str, Any]: + """方法简短描述 + + 更详细的说明... + + Args: + param: 参数说明,包括单位和范围 + + Returns: + Dict包含: + - success (bool): 是否成功 + - result (Any): 结果数据 + + Raises: + DeviceError: 错误情况说明 + """ + pass +``` + +### 3. 配置验证 + +```python +def __init__(self, config: Dict[str, Any]): + # 验证必需参数 + required = ['port', 'baudrate'] + for key in required: + if key not in config: + raise ValueError(f"Missing required config: {key}") + + self.port = config['port'] + self.baudrate = config['baudrate'] +``` + +### 4. 资源清理 + +```python +def __del__(self): + """析构函数,清理资源""" + if hasattr(self, 'connection') and self.connection: + self.connection.close() +``` + +### 5. 设计前端友好的返回值 + +**记住:返回值会直接显示在 Web 界面** + +```python +import time + +def measure_temperature(self) -> Dict[str, Any]: + """测量温度 + + ✅ 好的返回值设计: + - 包含 success 状态 + - 使用描述性键名 + - 在键名中包含单位 + - 记录测量时间 + """ + temp = self._read_temperature() + + return { + "success": True, + "temperature_celsius": temp, # 键名包含单位 + "timestamp": time.time(), # 记录时间 + "sensor_status": "normal", # 额外状态信息 + "message": f"温度测量完成: {temp}°C" # 用户友好的消息 + } + +def bad_example(self) -> Dict[str, Any]: + """❌ 不好的返回值设计""" + return { + "s": True, # ❌ 键名不明确 + "v": 25.5, # ❌ 没有说明单位 + "t": 1234567890, # ❌ 不清楚是什么时间戳 + } +``` + +**参考 `host_node.test_latency` 方法**(第 1216-1340 行),它返回详细的测试结果,在前端清晰显示: + +```python +return { + "status": "success", + "avg_rtt_ms": 25.5, # 有意义的键名 + 单位 + "avg_time_diff_ms": 10.2, + "max_time_error_ms": 5.3, + "task_delay_ms": 15.7, + "test_count": 5, # 记录重要信息 +} +``` + +## 下一步 + +看完本文档后,建议继续阅读: + +- {doc}`add_action` - 了解如何添加新的动作指令 +- {doc}`add_yaml` - 学习如何编写和完善 YAML 注册表 + +进阶主题: + +- {doc}`03_add_device_registry` - 了解如何配置注册表 +- {doc}`04_add_device_testing` - 学习如何测试设备 +- {doc}`add_old_device` - 没有 SDK 时如何开发设备驱动 + +## 参考 + +- [Python 类型注解](https://docs.python.org/3/library/typing.html) +- [ROS2 rclpy 异步编程](https://docs.ros.org/en/humble/Tutorials/Intermediate/Writing-an-Action-Server-Client/Py.html) - Uni-Lab 使用 ROS2 的异步机制 +- [串口通信](https://pyserial.readthedocs.io/) + +> **注意:** 虽然设备驱动使用 `async def` 语法,但请**不要参考** Python 标准的 [asyncio 文档](https://docs.python.org/3/library/asyncio.html)。Uni-Lab 使用的是 ROS2 的异步机制,两者不兼容。请使用 `self.sleep()` 和 `self.create_task()` 等 BaseROS2DeviceNode 提供的方法。 diff --git a/docs/developer_guide/device_driver.md b/docs/developer_guide/add_old_device.md similarity index 78% rename from docs/developer_guide/device_driver.md rename to docs/developer_guide/add_old_device.md index 753133a3..583d0bb2 100644 --- a/docs/developer_guide/device_driver.md +++ b/docs/developer_guide/add_old_device.md @@ -1,8 +1,10 @@ -# 设备 Driver 开发 +# 设备 Driver 开发(无 SDK 设备) 我们对设备 Driver 的定义,是一个 Python/C++/C# 类,类的方法可以用于获取传感器数据、执行设备动作、更新物料信息。它们经过 Uni-Lab 的通信中间件包装,就能成为高效分布式通信的设备节点。 -因此,若已有设备的 SDK (Driver),可以直接 [添加进 Uni-Lab](add_device.md)。仅当没有 SDK (Driver) 时,请参考本章作开发。 +因此,若已有设备的 SDK (Driver),可以直接 [添加进 Uni-Lab](add_device.md)。**仅当没有 SDK (Driver) 时,请参考本章进行驱动开发。** + +> **💡 提示:** 本文档介绍如何为没有现成驱动的老设备开发驱动程序。如果您的设备已经有 SDK 或驱动,请直接参考 {doc}`add_device`。 ## 有串口字符串指令集文档的设备:Python 串口通信(常见 RS485, RS232, USB) @@ -12,13 +14,13 @@ Modbus 与 RS485、RS232 不一样的地方在于,会有更多直接寄存器的读写,以及涉及字节序转换(Big Endian, Little Endian)。 -Uni-Lab 开发团队在仓库中提供了3个样例: +Uni-Lab 开发团队在仓库中提供了 3 个样例: -* 单一机械设备**电夹爪**,通讯协议可见 [增广夹爪通讯协议](https://doc.rmaxis.com/docs/communication/fieldbus/),驱动代码位于 `unilabos/devices/gripper/rmaxis_v4.py` -* 单一通信设备**IO板卡**,驱动代码位于 `unilabos/device_comms/gripper/SRND_16_IO.py` -* 执行多设备复杂任务逻辑的**PLC**,Uni-Lab 提供了基于地址表的接入方式和点动工作流编写,测试代码位于 `unilabos/device_comms/modbus_plc/test/test_workflow.py` +- 单一机械设备**电夹爪**,通讯协议可见 [增广夹爪通讯协议](https://doc.rmaxis.com/docs/communication/fieldbus/),驱动代码位于 `unilabos/devices/gripper/rmaxis_v4.py` +- 单一通信设备**IO 板卡**,驱动代码位于 `unilabos/device_comms/gripper/SRND_16_IO.py` +- 执行多设备复杂任务逻辑的**PLC**,Uni-Lab 提供了基于地址表的接入方式和点动工作流编写,测试代码位于 `unilabos/device_comms/modbus_plc/test/test_workflow.py` -**** +--- ## 其他工业通信协议:CANopen, Ethernet, OPCUA... @@ -26,32 +28,32 @@ Uni-Lab 开发团队在仓库中提供了3个样例: ## 没有接口的老设备老软件:使用 PyWinAuto -**pywinauto**是一个 Python 库,用于自动化Windows GUI操作。它可以模拟用户的鼠标点击、键盘输入、窗口操作等,广泛应用于自动化测试、GUI自动化等场景。它支持通过两个后端进行操作: +**pywinauto**是一个 Python 库,用于自动化 Windows GUI 操作。它可以模拟用户的鼠标点击、键盘输入、窗口操作等,广泛应用于自动化测试、GUI 自动化等场景。它支持通过两个后端进行操作: -* **win32**后端:适用于大多数Windows应用程序,使用native Win32 API。(pywinauto_recorder默认使用win32后端) -* **uia**后端:基于Microsoft UI Automation,适用于较新的应用程序,特别是基于WPF或UWP的应用程序。(在win10上,会有更全的目录,有的窗口win32会识别不到) +- **win32**后端:适用于大多数 Windows 应用程序,使用 native Win32 API。(pywinauto_recorder 默认使用 win32 后端) +- **uia**后端:基于 Microsoft UI Automation,适用于较新的应用程序,特别是基于 WPF 或 UWP 的应用程序。(在 win10 上,会有更全的目录,有的窗口 win32 会识别不到) -### windows平台安装pywinauto和pywinauto_recorder +### windows 平台安装 pywinauto 和 pywinauto_recorder 直接安装会造成环境崩溃,需要下载并解压已经修改好的文件。 -cd到对应目录,执行安装 +cd 到对应目录,执行安装 -`pip install . -i ``https://pypi.tuna.tsinghua.edu.cn/simple` +` pip install . -i ``https://pypi.tuna.tsinghua.edu.cn/simple ` ![pywinauto_install](image/device_driver/pywinauto_install.png) -windows平台测试 python pywinauto_recorder.py,退出使用两次ctrl+alt+r取消选中,关闭命令提示符。 +windows 平台测试 python pywinauto_recorder.py,退出使用两次 ctrl+alt+r 取消选中,关闭命令提示符。 ### 计算器例子 -你可以先打开windows的计算器,然后在ilab的环境中运行下面的代码片段,可观察到得到结果,通过这一案例,你需要掌握的pywinauto用法: +你可以先打开 windows 的计算器,然后在 ilab 的环境中运行下面的代码片段,可观察到得到结果,通过这一案例,你需要掌握的 pywinauto 用法: -* 连接到指定进程 -* 利用dump_tree查找需要的窗口 -* 获取某个位置的信息 -* 模拟点击 -* 模拟输入 +- 连接到指定进程 +- 利用 dump_tree 查找需要的窗口 +- 获取某个位置的信息 +- 模拟点击 +- 模拟输入 #### 代码学习 @@ -74,39 +76,39 @@ window.dump_tree(depth=3) Dialog - '计算器' (L-419, T773, R-73, B1287) ['计算器Dialog', 'Dialog', '计算器', '计算器Dialog0', '计算器Dialog1', 'Dialog0', 'Dialog1', '计算器0', '计算器1'] child_window(title="计算器", control_type="Window") - | + | | Dialog - '计算器' (L-269, T774, R-81, B806) | ['计算器Dialog2', 'Dialog2', '计算器2'] | child_window(title="计算器", auto_id="TitleBar", control_type="Window") - | | + | | | | Menu - '系统' (L0, T0, R0, B0) | | ['Menu', '系统', '系统Menu', '系统0', '系统1'] | | child_window(title="系统", auto_id="SystemMenuBar", control_type="MenuBar") - | | + | | | | Button - '最小化 计算器' (L-219, T774, R-173, B806) | | ['Button', '最小化 计算器Button', '最小化 计算器', 'Button0', 'Button1'] | | child_window(title="最小化 计算器", auto_id="Minimize", control_type="Button") - | | + | | | | Button - '使 计算器 最大化' (L-173, T774, R-127, B806) | | ['Button2', '使 计算器 最大化', '使 计算器 最大化Button'] | | child_window(title="使 计算器 最大化", auto_id="Maximize", control_type="Button") - | | + | | | | Button - '关闭 计算器' (L-127, T774, R-81, B806) | | ['Button3', '关闭 计算器Button', '关闭 计算器'] | | child_window(title="关闭 计算器", auto_id="Close", control_type="Button") - | + | | Dialog - '计算器' (L-411, T774, R-81, B1279) | ['计算器Dialog3', 'Dialog3', '计算器3'] | child_window(title="计算器", control_type="Window") - | | + | | | | Static - '计算器' (L-363, T782, R-327, B798) | | ['计算器Static', 'Static', '计算器4', 'Static0', 'Static1'] | | child_window(title="计算器", auto_id="AppName", control_type="Text") - | | + | | | | Custom - '' (L-411, T806, R-81, B1279) | | ['Custom', '计算器Custom'] | | child_window(auto_id="NavView", control_type="Custom") - | + | | Pane - '' (L-411, T806, R-81, B1279) | ['Pane', '计算器Pane'] """ @@ -122,58 +124,58 @@ target_window.dump_tree(depth=3) Custom - '' (L-411, T806, R-81, B1279) ['标准Custom', 'Custom'] child_window(auto_id="NavView", control_type="Custom") - | + | | Button - '打开导航' (L-407, T812, R-367, B848) | ['打开导航Button', '打开导航', 'Button', 'Button0', 'Button1'] | child_window(title="打开导航", auto_id="TogglePaneButton", control_type="Button") - | | + | | | | Static - '' (L0, T0, R0, B0) | | ['Static', 'Static0', 'Static1'] | | child_window(auto_id="PaneTitleTextBlock", control_type="Text") - | + | | GroupBox - '' (L-411, T814, R-81, B1275) | ['标准GroupBox', 'GroupBox', 'GroupBox0', 'GroupBox1'] - | | + | | | | Static - '表达式为 ' (L0, T0, R0, B0) | | ['表达式为 ', 'Static2', '表达式为 Static'] | | child_window(title="表达式为 ", auto_id="CalculatorExpression", control_type="Text") - | | + | | | | Static - '显示为 0' (L-411, T875, R-81, B947) | | ['显示为 0Static', '显示为 0', 'Static3'] | | child_window(title="显示为 0", auto_id="CalculatorResults", control_type="Text") - | | + | | | | Button - '打开历史记录浮出控件' (L-121, T814, R-89, B846) | | ['打开历史记录浮出控件', '打开历史记录浮出控件Button', 'Button2'] | | child_window(title="打开历史记录浮出控件", auto_id="HistoryButton", control_type="Button") - | | + | | | | GroupBox - '记忆控件' (L-407, T948, R-85, B976) | | ['记忆控件', '记忆控件GroupBox', 'GroupBox2'] | | child_window(title="记忆控件", auto_id="MemoryPanel", control_type="Group") - | | + | | | | GroupBox - '显示控件' (L-407, T978, R-85, B1026) | | ['显示控件', 'GroupBox3', '显示控件GroupBox'] | | child_window(title="显示控件", auto_id="DisplayControls", control_type="Group") - | | + | | | | GroupBox - '标准函数' (L-407, T1028, R-166, B1076) | | ['标准函数', '标准函数GroupBox', 'GroupBox4'] | | child_window(title="标准函数", auto_id="StandardFunctions", control_type="Group") - | | + | | | | GroupBox - '标准运算符' (L-164, T1028, R-85, B1275) | | ['标准运算符', '标准运算符GroupBox', 'GroupBox5'] | | child_window(title="标准运算符", auto_id="StandardOperators", control_type="Group") - | | + | | | | GroupBox - '数字键盘' (L-407, T1078, R-166, B1275) | | ['GroupBox6', '数字键盘', '数字键盘GroupBox'] | | child_window(title="数字键盘", auto_id="NumberPad", control_type="Group") - | | + | | | | Button - '正负' (L-407, T1228, R-328, B1275) | | ['Button32', '正负Button', '正负'] | | child_window(title="正负", auto_id="negateButton", control_type="Button") - | + | | Static - '标准' (L-363, T815, R-322, B842) | ['标准', '标准Static', 'Static4'] | child_window(title="标准", auto_id="Header", control_type="Text") - | + | | Button - '始终置顶' (L-312, T814, R-280, B846) | ['始终置顶Button', '始终置顶', 'Button33'] | child_window(title="始终置顶", auto_id="NormalAlwaysOnTopButton", control_type="Button") @@ -187,47 +189,47 @@ numpad.dump_tree(depth=2) GroupBox - '数字键盘' (L-334, T1350, R-93, B1547) ['GroupBox', '数字键盘', '数字键盘GroupBox'] child_window(title="数字键盘", auto_id="NumberPad", control_type="Group") - | + | | Button - '零' (L-253, T1500, R-174, B1547) | ['零Button', 'Button', '零', 'Button0', 'Button1'] | child_window(title="零", auto_id="num0Button", control_type="Button") - | + | | Button - '一' (L-334, T1450, R-255, B1498) | ['一Button', 'Button2', '一'] | child_window(title="一", auto_id="num1Button", control_type="Button") - | + | | Button - '二' (L-253, T1450, R-174, B1498) | ['Button3', '二', '二Button'] | child_window(title="二", auto_id="num2Button", control_type="Button") - | + | | Button - '三' (L-172, T1450, R-93, B1498) | ['Button4', '三', '三Button'] | child_window(title="三", auto_id="num3Button", control_type="Button") - | + | | Button - '四' (L-334, T1400, R-255, B1448) | ['四', 'Button5', '四Button'] | child_window(title="四", auto_id="num4Button", control_type="Button") - | + | | Button - '五' (L-253, T1400, R-174, B1448) | ['Button6', '五Button', '五'] | child_window(title="五", auto_id="num5Button", control_type="Button") - | + | | Button - '六' (L-172, T1400, R-93, B1448) | ['六Button', 'Button7', '六'] | child_window(title="六", auto_id="num6Button", control_type="Button") - | + | | Button - '七' (L-334, T1350, R-255, B1398) | ['Button8', '七Button', '七'] | child_window(title="七", auto_id="num7Button", control_type="Button") - | + | | Button - '八' (L-253, T1350, R-174, B1398) | ['八', 'Button9', '八Button'] | child_window(title="八", auto_id="num8Button", control_type="Button") - | + | | Button - '九' (L-172, T1350, R-93, B1398) | ['Button10', '九', '九Button'] | child_window(title="九", auto_id="num9Button", control_type="Button") - | + | | Button - '十进制分隔符' (L-172, T1500, R-93, B1547) | ['十进制分隔符Button', 'Button11', '十进制分隔符'] | child_window(title="十进制分隔符", auto_id="decimalSeparatorButton", control_type="Button") @@ -262,13 +264,13 @@ r, g, b = pyautogui.pixel(point_x, point_y) ### pywinauto_recorder -pywinauto_recorder是一个配合 pywinauto 使用的工具,用于录制用户的操作,并生成相应的 pywinauto 脚本。这对于一些暂时无法直接调用DLL的函数并且需要模拟用户操作的场景非常有用。同时,可以省去仅用pywinauto的一些查找UI步骤。 +pywinauto_recorder 是一个配合 pywinauto 使用的工具,用于录制用户的操作,并生成相应的 pywinauto 脚本。这对于一些暂时无法直接调用 DLL 的函数并且需要模拟用户操作的场景非常有用。同时,可以省去仅用 pywinauto 的一些查找 UI 步骤。 #### 运行尝试 -请参照 上手尝试-环境创建-3 开启pywinauto_recorder +请参照 上手尝试-环境创建-3 开启 pywinauto_recorder -例如我们这里先启动一个windows自带的计算器软件 +例如我们这里先启动一个 windows 自带的计算器软件 ![calculator_01](image/device_driver/calculator_01.png) @@ -286,7 +288,7 @@ with UIPath(u"计算器||Window"): click(u"九||Button") ``` -执行该python脚本,可以观察到新开启的计算器被点击了数字9 +执行该 python 脚本,可以观察到新开启的计算器被点击了数字 9 ![calculator_03](image/device_driver/calculator_03.png) @@ -308,23 +310,38 @@ window.dump_tree(depth=[int类型数字], filename=None) GroupBox - '数字键盘' (L-334, T1350, R-93, B1547) ['GroupBox', '数字键盘', '数字键盘GroupBox'] child_window(title="数字键盘", auto_id="NumberPad", control_type="Group") - | + | | Button - '零' (L-253, T1500, R-174, B1547) | ['零Button', 'Button', '零', 'Button0', 'Button1'] | child_window(title="零", auto_id="num0Button", control_type="Button") """ ``` -这里以上面计算器的例子对dump_tree进行解读 +这里以上面计算器的例子对 dump_tree 进行解读 -2~4行为当前对象的窗口 +2~4 行为当前对象的窗口 -* 第2行分别是窗体的类型 `GroupBox`,窗体的题目 `数字键盘`,窗体的矩形区域坐标,对应的是屏幕上的位置(左、上、右、下) -* 第3行是 `['GroupBox', '数字键盘', '数字键盘GroupBox']`,为控件的标识符列表,可以选择任意一个,使用 `child_window(best_match="标识符")`来获取该窗口 -* 第4行是获取该控件的方法,请注意该方法不能保证获取唯一,`title`如果是变化的,也需要删除 `title`参数 +- 第 2 行分别是窗体的类型 `GroupBox`,窗体的题目 `数字键盘`,窗体的矩形区域坐标,对应的是屏幕上的位置(左、上、右、下) +- 第 3 行是 `['GroupBox', '数字键盘', '数字键盘GroupBox']`,为控件的标识符列表,可以选择任意一个,使用 `child_window(best_match="标识符")`来获取该窗口 +- 第 4 行是获取该控件的方法,请注意该方法不能保证获取唯一,`title`如果是变化的,也需要删除 `title`参数 -6~8行为当前对象窗口所包含的子窗口信息,信息类型对应2~4行 +6~8 行为当前对象窗口所包含的子窗口信息,信息类型对应 2~4 行 ### 窗口获取注意事项 -1. 在 `child_window`的时候,并不会立刻报错,只有在执行窗口的信息获取时才会调用,查询窗口是否存在,因此要想确定 `child_window`是否正确,可以调用子窗口对象的属性 `element_info`,来保证窗口存在 \ No newline at end of file +1. 在 `child_window`的时候,并不会立刻报错,只有在执行窗口的信息获取时才会调用,查询窗口是否存在,因此要想确定 `child_window`是否正确,可以调用子窗口对象的属性 `element_info`,来保证窗口存在 + +--- + +## 下一步 + +完成设备驱动开发后,建议继续阅读: + +- {doc}`add_device` - 了解如何将驱动添加到 Uni-Lab 中 +- {doc}`add_action` - 学习如何添加新的动作指令 +- {doc}`add_yaml` - 编写和完善 YAML 注册表 + +进阶主题: + +- {doc}`03_add_device_registry` - 详细的注册表配置 +- {doc}`04_add_device_testing` - 设备测试指南 diff --git a/docs/developer_guide/add_registry.md b/docs/developer_guide/add_registry.md new file mode 100644 index 00000000..122ffdd5 --- /dev/null +++ b/docs/developer_guide/add_registry.md @@ -0,0 +1,1118 @@ +# 添加设备:注册表配置完整指南 + +本文档说明如何为设备创建和配置注册表,包括基本结构、特殊类型识别、动作配置等内容。 + +## 概述 + +注册表(Registry)是Uni-Lab的设备配置系统,采用YAML格式定义设备的: +- 可用动作(Actions) +- 状态类型(Status Types) +- 初始化参数(Init Parameters) +- 连接点(Handles) + +好消息是系统会自动生成大部分配置内容,你只需要提供核心信息,让系统帮你完成剩余工作。 + +## 快速开始:使用注册表编辑器 + +推荐使用 UniLabOS 自带的可视化编辑器,它能帮你自动生成大部分配置,省去手写的麻烦。 + +### 使用步骤 + +1. 启动 UniLabOS +2. 在浏览器中打开"注册表编辑器"页面 +3. 上传你的 Python 设备驱动文件 +4. 点击"分析文件",让系统读取类信息 +5. 填写基本信息(设备描述、图标等) +6. 点击"生成注册表",复制生成的内容 +7. 保存到 `unilabos/registry/devices/your_device.yaml` + +**提示**:我们提供了测试驱动用于在界面上尝试注册表生成,参见:`test/registry/example_devices.py` + +## 注册表的基本结构 + +### 核心字段说明 + +| 字段名 | 类型 | 需要手写 | 说明 | +| ----------------- | ------ | -------- | ----------------------------------- | +| 设备标识符 | string | 是 | 设备的唯一名字,如 `mock_chiller` | +| class | object | 部分 | 设备的核心信息,必须配置 | +| description | string | 否 | 设备描述,系统默认给空字符串 | +| handles | array | 否 | 连接关系,默认为空 | +| icon | string | 否 | 图标路径,默认为空 | +| init_param_schema | object | 否 | 初始化参数,系统自动分析生成 | +| version | string | 否 | 版本号,默认 "1.0.0" | +| category | array | 否 | 设备分类,默认使用文件名 | +| config_info | array | 否 | 嵌套配置,默认为空 | +| file_path | string | 否 | 文件路径,系统自动设置 | +| registry_type | string | 否 | 注册表类型,自动设为 "device" | + +### class 字段详解 + +class 是核心部分,包含这些内容: + +| 字段名 | 类型 | 需要手写 | 说明 | +| --------------------- | ------ | -------- | ---------------------------------- | +| module | string | 是 | Python 类的路径,必须写 | +| type | string | 是 | 驱动类型,一般写 "python" | +| status_types | object | 否 | 状态类型,系统自动分析生成 | +| action_value_mappings | object | 部分 | 动作配置,系统会自动生成一些基础的 | + +### 基本结构示例 + +```yaml +my_device: + class: + module: unilabos.devices.my_module.my_device:MyDevice + type: python + status_types: + status: str + temperature: float + action_value_mappings: + # 动作配置(详见后文) + action_name: + type: UniLabJsonCommand + goal: {...} + result: {...} + + description: "设备描述" + version: "1.0.0" + category: + - device_category + handles: [] + icon: '' + init_param_schema: + config: + properties: + port: + default: DEFAULT_PORT + type: string + required: [] + type: object + data: + properties: + status: + type: string + temperature: + type: number + required: + - status + type: object +``` + +## 创建注册表的方式 + +### 方式1: 使用注册表编辑器(推荐) + +适合大多数场景,快速高效。 + +**步骤**: +1. 启动Uni-Lab +2. 访问Web界面的"注册表编辑器" +3. 上传您的Python设备驱动文件 +4. 点击"分析文件" +5. 填写描述和图标 +6. 点击"生成注册表" +7. 复制生成的YAML内容 +8. 保存到 `unilabos/registry/devices/your_device.yaml` + +### 方式2: 使用--complete_registry参数(开发调试) + +适合开发阶段,自动补全配置。 + +```bash +# 启动时自动补全注册表 +unilab -g dev.json --complete_registry --registry_path ./my_registry +``` + +系统会: +1. 扫描Python类 +2. 分析方法签名和类型 +3. 自动生成缺失的字段 +4. 保存到注册表文件 + +**或者在代码中**: + +```python +# 启动系统时使用参数 +启动系统时用 complete_registry=True 参数,让系统自动补全 +``` + +### 方式3: 手动编写(高级) + +适合需要精细控制或特殊需求的场景。 + +**最小化配置示例**: + +```yaml +# devices/my_device.yaml +my_device: + class: + module: unilabos.devices.my_module.my_device:MyDevice + type: python +``` + +然后启动时使用 `--complete_registry` 让系统自动补全其余内容。 + +## action_value_mappings 详解 + +这个部分定义设备能做哪些动作。系统会自动生成大部分动作,你通常只需要添加特殊的自定义动作。 + +### 系统自动生成的动作 + +1. **以 `auto-` 开头的动作**:从 Python 类的方法自动生成 +2. **通用的驱动动作**: + - `_execute_driver_command`:同步执行驱动命令(仅本地可用) + - `_execute_driver_command_async`:异步执行驱动命令(仅本地可用) + +### 动作配置字段 + +| 字段名 | 需要手写 | 说明 | +| ---------------- | -------- | -------------------------------- | +| type | 是 | 动作类型,必须指定 | +| goal | 是 | 输入参数映射 | +| feedback | 否 | 实时反馈,通常为空 | +| result | 是 | 结果返回映射 | +| goal_default | 部分 | 参数默认值,ROS 动作会自动生成 | +| schema | 部分 | 前端表单配置,ROS 动作会自动生成 | +| handles | 否 | 连接关系,默认为空 | +| placeholder_keys | 否 | 特殊输入字段配置 | + +### 动作类型 + +| 类型 | 使用场景 | 系统自动生成内容 | +| ---------------------- | -------------------- | ---------------------- | +| UniLabJsonCommand | 自定义同步 JSON 命令 | 无 | +| UniLabJsonCommandAsync | 自定义异步 JSON 命令 | 无 | +| ROS 动作类型 | 标准 ROS 动作 | goal_default 和 schema | + +**常用的 ROS 动作类型**: +- `SendCmd`:发送简单命令 +- `NavigateThroughPoses`:导航动作 +- `SingleJointPosition`:单关节位置控制 +- `Stir`:搅拌动作 +- `HeatChill`、`HeatChillStart`:加热冷却动作 + +### 动作命名建议 + +根据设备用途来起名字: + +- **启动停止类**:`start`、`stop`、`pause`、`resume` +- **设置参数类**:`set_speed`、`set_temperature`、`set_timer` +- **移动控制类**:`move_to_position`、`move_through_points` +- **功能操作类**:`stir`、`heat_chill_start`、`heat_chill_stop` +- **开关控制类**:`valve_open_cmd`、`valve_close_cmd`、`push_to` +- **命令执行类**:`send_nav_task`、`execute_command_from_outer` + +### 动作配置示例 + +```yaml +heat_chill_start: + type: HeatChillStart + goal: + purpose: purpose + temp: temp + goal_default: + purpose: '' + temp: 0.0 + handles: + output: + - handler_key: labware + label: Labware + data_type: resource + data_source: handle + data_key: liquid + placeholder_keys: + purpose: unilabos_resources + result: + status: status + success: success + schema: + description: '启动加热冷却功能' + properties: + goal: + properties: + purpose: + type: string + description: '用途说明' + temp: + type: number + description: '目标温度' + required: + - purpose + - temp + title: HeatChillStart_Goal + type: object + required: + - goal + title: HeatChillStart + type: object + feedback: {} +``` + +## 特殊类型的自动识别 + +### ResourceSlot和DeviceSlot识别 + +当您在驱动代码中使用这些特殊类型时,系统会自动识别并生成相应的前端选择器。 + +**Python驱动代码示例**: + +```python +from unilabos.registry.placeholder_type import ResourceSlot, DeviceSlot +from typing import List + +class MyDevice: + def test_resource( + self, + resource: ResourceSlot, # 单个资源 + resources: List[ResourceSlot], # 多个资源 + device: DeviceSlot, # 单个设备 + devices: List[DeviceSlot] # 多个设备 + ): + pass +``` + +**自动生成的注册表**(使用--complete_registry): + +```yaml +my_device: + class: + action_value_mappings: + test_resource: + type: UniLabJsonCommand + goal: + resource: resource + resources: resources + device: device + devices: devices + placeholder_keys: + resource: unilabos_resources # 自动添加! + resources: unilabos_resources # 自动添加! + device: unilabos_devices # 自动添加! + devices: unilabos_devices # 自动添加! + result: + success: success +``` + +### 识别规则 + +| Python类型 | placeholder_keys值 | 前端效果 | +|-----------|-------------------|---------| +| `ResourceSlot` | `unilabos_resources` | 单选资源下拉框 | +| `List[ResourceSlot]` | `unilabos_resources` | 多选资源下拉框 | +| `DeviceSlot` | `unilabos_devices` | 单选设备下拉框 | +| `List[DeviceSlot]` | `unilabos_devices` | 多选设备下拉框 | + +### 前端UI效果 + +#### 单选资源 + +```yaml +placeholder_keys: + source: unilabos_resources +``` + +**前端渲染**: +``` +Source: [下拉选择框 ▼] + ├── plate_1 (96孔板) + ├── tiprack_1 (枪头架) + ├── reservoir_1 (试剂槽) + └── ... +``` + +#### 多选资源 + +```yaml +placeholder_keys: + targets: unilabos_resources +``` + +**前端渲染**: +``` +Targets: [多选下拉框 ▼] + ☑ plate_1 (96孔板) + ☐ plate_2 (384孔板) + ☑ plate_3 (96孔板) + └── ... +``` + +#### 单选设备 + +```yaml +placeholder_keys: + pump: unilabos_devices +``` + +**前端渲染**: +``` +Pump: [下拉选择框 ▼] + ├── pump_1 (注射泵A) + ├── pump_2 (注射泵B) + └── ... +``` + +#### 多选设备 + +```yaml +placeholder_keys: + sync_devices: unilabos_devices +``` + +**前端渲染**: +``` +Sync Devices: [多选下拉框 ▼] + ☑ heater_1 (加热器A) + ☑ stirrer_1 (搅拌器) + ☐ pump_1 (注射泵) +``` + +### 手动配置placeholder_keys + +如果需要手动添加或覆盖自动生成的placeholder_keys: + +#### 场景1: 非标准参数名 + +```yaml +action_value_mappings: + custom_action: + goal: + my_custom_resource_param: resource_param + my_device_param: device_param + placeholder_keys: + my_custom_resource_param: unilabos_resources + my_device_param: unilabos_devices +``` + +#### 场景2: 混合类型 + +```python +def mixed_params( + self, + resource: ResourceSlot, + normal_param: str, + device: DeviceSlot +): + pass +``` + +```yaml +placeholder_keys: + resource: unilabos_resources # 资源选择 + device: unilabos_devices # 设备选择 + # normal_param不需要placeholder_keys +``` + +#### 场景3: 自定义选择器 + +```yaml +placeholder_keys: + special_param: custom_selector # 使用自定义选择器 +``` + +## 系统自动生成的字段 + +### status_types + +系统会扫描你的 Python 类,从状态方法(property或get_方法)自动生成这部分: + +```yaml +status_types: + current_temperature: float # 从 get_current_temperature() 或 @property current_temperature + is_heating: bool # 从 get_is_heating() 或 @property is_heating + status: str # 从 get_status() 或 @property status +``` + +**注意事项**: +- 系统会查找所有 `get_` 开头的方法和 `@property` 装饰的属性 +- 类型会自动转成相应的类型(如 `str`、`float`、`bool`) +- 如果类型是 `Any`、`None` 或未知的,默认使用 `String` + +### init_param_schema + +完全由系统自动生成,无需手动编写: + +```yaml +init_param_schema: + config: # 从 __init__ 方法分析得出 + properties: + port: + type: string + default: '/dev/ttyUSB0' + baudrate: + type: integer + default: 9600 + required: [] + type: object + + data: # 根据 status_types 生成的前端类型定义 + properties: + current_temperature: + type: number + is_heating: + type: boolean + status: + type: string + required: + - status + type: object +``` + +**生成规则**: +- `config` 部分:分析 `__init__` 方法的参数、类型和默认值 +- `data` 部分:根据 `status_types` 生成前端显示用的类型定义 + +### 其他自动填充的字段 + +```yaml +version: '1.0.0' # 默认版本 +category: ['文件名'] # 使用 yaml 文件名作为类别 +description: '' # 默认为空 +icon: '' # 默认为空 +handles: [] # 默认空数组 +config_info: [] # 默认空数组 +file_path: '/path/to/file' # 系统自动填写 +registry_type: 'device' # 自动设为设备类型 +``` + +### handles 字段 + +定义设备连接关系: + +```yaml +handles: # 大多数情况为空,除非设备需要特定连接 + - handler_key: device_output + label: Device Output + data_type: resource + data_source: value + data_key: default_value +``` + +### 可选配置字段 + +```yaml +description: '设备的详细描述' + +icon: 'device_icon.webp' # 设备图标文件名(会上传到OSS) + +version: '0.0.1' # 版本号 + +category: # 设备分类,前端用于分组显示 + - 'heating' + - 'cooling' + - 'temperature_control' + +config_info: # 嵌套配置,用于包含子设备 + - children: + - opentrons_24_tuberack_nest_1point5ml_snapcap_A1 + - other_nested_component +``` + +## 完整示例 + +### Python驱动代码 + +```python +# unilabos/devices/my_lab/liquid_handler.py + +from unilabos.registry.placeholder_type import ResourceSlot, DeviceSlot +from typing import List, Dict, Any, Optional + +class AdvancedLiquidHandler: + """高级液体处理工作站""" + + def __init__(self, config: Dict[str, Any]): + self.simulation = config.get('simulation', False) + self._status = "idle" + self._temperature = 25.0 + + @property + def status(self) -> str: + """设备状态""" + return self._status + + @property + def temperature(self) -> float: + """当前温度""" + return self._temperature + + def transfer( + self, + source: ResourceSlot, + target: ResourceSlot, + volume: float, + tip: Optional[ResourceSlot] = None + ) -> Dict[str, Any]: + """转移液体""" + return {"success": True} + + def multi_transfer( + self, + source: ResourceSlot, + targets: List[ResourceSlot], + volumes: List[float] + ) -> Dict[str, Any]: + """多目标转移""" + return {"success": True} + + def coordinate_with_heater( + self, + plate: ResourceSlot, + heater: DeviceSlot, + temperature: float + ) -> Dict[str, Any]: + """与加热器协同""" + return {"success": True} +``` + +### 生成的完整注册表 + +```yaml +# unilabos/registry/devices/advanced_liquid_handler.yaml + +advanced_liquid_handler: + class: + module: unilabos.devices.my_lab.liquid_handler:AdvancedLiquidHandler + type: python + + # 自动提取的状态类型 + status_types: + status: str + temperature: float + + # 自动生成的初始化参数 + init_param_schema: + config: + properties: + simulation: + type: boolean + default: false + type: object + data: + properties: + status: + type: string + temperature: + type: number + required: + - status + type: object + + # 动作映射 + action_value_mappings: + transfer: + type: UniLabJsonCommand + goal: + source: source + target: target + volume: volume + tip: tip + goal_default: + source: {} + target: {} + volume: 0.0 + tip: null + placeholder_keys: + source: unilabos_resources # 自动添加 + target: unilabos_resources # 自动添加 + tip: unilabos_resources # 自动添加 + result: + success: success + schema: + description: "转移液体" + properties: + goal: + properties: + source: + type: object + description: "源容器" + target: + type: object + description: "目标容器" + volume: + type: number + description: "体积(μL)" + tip: + type: object + description: "枪头(可选)" + required: + - source + - target + - volume + type: object + required: + - goal + type: object + + multi_transfer: + type: UniLabJsonCommand + goal: + source: source + targets: targets + volumes: volumes + placeholder_keys: + source: unilabos_resources # 单选 + targets: unilabos_resources # 多选 + result: + success: success + + coordinate_with_heater: + type: UniLabJsonCommand + goal: + plate: plate + heater: heater + temperature: temperature + placeholder_keys: + plate: unilabos_resources # 资源选择 + heater: unilabos_devices # 设备选择 + result: + success: success + + description: "高级液体处理工作站,支持多目标转移和设备协同" + version: "1.0.0" + category: + - liquid_handling + handles: [] + icon: "" +``` + +### 另一个完整示例:温度控制器 + +```yaml +my_temperature_controller: + class: + action_value_mappings: + heat_start: + type: HeatChillStart + goal: + target_temp: temp + vessel: vessel + goal_default: + target_temp: 25.0 + vessel: '' + handles: + output: + - handler_key: heated_sample + label: Heated Sample + data_type: resource + data_source: handle + data_key: sample + placeholder_keys: + vessel: unilabos_resources + result: + status: status + success: success + schema: + description: '启动加热功能' + properties: + goal: + properties: + target_temp: + type: number + description: '目标温度' + vessel: + type: string + description: '容器标识' + required: + - target_temp + - vessel + title: HeatStart_Goal + type: object + required: + - goal + title: HeatStart + type: object + feedback: {} + + stop: + type: UniLabJsonCommand + goal: {} + goal_default: {} + handles: {} + result: + status: status + schema: + description: '停止设备' + properties: + goal: + type: object + title: Stop_Goal + title: Stop + type: object + feedback: {} + + module: unilabos.devices.temperature.my_controller:MyTemperatureController + status_types: + current_temperature: float + target_temperature: float + is_heating: bool + is_cooling: bool + status: str + vessel: str + type: python + + description: '我的温度控制器设备' + handles: [] + icon: 'temperature_controller.webp' + init_param_schema: + config: + properties: + port: + default: '/dev/ttyUSB0' + type: string + baudrate: + default: 9600 + type: number + required: [] + type: object + data: + properties: + current_temperature: + type: number + target_temperature: + type: number + is_heating: + type: boolean + is_cooling: + type: boolean + status: + type: string + vessel: + type: string + required: + - current_temperature + - target_temperature + - status + type: object + + version: '1.0.0' + category: + - 'temperature_control' + - 'heating' + config_info: [] +``` + +## 部署和使用 + +### Python 驱动类要求 + +你的设备类需要符合以下要求: + +```python +from unilabos.common.device_base import DeviceBase + +class MyDevice(DeviceBase): + def __init__(self, config): + """初始化,参数会自动分析到 init_param_schema.config""" + super().__init__(config) + self.port = config.get('port', '/dev/ttyUSB0') + + # 状态方法(会自动生成到 status_types) + @property + def status(self): + """返回设备状态""" + return "idle" + + @property + def temperature(self): + """返回当前温度""" + return 25.0 + + # 动作方法(会自动生成 auto- 开头的动作) + async def start_heating(self, temperature: float): + """开始加热到指定温度""" + pass + + def stop(self): + """停止操作""" + pass +``` + +### 方法一:使用编辑器(推荐) + +1. 先编写 Python 驱动类 +2. 使用注册表编辑器自动生成 yaml 配置 +3. 保存生成的文件到 `devices/` 目录 +4. 重启 UniLabOS 即可使用 + +### 方法二:手动编写(简化版) + +1. 创建最小配置: + +```yaml +# devices/my_device.yaml +my_device: + class: + module: unilabos.devices.my_module.my_device:MyDevice + type: python +``` + +2. 启动系统时使用 `--complete_registry` 参数,让系统自动补全 + +3. 检查生成的配置是否符合预期 + +### 系统集成 + +1. 将 yaml 文件放到 `unilabos/registry/devices/` 目录 +2. 系统启动时会自动扫描并加载设备 +3. 系统会自动补全所有缺失的字段 +4. 设备即可在前端界面中使用 + +### 高级配置 + +如果需要特殊设置,可以手动添加: + +```yaml +my_device: + class: + module: unilabos.devices.my_module.my_device:MyDevice + type: python + action_value_mappings: + # 自定义动作 + special_command: + type: UniLabJsonCommand + goal: {} + result: {} + + # 可选的自定义配置 + description: '我的特殊设备' + icon: 'my_device.webp' + category: ['temperature', 'heating'] +``` + +## 调试和验证 + +### 1. 检查生成的注册表 + +```bash +# 使用complete_registry生成 +unilab -g dev.json --complete_registry + +# 查看生成的文件 +cat unilabos/registry/devices/my_device.yaml +``` + +### 2. 验证placeholder_keys + +确认: +- ResourceSlot参数有 `unilabos_resources` +- DeviceSlot参数有 `unilabos_devices` +- List类型被正确识别 + +### 3. 测试前端效果 + +1. 启动Uni-Lab +2. 访问Web界面 +3. 选择设备 +4. 调用动作 +5. 检查是否显示正确的选择器 + +### 4. 检查文件路径和导入 + +```bash +# 确认模块路径正确 +python -c "from unilabos.devices.my_module.my_device import MyDevice" +``` + +## 常见问题 + +### Q1: placeholder_keys没有自动生成 + +**检查**: +1. 是否使用了`--complete_registry`参数? +2. 类型注解是否正确? + ```python + # ✓ 正确 + def method(self, resource: ResourceSlot): + + # ✗ 错误(缺少类型注解) + def method(self, resource): + ``` +3. 是否正确导入? + ```python + from unilabos.registry.placeholder_type import ResourceSlot, DeviceSlot + ``` + +### Q2: 前端显示普通输入框而不是选择器 + +**原因**: placeholder_keys未正确配置 + +**解决**: +```yaml +# 检查YAML中是否有 +placeholder_keys: + resource: unilabos_resources +``` + +### Q3: 多选不工作 + +**检查类型注解**: +```python +# ✓ 正确 - 会生成多选 +def method(self, resources: List[ResourceSlot]): + +# ✗ 错误 - 会生成单选 +def method(self, resources: ResourceSlot): +``` + +### Q4: 运行时收到错误的类型 + +**说明**: 运行时会自动转换 + +前端传递: +```json +{ + "resource": "plate_1" // 字符串ID +} +``` + +运行时收到: +```python +resource.id # "plate_1" +resource.name # "96孔板" +resource.type # "resource" +# 完整的Resource对象 +``` + +### Q5: 设备加载不了 + +**检查**: +1. 确认 `class.module` 路径是否正确 +2. 确认 Python 驱动类能否正常导入 +3. 使用 yaml 验证器检查文件格式 +4. 查看 UniLabOS 启动日志中的错误信息 + +### Q6: 自动生成失败 + +**检查**: +1. 确认类继承了正确的基类 +2. 确保状态方法的返回类型注解清晰 +3. 检查类能否被动态导入 +4. 确认启用了 `complete_registry=True` + +### Q7: 前端显示问题 + +**解决步骤**: +1. 删除旧的 yaml 文件,用编辑器重新生成 +2. 清除浏览器缓存,重新加载页面 +3. 确认必需字段(如 `schema`)都存在 +4. 检查 `goal_default` 和 `schema` 的数据类型是否一致 + +### Q8: 动作执行出错 + +**检查**: +1. 确认动作方法名符合规范(如 `execute_`) +2. 检查 `goal` 字段的参数映射是否正确 +3. 确认方法返回值格式符合 `result` 映射 +4. 在驱动类中添加异常处理 + +## 最佳实践 + +### 开发流程 + +1. **优先使用编辑器**:除非有特殊需求,否则优先使用注册表编辑器 +2. **最小化配置**:手动配置时只定义必要字段,让系统自动生成其他内容 +3. **增量开发**:先创建基本配置,后续根据需要添加特殊动作 +4. **及时测试**:每次修改后及时在开发环境测试 + +### 代码规范 + +1. **始终使用类型注解** + +```python +# ✓ 好 +def method(self, resource: ResourceSlot, device: DeviceSlot): + pass + +# ✗ 差 +def method(self, resource, device): + pass +``` + +2. **提供有意义的参数名** + +```python +# ✓ 好 - 清晰的参数名 +def transfer(self, source: ResourceSlot, target: ResourceSlot): + pass + +# ✗ 差 - 模糊的参数名 +def transfer(self, r1: ResourceSlot, r2: ResourceSlot): + pass +``` + +3. **使用Optional表示可选参数** + +```python +from typing import Optional + +def method( + self, + required_resource: ResourceSlot, + optional_resource: Optional[ResourceSlot] = None +): + pass +``` + +4. **添加详细的文档字符串** + +```python +def method( + self, + source: ResourceSlot, # 源容器 + targets: List[ResourceSlot] # 目标容器列表 +) -> Dict[str, Any]: + """方法说明 + + Args: + source: 源容器,必须包含足够的液体 + targets: 目标容器列表,每个容器应该为空 + + Returns: + 包含操作结果的字典 + """ + pass +``` + +5. **方法命名规范** + - 状态方法使用 `@property` 装饰器或 `get_` 前缀 + - 动作方法使用动词开头 + - 保持命名清晰、一致 + +6. **完善的错误处理** + - 实现完善的错误处理 + - 添加日志记录 + - 提供有意义的错误信息 + +### 配置管理 + +1. **版本控制**:所有 yaml 文件纳入版本控制 +2. **命名一致性**:设备 ID、文件名、类名保持一致的命名风格 +3. **定期更新**:定期运行完整注册以更新自动生成的字段 +4. **备份配置**:在修改前备份重要的手动配置 +5. **文档同步**:保持配置文件和文档的同步更新 + +### 测试验证 + +1. **本地测试**:在本地环境充分测试后再部署 +2. **渐进部署**:先部署到测试环境,验证无误后再上生产环境 +3. **监控日志**:密切监控设备加载和运行日志 +4. **回滚准备**:准备快速回滚机制,以应对紧急情况 +5. **自动化测试**:编写单元测试和集成测试 + +### 性能优化 + +1. **按需加载**:只加载实际使用的设备类型 +2. **缓存利用**:充分利用系统的注册表缓存机制 +3. **资源管理**:合理管理设备连接和资源占用 +4. **监控指标**:设置关键性能指标的监控和告警 + +## 参考资料 + +- {doc}`add_device` - 设备驱动编写指南 +- {doc}`04_add_device_testing` - 设备测试指南 +- Python [typing模块](https://docs.python.org/3/library/typing.html) +- [YAML语法](https://yaml.org/) +- [JSON Schema](https://json-schema.org/) + + diff --git a/docs/developer_guide/add_batteryPLC.md b/docs/developer_guide/examples/battery_plc_workstation.md similarity index 61% rename from docs/developer_guide/add_batteryPLC.md rename to docs/developer_guide/examples/battery_plc_workstation.md index f1e93974..e27e4df1 100644 --- a/docs/developer_guide/add_batteryPLC.md +++ b/docs/developer_guide/examples/battery_plc_workstation.md @@ -1,6 +1,17 @@ -# 电池装配工站接入(PLC) +# 实例:电池装配工站接入(PLC控制) -本指南将引导你完成电池装配工站(以 PLC 控制为例)的接入流程,包括新建工站文件、编写驱动与寄存器读写、生成注册表、上传及注意事项。 +> **文档类型**:实际应用案例 +> **适用场景**:使用 PLC 控制的电池装配工站接入 +> **前置知识**:{doc}`../add_device` | {doc}`../add_registry` + +本指南以电池装配工站为实际案例,引导你完成 PLC 控制设备的完整接入流程,包括新建工站文件、编写驱动与寄存器读写、生成注册表、上传及注意事项。 + +## 案例概述 + +**设备类型**:电池装配工站 +**通信方式**:Modbus TCP (PLC) +**工站基类**:`WorkstationBase` +**主要功能**:电池组装、寄存器读写、数据采集 ## 1. 新建工站文件 @@ -93,10 +104,12 @@ python unilabos\app\main.py -g celljson.json --ak --sk ``` 点击注册表编辑,进入注册表编辑页面 -![Layers](image_add_batteryPLC/unilab_sys_status.png) + +![系统状态页面](image_battery_plc/unilab_sys_status.png) 按照图示步骤填写自动生成注册表信息: -![Layers](image_add_batteryPLC/unilab_registry_process.png) + +![注册表生成流程](image_battery_plc/unilab_registry_process.png) 步骤说明: 1. 选择新增的工站`coin_cell_assembly.py`文件 @@ -107,8 +120,9 @@ python unilabos\app\main.py -g celljson.json --ak --sk 6. 填写新的工站注册表备注信息 7. 生成注册表 -以上操作步骤完成,则会生成的新的注册表ymal文件,如下图: -![Layers](image_add_batteryPLC/unilab_new_yaml.png) +以上操作步骤完成,则会生成的新的注册表YAML文件,如下图: + +![生成的YAML文件](image_battery_plc/unilab_new_yaml.png) @@ -134,14 +148,60 @@ python unilabos\app\main.py -g celljson.json --ak --sk - ## 4. 注意事项 -- 在新生成的 YAML 中,确认 `module` 指向新工站类,本例中需检查`coincellassemblyworkstation_device.yaml`文件中是否指向了`coin_cell_assembly.py`文件中定义的`CoinCellAssemblyWorkstation`类文件: +### 4.1 验证模块路径 -``` +在新生成的 YAML 中,确认 `module` 指向新工站类。本例中需检查 `coincellassemblyworkstation_device.yaml` 文件中是否正确指向了 `CoinCellAssemblyWorkstation` 类: + +```yaml module: unilabos.devices.workstation.coin_cell_assembly.coin_cell_assembly:CoinCellAssemblyWorkstation ``` -- 首次新增设备(或资源)需要在网页端新增注册表信息,`--complete_registry`补全注册表,`--upload_registry`上传注册表信息。 +### 4.2 首次接入流程 -- 如果不是新增设备(或资源),仅对工站驱动的.py文件进行了修改,则不需要在网页端新增注册表信息。只需要运行补全注册表信息之后,上传注册表即可。 +首次新增设备(或资源)需要完整流程: +1. ✅ 在网页端生成注册表信息 +2. ✅ 使用 `--complete_registry` 补全注册表 +3. ✅ 使用 `--upload_registry` 上传注册表信息 + +### 4.3 驱动更新流程 + +如果不是新增设备,仅修改了工站驱动的 `.py` 文件: +1. ✅ 运行 `--complete_registry` 补全注册表 +2. ✅ 运行 `--upload_registry` 上传注册表 +3. ❌ 不需要在网页端重新生成注册表 + +### 4.4 PLC通信注意事项 + +- **握手机制**:若需参数下发,建议在 PLC 端设置标志寄存器并完成握手复位,避免粘连与竞争 +- **字节序**:FLOAT32 等多字节数据类型需要正确指定字节序(如 `WorderOrder.LITTLE`) +- **寄存器映射**:确保 CSV 文件中的寄存器地址与 PLC 实际配置一致 +- **连接稳定性**:在初始化时检查 PLC 连接状态,建议添加重连机制 + +## 5. 扩展阅读 + +### 相关文档 + +- {doc}`../add_device` - 设备驱动编写通用指南 +- {doc}`../add_registry` - 注册表配置完整指南 +- {doc}`../workstation_architecture` - 工站架构详解 + +### 技术要点 + +- **Modbus TCP 通信**:PLC 通信协议和寄存器读写 +- **WorkstationBase**:工站基类的继承和使用 +- **寄存器映射**:CSV 格式的寄存器配置 +- **注册表生成**:自动化工具使用 + +## 6. 总结 + +通过本案例,你应该掌握: + +1. ✅ 如何创建 PLC 控制的工站驱动 +2. ✅ Modbus TCP 通信和寄存器读写 +3. ✅ 使用可视化编辑器生成注册表 +4. ✅ 注册表的补全和上传流程 +5. ✅ 新增设备与更新驱动的区别 + +这个案例展示了完整的 PLC 设备接入流程,可以作为其他类似设备接入的参考模板。 diff --git a/docs/developer_guide/image_add_batteryPLC/unilab_new_yaml.png b/docs/developer_guide/examples/image_battery_plc/unilab_new_yaml.png similarity index 100% rename from docs/developer_guide/image_add_batteryPLC/unilab_new_yaml.png rename to docs/developer_guide/examples/image_battery_plc/unilab_new_yaml.png diff --git a/docs/developer_guide/image_add_batteryPLC/unilab_registry_process.png b/docs/developer_guide/examples/image_battery_plc/unilab_registry_process.png similarity index 100% rename from docs/developer_guide/image_add_batteryPLC/unilab_registry_process.png rename to docs/developer_guide/examples/image_battery_plc/unilab_registry_process.png diff --git a/docs/developer_guide/image_add_batteryPLC/unilab_sys_status.png b/docs/developer_guide/examples/image_battery_plc/unilab_sys_status.png similarity index 100% rename from docs/developer_guide/image_add_batteryPLC/unilab_sys_status.png rename to docs/developer_guide/examples/image_battery_plc/unilab_sys_status.png diff --git a/docs/developer_guide/materials_construction_guide.md b/docs/developer_guide/examples/materials_construction_guide.md similarity index 98% rename from docs/developer_guide/materials_construction_guide.md rename to docs/developer_guide/examples/materials_construction_guide.md index a19fa05c..90f23905 100644 --- a/docs/developer_guide/materials_construction_guide.md +++ b/docs/developer_guide/examples/materials_construction_guide.md @@ -1,4 +1,8 @@ -# 物料构建指南 +# 实例:物料构建指南 + +> **文档类型**:物料系统实战指南 +> **适用场景**:工作站物料系统构建、Deck/Warehouse/Carrier/Bottle 配置 +> **前置知识**:PyLabRobot 基础 | 资源管理概念 ## 概述 diff --git a/docs/developer_guide/materials_tutorial.md b/docs/developer_guide/examples/materials_tutorial.md similarity index 96% rename from docs/developer_guide/materials_tutorial.md rename to docs/developer_guide/examples/materials_tutorial.md index 7142b270..398d2d86 100644 --- a/docs/developer_guide/materials_tutorial.md +++ b/docs/developer_guide/examples/materials_tutorial.md @@ -1,6 +1,10 @@ -# 物料教程(Resource) +# 实例:物料教程(Resource) -本教程面向 Uni-Lab-OS 的开发者,讲解“物料”的核心概念、3种物料格式(UniLab、PyLabRobot、奔耀Bioyond)及其相互转换方法,并说明4种 children 结构表现形式及使用场景。 +> **文档类型**:物料系统完整教程 +> **适用场景**:物料格式转换、多系统物料对接、资源结构理解 +> **前置知识**:Python 基础 | JSON 数据结构 + +本教程面向 Uni-Lab-OS 的开发者,讲解"物料"的核心概念、3种物料格式(UniLab、PyLabRobot、奔耀Bioyond)及其相互转换方法,并说明4种 children 结构表现形式及使用场景。 --- diff --git a/docs/developer_guide/workstation_architecture.md b/docs/developer_guide/examples/workstation_architecture.md similarity index 97% rename from docs/developer_guide/workstation_architecture.md rename to docs/developer_guide/examples/workstation_architecture.md index 073d9aea..52f1966f 100644 --- a/docs/developer_guide/workstation_architecture.md +++ b/docs/developer_guide/examples/workstation_architecture.md @@ -1,4 +1,8 @@ -# 工作站模板架构设计与对接指南 +# 实例:工作站模板架构设计与对接指南 + +> **文档类型**:架构设计指南与实战案例 +> **适用场景**:大型工作站接入、子设备管理、物料系统集成 +> **前置知识**:{doc}`../add_device` | {doc}`../add_registry` ## 0. 问题简介 @@ -6,9 +10,9 @@ ### 0.1 自研常量有机工站:最重要的是子设备管理和通信转发 -![workstation_organic_yed](image/workstation_architecture/workstation_organic_yed.png) +![workstation_organic_yed](../image/workstation_architecture/workstation_organic_yed.png) -![workstation_organic](image/workstation_architecture/workstation_organic.png) +![workstation_organic](../image/workstation_architecture/workstation_organic.png) 这类工站由开发者自研,组合所有子设备和实验耗材、希望让他们在工作站这一级协调配合; @@ -18,7 +22,7 @@ ### 0.2 移液工作站:物料系统和工作流模板管理 -![workstation_liquid_handler](image/workstation_architecture/workstation_liquid_handler.png) +![workstation_liquid_handler](../image/workstation_architecture/workstation_liquid_handler.png) 1. 绝大多数情况没有子设备,有时候选配恒温震荡等模块时,接口也由工作站提供 2. 所有任务系统均由工作站本身实现并下发指令,有统一的抽象函数可实现(pick_up_tips, aspirate, dispense, transfer 等)。有时需要将这些指令组合、转化为工作站的脚本语言,再统一下发。因此会形成大量固定的 protocols。 @@ -26,7 +30,7 @@ ### 0.3 厂家开发的定制大型工站 -![workstation_by_supplier](image/workstation_architecture/workstation_by_supplier.png) +![workstation_by_supplier](../image/workstation_architecture/workstation_by_supplier.png) 由厂家开发,具备完善的物料系统、任务系统甚至调度系统;由 PLC 或 OpenAPI TCP 协议统一通信 diff --git a/docs/developer_guide/networking_overview.md b/docs/developer_guide/networking_overview.md new file mode 100644 index 00000000..e2cda520 --- /dev/null +++ b/docs/developer_guide/networking_overview.md @@ -0,0 +1,595 @@ +# 组网部署与主从模式配置 + +本文档介绍 Uni-Lab-OS 的组网架构、部署方式和主从模式的详细配置。 + +## 目录 + +- [架构概览](#架构概览) +- [节点类型](#节点类型) +- [通信机制](#通信机制) +- [典型拓扑](#典型拓扑) +- [主从模式配置](#主从模式配置) +- [网络配置](#网络配置) +- [示例:多房间部署](#示例多房间部署) +- [故障处理](#故障处理) +- [监控和维护](#监控和维护) + +--- + +## 架构概览 + +Uni-Lab-OS 支持多种部署模式: + +``` +┌──────────────────────────────────────────────┐ +│ Cloud Platform/Self-hosted Platform │ +│ uni-lab.bohrium.com │ +│ (Resource Management, Task Scheduling, │ +│ Monitoring) │ +└────────────────────┬─────────────────────────┘ + │ WebSocket / HTTP + │ + ┌──────────┴──────────┐ + │ │ + ┌────▼─────┐ ┌────▼─────┐ + │ Master │◄──ROS2──►│ Slave │ + │ Node │ │ Node │ + │ (Host) │ │ (Slave) │ + └────┬─────┘ └────┬─────┘ + │ │ + ┌────┴────┐ ┌────┴────┐ + │ Device A│ │ Device B│ + │ Device C│ │ Device D│ + └─────────┘ └─────────┘ +``` + +--- + +## 节点类型 + +### 主节点(Host Node) + +**功能**: + +- 创建和管理全局资源 +- 提供 host_node 服务 +- 连接云端平台 +- 协调多个从节点 +- 提供 Web 管理界面 + +**启动命令**: + +```bash +unilab --ak your_ak --sk your_sk -g host_devices.json +``` + +### 从节点(Slave Node) + +**功能**: + +- 管理本地设备 +- 不连接云端(可选) +- 向主节点注册 +- 执行分配的任务 + +**启动命令**: + +```bash +unilab --ak your_ak --sk your_sk -g slave_devices.json --is_slave +``` + +--- + +## 通信机制 + +### ROS2 通信 + +**用途**: 节点间实时通信 + +**通信方式**: + +- **Topic**: 状态广播(设备状态、传感器数据) +- **Service**: 同步请求(资源查询、配置获取) +- **Action**: 异步任务(设备操作、长时间运行) + +**示例**: + +```bash +# 查看ROS2节点 +ros2 node list + +# 查看topic +ros2 topic list + +# 查看action +ros2 action list +``` + +### WebSocket 通信 + +**用途**: 主节点与云端通信 + +**特点**: + +- 实时双向通信 +- 自动重连 +- 心跳保持 + +**配置**: + +```python +# local_config.py +BasicConfig.ak = "your_ak" +BasicConfig.sk = "your_sk" +``` + +--- + +## 典型拓扑 + +### 单节点模式 + +**适用场景**: 小型实验室、开发测试 + +``` +┌──────────────────┐ +│ Uni-Lab Node │ +│ ┌────────────┐ │ +│ │ Device A │ │ +│ │ Device B │ │ +│ │ Device C │ │ +│ └────────────┘ │ +└──────────────────┘ +``` + +**优点**: + +- 配置简单 +- 无网络延迟 +- 适合快速原型 + +**启动**: + +```bash +unilab --ak your_ak --sk your_sk -g all_devices.json +``` + +### 主从模式 + +**适用场景**: 多房间、分布式设备 + +``` +┌─────────────┐ ┌──────────────┐ +│ Master Node │◄────►│ Slave Node 1 │ +│ Coordinator │ │ Liquid │ +│ Web UI │ │ Handling │ +└──────┬──────┘ └──────────────┘ + │ + │ ┌──────────────┐ + └────────────►│ Slave Node 2 │ + │ Analytical │ + │ (NMR/GC) │ + └──────────────┘ +``` + +**优点**: + +- 物理分隔 +- 独立故障域 +- 易于扩展 + +**适用场景**: + +- 设备物理位置分散 +- 不同房间的设备 +- 需要独立故障域 +- 分阶段扩展系统 + +**主节点**: + +```bash +unilab --ak your_ak --sk your_sk -g host.json +``` + +**从节点**: + +```bash +unilab --ak your_ak --sk your_sk -g slave1.json --is_slave +unilab --ak your_ak --sk your_sk -g slave2.json --is_slave --port 8003 +``` + +### 云端集成模式 + +**适用场景**: 远程监控、多实验室协作 + +``` + Cloud Platform + │ + ┌───────┴────────┐ + │ │ +Laboratory A Laboratory B +(Master Node) (Master Node) +``` + +**优点**: + +- 远程访问 +- 数据同步 +- 任务调度 + +**启动**: + +```bash +# 实验室A +unilab --ak your_ak --sk your_sk --upload_registry --use_remote_resource + +# 实验室B +unilab --ak your_ak --sk your_sk --upload_registry --use_remote_resource +``` + +--- + +## 主从模式配置 + +### 主节点配置 + +#### 1. 创建主节点设备图 + +`host.json`: + +```json +{ + "nodes": [], + "links": [] +} +``` + +#### 2. 启动主节点 + +```bash +# 基本启动 +unilab --ak your_ak --sk your_sk -g host.json + +# 带云端集成 +unilab --ak your_ak --sk your_sk -g host.json --upload_registry + +# 指定端口 +unilab --ak your_ak --sk your_sk -g host.json --port 8002 +``` + +#### 3. 验证主节点 + +```bash +# 检查ROS2节点 +ros2 node list +# 应该看到 /host_node + +# 检查服务 +ros2 service list | grep host_node + +# Web界面 +# 访问 http://localhost:8002 +``` + +### 从节点配置 + +#### 1. 创建从节点设备图 + +`slave1.json`: + +```json +{ + "nodes": [ + { + "id": "liquid_handler_1", + "name": "液体处理工作站", + "type": "device", + "class": "liquid_handler", + "config": { + "simulation": false + } + } + ], + "links": [] +} +``` + +#### 2. 启动从节点 + +```bash +# 基本从节点启动 +unilab --ak your_ak --sk your_sk -g slave1.json --is_slave + +# 指定不同端口(如果多个从节点在同一台机器) +unilab --ak your_ak --sk your_sk -g slave1.json --is_slave --port 8003 + +# 跳过等待主节点(独立测试) +unilab --ak your_ak --sk your_sk -g slave1.json --is_slave --slave_no_host +``` + +#### 3. 验证从节点 + +```bash +# 检查节点连接 +ros2 node list + +# 检查设备状态 +ros2 topic echo /liquid_handler_1/status +``` + +### 跨节点通信 + +#### 资源访问 + +主节点可以访问从节点的资源: + +```bash +# 在主节点或其他节点调用从节点设备 +ros2 action send_goal /liquid_handler_1/transfer_liquid \ + unilabos_msgs/action/TransferLiquid \ + "{source: {...}, target: {...}, volume: 100.0}" +``` + +#### 状态监控 + +主节点监控所有从节点状态: + +```bash +# 订阅从节点状态 +ros2 topic echo /liquid_handler_1/status + +# 查看所有设备状态 +ros2 topic list | grep status +``` + +--- + +## 网络配置 + +### ROS2 DDS 配置 + +确保主从节点在同一网络: + +```bash +# 检查网络可达性 +ping + +# 设置ROS_DOMAIN_ID(可选,用于隔离) +export ROS_DOMAIN_ID=42 +``` + +### 防火墙配置 + +**建议做法**: + +为了确保 ROS2 DDS 通信正常,建议直接关闭防火墙,而不是配置特定端口。ROS2 使用动态端口范围,配置特定端口可能导致通信问题。 + +**Linux**: + +```bash +# 关闭防火墙 +sudo ufw disable + +# 或者临时停止防火墙 +sudo systemctl stop ufw +``` + +**Windows**: + +```powershell +# 在Windows安全中心关闭防火墙 +# 控制面板 -> 系统和安全 -> Windows Defender 防火墙 -> 启用或关闭Windows Defender防火墙 +``` + +### 验证网络连通性 + +在配置完成后,使用 ROS2 自带的 demo 节点来验证跨节点通信是否正常: + +**在主节点机器上**(激活 unilab 环境后): + +```bash +# 启动talker +ros2 run demo_nodes_cpp talker + +# 同时在另一个终端启动listener +ros2 run demo_nodes_cpp listener +``` + +**在从节点机器上**(激活 unilab 环境后): + +```bash +# 启动talker +ros2 run demo_nodes_cpp talker + +# 同时在另一个终端启动listener +ros2 run demo_nodes_cpp listener +``` + +**注意**:必须在两台机器上**互相启动** talker 和 listener,否则可能出现只能收不能发的单向通信问题。 + +**预期结果**: + +- 每台机器的 listener 应该能同时接收到本地和远程 talker 发送的消息 +- 如果只能看到本地消息,说明网络配置有问题 +- 如果两台机器都能互相收发消息,则组网配置正确 + +### 本地网络要求 + +**ROS2 通信**: + +- 同一局域网或 VPN +- 端口:默认 DDS 端口(7400-7500) +- 组播支持(或配置 unicast) + +**检查连通性**: + +```bash +# Ping测试 +ping + +# ROS2节点发现 +ros2 node list +ros2 daemon stop && ros2 daemon start +``` + +### 云端连接 + +**要求**: + +- HTTPS (443) +- WebSocket 支持 +- 稳定的互联网连接 + +**测试连接**: + +```bash +# 测试云端连接 +curl https://uni-lab.bohrium.com/api/v1/health + +# 测试WebSocket +# 启动Uni-Lab后查看日志 +``` + +--- + +## 示例:多房间部署 + +### 场景描述 + +- **房间 A**: 主控室,有 Web 界面 +- **房间 B**: 液体处理室 +- **房间 C**: 分析仪器室 + +### 房间 A - 主节点 + +```bash +# host.json +unilab --ak your_ak --sk your_sk -g host.json --port 8002 +``` + +### 房间 B - 从节点 1 + +```bash +# liquid_handler.json +unilab --ak your_ak --sk your_sk -g liquid_handler.json --is_slave --port 8003 +``` + +### 房间 C - 从节点 2 + +```bash +# analytical.json +unilab --ak your_ak --sk your_sk -g analytical.json --is_slave --port 8004 +``` + +--- + +## 故障处理 + +### 节点离线 + +**检测**: + +```bash +ros2 node list # 查看在线节点 +``` + +**处理**: + +1. 检查网络连接 +2. 重启节点 +3. 检查日志 + +### 从节点无法连接主节点 + +1. 检查网络: + + ```bash + ping + ``` + +2. 检查 ROS_DOMAIN_ID: + + ```bash + echo $ROS_DOMAIN_ID + ``` + +3. 使用`--slave_no_host`测试: + ```bash + unilab --ak your_ak --sk your_sk -g slave.json --is_slave --slave_no_host + ``` + +### 通信延迟 + +**排查**: + +```bash +# 网络延迟 +ping + +# ROS2话题延迟 +ros2 topic hz /device_status +ros2 topic bw /device_status +``` + +**优化**: + +- 减少发布频率 +- 使用 QoS 配置 +- 优化网络带宽 + +### 数据同步失败 + +**检查**: + +```bash +# 查看日志 +tail -f unilabos_data/logs/unilab.log | grep sync +``` + +**解决**: + +- 检查云端连接 +- 验证 AK/SK +- 手动触发同步 + +### 资源不可见 + +检查资源注册: + +```bash +ros2 service call /host_node/resource_list \ + unilabos_msgs/srv/ResourceList +``` + +--- + +## 监控和维护 + +### 节点状态监控 + +```bash +# 查看所有节点 +ros2 node list + +# 查看话题 +ros2 topic list +``` + +--- + +## 相关文档 + +- [最佳实践指南](../user_guide/best_practice.md) - 完整的实验室搭建流程 +- [安装指南](../user_guide/installation.md) - 环境安装步骤 +- [启动参数详解](../user_guide/launch.md) - 启动参数说明 +- [添加设备驱动](add_device.md) - 自定义设备开发 +- [工作站架构](workstation_architecture.md) - 复杂工作站搭建 + +--- + +## 参考资料 + +- [ROS2 网络配置](https://docs.ros.org/en/humble/Tutorials/Advanced/Networking.html) +- [DDS 配置](https://fast-dds.docs.eprosima.com/) +- Uni-Lab 云平台文档 + diff --git a/docs/index.md b/docs/index.md index a8bf8252..e795dbcf 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ -# Uni-Lab 项目文档 +# Uni-Lab-OS 项目文档 -欢迎来到项目文档的首页! +Uni-Lab-OS 是一个开源的实验室自动化操作系统,提供统一的设备接口、工作流管理和分布式部署能力。 ```{toctree} :maxdepth: 3 diff --git a/docs/intro.md b/docs/intro.md index 4c1cd4c7..8ef2a1ce 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -10,35 +10,51 @@ concepts/01-communication-instruction.md concepts/02-topology-and-chemputer-compile.md ``` -## **用户指南** +## 用户指南 -本指南将带你了解如何使用项目的功能。 +快速上手、系统配置与使用说明。 ```{toctree} :maxdepth: 2 +user_guide/best_practice.md user_guide/installation.md -user_guide/configuration.md user_guide/launch.md +user_guide/graph_files.md boot_examples/index.md ``` +## 进阶配置 + +高级配置和系统管理。 + +```{toctree} +:maxdepth: 2 + +advanced_usage/configuration.md +advanced_usage/working_directory.md +``` + ## 开发者指南 -```{toctree} +设备开发、系统扩展与架构说明。 +```{toctree} :maxdepth: 2 -developer_guide/device_driver -developer_guide/add_device -developer_guide/add_action -developer_guide/actions -developer_guide/workstation_architecture -developer_guide/add_protocol -developer_guide/add_batteryPLC -developer_guide/materials_tutorial -developer_guide/materials_construction_guide - +developer_guide/networking_overview.md +developer_guide/add_device.md +developer_guide/add_old_device.md +developer_guide/add_registry.md +developer_guide/add_yaml.md +developer_guide/add_action.md +developer_guide/actions.md +developer_guide/action_includes.md +developer_guide/add_protocol.md +developer_guide/examples/workstation_architecture.md +developer_guide/examples/materials_construction_guide.md +developer_guide/examples/materials_tutorial.md +developer_guide/examples/battery_plc_workstation.md ``` ## 接口文档 diff --git a/docs/user_guide/best_practice.md b/docs/user_guide/best_practice.md new file mode 100644 index 00000000..5b960e8e --- /dev/null +++ b/docs/user_guide/best_practice.md @@ -0,0 +1,1837 @@ +# Uni-Lab-OS 最佳实践指南 + +## 关于本指南 + +本指南将引导您从零开始完成 Uni-Lab-OS 实验室系统的完整搭建,从环境安装到高级设备开发。无论您是初次接触 Uni-Lab-OS 的用户,还是希望深入定制开发的开发者,都能在本指南中找到清晰的步骤和实用建议。 + +### 适用对象 + +- **实验室管理员**:负责实验室系统部署和维护 +- **实验操作人员**:日常使用系统进行实验操作 +- **设备开发者**:为实验室添加自定义设备和功能 +- **系统集成商**:集成多个实验室系统 + +### 完整流程概览 + +``` +环境准备 → 创建实验室账号 → 系统启动 → 上传注册表 + ↓ +在线创建设备图 → 测试系统运行 → 运行工作流 + ↓ +多节点部署(可选)→ 自定义设备开发 → 复杂工作站搭建 +``` + +--- + +## 第一部分:快速上手 + +### 1. 环境准备(主机 Host) + +#### 1.1 安装 Uni-Lab-OS + +详细的安装步骤请参考 [安装指南](installation.md)。 + +**关键步骤:** + +```bash +# 1. 安装 Mamba(如果尚未安装) +# 下载 Miniforge: https://github.com/conda-forge/miniforge/releases + +# 2. 创建 Conda 环境 +mamba create -n unilab python=3.11.11 + +# 3. 激活环境 +mamba activate unilab + +# 4. 安装 Uni-Lab-OS +mamba install uni-lab::unilabos -c robostack-staging -c conda-forge +``` + +#### 1.2 验证安装 + +```bash +# 检查 unilabos 是否安装成功 +python -c "import unilabos; print(unilabos.__version__)" + +# 验证 ROS 消息包 +python -c "from unilabos_msgs.msg import Resource; print('ROS msgs OK')" +``` + +如果两条命令都正常输出,说明安装成功。 + +--- + +### 2. 创建您的第一个实验室 + +#### 2.1 注册实验室账号 + +1. 访问 [https://uni-lab.bohrium.com](https://uni-lab.bohrium.com) +2. 注册账号并登录 +3. 创建新实验室 + +#### 2.2 获取 Access Key 和 Secret Key + +1. 在实验室管理界面,找到"密钥管理" +2. 创建新的 AK/SK 密钥对 +3. **妥善保管这些密钥**(类似于密码,不要泄露) + +![复制 AK/SK](image/copy_aksk.gif) + +**重要提示:** + +- AK (Access Key):实验室的唯一标识 +- SK (Secret Key):实验室的访问密码 +- 这两个密钥在后续启动命令中都需要使用 + +#### 2.3 首次启动配置 + +首次启动时,系统会自动引导您创建配置文件: + +```bash +# 首次启动 +conda activate unilab +unilab --ak your_ak --sk your_sk +``` + +系统会询问是否创建配置文件,输入 `Y` 确认。配置文件会自动生成在 `./unilabos_data/local_config.py`。 + +更多配置选项请参考 [配置指南](../advanced_usage/configuration.md)。 + +--- + +### 3. 启动系统 + +详细的启动参数说明请参考 [启动指南](launch.md)。 + +#### 3.1 基本启动命令 + +```bash +conda activate unilab +unilab --ak your_ak --sk your_sk -g path/to/graph.json +``` + +**关键参数说明:** + +- `--ak`:您的 Access Key(必需) +- `--sk`:您的 Secret Key(必需) +- `-g`:设备组态图文件路径(必需) + +#### 3.2 首次启动注意事项 + +**第一次启动时,如果没有组态图文件:** + +由于首次启动需要 `-g` 参数指定组态图,您可以: + +**方案 1:使用预先创建好的示例组态图(推荐)** + +Uni-Lab-OS 在安装时已经预置了大量真实的设备图文件示例,无需下载或创建,直接使用 `-g` 参数指定即可: + +```bash +# 使用简单的工作台示例(推荐新手) +unilab --ak your_ak --sk your_sk -g test/experiments/workshop.json + +# 使用 PRCXI 液体处理工作站示例 +unilab --ak your_ak --sk your_sk -g test/experiments/prcxi_9300.json + +# 使用格林纳德反应工作站示例(有机合成) +unilab --ak your_ak --sk your_sk -g test/experiments/Grignard_flow_batchreact_single_pumpvalve.json + +# 使用 Bioyond 配液站示例 +unilab --ak your_ak --sk your_sk -g test/experiments/dispensing_station_bioyond.json + +# 使用 HPLC 分析系统示例 +unilab --ak your_ak --sk your_sk -g test/experiments/HPLC.json + +# 使用空设备配置(最小化配置) +unilab --ak your_ak --sk your_sk -g test/experiments/empty_devices.json +``` + +**更多可用示例**:系统预置了 40+ 个组态图文件,涵盖液体处理、有机合成、分析检测等多个领域。完整列表请查看 `unilabos/test/experiments/` 目录。 + +**方案 2:创建一个空的组态图** + +如果您想从零开始配置,可以创建一个简单的主机节点配置: + +```bash +# 创建 example_empty.json +cat > example_empty.json << 'EOF' +{ + "nodes": [], + "links": [] +} +EOF + +# 使用该配置启动 +unilab --ak your_ak --sk your_sk -g example_empty.json +``` + +> **提示**:详细的组态图文件编写指南,请参考 [设备图文件说明](graph_files.md)。 + +**启动成功标志:** + +- 终端显示 `[Host Node] Host node initialized.` +- 自动打开浏览器,显示 Web 管理界面 +- 地址:`http://localhost:8002` + +#### 3.3 常用启动选项 + +```bash +# 禁用自动打开浏览器 +unilab --ak your_ak --sk your_sk -g graph.json --disable_browser + +# 使用不同端口 +unilab --ak your_ak --sk your_sk -g graph.json --port 8080 + +# 测试环境 +unilab --addr test --ak your_ak --sk your_sk -g graph.json + +# 跳过环境检查(加快启动) +unilab --ak your_ak --sk your_sk -g graph.json --skip_env_check +``` + +--- + +### 4. 上传注册表(一次性操作) + +#### 4.1 什么是注册表上传? + +注册表包含您的设备和物料的完整定义。上传到云端后,在线界面才能识别和使用这些设备。 + +#### 4.2 何时需要上传? + +**必须上传的情况:** + +- 首次启动实验室 +- 添加了新的设备类型 +- 修改了设备的注册表定义 + +#### 4.3 如何上传注册表 + +```bash +unilab --ak your_ak --sk your_sk -g graph.json --upload_registry +``` + +**性能影响说明:** + +- 上传注册表会增加启动时间(通常 5-15 秒) +- 上传时间取决于: + - 设备和物料的数量 + - 网络速度 +- 建议:开发调试时首次上传,后续本地测试可省略 + +**验证上传成功:** + +在 Web 界面的"仪器设备"或"物料耗材"模块中,应该能看到您的设备和物料列表。 + +--- + +### 5. 在线创建您的第一个设备图 + +#### 5.1 使用预设组态图(推荐新手) + +Uni-Lab-OS 在安装时已经包含了大量真实的设备图文件,位于 `unilabos/test/experiments/` 目录,涵盖: + +- 液体处理:PRCXI、Biomek 等自动化移液工作站 +- 有机合成:格林纳德反应、流动化学等工作站 +- 分析检测:HPLC、光谱仪等分析仪器 +- 生物实验:Bioyond 配液站、反应站等 +- 协议测试:各种实验协议的测试工作站 +- 虚拟设备:用于开发调试的 mock 设备 + +**常用示例组态图:** + +| 组态图文件 | 说明 | 适合场景 | +| ------------------------------------------------ | -------------------- | -------------------- | +| `workshop.json` | 综合工作台 | 新手入门推荐 | +| `empty_devices.json` | 空设备配置 | 最小化配置,快速启动 | +| `prcxi_9300.json` | PRCXI 液体处理工作站 | 液体处理自动化 | +| `Grignard_flow_batchreact_single_pumpvalve.json` | 格林纳德反应工作站 | 有机合成流动化学 | +| `dispensing_station_bioyond.json` | Bioyond 配液站 | 生物样品配液 | +| `reaction_station_bioyond.json` | Bioyond 反应站 | 生物化学反应 | +| `HPLC.json` | HPLC 分析系统 | 色谱分析 | +| `plr_test.json` | PyLabRobot 测试 | PyLabRobot 集成测试 | +| `mock_devices/mock_all.json` | 完整虚拟设备集 | 开发调试,离线测试 | + +**使用方法:** + +```bash +# 使用简单工作台(推荐新手第一次启动) +unilab --ak your_ak --sk your_sk -g test/experiments/workshop.json + +# 使用 PRCXI 液体处理工作站 +unilab --ak your_ak --sk your_sk -g test/experiments/prcxi_9300.json + +# 使用格林纳德反应工作站(有机合成) +unilab --ak your_ak --sk your_sk -g test/experiments/Grignard_flow_batchreact_single_pumpvalve.json + +# 使用虚拟设备(无需真实硬件,用于学习和测试) +unilab --ak your_ak --sk your_sk -g test/experiments/mock_devices/mock_all.json +``` + +**注意**:所有组态图文件都是真实项目中使用的配置,可以直接学习和参考。完整文件列表请查看 `unilabos/test/experiments/` 目录。 + +> 关于设备图文件的结构、字段定义、格式兼容性等完整指南,请参考 [设备图文件说明](graph_files.md)。 + +#### 5.2 访问 Web 界面 + +启动系统后,访问[https://uni-lab.bohrium.com](https://uni-lab.bohrium.com) + +#### 5.3 添加设备和物料 + +进入"仪器耗材"模块: + +**示例场景:** 创建一个简单的液体转移实验 + +1. **添加工作站(必需):** + + - 在"仪器设备"中找到 `work_station` + - 添加 `workstation` x1 + +2. **添加虚拟转移泵:** + + - 在"仪器设备"中找到 `virtual_device` + - 添加 `virtual_transfer_pump` x1 + +3. **添加容器:** + - 在"物料耗材"中找到 `container` + - 添加 `container` x2 + +![物料列表](image/material.png) + +#### 5.4 建立设备连接关系 + +将设备和物料拖拽到画布上,建立父子关系: + +1. 将两个 `container` 拖拽到 `workstation` 中 +2. 将 `virtual_transfer_pump` 拖拽到 `workstation` 中 +3. 在画布上连接它们(模拟真实的物理连接) + +![设备连接](image/links.png) + +**连接规则:** + +- 所有设备和物料都必须有父节点(除了顶层工作站) +- 连接关系反映真实的物理布局 +- 连接后才能在工作流中使用 + +#### 5.5 保存组态图 + +1. 点击"保存"按钮 +2. 系统会生成 JSON 格式的组态图 +3. 可以下载保存为本地文件,下次使用 `-g` 参数启动 + +--- + +### 6. 测试实验室运行状态 + +在运行实际工作流之前,建议先测试系统是否正常运行。 + +#### 6.1 使用 host_node 的 test_latency + +`test_latency` 是 host_node 提供的测试方法,用于: + +- 测试网络延迟 +- 校准时间误差 +- 验证系统响应 + +**通过 Web 界面测试:** + +1. 在 Web 界面找到"工作流"模块 +2. 新建空白工作流 +3. 右键画布空白处,找到 `laboratory` -> `host_node` 在动作列表中找到 `test_latency` +4. 设置"关联设备名称"为 `host_node` + +![选择 host_node](image/test_latency_select_device.png) + +5. 点击保存,然后运行工作流 + +![运行测试](image/test_latency_running.png) + +6. 在控制台查看执行结果,点击查看返回值 + +![查看测试结果](image/test_latency_result.png) + +**测试结果解读:** + +系统会进行 5 次 ping-pong 测试,返回 JSON 格式的结果,包含以下关键指标: + +- **avg_rtt_ms**:平均往返延迟(毫秒),正常应在几十到几百毫秒 +- **avg_time_diff_ms**:主机与云端的平均时间差(毫秒) +- **max_time_error_ms**:最大时间误差(毫秒) +- **raw_delay_ms**:原始延迟测量值(毫秒) +- **task_delay_ms**:任务处理延迟(毫秒) +- **test_count**:测试次数 +- **status**:测试状态(success 表示成功) + +**实际返回结果示例:** + +```json +{ + "error": "", + "return_value": { + "avg_rtt_ms": 49.64, + "avg_time_diff_ms": 3872.43, + "max_time_error_ms": 3885.34, + "raw_delay_ms": 3900.24, + "status": "success", + "task_delay_ms": 27.8, + "test_count": 5 + }, + "suc": true +} +``` + +**结果评估:** + +- `avg_rtt_ms < 100ms`:网络连接良好 +- `avg_rtt_ms 100-500ms`:网络可用,略有延迟 +- `avg_rtt_ms > 500ms`:网络延迟较高,建议检查网络配置 +- `status: "success"`:测试通过 + +--- + +### 7. 运行您的第一个工作流 + +现在系统已经正常运行,让我们通过一个完整的案例来创建并执行第一个工作流。 + +#### 7.1 工作流场景 + +我们将实现一个简单的液体转移实验: + +1. 在容器 1 中加入水 +2. 通过传输泵将容器 1 中的水转移到容器 2 + +#### 7.2 添加所需的设备和物料 + +在创建工作流之前,我们需要先在"仪器耗材"模块中添加必要的设备和物料。 + +**所需设备和物料清单:** + +- 仪器设备 `work_station` 中的 `workstation` 数量 x1 +- 仪器设备 `virtual_device` 中的 `virtual_transfer_pump` 数量 x1 +- 物料耗材 `container` 中的 `container` 数量 x2 + +**操作步骤:** + +1. 访问 Web 界面,进入"仪器耗材"模块 +2. 在"仪器设备"区域找到并添加上述设备 +3. 在"物料耗材"区域找到并添加容器 + +![物料列表](image/material.png) + +#### 7.3 建立设备和物料的关联关系 + +当我们添加设备时,仪器耗材模块的物料列表会实时更新。我们需要将设备和物料拖拽到 workstation 中并在画布上将它们连接起来,就像真实的设备操作一样。 + +**操作步骤:** + +1. 将两个 `container` 拖拽到 `workstation` 中 +2. 将 `virtual_transfer_pump` 拖拽到 `workstation` 中 +3. 在画布上连接它们(建立父子关系) + +![设备连接](image/links.png) + +**连接规则:** + +- 所有设备和物料都必须有父节点(除了顶层工作站) +- 连接关系反映真实的物理布局 +- 连接后才能在工作流中使用 + +#### 7.4 创建工作流 + +1. 进入"工作流"模块 +2. 点击"我创建的" +3. 点击"新建工作流" + +![新建工作流](image/new.png) + +#### 7.5 新增工作流节点 + +我们可以进入指定工作流,在空白处右键,添加以下节点: + +- 选择 **Laboratory → host_node** 中的 `creat_resource` +- 选择 **Laboratory → workstation** 中的 `PumpTransferProtocol` + +![创建工作流](image/creatworkfollow.gif) + +#### 7.6 配置节点参数 + +根据案例,工作流包含两个步骤: + +1. 使用 `creat_resource` 在容器中创建水 +2. 通过泵传输协议将水传输到另一个容器 + +**配置 creat_resource 节点:** + +点击 `creat_resource` 卡片上的编辑按钮,配置参数: + +``` +class_name: container +device_id: workstation +liquid_input_slot: 0 或 -1 均可 +liquid_type: water +liquid_volume: 50(根据需求填写,默认单位 ml,这里举例 50) +parent: workstation +res_id: container +关联设备名称(原 unilabos_device_id): host_node +``` + +配置完成后点击底部保存按钮。 + +**配置 PumpTransferProtocol 节点:** + +点击 `PumpTransferProtocol` 卡片上的编辑按钮,配置参数: + +``` +event: transfer_liquid +from_vessel: water +to_vessel: container1 +volume: 50(根据需求填写,默认单位 ml,这里举例 50) +关联设备名称(原 unilabos_device_id): workstation +``` + +配置完成后点击底部保存按钮。 + +#### 7.7 运行工作流 + +1. 连接两个节点卡片(creat_resource → PumpTransferProtocol) +2. 点击底部保存按钮 +3. 点击运行按钮执行工作流 + +![连接并运行](image/linksandrun.png) + +#### 7.8 运行监控 + +- 运行状态和消息实时显示在底部控制台 +- 如有报错,可点击查看详细信息 +- 查看日志文件:`unilabos_data/logs/unilab.log` + +#### 7.9 结果验证 + +工作流完成后,返回"仪器耗材"模块: + +1. 点击 `container1` 卡片查看详情 +2. 确认其中包含参数指定的水和容量(50ml 的水) + +至此,您已经成功运行了第一个工作流。 + +--- + +## 第二部分:进阶部署 + +### 8. 多节点部署(Slave 模式) + +详细的组网部署和主从模式配置请参考 [组网部署与主从模式配置](../developer_guide/networking_overview.md)。 + +#### 8.1 主从模式概述 + +**适用场景:** + +- 设备物理位置分散在不同房间 +- 需要独立的故障隔离域 +- 逐步扩展实验室规模 +- 分布式实验操作 + +**架构:** + +``` +主节点(Host) + ├── 本地设备A + ├── 本地设备B + └── ROS2 通信 ←→ 从节点(Slave) + ├── 远程设备C + └── 远程设备D +``` + +#### 8.2 准备工作 + +**主节点准备:** + +1. 确保主节点已正常启动 +2. 记录主节点的 IP 地址 +3. 确保网络互通(同一局域网或 VPN) + +**网络要求:** + +- 主从节点在同一局域网 +- 可以互相 ping 通 +- 确保 ROS2 通信端口畅通 + +**验证网络连通性:** + +在配置完成后,使用 ROS2 自带的 demo 节点来验证跨节点通信是否正常: + +**在主节点机器上**(激活 unilab 环境后): + +```bash +# 终端1:启动 talker +ros2 run demo_nodes_cpp talker + +# 终端2:启动 listener +ros2 run demo_nodes_cpp listener +``` + +**在从节点机器上**(激活 unilab 环境后): + +```bash +# 终端1:启动 talker +ros2 run demo_nodes_cpp talker + +# 终端2:启动 listener +ros2 run demo_nodes_cpp listener +``` + +**注意**:必须在两台机器上**互相启动** talker 和 listener,否则可能出现只能收不能发的单向通信问题。 + +**预期结果:** + +- 每台机器的 listener 应该能同时接收到本地和远程 talker 发送的消息 +- 如果只能看到本地消息,说明网络配置有问题 +- 如果两台机器都能互相收发消息,则组网配置正确 + +**如果验证失败,尝试关闭防火墙:** + +为了确保 ROS2 DDS 通信正常,建议直接关闭防火墙,而不是配置特定端口。ROS2 使用动态端口范围,配置特定端口可能导致通信问题。 + +**Linux:** + +```bash +# 关闭防火墙 +sudo ufw disable + +# 或者临时停止防火墙 +sudo systemctl stop ufw +``` + +**Windows:** + +```powershell +# 在 Windows 安全中心关闭防火墙 +# 控制面板 -> 系统和安全 -> Windows Defender 防火墙 -> 启用或关闭 Windows Defender 防火墙 +``` + +#### 8.3 启动主节点 + +```bash +# 在主机(Host)上启动 +conda activate unilab +unilab --ak your_ak --sk your_sk -g host.json --upload_registry +``` + +**主节点职责:** + +- 与云端通信 +- 管理全局资源 +- 协调所有节点 + +#### 8.4 启动从节点 + +在另一台机器上: + +```bash +# 在从机(Slave)上启动 +conda activate unilab +unilab --ak your_ak --sk your_sk -g slave.json --is_slave +``` + +**从节点职责:** + +- 管理本地设备 +- 向主节点注册 +- 执行分配的任务 +- 不直接与云端通信 + +**重要:** 从节点使用相同的 AK/SK,因为它们属于同一个实验室。 + +#### 8.5 判断连接成功 + +**方法 1:检查 ROS2 节点列表** + +在任一节点上运行: + +```bash +ros2 node list +``` + +应该看到来自两个节点的设备: + +``` +/devices/host_node +/devices/workstation +/devices/liquid_handler_1 # 从节点的设备 +``` + +**方法 2:查看主节点设备列表** + +在主节点的 Web 界面: + +1. 进入"仪器耗材"模块 +2. 查看设备列表 +3. 从节点的设备应显示为"在线"状态 +4. 设备卡片上会显示来源机器名称 + +**方法 3:查看日志** + +主节点日志会显示: + +``` +[Host Node] Node info update request received +[Host Node] Slave node registered: liquid_handler_1 from Machine_B +``` + +从节点日志会显示: + +``` +Slave node info updated. +Resource tree synchronized with host. +``` + +#### 8.6 注册机制说明 + +从节点启动时会自动向主节点注册: + +**注册流程(代码逻辑):** + +1. **从节点启动**(`base_device_node.py` 的 `register_device` 方法): + + ```python + # 检测到非 Host 模式 + if not BasicConfig.is_host_mode: + # 创建服务客户端 + sclient = self.create_client(SerialCommand, "/node_info_update") + # 发送注册信息 + self.send_slave_node_info(sclient) + ``` + +2. **发送注册信息**(`main_slave_run.py`): + + ```python + request.command = json.dumps({ + "machine_name": BasicConfig.machine_name, + "type": "slave", + "devices_config": devices_config.dump(), + "registry_config": registry_config, + }) + ``` + +3. **主节点接收**(`host_node.py` 的 `_node_info_update_callback` 方法): + ```python + def _node_info_update_callback(self, request, response): + info = json.loads(request.command) + machine_name = info["machine_name"] + edge_device_id = info["edge_device_id"] + # 记录设备来源机器 + self.device_machine_names[edge_device_id] = machine_name + ``` + +**关键点:** + +- 注册是自动的,无需手动配置 +- 主节点会记录每个设备来自哪台机器 +- 从节点需要等待主节点的服务可用 + +#### 8.7 常见问题 + +**问题 1:从节点启动卡住** + +``` +Waiting for host service... +``` + +**解决方案:** + +- 检查主节点是否已启动 +- 验证网络连通性 +- 使用 `--slave_no_host` 参数跳过等待(仅用于测试) + +**问题 2:节点看不到彼此** + +**解决方案:** + +- 确保在同一网络 +- 关闭防火墙 +- 设置相同的 `ROS_DOMAIN_ID`(可选) + +**问题 3:注册失败** + +**解决方案:** + +- 检查 AK/SK 是否正确 +- 查看主节点日志 +- 重启从节点 + +--- + +## 第三部分:自定义开发 + +### 9. 创建您的第一个自定义设备 + +详细的设备驱动编写指南请参考 [添加设备驱动](../developer_guide/add_device.md)。 + +#### 9.1 为什么需要自定义设备? + +Uni-Lab-OS 内置了常见设备,但您的实验室可能有特殊设备需要集成: + +- 自研仪器 +- 定制化改造的商业设备 +- 特殊的实验流程 +- 第三方设备集成 + +#### 9.2 创建 Python 包 + +为了方便开发和管理,建议为您的实验室创建独立的 Python 包。 + +**包结构:** + +``` +my_lab_devices/ +├── setup.py +├── README.md +├── my_lab_devices/ +│ ├── __init__.py +│ ├── devices/ +│ │ ├── __init__.py +│ │ ├── my_pump.py +│ │ └── my_sensor.py +│ └── registry/ +│ ├── devices/ +│ │ ├── my_pump.yaml +│ │ └── my_sensor.yaml +│ └── resources/ +│ └── my_container.yaml +``` + +**创建步骤:** + +```bash +# 1. 创建包目录 +mkdir -p my_lab_devices/my_lab_devices/devices +mkdir -p my_lab_devices/my_lab_devices/registry/devices +mkdir -p my_lab_devices/my_lab_devices/registry/resources + +# 2. 创建 __init__.py +touch my_lab_devices/my_lab_devices/__init__.py +touch my_lab_devices/my_lab_devices/devices/__init__.py +``` + +#### 9.3 创建 setup.py + +```python +# my_lab_devices/setup.py + +from setuptools import setup, find_packages + +setup( + name="my_lab_devices", + version="0.1.0", + description="My Laboratory Custom Devices", + author="Your Name", + author_email="your.email@example.com", + packages=find_packages(), + install_requires=[ + "unilabos", # 依赖 Uni-Lab-OS + # 添加其他依赖 + # "pyserial", + # "requests", + ], + python_requires=">=3.11", + # 包含注册表文件 + package_data={ + "my_lab_devices": [ + "registry/devices/*.yaml", + "registry/resources/*.yaml", + ], + }, +) +``` + +#### 9.4 开发安装 + +使用 `-e` 参数进行可编辑安装,这样代码修改后立即生效: + +```bash +cd my_lab_devices +pip install -e . -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple +``` + +**优势:** + +- 代码修改实时生效,无需重新安装 +- 方便调试和测试 +- 支持版本控制(git) + +#### 9.5 编写设备驱动 + +创建设备驱动文件: + +```python +# my_lab_devices/my_lab_devices/devices/my_pump.py + +from typing import Dict, Any +from unilabos.registry.placeholder_type import ResourceSlot + +class MyPump: + """自定义注射泵驱动 + + 支持功能: + - 注射液体 + - 抽取液体 + - 速率控制 + """ + + def __init__(self, config: Dict[str, Any]): + """初始化设备 + + Args: + config: 配置字典,包含端口、波特率等 + """ + self.port = config.get('port', 'COM1') + self.baudrate = config.get('baudrate', 9600) + self._status = "idle" + self._current_volume = 0.0 + + # 初始化串口连接 + # self.serial = serial.Serial(self.port, self.baudrate) + print(f"MyPump initialized on {self.port}") + + @property + def status(self) -> str: + """设备状态""" + return self._status + + @property + def current_volume(self) -> float: + """当前注射器内液体体积(ml)""" + return self._current_volume + + def infuse( + self, + target: ResourceSlot, + volume: float, + rate: float = 1.0 + ) -> Dict[str, Any]: + """注射液体到目标容器 + + Args: + target: 目标容器(前端显示资源选择器) + volume: 注射体积(ml) + rate: 注射速率(ml/min) + + Returns: + 执行结果 + """ + self._status = "infusing" + + print(f"Infusing {volume}ml to {target.name} at {rate}ml/min") + + # 发送命令到硬件 + # self.serial.write(f"INF {volume} {rate}\r\n".encode()) + + # 模拟执行 + import time + time.sleep(volume / rate * 60) # 模拟注射时间 + + self._current_volume -= volume + self._status = "idle" + + return { + "success": True, + "volume_infused": volume, + "target": target.id, + "message": f"Successfully infused {volume}ml" + } + + def withdraw( + self, + source: ResourceSlot, + volume: float, + rate: float = 1.0 + ) -> Dict[str, Any]: + """从源容器抽取液体 + + Args: + source: 源容器(前端显示资源选择器) + volume: 抽取体积(ml) + rate: 抽取速率(ml/min) + + Returns: + 执行结果 + """ + self._status = "withdrawing" + + print(f"Withdrawing {volume}ml from {source.name} at {rate}ml/min") + + # 发送命令到硬件 + # self.serial.write(f"WDR {volume} {rate}\r\n".encode()) + + # 模拟执行 + import time + time.sleep(volume / rate * 60) + + self._current_volume += volume + self._status = "idle" + + return { + "success": True, + "volume_withdrawn": volume, + "source": source.id, + "message": f"Successfully withdrawn {volume}ml" + } + + def set_rate(self, rate: float) -> Dict[str, Any]: + """设置流速 + + Args: + rate: 流速(ml/min) + """ + print(f"Setting rate to {rate}ml/min") + # self.serial.write(f"RAT {rate}\r\n".encode()) + + return { + "success": True, + "rate": rate, + "message": f"Rate set to {rate}ml/min" + } +``` + +**关键点:** + +- **类型注解**:使用 `ResourceSlot` 等特殊类型 +- **@property**:状态属性会自动广播 +- **返回 Dict**:所有动作方法返回字典类型 +- **文档字符串**:详细说明参数和功能 + +#### 9.6 测试设备驱动 + +创建简单的测试脚本: + +```python +# test_my_pump.py + +from my_lab_devices.devices.my_pump import MyPump + +# 创建设备实例 +config = { + "port": "COM1", + "baudrate": 9600 +} +pump = MyPump(config) + +# 测试状态属性 +print(f"Status: {pump.status}") +print(f"Current volume: {pump.current_volume}ml") + +# 模拟注射(不使用 ResourceSlot) +class MockResource: + id = "test_container" + name = "测试容器" + +result = pump.infuse(MockResource(), volume=5.0, rate=2.0) +print(f"Result: {result}") +``` + +运行测试: + +```bash +python test_my_pump.py +``` + +--- + +### 10. 生成和完善设备注册表 + +注册表(Registry)是 Uni-Lab-OS 的核心配置文件,定义了设备的动作、状态、参数等信息。系统提供了自动生成功能,帮助您快速完成基础配置。 + +> 完整的注册表编写、字段说明、高级配置等内容,请参考 [添加设备注册表](../developer_guide/add_registry.md)。 + +#### 10.1 注册表目录结构 + +Uni-Lab-OS 使用三类注册表: + +``` +registry/ +├── devices/ # 设备注册表(仪器设备,如泵、加热器、机械臂等) +├── device_comms/ # 通信驱动注册表(如 Modbus、OPC UA) +└── resources/ # 物料注册表(耗材、容器,如孔板、试管、试剂等) +``` + +#### 10.2 生成注册表(两种方式) + +**方式 1:使用 Web 界面注册表编辑器(推荐)** + +1. 访问 Web 界面,进入"注册表编辑器" +2. 上传您的 Python 设备驱动文件 +3. 点击"分析文件",系统自动生成注册表 +4. 填写描述、图标等元数据 +5. 下载生成的 YAML 文件到您的注册表目录 + +**方式 2:使用 `--complete_registry` 参数(命令行)** + +```bash +unilab --ak your_ak --sk your_sk -g graph.json \ + --registry_path ./my_lab_devices/registry \ + --complete_registry +``` + +系统会自动: + +- 扫描 Python 设备类 +- 分析方法签名和类型注解 +- 识别 `ResourceSlot`、`DeviceSlot` 等特殊类型 +- 生成完整的 YAML 注册表文件 + +#### 10.3 生成的注册表示例 + +自动生成的注册表大致如下(已简化): + +```yaml +my_pump: + class: + module: my_lab_devices.devices.my_pump:MyPump + type: python + + status_types: # 自动提取的状态 + status: str + current_volume: float + + action_value_mappings: # 自动生成的动作 + infuse: + type: UniLabJsonCommand + goal: + target: target + volume: volume + placeholder_keys: + target: unilabos_resources # 自动识别 ResourceSlot + result: + success: success + + description: '自定义注射泵驱动' + version: '1.0.0' +``` + +系统会自动识别特殊类型并生成前端选择器: + +| Python 类型 | 前端效果 | +| -------------------- | -------------- | +| `ResourceSlot` | 资源单选下拉框 | +| `List[ResourceSlot]` | 资源多选下拉框 | +| `DeviceSlot` | 设备单选下拉框 | +| `List[DeviceSlot]` | 设备多选下拉框 | + +#### 10.4 使用自定义注册表 + +启动时指定注册表路径: + +```bash +unilab --ak your_ak --sk your_sk -g graph.json \ + --registry_path ./my_lab_devices/registry \ + --upload_registry +``` + +**支持多个注册表路径**(按顺序查找): + +```bash +unilab --ak your_ak --sk your_sk -g graph.json \ + --registry_path ./my_lab_devices/registry \ + --registry_path ./another_lab/registry +``` + +#### 10.5 验证注册表 + +**验证方法:** + +1. **查看启动日志**:确认设备被正确加载 +2. **访问 Web 界面**:"仪器设备"模块中应能看到您的自定义设备 +3. **测试动作调用**:在工作流中测试设备动作是否正常 + +#### 10.6 手动完善注册表(可选) + +自动生成的注册表已经可用,但您可以手动添加以下内容来提升用户体验: + +- **description**:设备详细描述 +- **icon**:设备图标(支持 Base64 或 URL) +- **category**:设备分类标签(用于前端分组显示) +- **handles**:设备连接点定义(用于可视化连接) + +**示例:** + +```yaml +my_pump: + description: '高精度注射泵,支持 0.001-100 ml/min 流速范围' + icon: 'pump_icon.webp' + category: + - pump + - liquid_handling + # ... 其他配置 +``` + +> 关于注册表的高级配置、字段详解、最佳实践等,请参考 [添加设备注册表](../developer_guide/add_registry.md)。 + +--- + +### 11. 创建复杂工作站 + +详细的工作站架构请参考 [工作站架构](../developer_guide/examples/workstation_architecture.md)。 + +#### 11.1 什么是复杂工作站? + +复杂工作站是多个设备和物料的集合,协同完成特定实验流程。 + +**示例场景:** + +- **液体处理工作站**:移液器 + 孔板 + 试剂槽 + 枪头架 +- **有机合成工作站**:反应釜 + 注射泵 + 加热搅拌器 + 冷凝器 +- **分析工作站**:色谱仪 + 进样器 + 流动相泵 + +#### 11.2 设计工作站 + +**设计原则:** + +1. **模块化**:每个设备独立,可单独控制 +2. **层次化**:使用父子关系组织设备 +3. **标准化**:使用统一的接口和命名 + +**工作站结构:** + +``` +Workstation(工作站根节点) +├── Deck(甲板/平台) +│ ├── PlateCarrier_1(板位) +│ │ └── Plate_96(96孔板) +│ ├── PlateCarrier_2 +│ │ └── Plate_384(384孔板) +│ └── TipRack(枪头架) +├── Pipette_8(8通道移液器) +└── WashStation(清洗站) +``` + +#### 11.3 组合多个设备 + +在组态图中: + +1. 创建工作站根节点(通常是 `workstation`) +2. 添加子设备 +3. 建立连接关系 +4. 配置每个设备的参数 + +**JSON 组态示例:** + +```json +{ + "nodes": [ + { + "id": "liquid_handler_ws", + "name": "液体处理工作站", + "type": "device", + "class": "workstation", + "config": {} + }, + { + "id": "pipette_8ch", + "name": "8通道移液器", + "type": "device", + "class": "pipette_8_channel", + "config": { + "volume_range": [0.5, 300] + } + }, + { + "id": "plate_carrier_1", + "name": "板位1", + "type": "resource", + "class": "plate_carrier", + "config": {} + } + ], + "links": [ + { + "source": "liquid_handler_ws", + "target": "pipette_8ch", + "type": "contains" + }, + { + "source": "liquid_handler_ws", + "target": "plate_carrier_1", + "type": "contains" + } + ] +} +``` + +#### 11.4 设计工作流程 + +**复杂工作站的工作流特点:** + +- 多步骤协同 +- 设备间依赖 +- 状态管理 +- 错误恢复 + +**示例:96 孔板液体分配流程** + +``` +1. 准备阶段 + ├── 检查枪头架 + ├── 检查孔板位置 + └── 检查试剂体积 + +2. 执行阶段 + ├── 装载枪头 + ├── 从试剂槽吸取 + ├── 移动到目标孔板 + ├── 分配液体 + └── 退出枪头 + +3. 清理阶段 + ├── 清洗移液器 + └── 复位到初始位置 +``` + +**在 Uni-Lab 中实现:** + +1. 创建工作流 +2. 添加各步骤节点 +3. 配置每个节点的设备和参数 +4. 连接节点形成流程 +5. 添加错误处理分支 + +#### 11.5 通信共享机制 + +在复杂工作站中,多个设备可能需要共享同一个通信端口(如串口、PLC),但大多数通信端口只能被一个实例占用。通信共享机制解决了这个问题,允许灵活控制连接到同一通信端口的多个设备。 + +##### 11.5.1 应用场景 + +**典型场景:** + +- **多泵阀共享 PLC 串口**:所有泵阀通过同一个 PLC 控制,泵阀数量可灵活增减 +- **多传感器共享 Modbus**:多个传感器通过同一个 Modbus 设备读取数据 +- **多设备共享 TCP/IP**:多台设备共享一个 TCP/IP 通信接口 + +**解决思路:** + +创建一个**通信设备作为代理**,所有需要使用该端口的设备通过代理进行通信,而不是直接访问端口。 + +##### 11.5.2 配置步骤 + +**步骤 1:定义 workstation 并指定 protocol_type** + +在组态图中,workstation 的 `config` 需要添加 `protocol_type`(协议类型列表,可为空): + +```json +{ + "id": "simple_station", + "name": "简单工作站", + "type": "device", + "class": "workstation", + "parent": null, + "config": { + "protocol_type": ["PumpTransferProtocol", "CleanProtocol"] + }, + "children": ["serial_pump", "pump_1", "pump_2", "pump_3"] +} +``` + +> **说明**:`children` 列表中,**通信设备必须排在最前面**(如 `"serial_pump"`),确保它先于其他设备初始化。 + +**步骤 2:创建通信设备(作为代理)** + +在 workstation 的子设备中,**首先定义通信设备**(必须在其他设备之前初始化,因此放到启动 json 靠前的位置): + +```json +{ + "id": "serial_pump", + "type": "device", + "class": "serial", + "parent": "simple_station", + "config": { + "port": "COM7", + "baudrate": 9600 + } +} +``` + +**步骤 3:配置使用该通信的设备** + +其他设备的 `config` 中指向通信设备(字段名根据设备注册表定义,如 `port` 或 `io_device_port`,他们在驱动中): + +```json +{ + "id": "pump_1", + "type": "device", + "class": "syringe_pump_with_valve.runze.SY03B-T06", + "parent": "simple_station", + "config": { + "port": "serial_pump", // 直接使用通信设备的设备名,最终能够通过__init__实现self.hardware_interface变量设定为serial_pump的字符串 + "address": "1", + "max_volume": 25.0 + } +} +``` + +> 配置字段的值直接是**通信设备的设备名**(如 `"serial_pump"`),不是完整路径。系统会自动进行变量替换。 + +**步骤 4:建立通信连接关系** + +在组态图的 `links` 中,建立 `communication` 类型的连接: + +```json +{ + "links": [ + { + "source": "pump_1", + "target": "serial_pump", + "type": "communication", + "port": { + "serial_pump": "1" // 通信端口号或地址 + } + }, + { + "source": "pump_2", + "target": "serial_pump", + "type": "communication", + "port": { + "serial_pump": "2" + } + } + ] +} +``` + +> **说明**:`port` 字段中的值是通信设备上的端口号或地址,具体含义取决于通信协议。 + +##### 11.5.3 注册表配置 + +**通信设备的注册表**(例如`device_comms/modbus_ioboard.yaml`): + +```yaml +io_snrd: + class: + module: unilabos.device_comms.SRND_16_IO:SRND_16_IO + type: python + + # hardware_interface.name 对象是实际的通信实例(如 ModbusClient()) + # 通过 Python 的 __init__ 方法初始化 + hardware_interface: + name: modbus_client + read: read_io_coil + write: write_io_coil + + description: 'IO Board with 16 IOs via Modbus' +``` + +**使用通信的设备注册表**(`devices/pump_and_valve.yaml`): + +```yaml +syringe_pump_with_valve.runze.SY03B-T06: + class: + module: unilabos.devices.pump_and_valve.runze_backbone:RunzeSyringePump + type: python + + # hardware_interface.name 初始化时是通信设备的设备名(字符串) + # 通过启动 JSON 的 config 传入(如 "port": "serial_pump") + # 系统会自动将字符串替换为实际的通信实例 + hardware_interface: + name: hardware_interface + read: send_command + write: send_command + + action_value_mappings: + # 设备的动作定义 + +solenoid_valve: + class: + module: unilabos.devices.pump_and_valve.solenoid_valve:SolenoidValve + type: python + + # 使用 io_device_port 字段接收通信设备名 + hardware_interface: + name: io_device_port # 例如当前电磁阀修改了name,从默认的hardware_interface改成了io_device_port,那么启动json中就应该对__init__中的io_device_port进行赋值 + read: read_io_coil + write: write_io_coil +``` + +**关键机制:** + +| 设备类型 | hardware_interface.name | 初始化方式 | 运行时对象 | +| ------------------ | ----------------------- | --------------------------------------------- | ----------------------------------- | +| **通信设备** | `modbus_client` 等 | Python `__init__` 中创建实例 | `ModbusClient()`、`serial.Serial()` | +| **使用通信的设备** | `hardware_interface` 等 | config 中传入设备名字符串(如 `"io_device"`) | **系统自动替换**为实际通信实例 | + +**自动替换流程:** + +1. 设备初始化时,`self.hardware_interface = "io_device"`(字符串) +2. workstation 检测到 `config` 中有通信设备名 +3. 系统自动将 `self.hardware_interface` 替换为 `io_device` 的实际通信实例 +4. 设备可以直接调用 `self.hardware_interface.read_io_coil()` 等方法 + +**完整示例:Modbus IO 板控制多个电磁阀** + +```json +{ + "nodes": [ + { + "id": "WorkStationTestMinimumSystem", + "name": "工作站节点", + "children": [ + "io_device", + "Product1_Solenoid_Valve", + "Water_Solenoid_Valve" + ], + "parent": null, + "type": "device", + "class": "workstation", + "config": { + "protocol_type": [] + } + }, + { + "id": "io_device", + "class": "io_snrd", // 通信设备类型 + "name": "io_device", + "config": { + "address": "192.168.1.7:23", // Modbus TCP 地址 + "slave_id": "1" + }, + "parent": "WorkStationTestMinimumSystem", + "type": "device" + }, + { + "id": "Product1_Solenoid_Valve", + "class": "solenoid_valve", + "name": "Product1_Solenoid_Valve", + "config": { + "io_device_port": "io_device" // 通信设备的设备名(字符串) + }, + "parent": "WorkStationTestMinimumSystem", + "type": "device" + }, + { + "id": "Water_Solenoid_Valve", + "class": "solenoid_valve", + "name": "Water_Solenoid_Valve", + "config": { + "io_device_port": "io_device" // 同样使用这个通信设备 + }, + "parent": "WorkStationTestMinimumSystem", + "type": "device" + } + ], + "links": [] +} +``` + +**工作原理:** + +1. `io_device` 初始化时创建 `ModbusClient("192.168.1.7:23")` +2. 两个电磁阀的 `self.io_device_port` 初始化为字符串 `"io_device"` +3. workstation 自动将 `self.io_device_port` 替换为实际的 `ModbusClient` 实例 +4. 电磁阀可以通过 `self.io_device_port.read_io_coil(15)` 或 `write_io_coil(14)` 操作 + +##### 11.5.4 验证通信共享 + +**启动成功标志:** + +系统启动时,在日志中查看以下提示信息: + +``` +通信代理:为子设备 pump_1 配置通信代理 serial_pump +通信代理:为子设备 pump_2 配置通信代理 serial_pump +通信代理:为子设备 pump_3 配置通信代理 serial_pump +``` + +看到此提示说明通信共享配置成功。 + +**测试步骤:** + +1. 启动系统,查看日志确认通信代理配置成功 +2. 在 Web 界面中,分别控制 `pump_1`、`pump_2`、`pump_3` +3. 确认所有泵都能正常响应(通过同一个串口) +4. 查看通信设备的状态,确认消息正常传递 + +--- + +### 12. 撰写物料定义 + +详细的物料编写指南请参考: + +- [物料构建指南](../developer_guide/examples/materials_construction_guide.md) +- [物料教程](../developer_guide/examples/materials_tutorial.md) + +#### 12.1 物料(Resource)概述 + +物料是实验中使用的消耗品和容器: + +- **容器**:孔板、试管、烧杯、反应瓶 +- **耗材**:枪头、移液管、过滤器 +- **试剂**:溶剂、试剂、样品 + +#### 12.2 创建自定义物料类型 + +**场景:** 创建实验室特殊规格的孔板 + +```python +# my_lab_devices/my_lab_devices/resources/custom_plate.py + +from pylabrobot.resources import Plate, Well +from typing import List + +class CustomPlate48(Plate): + """自定义 48 孔板 + + 规格: + - 6行 x 8列 + - 孔体积:2ml + - 孔间距:18mm + """ + + def __init__(self, name: str): + super().__init__( + name=name, + size_x=127.76, # mm + size_y=85.48, # mm + size_z=14.35, # mm + model="custom_48_wellplate_2000ul" + ) + + # 定义孔位 + self._create_wells() + + def _create_wells(self): + """创建 48 个孔位""" + rows = "ABCDEF" + cols = range(1, 9) + + well_size_x = 16.0 # mm + well_size_y = 16.0 + well_depth = 12.0 + spacing_x = 18.0 + spacing_y = 18.0 + + for row_idx, row in enumerate(rows): + for col in cols: + well_name = f"{row}{col}" + x = (col - 1) * spacing_x + 10 # 10mm 边距 + y = row_idx * spacing_y + 10 + + well = Well( + name=well_name, + size_x=well_size_x, + size_y=well_size_y, + size_z=well_depth, + max_volume=2000, # μL + ) + well.location = (x, y, 0) + self.children.append(well) +``` + +#### 12.3 物料注册表 + +创建物料注册表: + +```yaml +# my_lab_devices/my_lab_devices/registry/resources/custom_plate.yaml + +custom_48_wellplate_2000ul: + class: + module: my_lab_devices.resources.custom_plate:CustomPlate48 + type: python + + description: '自定义 48 孔板,2ml 孔体积' + version: '1.0.0' + category: + - plate + - container + + # 物料属性 + properties: + rows: 6 + columns: 8 + well_count: 48 + well_volume: 2000 # μL + well_shape: 'round' + material: 'polystyrene' + + # 尺寸信息 + dimensions: + size_x: 127.76 + size_y: 85.48 + size_z: 14.35 + unit: 'mm' + + # 兼容性 + compatible_with: + - 'plate_carrier' + - 'thermal_cycler' + + icon: '' +``` + +#### 12.4 物料属性定义 + +**常见属性:** + +```yaml +properties: + # 容量相关 + max_volume: 2000 # μL + min_volume: 10 # μL + dead_volume: 5 # μL(无法吸取的残留体积) + + # 几何形状 + shape: 'round' # round, square, v_bottom + diameter: 16.0 # mm + depth: 12.0 # mm + + # 材质 + material: 'polystyrene' # 聚苯乙烯 + transparency: true # 透明 + sterile: false # 无菌 + + # 温度范围 + min_temperature: -80 # °C + max_temperature: 121 # °C + + # 化学兼容性 + chemical_compatibility: + - 'water' + - 'ethanol' + - 'dmso' + + # 条形码 + barcode_support: true + barcode_type: '1D' +``` + +#### 12.5 在系统中使用自定义物料 + +1. **注册物料**: + +```bash +unilab --ak your_ak --sk your_sk -g graph.json \ + --registry_path ./my_lab_devices/my_lab_devices/registry \ + --upload_registry +``` + +2. **在组态图中添加**: + +在 Web 界面的"物料耗材"模块中,找到 `custom_48_wellplate_2000ul`,添加到实验室。 + +3. **在工作流中使用**: + +工作流节点的参数中,涉及容器选择的地方会显示您的自定义物料。 + +--- + +## 第四部分:最佳实践总结 + +### 13. 开发流程建议 + +``` +需求分析 → 环境搭建 → 原型验证 → 迭代开发 → 测试部署 → 生产运行 +``` + +**详细步骤:** + +1. **需求分析**: + + - 明确实验流程 + - 列出所需设备和物料 + - 设计工作流程图 + +2. **环境搭建**: + + - 安装 Uni-Lab-OS + - 创建实验室账号 + - 准备开发工具(IDE、Git) + +3. **原型验证**: + + - 使用虚拟设备测试流程 + - 验证工作流逻辑 + - 调整参数 + +4. **迭代开发**: + + - 实现自定义设备驱动(同时撰写单点函数测试) + - 编写注册表 + - 单元测试 + - 集成测试 + +5. **测试部署**: + + - 连接真实硬件 + - 空跑测试 + - 小规模试验 + +6. **生产运行**: + - 全量部署 + - 监控运行状态 + - 持续优化 + +--- + +### 14. 进一步学习资源 + +#### 14.1 官方文档 + +- **安装指南**:[installation.md](installation.md) +- **启动指南**:[launch.md](launch.md) +- **配置指南**:[../advanced_usage/configuration.md](../advanced_usage/configuration.md) + +#### 14.2 开发者文档 + +- **组网部署与主从模式**:[../developer_guide/networking_overview.md](../developer_guide/networking_overview.md) +- **添加设备驱动**:[../developer_guide/add_device.md](../developer_guide/add_device.md) +- **老设备驱动开发**:[../developer_guide/add_old_device.md](../developer_guide/add_old_device.md) +- **添加动作指令**:[../developer_guide/add_action.md](../developer_guide/add_action.md) +- **YAML 注册表编写**:[../developer_guide/add_yaml.md](../developer_guide/add_yaml.md) +- **添加设备注册表**:[../developer_guide/add_registry.md](../developer_guide/add_registry.md) +- **工作站架构**:[../developer_guide/examples/workstation_architecture.md](../developer_guide/examples/workstation_architecture.md) +- **物料构建指南**:[../developer_guide/examples/materials_construction_guide.md](../developer_guide/examples/materials_construction_guide.md) + +#### 14.3 进阶主题 + +- **工作目录详解**:[../advanced_usage/working_directory.md](../advanced_usage/working_directory.md) + + +#### 14.4 外部资源 + +- **ROS 2 文档**:[https://docs.ros.org/en/humble/](https://docs.ros.org/en/humble/) +- **PyLabRobot**:[https://github.com/PyLabRobot/pylabrobot](https://github.com/PyLabRobot/pylabrobot) +- **Python 类型注解**:[https://docs.python.org/3/library/typing.html](https://docs.python.org/3/library/typing.html) +- **YAML 语法**:[https://yaml.org/](https://yaml.org/) + +#### 14.5 社区支持 + +- **GitHub Issues**:[https://github.com/dptech-corp/Uni-Lab-OS/issues](https://github.com/dptech-corp/Uni-Lab-OS/issues) +- **官方网站**:[https://uni-lab.bohrium.com](https://uni-lab.bohrium.com) + +--- + +## 结语 + +通过本指南,您应该已经掌握了: + +- 安装和配置 Uni-Lab-OS 环境 +- 创建和管理实验室 +- 启动系统并运行工作流 +- 部署多节点分布式系统 +- 开发自定义设备驱动 +- 创建和注册物料定义 +- 构建复杂工作站 + +**下一步建议:** + +1. 从简单的工作流开始实践,逐步尝试更复杂的场景 +2. 在 GitHub 上提问和分享经验 +3. 关注文档更新和新功能发布 +4. 为 Uni-Lab-OS 社区贡献您的设备驱动和最佳实践 + +--- + +_本指南最后更新:2025-11_ +_Uni-Lab-OS 版本:最新稳定版_ diff --git a/docs/user_guide/configuration.md b/docs/user_guide/configuration.md deleted file mode 100644 index 036cb9c7..00000000 --- a/docs/user_guide/configuration.md +++ /dev/null @@ -1,442 +0,0 @@ -# Uni-Lab 配置指南 - -Uni-Lab 支持通过 Python 配置文件进行灵活的系统配置。本指南将帮助您理解配置选项并设置您的 Uni-Lab 环境。 - -## 配置文件格式 - -Uni-Lab 支持 Python 格式的配置文件,它比 YAML 或 JSON 提供更多的灵活性,包括支持注释、条件逻辑和复杂数据结构。 - -### 默认配置示例 - -首次使用时,系统会自动创建一个基础配置文件 `local_config.py`: - -```python -# unilabos的配置文件 - -class BasicConfig: - ak = "" # 实验室网页给您提供的ak代码,您可以在配置文件中指定,也可以通过运行unilabos时以 --ak 传入,优先按照传入参数解析 - sk = "" # 实验室网页给您提供的sk代码,您可以在配置文件中指定,也可以通过运行unilabos时以 --sk 传入,优先按照传入参数解析 - - -# WebSocket配置,一般无需调整 -class WSConfig: - reconnect_interval = 5 # 重连间隔(秒) - max_reconnect_attempts = 999 # 最大重连次数 - ping_interval = 30 # ping间隔(秒) -``` -您可以进入实验室,点击左下角的头像在实验室详情中获取所在实验室的ak sk -![copy_aksk.gif](image/copy_aksk.gif) - -### 完整配置示例 - -您可以根据需要添加更多配置选项: - -```python -#!/usr/bin/env python -# coding=utf-8 -"""Uni-Lab 配置文件""" - -# 基础配置 -class BasicConfig: - ak = "your_access_key" # 实验室访问密钥 - sk = "your_secret_key" # 实验室私钥 - working_dir = "" # 工作目录(通常自动设置) - config_path = "" # 配置文件路径(自动设置) - is_host_mode = True # 是否为主站模式 - slave_no_host = False # 从站模式下是否跳过等待主机服务 - upload_registry = False # 是否上传注册表 - machine_name = "undefined" # 机器名称(自动获取) - vis_2d_enable = False # 是否启用2D可视化 - enable_resource_load = True # 是否启用资源加载 - communication_protocol = "websocket" # 通信协议 - -# WebSocket配置 -class WSConfig: - reconnect_interval = 5 # 重连间隔(秒) - max_reconnect_attempts = 999 # 最大重连次数 - ping_interval = 30 # ping间隔(秒) - -# OSS上传配置 -class OSSUploadConfig: - api_host = "" # API主机地址 - authorization = "" # 授权信息 - init_endpoint = "" # 初始化端点 - complete_endpoint = "" # 完成端点 - max_retries = 3 # 最大重试次数 - -# HTTP配置 -class HTTPConfig: - remote_addr = "http://127.0.0.1:48197/api/v1" # 远程地址 - -# ROS配置 -class ROSConfig: - modules = [ - "std_msgs.msg", - "geometry_msgs.msg", - "control_msgs.msg", - "control_msgs.action", - "nav2_msgs.action", - "unilabos_msgs.msg", - "unilabos_msgs.action", - ] # 需要加载的ROS模块 -``` - -## 命令行参数覆盖配置 - -Uni-Lab 允许通过命令行参数覆盖配置文件中的设置,提供更灵活的配置方式。命令行参数的优先级高于配置文件。 - -### 支持命令行覆盖的配置项 - -以下配置项可以通过命令行参数进行覆盖: - -| 配置类 | 配置字段 | 命令行参数 | 说明 | -| ------------- | ----------------- | ------------------- | -------------------------------- | -| `BasicConfig` | `ak` | `--ak` | 实验室访问密钥 | -| `BasicConfig` | `sk` | `--sk` | 实验室私钥 | -| `BasicConfig` | `working_dir` | `--working_dir` | 工作目录路径 | -| `BasicConfig` | `is_host_mode` | `--is_slave` | 主站模式(参数为从站模式,取反) | -| `BasicConfig` | `slave_no_host` | `--slave_no_host` | 从站模式下跳过等待主机服务 | -| `BasicConfig` | `upload_registry` | `--upload_registry` | 启动时上传注册表信息 | -| `BasicConfig` | `vis_2d_enable` | `--2d_vis` | 启用 2D 可视化 | -| `HTTPConfig` | `remote_addr` | `--addr` | 远程服务地址 | - -### 特殊命令行参数 - -除了直接覆盖配置项的参数外,还有一些特殊的命令行参数: - -| 参数 | 说明 | -| ------------------- | ------------------------------------ | -| `--config` | 指定配置文件路径 | -| `--port` | Web 服务端口(不影响配置文件) | -| `--disable_browser` | 禁用自动打开浏览器(不影响配置文件) | -| `--visual` | 可视化工具选择(不影响配置文件) | -| `--skip_env_check` | 跳过环境检查(不影响配置文件) | - -### 配置优先级 - -配置项的生效优先级从高到低为: - -1. **命令行参数**:最高优先级 -2. **环境变量**:中等优先级 -3. **配置文件**:基础优先级 - -### 使用示例 - -```bash -# 通过命令行覆盖认证信息 -unilab --ak "new_access_key" --sk "new_secret_key" - -# 覆盖服务器地址 -unilab --addr "https://custom.server.com/api/v1" - -# 启用从站模式并跳过等待主机 -unilab --is_slave --slave_no_host - -# 启用上传注册表和2D可视化 -unilab --upload_registry --2d_vis - -# 组合使用多个覆盖参数 -unilab --ak "key" --sk "secret" --addr "test" --upload_registry --2d_vis -``` - -### 预设环境地址 - -`--addr` 参数支持以下预设值,会自动转换为对应的完整 URL: - -- `test` → `https://uni-lab.test.bohrium.com/api/v1` -- `uat` → `https://uni-lab.uat.bohrium.com/api/v1` -- `local` → `http://127.0.0.1:48197/api/v1` -- 其他值 → 直接使用作为完整 URL - -## 配置选项详解 - -### 基础配置 (BasicConfig) - -基础配置包含了系统运行的核心参数: - -| 参数 | 类型 | 默认值 | 说明 | -| ------------------------ | ---- | ------------- | ------------------------------------------ | -| `ak` | str | `""` | 实验室访问密钥(必需) | -| `sk` | str | `""` | 实验室私钥(必需) | -| `working_dir` | str | `""` | 工作目录,通常自动设置 | -| `is_host_mode` | bool | `True` | 是否为主站模式 | -| `slave_no_host` | bool | `False` | 从站模式下是否跳过等待主机服务 | -| `upload_registry` | bool | `False` | 启动时是否上传注册表信息 | -| `machine_name` | str | `"undefined"` | 机器名称,自动从 hostname 获取(不可配置) | -| `vis_2d_enable` | bool | `False` | 是否启用 2D 可视化 | -| `communication_protocol` | str | `"websocket"` | 通信协议,固定为 websocket | - -#### 认证配置 - -`ak` 和 `sk` 是必需的认证参数: - -1. **获取方式**:在 [Uni-Lab 官网](https://uni-lab.bohrium.com) 注册实验室后获得 -2. **配置方式**: - - **命令行参数**:`--ak "your_key" --sk "your_secret"`(最高优先级) - - **配置文件**:在 `BasicConfig` 类中设置 - - **环境变量**:`UNILABOS_BASICCONFIG_AK` 和 `UNILABOS_BASICCONFIG_SK` -3. **优先级顺序**:命令行参数 > 环境变量 > 配置文件 -4. **安全注意**:请妥善保管您的密钥信息 - -**推荐做法**: - -- 开发环境:使用配置文件 -- 生产环境:使用环境变量或命令行参数 -- 临时测试:使用命令行参数 - -### WebSocket 配置 (WSConfig) - -WebSocket 是 Uni-Lab 的主要通信方式: - -| 参数 | 类型 | 默认值 | 说明 | -| ------------------------ | ---- | ------ | ------------------ | -| `reconnect_interval` | int | `5` | 断线重连间隔(秒) | -| `max_reconnect_attempts` | int | `999` | 最大重连次数 | -| `ping_interval` | int | `30` | 心跳检测间隔(秒) | - -### HTTP 配置 (HTTPConfig) - -HTTP 客户端配置用于与云端服务通信: - -| 参数 | 类型 | 默认值 | 说明 | -| ------------- | ---- | --------------------------------- | ------------ | -| `remote_addr` | str | `"http://127.0.0.1:48197/api/v1"` | 远程服务地址 | - -**预设环境地址**: - -- 生产环境:`https://uni-lab.bohrium.com/api/v1` -- 测试环境:`https://uni-lab.test.bohrium.com/api/v1` -- UAT 环境:`https://uni-lab.uat.bohrium.com/api/v1` -- 本地环境:`http://127.0.0.1:48197/api/v1` - -### ROS 配置 (ROSConfig) - -配置 ROS 消息转换器需要加载的模块: - -```python -class ROSConfig: - modules = [ - "std_msgs.msg", # 标准消息类型 - "geometry_msgs.msg", # 几何消息类型 - "control_msgs.msg", # 控制消息类型 - "control_msgs.action", # 控制动作类型 - "nav2_msgs.action", # 导航动作类型 - "unilabos_msgs.msg", # UniLab 自定义消息类型 - "unilabos_msgs.action", # UniLab 自定义动作类型 - ] -``` - -您可以根据实际使用的设备和功能添加其他 ROS 模块。 - -### OSS 上传配置 (OSSUploadConfig) - -对象存储服务配置,用于文件上传功能: - -| 参数 | 类型 | 默认值 | 说明 | -| ------------------- | ---- | ------ | -------------------- | -| `api_host` | str | `""` | OSS API 主机地址 | -| `authorization` | str | `""` | 授权认证信息 | -| `init_endpoint` | str | `""` | 上传初始化端点 | -| `complete_endpoint` | str | `""` | 上传完成端点 | -| `max_retries` | int | `3` | 上传失败最大重试次数 | - -## 环境变量支持 - -Uni-Lab 支持通过环境变量覆盖配置文件中的设置。环境变量格式为: - -``` -UNILABOS_{配置类名}_{字段名} -``` - -### 环境变量示例 - -```bash -# 设置基础配置 -export UNILABOS_BASICCONFIG_AK="your_access_key" -export UNILABOS_BASICCONFIG_SK="your_secret_key" -export UNILABOS_BASICCONFIG_IS_HOST_MODE="true" - -# 设置WebSocket配置 -export UNILABOS_WSCONFIG_RECONNECT_INTERVAL="10" -export UNILABOS_WSCONFIG_MAX_RECONNECT_ATTEMPTS="500" - -# 设置HTTP配置 -export UNILABOS_HTTPCONFIG_REMOTE_ADDR="https://uni-lab.bohrium.com/api/v1" -``` - -### 环境变量类型转换 - -- **布尔值**:`"true"`, `"1"`, `"yes"` → `True`;其他 → `False` -- **整数**:自动转换为 `int` 类型 -- **浮点数**:自动转换为 `float` 类型 -- **字符串**:保持原值 - -## 配置文件使用方法 - -### 1. 指定配置文件启动 - -```bash -# 使用指定配置文件启动 -unilab --config /path/to/your/config.py -``` - -### 2. 使用默认配置文件 - -如果不指定配置文件,系统会按以下顺序查找: - -1. 环境变量 `UNILABOS_BASICCONFIG_CONFIG_PATH` 指定的路径 -2. 工作目录下的 `local_config.py` -3. 首次使用时会引导创建配置文件 - -### 3. 配置文件验证 - -系统启动时会自动验证配置文件: - -- **语法检查**:确保 Python 语法正确 -- **类型检查**:验证配置项类型是否匹配 -- **必需项检查**:确保 `ak` 和 `sk` 已配置 - -## 最佳实践 - -### 1. 安全配置 - -- 不要将包含密钥的配置文件提交到版本控制系统 -- 使用环境变量或命令行参数在生产环境中配置敏感信息 -- 定期更换访问密钥 -- **推荐配置方式**: - - ```bash - # 生产环境 - 使用环境变量 - export UNILABOS_BASICCONFIG_AK="your_access_key" - export UNILABOS_BASICCONFIG_SK="your_secret_key" - unilab - - # 或使用命令行参数 - unilab --ak "your_access_key" --sk "your_secret_key" - ``` - -### 2. 多环境配置 - -为不同环境创建不同的配置文件并结合命令行参数: - -``` -configs/ -├── local_config.py # 本地开发 -├── test_config.py # 测试环境 -├── prod_config.py # 生产环境 -└── example_config.py # 示例配置 -``` - -**环境切换示例**: - -```bash -# 本地开发环境 -unilab --config configs/local_config.py --addr local - -# 测试环境 -unilab --config configs/test_config.py --addr test --upload_registry - -# 生产环境 -unilab --config configs/prod_config.py --ak "$PROD_AK" --sk "$PROD_SK" -``` - -### 3. 配置管理 - -- 保持配置文件简洁,只包含需要修改的配置项 -- 为配置项添加注释说明其作用 -- 定期检查和更新配置文件 -- **命令行参数优先使用场景**: - - 临时测试不同配置 - - CI/CD 流水线中的动态配置 - - 不同环境间快速切换 - - 敏感信息的安全传递 - -### 4. 灵活配置策略 - -**基础配置文件 + 命令行覆盖**的推荐方式: - -```python -# base_config.py - 基础配置 -class BasicConfig: - # 非敏感配置写在文件中 - is_host_mode = True - upload_registry = False - vis_2d_enable = False - -class WSConfig: - reconnect_interval = 5 - max_reconnect_attempts = 999 - ping_interval = 30 -``` - -```bash -# 启动时通过命令行覆盖关键参数 -unilab --config base_config.py \ - --ak "$AK" \ - --sk "$SK" \ - --addr "test" \ - --upload_registry \ - --2d_vis -``` - -## 故障排除 - -### 1. 配置文件加载失败 - -**错误信息**:`[ENV] 配置文件 xxx 不存在` - -**解决方法**: - -- 确认配置文件路径正确 -- 检查文件权限是否可读 -- 确保配置文件是 `.py` 格式 - -### 2. 语法错误 - -**错误信息**:`[ENV] 加载配置文件 xxx 失败` - -**解决方法**: - -- 检查 Python 语法是否正确 -- 确认类名和字段名拼写正确 -- 验证缩进是否正确(使用空格而非制表符) - -### 3. 认证失败 - -**错误信息**:`后续运行必须拥有一个实验室` - -**解决方法**: - -- 确认 `ak` 和 `sk` 已正确配置 -- 检查密钥是否有效 -- 确认网络连接正常 - -### 4. 环境变量不生效 - -**解决方法**: - -- 确认环境变量名格式正确(`UNILABOS_CLASS_FIELD`) -- 检查环境变量是否已正确设置 -- 重启系统或重新加载环境变量 - -### 5. 命令行参数不生效 - -**错误现象**:设置了命令行参数但配置没有生效 - -**解决方法**: - -- 确认参数名拼写正确(如 `--ak` 而不是 `--access_key`) -- 检查参数格式是否正确(布尔参数如 `--is_slave` 不需要值) -- 确认参数位置正确(所有参数都应在 `unilab` 之后) -- 查看启动日志确认参数是否被正确解析 - -### 6. 配置优先级混淆 - -**错误现象**:不确定哪个配置生效 - -**解决方法**: - -- 记住优先级:命令行参数 > 环境变量 > 配置文件 -- 使用 `--ak` 和 `--sk` 参数时会看到提示信息 -- 检查启动日志中的配置加载信息 -- 临时移除低优先级配置来测试高优先级配置是否生效 diff --git a/docs/user_guide/graph_files.md b/docs/user_guide/graph_files.md new file mode 100644 index 00000000..a8f86aaf --- /dev/null +++ b/docs/user_guide/graph_files.md @@ -0,0 +1,860 @@ +# 设备图文件说明 + +设备图文件定义了实验室中所有设备、资源及其连接关系。本文档说明如何创建和使用设备图文件。 + +## 概述 + +设备图文件采用 JSON 格式,节点定义基于 **`ResourceDict`** 标准模型(定义在 `unilabos.ros.nodes.resource_tracker`)。系统会自动处理旧格式并转换为标准格式,确保向后兼容性。 + +**核心概念**: + +- **Nodes(节点)**: 代表设备或资源,通过 `parent` 字段建立层级关系 +- **Links(连接)**: 可选的连接关系定义,用于展示设备间的物理或通信连接 +- **UUID**: 全局唯一标识符,用于跨系统的资源追踪 +- **自动转换**: 旧格式会通过 `ResourceDictInstance.get_resource_instance_from_dict()` 自动转换 + +## 文件格式 + +Uni-Lab 支持两种格式的设备图文件: + +### JSON 格式(推荐) + +**优点**: + +- 易于编辑和阅读 +- 支持注释(使用预处理) +- 与 Web 界面完全兼容 +- 便于版本控制 + +**示例**: `workshop1.json` + +### GraphML 格式 + +**优点**: + +- 可用图形化工具编辑(如 yEd) +- 适合复杂拓扑可视化 + +**示例**: `setup.graphml` + +## JSON 文件结构 + +一个完整的 JSON 设备图文件包含两个主要部分: + +```json +{ + "nodes": [ + /* 设备和资源节点 */ + ], + "links": [ + /* 连接关系(可选)*/ + ] +} +``` + +### Nodes(节点) + +每个节点代表一个设备或资源。节点的定义遵循 `ResourceDict` 标准模型: + +```json +{ + "id": "liquid_handler_1", + "uuid": "550e8400-e29b-41d4-a716-446655440000", + "name": "液体处理工作站", + "type": "device", + "class": "liquid_handler", + "config": { + "port": "/dev/ttyUSB0", + "baudrate": 9600 + }, + "data": {}, + "position": { + "x": 100, + "y": 200 + }, + "parent": null +} +``` + +**字段说明(基于 ResourceDict 标准定义)**: + +| 字段 | 必需 | 说明 | 示例 | 默认值 | +| ------------- | ---- | ------------------------ | ---------------------------------------------------- | -------- | +| `id` | ✓ | 唯一标识符 | `"pump_1"` | - | +| `uuid` | | 全局唯一标识符 (UUID) | `"550e8400-e29b-41d4-a716-446655440000"` | 自动生成 | +| `name` | ✓ | 显示名称 | `"主反应泵"` | - | +| `type` | ✓ | 节点类型 | `"device"`, `"resource"`, `"container"`, `"deck"` 等 | - | +| `class` | ✓ | 设备/资源类别 | `"liquid_handler"`, `"syringepump.runze"` | `""` | +| `config` | | Python 类的初始化参数 | `{"port": "COM3"}` | `{}` | +| `data` | | 资源的运行状态数据 | `{"status": "Idle", "position": 0.0}` | `{}` | +| `position` | | 在图中的位置 | `{"x": 100, "y": 200}` 或完整的 pose 结构 | - | +| `pose` | | 完整的 3D 位置信息 | 参见下文 | - | +| `parent` | | 父节点 ID | `"deck_1"` | `null` | +| `parent_uuid` | | 父节点 UUID | `"550e8400-..."` | `null` | +| `children` | | 子节点 ID 列表(旧格式) | `["child1", "child2"]` | - | +| `description` | | 资源描述 | `"用于精确控制试剂A的加料速率"` | `""` | +| `schema` | | 资源 schema 定义 | `{}` | `{}` | +| `model` | | 资源 3D 模型信息 | `{}` | `{}` | +| `icon` | | 资源图标 | `"pump.webp"` | `""` | +| `extra` | | 额外的自定义数据 | `{"custom_field": "value"}` | `{}` | + +### Position 和 Pose(位置信息) + +**简单格式(旧格式,兼容)**: + +```json +"position": { + "x": 100, + "y": 200, + "z": 0 +} +``` + +**完整格式(推荐)**: + +```json +"pose": { + "size": { + "width": 127.76, + "height": 85.48, + "depth": 10.0 + }, + "scale": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + }, + "layout": "x-y", + "position": { + "x": 100, + "y": 200, + "z": 0 + }, + "position3d": { + "x": 100, + "y": 200, + "z": 0 + }, + "rotation": { + "x": 0, + "y": 0, + "z": 0 + }, + "cross_section_type": "rectangle" +} +``` + +### Links(连接) + +定义节点之间的连接关系(可选,主要用于物理连接或通信关系的可视化): + +```json +{ + "source": "pump_1", + "target": "reactor_1", + "sourceHandle": "output", + "targetHandle": "input", + "type": "physical" +} +``` + +**字段说明**: + +| 字段 | 必需 | 说明 | 示例 | +| -------------- | ---- | ---------------- | ---------------------------------------- | +| `source` | ✓ | 源节点 ID | `"pump_1"` | +| `target` | ✓ | 目标节点 ID | `"reactor_1"` | +| `sourceHandle` | | 源节点的连接点 | `"output"` | +| `targetHandle` | | 目标节点的连接点 | `"input"` | +| `type` | | 连接类型 | `"physical"`, `"communication"` | +| `port` | | 端口映射信息 | `{"source": "port1", "target": "port2"}` | + +**注意**: Links 主要用于图形化展示和文档说明,父子关系通过 `parent` 字段定义,不依赖 links。 + +## 完整示例 + +### 示例 1:液体处理工作站(PRCXI9300) + +这是一个真实的液体处理工作站配置,包含设备、工作台和多个板资源。 + +**文件位置**: `test/experiments/prcxi_9300.json` + +```json +{ + "nodes": [ + { + "id": "PRCXI9300", + "name": "PRCXI9300", + "parent": null, + "type": "device", + "class": "liquid_handler.prcxi", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "deck": { + "_resource_child_name": "PRCXI_Deck_9300", + "_resource_type": "unilabos.devices.liquid_handling.prcxi.prcxi:PRCXI9300Deck" + }, + "host": "10.181.214.132", + "port": 9999, + "timeout": 10.0, + "axis": "Left", + "channel_num": 8, + "setup": false, + "debug": true, + "simulator": true, + "matrix_id": "71593" + }, + "data": {}, + "children": ["PRCXI_Deck_9300"] + }, + { + "id": "PRCXI_Deck_9300", + "name": "PRCXI_Deck_9300", + "parent": "PRCXI9300", + "type": "deck", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "PRCXI9300Deck", + "size_x": 100, + "size_y": 100, + "size_z": 100, + "rotation": { + "x": 0, + "y": 0, + "z": 0, + "type": "Rotation" + }, + "category": "deck" + }, + "data": {}, + "children": [ + "RackT1", + "PlateT2", + "trash", + "PlateT4", + "PlateT5", + "PlateT6" + ] + }, + { + "id": "RackT1", + "name": "RackT1", + "parent": "PRCXI_Deck_9300", + "type": "tip_rack", + "class": "", + "position": { + "x": 0, + "y": 0, + "z": 0 + }, + "config": { + "type": "TipRack", + "size_x": 127.76, + "size_y": 85.48, + "size_z": 100 + }, + "data": {}, + "children": [] + } + ] +} +``` + +**关键点**: + +- 使用 `parent` 字段建立层级关系(PRCXI9300 → Deck → Rack/Plate) +- 使用 `children` 字段(旧格式)列出子节点 +- `config` 中包含设备特定的连接参数 +- `data` 存储运行时状态 +- `position` 使用简单的 x/y/z 坐标 + +### 示例 2:有机合成工作站(带 Links) + +这是一个格林纳德反应的流动化学工作站配置,展示了完整的设备连接和通信关系。 + +**文件位置**: `test/experiments/Grignard_flow_batchreact_single_pumpvalve.json` + +```json +{ + "nodes": [ + { + "id": "YugongStation", + "name": "愚公常量合成工作站", + "parent": null, + "type": "device", + "class": "workstation", + "position": { + "x": 620.6111111111111, + "y": 171, + "z": 0 + }, + "config": { + "protocol_type": [ + "PumpTransferProtocol", + "CleanProtocol", + "SeparateProtocol", + "EvaporateProtocol" + ] + }, + "data": {}, + "children": [ + "serial_pump", + "pump_reagents", + "flask_CH2Cl2", + "reactor", + "pump_workup", + "separator_controller", + "flask_separator", + "rotavap", + "column" + ] + }, + { + "id": "serial_pump", + "name": "serial_pump", + "parent": "YugongStation", + "type": "device", + "class": "serial", + "position": { + "x": 620.6111111111111, + "y": 171, + "z": 0 + }, + "config": { + "port": "COM7", + "baudrate": 9600 + }, + "data": {}, + "children": [] + }, + { + "id": "pump_reagents", + "name": "pump_reagents", + "parent": "YugongStation", + "type": "device", + "class": "syringepump.runze", + "position": { + "x": 620.6111111111111, + "y": 171, + "z": 0 + }, + "config": { + "port": "/devices/PumpBackbone/Serial/serialwrite", + "address": "1", + "max_volume": 25.0 + }, + "data": { + "max_velocity": 1.0, + "position": 0.0, + "status": "Idle", + "valve_position": "0" + }, + "children": [] + }, + { + "id": "reactor", + "name": "reactor", + "parent": "YugongStation", + "type": "container", + "class": null, + "position": { + "x": 430.4087301587302, + "y": 428, + "z": 0 + }, + "config": {}, + "data": {}, + "children": [] + } + ], + "links": [ + { + "source": "pump_reagents", + "target": "serial_pump", + "type": "communication", + "port": { + "pump_reagents": "port", + "serial_pump": "port" + } + }, + { + "source": "pump_workup", + "target": "serial_pump", + "type": "communication", + "port": { + "pump_workup": "port", + "serial_pump": "port" + } + } + ] +} +``` + +**关键点**: + +- 多级设备层次:工作站包含多个子设备和容器 +- `links` 定义通信关系(泵通过串口连接) +- `data` 字段存储设备状态(如泵的位置、速度等) +- `class` 可以使用点号分层(如 `"syringepump.runze"`) +- 容器的 `class` 可以为 `null` + +## 格式兼容性和转换 + +### 旧格式自动转换 + +Uni-Lab 使用 `ResourceDictInstance.get_resource_instance_from_dict()` 方法自动处理旧格式的节点数据,确保向后兼容性。 + +**自动转换规则**: + +1. **自动生成缺失字段**: + + ```python + # 如果缺少 id,使用 name 作为 id + if "id" not in content: + content["id"] = content["name"] + + # 如果缺少 uuid,自动生成 + if "uuid" not in content: + content["uuid"] = str(uuid.uuid4()) + ``` + +2. **Position 格式转换**: + + ```python + # 旧格式:简单的 x/y 坐标 + "position": {"x": 100, "y": 200} + + # 自动转换为新格式 + "position": { + "position": {"x": 100, "y": 200} + } + ``` + +3. **默认值填充**: + + ```python + # 自动填充空字段 + if not content.get("class"): + content["class"] = "" + if not content.get("config"): + content["config"] = {} + if not content.get("data"): + content["data"] = {} + if not content.get("extra"): + content["extra"] = {} + ``` + +4. **Pose 字段同步**: + ```python + # 如果没有 pose,使用 position + if "pose" not in content: + content["pose"] = content.get("position", {}) + ``` + +### 使用示例 + +```python +from unilabos.ros.nodes.resource_tracker import ResourceDictInstance + +# 旧格式节点 +old_format_node = { + "name": "pump_1", + "type": "device", + "class": "syringepump", + "position": {"x": 100, "y": 200} +} + +# 自动转换为标准格式 +instance = ResourceDictInstance.get_resource_instance_from_dict(old_format_node) + +# 访问标准化后的数据 +print(instance.res_content.id) # "pump_1" +print(instance.res_content.uuid) # 自动生成的 UUID +print(instance.res_content.config) # {} +print(instance.res_content.data) # {} +``` + +### 格式迁移建议 + +虽然系统会自动处理旧格式,但建议在新文件中使用完整的标准格式: + +| 字段 | 旧格式(兼容) | 新格式(推荐) | +| ------ | ---------------------------------- | ------------------------------------------------ | +| 标识符 | 仅 `id` 或仅 `name` | `id` + `uuid` | +| 位置 | `"position": {"x": 100, "y": 200}` | 完整的 `pose` 结构 | +| 父节点 | `"parent": "parent_id"` | `"parent": "parent_id"` + `"parent_uuid": "..."` | +| 配置 | 可省略 | 显式设置为 `{}` | +| 数据 | 可省略 | 显式设置为 `{}` | + +## 节点类型详解 + +### Device 节点 + +设备节点代表实际的硬件设备: + +```json +{ + "id": "device_id", + "name": "设备名称", + "type": "device", + "class": "设备类别", + "parent": null, + "config": { + "port": "COM3" + }, + "data": {}, + "children": [] +} +``` + +**常见设备类别**: + +- `liquid_handler`: 液体处理工作站 +- `liquid_handler.prcxi`: PRCXI 液体处理工作站 +- `syringepump`: 注射泵 +- `syringepump.runze`: 润泽注射泵 +- `heaterstirrer`: 加热搅拌器 +- `balance`: 天平 +- `reactor_vessel`: 反应釜 +- `serial`: 串口通信设备 +- `workstation`: 自动化工作站 + +### Resource 节点 + +资源节点代表物料容器、载具等: + +```json +{ + "id": "resource_id", + "name": "资源名称", + "type": "resource", + "class": "资源类别", + "parent": "父节点ID", + "config": { + "size_x": 127.76, + "size_y": 85.48, + "size_z": 100 + }, + "data": {}, + "children": [] +} +``` + +**常见资源类型**: + +- `deck`: 工作台/甲板 +- `plate`: 板(96 孔板等) +- `tip_rack`: 枪头架 +- `tube`: 试管 +- `container`: 容器 +- `well`: 孔位 +- `bottle_carrier`: 瓶架 + +## Handle(连接点) + +每个设备和资源可以有多个连接点(handles),用于定义可以连接的接口。 + +### 查看可用 handles + +设备和资源的可用 handles 定义在注册表中: + +```yaml +# 设备注册表示例 +liquid_handler: + handles: + - handler_key: pipette + io_type: source + - handler_key: deck + io_type: target +``` + +### 常见 handles + +| 设备类型 | Source Handles | Target Handles | +| ---------- | -------------- | -------------- | +| 泵 | output | input | +| 反应釜 | output, vessel | input | +| 液体处理器 | pipette | deck | +| 板 | wells | access | + +## 使用 Web 界面创建图文件 + +Uni-Lab 提供 Web 界面来可视化创建和编辑设备图: + +### 1. 启动 Uni-Lab + +```bash +unilab +``` + +### 2. 访问 Web 界面 + +打开浏览器访问 `http://localhost:8002` + +### 3. 图形化编辑 + +- 拖拽添加设备和资源 +- 连线建立连接关系 +- 编辑节点属性 +- 保存为 JSON 文件 + +### 4. 导出图文件 + +点击"导出"按钮,下载 JSON 文件到本地。 + +## 从云端获取图文件 + +如果不指定`-g`参数,Uni-Lab 会自动从云端获取: + +```bash +# 使用云端配置 +unilab + +# 日志会显示: +# [INFO] 未指定设备加载文件路径,尝试从HTTP获取... +# [INFO] 联网获取设备加载文件成功 +``` + +**云端图文件管理**: + +1. 登录 https://uni-lab.bohrium.com +2. 进入"设备配置" +3. 创建或编辑配置 +4. 保存到云端 + +本地启动时会自动同步最新配置。 + +## 调试图文件 + +### 验证 JSON 格式 + +```bash +# 使用Python验证 +python -c "import json; json.load(open('workshop1.json'))" + +# 使用在线工具 +# https://jsonlint.com/ +``` + +### 检查节点引用 + +确保: + +- 所有`links`中的`source`和`target`都存在于`nodes`中 +- `parent`字段指向的节点存在 +- `class`字段对应的设备/资源在注册表中存在 + +### 启动时验证 + +```bash +# Uni-Lab启动时会验证图文件 +unilab -g workshop1.json + +# 查看日志中的错误或警告 +# [ERROR] 节点 xxx 的source端点 yyy 不存在 +# [WARNING] 节点 zzz missing 'name', defaulting to ... +``` + +## 最佳实践 + +### 1. 命名规范 + +```json +{ + "id": "pump_reagent_1", // 小写+下划线,描述性 + "name": "试剂进料泵A", // 中文显示名称 + "class": "syringepump" // 使用注册表中的精确名称 +} +``` + +### 2. 层级组织 + +``` +host_node (主节点) +└── liquid_handler_1 (设备) + └── deck_1 (资源) + ├── tiprack_1 (资源) + ├── plate_1 (资源) + └── reservoir_1 (资源) +``` + +### 3. 配置分离 + +将设备特定配置放在`config`中: + +```json +{ + "id": "pump_1", + "class": "syringepump", + "config": { + "port": "COM3", // 设备特定 + "max_flow_rate": 10, // 设备特定 + "volume": 50 // 设备特定 + } +} +``` + +### 4. 版本控制 + +```bash +# 使用Git管理图文件 +git add workshop1.json +git commit -m "Add new liquid handler configuration" + +# 使用有意义的文件名 +workshop_v1.json +workshop_production.json +workshop_test.json +``` + +### 5. 注释(通过描述字段) + +虽然 JSON 不支持注释,但可以使用`description`字段: + +```json +{ + "id": "pump_1", + "name": "进料泵", + "description": "用于精确控制试剂A的加料速率,最大流速10mL/min", + "class": "syringepump" +} +``` + +## 示例文件位置 + +Uni-Lab 在安装时已预置了 **40+ 个真实的设备图文件示例**,位于 `unilabos/test/experiments/` 目录。这些都是真实项目中使用的配置文件,可以直接使用或作为参考。 + +### 📁 主要示例文件 + +``` +test/experiments/ +├── workshop.json # 综合工作台(推荐新手) +├── empty_devices.json # 空设备配置(最小化) +├── prcxi_9300.json # PRCXI液体处理工作站(本文示例1) +├── prcxi_9320.json # PRCXI 9320工作站 +├── biomek.json # Biomek液体处理工作站 +├── Grignard_flow_batchreact_single_pumpvalve.json # 格林纳德反应工作站(本文示例2) +├── dispensing_station_bioyond.json # Bioyond配液站 +├── reaction_station_bioyond.json # Bioyond反应站 +├── HPLC.json # HPLC分析系统 +├── plr_test.json # PyLabRobot测试配置 +├── lidocaine-graph.json # 利多卡因合成工作站 +├── opcua_example.json # OPC UA设备集成示例 +│ +├── mock_devices/ # 虚拟设备(用于离线测试) +│ ├── mock_all.json # 完整虚拟设备集 +│ ├── mock_pump.json # 虚拟泵 +│ ├── mock_stirrer.json # 虚拟搅拌器 +│ ├── mock_heater.json # 虚拟加热器 +│ └── ... # 更多虚拟设备 +│ +├── Protocol_Test_Station/ # 协议测试工作站 +│ ├── pumptransfer_test_station.json # 泵转移协议测试 +│ ├── heatchill_protocol_test_station.json # 加热冷却协议测试 +│ ├── filter_protocol_test_station.json # 过滤协议测试 +│ └── ... # 更多协议测试 +│ +└── comprehensive_protocol/ # 综合协议示例 + ├── comprehensive_station.json # 综合工作站 + └── comprehensive_slim.json # 精简版综合工作站 +``` + +### 🚀 快速使用 + +无需下载或创建,直接使用 `-g` 参数指定路径: + +```bash +# 使用简单工作台(推荐新手) +unilab --ak your_ak --sk your_sk -g test/experiments/workshop.json + +# 使用虚拟设备(无需真实硬件) +unilab --ak your_ak --sk your_sk -g test/experiments/mock_devices/mock_all.json + +# 使用 PRCXI 液体处理工作站 +unilab --ak your_ak --sk your_sk -g test/experiments/prcxi_9300.json + +# 使用格林纳德反应工作站 +unilab --ak your_ak --sk your_sk -g test/experiments/Grignard_flow_batchreact_single_pumpvalve.json +``` + +### 📚 文件分类 + +| 类别 | 说明 | 文件数量 | +| ------------ | ------------------------ | -------- | +| **主工作站** | 完整的实验工作站配置 | 15+ | +| **虚拟设备** | 用于开发测试的 mock 设备 | 10+ | +| **协议测试** | 各种实验协议的测试配置 | 12+ | +| **综合示例** | 包含多种协议的综合工作站 | 3+ | + +这些文件展示了不同场景下的设备图配置,涵盖液体处理、有机合成、分析检测等多个领域,是学习和创建自己配置的绝佳参考。 + +## 快速参考:ResourceDict 完整字段列表 + +基于 `unilabos.ros.nodes.resource_tracker.ResourceDict` 的完整字段定义: + +```python +class ResourceDict(BaseModel): + # === 基础标识 === + id: str # 资源ID(必需) + uuid: str # 全局唯一标识符(自动生成) + name: str # 显示名称(必需) + + # === 类型和分类 === + type: Union[Literal["device"], str] # 节点类型(必需) + klass: str # 资源类别(alias="class",必需) + + # === 层级关系 === + parent: Optional[ResourceDict] # 父资源对象(不序列化) + parent_uuid: Optional[str] # 父资源UUID + + # === 位置和姿态 === + position: ResourceDictPosition # 位置信息 + pose: ResourceDictPosition # 姿态信息(推荐使用) + + # === 配置和数据 === + config: Dict[str, Any] # 设备配置参数 + data: Dict[str, Any] # 运行时状态数据 + extra: Dict[str, Any] # 额外自定义数据 + + # === 元数据 === + description: str # 资源描述 + resource_schema: Dict[str, Any] # schema定义(alias="schema") + model: Dict[str, Any] # 3D模型信息 + icon: str # 图标路径 +``` + +**Position/Pose 结构**: + +```python +class ResourceDictPosition(BaseModel): + size: ResourceDictPositionSize # width, height, depth + scale: ResourceDictPositionScale # x, y, z + layout: Literal["2d", "x-y", "z-y", "x-z"] + position: ResourceDictPositionObject # x, y, z + position3d: ResourceDictPositionObject # x, y, z + rotation: ResourceDictPositionObject # x, y, z + cross_section_type: Literal["rectangle", "circle", "rounded_rectangle"] +``` + +## 下一步 + +- {doc}`../boot_examples/index` - 查看完整启动示例 +- {doc}`../developer_guide/add_device` - 了解如何添加新设备 +- {doc}`06_troubleshooting` - 图文件相关问题排查 +- 源码参考: `unilabos/ros/nodes/resource_tracker.py` - ResourceDict 标准定义 + +## 获取帮助 + +- 在 Web 界面中使用模板创建 +- 参考示例文件:`test/experiments/` 目录 +- 查看 ResourceDict 源码了解完整定义 +- [GitHub 讨论区](https://github.com/dptech-corp/Uni-Lab-OS/discussions) diff --git a/docs/user_guide/image/test_latency_result.png b/docs/user_guide/image/test_latency_result.png new file mode 100644 index 0000000000000000000000000000000000000000..af6395d95af0ed3ffd11d701fb2333e662ebd459 GIT binary patch literal 24102 zcmeFZXH-<{)-{L+1tX|P5D?6WB$131sGul0X9~$V=OUCD0Rce?5(*I|BRNB1AcGWI zK3yMOfP9^d%RxL1V=d+%qjXRW#BoNEWFD9N5U%6yc9g5t!( z2Qq3D6qMBz6bHT?{s(@;D-@>*e;sgDlf6svrImFWemH1(NAV5?MPAsk9pgjr^AV>9 zx~>!y=K_%b9|)URGN+(0tavDMN5cy}H{k82q4{)UNv=+mT68W6)qR-m_<^f$&KoCC zJhhUIx^tgF_vM{?RwqB%%iPiPUn_NcQ#hQKc3!dK4vU?}bE@Zp7q_qbSe=hK_)p{; z`qL37uSbRqiIvUGHT&g|s-DX!s0|T}1{~8d>DOCI(DM}pXG%Du$0!=V1MoKmZJH(g z`IVP+7XHc&#!$guvmbHDYZd?BzH}QE`R2`=$jHxpMcHX-*REXooR;>$$obgcvuc;+ z>QSwklsqczF93Nq@Ki z<56bN2XE1t`131yi_{yPn8?n~&PQ{elk=gGeH`t~Cj5TX3*Is5Qug;N7O!8pkVJJL zJ7r~WcbnW%QfEnykBsa{mZd$FAYj?ruH7YBgc-u_`}q~wOJ+^I7qASfpZ=9xpMAUs zR&i0k(?*&DDEY-C~t3XcHhN2ZfC;6$m1tY(ANvt_ZBA0hG}VOHQ7t+NP!^zUrOdZrgC< zY1kx0FI|$hD>H9q@FR!WIGyg5M>+NtXG;grY`JP2p`{%vung;-?JcssBpcdZlJ+s- zxrcbdkC!KiA{jUBx^JWsHwjbt&9B7{16$vy+5c?!@8my-jEo%e-_B0Glql+K;^9%e z#F?U;h}P0dLAAd)##rt)eNi~(hVk8p4+D$gw%?vxI@9JJ)#|QIfDghQ`=vc(*BEhy zcUWr3OF|6f>;sg=LFfq`gNx$vgEBL1+au6>R@x2Hoy>6Vq1 zjh^v=H^Yy$y;|9NRon9wCbP26&Px>wcrH_IMdLYrxoBQPtsHa$L~TrrsBI^AnFKdC zH$T7Xo~R`OcY>CdF|&paVmLB7dVhBT%YM`BRloe+C-jz%pE_o3)>@+R1Z+|2_Q!+O zSgc`6fg?$G(WT>&u5QojG_m&joG%I1vo%qQuU;W|tDVih?)6!cn00iskmF!wcXzkn z_FAL(x<-}Iqbfo=3?;uESXX$k0n>P#Db~b1_;x|(azMxdm zXx#BX-=0wiGp>x*1`m|G(;X}N#`5stLz7kS<|v-2pK+;@XCMd-)sUNA7E01R$GyE& z&z_kn!`&JuqHJ3lA0H1nHLs1SKSd$4geqfO6gJ*6Yk^iHnj|JHtd<$}v(>3N0r= zcm)Oq!mT!;eE*&Fq%r60ZwQ!iPABhf?Hu$u39sB}j^143XKN@KzgvahSlF>Uc{+QJ z`)iKWv}`+5$*_Oh#mHH%hBVi*gE51}_HjD?>jR$Eo0D;)Yd#rg1uR~jfZgLV^8L`9 zn>(Dn^xeA_t?^~XKVG)9C@7~&Wa?Mpy1iNXwakX_ezu)i;nQ|mX3As(0|N<*7N$HB zL@5&8YfpXGdMxvCrlzK~=t0^Rx4Crn)bZijsYEQgul6kjWb?`B#Cz@!R*?V{wT2p) z_*}eG_eSe?Re91!T$Mpbs%n6wPkGuG%}lNR-J$&|_ZcnwP#U6d)&agS*QL=~@0CgS z`TormO117ROTK7&=0-+h^Am49+w!&uOr0Lhpo($;%l>1yVin7Fx4pGK#~INNGaqqX z+4>w&`f4+qu$GXf38?k>)Xj?!;816?bvc>eODdV0Pt>zx?J$>jx5zVtRTUdU!ZW&6 zRKI>_w-<<)_m&1Tx)c_&Rxa&rF9cud)eMAVxHpRacrgh;&!%pBfsn!b-XOOgp7;0yQ%v5gI0 zFTof||DDo!d8GuJk5o;~&Dz;|R|p51GmoPtOi#o}wnE(2LDVsW!DPd#j z&uUlC!*FXjfxpdp^=1 s9mw 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 E2b*qoU;qFB literal 0 HcmV?d00001 diff --git a/docs/user_guide/image/test_latency_running.png b/docs/user_guide/image/test_latency_running.png new file mode 100644 index 0000000000000000000000000000000000000000..4483dc1363652c732302eeddbbd778ec7a2b358c GIT binary patch literal 46811 zcmeFZby!u~yDvT$ARQ`5hY2bONH;11BBh|Dz@odmQ3N(EpmeB|N_WEoq+=1%-7LCm z5qB*2-rwK%x#xSIbI*D1InVjy$FsLirgM%l-toqGZ= z!@?J~4I!x1M&{|`S1#IXXThrE&a>j@-WS0iZ@D`tx-Xj^4x3fAXswzeYo{jqy)2NG z8|RgJmN^qjj-F+suOn>;?*8!(Uy1XNyYIe!ef{OdEi9$WlJht3yQ zjPvvzj)0-tH;CaTJ06Kc+pV1jT-@(nyH~lQF03iQnzSn~!jr(?kUbfU7=os8@ZsPW zmPZga1PQ>fs38bJa2Ww^DfmFR5M+ae!wEq?2pe&&-{?hQIb z=;9ai#v1WeVFfZ1g)g7M&oDcSV|)tknEl?wfK-yz&(37U#}s8m(-AK>n)6jgrf735 zpF9RXS6*`MF<36@9_$hJ&uha@d(yRm#g!L%lX|_Y0d8(?l`sgQTjP1=E0KZQ_#)DZ&0i74<7*N@*|Cou zOU!zgNpXq^tr;&TftxCmH$+E_8zKOmk z>B<`sADN$g@q06)8OybcPDQ<(VOpdRM9;^?#l>Sm&1F|{l5Aty-&C*g%lN6y0^}u@ zkvtdKlJJ~1b^-}0IB}VTrL`5rS6^0U@dX5uAZ%}o}SB9^bpjEXl;F_Q4=Cc!A+6;UMWZ1XKEzWDY%f2dS*YWvZ_i3 zO1O;ZpHYH!D(c*{wyDO=UX=!#(CJrSU%)JN6(LnLqF2zP{II+7puz~+HACpbPAxE6 zz{&CqN{PpZD;+m26F4vQ7 zF*r~r#P~Gc)|Lx7&;5E*yLu>N9jOl!(Z-fy0{=uGM}c6zMF2l1i1UQW*^EHUywizq z3-Hpu;DRZonfV_lyufx!B*Nu9o`{0F8N8pMxPJl7Tx_1F&2I~_RU@_E$Gr0xGfyHs z{<93!PtK)K?Nknjh!Q^YV(T9U&H;BU%#>x@`x zJb>R=;IZq!1_oa1=pYr6U^w|E?2HIOY=*hi&sPx8^hRZ6Wf-GqrPuhu`dC$E}>6wkg;p4KQ`yT zxL6u?(5*f3Ia$jp-rt`jX<~FRlOa4Io{68gL~MO|d2l6wc+IY#=Nr??GOebir@gGi zY7`5yva;k1H#Ja;bh@k&&iUbmpxr#aFqw9^9`8!*BoBf47d#zY;FuXgnNlGdU# z8JMGDP4H~kfk+=YPKAUJN7k~Po z^mK=?uJ`=>(AY@gUjQSdZ}~p3f{jOdbaa%hQ+HmqS&K$xruh5&FL$&s zj;F+*G?IyffADJbCsF#oH>Bguz`!616sf2iXzmnXRiC>eGckN;BY>1)w9t@9>!K@x zUs_7asC?n{aAkE>RzYF1+;+~Ngzoh0EGsK3u0L2RRp$BguVbHI+})U})6vkV)TJ*{ zHpr?yKUrN_F*|qY)iyf0>0{g=isce*hG5Vdt-N(ll&gZ%Du=Q}Pqi^A{+@EqzNvIq z-q?F}^Q>RmBfrK6yK@b>!shNX@mjDQzl<$W>4+IXH?%A0-=!32PzbT5cRt=(Afe;K zP|^|oV64>g*2UrB;pPV8s*tIL#dxJ7Yhb$NSgGg5*&&aZ@f{yjspWY2cHPAphwCAD z?@gsc;9Pl}g`j615Jw;-J44fRbIQuf5_~>$+H^RBClzXX&yrLc+q%Yr_Rz zXD4ZCx6e__ed)3o4Z_D?UQO_``W%y3i$5J_6AmS(({2HYEWsmPacN9mk6A=a`>&?s zHd5$kF!J*bXpLMa*3e8B^FB+JRu+-zHsPWYD_>Q1dK6ny8f4ve#kNfFt$X3<2Tf(= zxw*Mrz}KbjB;k3E+?tw+sVVQXlYO8}ivkqQ;dGFl5E#kWKz8XC}JzeXG2I9~0>AAamN*P_?nB9pscvalv2%P&pfN;QC8OJ!I z9~wE#G)$K-Z%x-@+p$+VZ)(fP5VY8S|NgzRd3pZ?JUimX*4&|}gR>=9E)5}-NRHZy zaz~fTQJ1z#5^#MZw0aG~>F6?<5RM0jMj}3&avVO^w{QB?+cr?s(a;FGY)zl+uX>-L zSk6<%IOM-J9|})Y8ocyz@^gc91(+`O}~! z;WHDf6W=S9gf3;C$7Ld@@|cSnP7}*dqarEy5>R6TFB$wrQ?nlQmGH`-!}v71N%82@^qssG$@FRHnUu* z45|LN(Nq5cJ4E5G78Rxl@Zrm{d>ZtZ<`w3|&(gQJJowglNR^;SMNKH^LPeAQJi9;Q zu^NNd9T}bR;L8|;phfe^j^DZ6{1Wt>T3;h)aA+uI@5{#J;VN+CdW*N%8X6j29C}|! z7g_?H$0K7*^Gqpy(oH$DbGSLh;@O!-r^X!R_x`;c4I<2JHg^d~`KjSi z>m7X5_Q2}?jT<-U_$=-|cwiWlK+5vZMw3sIaX{o78R<2!7Lje$Un$6y!Gj|6D?Ma1 zjK5Atw^oI8#|eWg;aZ;i3$U}`hv}tz2Pg%VrHirpu@BF^*v!8r9N)k?)MaV*I$of1 zLbW|BTRuNS%j`Q`oSzxc7v_8@@>BPM!>#x|gtaU#qVC|oEl?J|SL z)X8XqB%4KmVE44N82dNoB_?2W@)4w{sH&*r*(@m>UVk%Pb5XTw6EWv+RAjie7;sP2 zax=H)%7n_EqVDWYN0j-+w;IOD43vS6br*iicg>WOnA?hOSm`A@n?cKI!Xpe58cx@s zQUd)DsaMaQ;dhA(3xp|uf0Z^V!}#2gb>2cZI@34tSU+=jcQ=z5E?qi4Sh|fJTgnL* z#}M=>KK^-po~eDYK({~`*2F#TMug9^CWem%L@2PXg>58ue-Shh=j$vX!eQ+L8 zxA7PDuXR~`Q{JFkYOvHLB-XcHrB>bran$nTeP@2s+_E#yZ11U{uoFRvmV z-)`o!7`9nxzjiWn@9y2}pGF%4$og@B)vmIc!3rFXjEwB=UQ+#V>((uGb#)-p7c&7& zLPE_#<|eI|@bEMle*T0%DX6H38+UVG8-AGD+iE*r<9=9+-Vn}$iA+3jzU|XS8oB>I zARwxKm@+sW9Oh|h?`z)^SD&1tH@%N$0^}3;czJlXR0STS5sd`?L%LV6nM0WEJEFo) zxTzTLIXNC3@20AOFnZ=q@a)=%MU2-O)z2aJ15W9?GvjYi-P1R-)*dM*;ax4m|%* zW%__p_W5(dq-VXSw^BdzTaB0Nw~*QuvDL`LWJlj7x$0L<>Ywcn%U=CsqTM3-8PqykYK%kpKVStt-|Z9@(nvnk%x!J!PVirzUGXh1YStjxQs=-td9J&u@}cs|X4x zxz*mVTmwezXrpS=XvgoTmX;RH+%OFX0|Jcjn1km}l4hVu9fmbVDLLfdr068sA?z1y} zMIk`xv=q#OFJUAG?P*8!BZ)0?x~f4FBrqc_}3(9&!JmLj#*H;elnm z!p@CBl4WTrZI4o7T>X}x0or5YoG3$XP7x9Mt5;_&8<$eNy%sxZXtTh{y>?Xu_+zKj z^b8DLU0o&IL+6?;O-&@kA?q0mnaX!5CMPE^j*;HUqVCN)*uVXF17TKH*5e|`sOe+M z@y3Q#VVX+T8L)%HcU)q_O~+XINg1qS?a;B z+n*u7mnSMNp28-F#0QT1S6QWkf&yIM$K^(|!5p<9rRuWX%r_Z-QLFU5I4djIn^8ty ze&M2KU}(sDyNL==BYu7~XOW}>9c6nhmRXEE5&Hmc0#>rTR-{F&4(7OTtJd3ZPKs7) zgw0*OdUaWPVr;A`EzO{hPSf4|9G$CKmRnuz;owkQSEqCTQ)FGt`MKALov>;y_xArs zMjr0?#8{q{*XT%&p|KnvkHrgqaZ8JVtvpf5)O&ZczledbDZ#pS26@x?eO~R!%Jy8# z>75+6)1z%w9nXdJbjH88uUm-@bhdBx~2W7ZP(=zU(cN1thHY;@lk!2_kwB zg8K3tb5cd9OpWRlP*73=vcgib`K>2!e?r+Wb@x7MM|UX%r!3s!pYqr} z+Me@7AGo@^vr-UxNq;;mJKt_$I^JI_EiJ`_#;o*1c{(ghRG*$Vc|Sm~74F7yu(LC# zJnAbI$$@|h>>V6vS2>fwnzE5oGn?q!w7-(8y-Qk;}tjmO?Pzb;!!_oT_)JGj`)t#~%8H!^DWmZPI9jqX1-pa#p;{9Ynxz&qDcvS1(Rq0s z-+4UFkCz4p20DpgMiDs_zgG8kb#+gj7-$hd_d9j)xN#~|Q++*3m6enP!unATAkhw# z;^D)Gr{Xs?t>qP-gHUh2Orf_|Eyer%*pGcQfrs)j`vFT0FqG&Y3)}^jsVXaB;t_3&rR571DL!%-zqlt`)hM=`lNJeK+f{JjT8LmGe(=I z3GC=YEYHIUXAsdkWSKxj(vNoo9`zp-07>l?4wP|cxJbKo(+4>IdU`iU{6`qZ2;iTR zg1a482h-Ejd&6tMO7`>>Ii!FYH{B#yw>jP)(upf`67i9imhR~2K;_6cR7D!K-urEw zt-v8OfHyulAUs(;x9rBlFxMr#7&mxfLTEKr3*v#*;wCn3?x;lhXDO`e!{;<_zZyq% z#Bi9i@bK__P+0~k&Zwp}JWk7!j1F?M5;yP$U{73J+$jpOuQw}`1>7_-x!Wc2rAhBc z352B{zUtYi)I&6QZdf6B!pBUiLHJK zT#oGysRZXy61tEs%k`DT%(F^$m(GNoWqMxz}N+Gx`-l>1ISui8t(p6DS9%On~g5B?vwR3a-ddB_a*|TTT(s-`9 zjNWVnObkR?uU{Lo`tVx}fB5j>(dGvHH~Hj<&Ke12TpM+D8Wf+Al)_7gy_=?@g(ph~ z$4e=j;}yH$@K>orcXX%hTDZ3TLnYL(nc1Qv4!R3^{q-#c9>nv>FGU$^%?Cw_;903K z+LA)oyE{bwmXrxvPF^01<+Z^`R{0&Z-OTj~&&tOhqYzx|FHa7mWZKx24J^daVo`aZvow3A?AO}{r^<(_0-NY#6S2w3b!F= z0h0p-1;s~KwMBdo=YnkBmou76mlpV6N-Z+uUBM(Bj0t^HUcPwYMQ#{Y`S!0nu#k7} zb`tL5PaosLM3nL2V1y}9KSlC`MCB7G_4DUbW%ncfXuo; zP|UTyjNtZzq#i#$mZ!kk^6-U{@8NI)VywSj_gSI?3+dwYAtycX!*K|}ad1AgYpB5N zP|@qZ1~Otq5UQ6w8Jx(G#LU;J`_Hp?TA7-mM3S6zyJ$BbTpW6i*T2t*R+!bHQwre5m`GgZi`3$J~$9VP&26PK)>muyUXM0>+BzSuU=T9>~!j|;f^F`rE|Y) z#9*b>96X*w+1nZ9Z4@&NzlXN{9St^(q?f1JfvGu$ykFa26xgr_5mEJhp>yVZdoQz} zoin&M+IS~VL7di^6DHro-YJSP1^leMhfLlT=d4Om`LBay@B48iR=tCqkbS@U?wzjn zHt2+uiu7MmOS3qx+kA-M@fs6^;;tE8f`xD?5;90Su6CaR61~23;G;bgG=xk=j|P*_ z4Ff@}f0Fcj292bJwxU|T(CCk6Xzw>g&12%%mu>sGg$go}w>`ehrDuN?vh$X6dHPCq zGv6jR{}24>T9|D8Ktk1%22uuvtKE`-RT&wqYz=$q50FKeth8(E@5LXoi#IdSir4!I zP)CP-MCB?!g`D?E@ivLoi<;3bAX*1j z4ZY3@tv8W?2j?CWm0N#&%ZTo_rz(6e+P=hYKrj`f^By)nBKk4;%gLtGJ@v+=)j>(7 zKg?bGx~7aY&jynwB$oQUM~Y2};x?ErzjDpg&h$RN@^#a3^L#FAsH5~OKPmg-#go3G zZrHiXzDcO-@z64+MmJ-lXSdqV=?<UN~3nnYv$`;dSYF?(fI*P8xf)FEdf!hjv*-*OFk!On0{Y&4Ko)Z9;I$S%4ag>=ZRQKF9s&dE zc%R9ex|S#)L7`%*!kph5yI6=wa4t`M&QoMRBts&zKU~ap(D~raVwADxK1oiRu8+6w z_Ub@nLF-g?dO?Lmx$oTuJzk%rPyZ}+4f)kO=G$O+r8sc{Mx~8`A9Y7|HD!mRg_?)U zp>l$*k`321v@*|b5(7yl@_yT$tSi~W?lrDKGA;ai-&|a0X|70S;wVJH!nLo)bXU#3 z_&!?I3)wD|L?u$aXY*9rHdaa@}k1u2&4=A>mryhNwP0|4oc~Fc! zQCs*O{>=|!MxfZ1*)u&}>`KJI@qjH1FaK=+!-|H9nu{^gX8xR-xGvsG_v^=>57w#j z<7*pKyY&8X2p}&253Y)@4tm<6t!ivsb-{sfx`DO?!p;<;SX`oj_9Kv-=|~Y-Mb88< zDC2JJ2cA!`)@f7K1`izG^do@xHCT9y8r&TOpaT1xqrqnR1XFvSAYZ>gr5y*EB(FVS zU7eD70wE_R;PxReBQ~_&n;w4t5?Xxdb$C{a-tS7&t;j?=EDWvw=+K{wWfUEJQ)e4| zfc`<35&@!bpROB5#>U^x}iKtZ)^mO24s5{#q zn)>*0BK=meY)6)2itG8hP#8{rh6D?fwJyf)0aZ8Pbh6hxj4Ps1Ox}-(>3ORv>|qEf zm1g=wA2;mFFvscL^mSzM)Z1ge+gW+>6PVK%_=&*&?%pJZ17cS8x$MTm2W;gWD2l_8 z%wS;#l%TdW8P!}6lR{z8zpwEscy#e8) z2Wz2eWQ9lPXeNauF-0r6o44|pTMbgI`S09GnP-VoF_uBTh`4?Vh^_WWAgM^he-csU zRY>gD`WiMU`*HF4QeBRVu{47_(%XKF^ zydvO;|J5^DVSk-K_S^C@MMby#oUSUe7BR44&g9<#z{d*q;&jF*F@?h{B~}D1;;q{gh6wDd+|{>4~dHH^EiWi)4!+pN8I$7 zVZ-SApI%hZ>NUF<3L1vN5z*UkpoKEEzkMcZM9mrfy;004gzfZyz3`m|7yL@t-f{2W zbLVWMpyax;8yGlkb>eR!x($Q~xNx?I|M$Offk%zUZ~H9e<63YQq}cuCecr`5n-ww; zQkP`dLRWkN%ZSTp+uzPIOA}lVsZsO?&elDgtv$@ZmL#zT`ChSSJ-}W3EKozewAIOv3-XEy zI9ua`KKG(%e7^!WcTtjto{^WjWd+xsE5d zpEL?T!SsK5wD{i_QT_Xo>;J^H01?b5#h_ZLFew=s;Mjv}mVZ?i1y6FG_yDBsKb32n zmmMkrn5t0O82VG1JHEkI9V$;wP8u2-G|Q|+Jx^X`_7}(kV12kkCMz489JTYw9%@AB zcY*?_^cXGYnH)E$?f`7XNIDEb6CyP?J$;=V7eK_}aGzv)kdj^9$Mt<%7h>LnasV|O z0s?|EtBD_Zc`O&YR98WWiBY0A13oEYo^D|1_wV0>sZUPa>?CD0T&yN4C5^iVKQSY$ zBbxLuX-bejHag-T9v+U3j~^W#Ztb>_1B05GtsoGPw;rhfKY8**LIV4^*Muh{GgGJ5 zBd(5Euu+YT(&*;YLPt!0e?JMXguT7JvU0yiFnxS&@%Hf^s^8DgZ_N$_kCL4@$09$rPTQgBCihTV1<~;EL1Xo(~>{0AHIW>itWr#0M zuI_Y4Rzo9RC2K)(=@u+|XqAYFh@6}pq*Rv_S9&1CSxANN23us3FCXo!WGd2wMu-7+`>CKo>rsI0208u8N>((T|rwx#?F z5ApEXXAMhN=G4z4-^o+lU%i7J0Ssn$vM72NDL!_*TTC8(`-KdMb)2o?4FF?f0y#T4 zq=7VbMg}uTl`}IlihGIh@|ILq#=rU)925kqT0ucUt>IvofZ)~wIL~o}w>rZ14WLC& zPfuRH3vhWvzQA9qP#M2JrdR}Ng~42c!mNMN%4Waq+OKU?(J%^Yiw<-oJh{jlFgspH zV)&+~Hw#koEG1%!FR})}fdC2;x5SMM3~nV%(sB#=?-?R4!4zwNj?+8;dYF# ze9!w{leOjLX@T4yKZ5F#jJp$MK*mu{uCu*;Rx#zcoV!M%#bvk9{t3)hSt*p2xdtSSoJFDM zG(i`NstQ^!cR)q98QkQUAL=-^ernbUcy#~MeNoYx@89nU3XTju%88j?z=ZA0poPJx zj(+DQc?mnZiY)*Iy%;MjN;CT zzcEZ82dSHtG@`J|<2vx>;ttelPv0^yI0!^9JuU5n&-@fZV&$WtpkM$Q(>Z_-xBkI$ zG75?tDdOJAgRvYswQF$5o<4KH4Arv$AZA$uX1d`!K#baQ8q>6e4WYxmJ$fL&EG#X0 z1zVfgU|9f*<+d|Va8Y94^(W{NC!c!0o_6h5V0*#9pecHUc$yi5rUZs&cL@n3ByyLF z903&5d1L(Ey?cUQr$>NUC?c7=KVIDz${4MOtgNiWoYtrVC)3i>fFz*y-E^PD01fT3 zx$OgNos?8FNcX$Dxy9D>tnQ1S?I~+$i~`YqdVRD}Iu<4?g7bLt{(8x|H83@Af$qobqe=jXwn zpx_f9AOG{`(^0%mq&1hHNMob}L0uvQpwAld*8mTM`EawA;mJo2)oCuJh_Ifx%>?rw0YpC1lFd)VXYGaN3$L9@(-$Ms>A_ z-3GI3=Y`kpzB`Ga+LMy|DKSybdPZJBA$bB~q^7<;HR>?m8UZxDuTP2D{Fq;v00126 zMcwvx7CMZIMof5&jEo`^Vx**{$HvA$Ew(#FT+!cOp2(Y%@H=7M>0d@A!-OH`IzPIP zX?slu+7W${))M2P{$Ze5b5Sm5Xtga|Bj@1PcV&YY4_$4p9ammDp?J^>18{?xj~^*^ zuI{8Q1M89o4o3mon-3pG;BH|GT0%_XUY)jYz@hJ&uL_Pzz?6#{>R?yb^XksyV`5?w z62^LaA3DS2a?fRW5r1jj*4p){5}Cd-o5Xwt;%R?@Fkmmfh}M3TN)-em3jB%QRB2G9 zYUR#+&qgWhM{`O`mxTSY9vIm!3kJb{u{*e`)x zrRt6-NhyGu`}^bCT`f~%lb4s@-`@w|meccTV1st@oV$#6f%fJY16#8*@$|II$|DxTeEg z-}XU+zA4Ba_OBpO0Gjyk;rBpK-4dzOtQaVIRrrFU*Cp)O(+;xf%sE~-z~S>EQpDkF%T9*@85$K;G;&hpS_);kXY{WE&j=3> zZ$uRf^0{kN6jv-R&bJIk9KmK-w8aNagU=vt8aZoWizdm(IVD5;O{^i-S=}1Hp>3;zIxDCshpde>TP4Prk7Jj zMbZoU6L|y#06h~!Q&U#7q(giRC~Iy#oI#!nIK++Fx>x~i0xuq(o=iIQPjG_HCW9EL z_u0w8ftkEfN8I){vJB7tA(naN8$lma+@TdTAl26M!8)!)iq&WLMD09dRnSuF1Zu`R z^P$=~gK(||G6&EN+I?sqB6Z8u!Jv-{W)XmC_1lkntcE#_8edNglhg;CXe8|Wp84uy z7lH;xa5U|?)wCHjNaH{V%CI>ASlim-MC~!uWhonT#qBm%d4(U8m<9w8<6;XgMAC9% z4PRlWM&Q)Z0Uwu?jEpM8*rvP`RhjErP*g-jgoo#s=(i4(^;8~1u&&b0k}h=1^Zutd#6e~5bGd7rgG$;`C*ZZ2j^?_L z3h2vi?%k6_?-rMX?oMl|S=DzkxMZZH2PDfId(K)b-cE&^ZC5PKXLtL!wmFoSu`n5l zT#fAH6YWGOs>E^$olLo3!oOPV>+5?GSjka=ZZ+HFz#0~dA%ttv$ZbmBqycdZUJD5^ z@iOzC;voOqI8tc(heguiva214@DfF2P5=|4>XD^bv7(O~4S@6)UyH}#jH<`PCDe;7 z4+k*C2Iow^Q_8Xn>cOGf2#zYWAJx?ryjC(dUGTRQ5 zM1rbeg8SPY@07D?DB!6@&WhKhyHrcj_`xir3Bj+lJU z7rggmO{QN1yqDS0ggvZ)yL$odp<}r-FT3yfeJ}Td$k$j5u`Ya@JbppYc+{4M$;Hps zWSjbjpc@+p{oNMYeT)Oyyk0{gVQVs!8I3hqv2bzFe9tMr7I-ZK$$%ZJC;kE;m8slm z{b+1fq0;cPaTrt%J9vd}kBfmv|3Bz_|4%f_|NpQ2M?Wv{f8Mc_IS72u;OmqUR5S+K z)VC7$!FlNv1+1zUdQl51qQeJV4qB81S3tI=R}$$FYm4BOa=gq-oK-iX;<^?egQi`@ zp@AIB&E?)=XK~L#Kak*j_ih%LAy}vX10?8fLrlLgE;~?{R9AZcoI+JbLTa8%1mHJe2@;ZSWkwJsrYgekUZvMoZKapj{4t z7D85VQta5!@isR%bVMy6sC4nZ&q#GrcAocV)hvA-F#a^(;%&?=3zOEK-hp5*9Waz} z5fj2NA?gJTOjk7Y~N!nasQ%6zxXD`dNe|At;zAa;Wvdhq(qq`*76igDY)cwZ7R(@mn$5LB8z^lh6 zL5rE2)r8Yos(D7n#$_cX1>A|38m ztO)Mh8xNv9Xez>duK?KvN{V|6W#YoDJ|L~JXoySpYksTm(BY)%YhTr2Lh^p8$hS(Z zMDFh@iQ1?0WpBumondTy9^^}DwXE+UT%RSQ8{kU@tiG?-dq`@G^1Iu_z_QC_DNOk&A_i)^rZt6Jg%G(1xwrO=HwDJX33=L-p2Zh{bzkk z!3ztNlv7@C^R}0Bk5+yAz6RoseN{4-9VLQy^hDtq7C%1HKs83gX0$tNzGJyq@V7;H z^avHajs8+Qnar32_YTE=K!)OE&+Q z0mtMII*oUjh6RT-7~jZ?OMkmBq$9`V^2(!EV{32amw9vq(gXa%{NDJ zXXZR3JG`RwU8m9#-V~uvuIs(?d3L1^<6UJ!vG;1WYNP9vOR-$0Uq--vn>FW%n5x&b zt%YG07VI_8@}mDJqGBCoOI2*qiPAoOUuGd2_i3tw=5^D&Iom4C!j!d3MD$#it;|&h z7h*Tc0LQFn+`-a}Z8ypEaa4Wv%kqlDkvQeTVWywL-y36bZQOJp)^)@!&8}0K@;ivf zusg7`x>u{XJ@jO|)@-=Vj^)5xA;-3z)Rp5JF{py=Vn=l}QeYm!y%(yG)Mm&|ycpXB zd1;(@jP=_GXT>M)ABebnlpXC<6ezsKvw*}mRRj{WPRi}83C-zEykCfjb#KU#dV6Q% z0v1r%29zPvzYIU+{?LNE|b+ZM1v`B(0 z%)|Rst-mINO@5(Tg5O99(iCca-4SQODzObAnt<|(U+knF(;`lZo!YsDv~luR_@cy> zZy38Obr~+zENh5GUHHhkUO~JQ=%1=R@}TSrq2irZHs&VkU@YF#V7juuw)pg`#>hFN zhF~`vON$CM!hwTb#bG~$OxW!uqx`Fd%qgMk$pcX7E5mU4&L8gwY&NNgO>J`v zI_HG=C(KL!-l*{qEVbC$xmmW4+e7kOPCE>i+9@f zaRHEym7i3t+j9(R+UpmcaeJL>)#mB1$u!0^)attsd{j5eT-RiLj5oU6=st_Ao zU>SCW5E@V&r&Ekghj07rxSZWlpR5kOf!ll=eDe$1b*^IzFAm$s-9-jdDp`_%gvC8u zwxq5QH9vfb&C6j$7{9D&c|WnWHu&AfP?yu@S2Z2M!^ z!zC9*o-y1mx^dp#bxy@E+0}!C_U>H^pMv+xbWkvT-H7#7S38{vIYL?6af`A;b3=8do{!tFC3b%zAwd z9Px}|EUB+z$xJu7`IcqETo~0nP8Hr2uL9LA$9L5V3!)jX$%Smtl1;x9wOnP?d}ytH zF4{ige91S<)Gubk56*TNEK5Fft$DnF5rK4$a@M3WG`)YDj4&N9+95@guHcSIyVoRM zr*~1Ha6ZRm@@X+SWMest4W#vSh2t3awh&ea3MS&+=bX48b3C8PoFo_}cD@!I95+v@ zY-V>Y?gA&IA63y*wy82vqm_uBwWTq(-|Y8VFuk;8(oqr!@_!W$=(b(LZ-(E#@40fX z1XuYpixSVv8R?>i^{HfuPMV*&O7jwmEUo3yy+|Yo$%{W-4-q8!Z)v8@)310PUg6H7Ycdxu7>-AI@UH9mYR6?J(x&de@uAD zY}{nb3^iVI-Om$p?w_gHh1q0m@dg=<8QRrD7Mo3MZs%jRCR94(B77-__|W28PzYF> z%X5LrC1b7sgldJXYBM>2ADN<#56?L1V8UA8gEmko8d^8kIaA;m((grLx!BnB+`|Nh zoZ`UTMjaSqzydxDm~ngYeRg)0tO5F# z(6F%hu0>F3^sPs*|Kt`C$sRBp`925g3ku01BV%J7-Iq;3gAzMCNCd7C2fTju%D}*2 zdEd>c*#YEv?^6WD$J6GhXsW0f6{rp0S?e?50i~kSFkGM2#}IaBJUCgdv8o)Q(NUNp zjdrz*t(_fL)i_RY(^Y!*Pa}R7pzNht zZ1U34kyjWSAqkk=Obila6cpd+Rg{$U_!8niy(zcRooVm`CHR}-%q%P%>V=@#>ZcxJ z?cyRJB&2aO!eh6KUv2?u!Dl^L?Yh4*0P;eos1VRYRlVIz_dGpvekz{Ve0XhtU#rL{ zG|9r;)KtCDK<3pe3Ss?t6DVqBt?uG%^AZu|Z5EcOjw?}ZzeYwz#MF(AS!#A3LB3VC z5fEQO7bv1k)wq|vy8o%o0DRD-q@-jXnGCiMeAL3O;?4a}Qj(IQE?Yj`v%gCn;0dlc zx%;0sCTq}(T?rs|b9f8Bgfcv=wwM+j8To{2Ix9C<jy$@8HRbIW~ly0Of(WtSWs%>tTa%z4*I5>#;+TZXn z@b;Z1afAch931w*H@-R}h>3}dcf;N%iHbU{#r`2`SX@?Cx7#gzHGsgrAS-LtmrU#k z6p7m+Zj{U@f*RXwQ?P{_(GD6kf`MwGqKu4svB?#*Le#@6O}1}9BM#=9HozM1?1qE9 zS$%!|K$dFJYEqEW_cU`ldU^x9k9XPF0HkU z&+u?h4-fF-YMEVtPfbV;;n{k6e(5h!zN@__-32qY$4#;7FY1Ogsx;!yvH9oPm ze+GerF)(0?*^iZSzILrVB7#;NN`;iGQ~_J@DZ0B$^78&%O}Kr#?dsMv(b}zKLHfBb zTUt)%=rW0z1KIvQKd+{$%C5j4`vN9FqfG4sH5o9^!Jm2vT%Hbz?cAmWR!tv1S13>_ zKKOhlzMl;0%_QrwY1%n9KbnM#OG?R14GovRzdO&w$VlZ>H(R}+aryE}=nR?bSz)?5 zJkgYtl*J}|#p~B8cGDs22JXZ|hi<1nMg=T#1aL0cp5u8B8-B}3lzNO?&$JwrKWyYVvpF%)LzGu zl9IKxwa=eHmno&=E6!gEu@XzvNRj1^Y1v720`A@v!o!>#N~~E5ib94uoxP65-k#rY zS=np0T%PGK30a>4i3ENNAM4R0yNPE?4;nxm+uBnMJigS?+8WyEcm{04`I@nbiM}^) zmRfkzC^$_M27UQs9iLv=f<0=Jh$Hgg2QN-6wMpJDv$Gaujtr;t$u}jq;cUU?-^svG zB<`%kAB&ge34XIgXVk}b@QGiWhn+nPYA~g$9kj!ucD7!abNWCKZahJ1xSyLlICYGL zg#|kp*)hx1IBPePlPe&@Ng?V*d;9o=mZqkripq6PlG}-iRS0L2P2lF`RnE~ZFDr|3 zvFyFm;|Sdb7LK*V?qwE1iToZagNEsCXK=Eyv*UA7V_A8|am7ncPENue3Q#5Lc)oVd z^fceI_EdTAc`j*b!%Xe3@rXJ?gjPXb-l*ozmrn`!dK=Rv9ZPyO$kBq4I}c}a>5sR@ z$4{T`)iO+} z#Jb@oo=C5a*!w4b$@$;ITRS@Jm6Qcy)pGTEaFG8P3{Vgija+poGK2){Y9F&Yq5H@C zV%yO8_&$h1nj^9`Qjp2@$YYXj!JQC4{DOp)kx_{*HzVUYR!c7hWf#5o%6FG_MSeLs zle=0H2M@-uwe%16*6UhW48mM2E-v2BOz%`kKV1JhBkS?o>FH?*jATb+M=DE8CFCS6 z0Y zyu}rQn}=qPUpq=NN7xAj?vZ&7`Gy38=a&Ih#}77f*9msTak`-{VG+r~%B0c?3WKno zLdk%P0AOUWimt#3>9E$*d!08)fVGK%i3#TP$Iv|NtJt)*{-f3ci(q4Yb_4%+164s- zL_P0vO*Ni=Xd@5`0|PN83^6fIGLI6=a~V%0L;+}w2JNsm=#`_#zG$|enxLs}G_ zntIMY@TUh>79I{BAC5hV%gt=0i6^hP_B_xNN%CkqE3tcBZPDj2rE^LDA!%t9*;6f* zqVue@VqX#PgKBIv#&x7I3^4~LR#LVEi^rZX^&d-|OTK+>&s5FjpAqaLTleJXzVKk7HZoH^aU$4M7zExEudf_877kzjzL|_HRp!FA+60I2 z&7utjtEcNt6Qi|rxIVMbYS3NRuwl%yvdbn(%g$D{wBlpPC=vMtApmJgm+v`CLaJ9nnJYTiJZsd(aqYNmFTsXxM%8XFt&;ByaCb5xfS^_5t6qm+9;k|rozok9r5 zdaK3yv15Jj-X(vyu71wy!TtMli;JdZj(U!c{FE9&Pv@+g-7i1xiF${GqtdNPyXqF3 zaBm@`f*4KLUuPuQ;IZx6LY9{jz)OJgAt{#wI71@h4wix~WTg;9?UO*D2`hzKXj4j6f^t z>T}}XUzx4d6e-cx(U}}TIT9iNQ-vdnSiHAwGNcH48kv}g`>)D%_*n5cA|K`@POZzT z+Wv&J);{&nrXe*`WSgz!Aoxjt(={7ymPPiB%E{4*iG`4r@rjA< zG9yV_f5WYoJ96`La-v#n+S+9eTX&L))-EI?8nf|(8{)>c%ipwlaa>4Iscnyp`*TO$ zgWLl;?BOH+2z5Y8E;goT>i!ajI^2G3en+8Mw25Oc7?VDSlY4Ye!xqs!#$`U=rVz;D zkMaSv^m!+zC;bIat-FE@yMGO7i7DI8mNBEgY zS>ZL6-Mue02*S@8NE2vuWPO(k^Ov~ti*fSFri81rYlh(2b3TrVi(_PF zR-Mqe;St&uXI1Q9EallrsWToT8rYB@r<;^$bqZCQSYq2$m^zIWo9HwD;GXrncJZm7 zHpR8r=txCS|Iqz}or8lw-=u;9U+sHeUBFJVs@S+gegG)?dV0Pp+*c<|OiYLvmp1qH zRa8{OSBq3BdqY=QKbVs*Wxn!Gz1$UT3skW0D$Wn${W}%ZC_R{l3~#Yp6E!;BjjR4| zPzb~cne_Jedt*nV>5!0@e}d9v!%8$!eb9d;zp#;Y*DmRW*$_fPhbentOMV*4a&@!( z>gwC_t9OfwwT0tj+*Az;%(*pFInwPzu3fWkED{+%>^%P>RshmT>}x2}P(SPL-?@6a zS3j+*EkR7-Dv6*^8O*@$RnRHiI&@*FIf@hYDnI{=sNRb^NZM+*wyfXf`DT`>oui$D zQxAH_=AgPy6a{DBUsL?P2yqv_mB+!!2U!ih2Mg$w{F0@gm|D z5h}w!NmIVN?uFapm_*6-`Y9a?nyy z8CSVyLM58pGg{7lL$MeuFjm08fAwqAXy{Itp7)gKyP24Nybvhh;^Lai2IhKkWI7;` zv+jJ7z-CbyNpU~t%^SXE=reZgII8>^;oUKlqX%N91)4hL+i^=qo%h){$Qp?RLknSF zwGuu3g`fz^p~SqnkxD3TQ6e;txewQre}8!>aE8@U`-Fy?+B^!$Z{N`5?%1&dA9j&3 zXOc{GttRrk^-zJMvC8XHQwtu17y%B_ghS7R+ ztRCkeYVYP|6|!cbW-D^+;qMw&Oa6Icv*=_VgXhcWcX3>FH`IAp_U;wt=bxXOdxOZ@ zL>va5>-Dd(&!9u&rlYKK7?KY6jDlVk6=`rtNJ#;SEBnLkb?ps@GQG>&IvuUPz_<(L zEuPz#cNGyMmE+^%3hQ4Z*nH_{h7d6^LJ{qip<%)t-&vg} zB00A6X__r=1E`Js{QOX>0fFd|Ux(5Xy9qdu-97zW27i*q?rcqndj(gmwI1MFhqzn8 zAiXnkd<{Cut}9!I>i;Hi1{CgZj~Dp+{QtlFC!)y^w)QwmE?*%j=^uFg+Gc~rB_t%o z#ZU7BQjzds_bh8%!K*;E@-yWahwk6Sp_FQWygIr&48TrPZzsX^Fok8HQFniTm30GE zKtKRp9fX9TOd_xe*u^JX78za%3PKS_yGNGm&kk5F(7?!v@HSssd}vs74+q3utwIaO z!+&fvDAW8K0`+q4T?K+5nS_jQL0TCXH;xMliAYEsjWlbPG8xpQ8G3-HbLLt|2sIT| z^QB>#dx*x|NU3~|f`d`m)a!Gv(EJ&9_xWgUSS5@T8kX=k@r=3YS`fGNOn1G_4)HI^ z!Gj0d_6>IC>hi0u=Npw=dueVlDCyMurllOhSniW?s1l0Avu;5C*1o?_Qi)qQwo`l90g`f;v0!+L1?hOwMv(<1!4eCMi1Yyp>$2woVs!Nkb zx0aBQkdpE;O~sAXz{sfT{GhxXQrnDOE?v6h==h+vwpN!Pzxh1My8Kxi+xtCJ2^2$5{dmWIa0w?Cg4uKatf>09{B%#3n4>(?JYctcYTU-pEOv9=BYPe{Vj(uyo7 zIPdD}>hJ$Vlxa`rhY#!Rap_YZH$0HAJNO|6Jr#*x0q|4EV{k#z*q;hn)SfYL9?T9pzEJ z0T&G3UMfrpt19wjzz(NoX2zt$o%fa)uYVaG8>{&_l?!A>q@1NL6H>;B@$na9#NPw> z=ia@007R-x%}<{`$^>TxaZ1LH9VbQrMxoe3ca&(Nrw8ETmYQu#CF+qJ-K3P1Q^#{r zYJvcy6kcV1jP`!Grd8jh|-#PbeyG-bxAOXJq8|y?Zq} zOtD)Kz$DSJn}ubW@@O1T*-M(5w2Ak69D$bPH}a;Jl}SoVFJViLHUX&%3?yI&(bJDi zOf=;kE$CxAx%V%4q-bl$w+>mOL=J|X4oLK?Jp$zsP&`;x zmgoT~Is0$>wz!BJOq#9^Sy#aPGJ}lV-QBUwk<#5yX1CQiUrJW?CrT})^r+gW$GVO4 zUG>_&h~hM)r=t@#trV4zu(4NlH;MsRNKb#}7lHuzvOV=})1XC{NL_@dm}^T%M?qns zYgg-YchSI=l@*1RX>otO^Qa$CK0CR%aL?3~_iCY;0ED-biD`kH2Eq1CXciES%~qk# z71PQ?M63jaDJ?}r3NlHt5P$W9d4@$F-<_|OOjJktX_s3wGQY5p*x89~=BQVeojtMk zW001HhD!ksvnNmFhcA-R*Dd-X+U_Gzn5ox%^CJMO@M?t39zCySt+TCkCxiqCM?L4~ zkS=-b%Az8&X_J4!dcf^*D~&3Yk0GqlIb-Nv}N&l5xBi zY;kABZDW^B)@Cmd2&e^@B48KnE$gPvUqO2~C>cbQw_Q|IyP3aQZYYQqN40HRmU8OR z?*|VajL#SW7z4}K5_M!bmC5^s?lBcY%)Z6BIm1$iPE;=!WzBqjt3yJR_4OHNT+7O? zL2dugs6+{b$j`}aIPsLyzfSj;;P%8_^E3jquzM(FA^R;#e^2FURZ8a8jy8=x$mJ_+ZMSE-S&Mh zk%rcVdGx4TKC5$_(JMWt|T8kPlhaOmyOb-TfUy8UXOCQ{px^wLJw|NvW%~c z4Wsj&gdS#?d-tsI^Bl{PUdy>`DdY^11r(cAkD5{SWpW#QGk{|Oy{HCo8MzP}LXu){ zz%}1zpInRt7Mqp^ly4Z(+Q9GtfI-{k2MVcl-O=ee{Y!@M5tKFvr+*LUM&!Fc{5Mtx zMa&*81`w0jad89YY;0gLQc>-M_ydmCLvzgnZ}UKl)bEA)g-LL1F3YEeyy0!$!8HGm`J} zl$iPlu`Lx86xMe=#Fmn^{)9UX>3+>e9&5QeIav?eak3TwTI zYYTHl;HU$~(LK!`Kw%?HS&vhv#-VFZcBjLVKHHzKI}E1~`ZN@Vj%9)S^wj;cVO(@L zemv;d-9jJPl5d{A`1S*i@Y1m2f6UBAC^F5>k+hl^7#N69O-jw+WAy|cxszu){OgV0 zQ|Gd%{wr!F-h4_B*E+aCrEiBQEpJ*Zr(dlSg=>3Cv!MF3HjPbUC#<7K zDhCDzP=3?^*VW&Y;JknXP)=4h!Dw?gc^ljCMVz&$G|)c(cz%N(^i0N?`sF;bLZx(& zjFh!CNv0eW2WfGl=n`^!rV0xS@fXD+_)7RC9*v(Nk$pYtR{!Z^l z%ocqbbocIEoF;8~fZN* zo3B@KDu+|ZRkfHkAf&cJ)<1cA=K|50j!sH>>SuUDKH>Y~qRkiTw^bK-OK7}>n%s!z z_w0V*z{yt+a1sV!<_el!lPA93=;AWs!_vW&?iOX{Yh)8*U|~5~660K}$N?mdG||M& z>{Kensm7$JS120>O3&&XJxbEg32<)QD53nEC#fql+H{+QE|4fL4ZLS#F*>7b(!++z zTUOE7cz1tFX=y2jZ^&L!%P_fBP80JjrmQGbV>=J`@m+Nv^-uD@Y%9zvE(Ygo_f3iC zS|M$MRc*cFhE~Z*%|(({8?oFdBQvu-yLNfuWCIP3>vx?~xj9HW;mL9$zGitX*?PKY zbAIXQB)$Ho%7+ibH;&p8Ig0?O5YVoJi5>N8Is5|f9MignOWD`AgLcKifUZP@gouD7 z0;Vl4&q!+9PDp>rPV)yk5vjtp_zbC%s2Pf(lE78yhg%jq5f|+$ZBUENPn2T8lH=HY zi2(|m>wL$lAcTpI0>S&b2W8^qGd74M#@uC?<2}Aj>CKPw&ClgwttPllhkDZ{SEF=C zfd&xE+j|)V69d(jfLmof*%IPcRa>@`6@Kbr+_|%PY#!k9eA_TybF)n`ZV_eUKHw=E zQd}z`Nv|(~lu*m$$IZgW$4*O{&RL!CE)wVx*n7O&#KDt#dJK~^kl^$`zEp7RZl%{( zYp5}f9lKJv{C-FIlN)~=qCO^lEzvS{LQpsmm&)?{OwgV_IL1}&3wsFq;prmTB+g=q z&1+4g+xD-oI7%b|s&&8t*rpd=Nq{8L1f?kooXeLl<9Fhm1f+)fG!;UsT+!gl9-3Co zV{8MDMTSG}7Y##Ves86Lxi>dE`yUGLEk*NK4hmGnU??2c4cFBKd8sRD>e$KXy|i<5 zh2t?Jtn~5YWOd$%bCwn|;oseG(}wzXZ(3FheEnMYr~9x@QhqV&26aM*O&KiFJw1D* zU5^OIQ_q5cA1861(2C)A*Vd+6cHe@20P+HTeWmkJ)}#pmO`>cYN6wbLO;?VH7V*D+ z{rYx)$`H=~Hq>P@{l5$9TKstY|Nl_e%#`&;9sJck%k#E!E_C3Epkr9A+8uUHVs>I| zEQ-;Y!1OCB)Ab+E(ENuW7rY(+X;SCFYn%;(-V-U`zk7O;)twyXAo9-z7PU_<|2UVU z%OBIi!O0mscO#Rlu$RiwDGlLg4p&u1}h*3-6KH=pJ;D8Lr)^-eMQ>n3#-1+)a{de!*rz9m!&CX&- z)Q>OkO-`S-`YdO}jKE^>4(KbV|D?p(gfa&|y8MYq?=KZgjo*sY1up0nTx!lh3=+ku zj9FkU*7hB#dv@=(W^$hlppNJuD+a|2{*HG*?T+uS@g zE{-R@b>!nmP_F?8l(+4h>v{cp^|QssgM5U>S2AxFm5zrj3Cjt}ueBoNcmwabhPVuM zj0{3)Y(Ifxzpzj=$sW&k_3FM>a2SuXvqRK79m{Zz>yN~AzJ0r!mDP7){M7sz6c(*d~d>U*mM^(>ui z4Lr%|Zjap4VwBbyYji?T~kUnu@Kx{lW#JdV!1U zc@&|&tqpRT^WgWE5B!g)RC4^<)@A((f6$U(YSPmxcyjUWRjgxg-C9~+?%d6O)Q1B? zHUN?M90EIUqGFrpl$m{JoPcPaclacBc06*&BUz7m&YyXd`?9@#8x@r!AOeMd+*m^s zbYV`57!dN}JlY=&`a&+e&nUA^0D^S-nLTOmPynrjA}Snr3##hg{DogvJg^vCz%pjn zp1;A~47zd!h@O6d`C-uXNzXA!Zg_H%FG}Tu|H{nhs7*}E=#nF30YEP2pOUkwH2Tdw zB`+O2K9D>gwRN8p&!^qe;Q~TJYwrfvmCC1}dRW8S2jBWePkmpmtk;~SzJ4#VqgCl@ zeybx#pB>?gRZF@6IT-{MxZZM=()%mjIK2x3R!7(tNB9*zmr)@SD|J8}LQyIJETUs# zgczyK8l%Gc93&REuT5$OfIURE+-xF2SVUxFG)A*I%F17aP}2Ud-FS1FgQw?rU<(PK zP35xPyX;u@>^ZfvyQSXdd8DbZg6q%`GqV&|!*1dO2nxziRmdNqYmjLrjyIJ7!Y zqv`SMsjA-ScOI7(W@kT&{|pna@bi)FA}ac-yZZt-EEgA-HZ_W35r};zX%$xQbWb)b zl5g^YA|YVyvjvW5J^mgfixXGGL(~4j!Hxii6Q14}%qC#)P@U}u=5eWU(fO!OH8;i_ zUwrFS(D3~EeccDZ+7(uZX+s%>K9U!zWulT?no!tK{V;|~==uvm6%X6Wuko8bLOq2><{!FU^B0Wg>fs~^wMFsqL-l5 zAi{Gs#B~a2ZuQ4U&Xr;yB+3`&6s4CVb{M1?CPQ$a3Z2e;$@+*JxNL+ZH zHQ?obeaS!u)Cy5ES^bsleIXR5>%jUyl)JE)sp70eGy3TYNe_7+h zk|trofQSI0&~6yL^ddYw9D;}aJE=_89Q6moJEoLwn#}xGZ2k?EOKw%e zb~4d^qurOqX)MXA2BOq5)hiAJjZ{LVgli7Gi@<~YCuI&?0N#8Pf*5!0sd#S{{S{}^$(77tjUpt^pLPkvaK$oqco?Tl5g`no&Jt|gkgEf%UK z{1ixO^yY&2)T`-EL6#zxm)ude#$k{lPy z0XeA<^}457y5(;RT)5TMuJx>LFM129f1-Nh^z^MVbv3UIhM83!0Ki3;2GELKjo?U} z*P@QvaRH3o4o`PPUty%=Z1a*!F1Z%Y1gy-FfO~CrB@q!FL~%~J@-BSct%#?Q?cUvX zaLiFv_jyA@=N6TP90+{pPX%8UDC)j>@<+TCZy-|M)UzXF+s+a+tG?>f?vR=G;D(gC zp2s0jW(-a7HNHLazHjt>qxJhyR?6zf9NNPnBosES0df`LWuX1Lgw#x~wft;(`{o2M zMNBk%8!dEcv37QbIz~o_?kMr$q(AIXkrTZzJ50E9A5VeicYV~*f^6V}@S+KHZe)$OOl-j!>t zrFA45GiY0(C7qJy$xY93*&;d_xsK+3(x*8vM`r5~AM%pqYzu!@G?{D<`v4!G>UIhCq8PJ{0#}h9ikOcZUx;TW| zQiSw_{Qtr(lYC}Bf39jv(`b{reyf|Qnc4e4Hj$6ISIwE5tRObubDLxi z2QN2wl!!s(Uqmf@Jb}xXXcmmNzOAAd0+SAKWfi4Uv3Ua@qrci)yz1q(kxFb> z_fR44q^7&aL!86bp{p7-08*{q7@iNd3P0zTdqsKOzwRCxRgY#fK+fiC;pIjlvD_ibdjt z@q>R$#9(A%((1+R*XJBTQueE>o?%hlD`=BdP*7lhD+j_f_q0L1Dfv=5H#KGZy{%S(6Bc@3InC?&4+V6hh!sHj^u+7Eq z0MLrf1;w8RD+o_K2^3{;w{8%>BqJju3`G;8qpygQWMx1GpA{MbaaG@F1~D3tc_E=w z!toeNhgiOK>u}aOK4zM0pexWod0yL(5X+69eYK8GPW{ZJ-CKuH`{qHUQBo3$1I`_)fNB)7XTnG75w3Xd1<+qp$V&I2k2ia1U4$0S*y zc8>2v%B8pO-t{vR=1fNZcQn@7#Egjew%AS57(B$Kj|L|#jV*r%T?X$w!~m-|bUi)G zkKKhIkVheU;Yofl(awbS2(fp?;+tF8Z2&_2i=*OBZ?FD5XOkONji+OsFN`M6Qh*4= zcz6&=%j?Oyb?C(lHEgG@O%u&`HB?oLVh0&R#~_V_6Kt_rym=i`uVV4(y>)!(U|VcT zj~8JmR#W&MoThX)Mxii)fD3A98|Y2dG&KA%2(0DgI*b4n<>k>w#tIyNyY^x}M1)Xc zPAM`GH@;WYdV6_AUP3S_hZ#HG1F=mhNHiBl)ErP4TzWSYLEbaKO=2=R`4jweB@~AE zcf-R)wyligN6tzlA!2kDzl4{XC^I>6;siboHuq}7Z^4#9o*}#QrfdUIaFM1()>~w* z>5GUY-Md875U!68Xq0qEBzC_90S6`rfrlXEZr{3MF=jVN9%KCtOqH%|sDI!7>Ujoj=!GI0F^@}FQk3Yl6 zz`YC%C$hD;0`VS)M@Ei^r@GEkSeZXr9#3}ad$@*f-WbM02F%z0;SP3A8eTp@JtcFj!uY)TCCVS-ysVp}VZDF1} zJG`%%#AaM}R~_Ar=g`?m3Ehf~{VFi1BfQT#7=;dA=c-CUDeG!1NgLxo=)A8onBM&5 zEy-}dqqX08jl{%HPCl1~?_5~~o5Hqj+rt0+6Uu9FR04W1KYPRJ$z1=^V21)ek01EjH8@y{IA7G7)F#wd zqbx&uuHS3c|H@L7NcaMb=~H?HI`ySmQyAG$(iUqJ`}<$T9hjAs1-;T7(4o<7q&&8K z5O83kDz3$tzUZ)FgOugw0can-l9!sim$NeO3S$SU^#N<|(Mug+(R_yJ8Dzu?Es!YD zOH}&`Gt@bj$qEWOW5dA8x;n|s%nT!?I_-YdVBoW|nI$C)P`Kcr#NFxH6~CX4555EZ z|54?xju+?4?A}na*Atu0d>BoDS42ciq*>q*t*)+q+UF>jK6NlSjj}*A6s*$!EW6KoC`kOT+$Uf;3zOJ5 z^i3=*I!e>JBTpj5b-w-zrRDH(@g;PtZlhY_)4V^?-l67(&JP>n4WPxtf#E2t(NA;L z)ccmw8yEEP^73w=lIJ)uFgU206-tfk1OeR5ckZHXAO>@bi!b2Vx-Axnqus=lp4aEP z%ZYsof$@Sy$1b}t!+J*`YF2Zf6;KS5lrDS;pUC8-R(A@vi2=GYX-bOoA}w^YXqAE_ z{BMqRk?K&04Qp~;EDI0c)^!GZPlKH0>#l?N=Od}yfBR-SI-D^r5Z)HYsZ!3? z-b)#Ljz;`@_+z(`YjdZ$V0mR1v;KmbvtHwzyTMl+9($N;UA_@yH4@lt>Y@rCaM=_Y zLbJ0BH^8e5SP3#(E}>0d?2`}`EyUF)N20#lAd$yG-eiZ$CTU5@ZvfcX_cR^@9EJ1n zeYJN9Bq>GK!9BwUSLX;_mp~H91#r+`{Jzi?wIz$8E@Q#m>v{dNXM28ca|%l_^~t&6 zXXWijGxVhR`PH(!qxeQAx1&O^xdfFgSgy$dzNmAj--@aCYW6k?%N|X*MPucE-9#uy zLi|}0T5kBLdsq^8)yrF6TcgTdJN{Dma3{H7OiP|r1k#vMzkjF=NK3H_n)-Fb|?g+&#;&;$lA6DTm;Sij_YTT1qD# zRJeqz5Y{WA5t=Bb>bZm_d>&XFgyM@pElu|LpMdG7>%|Rmd-Le{Z3y~7h|RMK$kvBeZH1)_N@t>(e7Oc0`jm1(!Q`&S z(&2dL$sr+45en-G(b3xa`aIPNyzo@r)p8!Fj4HKR@7P$?)Y96XxZY!6A!J$^S$$K= zBH-UTch5O_OR>Vxfa9H)XNjYI#r%odX8_lj4vW4WMNH?8>cy8D#kQZunMR0SR~g`hEd{^a_;&aQmD|=x}`14vVNz+@S|o*fLRpm?DkdTkzU% zu@er?W=mtJ?tYHm1Z6V|LeN8xwP}xnzb}fb(Qp&E^gg=qoFUalE`bYVAt-5Vp+!-U zX+EV0#*+Qr@#LnKGZM|+$3PVTb*a6L=yly!dnhf(C)om)p0Qz*P0q&a7IV|xSYzA? z|FT#jaq=~%2r*aS!iDVEc-%7Y2|P`S>&6PpqcQXI?u#VPS||P*2C#gjLU_mQKeijk z(z446L4*Y31{1O+I^qBVRQqCLIV!pLyX7QDmecXBfEjyUv#26;4R##*PHp)R7{NH> z+0AydU3-2cFHxDuY1XanS=F$Qz3D8|#A`BbQhUVoTYY$%AP4fQ(|-s%UEUxJ#0DX_24AmJ8vFvJ#rq3DUi`Tr6{ z-xB|H`JcrdijRQG2Ji>y1JWr-3GZv|N5_I}`8NzQb(W%vm@Gn0ULvjtTzMHpq8@;y z_U#Gh2o_cDwli;uA8eY2u#}H_1amGvrbPqafPKS3Wmi}u6z;g-cc1?sg(LoABUog4 z9j277oijSS?U{{OitI%-o*2HJH_?a5k(lb}(C^x{Yx{OffxzrTuWc3(A>i(}h2Lz#7+Dlu)HiPyU{fn*r^=Jst96Im8&I31r$0oxZ-6zO& zSsFJcFv0r!i|p^1|Nn~Y*Z&dE(WhGeh-?~bwC?2iKb7_1{U5R(bhtx${*v_YPvR0A zfUU@B|DKROY zMpK@h9CW`t2!U(?u8=X>fTd0E`Fto%%+1>snlZ^DtANz&tf_dQsx^R-HtV8Dt^P76 zCY`f|7x;O9OY#Mk7pqzGXa($|j-&_p7}1?Ljo4X*wB zudgy}-m(SH3bqqmL?9Ya3Bk?k0~F)V9ZOUhV5DL2;g7|iJ$IHWIWO}E zlO!iczHDkQ^Y322e+{URIXL#b0SE1%2k1g?M}Uj6ejS0dNAs8>l@XIZA{MA8so2=kP;?uukFYfh&)p zj_0#qTS(jB3irRebAyJ=lT>V2qzvQK(N7NehG~X8%Mk0o%CMWN5Uc(ze!=7-|T%!E!l(=)v9@~qY zCkpTuBtadIo8rK&VtTl>wyx6(79hMB<&A+zrz?eoOY_HSWgh4oitECtv-6x894E zF+S0~7o;)Lloa4f3M*Fyj#U5;@%u*?$%5{}E{A7}12(f2gAV4EOJR+Kw=>d7aNa4? ziQtuJDijD?I#f9*1(qkJZTYp3tAz5LCuVGPltQ3#XO8u}oUQ8Ek-J)NWG9UOAvnTH z$&0~6DVaqF|0;At9OcKuhfqV&>AM1@g}BY!*w_bCHG+>7A!Nv8?dNyOO_fzu-q<~0 z`c@lY5`FACT#t1QLIZ%Nu*DP8H^!nd$nnVkc+gth3W;t%z_w$_&ILeBNz@qFq}Z&j zQm{cA1e(n%F*&(4Lol<`0d<@i5XX7r;sdJ>#4YUX#vxOHNu9S^8%;G7$oZxf;sS>c z`yqD;{_)itP#=!gphk%kG@6GEP-p2NQohE9hmXGdPI9~9|DaWvh;07% zw~=orV8P;|Yr%46W@8(C_wJuW%%mf}lpr5M$xUcSQW9X=Ayrhr3d5|uRm zbI`3_3XVXiFw9AfD_Q{(FT}OQ;kJMfm87iel|taqoaD_SQ=#oYW?#HH}g-$h)|3i)3a47w`J zOn^`MoYNA+Q@4S&l^-xPe8PH#!+x@hTkL%l!5o)n&*i5xZP1St)O>$?gPu2G4>5u* zKp71@US!Jo&qaGGRI4`H_wA50kCCqKO$1 zt2Z(p_I7q2^-;%{n6%^+ib_lCVEdAsmZsTf7yGX^69_L6AYM|U(<{a|yk=1P_X0u` z-*~8g;Rlpa%Q;d(8LMVH@kLAyd8}lt2Tr}xHxi74!SV^bLlP6uw}_sdAG_qZjfN)A zxa@@nan@G##`=mny~N-xlG{m1KLPDTZaZ@q&j2t8u3n?`P8b{Or{)CMfndTSV0;m0 zEHP|iqln8!bFvdZD#NdfMvj=B5{zGm>;Yv(MHMbOt8XN9L8HW>~$s%9oK_v!*@0CMx8`T6$mB;wNshBIuAo|8A^ zEg{A&^RC7$HBr$yU{=#KEX}jQ8?R`aq6q8646?8pY@spQ`i~`sf~&dAT{CLu-?CHM zmz{}yN~))u@WcGBjsZRI-Gzjq6 zB@+nIloi?KP1US08I1BV<4*XUFVcJUKe#ix5+EGgDIV^3VAd)IdIeQAHS4|JDlEqN z@|lV3kl2U@;(EMu2Mz<`fq&T&L+dzVTHx4aJ!{6aqi*$Ge(IGao!aFcb10AVI+3zQ`Lk9zL+-0_C@Ge)#M^U_HmC^xD>B z{!Oa^Z6+kF8w&~>^iV@)5#4q~_gUG2F5fjA6(ITcLS~~ebCWI7#*%5{+CAux&Lcu- zmC*k3WvmL9yu3Vq7RsvhA8JvTJylttLRdmjrizgF3j*VZi3_-TiQ}l&Ul0#(VY8{R zF&ysFTgK%q^7&W-`ohJr z`fLdkTS>m<1VUYodpviXM@S$g>KBMvPS`-x?!6cpDpOhgSMZnkiD6!UD+9KT={|U7Eb=N-;aIiwd-wJp@;YMg#(D{T z2;6NDtHr88f8vLLkf^8~kBHQQvvc08%|DgOk+0v{o-F#eQedT*F1r6sp9jGH>1s;P zZQr0?LgSFg$xMvu+Jjh`2v(Vov$L9va)2mbz1p7g?l;FRW&o{6Qxh!Er+n6E@GyuP zc7*U9_MRVwB_8U`jn$3~X}bGYmD1f@y*G;nUUr9504GT67`_DB93a`SXt`Ha-@A83 z_>Ml2vcm?w*?0oE4O_Ml+rf$l4~QU0?2BmB{BE##$jK#N(?<~r*^{ZMsZ0lqSD$|J zL8m|c<^Yr}61!V=mh_uyYv0q_k5I~BRT)GubaqB1B)~s`e!*qS9NaI+h_Ub38+JuHt1+?_q%f|?&8n243X)Yijd2i zFV_ZUm;E~?m%IcSSCj>qIijx1JZo;g-ZU~fGlSqKC_QmqyJBU`ft)kL+Zb8KaY;iK z)ag(SD)*h129cA?$gn}4%KNDET6GljzVm-lcwrFbc8bV~D3y$&q9_%PM0F(G!aTFR zW(z4IdDMN8TIBL}yXz`i)*V#AmM5iIALi!L_wYU&7`WYH^T>USs`}#N_s9_&sf73= zOzBxEdReIL;X~k|xfqR=3+vEej0= z#Yj_=lDa;BlTFc3t7Gw$yq($>+ohO(I-=<~?FlIIZ;VvJBN@Q@<5prKbH2V)nQ{Lf zna=m`&Ghx9WMo>tG#}h=x!GIZTWPakMs9BCz!(f67^|3~!Rv=eKg2npz05vH$GVMt z=C0O$T@#b!us|0n6Zm?#=>Dj{7CzL0|2>lt6}tM&DzpLSmS}aJNqWZO9J}CC2jZX2 zp;HH`iklIppk`Le2uU<%utjN;wrAzecs_26eZlEdv)M}{T5YQ{W9r1|I*Kbh!|jdg z>`IvbgnLV3_tqN}B+ZIM0qCOAm1o1EyJ)bXgDYGI<7E@J-%y17(?yEq@fpqw*NtNe z`-u;%)8Te`#N);6bJfvAsbaQ~AQRN`lY5z{y)ITV^e0@!GdoYB|zP|_by!N_A zrZzxxeBF!*<{_WVYr*UaeyD*xn|Mer^X>Oajc6Ky;yCZ&!)s@Jp+Hnu8FZRz=q)X3u7-BVpvq#9D3J6-hS-IV>0+A6TXCE632eN}0Xy={fPDz|qlh-~2T*7OFRs9*$+kS#(=d zY1da5I*@afI&oHfOi7v*($l;L58f7?A@5l5eC+4xsjpi{lsDiL`p=K5K7Q{%+Pow9 z*jMC-fG?!na!5+59IO_Ms?ByK0K5(0UGVUz6Hc8Vq9;%_y?NK&y#Tccf2>-?yRGDc zA|kb@Nzl47hBln5I0*MZ>B1!BOx z>9!IgZ+2~Sm1cDfL&hG2JBts6>S>OKQdI&9L?~~F5K+lP%jOTA&G2%d%zC$`0wfa^ zeV>D|FnumwWLST>P<`y~5}s}gW5v6CUH)%Ahh^@d1lk*jO9KcRd`99o`X(c?wfRys z$p4UArns`Nq47KA8#Y5Vp0t5|R2ZeJW^bRZpPM;Td6$8r#iq-y#Etc!wDf)&SIX_y zU8?=)E&Kb8f}ZY+72COXLE;{7qDcw#b#Qe9RKT>`y%7@tUwbA!u%G*zRrgy~8s4iB zqDmmydkJ!v7%4lI>~4e*Av1c{5IU^Ek*}+uA5p2KJhcQy9{=L=`8emzrbyh`P?-Gk z8`DEKn2`$5(9^YemF4fr0iTF3!_h}>rW zUhBX16LlW;zINMAt-3!3hvUx}d-|R|*Xol701>Eo$S9nW1l(d6N zd!pQ^c!%hjO60r;A0tWs+V<7F;0O9U7$k|EF~0dHky{hqveGhyzp{o+EM|54)h(KPr0sY6aiH6+-d1^7QgY!LIki$< z{Rwf0tKS;?JtTvwJI@pu0zHQqdvQ_Xu_n#q_ZkKrF2So*yOgd408PaTwYaNQz1VdU z!{!Uk47UjF#6cZ0LpoFo#_b#6=Y$)tiN}yXj-l4p&Mg6vE{8SiR&}$x`S^FaA}HeC z!DD&jKUUb!80+Z7jO`N|@{pZ$x5(~RHKsq|phk9@Wa8EI>(|KBZ)-TW%a-oyLV?OW zOQr9!yWcgK{;A_R`U`V|k2DOR$hoR|EcU571=?t#A zp}wtKSgC@E@k%sDyCFY>XFb?^-1YH$t)oik6}M;He`8q3B5P<~H#CG*6WZYW$E$Q@ z_v6>ANNm;MOS|>x_|yB&@EuD0mPSD#KdT3jyp}?)!dO3 zeRTiOKvM9XL_R0?$M0F2ZfMw8Zy$#$YLou*L%Rt7q)p?}8XjK0?(W(JeS?*5LGRf~ zd_@-Tv6-;fk|KY0hm2r~1`?=H`_b+d9NltTBfHF4NayMaFa;S}`!#M$|34*NYfw{1 z6qb;fKpuoigpdLTln5AyOA;g^QWFg--~+}Yph&_a0!D{cbWj<%BmyFj06`229jS`U zpiUT3u%b;sDdAN?=!k9YML?9I#aJm8m7c`E_w4MR{r1l8*>lc*M|@%)fG(uDb$If= z?DB83f?2-Z-ok5@gQKIS2kGvb!p#zhH>TfWPgjCJRX*tx6MPUjwF7Jy~8O5(9vlCA9#{ROKwbYWGC2_*?Ts% zlNl$2-8H?Fs(i!Nd}jgGbh!1a(k?g|UYx9f@CH{qmeF?odVl(@j?l&(fk5U2uYeXZ zTQ}wqvZ0hS1jm4Vm9KdTr37#(J>)FdHga-4mj*sVe@ta%Lz(-=#zs{0VEip4Jn3vw zZjJ)XKrH$iF08C#J^gaG=_gd0TS3RWmWJNDk3D6tA8M0slqhrfwuc(P;|4Vqz=Ijx z1ck8OC?PHmg_GJRI~AOD18|TU{WchO;w%)K8uFerC+TpNumo)#QU=vQ^4;OIw8*BB zjyt!_%6J1mp6X$)5gfp#7^1R+N@eEVKa$TdSIACuA=J#>{F;`y>yZAXA50a_y?>wb zuDrtQ!?KJobm#S1=@7l18mPN;)x$()rMHCuKh~8fyYNHpz!wG{%T;S0^=8gIz10L+ zWsnf5vkfixysF136rR#cgAcJN4;7Z{s5tu~JMyB!5ic(H1R@A7t%1-NK`7ve*ro6$ z)Nfv$-;H0~i!=$Rig5wO9I$xoJ}~tNmFJ7eGEB~-qUs6w$mu>JkrVp*Hsgp}JSz-| z-pu`qMT!a}!GX#`v?k~p7_PL!PkFnNV+qdtZ54ima89uK43v4&5yw)P;h^q5wDu{1?%3174 zqWTq7SNpR=>3H$?$L+mj_39$jXhi5#F(MMtN%Pquf2;odYwy0<4FlAl84g<0$nNP} z-AZeF|Jy5Nk;HI2mMaD46rGeW@pz5_$s5t3-JzZAz~|5X=d_%MkrU=SobS)RkGN;{ zlhs6~R@!mJNF9Ysn_Kv#*)&G^SI`HxX-eCZCxo^wFi?MD@Xj@=$$Wx)TGH7`ADhdSNKipj;}pJ zk64WGAnDx8xGRQ|cbzXQvU%Er5BSLa`0GKXqJTRTJKI zW7`SFC|W}Rg~nw!BqhdmM)9i)U)x&5qsP{+lDQBc>#Ct5h`Ff~L4ekYl){fgxi_K@G*9vHa%RXB6c*i{4wu zOjps?H`q)7PuNW7rdn3F{JDp-O|K{>%)qB9%*GbAG=S%ugj+4Qsv2hIVQYf2Hc`pj zDSG!W?YUcQoQI83Y()fbe7wJ7&fW^3?so!jTo!5=T^|$HDPa`%=<-H*Rta^HD4S+5 Uy43-Y;Id@NHtCMdHzYFE|KdDCs{jB1 literal 0 HcmV?d00001 diff --git a/docs/user_guide/image/test_latency_select_device.png b/docs/user_guide/image/test_latency_select_device.png new file mode 100644 index 0000000000000000000000000000000000000000..af6395d95af0ed3ffd11d701fb2333e662ebd459 GIT binary patch literal 24102 zcmeFZXH-<{)-{L+1tX|P5D?6WB$131sGul0X9~$V=OUCD0Rce?5(*I|BRNB1AcGWI zK3yMOfP9^d%RxL1V=d+%qjXRW#BoNEWFD9N5U%6yc9g5t!( z2Qq3D6qMBz6bHT?{s(@;D-@>*e;sgDlf6svrImFWemH1(NAV5?MPAsk9pgjr^AV>9 zx~>!y=K_%b9|)URGN+(0tavDMN5cy}H{k82q4{)UNv=+mT68W6)qR-m_<^f$&KoCC zJhhUIx^tgF_vM{?RwqB%%iPiPUn_NcQ#hQKc3!dK4vU?}bE@Zp7q_qbSe=hK_)p{; z`qL37uSbRqiIvUGHT&g|s-DX!s0|T}1{~8d>DOCI(DM}pXG%Du$0!=V1MoKmZJH(g z`IVP+7XHc&#!$guvmbHDYZd?BzH}QE`R2`=$jHxpMcHX-*REXooR;>$$obgcvuc;+ z>QSwklsqczF93Nq@Ki z<56bN2XE1t`131yi_{yPn8?n~&PQ{elk=gGeH`t~Cj5TX3*Is5Qug;N7O!8pkVJJL zJ7r~WcbnW%QfEnykBsa{mZd$FAYj?ruH7YBgc-u_`}q~wOJ+^I7qASfpZ=9xpMAUs zR&i0k(?*&DDEY-C~t3XcHhN2ZfC;6$m1tY(ANvt_ZBA0hG}VOHQ7t+NP!^zUrOdZrgC< zY1kx0FI|$hD>H9q@FR!WIGyg5M>+NtXG;grY`JP2p`{%vung;-?JcssBpcdZlJ+s- zxrcbdkC!KiA{jUBx^JWsHwjbt&9B7{16$vy+5c?!@8my-jEo%e-_B0Glql+K;^9%e z#F?U;h}P0dLAAd)##rt)eNi~(hVk8p4+D$gw%?vxI@9JJ)#|QIfDghQ`=vc(*BEhy zcUWr3OF|6f>;sg=LFfq`gNx$vgEBL1+au6>R@x2Hoy>6Vq1 zjh^v=H^Yy$y;|9NRon9wCbP26&Px>wcrH_IMdLYrxoBQPtsHa$L~TrrsBI^AnFKdC zH$T7Xo~R`OcY>CdF|&paVmLB7dVhBT%YM`BRloe+C-jz%pE_o3)>@+R1Z+|2_Q!+O zSgc`6fg?$G(WT>&u5QojG_m&joG%I1vo%qQuU;W|tDVih?)6!cn00iskmF!wcXzkn z_FAL(x<-}Iqbfo=3?;uESXX$k0n>P#Db~b1_;x|(azMxdm zXx#BX-=0wiGp>x*1`m|G(;X}N#`5stLz7kS<|v-2pK+;@XCMd-)sUNA7E01R$GyE& z&z_kn!`&JuqHJ3lA0H1nHLs1SKSd$4geqfO6gJ*6Yk^iHnj|JHtd<$}v(>3N0r= zcm)Oq!mT!;eE*&Fq%r60ZwQ!iPABhf?Hu$u39sB}j^143XKN@KzgvahSlF>Uc{+QJ z`)iKWv}`+5$*_Oh#mHH%hBVi*gE51}_HjD?>jR$Eo0D;)Yd#rg1uR~jfZgLV^8L`9 zn>(Dn^xeA_t?^~XKVG)9C@7~&Wa?Mpy1iNXwakX_ezu)i;nQ|mX3As(0|N<*7N$HB zL@5&8YfpXGdMxvCrlzK~=t0^Rx4Crn)bZijsYEQgul6kjWb?`B#Cz@!R*?V{wT2p) z_*}eG_eSe?Re91!T$Mpbs%n6wPkGuG%}lNR-J$&|_ZcnwP#U6d)&agS*QL=~@0CgS z`TormO117ROTK7&=0-+h^Am49+w!&uOr0Lhpo($;%l>1yVin7Fx4pGK#~INNGaqqX z+4>w&`f4+qu$GXf38?k>)Xj?!;816?bvc>eODdV0Pt>zx?J$>jx5zVtRTUdU!ZW&6 zRKI>_w-<<)_m&1Tx)c_&Rxa&rF9cud)eMAVxHpRacrgh;&!%pBfsn!b-XOOgp7;0yQ%v5gI0 zFTof||DDo!d8GuJk5o;~&Dz;|R|p51GmoPtOi#o}wnE(2LDVsW!DPd#j z&uUlC!*FXjfxpdp^=1 s9mw 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 E2b*qoU;qFB literal 0 HcmV?d00001 diff --git a/docs/user_guide/installation.md b/docs/user_guide/installation.md index 63a1c1b3..6513150d 100644 --- a/docs/user_guide/installation.md +++ b/docs/user_guide/installation.md @@ -1,43 +1,555 @@ -# **Uni-Lab 安装** +# Uni-Lab-OS 安装指南 -## 快速开始 +本指南提供 Uni-Lab-OS 的完整安装说明,涵盖从快速一键安装到完整开发环境配置的所有方式。 -1. **配置 Conda 环境** +## 系统要求 -Uni-Lab-OS 建议使用 `mamba` 管理环境。创建新的环境: +- **操作系统**: Windows 10/11, Linux (Ubuntu 20.04+), macOS (10.15+) +- **内存**: 最小 4GB,推荐 8GB 以上 +- **磁盘空间**: 至少 10GB 可用空间 +- **网络**: 稳定的互联网连接(用于下载软件包) +- **其他**: + - 已安装 Conda/Miniconda/Miniforge/Mamba + - 开发者需要 Git 和基本的 Python 开发知识 + - 自定义 msgs 需要 GitHub 账号 -```shell +## 安装方式选择 + +根据您的使用场景,选择合适的安装方式: + +| 安装方式 | 适用人群 | 特点 | 安装时间 | +| ---------------------- | -------------------- | ------------------------------ | ---------------------------- | +| **方式一:一键安装** | 实验室用户、快速体验 | 预打包环境,离线可用,无需配置 | 5-10 分钟 (网络良好的情况下) | +| **方式二:手动安装** | 标准用户、生产环境 | 灵活配置,版本可控 | 10-20 分钟 | +| **方式三:开发者安装** | 开发者、需要修改源码 | 可编辑模式,支持自定义 msgs | 20-30 分钟 | + +--- + +## 方式一:一键安装(推荐新用户) + +使用预打包的 conda 环境,最快速的安装方法。 + +### 前置条件 + +确保已安装 Conda/Miniconda/Miniforge/Mamba。 + +### 安装步骤 + +#### 第一步:下载预打包环境 + +1. 访问 [GitHub Actions - Conda Pack Build](https://github.com/dptech-corp/Uni-Lab-OS/actions/workflows/conda-pack-build.yml) + +2. 选择最新的成功构建记录(绿色勾号 ✓) + +3. 在页面底部的 "Artifacts" 部分,下载对应你操作系统的压缩包: + - Windows: `unilab-pack-win-64-{branch}.zip` + - macOS (Intel): `unilab-pack-osx-64-{branch}.tar.gz` + - macOS (Apple Silicon): `unilab-pack-osx-arm64-{branch}.tar.gz` + - Linux: `unilab-pack-linux-64-{branch}.tar.gz` + +#### 第二步:解压并运行安装脚本 + +**Windows**: + +```batch +REM 使用 Windows 资源管理器解压下载的 zip 文件 +REM 或使用命令行: +tar -xzf unilab-pack-win-64-dev.zip + +REM 进入解压后的目录 +cd unilab-pack-win-64-dev + +REM 双击运行 install_unilab.bat +REM 或在命令行中执行: +install_unilab.bat +``` + +**macOS**: + +```bash +# 解压下载的压缩包 +tar -xzf unilab-pack-osx-arm64-dev.tar.gz + +# 进入解压后的目录 +cd unilab-pack-osx-arm64-dev + +# 运行安装脚本 +bash install_unilab.sh +``` + +**Linux**: + +```bash +# 解压下载的压缩包 +tar -xzf unilab-pack-linux-64-dev.tar.gz + +# 进入解压后的目录 +cd unilab-pack-linux-64-dev + +# 添加执行权限(如果需要) +chmod +x install_unilab.sh + +# 运行安装脚本 +./install_unilab.sh +``` + +#### 第三步:激活环境 + +```bash +conda activate unilab +``` + +激活后,您的命令行提示符应该会显示 `(unilab)` 前缀。 + +--- + +## 方式二:手动安装(标准用户) + +适合生产环境和需要灵活配置的用户。 + +### 第一步:安装 Mamba 环境管理器 + +Mamba 是 Conda 的快速替代品,我们强烈推荐使用 Mamba 来管理 Uni-Lab 环境。 + +#### Windows + +下载并安装 Miniforge(包含 Mamba): + +```powershell +# 访问 https://github.com/conda-forge/miniforge/releases +# 下载 Miniforge3-Windows-x86_64.exe +# 运行安装程序 + +# 也可以使用镜像站 https://mirrors.tuna.tsinghua.edu.cn/github-release/conda-forge/miniforge/LatestRelease/ +# 下载 Miniforge3-Windows-x86_64.exe +# 运行安装程序 +``` + +#### Linux/macOS + +```bash +# 下载 Miniforge 安装脚本 +curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-$(uname -m).sh" + +# 运行安装 +bash Miniforge3-$(uname)-$(uname -m).sh + +# 按照提示完成安装,建议选择 yes 来初始化 +``` + +安装完成后,重新打开终端使 Mamba 生效。 + +### 第二步:创建 Uni-Lab 环境 + +使用以下命令创建 Uni-Lab 专用环境: + +```bash +mamba create -n unilab python=3.11.11 # 目前ros2组件依赖版本大多为3.11.11 +mamba activate unilab +mamba install -n unilab uni-lab::unilabos -c robostack-staging -c conda-forge +``` + +**参数说明**: + +- `-n unilab`: 创建名为 "unilab" 的环境 +- `uni-lab::unilabos`: 从 uni-lab channel 安装 unilabos 包 +- `-c robostack-staging -c conda-forge`: 添加额外的软件源 + +**如果遇到网络问题**,可以使用清华镜像源加速下载: + +```bash +# 配置清华镜像源 +mamba config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ +mamba config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ +mamba config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ + +# 然后重新执行安装命令 +mamba create -n unilab uni-lab::unilabos -c robostack-staging +``` + +### 第三步:激活环境 + +```bash +conda activate unilab +``` + +--- + +## 方式三:开发者安装 + +适用于需要修改 Uni-Lab 源代码或开发新设备驱动的开发者。 + +### 前置条件 + +- 已安装 Git +- 已安装 Mamba/Conda +- 有 GitHub 账号(如需自定义 msgs) +- 基本的 Python 开发知识 + +### 第一步:克隆仓库 + +```bash +git clone https://github.com/dptech-corp/Uni-Lab-OS.git +cd Uni-Lab-OS +``` + +如果您需要贡献代码,建议先 Fork 仓库: + +1. 访问 https://github.com/dptech-corp/Uni-Lab-OS +2. 点击右上角的 "Fork" 按钮 +3. Clone 您的 Fork 版本: + ```bash + git clone https://github.com/YOUR_USERNAME/Uni-Lab-OS.git + cd Uni-Lab-OS + ``` + +### 第二步:安装基础环境 + +**推荐方式**:先通过**方式一(一键安装)**或**方式二(手动安装)**完成基础环境的安装,这将包含所有必需的依赖项(ROS2、msgs 等)。 + +#### 选项 A:通过一键安装(推荐) + +参考上文"方式一:一键安装",完成基础环境的安装后,激活环境: + +```bash +conda activate unilab +``` + +#### 选项 B:通过手动安装 + +参考上文"方式二:手动安装",创建并安装环境: + +```bash +mamba create -n unilab python=3.11.11 +conda activate unilab +mamba install -n unilab uni-lab::unilabos -c robostack-staging -c conda-forge +``` + +**说明**:这会安装包括 Python 3.11.11、ROS2 Humble、ros-humble-unilabos-msgs 和所有必需依赖 + +### 第三步:切换到开发版本 + +现在你已经有了一个完整可用的 Uni-Lab 环境,接下来将 unilabos 包切换为开发版本: + +```bash +# 确保环境已激活 +conda activate unilab + +# 卸载 pip 安装的 unilabos(保留所有 conda 依赖) +pip uninstall unilabos -y + +# 克隆 dev 分支(如果还未克隆) +cd /path/to/your/workspace +git clone -b dev https://github.com/dptech-corp/Uni-Lab-OS.git +# 或者如果已经克隆,切换到 dev 分支 +cd Uni-Lab-OS +git checkout dev +git pull + +# 以可编辑模式安装开发版 unilabos +pip install -e . -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple +``` + +**参数说明**: + +- `-e`: editable mode(可编辑模式),代码修改立即生效,无需重新安装 +- `-i`: 使用清华镜像源加速下载 +- `pip uninstall unilabos`: 只卸载 pip 安装的 unilabos 包,不影响 conda 安装的其他依赖(如 ROS2、msgs 等) + +### 第四步:安装或自定义 ros-humble-unilabos-msgs(可选) + +Uni-Lab 使用 ROS2 消息系统进行设备间通信。如果你使用方式一或方式二安装,msgs 包已经自动安装。 + +#### 使用已安装的 msgs(大多数用户) + +如果你不需要修改 msgs,可以跳过此步骤,直接使用已安装的 msgs 包。验证安装: + +```bash +# 列出所有 unilabos_msgs 接口 +ros2 interface list | grep unilabos_msgs + +# 查看特定 action 定义 +ros2 interface show unilabos_msgs/action/DeviceCmd +``` + +#### 自定义 msgs(高级用户) + +如果你需要: + +- 添加新的 ROS2 action 定义 +- 修改现有 msg/srv/action 接口 +- 为特定设备定制通信协议 + +请参考 **[添加新动作指令(Action)指南](../developer_guide/add_action.md)**,该指南详细介绍了如何: + +- 编写新的 Action 定义 +- 在线构建 Action(通过 GitHub Actions) +- 下载并安装自定义的 msgs 包 +- 测试和验证新的 Action + +```bash +# 安装自定义构建的 msgs 包 +mamba remove --force ros-humble-unilabos-msgs +mamba config set safety_checks disabled # 关闭 md5 检查 +mamba install /path/to/ros-humble-unilabos-msgs-*.conda --offline +``` + +### 第五步:验证开发环境 + +完成上述步骤后,验证开发环境是否正确配置: + +```bash +# 确保环境已激活 +conda activate unilab + +# 检查 ROS2 环境 +ros2 --version + +# 检查 msgs 包 +ros2 interface list | grep unilabos_msgs + +# 检查 Python 可以导入 unilabos +python -c "import unilabos; print(f'Uni-Lab版本: {unilabos.__version__}')" + +# 检查 unilab 命令 +unilab --help +``` + +如果所有命令都正常输出,说明开发环境配置成功! + +### 开发工具推荐 + +#### IDE + +- **PyCharm Professional**: 强大的 Python IDE,支持远程调试 +- **VS Code**: 轻量级,配合 Python 扩展使用 +- **Vim/Emacs**: 适合终端开发 + +#### 推荐的 VS Code 扩展 + +- Python +- Pylance +- ROS +- URDF +- YAML + +#### 调试工具 + +```bash +# 安装调试工具 +pip install ipdb pytest pytest-cov -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple + +# 代码质量检查 +pip install black flake8 mypy -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple +``` + +### 设置 pre-commit 钩子(可选) + +```bash +# 安装 pre-commit +pip install pre-commit -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple + +# 设置钩子 +pre-commit install + +# 手动运行检查 +pre-commit run --all-files +``` + +--- + +## 验证安装 + +无论使用哪种安装方式,都应该验证安装是否成功。 + +### 基本验证 + +```bash +# 确保已激活环境 +conda activate unilab # 或 unilab-dev + +# 检查 unilab 命令 +unilab --help +``` + +您应该看到类似以下的输出: + +``` +usage: unilab [-h] [-g GRAPH] [-c CONTROLLERS] [--registry_path REGISTRY_PATH] + [--working_dir WORKING_DIR] [--backend {ros,simple,automancer}] + ... +``` + +### 检查版本 + +```bash +python -c "import unilabos; print(f'Uni-Lab版本: {unilabos.__version__}')" +``` + +### 使用验证脚本(方式一) + +如果使用一键安装,可以运行预打包的验证脚本: + +```bash +# 确保已激活环境 +conda activate unilab + +# 运行验证脚本 +python verify_installation.py +``` + +如果看到 "✓ All checks passed!",说明安装成功! + +--- + +## 常见问题 + +### 问题 1: 找不到 unilab 命令 + +**原因**: 环境未正确激活或 PATH 未设置 + +**解决方案**: + +```bash +# 确保激活了正确的环境 +conda activate unilab + +# 检查 unilab 是否在 PATH 中 +which unilab # Linux/macOS +where unilab # Windows +``` + +### 问题 2: 包冲突或依赖错误 + +**解决方案**: + +```bash +# 删除旧环境重新创建 +conda deactivate +conda env remove -n unilab mamba create -n unilab uni-lab::unilabos -c robostack-staging -c conda-forge ``` -2. **安装开发版 Uni-Lab-OS** +### 问题 3: 下载速度慢 -```shell -# 配置好conda环境后,克隆仓库 -git clone https://github.com/dptech-corp/Uni-Lab-OS.git -b dev -cd Uni-Lab-OS +**解决方案**: 使用国内镜像源(清华、中科大等) -# 安装 Uni-Lab-OS -pip install -e . +```bash +# 查看当前 channel 配置 +conda config --show channels + +# 添加清华镜像 +conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ ``` -3. **安装开发版 ros-humble-unilabos-msgs** +### 问题 4: 权限错误 -**卸载老版本:** -```shell +**Windows 解决方案**: 以管理员身份运行命令提示符 + +**Linux/macOS 解决方案**: + +```bash +# 不要使用 sudo 安装 conda 包 +# 如果 conda 安装在需要权限的位置,考虑重新安装 conda 到用户目录 +``` + +### 问题 5: 安装脚本找不到 conda(方式一) + +**解决方案**: 确保你已经安装了 conda/miniconda/miniforge,并且安装在标准位置: + +- **Windows**: + + - `%USERPROFILE%\miniforge3` + - `%USERPROFILE%\miniconda3` + - `%USERPROFILE%\anaconda3` + - `C:\ProgramData\miniforge3` + +- **macOS/Linux**: + - `~/miniforge3` + - `~/miniconda3` + - `~/anaconda3` + - `/opt/conda` + +如果安装在其他位置,可以先激活 conda base 环境,然后手动运行安装脚本。 + +### 问题 6: 安装后激活环境提示找不到? + +**解决方案**: 尝试以下方法: + +```bash +# 方法 1: 使用 conda activate conda activate unilab -conda remove --force ros-humble-unilabos-msgs -``` -有时相同的安装包版本会由于dev构建得到的md5不一样,触发安全检查,可输入 `config set safety_checks disabled` 来关闭安全检查。 -**安装新版本:** +# 方法 2: 使用完整路径激活(Windows) +call C:\Users\{YourUsername}\miniforge3\envs\unilab\Scripts\activate.bat -访问 https://github.com/dptech-corp/Uni-Lab-OS/actions/workflows/multi-platform-build.yml 选择最新的构建,下载对应平台的压缩包(仅解压一次,得到.conda文件)使用如下指令: -```shell -conda activate base -conda install ros-humble-unilabos-msgs--.conda --offline -n <环境名> +# 方法 2: 使用完整路径激活(Unix) +source ~/miniforge3/envs/unilab/bin/activate ``` -4. **启动 Uni-Lab 系统** +### 问题 7: conda-unpack 失败怎么办?(方式一) -请参见{doc}`启动样例 <../boot_examples/index>`或{doc}`启动指南 `了解详细的启动方法。 +**解决方案**: 尝试手动运行: + +```bash +# Windows +cd %CONDA_PREFIX%\envs\unilab +.\Scripts\conda-unpack.exe + +# macOS/Linux +cd $CONDA_PREFIX/envs/unilab +./bin/conda-unpack +``` + +### 问题 8: 环境很大,有办法减小吗? + +**解决方案**: 预打包的环境包含所有依赖,通常较大(压缩后 2-5GB)。这是为了确保离线安装和完整功能。如果空间有限,考虑使用方式二手动安装,只安装需要的组件。 + +### 问题 9: 如何更新到最新版本? + +**解决方案**: + +**方式一用户**: 重新下载最新的预打包环境,运行安装脚本时选择覆盖现有环境。 + +**方式二/三用户**: 在现有环境中更新: + +```bash +conda activate unilab + +# 更新 unilabos +cd /path/to/Uni-Lab-OS +git pull +pip install -e . --upgrade -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple + +# 更新 ros-humble-unilabos-msgs +mamba update ros-humble-unilabos-msgs -c uni-lab -c robostack-staging -c conda-forge +``` + +--- + +## 下一步 + +安装完成后,请继续: + +- **快速启动**: 学习如何首次启动 Uni-Lab +- **配置指南**: 配置您的实验室环境和设备 +- **运行示例**: 查看启动示例和最佳实践 +- **开发指南**: + - 添加新设备驱动 + - 添加新物料资源 + - 了解工作站架构 + +## 需要帮助? + +- **故障排查**: 查看更详细的故障排查信息 +- **GitHub Issues**: [报告问题](https://github.com/dptech-corp/Uni-Lab-OS/issues) +- **开发者文档**: 查看开发者指南获取更多技术细节 +- **社区讨论**: [GitHub Discussions](https://github.com/dptech-corp/Uni-Lab-OS/discussions) + +--- + +**提示**: + +- 生产环境推荐使用方式二(手动安装)的稳定版本 +- 开发和测试推荐使用方式三(开发者安装) +- 快速体验和演示推荐使用方式一(一键安装) diff --git a/docs/user_guide/launch.md b/docs/user_guide/launch.md index 5691222c..402e39aa 100644 --- a/docs/user_guide/launch.md +++ b/docs/user_guide/launch.md @@ -132,15 +132,14 @@ unilab --config path/to/your/config.py 使用 `-c` 传入控制逻辑配置。 -不管使用哪一种初始化方式,设备/物料字典均需包含 `class` 属性,用于查找注册表信息。默认查找范围都是 Uni-Lab 内部注册表 `unilabos/registry/{devices,device_comms,resources}`。要添加额外的注册表路径,可以使用 `--registry_path` 加入 `/{devices,device_comms,resources}`。 +不管使用哪一种初始化方式,设备/物料字典均需包含 `class` 属性,用于查找注册表信息。默认查找范围都是 Uni-Lab 内部注册表 `unilabos/registry/{devices,device_comms,resources}`。要添加额外的注册表路径,可以使用 `--registry_path` 加入 `/{devices,device_comms,resources}`,只输入即可,支持多次--registry_path指定多个目录。 ## 通信中间件 `--backend` 目前 Uni-Lab 支持以下通信中间件: - **ros** (默认):基于 ROS2 的通信 -- **simple**:简化通信模式 -- **automancer**:Automancer 兼容模式 +- **automancer**:Automancer 兼容模式 (实验性) ## 端云桥接 `--app_bridges` @@ -169,7 +168,7 @@ unilab --config path/to/your/config.py 通过 `--visual` 参数选择: - **rviz**:使用 RViz 进行 3D 可视化 -- **web**:使用 Web 界面进行可视化 +- **web**:使用 Web 界面进行可视化 (基于Pylabrobot) - **disable** (默认):禁用可视化 ## 实验室管理 @@ -245,78 +244,3 @@ unilab --ak your_ak --sk your_sk --port 8080 --disable_browser - 检查图谱文件格式是否正确 - 验证设备连接和端点配置 - 确保注册表路径正确 - -## 页面操作 - -### 1. 启动成功 -当您启动成功后,可以看到物料列表,节点模版和组态图如图展示 -![material.png](image/material.png) - -### 2. 根据需求创建设备和物料 -我们可以做一个简单的案例 -* 在容器1中加入水 -* 通过传输泵将容器1中的水转移到容器2中 -#### 2.1 添加所需的设备和物料 -仪器设备work_station中的workstation 数量x1 -仪器设备virtual_device中的virtual_transfer_pump 数量x1 -物料耗材container中的container 数量x2 - -#### 2.2 将设备和物料根据父子关系进行关联 -当我们添加设备时,仪器耗材模块的物料列表也会实时更新 -我们需要将设备和物料拖拽到workstation中并在画布上将它们连接起来,就像真实的设备操作一样 -![links.png](image/links.png) - -### 3. 创建工作流 -进入工作流模块 → 点击"我创建的" → 新建工作流 -![new.png](image/new.png) - -#### 3.1 新增工作流节点 -我们可以进入指定工作流,在空白处右键 -* 选择Laboratory→host_node中的creat_resource -* 选择Laboratory→workstation中的PumpTransferProtocol - -![creatworkfollow.gif](image/creatworkfollow.gif) - -#### 3.2 配置节点参数 -根据案例,工作流包含两个步骤: -1. 使用creat_resource在容器中创建水 -2. 通过泵传输协议将水传输到另一个容器 - -我们点击creat_resource卡片上的编辑按钮来配置参数⭐️ -class_name :container -device_id : workstation -liquid_input_slot : 0或-1均可 -liquid_type : water -liquid_volume : 根据需求填写即可,默认单位ml,这里举例50 -parent : workstation -res_id : containe -关联设备名称(原unilabos_device_id) : 这里就填写host_node -**配置完成后点击底部保存按钮** - -我们点击PumpTransferProtocol卡片上的编辑按钮来配置参数⭐️ -event : transfer_liquid -from_vessel : water -to_vessel : container1 -volume : 根据需求填写即可,默认单位ml,这里举例50 -关联设备名称(原unilabos_device_id) : 这里就填写workstation -**配置完成后点击底部保存按钮** - -#### 3.3 运行工作流 -1. 连接两个节点卡片 -2. 点击底部保存按钮 -3. 点击运行按钮执行工作流 - -![linksandrun.png](image/linksandrun.png) - -### 运行监控 -* 运行状态和消息实时显示在底部控制台 -* 如有报错,可点击查看详细信息 - -### 结果验证 -工作流完成后,返回仪器耗材模块: -* 点击 container1卡片查看详情 -* 确认其中包含参数指定的水和容量 - - - - diff --git a/docs/user_guide/quick_install_guide.md b/docs/user_guide/quick_install_guide.md deleted file mode 100644 index eefa3ae9..00000000 --- a/docs/user_guide/quick_install_guide.md +++ /dev/null @@ -1,197 +0,0 @@ -# Uni-Lab-OS 一键安装快速指南 - -## 概述 - -本指南提供最快速的 Uni-Lab-OS 安装方法,使用预打包的 conda 环境,无需手动配置依赖。 - -## 前置要求 - -- 已安装 Conda/Miniconda/Miniforge/Mamba -- 至少 10GB 可用磁盘空间 -- Windows 10+, macOS 10.14+, 或 Linux (Ubuntu 20.04+) - -## 安装步骤 - -### 第一步:下载预打包环境 - -1. 访问 [GitHub Actions - Conda Pack Build](https://github.com/dptech-corp/Uni-Lab-OS/actions/workflows/conda-pack-build.yml) - -2. 选择最新的成功构建记录(绿色勾号 ✓) - -3. 在页面底部的 "Artifacts" 部分,下载对应你操作系统的压缩包: - - Windows: `unilab-pack-win-64-{branch}.zip` - - macOS (Intel): `unilab-pack-osx-64-{branch}.tar.gz` - - macOS (Apple Silicon): `unilab-pack-osx-arm64-{branch}.tar.gz` - - Linux: `unilab-pack-linux-64-{branch}.tar.gz` - -### 第二步:解压并运行安装脚本 - -#### Windows - -```batch -REM 使用 Windows 资源管理器解压下载的 zip 文件 -REM 或使用命令行: -tar -xzf unilab-pack-win-64-dev.zip - -REM 进入解压后的目录 -cd unilab-pack-win-64-dev - -REM 双击运行 install_unilab.bat -REM 或在命令行中执行: -install_unilab.bat -``` - -#### macOS - -```bash -# 解压下载的压缩包 -tar -xzf unilab-pack-osx-arm64-dev.tar.gz - -# 进入解压后的目录 -cd unilab-pack-osx-arm64-dev - -# 运行安装脚本 -bash install_unilab.sh -``` - -#### Linux - -```bash -# 解压下载的压缩包 -tar -xzf unilab-pack-linux-64-dev.tar.gz - -# 进入解压后的目录 -cd unilab-pack-linux-64-dev - -# 添加执行权限(如果需要) -chmod +x install_unilab.sh - -# 运行安装脚本 -./install_unilab.sh -``` - -### 第三步:激活环境 - -```bash -conda activate unilab -``` - -### 第四步:验证安装(推荐) - -```bash -# 确保已激活环境 -conda activate unilab - -# 运行验证脚本 -python verify_installation.py -``` - -如果看到 "✓ All checks passed!",说明安装成功! - -## 常见问题 - -### Q: 安装脚本找不到 conda? - -**A:** 确保你已经安装了 conda/miniconda/miniforge,并且安装在标准位置: - -- **Windows**: - - - `%USERPROFILE%\miniforge3` - - `%USERPROFILE%\miniconda3` - - `%USERPROFILE%\anaconda3` - - `C:\ProgramData\miniforge3` - -- **macOS/Linux**: - - `~/miniforge3` - - `~/miniconda3` - - `~/anaconda3` - - `/opt/conda` - -如果安装在其他位置,可以先激活 conda base 环境,然后手动运行安装脚本。 - -### Q: 安装后激活环境提示找不到? - -**A:** 尝试以下方法: - -```bash -# 方法 1: 使用 conda activate -conda activate unilab - -# 方法 2: 使用完整路径激活(Windows) -call C:\Users\{YourUsername}\miniforge3\envs\unilab\Scripts\activate.bat - -# 方法 2: 使用完整路径激活(Unix) -source ~/miniforge3/envs/unilab/bin/activate -``` - -### Q: conda-unpack 失败怎么办? - -**A:** 尝试手动运行: - -```bash -# Windows -cd %CONDA_PREFIX%\envs\unilab -.\Scripts\conda-unpack.exe - -# macOS/Linux -cd $CONDA_PREFIX/envs/unilab -./bin/conda-unpack -``` - -### Q: 验证脚本报错? - -**A:** 首先确认环境已激活: - -```bash -# 检查当前环境 -conda env list - -# 应该看到 unilab 前面有 * 标记 -``` - -如果仍有问题,查看具体报错信息,可能需要: - -- 重新运行安装脚本 -- 检查磁盘空间 -- 查看详细文档 - -### Q: 环境很大,有办法减小吗? - -**A:** 预打包的环境包含所有依赖,通常较大(压缩后 2-5GB)。这是为了确保离线安装和完整功能。如果空间有限,考虑使用手动安装方式,只安装需要的组件。 - -### Q: 如何更新到最新版本? - -**A:** 重新下载最新的预打包环境,运行安装脚本时选择覆盖现有环境。 - -或者在现有环境中更新: - -```bash -conda activate unilab - -# 更新 unilabos -cd /path/to/Uni-Lab-OS -git pull -pip install -e . --upgrade - -# 更新 ros-humble-unilabos-msgs -mamba update ros-humble-unilabos-msgs -c uni-lab -c robostack-staging -c conda-forge -``` - -## 下一步 - -安装完成后,你可以: - -1. **查看启动指南**: {doc}`launch` -2. **运行示例**: {doc}`../boot_examples/index` -3. **配置设备**: 编辑 `unilabos_data/startup_config.json` -4. **阅读开发文档**: {doc}`../developer_guide/workstation_architecture` - -## 需要帮助? - -- **文档**: [docs/user_guide/installation.md](installation.md) -- **问题反馈**: [GitHub Issues](https://github.com/dptech-corp/Uni-Lab-OS/issues) -- **开发版安装**: 参考 {doc}`installation` 的方式二 - ---- - -**提示**: 这个预打包环境包含了从指定分支(通常是 `dev`)构建的最新代码。如果需要稳定版本,请使用方式二手动安装 release 版本。 diff --git a/unilabos/app/main.py b/unilabos/app/main.py index 7b2773db..ad32612d 100644 --- a/unilabos/app/main.py +++ b/unilabos/app/main.py @@ -302,6 +302,11 @@ def main(): graph, resource_tree_set, resource_links = read_node_link_json(request_startup_json) else: file_path = args_dict["graph"] + if not os.path.isfile(file_path): + temp_file_path = os.path.abspath(str(os.path.join(__file__, "..", "..", file_path))) + if os.path.isfile(temp_file_path): + print_status(f"使用相对路径{temp_file_path}", "info") + file_path = temp_file_path if file_path.endswith(".json"): graph, resource_tree_set, resource_links = read_node_link_json(file_path) else: diff --git a/unilabos/devices/liquid_handling/liquid_handler_abstract.py b/unilabos/devices/liquid_handling/liquid_handler_abstract.py index 4142463d..7a492939 100644 --- a/unilabos/devices/liquid_handling/liquid_handler_abstract.py +++ b/unilabos/devices/liquid_handling/liquid_handler_abstract.py @@ -31,15 +31,17 @@ from unilabos.ros.nodes.base_device_node import BaseROS2DeviceNode class LiquidHandlerMiddleware(LiquidHandler): - def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool = False, channel_num: int = 8, total_height: float = 310, **kwargs): + def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool = False, channel_num: int = 8, **kwargs): self._simulator = simulator self.channel_num = channel_num joint_config = kwargs.get("joint_config", None) if simulator: - self._simulate_backend = UniLiquidHandlerRvizBackend(channel_num,total_height, joint_config=joint_config, lh_device_id = deck.name) + if joint_config: + self._simulate_backend = UniLiquidHandlerRvizBackend(channel_num, kwargs["total_height"], + joint_config=joint_config, lh_device_id=deck.name) + else: + self._simulate_backend = LiquidHandlerChatterboxBackend(channel_num) self._simulate_handler = LiquidHandlerAbstract(self._simulate_backend, deck, False) - if hasattr(backend, "total_height"): - backend.total_height = total_height super().__init__(backend, deck) async def setup(self, **backend_kwargs): @@ -544,51 +546,16 @@ class LiquidHandlerAbstract(LiquidHandlerMiddleware): support_touch_tip = True _ros_node: BaseROS2DeviceNode - def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool=False, channel_num:int = 8,total_height: float = 310,**backend_kwargs): + def __init__(self, backend: LiquidHandlerBackend, deck: Deck, simulator: bool=False, channel_num:int = 8): """Initialize a LiquidHandler. Args: backend: Backend to use. deck: Deck to use. """ - backend_type = None - if isinstance(backend, dict) and "type" in backend: - backend_dict = backend.copy() - type_str = backend_dict.pop("type") - try: - # Try to get class from string using globals (current module), or fallback to pylabrobot or unilabos namespaces - backend_cls = None - if type_str in globals(): - backend_cls = globals()[type_str] - else: - # Try resolving dotted notation, e.g. "xxx.yyy.ClassName" - components = type_str.split(".") - mod = None - if len(components) > 1: - module_name = ".".join(components[:-1]) - try: - import importlib - mod = importlib.import_module(module_name) - except ImportError: - mod = None - if mod is not None: - backend_cls = getattr(mod, components[-1], None) - if backend_cls is None: - # Try pylabrobot style import (if available) - try: - import pylabrobot - backend_cls = getattr(pylabrobot, type_str, None) - except Exception: - backend_cls = None - if backend_cls is not None and isinstance(backend_cls, type): - backend_type = backend_cls(**backend_dict) # pass the rest of dict as kwargs - except Exception as exc: - raise RuntimeError(f"Failed to convert backend type '{type_str}' to class: {exc}") - else: - backend_type = backend self._simulator = simulator self.group_info = dict() - super().__init__(backend_type, deck, simulator, channel_num,total_height,**backend_kwargs) + super().__init__(backend, deck, simulator, channel_num) def post_init(self, ros_node: BaseROS2DeviceNode): self._ros_node = ros_node diff --git a/unilabos/test/__init__.py b/unilabos/test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/commands/resource_add.md b/unilabos/test/commands/resource_add.md similarity index 100% rename from test/commands/resource_add.md rename to unilabos/test/commands/resource_add.md diff --git a/test/experiments/Grignard_flow_batchreact_single_pumpvalve.json b/unilabos/test/experiments/Grignard_flow_batchreact_single_pumpvalve.json similarity index 100% rename from test/experiments/Grignard_flow_batchreact_single_pumpvalve.json rename to unilabos/test/experiments/Grignard_flow_batchreact_single_pumpvalve.json diff --git a/test/experiments/HPLC.json b/unilabos/test/experiments/HPLC.json similarity index 100% rename from test/experiments/HPLC.json rename to unilabos/test/experiments/HPLC.json diff --git a/test/experiments/HT_hiwo.json b/unilabos/test/experiments/HT_hiwo.json similarity index 100% rename from test/experiments/HT_hiwo.json rename to unilabos/test/experiments/HT_hiwo.json diff --git a/test/experiments/ICCAS506.json b/unilabos/test/experiments/ICCAS506.json similarity index 100% rename from test/experiments/ICCAS506.json rename to unilabos/test/experiments/ICCAS506.json diff --git a/test/experiments/Protocol_Test_Station/add_protocol_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/add_protocol_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/add_protocol_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/add_protocol_test_station.json diff --git a/test/experiments/Protocol_Test_Station/centrifuge_protocol_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/centrifuge_protocol_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/centrifuge_protocol_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/centrifuge_protocol_test_station.json diff --git a/test/experiments/Protocol_Test_Station/clean_vessel_protocol_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/clean_vessel_protocol_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/clean_vessel_protocol_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/clean_vessel_protocol_test_station.json diff --git a/test/experiments/Protocol_Test_Station/dual_valve_pump_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/dual_valve_pump_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/dual_valve_pump_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/dual_valve_pump_test_station.json diff --git a/test/experiments/Protocol_Test_Station/evacuateandrefill_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/evacuateandrefill_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/evacuateandrefill_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/evacuateandrefill_test_station.json diff --git a/test/experiments/Protocol_Test_Station/evaporate_protocol_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/evaporate_protocol_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/evaporate_protocol_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/evaporate_protocol_test_station.json diff --git a/test/experiments/Protocol_Test_Station/filter_protocol_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/filter_protocol_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/filter_protocol_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/filter_protocol_test_station.json diff --git a/test/experiments/Protocol_Test_Station/heatchill_protocol_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/heatchill_protocol_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/heatchill_protocol_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/heatchill_protocol_test_station.json diff --git a/test/experiments/Protocol_Test_Station/pumptransfer_filterthrough_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/pumptransfer_filterthrough_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/pumptransfer_filterthrough_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/pumptransfer_filterthrough_test_station.json diff --git a/test/experiments/Protocol_Test_Station/pumptransfer_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/pumptransfer_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/pumptransfer_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/pumptransfer_test_station.json diff --git a/test/experiments/Protocol_Test_Station/run_column_protocol_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/run_column_protocol_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/run_column_protocol_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/run_column_protocol_test_station.json diff --git a/test/experiments/Protocol_Test_Station/simple_stir_heatchill_test_station.json b/unilabos/test/experiments/Protocol_Test_Station/simple_stir_heatchill_test_station.json similarity index 100% rename from test/experiments/Protocol_Test_Station/simple_stir_heatchill_test_station.json rename to unilabos/test/experiments/Protocol_Test_Station/simple_stir_heatchill_test_station.json diff --git a/test/experiments/biomek.json b/unilabos/test/experiments/biomek.json similarity index 100% rename from test/experiments/biomek.json rename to unilabos/test/experiments/biomek.json diff --git a/test/experiments/camera.json b/unilabos/test/experiments/camera.json similarity index 100% rename from test/experiments/camera.json rename to unilabos/test/experiments/camera.json diff --git a/test/experiments/comprehensive_protocol/checklist.md b/unilabos/test/experiments/comprehensive_protocol/checklist.md similarity index 100% rename from test/experiments/comprehensive_protocol/checklist.md rename to unilabos/test/experiments/comprehensive_protocol/checklist.md diff --git a/test/experiments/comprehensive_protocol/comprehensive_slim.json b/unilabos/test/experiments/comprehensive_protocol/comprehensive_slim.json similarity index 100% rename from test/experiments/comprehensive_protocol/comprehensive_slim.json rename to unilabos/test/experiments/comprehensive_protocol/comprehensive_slim.json diff --git a/test/experiments/comprehensive_protocol/comprehensive_station.json b/unilabos/test/experiments/comprehensive_protocol/comprehensive_station.json similarity index 100% rename from test/experiments/comprehensive_protocol/comprehensive_station.json rename to unilabos/test/experiments/comprehensive_protocol/comprehensive_station.json diff --git a/test/experiments/deis_control_config.yaml b/unilabos/test/experiments/deis_control_config.yaml similarity index 100% rename from test/experiments/deis_control_config.yaml rename to unilabos/test/experiments/deis_control_config.yaml diff --git a/test/experiments/devices.json b/unilabos/test/experiments/devices.json similarity index 100% rename from test/experiments/devices.json rename to unilabos/test/experiments/devices.json diff --git a/test/experiments/dispensing_station_bioyond.json b/unilabos/test/experiments/dispensing_station_bioyond.json similarity index 100% rename from test/experiments/dispensing_station_bioyond.json rename to unilabos/test/experiments/dispensing_station_bioyond.json diff --git a/test/experiments/empty_devices.json b/unilabos/test/experiments/empty_devices.json similarity index 100% rename from test/experiments/empty_devices.json rename to unilabos/test/experiments/empty_devices.json diff --git a/test/experiments/laiyu_liquid.json b/unilabos/test/experiments/laiyu_liquid.json similarity index 100% rename from test/experiments/laiyu_liquid.json rename to unilabos/test/experiments/laiyu_liquid.json diff --git a/test/experiments/lidocaine-graph.json b/unilabos/test/experiments/lidocaine-graph.json similarity index 100% rename from test/experiments/lidocaine-graph.json rename to unilabos/test/experiments/lidocaine-graph.json diff --git a/test/experiments/mock_devices/mock_all.json b/unilabos/test/experiments/mock_devices/mock_all.json similarity index 100% rename from test/experiments/mock_devices/mock_all.json rename to unilabos/test/experiments/mock_devices/mock_all.json diff --git a/test/experiments/mock_devices/mock_chiller.json b/unilabos/test/experiments/mock_devices/mock_chiller.json similarity index 100% rename from test/experiments/mock_devices/mock_chiller.json rename to unilabos/test/experiments/mock_devices/mock_chiller.json diff --git a/test/experiments/mock_devices/mock_filter.json b/unilabos/test/experiments/mock_devices/mock_filter.json similarity index 100% rename from test/experiments/mock_devices/mock_filter.json rename to unilabos/test/experiments/mock_devices/mock_filter.json diff --git a/test/experiments/mock_devices/mock_heater.json b/unilabos/test/experiments/mock_devices/mock_heater.json similarity index 100% rename from test/experiments/mock_devices/mock_heater.json rename to unilabos/test/experiments/mock_devices/mock_heater.json diff --git a/test/experiments/mock_devices/mock_pump.json b/unilabos/test/experiments/mock_devices/mock_pump.json similarity index 100% rename from test/experiments/mock_devices/mock_pump.json rename to unilabos/test/experiments/mock_devices/mock_pump.json diff --git a/test/experiments/mock_devices/mock_rotavap.json b/unilabos/test/experiments/mock_devices/mock_rotavap.json similarity index 100% rename from test/experiments/mock_devices/mock_rotavap.json rename to unilabos/test/experiments/mock_devices/mock_rotavap.json diff --git a/test/experiments/mock_devices/mock_separator.json b/unilabos/test/experiments/mock_devices/mock_separator.json similarity index 100% rename from test/experiments/mock_devices/mock_separator.json rename to unilabos/test/experiments/mock_devices/mock_separator.json diff --git a/test/experiments/mock_devices/mock_solenoid_valve.json b/unilabos/test/experiments/mock_devices/mock_solenoid_valve.json similarity index 100% rename from test/experiments/mock_devices/mock_solenoid_valve.json rename to unilabos/test/experiments/mock_devices/mock_solenoid_valve.json diff --git a/test/experiments/mock_devices/mock_stirrer.json b/unilabos/test/experiments/mock_devices/mock_stirrer.json similarity index 100% rename from test/experiments/mock_devices/mock_stirrer.json rename to unilabos/test/experiments/mock_devices/mock_stirrer.json diff --git a/test/experiments/mock_devices/mock_stirrer_new.json b/unilabos/test/experiments/mock_devices/mock_stirrer_new.json similarity index 100% rename from test/experiments/mock_devices/mock_stirrer_new.json rename to unilabos/test/experiments/mock_devices/mock_stirrer_new.json diff --git a/test/experiments/mock_devices/mock_vacuum.json b/unilabos/test/experiments/mock_devices/mock_vacuum.json similarity index 100% rename from test/experiments/mock_devices/mock_vacuum.json rename to unilabos/test/experiments/mock_devices/mock_vacuum.json diff --git a/test/experiments/mock_protocol/addteststation.json b/unilabos/test/experiments/mock_protocol/addteststation.json similarity index 100% rename from test/experiments/mock_protocol/addteststation.json rename to unilabos/test/experiments/mock_protocol/addteststation.json diff --git a/test/experiments/mock_protocol/centrifugeteststation.json b/unilabos/test/experiments/mock_protocol/centrifugeteststation.json similarity index 100% rename from test/experiments/mock_protocol/centrifugeteststation.json rename to unilabos/test/experiments/mock_protocol/centrifugeteststation.json diff --git a/test/experiments/mock_protocol/cleanvesselteststation.json b/unilabos/test/experiments/mock_protocol/cleanvesselteststation.json similarity index 100% rename from test/experiments/mock_protocol/cleanvesselteststation.json rename to unilabos/test/experiments/mock_protocol/cleanvesselteststation.json diff --git a/test/experiments/mock_protocol/dissolveteststation.json b/unilabos/test/experiments/mock_protocol/dissolveteststation.json similarity index 100% rename from test/experiments/mock_protocol/dissolveteststation.json rename to unilabos/test/experiments/mock_protocol/dissolveteststation.json diff --git a/test/experiments/mock_protocol/filterteststation.json b/unilabos/test/experiments/mock_protocol/filterteststation.json similarity index 100% rename from test/experiments/mock_protocol/filterteststation.json rename to unilabos/test/experiments/mock_protocol/filterteststation.json diff --git a/test/experiments/mock_protocol/filterthroughteststation.json b/unilabos/test/experiments/mock_protocol/filterthroughteststation.json similarity index 100% rename from test/experiments/mock_protocol/filterthroughteststation.json rename to unilabos/test/experiments/mock_protocol/filterthroughteststation.json diff --git a/test/experiments/mock_protocol/heatchillteststation.json b/unilabos/test/experiments/mock_protocol/heatchillteststation.json similarity index 100% rename from test/experiments/mock_protocol/heatchillteststation.json rename to unilabos/test/experiments/mock_protocol/heatchillteststation.json diff --git a/test/experiments/mock_protocol/runcolumnteststation.json b/unilabos/test/experiments/mock_protocol/runcolumnteststation.json similarity index 100% rename from test/experiments/mock_protocol/runcolumnteststation.json rename to unilabos/test/experiments/mock_protocol/runcolumnteststation.json diff --git a/test/experiments/mock_protocol/stirteststation.json b/unilabos/test/experiments/mock_protocol/stirteststation.json similarity index 100% rename from test/experiments/mock_protocol/stirteststation.json rename to unilabos/test/experiments/mock_protocol/stirteststation.json diff --git a/test/experiments/mock_protocol/transferteststation.json b/unilabos/test/experiments/mock_protocol/transferteststation.json similarity index 100% rename from test/experiments/mock_protocol/transferteststation.json rename to unilabos/test/experiments/mock_protocol/transferteststation.json diff --git a/test/experiments/mock_protocol/washsolidteststation.json b/unilabos/test/experiments/mock_protocol/washsolidteststation.json similarity index 100% rename from test/experiments/mock_protocol/washsolidteststation.json rename to unilabos/test/experiments/mock_protocol/washsolidteststation.json diff --git a/test/experiments/mock_reactor.json b/unilabos/test/experiments/mock_reactor.json similarity index 100% rename from test/experiments/mock_reactor.json rename to unilabos/test/experiments/mock_reactor.json diff --git a/test/experiments/opcua_example.json b/unilabos/test/experiments/opcua_example.json similarity index 100% rename from test/experiments/opcua_example.json rename to unilabos/test/experiments/opcua_example.json diff --git a/test/experiments/plr_test.json b/unilabos/test/experiments/plr_test.json similarity index 100% rename from test/experiments/plr_test.json rename to unilabos/test/experiments/plr_test.json diff --git a/test/experiments/plr_test_converted.json b/unilabos/test/experiments/plr_test_converted.json similarity index 100% rename from test/experiments/plr_test_converted.json rename to unilabos/test/experiments/plr_test_converted.json diff --git a/test/experiments/plr_test_converted_slim.json b/unilabos/test/experiments/plr_test_converted_slim.json similarity index 100% rename from test/experiments/plr_test_converted_slim.json rename to unilabos/test/experiments/plr_test_converted_slim.json diff --git a/test/experiments/prcxi_9300.json b/unilabos/test/experiments/prcxi_9300.json similarity index 100% rename from test/experiments/prcxi_9300.json rename to unilabos/test/experiments/prcxi_9300.json diff --git a/test/experiments/prcxi_9320.json b/unilabos/test/experiments/prcxi_9320.json similarity index 100% rename from test/experiments/prcxi_9320.json rename to unilabos/test/experiments/prcxi_9320.json diff --git a/test/experiments/prcxi_9320_visual.json b/unilabos/test/experiments/prcxi_9320_visual.json similarity index 100% rename from test/experiments/prcxi_9320_visual.json rename to unilabos/test/experiments/prcxi_9320_visual.json diff --git a/test/experiments/reaction_station_bioyond.json b/unilabos/test/experiments/reaction_station_bioyond.json similarity index 100% rename from test/experiments/reaction_station_bioyond.json rename to unilabos/test/experiments/reaction_station_bioyond.json diff --git a/test/experiments/reaction_station_bioyond_test.json b/unilabos/test/experiments/reaction_station_bioyond_test.json similarity index 100% rename from test/experiments/reaction_station_bioyond_test.json rename to unilabos/test/experiments/reaction_station_bioyond_test.json diff --git a/test/experiments/test.json b/unilabos/test/experiments/test.json similarity index 100% rename from test/experiments/test.json rename to unilabos/test/experiments/test.json diff --git a/test/experiments/test_copy.json b/unilabos/test/experiments/test_copy.json similarity index 100% rename from test/experiments/test_copy.json rename to unilabos/test/experiments/test_copy.json diff --git a/test/experiments/test_laiyu.json b/unilabos/test/experiments/test_laiyu.json similarity index 100% rename from test/experiments/test_laiyu.json rename to unilabos/test/experiments/test_laiyu.json diff --git a/test/experiments/test_laiyu_v.json b/unilabos/test/experiments/test_laiyu_v.json similarity index 100% rename from test/experiments/test_laiyu_v.json rename to unilabos/test/experiments/test_laiyu_v.json diff --git a/test/experiments/test_moveit.json b/unilabos/test/experiments/test_moveit.json similarity index 100% rename from test/experiments/test_moveit.json rename to unilabos/test/experiments/test_moveit.json diff --git a/test/experiments/workshop.json b/unilabos/test/experiments/workshop.json similarity index 100% rename from test/experiments/workshop.json rename to unilabos/test/experiments/workshop.json diff --git a/unilabos/test/registry/__init__.py b/unilabos/test/registry/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/registry/example_devices.py b/unilabos/test/registry/example_devices.py similarity index 100% rename from test/registry/example_devices.py rename to unilabos/test/registry/example_devices.py diff --git a/unilabos/test/resources/__init__.py b/unilabos/test/resources/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/resources/bioyond_materials_liquidhandling_1.json b/unilabos/test/resources/bioyond_materials_liquidhandling_1.json similarity index 100% rename from test/resources/bioyond_materials_liquidhandling_1.json rename to unilabos/test/resources/bioyond_materials_liquidhandling_1.json diff --git a/test/resources/bioyond_materials_liquidhandling_2.json b/unilabos/test/resources/bioyond_materials_liquidhandling_2.json similarity index 100% rename from test/resources/bioyond_materials_liquidhandling_2.json rename to unilabos/test/resources/bioyond_materials_liquidhandling_2.json diff --git a/test/resources/bioyond_materials_reaction.json b/unilabos/test/resources/bioyond_materials_reaction.json similarity index 100% rename from test/resources/bioyond_materials_reaction.json rename to unilabos/test/resources/bioyond_materials_reaction.json diff --git a/test/resources/test_bottle_carrier.py b/unilabos/test/resources/test_bottle_carrier.py similarity index 100% rename from test/resources/test_bottle_carrier.py rename to unilabos/test/resources/test_bottle_carrier.py diff --git a/test/resources/test_converter_bioyond.py b/unilabos/test/resources/test_converter_bioyond.py similarity index 100% rename from test/resources/test_converter_bioyond.py rename to unilabos/test/resources/test_converter_bioyond.py diff --git a/test/resources/test_itemized_carrier.py b/unilabos/test/resources/test_itemized_carrier.py similarity index 100% rename from test/resources/test_itemized_carrier.py rename to unilabos/test/resources/test_itemized_carrier.py diff --git a/test/resources/test_resourcetreeset.py b/unilabos/test/resources/test_resourcetreeset.py similarity index 100% rename from test/resources/test_resourcetreeset.py rename to unilabos/test/resources/test_resourcetreeset.py diff --git a/unilabos/test/ros/__init__.py b/unilabos/test/ros/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/ros/msgs/__init__.py b/unilabos/test/ros/msgs/__init__.py similarity index 100% rename from test/ros/msgs/__init__.py rename to unilabos/test/ros/msgs/__init__.py diff --git a/test/ros/msgs/test_basic.py b/unilabos/test/ros/msgs/test_basic.py similarity index 100% rename from test/ros/msgs/test_basic.py rename to unilabos/test/ros/msgs/test_basic.py diff --git a/test/ros/msgs/test_conversion.py b/unilabos/test/ros/msgs/test_conversion.py similarity index 100% rename from test/ros/msgs/test_conversion.py rename to unilabos/test/ros/msgs/test_conversion.py diff --git a/test/ros/msgs/test_mapping.py b/unilabos/test/ros/msgs/test_mapping.py similarity index 100% rename from test/ros/msgs/test_mapping.py rename to unilabos/test/ros/msgs/test_mapping.py diff --git a/test/ros/msgs/test_runner.py b/unilabos/test/ros/msgs/test_runner.py similarity index 100% rename from test/ros/msgs/test_runner.py rename to unilabos/test/ros/msgs/test_runner.py diff --git a/unilabos/test/workflow/__init__.py b/unilabos/test/workflow/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/workflow/example_bio.json b/unilabos/test/workflow/example_bio.json similarity index 100% rename from test/workflow/example_bio.json rename to unilabos/test/workflow/example_bio.json diff --git a/test/workflow/example_bio_graph.png b/unilabos/test/workflow/example_bio_graph.png similarity index 100% rename from test/workflow/example_bio_graph.png rename to unilabos/test/workflow/example_bio_graph.png diff --git a/test/workflow/example_prcxi.json b/unilabos/test/workflow/example_prcxi.json similarity index 100% rename from test/workflow/example_prcxi.json rename to unilabos/test/workflow/example_prcxi.json diff --git a/test/workflow/example_prcxi_graph.png b/unilabos/test/workflow/example_prcxi_graph.png similarity index 100% rename from test/workflow/example_prcxi_graph.png rename to unilabos/test/workflow/example_prcxi_graph.png diff --git a/test/workflow/example_prcxi_graph_20251022_1359.png b/unilabos/test/workflow/example_prcxi_graph_20251022_1359.png similarity index 100% rename from test/workflow/example_prcxi_graph_20251022_1359.png rename to unilabos/test/workflow/example_prcxi_graph_20251022_1359.png diff --git a/test/workflow/merge_workflow.py b/unilabos/test/workflow/merge_workflow.py similarity index 100% rename from test/workflow/merge_workflow.py rename to unilabos/test/workflow/merge_workflow.py