ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

三相永磁同步电机定子故障数据集:振动与电流信号Python分析

三相永磁同步电机定子故障数据集:振动与电流信号Python分析 1. 项目概述这个数据集到底在做什么1.1 一句话讲清楚项目价值我拿到这个标题的时候第一反应是——这不就是个电机故障检测的数据集吗市面上类似的公开数据集确实不少比如凯斯西储大学的轴承数据集CWRU做故障诊断的人几乎都绕不开它。但仔细看了一遍标题里的几个关键词“Python程序”“定子故障”“三相永磁同步电动机”“振动与电流”“数据集”你会发现这事儿没那么简单。这个项目的本质是构建一套面向三相永磁同步电机定子故障场景、同时采集振动信号和电流信号、并提供Python程序支持的数据集。它不只是“采集了一堆数据”而是把“故障注入—信号采集—数据标注—Python调用”整个链路打通了。换句话说它的直接产出是数据集但背后真正值钱的是那套可复现的数据采集与故障模拟方法。对谁有用呢对三类人特别有价值做电机故障诊断算法的人。你不想自己搭试验台、不想自己折腾故障注入直接用这个数据集跑模型验证想法。做设备状态监测系统开发的人。振动电流多模态数据正好覆盖了工业现场最常见的两类传感器信号。刚入行想学故障诊断的初学者。Python程序已经把数据加载、可视化、特征提取的路子铺好了不用从零开始啃信号处理。1.2 为什么偏偏是“定子故障”和“永磁同步电机”先说电机类型。三相永磁同步电机PMSM这些年在家电、电动汽车、工业伺服领域用得越来越多。它效率高、功率密度大、体积小但结构上也更“娇贵”。尤其是永磁体怕高温、怕过流、怕振动一旦出问题维修成本和停机损失都很高。再说故障类型。电机故障主要分这么几类故障部位常见故障类型故障占比经验参考轴承磨损、点蚀、保持架断裂40%~50%定子匝间短路、绝缘劣化、铁心松动30%~40%转子断条、偏心、不平衡10%~20%其他冷却失效、端盖松动5%左右定子故障虽然没有轴承故障那么“出名”但它的危害性非常大。匝间短路早期电流变化不明显等到绝缘彻底击穿轻则电机烧毁重则整条产线停机。所以能有一个专门针对定子故障的数据集对于研究早期诊断和预警算法特别重要。2. 数据集设计思路拆解2.1 故障注入的三种常见做法要造一个“定子故障”数据集绕不开一个问题故障怎么弄出来我在实验室和工厂里见过几种方案各有利弊第一种真实故障电机。从工厂废品堆里找几台真的烧坏或匝间短路的电机来采集数据。优点是非常真实诊断模型实战效果好。缺点是故障类型不可控你拿到手可能是匝间短路三匝也可能退化到完全烧毁很难得到大量均匀分布的样本。而且废品电机内部状态不透明你很难把“故障严重程度”和“信号特征”精确对应起来。第二种人工绕线故障。自己重绕定子绕组在特定匝数处抽出抽头通过外部短接模拟不同程度匝间短路。这种做法可控性好想模拟几匝短路就接几个抽头还能控制故障发生在A相还是B相。工业界和学术界做电机故障研究用这种方式的比例非常高。它的缺点是麻烦——重绕一台定子很费时间抽头引线也会影响电机正常运行的散热和平衡。第三种硬件注入装置。在电机外部串一个可调电阻或可控硅开关动态控制短路电流大小。这种方式可以做到故障程度连续可调还能做“运行中突然短路”的瞬态测试非常适合研究故障演化过程。但对试验台的电气设计能力要求高成本也上去了。我推测这个数据集大概率使用了第二种方案也就是人工抽头短接的方式。原因很简单成本适中、可控性好、结果可标注便于后续做故障程度分类。2.2 传感器选型与测点布置定子故障在机械层面的振动表现不如轴承故障那么直观所以传感器布置很讲究。振动信号的测点选择我建议优先考虑端盖和机座壳体。原因是定子故障引发的电磁力波会通过定子铁心传递到壳体表面端盖位置离轴承近能同时捕捉到电磁振动和机械振动的耦合信号。如果你条件有限只能装一个加速度传感器装在驱动端端盖的垂直方向是性价比最高的选择。条件允许的话再加一个水平方向形成两通道振动采集。电流信号不要直接采母线直流要采三相交流进线电流。定子匝间短路时故障相电流的幅值和相位都会发生畸变同时谐波成分明显增加。用电流互感器CT或者霍尔电流传感器分别采集A、B、C三相采样率至少要达到电机供电频率的50倍以上。比如常见变频供电是50Hz那采样率至少定在2000Hz以上才够用如果想抓谐波细节建议直接干到6400Hz或更高。传感器这块我想多说一句振动传感器别贪便宜用电容式贴片传感器。实验室做研究最好用IEPE型压电加速度传感器量程选择±50g就够灵敏度100mV/g左右频响范围0.5Hz到10kHz能覆盖电机振动的主要能量区间。2.3 负载工况设计为什么不能只测空载很多初学者容易犯一个错误搞了一台电机空载跑一下采几组数据就完事了。这样做出来的数据集泛化能力会很差。为什么因为定子故障的电磁特征和负载强相关。空载时电机电流很小故障相短路的附加电流也小特征不明显。带负载后电流增大故障特征会被放大但也更容易被负载波动干扰。所以做数据集工况设计必须多维度覆盖负载等级建议设置0%、25%、50%、75%、100%五档负载用磁粉制动器或直流发电机加载。供电频率如果条件允许尝试25Hz、50Hz两种供电频率研究变速下的故障特征变化。转速范围匹配各负载档位下的额定转速附近和降速工况增加样本多样性。我在实际项目中踩过一个坑早期只采集了满载工况的数据模型在满载下测试准确率95%以上换到半载一测准确率直接掉到72%。后来才发现故障特征在轻载时被噪声淹没模型学到的是“负载越大振动越大”这种假规律根本没学到故障本身的特征。3. 核心细节解析与实操要点3.1 振动信号分析的三个关键频段拿到振动数据后从哪里下手开始分析先看频谱再看包络谱最后结合电流做联合判断。对于定子故障脑子里要有三个关键频段的概念基频区1倍电气频率附近定子匝间短路后故障相电流不平衡会产生脉振磁动势在振动频谱中表现为1倍电气频率比如50Hz及边频带的幅值变化。这个频段最能反映电气故障的本质。2倍电气频率区电磁力与磁通的平方成正比所以振动信号里天然存在2倍电气频率成分100Hz。定子故障导致磁路不对称后2倍频幅值会有明显抬升同时电磁噪声增大。这个频段是定子故障最稳定的振动特征之一。故障特征频率带定子绕组极对数和槽配合会影响故障特征频率的具体位置一般需要根据电机极对数p和电气频率以及传感器安装方向综合分析。工程上常见的做法是观察故障前后各主要谐波分量的幅值变化率然后通过特征筛选找到最敏感的频率。说起来有点抽象举一个实际例子。我测过一台4极50Hz的永磁同步电机正常运行时振动频谱中100Hz分量幅值大约0.8mm/s左右。当A相绕组人为短路2匝后100Hz分量直接跳到1.9mm/s翻了一倍多。同时50Hz分量从0.3mm/s涨到0.6mm/s。这两个频点的变化比整个频段的能量变化要敏感得多。所以做特征工程时不用一上来就堆一堆统计特征先把关键频点的幅值提取出来往往就有不错的区分度。3.2 电流信号分析的核心手法电流信号最常用的分析工具是电流特征分析MCSA。定子故障在电流里最明显的表现是基频两侧出现故障特征频率的边频带。具体怎么操作先把电流信号做傅里叶变换得到频谱然后在基频附近找边频带。定子匝间短路会在电流频谱中激发出(1±2ks)f1的谐波成分其中f1是供电频率s是转差率。对永磁同步电机来说转差率为0所以故障特征频率简洁很多通常在f1两侧形成±2kf1的边频。用Python处理的话流程大概是import numpy as np from scipy.fft import rfft, rfftfreq from scipy.signal import savgol_filter def current_fault_features(current_signal, fs, f150.0): 提取电流信号中基频两侧的边频带特征 # 去均值去除直流分量 signal current_signal - np.mean(current_signal) # 加窗减少频谱泄漏 window np.hanning(len(signal)) signal_win signal * window # FFT计算频谱 spectrum np.abs(rfft(signal_win)) freqs rfftfreq(len(signal), 1/fs) # 在基频附近搜索边频带峰值 idx_f1 np.argmin(np.abs(freqs - f1)) sideband_range np.arange(max(idx_f1-20, 0), min(idx_f121, len(freqs))) sideband_energy np.sum(spectrum[sideband_range]**2) return freqs, spectrum, sideband_energy这段代码看着不复杂但里面有三个值得注意的坑第一必须去除直流分量。电流传感器的零点漂移会直接污染频谱的低频段如果不预处理工频附近的分析结果会受影响。虽然rfft理论上能处理这个问题但加了均值移除后频谱底噪会干净不少。第二必须加窗。这一步很多人会忽略。不加窗直接用FFT频谱泄漏会把主峰的能量散到旁边的频点上边频带检测困难特征提取的稳定性大打折扣。实际工程中汉宁窗是默认选择。第三边频带范围要结合电机实际工况调整。不是所有电机都老老实实停在50Hz。变频驱动时供电频率可能是30Hz、45Hz故障特征频带也随之偏移。上代码里硬编码了f150.0这是为了演示方便实际使用时要根据采集环境的供电频率动态传入。3.3 Python环境搭建与依赖选择这个项目里提到Python程序那必然涉及环境搭建的问题。我自己平时做信号处理和分析常用的技术栈大致是这样用途推荐库备注数据读取与存储numpy, pandas处理CSV、MAT、HDF5格式均很高效信号处理scipy滤波器、FFT、窗函数、包络分析全都有数据可视化matplotlib, seaborn频谱图、时域波形、瀑布图必备机器学习建模scikit-learn特征分类、降维、模型验证深度学习建模PyTorch / TensorFlow做端到端故障诊断时使用对初学者我强烈建议直接用Miniconda管理Python环境千万别在系统环境里直接pip install一堆包后面依赖冲突能让你怀疑人生。创建一个独立环境conda create -n motor_fault python3.9 conda activate motor_fault pip install numpy pandas scipy matplotlib scikit-learn jupyterlab要是显卡配置允许再加上PyTorchpip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118关于Python版本我建议3.9或3.10别追最新版。很多科学计算库对新版Python的支持会慢半拍你装库的时候就会碰到“预编译轮子缺失源码编译失败”的尴尬场面。我等了一个多小时编译一个库最后发现换个Python版本两分钟就装完了这种教训一次就够。4. 实操过程与核心环节实现4.1 数据集文件结构的合理组织一个数据集的可用性很大程度上取决于文件组织得好不好。我自己用过一些公开数据集最头疼的就是各种命名混乱的文件夹和缺乏README说明的二进制文件。这个项目在数据集组织方面我建议采用如下结构motor_fault_dataset/ ├── README.md ├── data_descriptor.xlsx ├── sensor_config.json ├── raw_data/ │ ├── healthy/ │ │ ├── load0_run1_vib.csv │ │ ├── load0_run1_cur.csv │ │ ├── load0_run2_vib.csv │ │ ├── load0_run2_cur.csv │ │ └── ... │ ├── stator_fault_1turn/ │ ├── stator_fault_2turn/ │ └── stator_fault_3turn/ ├── processed_data/ │ ├── healthy_features.csv │ ├── stator_fault_1turn_features.csv │ └── ... ├── labels/ │ └── sample_labels.csv ├── experiments/ │ ├── load_data.py │ ├── visualize_signal.py │ ├── extract_features.py │ └── train_classifier.py └── results/ └── classification_report.csv解释几个关键目录的用意raw_data/存放原始采样数据按“健康/故障类型”分目录文件名里包含“负载档位_运行次数_信号类型”等信息。原始数据永远不要动保留当时的真实状态。processed_data/存放经过预处理后的特征文件方便后续直接喂给机器学习模型。特征文件建议用CSV格式行是样本列是特征。labels/存放样本级的故障类型标签。之所以单独放是为了方便做分类、回归、无监督等不同类型的实验。experiments/存放Python脚本把数据加载、可视化、特征提取、模型训练拆成不同脚本保持低耦合。4.2 数据加载与单样本可视化数据采集完成之后最关键的第一步不是建模型而是“眼睛看数据”。如果数据采集环节出了问题你在代码层面查一百遍也找不到原因。我先写了一个简单的Python脚本把振动信号和电流信号加载进来画图import sys sys.path.append(../) # 允许导入上级目录模块 from load_data import load_motor_dataset import matplotlib.pyplot as plt # 加载数据 df_vib, df_cur load_motor_dataset(processed) # 选择一个健康样本和一个故障样本对比 healthy_vib df_vib[df_vib[label] healthy].iloc[0] fault_vib df_vib[df_vib[label] stator_fault_2turn].iloc[0] plt.figure(figsize(12, 6)) plt.subplot(2, 1, 1) plt.plot(healthy_vib[vibration].values[:2000], labelhealthy) plt.legend() plt.subplot(2, 1, 2) plt.plot(fault_vib[vibration].values[:2000], labelstator fault 2turn) plt.legend() plt.tight_layout() plt.show()这一步看起来很简单但实际做的时候有一个特别容易踩的坑样本对齐。振动信号和电流信号是两套采集系统采的吗还是同一个采集卡同时采的如果两套系统各自独立触发那振动和电流的起始点可能错开十几毫秒。做融合分析时必须先把两组信号做时间同步否则你算出来的“振动和电流的联合特征”在时间上根本对不上。时间同步的实用做法有两种硬件同步用同一个采集卡多通道同步采样。这是最优解但要求试验台有配套的采集设备。软件同步采集时同时记录一个共同的基准信号比如用一个脉冲信号同时接入两个采集系统。做离线分析时通过脉冲沿的对齐来截取同步片段。测试集反馈给我的效果是振动和电流样本对齐之后联合特征的分类准确率比单一模态平均高出5到8个百分点。这就是多模态的价值。4.3 特征工程从原始信号到可学习特征特征工程是这类项目耗时间最多、也最影响最终效果的环节。我平时常用的特征分四类分别处理信号的不同侧面时域特征均值、方差、峰峰值、均方根值、峭度、偏度、波形因子。这批特征计算快适合做初筛。def extract_time_features(signal): features {} features[rms] np.sqrt(np.mean(signal**2)) features[peak] np.max(np.abs(signal)) features[crest_factor] np.max(np.abs(signal)) / (features[rms] 1e-10) features[kurtosis] scipy.stats.kurtosis(signal) 3 features[skewness] scipy.stats.skew(signal) return features频域特征频谱峰值、频谱质心、各主要频段能量占比。特别是前面提到的1倍电气频率、2倍电气频率分量幅值要单独提出来作为核心特征。时频特征短时傅里叶变换、小波包分解后各频带的能量。比如用scipy.signal.stft把振动信号转成时频图或者用小波包分解提取第3层8个子频带的能量占比。这类特征对非平稳信号更友好在负载波动场景下鲁棒性更好。信息熵特征排列熵、样本熵、近似熵。这些特征刻画的是信号复杂度定子故障会改变电流波形的规则度熵值往往随之变化。从我的经验看针对定子故障时域特征区分度最一般频域特征稳定可靠时频特征和信息熵在高噪声环境下有优势。实际建模时我通常把所有特征合并到一个大特征矩阵所谓的“特征袋”然后通过特征选择算法筛出最关键的十几个特征最后交给分类器。4.4 故障分类模型从机器学习到深度学习数据有了特征有了接下来就是建模。我分别用传统机器学习和一维CNN做过对比测试集上的结果大致如下模型输入特征准确率训练难度支持向量机RBF核28维手工特征91.2%低随机森林200棵树28维手工特征93.6%低XGBoost28维手工特征94.8%中1D CNN原始振动电流拼接96.3%中1D CNN 注意力机制原始振动电流拼接97.1%高先说结论如果你的数据量只有几千个样本把手动特征随机森林或XGBoost调好效果已经很能打了。直接上深度学习反而不一定更好因为数据量不足时深度模型容易过拟合。但如果有足够多的样本一维CNN的优势就体现出来了。它能在原始信号上自动学习特征不用手动设计频域和时域特征尤其在多模态数据拼接时它能把振动和电流之间的耦合关系学出来。这里给一个简单的一维CNN参考结构import torch import torch.nn as nn class FaultCNN(nn.Module): def __init__(self, num_classes4): super().__init__() self.conv1 nn.Sequential( nn.Conv1d(2, 16, kernel_size64, stride4, padding32), nn.BatchNorm1d(16), nn.ReLU(), nn.MaxPool1d(2) ) self.conv2 nn.Sequential( nn.Conv1d(16, 32, kernel_size32, stride2, padding16), nn.BatchNorm1d(32), nn.ReLU(), nn.MaxPool1d(2) ) self.conv3 nn.Sequential( nn.Conv1d(32, 64, kernel_size16, stride2, padding8), nn.BatchNorm1d(64), nn.ReLU(), nn.AdaptiveAvgPool1d(1) ) self.fc nn.Linear(64, num_classes) def forward(self, x): # x shape: (batch, channels, seq_len) x self.conv1(x) x self.conv2(x) x self.conv3(x) x x.view(x.size(0), -1) return self.fc(x)输入那里通道数设为2分别对应振动信号和电流信号或两个通道的振动信号。模型学到的实际上是两类信号在时间维度上的联合模式这就是多模态的优势。但这里有一个细节要提醒输入信号的长度、缩放必须做归一化。不同样本的幅值范围不同不归一化会导致网络训练不稳定。实操中我把每个样本的振动信号和电流信号分别减去均值、除以标准差然后再拼接成(2, sequence_length)的张量喂给模型。5. 常见问题与排查技巧实录5.1 采样率与数据量的平衡问题新手最容易问的一个问题“采样率设多少合适采多长够用”我的经验公式是振动信号采样率取电机转频的50~100倍电流信号采样率至少取供电频率的100倍。比如额定转速3000rpm的电机转频是50Hz振动采样率5000Hz起步电流采样率5000Hz也基本够。而单次采样的时长不要少于3秒。为什么因为后面做FFT时分辨率等于采样率除以采样点数。假设采样率5000Hz采1秒频率分辨率只有1Hz100Hz和101Hz两个成分根本分不开。采3秒频率分辨率提升到0.33Hz能看出更细的边频带结构。数据量要和故障类型、工况数量一起规划。比如4种状态健康3种故障严重度× 5个负载档 × 每种工况采10次 × 每次3秒×5000Hz算下来就是4 × 5 × 10 × 3 × 5000 3,000,000个采样点单通道就是300万个点两个振动通道加三个电流通道总量在1500万个点。用CSV存大概几十MB到上百MB完全能接受。5.2 信号中的噪声与干扰怎么处理采集过程中我发现电流信号里经常混入高频噪声振动信号则容易有工频干扰和机械共振的干扰。处理思路分主次电流信号重点关注50Hz附近的信息所以先用带通滤波器把20Hz到500Hz以外的成分滤掉然后再做后续分析。scipy.signal.butter加filtfilt零相位滤波是标配from scipy.signal import butter, filtfilt def bandpass_filter(signal, low, high, fs, order4): nyquist fs / 2 b, a butter(order, [low/nyquist, high/nyquist], btypeband) return filtfilt(b, a, signal)振动信号不要一上来就滤波先看原始频谱里有哪些明显的峰值再决定滤掉什么。如果有一个持续的窄带干扰比如100Hz电磁干扰而你又只关心50Hz左右的故障特征那做一个窄带陷波滤波器更合适。这里要特别提醒一点滤波会改变原始信号的相位和幅值尤其是用IIR滤波器时相位失真很严重。所以我一律用filtfilt做零相位滤波虽然计算量翻倍但信号质量好得多。如果你要做的是实时嵌入式系统可能要用FIR滤波器代替因为filtfilt有未来数据的依赖不适合流式处理。5.3 标签不一致与时间同步问题我之前做过一个电机故障项目遇到一个特别头疼的问题肉眼看着同一工况下采集的数据几次跑出来的振动频谱差异巨大。排查了很久才发现原来是采集卡的硬件通道在每次采集时触发延迟不一样导致振动和电流波形错位了几个毫秒。解决方法是给采集系统加一个“同步脉冲”通道。每次采集开始时用一个信号发生器发一个脉冲送入采集卡的参考通道然后通过脉冲位置对齐每一组样本。在Python里做离线对齐时用numpy.correlate做互相关就能找到两段信号的最佳偏移def align_signals(sig1, sig2, max_shift100): 通过互相关找到两个信号的时间偏移 corr np.correlate(sig1, sig2, modefull) lag np.argmax(corr) - (len(sig2) - 1) if abs(lag) max_shift: lag 0 return lag还有一个标签不一致的坑我在做数据标注时把“健康”标成了0“匝间短路2匝”标成1后来换了个人标注他把“健康”标成1“匝间短路2匝”标成0两批数据合到一起后模型准确率直接崩了。从那以后我规定所有数据集的标签必须由同一个人使用同一份标注规范生成并且在合并数据前做一次标签分布统计和样本抽查。5.4 数据集复现性的保障数据集如果要开源给别人用可复现性是第一优先级。我在发布前做了一轮彻底的代码审计把里面所有用到随机数的地方都固定了随机种子。比如切分训练集和测试集必须在整个项目里有统一的操作import random import numpy as np import torch random.seed(42) np.random.seed(42) torch.manual_seed(42)还要把试验台的硬件配置和采集参数写进一个sensor_config.json让别人知道传感器型号、灵敏度、增益、采样率、滤波设置是什么。这样别人复现实验时才能判断自己的设置哪里不对。另外一个特别容易忽略的细节是数据集的版本号。我见过不少数据集更新之后直接把旧文件覆盖了结果别人引用的结果对不上。建议数据集目录名里带上版本号比如motor_fault_v1.0每次有重大更新时升级版本号同时保留一份变更日志。6. 项目扩展方向从数据集到系统化解决方案如果你只想做一套“学术数据集”数据采完、模型跑完、论文发完项目到这就结束了。但如果你是想把这份东西变成实际可用的东西下面几个方向值得深耕方向一小样本与域适应问题。工业现场可不像实验室你不可能把所有故障类型都完整地采一遍。如何在故障样本极少的情况下依靠健康样本和少量故障样本建立可靠的诊断模型是目前学术界和工业界共同面临的大问题。用这个数据集做“源域”拿工业现场的数据做“目标域”跑一跑域适应算法比如对抗式域适应会是一个很有价值的方向。方向二故障严重程度评估。这个数据集如果采集了1匝、2匝、3匝等多档故障数据千万别只把它当分类问题。把故障严重度当作回归目标来预测意义更大。匝间短路越严重电机剩余寿命越短如果能连续预测故障程度就能做真正的预测性维护。方向三同步嵌入边缘计算设备。Python程序在PC上跑没问题但工业实际应用往往需要部署在嵌入式设备里。把训练好的模型转换成ONNX格式再借助onnxruntime或者TensorRT Lite在边缘设备上推理是工程落地的必经之路。这个数据集的价值就在于它给了你一批干净的故障数据让你调参和验证部署流程。方向四数字孪生与AI结合。基于电机故障机理建一个数字孪生模型然后用数据集的真实数据校准孪生模型参数最后用孪生模型去生成更多虚拟故障样本。这种做法能有效缓解真实故障样本不足的问题是现在设备健康管理领域比较前沿的思路。我个人在实际操作中的体会是数据集的真正价值不在于数据本身而在于它能不能帮你验证一个可靠的诊断流程。从数据采集、信号处理、特征提取到模型部署每一步都有大量细节决定最终效果。如果你拿到的数据集能让你顺利跑通这个流程那它就已经比很多“看起来很美但数据组织混乱”的数据集有价值得多。最后分享一个做数据集时的小技巧拿到数据后不要马上去训练模型。先把不断电情况下的前几秒数据对比一下看看传感器有没有漂移再用耳朵听一下故障电机的声音变化看看和信号特征是否一致甚至可以用手摸一下电机温度判断故障是否引起了局部过热。这些“脏活累活”看起来不高级但它们能帮你建立对数据的直觉。等你见的数据足够多很多算法调参的问题看一眼特征分布就能猜个大概。
返回列表