基于九轴传感器 + K-means 聚类的振动异常检测实战教程
嵌入式 / 工业监测场景设备振动、电机故障、结构松动、碰撞异常实时检测一、前言你能学到什么这篇文章不讲虚的直接带你做一个工业级轻量异常检测系统用LSM6DS3TR-C6 轴 磁力计 九轴传感器采集振动数据用K-means 无监督聚类算法做异常侦测全程不需要标签、不需要深度学习、单片机可跑原理 代码 工程思路 一次性讲透适合设备监测、预测性维护、物联网边缘计算、嵌入式 AI 入门。二、系统整体原理一句话讲清楚核心逻辑正常设备振动 稳定、规律、特征集中异常振动 剧烈、突变、偏离正常模式K-means 任务学习正常振动的 “特征分布”把偏离分布的数据判定为异常。为什么用 K-means无监督只需要正常数据不需要异常样本超轻量可跑在 STM32 / ESP32 上可解释性强靠距离判断异常工业界最常用的传统异常检测算法三、硬件与数据基础1. 九轴传感器组成你用的LSM6DS3TR-C是加速度计 ACCX/Y/Z→振动核心数据陀螺仪 GYROX/Y/Z→ 角速度 / 抖动外加磁力计 MAGX/Y/Z→ 9 轴振动检测主要依赖加速度计ACC2. 振动数据是什么设备运行时三轴加速度会周期性小幅波动正常波动小、稳定异常波动大、突变、冲击、噪声原始数据是时序信号不能直接喂 K-means必须提取特征。四、核心原理为什么 K-means 能检测异常1. K-means 是什么K-means 是无监督聚类算法自动把相似数据分成 K 组。2. 异常检测原理关键用大量正常振动数据训练 K-means算法会把正常数据聚成几个紧凑的簇新数据进来后计算到最近簇中心的距离距离 阈值 异常一句话K-means 异常检测 距离异常检测五、完整工程流程一步都不跳流程总览传感器采集原始加速度数据滑动窗口截取一段振动提取振动特征RMS、方差、均值等用正常特征训练 K-means 模型实时推理计算距离 → 判断异常六、特征工程最重要不能直接用原始数据原始三轴加速度是时序波形必须转成固定长度特征向量。最适合振动的特征工业标准RMS 均方根→ 振动强度STD 标准差→ 波动程度Mean 均值→ 基线偏移Max / Min→ 冲击峰值频域能量可选最终特征向量6~9 维plaintext[ RMS_X, RMS_Y, RMS_Z, STD_X, STD_Y, STD_Z, MEAN_X, MEAN_Y, MEAN_Z ]这就是 K-means 的输入。七、完整 Python 代码可直接运行1. 导入库python运行import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler2. 模拟九轴传感器振动采集真实工程可替换为 I2C 读取模拟正常振动 异常振动松动 / 碰撞python运行# # 模拟传感器采集正常数据大量 # np.random.seed(42) N_NORMAL 500 normal_acc_X np.random.normal(loc0, scale0.08, sizeN_NORMAL) normal_acc_Y np.random.normal(loc0, scale0.07, sizeN_NORMAL) normal_acc_Z np.random.normal(loc1, scale0.09, sizeN_NORMAL) # # 模拟异常数据少量 # N_ABNORMAL 50 abn_acc_X np.random.normal(loc0, scale0.8, sizeN_ABNORMAL) abn_acc_Y np.random.normal(loc0, scale0.7, sizeN_ABNORMAL) abn_acc_Z np.random.normal(loc1, scale0.9, sizeN_ABNORMAL)3. 滑动窗口 特征提取python运行def extract_features(acc_x, acc_y, acc_z, window_size32): 振动特征提取 features [] for i in range(0, len(acc_x) - window_size, window_size): x acc_x[i:iwindow_size] y acc_y[i:iwindow_size] z acc_z[i:iwindow_size] # 振动核心特征 rms_x np.sqrt(np.mean(x**2)) rms_y np.sqrt(np.mean(y**2)) rms_z np.sqrt(np.mean(z**2)) std_x np.std(x) std_y np.std(y) std_z np.std(z) mean_x np.mean(x) mean_y np.mean(y) mean_z np.mean(z) feat [rms_x, rms_y, rms_z, std_x, std_y, std_z, mean_x, mean_y, mean_z] features.append(feat) return np.array(features) # 提取正常特征 normal_feats extract_features(normal_acc_X, normal_acc_Y, normal_acc_Z) # 提取异常特征 abnormal_feats extract_features(abn_acc_X, abn_acc_Y, abn_acc_Z)4. 训练 K-means只使用正常数据python运行# 标准化非常重要 scaler StandardScaler() normal_feats_scaled scaler.fit_transform(normal_feats) # K-means 训练 K 3 # 正常振动一般分 2~4 类足够 kmeans KMeans(n_clustersK, random_state42) kmeans.fit(normal_feats_scaled)5. 异常检测核心距离计算python运行def detect_anomaly(feature, scaler, kmeans, threshold1.2): feat_scaled scaler.transform(feature.reshape(1,-1)) dists kmeans.transform(feat_scaled) # 到每个簇中心的距离 min_dist np.min(dists) return min_dist, min_dist threshold6. 测试效果python运行print( 测试正常样本 ) test_normal normal_feats[0] dist, is_abnormal detect_anomaly(test_normal, scaler, kmeans) print(f距离{dist:.2f}, 异常{is_abnormal}) print(\n 测试异常样本 ) test_abnormal abnormal_feats[0] dist, is_abnormal detect_anomaly(test_abnormal, scaler, kmeans) print(f距离{dist:.2f}, 异常{is_abnormal})7. 可视化直观看到聚类效果python运行plt.figure(figsize(10,5)) plt.scatter(normal_feats_scaled[:,0], normal_feats_scaled[:,1], labelNormal, alpha0.5) plt.scatter(kmeans.cluster_centers_[:,0], kmeans.cluster_centers_[:,1], cred, s200, labelCluster Center) plt.title(K-means 聚类正常振动特征) plt.legend() plt.show()八、原理深度解释看懂就是嵌入式 AI 入门1. 为什么要标准化振动各特征量纲不同RMS、STD、MEAN必须归一化否则 K-means 会失效。2. 为什么只训练正常数据异常样本太少、类型不可预测。K-means 只需要学习正常分布偏离就是异常。3. 阈值怎么定训练完正常数据后取最大距离 × 1.1~1.5工业常用1.0~2.04. K 值怎么选设备振动K2~4 足够用肘部法则elbow method简单判断九、真实嵌入式工程STM32 / ESP32可直接移植你在单片机上只需要实现I2C 读取 LSM6DS3滑动窗口32~128 点特征计算RMS、STD、MEANK-means 纯 C 语言版本距离计算 阈值判断这套方案100% 可在嵌入式运行是工业预测性维护标准入门方案。十、总结这篇文章的核心九轴传感器采集振动 → 加速度计最重要时序振动 → 特征向量必须做K-means 只学习正常数据距离 阈值 异常轻量、无监督、可嵌入式落地、工业可用这就是传感器 K-means 异常检测的全部原理与代码
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2480164.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!