Implementación Física — Sim-to-Real

Transferencia de la política DQN entrenada en simulación al prototipo real.

Tabla de Contenidos

  1. Estrategia de Transferencia
  2. Desafíos Sim-to-Real
  3. Rutina de Centrado
  4. Inferencia de la Red DQN en Tiempo Real
  5. Videos Demostrativos
    1. Video 1 — Péndulo manteniendo el equilibrio durante el entrenamiento
    2. Video 2 — Entrenamiento temprano: episodios fallidos
    3. Video 3 — Timelapse del entrenamiento completo (4,000 episodios)
    4. Video 4 — Timelapse: el equipo armando el péndulo

Estrategia de Transferencia

Una vez que el agente DQN convergió en simulación (tasa de éxito ≥ 90 %), los pesos de la red neuronal se exportaron desde MATLAB y se embebieron en el microcontrolador. En cada ciclo de control, el Arduino:

  1. Adquiere el estado (θ, θ̇, x, ẋ) desde los encoders.
  2. Pasa el estado por la red DQN (inferencia en tiempo real).
  3. Selecciona la acción a = argmax Q(s, a) (política greedy pura).
  4. Aplica la fuerza correspondiente al motor via PWM.

Desafíos Sim-to-Real

Desafío Descripción Solución
Fricción no modelada El carro real tiene rozamiento con la guía Sintonización de w3 (peso del esfuerzo)
Latencia serial Tiempo de comunicación Arduino ↔ PC Optimización del protocolo de comunicación
Offset del encoder Posición cero no coincide con la simulación Rutina de centrado automático al inicio
Ruido de medición Vibración mecánica en θ̇ Filtro de media móvil sobre velocidad angular

Rutina de Centrado

Antes de activar el controlador DQN, el carro ejecuta una rutina de centrado para establecer el origen de coordenadas:

void centrarCarro() {
  // Mover hacia límite izquierdo hasta activar fin de carrera
  moverMotor(-VELOCIDAD_CENTRADO);
  while (!finDeCarreraIzq()) { delay(1); }
  resetearEncoder();

  // Mover al centro de la guía
  moverMotor(+VELOCIDAD_CENTRADO);
  while (posicion() < LONGITUD_GUIA / 2.0) { delay(1); }
  pararMotor();
  resetearEncoder();  // x = 0 en el centro
}

Inferencia de la Red DQN en Tiempo Real

Los pesos exportados de MATLAB se cargan como arreglos de constantes en el firmware. La inferencia se realiza como multiplicaciones matriciales en punto flotante:

float inferirAccion(float estado[4]) {
  float h1[64], h2[64], q[41];

  // Capa 1: h1 = ReLU(W1 * estado + b1)
  matMul(W1, estado, h1, 64, 4);
  addBias(h1, b1, 64);
  relu(h1, 64);

  // Capa 2: h2 = ReLU(W2 * h1 + b2)
  matMul(W2, h1, h2, 64, 64);
  addBias(h2, b2, 64);
  relu(h2, 64);

  // Salida: Q = W3 * h2 + b3
  matMul(W3, h2, q, 41, 64);
  addBias(q, b3, 41);

  return acciones[argmax(q, 41)];  // acción greedy
}

Videos Demostrativos

Video 1 — Péndulo manteniendo el equilibrio durante el entrenamiento

Video 2 — Entrenamiento temprano: episodios fallidos

Video 3 — Timelapse del entrenamiento completo (4,000 episodios)

Video 4 — Timelapse: el equipo armando el péndulo


← Simulación    Resultados →


↑ Subir

Andrick Millán  ·  Jesús Velázquez  ·  Elías Santiago Jiménez Hernández
Ingeniería Electrónica · Primavera 2026 · IBERO Ciudad de México
Control Inteligente  ·  Dr. Alexandro López  ·  Mtro. Julio Caballero
IBERO
Universidad Iberoamericana
Ciudad de México · 2026
This site uses Just the Docs, a documentation theme for Jekyll.