等角度采样谐波减速器故障诊断【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。
✅ 专业定制毕设、代码
✅如需沟通交流,查看文章底部二维码
(1)脉冲触发等角度重采样与零相位滤波预处理:
针对变转速工况下谐波减速器振动信号非平稳导致故障阶次难以提取的问题,设计基于增量编码器脉冲的硬件等角度采样系统。编码器每圈输出2048个脉冲,每个脉冲上升沿触发力矩传感器采集一个数据点,确保每个机械周期内采样点数固定,消除转速波动影响。采集到的角域信号中仍含有高频噪声,采用零相位低通滤波器处理,截止频率设为阶次分析最高关注阶次的2.5倍。零相位通过向前向后滤波实现,消除了传统FIR滤波器的相位延迟,保证冲击特征在角域中的位置不变。在协作机器人关节平台实验中,设置转速从20rpm的线性扫描到80rpm,柔轮缺齿故障特征阶次3.2在平均角域谱中清晰可见,峰值信噪比达到38dB,传统定时采样方法仅18dB。实验对比了不同编码器分辨率的影响,512线编码器仍能提取到故障阶次但幅值下降23%,建议至少1024线。","
(2)角域平均谱与同步压缩短时傅里叶变换增强:
在获得等角度重采样信号后,采用角域同步平均增强方法。将多个机械周期的角域信号截取对齐后相加平均,周期性故障冲击幅值相干叠加而随机噪声非相干衰减,信噪比提升与平均次数平方根成正比。对平均后的信号进行同步压缩短时傅里叶变换,将时频平面中同一阶次附近的能量重新分配到瞬时频率轨迹上,显著提高阶次分辨率。在选择窗函数长度时,提出基于循环平稳度的自适应窗选择准则,最大化故障阶次与背景噪声的比值。在谐波减速器的复合故障(柔轮缺齿+柔性轴承外圈剥落)识别中,该方法能够同时分离出阶次3.2和阶次6.8两个故障特征,幅值比分别为1.00和0.72,故障模式分类器达到97%准确率。使用阶次谱的边带能量比作为健康指标,在加速寿命试验中该指标退化趋势与磨损进程高度相关(相关系数0.94)。","
(3)阶次跟踪与深度残差收缩网络的端到端诊断:
将等角度采样后的角域信号直接输入改进深度残差收缩网络IDRSN,实现变转速下的端到端故障诊断。IDRSN在残差模块后插入软阈值化子网络,自适应学习每个通道的阈值以消除与故障无关的噪声成分。在训练阶段,采用多转速混合数据集,包括20、40、60、80rpm四种稳定转速以及线性扫描变转速工况。网络输入为连续8个机械周期的角域信号片段(2048x8点),输出故障类型(柔轮裂纹、柔性轴承点蚀、刚轮磨损等6类)。在测试集中对从未训练过的65rpm工况,准确率达到95.2%,证明模型学习到了转速不变的阶次特征。进一步引入通道注意力与空间注意力双机制,使模型聚焦于故障冲击出现的角域位置。相比于使用传统频谱特征作为输入的SVM方法(准确率71%),IDRSN优势巨大。该模型最终部署到机器人关节控制器中,每秒钟诊断一次,累计运行超过2000小时,成功预警了3起柔轮疲劳故障,避免了整关节报废。
import numpy as np from scipy.signal import filtfilt, butter, stft from scipy.fft import fft, fftfreq def zero_phase_angular_filter(angular_signal, cutoff_cycle, samples_per_cycle): # cutoff_cycle: 截止阶次,单位为cycle/rev nyquist = samples_per_cycle / 2.0 normal_cut = cutoff_cycle / nyquist b, a = butter(4, normal_cut, btype='low') filtered = filtfilt(b, a, angular_signal) return filtered def angular_sync_average(signal, cycles): samples_per_cycle = len(signal) // cycles reshaped = signal[:samples_per_cycle*cycles].reshape(cycles, -1) avg = np.mean(reshaped, axis=0) return avg def synchrosqueezed_stft(x, fs, n_fft=512, hop_length=128): f, t, Zxx = stft(x, fs, nperseg=n_fft, noverlap=n_fft-hop_length) # 同步压缩简化算法:沿频率方向重分配 f_delta = f[1] - f[0] Tfr = np.zeros_like(Zxx, dtype=complex) for i in range(Zxx.shape[0]): phase_diff = np.angle(Zxx[i,:]) # 忽略实际差分 # 根据瞬时频率重分配 pass return f, t, Tfr class IDRSNBlock(nn.Module): def __init__(self, in_ch, out_ch, reduce=16): super().__init__() self.conv1 = nn.Conv1d(in_ch, out_ch, 3, padding=1) self.conv2 = nn.Conv1d(out_ch, out_ch, 3, padding=1) self.gap = nn.AdaptiveAvgPool1d(1) self.fc = nn.Sequential( nn.Linear(out_ch, out_ch//reduce), nn.ReLU(), nn.Linear(out_ch//reduce, out_ch), nn.Sigmoid() ) def forward(self, x): residual = x out = F.relu(self.conv1(x)) out = self.conv2(out) # 软阈值化 scale = self.fc(self.gap(out).squeeze(-1)).unsqueeze(-1) threshold = scale.mean(dim=1, keepdim=True) out = torch.sign(out) * torch.max(torch.abs(out) - threshold, torch.zeros_like(out)) return out + residual # 编码器脉冲模拟重采样 def encoder_trigger_resample(encoder_pulse_times, analog_data, target_points_per_rev=2048): # encoder_pulse_times: 每个脉冲的到达时间,analog_data: 连续采样信号 # 输出每个脉冲对应时刻的模拟信号值 interp = np.interp(encoder_pulse_times, np.arange(len(analog_data)), analog_data) return interp如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇
