论文题目:Multi-mode fault diagnosis datasets of gearbox under variable working conditions
注:上述链接若打不开,文末有百度网盘链接。
齿轮箱是机电系统的关键部件。多个故障的发生会严重影响系统的精度和使用寿命。齿轮箱的振动信号是其运行状态和故障信息的有效指示器。然而,真实的工业环境中的齿轮箱通常在变化的工况条件下操作,例如变化的速度和负载。利用振动信号完成变工况下齿轮箱的故障诊断是一个有意义和挑战性的研究领域。这篇数据文章介绍了从齿轮箱中收集的振动数据集,该齿轮箱在时变转速和负载条件下运行,表现出不同的故障严重程度和故障类型。这些故障在通过人工加工故障植入齿轮或轴承中,故障类型包括健康、缺齿、磨损、点蚀、根部裂纹和断齿。还包括几种实际的复合故障。这些数据集的开发有助于测试新开发的故障诊断方法的有效性和可靠性。
5.1 数据读取
5.2 绘制时域图
5.3 绘制频域图
5.4 绘制stft时频域图
表1 代表性数据集的比较
图1 单个csv数据内容示例
表2 数据集中每列的含义
这些数据集是在两级平行齿轮箱的健康和故障状态下采集的。齿轮箱内部结构示意图如图2所示。这些数据可用于评估在变转速或变负载条件下齿轮箱故障诊断方法的有效性,例如文献[1-5]中提出的方法。
图2 齿轮箱内部结构图
此外,齿轮模数为1.5,齿轮宽度为10mm。中间轴上的齿轮(36齿)是故障齿轮,中间轴端部靠近36齿齿轮的支撑轴承是故障轴承,型号是ER16K。ER16K轴承的具体参数见表3。
表3 ER16K轴承的具体参数
数据集采样频率为12.8kHz,以标准EXCEL格式“.csv”存储在没有时间戳的单列中。在60秒的固定持续时间内,以随时间变化的转速或随时间变化的负载收集数据,设定的速度-时间曲线和载荷-时间曲线分别如图3(a)和图3(b)所示。
图中颜色的数量用于区分实验组。以图3(a)中用蓝色标记的0-2500-3000为例,表示在10-20秒内和40-50秒内将转速设置为3000 rpm。同时,在25-30秒内将转速设置为2500 rpm。
图3 (a)时变速度曲线 (b)时变负载曲线
在时变负载条件下的实验过程中,速度被设置为三个恒定值:1000rpm,2000rpm和3000rpm。类似地,在时变速度条件下的实验期间,负载被设置为两个恒定值:10Nm和20Nm。
实验中的故障集包括单齿轮故障和复合齿轮轴承故障。轴承和齿轮的故障参数对应的详细信息分别报告在表4和表5中。在每一个场景中,除了健康状况和“缺齿”故障,对于剩下的四个单一故障(“齿轮磨损”“齿轮点蚀”“齿轮裂纹”“断齿”)和两个复合故障(“断齿、轴承内圈故障”和“断齿、轴承外圈故障”),考虑了三种不同的故障严重程度。因此,总共包括240个“.csv”文件。在此背景下,共考虑了24个恒定条件和112个动态工况组合。
值得注意的是,数据集的具体用法与代表性数据集的用法基本一致。对于打算利用该数据集的研究人员,我们建议构建包含整个模拟生命周期的数据,反映实际工况,以评估所提方法的有效性。此外,研究人员可以灵活地根据特定任务需求和提供的csv文件的内容生成定制的训练和测试数据集。
以“miss_teeth_torque_circulation_3000rpm_20Nm”数据为例,图4给出了可视化图。值得注意的是,确定了中间轴的旋转频率为14.84Hz,而中间轴上小齿轮的啮合频率为540.63Hz,其边带频率为525.78Hz和555.47Hz。这些观察结果与缺齿缺陷的典型特征相一致。
图4 关于“miss_teeth_torque_circulation_3000rpm_20Nm”数据可视化。(a)表示实际测量的输入轴扭矩值;(b-d)表示电动机在xyz方向上的振动加速度;(e-g) 表示在变速箱中间轴的z轴上显示;(h)表示z轴的包络谱。
此外,还应注意的是,由于电机和扭矩产生器滞后性,实际的速度-时间曲线或负载-时间曲线可能与设定的曲线略有不同。变速箱输出轴的扭矩载荷由磁粉制动器施加,而变速箱输入轴所承受的扭矩则由扭矩传感器测量。在此背景下,键相位传感器和扭矩传感器已测量实际信号。
数据集的实验设置如图5所示,其中包括一个2.2kW三相异步电动机,一个扭矩传感器,一个两级并联齿轮箱,一个磁粉制动器作为扭矩产生器,以及一个测量和控制系统。该数据集旨在模拟和记录中间轴及其相邻支承轴承上36齿齿轮在不同运行模式下的各种故障情况。
如图5所示,试验台配备了两个三轴振动加速度传感器(TES001V型),用于测量电机和齿轮箱沿x、y和z轴的中间轴三轴振动,采样频率为12.8 kHz。收集数据集并在12种工况下进行处理。为了减少由温度引起的实验误差和测量误差,将实验室的温差控制在2℃范围内。
5.1 数据读取
## 导入包
from matplotlib import pyplot as plt
from matplotlib import rcParams
import numpy as np
import pandas as pd
import os
config = {
"font.family": 'serif', # 衬线字体
"font.size": 14, # 相当于小四大小
"font.serif": ['SimSun'], # 宋体
"mathtext.fontset": 'stix', # matplotlib渲染数学字体时使用的字体,和Times New Roman差别不大
'axes.unicode_minus': False # 处理负号,即-号
}
rcParams.update(config)
def data_read(file_path):
"""
:fun: 读取csv数据
:param file_path: 文件路径
:return accl_data_df: Dataframe,八列分别为'speed', 'torque', 'motor_vibration_x', 'motor_vibration_y', 'motor_vibration_z', 'gearbox_vibration_x', 'gearbox_vibration_y', 'gearbox_vibration_z'
"""
file_path = os.path.join(base_dir, file_name)
accl_data_df = pd.read_csv(file_path)
return accl_data_df
file_path = r'E:\03-公开数据集\MCC5-THU gearbox fault diagnosis datasets with variable working conditions\原始数据/gear_pitting_M_torque_circulation_3000rpm_20Nm.csv'
df = data_read(file_path)
acc_z_arr= df['gearbox_vibration_z'] # 选择变速箱z轴数据
df
图6一个csv文件内具体内容
可知,该数据为8列,分别为'speed', 'torque', 'motor_vibration_x', 'motor_vibration_y', 'motor_vibration_z', 'gearbox_vibration_x', 'gearbox_vibration_y', 'gearbox_vibration_z'。
5.2 绘制时域图
选择齿轮箱z轴的加速度传感器数据进行展示。
##========绘制时域信号图========##
def plt_time_domain(arr, fs=1600, ylabel='Amp($m/s^2$)', title='原始数据时域图', img_save_path=None, x_vline=None, y_hline=None):
"""
:fun: 绘制时域图模板
:param arr: 输入一维数组数据
:param fs: 采样频率
:param ylabel: y轴标签
:param title: 图标题
:return: None
"""
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号
font = {'family': 'Times New Roman', 'size': '20', 'color': '0.5', 'weight': 'bold'}
plt.figure(figsize=(12,4))
length = len(arr)
t = np.linspace(0, length/fs, length)
plt.plot(t, arr, c='g')
plt.xlabel('t(s)')
plt.ylabel(ylabel)
plt.title(title)
if x_vline:
plt.vlines(x=x_vline, ymin=np.min(arr), ymax=np.max(arr), linestyle='--', colors='r')
if y_hline:
plt.hlines(y=0.2, xmin=np.min(t), xmax=np.max(t), linestyle=':', colors='y')
#===保存图片====#
if img_save_path:
plt.savefig(img_save_path, dpi=500, bbox_inches = 'tight')
plt.show()
fs = 12800
file_name = r'miss_teeth_torque_circulation_3000rpm_20Nm.csv'
##=====绘制时域数据====##
time_img_save_path = file_path.replace('.csv', '时域_.png')
plt_time_domain(acc_z_arr, fs=fs, title=file_name, img_save_path=time_img_save_path, ylabel = 'Amp(g)')
共60s的数据,单位
5.3 绘制频域图
##========绘制频域信号图========##
def plt_fft_img(arr, fs, ylabel='Amp(mg)', title='频域图', img_save_path=None, vline=None, hline=None, xlim=None):
"""
:fun: 绘制频域图模板
:param arr: 输入一维时域数组数据
:param fs: 采样频率
:param ylabel: y轴标签
:param title: 图标题
:return: None
"""
# 计算频域幅值
length = len(arr)
t = np.linspace(0, length/fs, length)
fft_result = np.fft.fft(arr)
fft_freq= np.fft.fftfreq(len(arr), d=t[1]-t[0]) # FFT频率
fft_amp= 2*np.abs(fft_result)/len(t) # FFT幅值
# 绘制频域图
plt.figure(figsize=(12,4))
plt.title(title)
plt.plot(fft_freq[0: int(len(t)/2)], fft_amp[0: int(len(t)/2)], label='Frequency Spectrum', color='b')
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值')
plt.legend()
if vline:
plt.vlines(x=vline, ymin=np.min(fft_amp), ymax=np.max(fft_amp), linestyle='--', colors='r')
if hline:
plt.hlines(y=hline, xmin=np.min(fft_freq), xmax=np.max(fft_freq), linestyle=':', colors='y')
#===保存图片====#
if img_save_path:
plt.savefig(img_save_path, dpi=500, bbox_inches = 'tight')
if xlim: # 图片横坐标是否设置xlim
plt.xlim(0, xlim)
plt.tight_layout()
plt.show()
fs = 12800
file_name = r'miss_teeth_torque_circulation_3000rpm_20Nm.csv'
##=====绘制频域数据====##
fft_img_save_path = file_path.replace('.csv', '频域_.png')
plt_fft_img(acc_z_arr, fs=fs, title=file_name, img_save_path=fft_img_save_path)
可见明显的主频在950Hz左右。
3.4 绘制stft时频域图
def plt_stft_img(arr, fs, ylabel='Amp(mg)', title='频域图', img_save_path=None, vline=None, hline=None, xlim=None):
"""
:fun: 绘制stft时频域图模板
:param arr: 输入一维时域数组数据
:param fs: 采样频率
:param ylabel: y轴标签
:param title: 图标题
:return: None
"""
import scipy.signal as signal
import numpy as np
import matplotlib.pyplot as plt
f, t, nd = signal.stft(arr, fs=fs, window='hann', nperseg=128, noverlap=64,nfft=None,
detrend=False, return_onesided=True, boundary='odd', padded=False, axis=-1)
# fs:时间序列的采样频率, nperseg:每个段的长度,默认为256(2^n) noverlap:段之间重叠的点数。如果没有则noverlap=nperseg/2
#window :字符串或元组或数组,可选需要使用的窗。
# #如果window是一个字符串或元组,则传递给它window是数组类型,直接以其为窗,其长度必须是nperseg。
# 常用的窗函数有boxcar,triang,hamming, hann等,默认为Hann窗。
#nfft :int,可选。如果需要零填充FFT,则为使用FFT的长度。如果为 None,则FFT长度为nperseg。默认为无
# detrend :str或function或False,可选
# 指定如何去除每个段的趋势。如果类型参数传递给False,则不进行去除趋势。默认为False。
# return_onesided :bool,可选
# 如果为True,则返回实际数据的单侧频谱。如果 False返回双侧频谱。默认为 True。请注意,对于复杂数据,始终返回双侧频谱。
# boundary :str或None,可选
# 指定输入信号是否在两端扩展,以及如何生成新值,以使第一个窗口段在第一个输入点上居中。
# 这具有当所采用的窗函数从零开始时能够重建第一输入点的益处。
# 有效选项是['even', 'odd', 'constant', 'zeros', None].
# 默认为‘zeros’,对于补零操作[1, 2, 3, 4]变成[0, 1, 2, 3, 4, 0] 当nperseg=3.
# padded:bool,可选
# 指定输入信号在末尾是否填充零以使信号精确地拟合为整数个窗口段,以便所有信号都包含在输出中。默认为True。
# 填充发生在边界扩展之后,如果边界不是None,则填充为True,默认情况下也是如此。
# axis :int,可选
# 绘制STFT时频域图
plt.figure(figsize=(12,4))
plt.pcolormesh(t, f, np.abs(nd), vmin = np.min(np.abs(nd)), vmax = np.max(np.abs(nd)))
plt.title(title)
plt.xlabel('时间(t)')
plt.ylabel('频率 (Hz)')
if vline:
plt.vlines(x=vline, ymin=np.min(fft_amp), ymax=np.max(fft_amp), linestyle='--', colors='r')
if hline:
plt.hlines(y=hline, xmin=np.min(fft_freq), xmax=np.max(fft_freq), linestyle=':', colors='y')
#===保存图片====#
if img_save_path:
plt.savefig(img_save_path, dpi=500, bbox_inches = 'tight')
if xlim: # 图片横坐标是否设置xlim
plt.xlim(0, xlim)
plt.tight_layout()
plt.show()
fs = 12800
file_name = r'miss_teeth_torque_circulation_3000rpm_20Nm.csv'
##=====绘制STFT时频域数据====##
stft_img_save_path = file_path.replace('.csv', '时频域_.png')
plt_stft_img(acc_z_arr, fs=fs, img_save_path=stft_img_save_path)