设备维护这行,最怕的不是设备突然坏,而是它“看起来一切正常”,直到某天轴承碎了、电机烧了,生产线全线停摆,你才知道自己漏掉了一整个故障演化过程。我做过好几个预测性维护项目,踩够了坑之后,围绕振动信号做了一个名为VibeSentinel-AI的边缘AI项目:在一块算力不大的边缘硬件上完成振动采集、特征提取、AI推理和告警输出,不依赖云端也能持续监控设备健康状态。这套系统最主要的检测对象是旋转设备,包括电机、泵、风机、空压机、减速机这类在工厂里遍地都是的“老黄牛”。如果你正在考虑给自己的产线设备加一套状态监测,又不想一上来就上大型平台、不想常年养一个算法团队,这篇内容应该能给你一套可以落地的思路。
1. VibeSentinel-AI要解决的真问题:设备不是“突然坏掉”的
先讲一次让我印象很深的故障复盘。某条产线上的一台冷却水泵,老师傅巡检时用手摸管道、听声音,说“这泵好像有点闷,但又不至于停”。三周之后,轴承保持架断裂,叶轮扫膛,电机过载跳闸,产线停了四个多小时。事后拆机,轴承已经明显磨损剥落,但在这之前,所有常规巡检记录都写的是“正常”。
这就是工业设备最常见的陷阱:故障不是突然发生的,而是一直在悄悄演化,只是我们常规手段的采样尺度太粗,没看见。
1.1 从P-F曲线理解“能预测”的时间窗口
预测性维护里有个很重要的概念叫P-F曲线。P点代表设备开始出现可检测的潜在故障(Potential failure),F点是功能失效(Functional failure),也就是设备真正趴窝。从P到F之间的这段窗口,就是我们能做动作的黄金时间。不同的故障类型,这个窗口长度差异极大:轴承润滑不良、磨损这类渐进型故障,窗口可能有几周甚至几个月;齿轮断齿这类突发型故障,窗口可能只有几天。预测性维护的价值,就是在P点附近把它找出来,而不是等到F点被它打趴。
这段线说起来简单,真正难的是在P点附近有信号可测。设备在P点之前,振动、温度、电流的变化都极其微弱,可能只有正常值的5%到10%。等振动大到人人都能听出来异常时,往往已经快到F点了。
1.2 振动为什么是“信息量最大”的体检指标
设备状态监测有电流、温度、油液、振动好几个维度。温度能发现过热和润滑问题,但响应很慢,轴承内部已经微裂纹了,外壳温度可能还没什么变化;油液分析能发现磨损颗粒,但要停机取样送检,时效性太差;电流分析适合电机侧故障,但对泵、风机的机械故障不够直接。相比之下,振动是机械状态变化的最早响应者:轴承剥落、齿轮点蚀、轴不对中、转子不平衡,都会直接表现为特定的振动特征。振动又是唯一能定位到具体部件的信号——通过特征频率,你能大致判断问题在外圈、内圈、滚动体还是保持架。
VibeSentinel-AI的“Vibe”就来自这里:把振动信号当成设备泄露故障的语言,然后让边缘AI学会听懂它。
1.3 为什么非要“Edge-AI”,而不是全部上云
我最早做的一个版本是把原始波形全部传回云端,在服务器上跑分析。结果发现几个现实问题:车间网络不稳定,数据量一大就卡;设备上百台,云端带宽和存储成本压不住;最尴尬的是,一旦断网,监控就瞎了。后来我调整了架构思路——让数据在现场就地处理,边缘节点直接输出“正常/异常/故障类型”,云端只做趋势汇总和可视化。这就是Edge-AI的核心逻辑:感知和判断在边缘完成,云端只是辅助。
VibeSentinel-AI的定位也因此很明确:它是一个部署在设备旁边的“振动哨兵”,不是一个大而全的数据平台。初期目标就是单机值守,插上电、贴上传感器、连上网线,半天之内跑起来。不做复杂的数字孪生,不做精密的多体动力学仿真,就是老老实实地把振动信号一步步变成维护建议。
2. 振动信号的采集与特征设计:喂给AI之前先把它变成“懂故障”的数字
AI模型再强,吃的也是前面的信号。振动采集这条链路上任何一环出问题,后面所有算法都是在垃圾数据上做文章。这个项目里我花在传感器选型、安装和特征设计上的时间,比训练模型的时间多好几倍,收益也最大。
2.1 传感器选型:IEPE压电还是数字MEMS
工业振动监测常用的传感器有两类。一类是IEPE压电式加速度计,频率响应宽、测量精度高,是传统振动分析仪的标准配置,但需要恒流源供电和信号调理电路,接线和硬件成本都不低。另一类是数字MEMS加速度计,内置ADC,直接输出数字信号,功耗低、体积小、SPI/I2C就能读,非常适合边缘节点。
VibeSentinel-AI的传感器节点用的是数字MEMS方案,具体型号我选了ADXL357这类低噪声、低功耗的数字三轴加速度计,量程±16g,内置20位ADC,分辨率能做到微g级别。对于轴承早期故障监测,这个精度够用。唯一要注意的是MEMS的带宽一般不如压电式,通常到几千赫兹,太高频的成分测不到。所以这套系统早期主要针对转速不高的设备,比如电机直联泵、风机这类,轴承故障特征频率通常在几kHz以内。
2.2 采样率、窗口长度与FFT的工程取舍
振动信号要变成频谱,先要过采样和FFT。采样率选多少,取决于你关心的最高频率。按采样定理,要分析到fmax,采样率至少2fmax,实际工程上会留出30%到50%余量。我的节点默认采样率是25.6kHz,理论分析带宽到10kHz以上,对大多数电机、泵的轴承故障诊断够了。如果设备转速很低,比如大型回转窑、低速重载设备,可以把采样率降下来,省存储也省算力。
FFT的窗口长度决定频率分辨率。公式很简单:频率分辨率 = 采样率 / FFT点数。25.6kHz采样,做8192点FFT,频率分辨率大约3.1Hz。对高速轴承的故障特征频率(通常几百到几千赫兹)够用;但如果设备转速只有300转左右,转频才5Hz,轴承特征频率间隔也很密,就需要更长的FFT点数,比如16384或32768点,甚至用Zoom-FFT把目标频段放大来看。
每个分析周期我采集2秒原始数据,也就是大约51200个采样点,切成若干段做FFT后取平均,能有效抑制噪声干扰。这里有个工程上的平衡:窗口越长,频率分辨率越高,但实时性和存储压力也会上来。对边缘节点来说,2秒一个周期,足够及时,又不会让MCU忙不过来。
2.3 特征库设计:从原始波形到AI输入
原始频谱几千个频点直接丢给AI,边缘算力扛不住,模型也容易过拟合。我把特征分成三层,组合成一个30到50维的特征向量:
时域特征包括均方根值RMS、峰值、峭度、波形因子、峰值因子,以及标准差。RMS反映振动能量整体水平,对应ISO振动烈度;峭度则对早期故障的瞬态冲击特别敏感,轴承早期剥落时,峭度会明显上升。
频域特征包括总频谱能量、若干关键频段的能量占比、基频及其谐波处的幅值,还有边频带能量。这些特征能把轴承故障、不平衡、不对中、松动这几类典型问题区分开。
包络谱特征是我的重点。轴承早期故障的冲击信号会被高频共振调制,直接看原始频谱往往只有一个宽泛的“凸包”,看不出故障频率。这时需要用带通滤波+希尔伯特变换做包络解调,把低频的故障特征频率解出来。这个步骤对轴承故障识别特别关键,也是VibeSentinel-AI在早期故障上能提前预警的核心原因之一。
这些特征提取逻辑,我直接用Python的SciPy库实现,然后在边缘盒子上跑。每2秒窗口算完一个特征向量,作为一条样本进入AI模型。整个前处理在Jetson Nano上跑一次大约200毫秒,绰绰有余。
3. Edge-AI模型建设:在车间里认出故障形态
特征有了,下一步是让机器“学会”从特征向量里判断设备状态。这一段我踩过不少坑,最核心的经验是:边缘AI不等于一定要上深度学习大模型,更重要的是模型的精度、资源占用和可解释性之间的平衡。
3.1 一阶段模型选择:无监督异常检测,而不是一上来就分类
工业场景最尴尬的是故障样本太少。设备正常跑着的样本一大把,但真要“坏一次”才能留一份故障数据,成本太高。所以VibeSentinel-AI的第一个AI模型没有用传统的有监督分类,而是选择了无监督异常检测:只用正常状态的数据来训练,让模型学习“正常长什么样”,之后新数据一旦偏离正常分布,就标记为异常。
我第一版用的模型是孤立森林。这个算法对高维特征工程很友好,速度快,内存占用小,边缘端完全跑得动。核心思路是用随机超平面反复切分特征空间,异常点往往是又少又“孤立”的,很容易被少切几刀就隔离出来。实测下来,对于轴承磨损、不对中这类会改变振动特征分布的故障,孤立森林能在RMS还没超过硬阈值时,就先从分布偏移的角度给出预警。
为什么不用XGBoost?不是它不好,而是异常检测场景下,无监督方法天然就不需要标签数据,冷启动成本低。等到后期积累了一些有价值的故障样本,再训练有监督分类器,判断具体是外圈故障还是内圈故障、齿轮问题还是轴承问题。
3.2 轻量CNN做故障分类的时机和代价
当样本库攒到一定程度,我开始加第二个模型:一个很轻的1D-CNN分类器,输入是归一化后的特征向量或小段频谱,输出是故障类别。这个网络只有两层卷积加一个全连接层,参数量几十万,在TensorFlow里训练,导出成TensorRT的FP16/INT8模型后,推理一次只要几毫秒。
但这里有个代价问题:CNN需要带标签数据,而且对数据分布很敏感。同一个轴承型号,装在一台新泵上和装在旧泵上,振动特征可能完全不同。所以我没有让CNN独立决策,而是把它放在孤立森林已经触发异常之后的“二次确认”环节。这个分工后来被证明非常明智:异常检测负责广撒网,分类模型负责精定位。
3.3 边缘硬件上的部署实践:量化、裁剪和模型格式
VibeSentinel-AI的边缘盒子最开始是树莓派CM4,后来换成NVIDIA Jetson Nano。树莓派是ARM CPU,跑Python和ONNX Runtime没问题;但Jetson有GPU和TensorRT加速,同样的模型推理速度快一个量级,功耗还在可接受范围。
把训练好的PyTorch模型导到边缘,我走的路子是:PyTorch -> ONNX -> TensorRT。ONNX是中间格式,TensorRT是NVIDIA的推理引擎。在Jetson Nano上,我把FP32模型量化成INT8,模型体积缩小约75%,推理速度提升3倍左右,精度损失在分类任务上大约2到3个百分点,对故障判断这种容错场景完全可接受。
有两个部署上的细节特别提醒新手:
一是模型输入输出的固定化。边缘推理时输入的特征向量维度、类型、归一化参数,必须和训练时完全一致,否则模型表现会突然崩掉。我因此在校验程序里加了一个“输入自检”,每次启动时喂一条已知样本,对比输出是否在预期范围内。
二是模型版本管理。很多搞部署的人会忽略这件事。模型升版之后,旧版本的特征分布可能在兼容性上出问题。我在SD卡里保留旧模型文件,新模型先在“观察模式”下跑一周,输出只记录不告警,确认无误再切换为正式模式。这套流程帮我避免过至少两次“模型更新反而误报”的事故。
4. 实时推理与告警机制:哨兵怎么做到既敏锐又不“狼来了”
一个预测性维护系统光把模型跑通不算完,真正决定它能不能被现场接受的是告警机制。这里有一个致命矛盾:模型必须足够灵敏,在故障早期就把异常捞出来;但同时不能太灵敏,否则三个月报一百次假警,运维人员很快就再也不看你的告警了。VibeSentinel-AI里,我采用的是“双通道检测 + 分级告警”的设计。
4.1 双通道检测:物理阈值兜底,AI评分看趋势
通道A是物理阈值通道,完全不依赖AI模型。系统对每一组特征做硬性判断:RMS是否超过ISO 10816-3振动烈度标准对应区域的危险阈值,峰值是否超过设定值,峭度是否连续多帧超过某个高位线。这条通道的目的很纯粹:不管什么工况、什么模型,一旦振动已经大到物理上危险的级别,立即触发保护动作,该停机就停机,该报警就报警。它不会告诉我故障具体是哪一类,但能保证在最坏情况下系统不失守。
通道B是AI异常评分通道。孤立森林模型会输出一个异常分数,我把它归一化到0到100,得到一个健康度反向指标。单纯看它是否超过某个阈值还不够,我真正关注的是它的趋势:异常分数连续多少帧上升、上升速率是多少。轴承早期故障的特征是异常分数像爬坡一样逐日走高,而随机扰动则是一会儿高一会儿低,没有持续性。用“持续上升N帧才告警”这个规则,能过滤掉大部分随机噪声造成的误报。
4.2 告警分级与触发动作
VibeSentinel-AI把告警分成了四个级别。信息级:异常分数轻微上升,只记录不打扰;预警级:异常分数连续上升,系统推送一条消息给设备管理员,并建议安排一次人工点检;严重级:已经诊断出具体故障类型且置信度较高,建议停机检修;危险级:物理阈值通道触发,直接通过继电器输出联动控制柜断电或降载。
这种分级机制很受欢迎,因为现场的维修师傅不需要成天盯着仪表盘,只要在预警级才需要真正动起来。我做过一次统计,所有被我确认的早期故障里,大约80%都先过了预警级,然后才在两周内走到严重级。这说明在两个星期前,系统就已经给了人准备时间,这正是预测性维护该有的提前量。
4.3 数据回传与本地黑匣子的配合
虽然推理在边缘,但数据不能完全不上报。我的方案是:边缘节点实时把特征向量、异常分数、告警级别通过MQTT协议发送到本地服务器,服务器端用InfluxDB存储时序数据,用Grafana做可视化面板。这样运维人员可以随时在浏览器里看振动趋势和健康度曲线。但所有原始波形数据,我会让边缘节点自己保留在SD卡里,按天滚动存储,只保留最近一个月。断网时系统完全独立工作,告警和记录都不受影响;网络恢复后,缓存的事件会补传上来。
这条“本地黑匣子+边缘决策+云端展示”的组合拳,是整套系统稳定性的基石。我在项目早期吃过一次亏:全部数据上云之后,车间一次网络交换机挂掉,整个监控系统瘫痪了两天,恰好那两天设备出了问题。从那之后,我再也不敢把核心判断逻辑放在远端了。
5. 现场实测、调参手感与踩坑记录
最后讲点实际的。VibeSentinel-AI在实验室里跑通之后,我在两台电机直联泵、一台空压机上做了长期挂机测试,跑了三个月,也经历了第一起真正的早期故障识别。这段实测给我最大的启发是:算法只是项目的一半,另一半是现场工程、阈值调参和与人协作。
5.1 三台设备的实测结果
我把三个比较有代表性的case整理成了表格,里面包含我自己的测试数据,不代表任何第三方标准,仅供参考:
| 设备 | 故障情况 | 检出方式 | 提前量 | 误报参考 |
|---|---|---|---|---|
| 电机直联泵A | 轴承外圈早期磨损 | AI异常评分连续走高,包络谱出现外圈特征频率 | 提前约12天预警 | 前一周有2次低频扰动误报,调参后消失 |
| 电机直联泵B | 转子不对中(安装偏差) | 物理阈值通道先告警,AI确认2倍转频处能量异常 | 提前约3天 | 无 |
| 空压机C | 皮带磨损导致振动杂乱 | 只触发信息级,RMS未超阈值 | 未形成有效预警 | 误报4次,原因与负载波动有关,后续对条件做了优化 |
泵A的案例最有价值。现场是做例行保养时拆开轴承箱,发现外圈滚道面上有一点细小的剥落点,如果继续跑,大概率会发展成我之前讲过的那种两周后碎裂的案例。而VibeSentinel-AI在12天前就给出了预警,当时的RMS还完全在正常范围内,只有AI异常评分在持续爬坡、包络谱里外圈故障特征频率小幅冒头。这就是早期检测和“等到明显了再说”之间的本质差别。
5.2 最容易翻车的三个坑
第一个坑是采样率不够导致混叠。我最初为了省存储,把采样率降到10kHz,结果高频振动成分通过欠采样折叠到低频段,在频谱里制造出一大堆“幽灵谱峰”,AI模型稀里糊涂地学了一堆错误特征。后来我重新确认奈奎斯特定理才是硬约束:你关心的频段上限是多少,采样率就必须至少两倍以上,工程上还要再留余量。这不只是理论问题,直接决定你的元凶排查方向是否可靠。
第二个坑是传感器安装不良。有一次我图省事用磁吸座把传感器吸在电机外壳上,结果频谱里出现大量莫名其妙的边频带,还夹杂塑料撞击一样的杂波,初看以为是轴承故障。后来排查发现是磁吸座的机械共振和松动造成的伪特征。从那以后,只要能打孔安装,我绝不用磁吸;安装完成后先敲击传感器附近的壳体,看波形里有没有衰减振荡,确认安装牢固才正式开始采集。这个“安装验证”步骤虽然土,但效果极其立竿见影。
第三个坑是工况变化造成的模型失效。空压机C的负载变化频繁,转速和负荷不稳定,导致特征分布跟着漂移,AI模型在特定工况下反复误报。我的解法是把工况分段:按转速、负荷把正常运行数据分成几个区域,每个区域单独训练异常模型,推理时先判断当前工况属于哪一段,再用对应的模型做判断。调整之后,误报率立刻降下来了。
5.3 运维细节与调参心得
阈值和基线不是设完就不动的。新设备投运后,头两周我都是每天看一眼特征值趋势,确认稳定后,把这段时间的数据均值作为基线,再根据基线的标准差设置告警的偏移阈值。每过一个月,在没有异常的情况下,我会重新滑动更新一次基线,让系统适应季节温度和负载的自然变化。
还有一个经验是关于告警疲劳的。做这套系统最重要的不是“报得多”,而是“报得准”。我不会把告警阈值设得太敏感,让系统在真正故障早期就反复刷屏。宁可它偶尔漏掉一个还没到P点的极早期异常,也不能天天狼来了。人一旦对告警疲劳,再好的系统也会变成摆设。我的做法是每次告警都附带一段可解释的信息:异常分数趋势图、最可能相关的故障特征频率、触发的物理指标,让维修师傅一看就知道这个告警为什么存在,值不值得处理。透明、可解释,比“算法说有问题”更能赢得一线工程师的信任。
最终这个项目还在持续迭代中。目前在往多传感器融合方向发展,把电机电流信号和温度信号也接进特征向量里,用来辅助区分电气故障和机械故障;另一个方向是把模型压缩到更小的MCU上,彻底去掉边缘盒子,让传感器节点本身就是AI节点。如果你也想从零搭一套类似的边缘预测性维护系统,我给的建议一贯是:先别急着找高端算法、堆复杂模型,老老实实把传感器装好、把波形采干净、把RMS和峭度两个指标先盯一个月,你一定会发现设备原来比想象中话多得多。