视觉图栅与瞬时速度融合滚动轴承智能故障识别【附代码】
✅博主简介擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导毕业论文、期刊论文经验交流。✅ 如需沟通交流扫描文章底部二维码。1基于视觉图栅的旋转轴瞬时速度非接触测量方法针对传统编码器安装复杂、易磨损以及低速测量精度低的问题提出了一种基于视觉图栅的瞬时速度测量技术。该方法首先在转轴表面粘贴特制的周期性黑白条纹图栅图栅的间距根据轴径和相机分辨率设计保证每个条纹在图像中占据至少3个像素。使用高速工业相机对准图栅区域连续采集图像然后对每帧图像进行快速傅里叶变换提取图栅的基频分量。由于轴旋转时图栅密度在图像中的投影频率与转速成正比通过计算相邻帧之间的相位差即可得到精确的角位移增量进而求得瞬时转速。为了抑制环境光照变化和振动干扰算法中加入了自适应二值化和图像金字塔配准步骤并利用卡尔曼滤波器对速度序列进行平滑。实验证明该方法在轴转速低至5rpm时仍能保持0.1rpm的测量精度且无需接触转轴适用于高温、高湿等恶劣工况。2改进的多尺度空洞卷积CNN-LSTM故障诊断模型以瞬时速度信号和振动信号作为双输入设计了一种改进的CNN-LSTM混合网络。在CNN部分采用多尺度空洞卷积结构替代标准卷积设置了扩张率分别为1、2、4的三个并行卷积分支用于捕获不同感受野下的局部特征。扩张卷积在不增加参数量的前提下扩大了感受野有利于提取低速重载轴承故障产生的低频冲击成分。每个分支后接批归一化和Mish激活函数替代ReLU以避免神经元坏死然后通过逐元素相加融合三个分支的输出。融合后的特征图输入到LSTM层利用其门控机制学习速度信号和振动信号在时间上的依赖关系最终由全连接层输出故障类别。实验对比显示单独使用瞬时速度信号时诊断精度达到96.72%而融合振动信号后提升至98.37%验证了速度信号作为补充模态的有效性。3视觉-振动特征级融合与自适应加权策略为了充分挖掘视觉速度信息和振动信息的互补性设计了一个特征级融合模块。振动信号经过上述CNN-LSTM网络提取时频特征视觉速度信号则先通过一个独立的编码器由两个全连接层组成映射到相同维度的特征空间。然后引入了自适应加权融合层该层通过一个小型门控网络计算两种特征的动态权重门控网络输入为两种特征的拼接输出两个0~1之间的标量分别作为振动特征和速度特征的权重。加权后的特征向量进一步通过注意力机制增强判别性。这种动态加权策略使得模型可以根据当前工况自动调整对两种传感器的信任程度——例如在强冲击工况下更依赖振动信号而在低频扰动环境下更依赖速度信号。在变载荷、变速工况的测试集上融合模型相比单振动模型将F1分数提升了5.2%展示了多模态感知的优越性。import torch import torch.nn as nn import torch.nn.functional as F import numpy as np import cv2 # 基于视觉图栅的速度测量简化实现 def measure_instant_speed(image_sequence, pixel_per_mm10, stripe_pitch_mm5): speeds [] prev_phase None for img in image_sequence: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 提取感兴趣区域图栅所在区域 roi gray[100:200, 200:400] # 假设位置 # 快速傅里叶变换 f np.fft.fft2(roi) fshift np.fft.fftshift(f) magnitude np.abs(fshift) # 找到最大幅值对应的频率基频 rows, cols roi.shape crow, ccol rows//2, cols//2 # 搜索水平方向基频 horizontal_profile magnitude[crow, :] peak_index np.argmax(horizontal_profile[ccol10:ccol100]) ccol10 freq (peak_index - ccol) / cols # 归一化频率 phase np.angle(fshift[crow, peak_index]) if prev_phase is not None: dphase phase - prev_phase if dphase np.pi: dphase - 2*np.pi elif dphase -np.pi: dphase 2*np.pi # 角位移 dphase / (2*pi) * stripe_pitch_mm (单位mm) delta_angle_rad dphase / (2*np.pi) * stripe_pitch_mm / (pixel_per_mm * 2*np.pi) # 简化 # 已知帧间时间dt得到速度 speed delta_angle_rad / dt # rad/s speeds.append(speed) prev_phase phase return np.array(speeds) # 多尺度空洞卷积模块 class MultiScaleDilatedConv(nn.Module): def __init__(self, in_channels, out_channels, rates[1,2,4]): super().__init__() self.convs nn.ModuleList() for r in rates: self.convs.append(nn.Conv1d(in_channels, out_channels//len(rates), kernel_size3, dilationr, paddingr)) self.bn nn.BatchNorm1d(out_channels) self.activation nn.Mish() def forward(self, x): outs [conv(x) for conv in self.convs] x torch.cat(outs, dim1) return self.activation(self.bn(x)) # 改进的CNN-LSTM模型 class MultiScaleCNN_LSTM(nn.Module): def __init__(self, num_classes5, input_channels2): # 2个通道振动速度 super().__init__() self.ms_block1 MultiScaleDilatedConv(input_channels, 32) self.ms_block2 MultiScaleDilatedConv(32, 64) self.pool nn.MaxPool1d(2) self.lstm nn.LSTM(64, 128, batch_firstTrue, bidirectionalTrue) self.fc nn.Linear(256, num_classes) self.drop nn.Dropout(0.3) def forward(self, x): # x shape: (batch, channels, time) x self.ms_block1(x) x self.pool(x) x self.ms_block2(x) x self.pool(x) # 转换维度为 (batch, seq_len, features) x x.permute(0,2,1) lstm_out, _ self.lstm(x) # 取最后一个时间步的输出 x lstm_out[:, -1, :] x self.drop(x) return self.fc(x) # 自适应特征加权融合 class AdaptiveWeightedFusion(nn.Module): def __init__(self, feat_dim): super().__init__() self.gate nn.Sequential( nn.Linear(feat_dim*2, feat_dim), nn.ReLU(), nn.Linear(feat_dim, 2), nn.Softmax(dim1) ) def forward(self, feat_vib, feat_speed): combined torch.cat([feat_vib, feat_speed], dim1) weights self.gate(combined) # (batch, 2) return feat_vib * weights[:,0:1] feat_speed * weights[:,1:2] # 完整模型使用示例 class FusionModel(nn.Module): def __init__(self, vib_net, speed_encoder, fusion, classifier): super().__init__() self.vib_net vib_net self.speed_encoder speed_encoder self.fusion fusion self.classifier classifier def forward(self, vib, speed): feat_vib self.vib_net(vib) # 提取特征 feat_speed self.speed_encoder(speed) fused self.fusion(feat_vib, feat_speed) return self.classifier(fused) # 训练伪代码 def train(model, dataloader): optimizer torch.optim.Adam(model.parameters(), lr1e-3) for epoch in range(100): for vib, speed, labels in dataloader: optimizer.zero_grad() logits model(vib, speed) loss F.cross_entropy(logits, labels) loss.backward(); optimizer.step() 如有问题可以直接沟通