Proyecto técnico desarrollado para el reto de ingreso de Xavierian Aerospace Engineering (XAE). Implementa y valida un controlador de estabilidad de un grado de libertad para mantener el cabeceo de un cohete experimental aproximadamente vertical mediante control vectorial de empuje (Thrust Vector Control, TVC).
El vehículo es un cohete universitario representativo, rígido, sin aletas y aerodinámicamente inestable. El alcance se limita a la fase propulsada y a un punto de operación congelado; no representa el vehículo real de XAE ni una simulación completa de seis grados de libertad.
El controlador continuo final emplea las ganancias:
| Parámetro | Valor |
|---|---|
Kp |
0.33467811 |
Ki |
0.48302948 1/s |
Kd |
0.07929096 s |
| Filtro de velocidad angular | tau_f = 0.005 s |
| Actuador de primer orden | tau_a = 0.03 s |
| Límite del gimbal | ±5 deg |
La implementación digital final opera a 250 Hz (T_s = 0.004 s) e incluye filtro bilineal de la velocidad angular, integral discreta, saturación, anti-windup condicional y comprobaciones de temporización y validez de sensores.
| Validación | Resultado |
|---|---|
| Tiempo de establecimiento nominal continuo | 1.816 s |
| Margen de fase continuo | 47.000 deg |
| Frecuencia de cruce | 13.594 rad/s |
| Tiempo nominal digital a 250 Hz | 1.814 s |
| Monte Carlo continuo, 300 casos | 100 % de cumplimiento; T_s,max = 1.916 s |
| Monte Carlo digital, 300 casos | 100 % de cumplimiento; T_s,max = 1.913 s |
| Diferencia máxima Python–C | 5.42e-8 en los estados/comandos evaluados |
| Diferencia angular nominal MuJoCo–modelo reducido | 0.00690 deg |
Los análisis One-at-a-Time (OAT), los 32 vértices del hipercubo y Monte Carlo aportan evidencia numérica de robustez dentro del dominio paramétrico estudiado de ±20 %; no constituyen una demostración matemática absoluta sobre todo el continuo paramétrico.
xae/ Modelo, control continuo/digital y utilidades
scripts/ Simulaciones, validaciones y demostraciones
tests/ Pruebas unitarias de las etapas digital y MuJoCo
mcu/ Implementación equivalente en C99
mujoco/ Escena 3D, gimbal y recurso visual
results/data/ Métricas y tablas compactas reproducibles
results/figures/ Figuras finales en PNG
Entorno de referencia: Python 3.8.10 sobre Ubuntu 20.04.
python3 -m venv .venv
source .venv/bin/activate
unset PYTHONPATH
python -m pip install --upgrade pip
python -m pip install -r requirements_mujoco.txt
python -m pip install -e .
python -m pip checkpython -m unittest discover -s tests -v
make -C mcu clean all test
python scripts/validate_discrete_controller.py
python scripts/validate_mcu_implementation.py
python scripts/validate_mujoco_model.pyLa medición temporal incluida para C99 se obtuvo en el computador anfitrión y no debe interpretarse como Worst-Case Execution Time (WCET) de un microcontrolador real.
python scripts/run_nominal.py
python scripts/run_disturbances.py
python scripts/run_frequency.py
python scripts/run_robustness.py
python scripts/interactive_demo.py
python scripts/run_mujoco_demo.pyPara comprobar MuJoCo sin abrir el visor:
python scripts/run_mujoco_demo.py --headless --duration 2El modelo nominal no incluye roll, yaw, traslación lateral explícita, consumo continuo de masa, combustión, flexibilidad, sloshing, aeroelasticidad, ruido de sensores, navegación ni recuperación. Las perturbaciones del modelo reducido se representan mediante un momento equivalente alrededor del centro de gravedad; en MuJoCo se realizan como fuerzas laterales aplicadas fuera del centro de gravedad.