4. 多源异构实验数据采集
自驱动实验室的“数据闭环”之所以难,往往不在于算法,而在于数据入口。一个典型实验站里,同一时刻可能并行产生四类数据:传感器以毫秒级连续输出温度、压力、流量;分析仪器在单次测量结束后吐出一份带谱图的结果文件;机器人执行日志记录“何时抓取了哪个孔位的样品”;LIMS/ELN 则保存样品编号、实验条件与人工录入的结论。这四类数据在格式、频率、时间基准和语义粒度上完全不同,若不在采集层做统一处理,后续的建模与决策就会建立在错位的时间轴上。
四类数据源的接入方式
接入方式的选择取决于数据源的“主动程度”。传感器通常是被动读取型:PLC 或数据采集卡通过 Modbus TCP、OPC UA 或串口周期性读取寄存器,采集程序按固定周期轮询。以 OPC UA 为例,客户端订阅一个节点后,服务端按设定的 publishing interval 推送数值,采集端只需维护订阅关系,不必自己写轮询循环。
分析仪器多为“文件产出型”。色谱、质谱、XRD 等设备在测量完成后生成 CSV、JCAMP-DX 或厂商私有格式文件。接入方式通常是目录监听:采集服务监控仪器输出目录,检测到新文件即读取、解析并登记。部分仪器支持 SiLA 2 或厂商 API,可主动查询状态与结果,但文件监听仍是兼容性最好的兜底方案。
机器人执行日志来自控制器的运行记录,常见形式是逐行追加的文本日志或通过 ROS 话题发布的 JSON 消息。接入时既要拿到“动作完成”事件,也要拿到动作对应的孔位、样品 ID 和时间戳。若机器人控制器支持,应优先订阅其状态话题;否则解析日志文件,但需注意日志写入存在缓冲延迟。
LIMS/ELN 是“事务型”数据源,数据通过 REST API 或数据库查询获取。接入时应以样品 ID 或实验批次为主键,拉取样品元数据、实验条件与人工结论。LIMS 的数据更新频率低,但语义价值高,是其他三类数据的“身份锚点”。
采样频率的差异与处理
四类数据源的采样频率跨度极大。传感器可能以 100 Hz 输出,机器人动作事件每秒只有几次,分析仪器一次测量耗时数分钟到数小时,LIMS 记录则可能一天只更新几次。采集层不应试图把所有数据“拉平”到同一频率,而应保留原始频率,在同步层按需处理。
对高频传感器数据,常见做法是保留原始序列,同时生成降采样版本。例如温度以 100 Hz 采集,可按 1 秒窗口计算均值与标准差,写入时序数据库;原始数据保留在文件或对象存储中,供需要时回溯。降采样不是丢弃信息,而是为不同用途提供不同粒度的视图。
对低频事件型数据,关键是记录精确的事件时间戳。机器人完成一次移液动作时,控制器应输出带时间戳的事件消息;若只能解析日志,则需在采集端记录“读到该行日志”的时间,并尽量通过日志内的序号或控制器时钟校正。分析仪器结果文件通常自带采集开始时间,解析时应提取该字段而非使用文件创建时间。
时间同步策略
时间同步的目标是让所有数据源共享同一时间基准。第一步是时钟同步:采集服务器、仪器工作站、机器人控制器应统一通过 NTP 与同一时间源同步,要求高的场景可使用 PTP 达到亚毫秒级。第二步是时间戳标注:每条记录至少携带两个时间戳——设备本地时间(device_ts)和采集网关接收时间(gateway_ts)。两者都保留,便于排查时钟偏差。
第三步是事件对齐。自驱动实验室的核心逻辑通常围绕“一次实验操作”展开:机器人抓取样品、放入仪器、仪器测量、结果返回。对齐时以机器人动作事件为锚点,向前后各取一个时间窗口,将窗口内的传感器数据、仪器结果和 LIMS 记录关联到同一个 experiment_event 上。窗口大小根据实验节奏设定,例如移液后 30 秒内的温度数据、仪器测量开始后全程的压力曲线。
一个可参考的采集配置示例
以下是一个采集服务的配置片段,用于说明四类数据源如何在同一服务中注册。参数为教学示例,实际值需根据设备手册和实验节奏调整。
sources:
- id: reactor_temp
type: opcua
endpoint: "opc.tcp://192.168.1.10:4840"
node: "ns=2;s=Reactor.Temp"
sampling_hz: 100
buffer: 5000
- id: hplc_result
type: file_watch
watch_dir: "/data/hplc/export"
pattern: "*.csv"
parser: "hplc_csv_v2"
- id: robot_arm
type: ros_topic
topic: "/robot/action_event"
msg_type: "lab_msgs/ActionEvent"
- id: lims_sample
type: rest_poll
url: "https://lims.example.org/api/samples"
poll_interval_s: 300
key_field: "sample_id"
sync:
ntp_server: "ntp.lab.local"
default_window_s: 30
resample:
reactor_temp: "1s_mean_std"
配置中 sampling_hz 控制传感器轮询频率,poll_interval_s 控制 LIMS 拉取周期,default_window_s 定义事件对齐窗口。采集服务启动后,可通过检查各 source 的 last_seen_ts 与 seq_no 连续性判断是否正常。若某传感器 seq_no 出现跳变,说明存在丢包或采集阻塞;若 gateway_ts 与 device_ts 偏差持续增大,说明时钟同步异常,需要检查 NTP 服务。
结果判断与常见问题
采集是否健康,可以从三个信号判断:一是各源数据的时间戳偏差是否在允许范围内(例如传感器与网关偏差小于 50 ms);二是事件对齐后,每个 experiment_event 是否都能关联到完整的四类记录;三是降采样后的数据是否保留了关键趋势,例如温度曲线的峰值是否仍然可见。
常见问题包括:仪器结果文件延迟写入导致对齐窗口错过、机器人日志缓冲导致事件时间戳偏晚、LIMS 样品 ID 与机器人使用的孔位编号不一致。前两者通过增大窗口或改用事件触发采集缓解,后者需要在采集层建立孔位与样品 ID 的映射表,并在入库前做一致性校验。只有把采集层的时间与身份两条线都对齐,后续的数据闭环才有可靠的基础。