Péndulo con rueda de reacción

Un péndulo invertido que se sostiene acelerando una rueda. Modelo, simulador, MuJoCo en el navegador y la escalera de control completa, de la fricción al aprendizaje por refuerzo, sobre el mismo banco.

  • In progress
  • Updated October 2026
  • License MIT

Un péndulo invertido con rueda de reacción (reaction wheel pendulum) es un péndulo con un motor y una rueda en la punta. El pivote no se mueve: para sostenerse arriba, el motor acelera la rueda y el péndulo recibe el par contrario. Es el mismo aparato con el que Spong, Block y Åström enseñaban control en Illinois, hecho con un motor de gimbal, dos sensores magnéticos y piezas impresas.

Sirve para recorrer toda la escalera de control sobre un mismo banco: modelo, identificación de fricción, PID, espacio de estados y LQR, levantamiento por energía, MPC, una red neuronal que imita al controlador y, al final, aprendizaje por refuerzo con la brecha entre simulación y realidad medida con números.

Lo que ya existe se puede tocar aquí abajo: la física corre en MuJoCo dentro del navegador, a diez mil pasos por segundo, con el controlador a mil hercios reteniendo su salida como en el micro. Lo que pase después de un empujón no está guionizado.

Simulación en vivo

live
Open in a new tab ↗

Runs in your browser, nothing to install.

MuJoCo en WebAssembly dentro de tu navegador, con los controladores del repositorio. Arrastra el péndulo o empújalo; arrastra el fondo para girar la cámara.

Qué hay hecho

  • Modelo deducido con SymPy y comprobado contra el escrito a mano; MJCF y URDF generados desde un solo archivo de parámetros.

  • Simulador propio que coincide con MuJoCo a 1e-13 rad, para no depender de nadie en los primeros peldaños.

  • LQR y levantamiento por moldeo de energía ya corriendo en simulación, con métricas: desde 10° se asienta en 0.65 s sin saturar la rueda.

  • La misma simulación en el navegador: MuJoCo en WebAssembly con el mismo MJCF y las mismas ganancias; se arrastra, se empuja y se deja caer.

  • Lo que sigue: el banco físico, la identificación de fricción, PID, MPC, una red que imita y aprendizaje por refuerzo sobre el mismo aparato.

Banco propuesto

Micro
WIZnet W6300-EVB-Pico2: RP2350 con Ethernet, lazo a 1 kHz y telemetría UDP
Motor
BLDC de gimbal 2804 de 100 vueltas, sin reductor ni escobillas
Driver
SimpleFOC Mini (DRV8313) en modo par; 0.07 N·m máximo a 1 A
Sensores
MT6701 en el motor para el FOC, AS5600 en el pivote; IMU opcional para comparar estimadores
Rueda
Disco impreso de 110 mm con tuercas en el borde para ajustar la inercia
Costo
Unos 1,100 MXN en partes sin contar el micro
control/03_lqr/lqr.pyPython
def ganancias(p: Parametros, Q=None, R=None) -> np.ndarray:
    A, B = linealizar(p)
    # Pesos en unidades del aparato: 1 rad de theta pesa como 10 rad/s de rueda
    # al cuadrado; el par se penaliza fuerte porque el motor es chico.
    Q = np.diag([100.0, 1.0, 0.01]) if Q is None else Q
    R = np.array([[50.0]]) if R is None else R
    P = solve_continuous_are(A, B, Q, R)
    return np.linalg.solve(R, B.T @ P)  # K, fila 1x3

# K = [-5.04, -0.557, -0.0142]   par = -K · [theta, theta', phi']

Gallery

CAD model

Loading the model…

Las piezas impresas, modeladas en FreeCAD desde los parámetros del repositorio: base, columna con el alojamiento del rodamiento, brazo, rueda con alojamientos para tuercas M5 y cubo. Arrastra para girar.