Montaje Físico, Sensores y Ruta de Modelado Predictivo

Arquitectura del Banco Hidráulico (ZeMA), Extracción de Características Avanzadas y Hoja de Ruta de ML

Author

Sergio Andres Beltran Gonzalez

Published

August 13, 2026


1 Introducción al Sistema de Monitoreo

NotePropósito del Documento

Este documento presenta los fundamentos físicos del montaje experimental del sistema hidráulico y establece la hoja de ruta metodológica para la implementación de modelos predictivos de Machine Learning.

El objetivo principal es pasar de la comprensión física del banco de pruebas a la definición de la estrategia analítica, simplificando las visualizaciones redundantes e incorporando métodos estadísticos supervisados (como LDA y análisis en frecuencia) para resolver la clasificación de los componentes más complejos.


2 Arquitectura del Banco de Pruebas Hidráulico

El experimento desarrollado en el Centre for Mechatronics and Automation Technology (ZeMA) de la Universidad de Saarland (Helwig et al., 2015) utiliza un banco de pruebas compuesto por dos circuitos interconectados a través de un tanque principal de 45 litros:

Ver codigo
grViz("
digraph banco_hidraulico {
  graph [layout = dot, rankdir = TB, bgcolor = 'transparent', nodesep = 0.6, ranksep = 0.5]
  
  node [fontname = 'Helvetica, Arial, sans-serif', shape = box, style = 'filled,rounded', fontsize = 10, margin = '0.25,0.2']
  
  Tanque [label = 'TANQUE PRINCIPAL DE ACEITE (45 L)\nFluido ISO VG 46', fillcolor = '#042C53', fontcolor = 'white', width = 3.2]
  
  Circ1 [label = '[1] CIRCUITO PRINCIPAL DE TRABAJO\n\n• Bomba Principal MP1 (Motor 3.3 kW)\n• Válvula Proporcional V11 (Ajuste Carga)\n• Acumuladores A1-A4 (Presión Nitrógeno)\n• Válvula de Conmutación V10', fillcolor = '#1C232B', fontcolor = 'white']
  
  Circ2 [label = '[2] CIRCUITO SECUNDARIO ENFRIAMIENTO\n\n• Enfriador C1 (Intercambiador)\n• Ventilador Regulable (0-100% duty)\n• Filtros de Aceite', fillcolor = '#1C232B', fontcolor = 'white']
  
  Tanque -> Circ1 [color = '#185FA5', penwidth = 2, label = '  Presión  ', fontname = 'Helvetica', fontsize = 10, fontcolor = '#0C447C']
  Tanque -> Circ2 [color = '#378ADD', penwidth = 2, label = '  Retorno  ', fontname = 'Helvetica', fontsize = 10, fontcolor = '#0C447C']
}
")

2.1 Funciones de los circuitos:

  1. Circuito de Trabajo Primario: Impulsado por la bomba de pistones coaxiales MP1 (motor de 3.3 kW). La válvula proporcional V11 ajusta la carga hidráulica (de 120 a 140 bar), mientras que los acumuladores A1-A4 entregan pulsos de caudal rápido.
  2. Circuito Secundario de Enfriamiento: Garantiza el acondicionamiento térmico. Extrae aceite del tanque, lo impulsa a través del enfriador C1 y lo retorna filtrado. La velocidad del ventilador del enfriador determina la viscosidad de equilibrio del sistema.

3 Red de Sensores e Inventario Técnico

El sistema monitorea la operación con 17 sensores (14 físicos y 3 virtuales). Las frecuencias de muestreo se adaptan a la dinámica temporal de cada variable física:

Ver codigo
sensores_df <- data.table(
  Sensor = c("PS1 - PS6", "EPS1", "FS1", "FS2", "TS1 - TS4", "VS1", "CE, CP, SE"),
  Variable = c("Presión", "Potencia Eléctrica", "Flujo Volumétrico 1", "Flujo Volumétrico 2", 
               "Temperatura", "Vibración", "Variables Virtuales"),
  Unidad = c("bar", "W", "l/min", "l/min", "°C", "mm/s", "%, kW, %"),
  Hz = c(100, 100, 10, 10, 1, 1, 1),
  Ubicación = c("Circuito Primario (Bomba, Válvulas, Acumulador)", "Entrada Eléctrica Motor MP1",
                "Línea Principal de Trabajo", "Circuito Secundario Enfriador",
                "Tanque, Salida Bomba, Entr/Sal Enfriador", "Cuerpo Físico de Bomba MP1",
                "Cálculo Físico Combinado (ΔT, Caudal, W)"),
  Objetivo_Diagnostico = c("Caídas de presión, dinámicas de conmutación de válvulas",
                           "Consumo de energía en fases de carga",
                           "Caudal entregado y detección de fuga interna",
                           "Restricciones de flujo en circuito térmico",
                           "Viscosidad del fluido y disipación de calor",
                           "Desgastes mecánicos y cavitación en la bomba",
                           "Eficiencia global del sistema y potencia de enfriamiento")
)

tabla_hyd(sensores_df,
          caption = "Inventario Técnico de la Red de Sensores del Banco Hidráulico",
          align = c("l", "l", "c", "r", "l", "l"),
          nota = "Frecuencias altas (100 Hz) capturan eventos transitorios rápidos; frecuencias bajas (1 Hz) miden variables térmicas de evolución lenta.")
Inventario Técnico de la Red de Sensores del Banco Hidráulico
Sensor Variable Unidad Hz Ubicación Objetivo_Diagnostico
PS1 - PS6 Presión bar 100 Circuito Primario (Bomba, Válvulas, Acumulador) Caídas de presión, dinámicas de conmutación de válvulas
EPS1 Potencia Eléctrica W 100 Entrada Eléctrica Motor MP1 Consumo de energía en fases de carga
FS1 Flujo Volumétrico 1 l/min 10 Línea Principal de Trabajo Caudal entregado y detección de fuga interna
FS2 Flujo Volumétrico 2 l/min 10 Circuito Secundario Enfriador Restricciones de flujo en circuito térmico
TS1 - TS4 Temperatura °C 1 Tanque, Salida Bomba, Entr/Sal Enfriador Viscosidad del fluido y disipación de calor
VS1 Vibración mm/s 1 Cuerpo Físico de Bomba MP1 Desgastes mecánicos y cavitación en la bomba
CE, CP, SE Variables Virtuales %, kW, % 1 Cálculo Físico Combinado (ΔT, Caudal, W) Eficiencia global del sistema y potencia de enfriamiento
Nota. Frecuencias altas (100 Hz) capturan eventos transitorios rápidos; frecuencias bajas (1 Hz) miden variables térmicas de evolución lenta.

4 Protocolo Experimental y Degradación Controlada

TipCiclos de Operación Estandarizados (60 segundos)

Cada ensayo consta de un ciclo idéntico de 60 segundos que simula el proceso repetitivo de una prensa o inyectora industrial: - 0 a 10 s (Transitorio inicial): Conmutación de válvulas y descarga del acumulador. - 10 a 20 s (Carga constante): Presión elevada (~130 bar) para medir desempeño de la bomba. - 20 a 30 s (Transitorio intermedio): Cambio de fase operacional. - 30 a 50 s (Carga sostenida): Evaluación de estabilidad térmica y caudal sostenido. - 50 a 60 s (Retorno y descompresión): Cierre del ciclo.

Ver codigo
dt_ciclo_fases <- data.table(
  tiempo = seq(0, 60, length.out = 600),
  presion = 100 + 35 * sin(seq(0, 60, length.out = 600) / 4) + rnorm(600, 0, 0.5)
)

ggplot() +
  annotate("rect", xmin = 0, xmax = 10, ymin = -Inf, ymax = Inf, fill = pal$blue_soft, alpha = 0.4) +
  annotate("rect", xmin = 10, xmax = 20, ymin = -Inf, ymax = Inf, fill = pal$gray_ice, alpha = 0.5) +
  annotate("rect", xmin = 20, xmax = 30, ymin = -Inf, ymax = Inf, fill = pal$blue_soft, alpha = 0.4) +
  annotate("rect", xmin = 30, xmax = 50, ymin = -Inf, ymax = Inf, fill = pal$gray_ice, alpha = 0.5) +
  annotate("rect", xmin = 50, xmax = 60, ymin = -Inf, ymax = Inf, fill = pal$blue_soft, alpha = 0.4) +
  geom_line(data = dt_ciclo_fases, aes(x = tiempo, y = presion), color = pal$blue_deep, linewidth = 0.8) +
  annotate("text", x = 5, y = 142, label = "Transitorio (Válvula/Acumulador)", color = pal$blue_dark, fontface = "bold", size = 3) +
  annotate("text", x = 15, y = 142, label = "Carga Estacionaria (Bomba)", color = pal$gray_mid, fontface = "bold", size = 3) +
  annotate("text", x = 40, y = 142, label = "Carga Sostenida (Enfriador/Bomba)", color = pal$gray_mid, fontface = "bold", size = 3) +
  labs(title = "Estructura Temporal del Ciclo de Trabajo de 60 Segundos",
       subtitle = "Zonas sombreadas indican fases transitorias de conmutación vs. zonas estacionarias de carga",
       x = "Tiempo en el Ciclo (s)", y = "Presión de Trabajo PS1 (bar)")

Se registraron 2,205 ciclos variando de forma reversible la severidad de degradación en 4 componentes:

Componente Parámetro Ajustado Niveles de Estado Categoría
Enfriador (Cooler) Velocidad del ventilador (Duty Cycle) 100% (Óptimo / 55°C), 20% (Reducido / 66°C), 3% (Falla / >70°C) Fácil
Válvula (Valve) Corriente de accionamiento del solenoide 100% (Óptimo), 90% (Retraso leve), 80% (Retraso severo), 73% (Falla total) Fácil
Bomba (Pump) Fuga interna por válvulas de bypass (V9) 0 (Sin fuga), 1 (Fuga débil: 3x0.2mm), 2 (Fuga severa: 3x0.25mm) Difícil
Acumulador (Accumulator) Presión de precarga de nitrógeno (A1-A4) 130 bar (Óptimo), 115 bar (Baja), 100 bar (Muy baja), 90 bar (Falla) Difícil

5 Justificación Metodológica y Selección de Gráficas Clarificadoras

En este enfoque se pasa de 6,000 datos crudos por segundo a 320 características estadísticas (\(10\text{ sensores} \times 4\text{ segmentos} \times 8\text{ métricas}\)).

Para evitar la saturación visual, reemplazamos las cuadrículas repetitivas de 8 boxplots por visualizaciones focales que contrastan componentes fáciles versus difíciles:

5.1 Comparativa de Boxplots Focales (Fácil vs. Difícil)

Ver codigo
# Contrastar Enfriador (Fácil) vs Bomba (Difícil)
p_box_cooler <- ggplot(tabla_features, aes(x = cooler_label, y = CE_s1_media, fill = cooler_label)) +
  geom_boxplot(alpha = 0.8, outlier.size = 0.6) +
  scale_fill_manual(values = c(pal$fail, pal$warn, pal$ok)) +
  labs(title = "Enfriador: Eficiencia de Enfriamiento (CE_s1_media)",
       subtitle = "Separabilidad perfecta entre estados (Componente FÁCIL)",
       x = NULL, y = "Eficiencia (%)") +
  theme(legend.position = "none", axis.text.x = element_text(angle = 15, hjust = 1))

p_box_pump <- ggplot(tabla_features, aes(x = pump_label, y = VS1_s1_media, fill = pump_label)) +
  geom_boxplot(alpha = 0.8, outlier.size = 0.6) +
  scale_fill_manual(values = c(pal$ok, pal$warn, pal$fail)) +
  labs(title = "Bomba: Vibración (VS1_s1_media)",
       subtitle = "Solapamiento total en el dominio temporal (Componente DIFICIL)",
       x = NULL, y = "Vibración (mm/s)") +
  theme(legend.position = "none", axis.text.x = element_text(angle = 15, hjust = 1))

p_box_cooler + p_box_pump +
  plot_annotation(
    title = "Contraste de Separabilidad de Características por Componente",
    subtitle = "Reemplazo de cuadrícula redundante por comparación focalizada",
    theme = theme(plot.title = element_text(face = "bold", size = 15, color = pal$blue_deep))
  )

NoteInterpretación Física

Mientras que el Enfriador muestra medias claramente separadas que permiten una clasificación simple, la vibración de la Bomba en el dominio del tiempo tiene medias idénticas entre niveles de fuga. Esto justifica la necesidad de métricas en el dominio de la frecuencia (FFT) y modelos supervisados avanzados.


6 Incorporación de Métodos Avanzados (LDA y Análisis Espectral FFT)

Para mejorar la separabilidad de los componentes con distribuciones solapadas (Bomba y Acumulador), se incorporan técnicas supervisadas y del dominio de la frecuencia:

6.1 Proyección Supervisada LDA (Linear Discriminant Analysis)

A diferencia de PCA (que maximiza varianza sin usar etiquetas), LDA maximiza la separación inter-clase respecto a la intra-clase:

Ver codigo
# Seleccionar variables top para la bomba
cols_lda <- c("PS1_s1_media", "PS1_s3_media", "FS1_s1_media", "FS1_s3_media", 
              "EPS1_s1_media", "VS1_s1_media", "CE_s1_media", "SE_s1_media")
cols_lda <- cols_lda[cols_lda %in% names(tabla_features)]

# Ajustar LDA para la Bomba
fit_lda_pump <- lda(as.formula(paste("pump_label ~", paste(cols_lda, collapse = "+"))), data = tabla_features)
pred_lda_pump <- predict(fit_lda_pump)

dt_lda_pump <- data.table(
  LD1 = pred_lda_pump$x[, 1],
  LD2 = pred_lda_pump$x[, 2],
  Estado = tabla_features$pump_label
)

ggplot(dt_lda_pump, aes(x = LD1, y = LD2, color = Estado)) +
  geom_point(alpha = 0.4, size = 1.2) +
  scale_color_manual(values = c(pal$ok, pal$warn, pal$fail)) +
  labs(
    title = "Proyección LDA (Análisis Discriminante Lineal) para la Bomba",
    subtitle = "La información supervisada mejora la separación de cúmulos frente a PCA",
    x = "Discriminante Lineal 1 (LD1)",
    y = "Discriminante Lineal 2 (LD2)",
    color = "Estado Bomba"
  )

6.2 Demostración del Dominio de la Frecuencia (FFT en Vibración VS1)

Para capturar las frecuencias armónicas de la bomba que no se ven en la media temporal, aplicamos la Transformada Rápida de Fourier (FFT) simulada sobre la señal de vibración:

Ver codigo
# Crear una simulación espectral de frecuencias de bombeo (ejemplo conceptual con R)
set.seed(123)
freqs <- seq(0.1, 50, length.out = 200)
amp_sin_fuga <- exp(-(freqs - 15)^2 / 8) + 0.1 * runif(200)
amp_con_fuga <- exp(-(freqs - 15)^2 / 8) + 0.6 * exp(-(freqs - 30)^2 / 12) + 0.1 * runif(200)

dt_fft <- rbind(
  data.table(Frecuencia = freqs, Amplitud = amp_sin_fuga, Estado = "Sin fuga (0)"),
  data.table(Frecuencia = freqs, Amplitud = amp_con_fuga, Estado = "Fuga severa (2)")
)

ggplot(dt_fft, aes(x = Frecuencia, y = Amplitud, color = Estado)) +
  geom_line(linewidth = 0.8, alpha = 0.85) +
  scale_color_manual(values = c(pal$ok, pal$fail)) +
  labs(
    title = "Espectro de Frecuencia (FFT) Simulado para el Sensor de Vibración (VS1)",
    subtitle = "La presencia de armónicos secundarios (30 Hz) revela la fuga interna de la bomba",
    x = "Frecuencia (Hz)", y = "Amplitud Espectral (PSD)", color = "Estado Bomba"
  )


7 Hoja de Ruta Formal para Modelado Predictivo (Machine Learning)

El pipeline integral para construir el sistema de monitoreo predictivo consta de 6 fases secuenciales:

Ver codigo
grViz("
digraph pipeline_ml {
  graph [layout = dot, rankdir = LR, bgcolor = 'transparent', nodesep = 0.35, ranksep = 0.4]
  
  node [fontname = 'Helvetica, Arial, sans-serif', shape = box, style = 'filled,rounded', fontsize = 9, color = '#0C447C', penwidth = 1.5, margin = '0.2,0.15']
  
  P1 [label = '1. Ingesta & Limpieza\n\n• Split 80/20\n• 17 Sensores', fillcolor = '#E7EAED', fontcolor = '#0B0F14']
  P2 [label = '2. Feature Eng.\n\n• Estadísticos tiempo\n• Métricas FFT (VS1)', fillcolor = '#B5D4F4', fontcolor = '#042C53']
  P3 [label = '3. Selección\n\n• Pearson / Spearman\n• VIF & LDA', fillcolor = '#378ADD', fontcolor = 'white']
  P4 [label = '4. Algoritmos ML\n\n• XGBoost / LightGBM\n• Random Forest / SVM', fillcolor = '#185FA5', fontcolor = 'white']
  P5 [label = '5. Evaluación\n\n• F1-Score Macro\n• Matriz Confusión', fillcolor = '#0C447C', fontcolor = 'white']
  P6 [label = '6. Despliegue\n\n• SCADA / Tiempo Real\n• Alarmas Preventivas', fillcolor = '#042C53', fontcolor = 'white']
  
  P1 -> P2 -> P3 -> P4 -> P5 -> P6 [color = '#185FA5', penwidth = 2]
}
")

7.1 Resumen de Modelos Recomendados:

Ver codigo
modelos_df <- data.table(
  Modelo = c("XGBoost / LightGBM", "Random Forest", "Support Vector Machines (SVM)", "Regresión Logística L1/L2"),
  Tipo = c("Gradient Boosting sobre Árboles", "Ensemble Bagging", "Margen Máximo (Kernel RBF)", "Lineal Regulado"),
  Idoneidad = c("Excelente (Recomendado)", "Excelente", "Alta (Para Bomba y Acumulador)", "Moderada (Baseline)"),
  Ventajas_Clave = c("Maneja datos tabulares, interacciones complejas, entrega Feature Importance",
                     "Robusto a overfitting, no requiere normalización estricta",
                     "Eficaz en espacios de alta dimensión como las 320 features",
                     "Interpretación directa de coeficientes")
)

tabla_hyd(modelos_df,
          col.names = c("Algoritmo", "Tipo de Modelo", "Idoneidad", "Ventajas Clave"),
          caption = "Comparativa de Algoritmos Candidatos para Clasificación Multiclase",
          align = c("l", "l", "c", "l"))
Comparativa de Algoritmos Candidatos para Clasificación Multiclase
Algoritmo Tipo de Modelo Idoneidad Ventajas Clave
XGBoost / LightGBM Gradient Boosting sobre Árboles Excelente (Recomendado) Maneja datos tabulares, interacciones complejas, entrega Feature Importance
Random Forest Ensemble Bagging Excelente Robusto a overfitting, no requiere normalización estricta
Support Vector Machines (SVM) Margen Máximo (Kernel RBF) Alta (Para Bomba y Acumulador) Eficaz en espacios de alta dimensión como las 320 features
Regresión Logística L1/L2 Lineal Regulado Moderada (Baseline) Interpretación directa de coeficientes
ImportantEstrategia de Evaluación

Dado el desbalance de clases observado en la Bomba y el Acumulador (con clases dominantes de 1,221 y 808 ciclos), se priorizará el F1-Score macro y las Matrices de Confusión, asegurando minimizar la tasa de falsos negativos (no detectar un fallo incipiente).


Documento desarrollado como parte del proyecto de Monitoreo de Sistemas Hidráulicos.