3. 船舶设备传感器数据采集与理解

预测性维护的起点不是模型,而是数据。船上主机、辅机、泵组、舵机、锅炉等设备在运行中会产生大量物理量变化,传感器负责把这些变化转换为可记录的电信号。若采集环节理解不清,后续的特征提取和故障判断都会建立在不可靠的输入之上。本节围绕四类最常见传感器、采样频率选择、数据质量判断,以及用 Python 读取与检查数据展开。

四类常见传感器及其数据含义

振动传感器通常安装在主机缸头、增压器、泵轴承座、齿轮箱等位置,输出加速度(m/s²)或速度(mm/s)信号。振动数据的特点是频率成分丰富,既能反映转子不平衡、不对中,也能反映轴承点蚀等冲击性故障,因此对采样频率要求最高。温度传感器多为铂电阻或热电偶,测量缸套冷却水出口温度、滑油温度、排气温度等,变化缓慢但趋势性强,是判断热负荷与冷却状态的重要依据。压力传感器用于滑油压力、燃油压力、冷却水压力、压缩空气压力等,常以 MPa 或 bar 为单位,既看稳态值也看波动。流量传感器测量冷却水、燃油、滑油的体积或质量流量,常与温度、压力联合判断换热效率与泄漏。

理解传感器时要注意三个基本属性:量程、精度和安装位置。同一台泵的进出口压力差比单个压力值更能说明问题;同一轴承的振动测点方向(水平、垂直、轴向)不同,敏感故障类型也不同。采集方案设计时应把这些元数据一并记录,否则数据虽然存在却难以解释。

采样频率与数据质量

采样频率决定能保留多快的信号变化。依据奈奎斯特采样定理,采样频率至少应为关注最高频率的两倍。工程上通常取 2.56 倍以上,以便抗混叠滤波留有裕量。例如关注轴承故障特征到 2 kHz,则采样频率可取 5 kHz 以上;而冷却水温度变化以分钟计,采样周期取 1~10 秒已足够。盲目对所有通道使用高采样率会造成存储与传输压力,采样过低则会丢失冲击成分甚至产生混叠,把高频干扰折叠成虚假的低频特征。

数据质量问题主要有四类:缺失值(传感器掉线、通信中断、记录为空)、异常点(尖峰、跳变、超量程)、漂移(零点缓慢偏移)和重复或时间戳错乱。判断异常点不能只看数值大小,还要结合物理合理范围与变化速率。例如滑油压力在 1 秒内从 0.4 MPa 跳到 0.05 MPa 又恢复,更可能是信号干扰而非真实泄漏;而排气温度持续单侧偏高则可能是真实的燃烧异常。

从传感器信号到可用数据的处理链 传感器 振动 / 温度 压力 / 流量 采集与转换 ADC / 4-20mA 时间戳对齐 采样频率 ≥ 2.56 × f_max 抗混叠滤波 数据质量检查 缺失 / 异常 / 漂移 时间戳连续性 可用 数据集 典型判断规则(示例阈值,需按设备手册标定) 缺失值 空值 / 通信中断 / 时间戳断档 异常点 超量程 / 速率突变 / 3σ 偏离 漂移与重复 零点偏移 / 重复行 / 乱序 处理策略:缺失可插值或标记;异常点先标记再结合工况确认;漂移需校准或分段建模。 关键原则:不要直接删除异常点,保留原始记录与处理标记,便于追溯与复盘。

用 Python 读取 CSV 与 JSON 传感器数据

船上采集系统常导出 CSV(按时间排列的通道表)或 JSON(带元数据的嵌套记录)。下面用一段可运行的示例演示读取与初步检查。示例数据为合理构造的教学数据,不代表真实测量结果。

import pandas as pd
import numpy as np

# 读取 CSV:时间列解析为索引
df = pd.read_csv("sensor_log.csv", parse_dates=["timestamp"])
df = df.set_index("timestamp").sort_index()

# 读取 JSON:常见结构为 records 列表
import json
with open("sensor_meta.json", "r", encoding="utf-8") as f:
    meta = json.load(f)
print(meta.get("device"), meta.get("sample_rate_hz"))

# 基本质量概览
print(df.isna().sum())              # 各通道缺失数量
print(df.index.to_series().diff().value_counts().head())  # 采样间隔分布

读取后先看三件事:时间索引是否单调递增、采样间隔是否稳定、各通道缺失比例。若采样间隔出现大量不等于标称周期的值,说明存在丢包或时钟问题,需要在后续分析中重采样或分段处理。

识别缺失值与异常点

缺失值可用 isna() 定位,短缺口可线性插值,长缺口应标记为无效段而不是强行填补。异常点检测常用两种互补方法:一是物理范围与变化速率约束,二是统计方法如 3σ 或四分位距。对振动这类高频信号,直接对原始波形做 3σ 容易把真实冲击误判为异常,通常先计算滚动均方根或峰值再判断。

# 物理范围约束(示例阈值)
limits = {"oil_pressure_mpa": (0.1, 0.8),
          "exhaust_temp_c": (200, 550)}
for col, (lo, hi) in limits.items():
    bad = df[(df[col] < lo) | (df[col] > hi)]
    print(col, "越界点数:", len(bad))

# 速率突变:相邻样本变化超过阈值
dp = df["oil_pressure_mpa"].diff().abs()
spike = df[dp > 0.15]
print("压力突变点:", spike.index.tolist())

# 统计法:滚动窗口 3σ
roll = df["exhaust_temp_c"].rolling(30, min_periods=10)
z = (df["exhaust_temp_c"] - roll.mean()) / roll.std()
outlier = df[z.abs() > 3]

得到候选异常点后不要立即删除。正确做法是新增一列标记(如 quality_flag),把“原始值、判定规则、处理动作”都保留下来。对于压力突变,还应回看同一时段的流量与温度,判断是传感器故障还是设备真实动作,例如泵启停本身就会带来压力阶跃。

采样频率、量程和单位应写入数据字典,与 CSV/JSON 一同保存。缺少元数据的数据文件,几个月后往往难以解释,也无法与其他航次数据对齐。

完成上述检查后,一份可用于预测性维护的数据应满足:时间戳连续可追溯、采样间隔符合设计、缺失与异常均有明确标记、关键通道单位统一。只有在这个基础上,后续的 trend 分析、特征提取与故障预警才具备可信的输入。