(instructions)=
# 设备抽象、指令集与通信中间件

Uni-Lab 操作系统的目的是将不同类型和厂家的实验仪器进行抽象统一，对应用层提供服务。因此，理清实验室设备之间的业务逻辑至关重要。

## 设备间通信模式

### **[话题（一对多发送，一对多订阅）](https://book.guyuehome.com/ROS2/2.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5/2.4_%E8%AF%9D%E9%A2%98/)**

典型的话题通信有：

* 传感器连续发送设备状态和数据；
* 连续时间控制器发送控制指令，如控温、连续称量、机械臂轨迹跟随、视觉识别操作等

![](image/01-communication-instruction/topic.gif)

### **[服务（短时请求与响应）](https://book.guyuehome.com/ROS2/2.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5/2.5_%E6%9C%8D%E5%8A%A1/)**

典型的服务通信有：

* 查/改全局参数如物料、设备
* 使用其他通信接口发送/接收数据

![](image/01-communication-instruction/service.gif)

### **[动作（长时任务启动，随后连续收到反馈值，直到达到目标）](https://book.guyuehome.com/ROS2/2.%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5/2.7_%E5%8A%A8%E4%BD%9C/)**

动作机制主要用于处理运行时长较长的单点任务或任务组合，如：

* 执行工作流
* 执行工作流的子动作

![](image/01-communication-instruction/action.gif)

## 通信指令集

Uni-Lab 目前使用 ROS2 作为通信中间件，因此大量使用其标准消息作为话题、服务、动作。新增指令位于仓库中的 `unilabos_msgs` ，各类实验动作指令集分类整理于 {ref}`actions`

## 通信中间件层

通信中间件层的一个重要设计思想是：将业务逻辑开发，与实际部署中的通信和运行解耦。开发者在实现具体业务逻辑时，可以不用关心最终运行时的 **部署方式** 、 **通信方式** 。当用户开发完成后，再根据实际情况决定部署、通信方案。

* 对于 **“流动化学实验室”和“桌面机器人”** 来说，一台电脑通过串口控制所有设备足够。**此时在这台电脑启动 Uni-Lab 作为 Server 即可。**
* 对于 **“移动机器人”大型实验室** ，典型场景是，一个实验室由多台不同位置的工作站组成，每台大型设备有一台工控机，通过串口再控制子设备。同时有 AGV/机械臂 负责转运。**此时，在每台工控机启动 Uni-Lab，完成通信中间件层的包装之后，只要处于同一局域网下，他们将能自动互相发现并组成分布式的“Uni-Lab-Edge Server”。**
* 通信中间件层的分布式机制，使得 Node 之间做好了隔离，一台设备故障时只需重启单个 Node。很像微服务、微内核的设计理念。
