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.
- En proceso
- Actualizado octubre de 2026
- Licencia 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
Corre en tu navegador, sin instalar nada.
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
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']Galería
Modelo CAD
Cargando el modelo…