Разработка AI-системы мониторинга оборудования по вибрации и температуре

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка AI-системы мониторинга оборудования по вибрации и температуре
Средняя
~1-2 недели
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1240
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1167
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    867
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1084
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    829

Разработка AI-системы мониторинга оборудования по вибрации и температуре

Вибрация и температура — два основных диагностических параметра вращающегося оборудования. Вибрация несёт информацию о механических дефектах (подшипники, дисбаланс, расцентровка), температура — о тепловых аномалиях (перегрев подшипника, нарушение смазки, перегрузка).

Размещение датчиков

Вибродатчики:

sensor_placement_guidelines = {
    'motor_drive_end_bearing': {
        'position': 'горизонтально на крышке подшипника',
        'sensitive_to': ['unbalance', 'misalignment', 'bearing_defects'],
        'frequency_range': '10-10000 Hz'
    },
    'motor_non_drive_end_bearing': {
        'position': 'горизонтально',
        'sensitive_to': ['rotor_asymmetry', 'bearing'],
        'frequency_range': '10-10000 Hz'
    },
    'pump_bearing': {
        'position': 'на корпусе насоса у подшипника',
        'sensitive_to': ['cavitation', 'impeller_unbalance'],
        'note': 'добавить радиальный + осевой датчики'
    },
    'gearbox': {
        'position': 'на корпусе редуктора',
        'sensitive_to': ['gear_mesh_frequency', 'tooth_defects'],
        'frequency_range': '10-20000 Hz'
    }
}

Тепловые датчики:

  • PT100 / PT1000: точность ±0.1°C, для подшипников < 2 секунды реакции
  • Thermocouple: более быстрый отклик, подходит для горячих точек
  • Инфракрасные термометры: бесконтактные, для периодических обходов
  • Тепловизор: периодическая инспекция, видит "горячие пятна"

Обработка вибрационного сигнала

Диагностические зоны ISO 10816:

import numpy as np

def classify_vibration_severity(rms_velocity_mm_s, machine_class):
    """
    ISO 10816: классификация виброскорости по зонам A/B/C/D
    Класс I: малые машины < 15 кВт
    Класс II: средние машины 15-75 кВт
    Класс III: крупные машины > 75 кВт на жёстком основании
    """
    thresholds = {
        'I':   {'A': 0.28, 'B': 0.71, 'C': 1.8, 'D': float('inf')},
        'II':  {'A': 0.45, 'B': 1.12, 'C': 2.8, 'D': float('inf')},
        'III': {'A': 0.71, 'B': 1.8,  'C': 4.5, 'D': float('inf')},
        'IV':  {'A': 1.12, 'B': 2.8,  'C': 7.1, 'D': float('inf')}
    }

    t = thresholds[machine_class]
    if rms_velocity_mm_s <= t['A']:
        return 'A', 'Excellent — new machine condition'
    elif rms_velocity_mm_s <= t['B']:
        return 'B', 'Acceptable — long-term operation allowed'
    elif rms_velocity_mm_s <= t['C']:
        return 'C', 'Tolerable — short-term only, schedule maintenance'
    else:
        return 'D', 'Unacceptable — immediate shutdown risk'

Спектральный анализ — автоматическое выявление дефектных частот:

from scipy.fft import fft, fftfreq
import scipy.signal as signal

def diagnose_from_spectrum(vibration_signal, sampling_rate, shaft_rpm,
                            bearing_freqs, gear_mesh_freq=None):
    """
    Автоматическая диагностика по спектру вибрации
    """
    n = len(vibration_signal)
    freqs = fftfreq(n, 1/sampling_rate)[:n//2]
    magnitude = np.abs(fft(vibration_signal))[:n//2]

    shaft_freq = shaft_rpm / 60
    diagnoses = []

    # Дисбаланс: доминирование 1x оборотной частоты
    idx_1x = np.argmin(np.abs(freqs - shaft_freq))
    if magnitude[idx_1x] > np.mean(magnitude) * 10:
        diagnoses.append({'fault': 'unbalance', 'severity': 'medium',
                          'evidence': f'1x amplitude = {magnitude[idx_1x]:.2f}'})

    # Расцентровка: высокие 2x + осевая составляющая
    idx_2x = np.argmin(np.abs(freqs - 2 * shaft_freq))
    if magnitude[idx_2x] > magnitude[idx_1x] * 0.5:
        diagnoses.append({'fault': 'misalignment', 'severity': 'medium',
                          'evidence': f'2x/1x ratio = {magnitude[idx_2x]/magnitude[idx_1x]:.2f}'})

    # Подшипниковые дефекты: BPFO, BPFI
    for bearing_name, bf in bearing_freqs.items():
        for fault_name, freq in [('bpfo', bf['bpfo']), ('bpfi', bf['bpfi'])]:
            idx = np.argmin(np.abs(freqs - freq))
            local_mean = magnitude[max(0, idx-10):idx+10].mean()
            if magnitude[idx] > local_mean * 5:
                diagnoses.append({
                    'fault': f'{fault_name}_{bearing_name}',
                    'severity': 'high',
                    'evidence': f'Amplitude at {freq:.1f}Hz = {magnitude[idx]:.2f}'
                })

    return diagnoses

Температурный мониторинг

Baseline и аномалии:

class TemperatureMonitor:
    def __init__(self, baseline_window_hours=24):
        self.baseline = {}
        self.alert_thresholds = {}

    def set_baseline(self, equipment_id, temperature_history):
        """
        Baseline: медианная температура в нормальном режиме
        Учитывает нагрузку: температура нормальна при высокой нагрузке
        """
        self.baseline[equipment_id] = {
            'overall_median': np.median(temperature_history),
            'load_corrected': self._fit_load_temperature_curve(temperature_history)
        }

    def check_temperature(self, equipment_id, current_temp, current_load):
        baseline = self.baseline[equipment_id]
        expected_temp = baseline['load_corrected'].predict([[current_load]])[0]

        deviation = current_temp - expected_temp

        if deviation > 20:
            return 'CRITICAL', f'Temperature {deviation:.1f}°C above expected'
        elif deviation > 10:
            return 'WARNING', f'Temperature {deviation:.1f}°C above expected'
        elif deviation > 5:
            return 'CAUTION', f'Slight temperature elevation: {deviation:.1f}°C'
        else:
            return 'NORMAL', None

Тренд-анализ температуры:

def analyze_temperature_trend(temperature_series, window_days=7):
    """
    Постепенный рост температуры = деградация подшипника или нарушение смазки
    """
    recent = temperature_series.last(f'{window_days}D')
    trend = np.polyfit(range(len(recent)), recent.values, 1)[0]

    rate_per_day = trend
    if rate_per_day > 1.0:  # > 1°C в день = красный флаг
        return 'ACCELERATING', rate_per_day
    elif rate_per_day > 0.3:
        return 'GRADUAL_RISE', rate_per_day
    else:
        return 'STABLE', rate_per_day

Корреляция вибрации и температуры

Multi-sensor fusion:

def correlate_vibration_temperature(vibration_features, temperature_features, time_lag_hours=2):
    """
    Тепловые признаки могут запаздывать за вибрационными на 1-4 часа
    (тепло распространяется медленнее вибрации)
    """
    # Lag correlation
    combined_score = 0

    # Оба показателя выше нормы = усиленный сигнал
    if vibration_features['kurtosis'] > 3 and temperature_features['deviation'] > 5:
        combined_score = max(
            vibration_features['anomaly_score'],
            temperature_features['anomaly_score']
        ) * 1.3  # усиление при подтверждении двумя сенсорами

    # Температура без вибрации = возможно смазки/охлаждение
    elif temperature_features['deviation'] > 10 and vibration_features['kurtosis'] < 2:
        return 'lubrication_or_cooling_issue'

    return combined_score

Dashboard и алертинг

Real-time Grafana дашборд:

  • Live waveform: последние 10 секунд вибросигнала
  • FFT спектр: обновляется каждые 5 минут
  • Trending: RMS и kurtosis за 30 дней
  • ISO зона: цветовая индикация A/B/C/D
  • Temperature heatmap: все точки измерения на схеме оборудования

Alert Matrix:

alert_matrix = {
    ('D', 'CRITICAL'): 'immediate_shutdown',  # ISO зона D + критическая температура
    ('D', 'WARNING'): 'urgent_inspection',
    ('C', 'CRITICAL'): 'urgent_inspection',
    ('C', 'WARNING'): 'schedule_next_shift',
    ('B', 'CAUTION'): 'monitor_closely',
    ('A', 'NORMAL'): 'routine'
}

Сроки: датчики + OPC-UA/Modbus + базовый vibration RMS + ISO классификация + temperature alerts + Grafana — 3-4 недели. Спектральная диагностика, envelope analysis, тренд-анализ температуры, multi-sensor fusion, mobile alerts — 2-3 месяца.