Del avión a la matriz A
Cómo construir, entender y mejorar el modelo no lineal de tu tail-sitter: aerodinámica, propulsión, ecuaciones de cuerpo rígido, cinemática, trim, linealización, control, sensores y ensayos.
Cómo usar este cuaderno
Está pensado para leerlo en el móvil, un capítulo cada vez. La regla es simple: primero intentas tú, luego miras. La IA te ahorra tiempo en el código, pero las ecuaciones las tienes que poder escribir tú en un papel.
Ver solución
Aquí está la respuesta, paso a paso.
Tail sitter implementa lo que acabas de ver.Al final de cada capítulo hay una casilla Lo entendí. Se guarda en este navegador, para que sepas por dónde vas.
Índice
- 1El mapa: qué estamos construyendo
- 2Marcos de referencia y rotaciones
- 3Newton: ecuaciones de traslación
- 4Euler: ecuaciones de rotación
- 5Cinemática y el modelo de 13 estados
- 6Fuerzas aerodinámicas
- 7Propulsión: motor, hélice, estela
- 8Ensamblar y simular f(x,u)
- 9Trim: buscar el equilibrio
- 10Linealizar: las matrices A y B
- 11Control para hardware real
- 12Sensores, filtros y estimación
- 13Subir la precisión del modelo
- 14Herramientas y simuladores
- 15Tu plan de trabajo
- 16Símbolos y referencias
El mapa: qué estamos construyendo
Todo el proyecto se resume en una sola línea. Un modelo de simulación de vuelo es una función que, dado el estado actual del avión y lo que hacen los mandos, te dice cómo cambia el estado:
- \(\mathbf x\) es el estado: el mínimo de números que describe al avión en un instante (dónde está, hacia dónde mira, qué tan rápido va y gira).
- \(\mathbf u\) son las entradas: lo que el piloto o el controlador puede mandar (flaperones, deflector de la deriva, aceleradores de los 4 motores).
- \(f\) es la física: aerodinámica + propulsión + gravedad, pasadas por las leyes de Newton y Euler y por la cinemática.
Si sabes evaluar \(f\), puedes simular (integrar en el tiempo), buscar el equilibrio (trim, donde \(\dot{\mathbf x}=0\)) y linealizar (sacar las matrices \(A\) y \(B\) para diseñar el control). Por eso todo el cuaderno gira alrededor de cómo construir \(f\) bien.
El vector de estado de 13
| Grupo | Estados | Qué es | Ecuación que lo gobierna |
|---|---|---|---|
| Posición | \(x_N, y_E, z_D\) | Dónde está el CG en ejes Tierra (NED: norte, este, abajo) | Cinemática de posición (cap. 5) |
| Velocidad | \(u, v, w\) | Velocidad del CG respecto al aire, en ejes cuerpo | Newton (cap. 3) |
| Actitud | \(q_0, q_1, q_2, q_3\) | Orientación del avión (cuaternión unitario) | Cinemática de actitud (cap. 5) |
| Velocidad angular | \(p, q, r\) | Giro alrededor de los ejes cuerpo | Euler (cap. 4) |
Son 3 + 3 + 4 + 3 = 13. Con ángulos de Euler (\(\phi,\theta,\psi\)) en vez del cuaternión serían 12. Para un tail-sitter usamos el cuaternión porque en vuelo estacionario (hover) el morro apunta hacia arriba, \(\theta = 90^\circ\), y ahí los ángulos de Euler fallan (capítulo 2 y 5).
Las entradas de tu avión
\(\delta_f\): los dos flaperones juntos (los dos abajo o los dos arriba). \(\delta_a\): los flaperones en diferencial (alerón, para alabear). \(\delta_r\): el deflector de la deriva. \(t_1\dots t_4\): acelerador de cada motor (ala derecha, ala izquierda, punta superior de la deriva, punta inferior).
Los bloques y cómo se conectan
Fíjate en dos cosas. La propulsión no solo empuja: su estela cambia el aire que ven el ala y la deriva (por eso hay una flecha de propulsión a aerodinámica). Y Newton y Euler no dan posiciones: dan aceleraciones. La cinemática las convierte en cambios de posición y orientación, y la integración cierra el lazo.
Tu notación y la del curso
En las clases FD02 a FD05 (que siguen a Cook, Flight Dynamics Principles), las velocidades totales en ejes cuerpo se llaman \(U, V, W\) y las minúsculas \(u, v, w\) son perturbaciones alrededor del equilibrio. En este cuaderno, como en Stevens & Lewis y en Beard & McLain, \(u, v, w\) son las velocidades totales. Cuando linealicemos (capítulo 10) usaremos \(\Delta u\) para la perturbación. Fuerzas \(X, Y, Z\) y momentos \(L, M, N\) son iguales en ambos.
Qué archivo hace qué
Archivo en Tail sitter | Qué calcula | Capítulo |
|---|---|---|
flowState.m | Pasa \(V,\alpha,\beta\) o \(u,v,w\) a un estado de flujo común | 2, 6 |
wingStripTheory.m | Ala con flaperones: sustentación, resistencia, momentos | 6 |
finStripTheory.m | Deriva con deflector | 6 |
propBEMT.m, loadPropData.m | Coeficientes \(C_T(J)\), \(C_Q(J)\) de la hélice | 7 |
motorModel.m | Motor sin escobillas + hélice: rpm, empuje, par, corriente | 7 |
motorForces.m | Los 4 motores: empuje, par de reacción, giroscópico | 7 |
slipstreamVel.m | Velocidad extra y torbellino de la estela | 7 |
tailsitterAero.m | Suma todo: \(F\) y \(M\) en el CG | 8 |
defineHardware.m | Datos reales del motor, hélice y batería | 7, 13 |
Eqs_of_motion.m (vacío) | Aquí irá \(f(\mathbf x,\mathbf u)\): Newton, Euler, cinemática | 3, 4, 5, 8 |
Marcos de referencia y rotaciones
Todos los errores de signo de la mecánica de vuelo vienen de mezclar marcos. Antes de cualquier ecuación hay que tener claro en qué ejes está escrita cada cantidad y cómo se pasa de unos a otros.
Los tres marcos que usarás
| Marco | Origen y ejes | Para qué sirve |
|---|---|---|
| Tierra (NED), \(\mathcal F_E\) | Fijo en el suelo. \(x\) al norte, \(y\) al este, \(z\) hacia abajo | Ahí vale la ley de Newton (Tierra plana y sin girar). Posición y gravedad. |
| Cuerpo, \(\mathcal F_B\) | En el CG. \(x\) hacia el morro, \(y\) al ala derecha, \(z\) hacia la panza | Inercias constantes. Aerodinámica, motores y sensores están fijos aquí. |
| Viento, \(\mathcal F_W\) | \(x\) alineado con la velocidad respecto al aire | Donde se definen sustentación y resistencia. Se llega girando el cuerpo por \(\alpha\) y \(\beta\). |
Los ángulos aerodinámicos salen directamente de las velocidades en ejes cuerpo:
flowState.m acepta las dos formas por esa razón.Girar un vector de un marco a otro
Un mismo vector (por ejemplo, la gravedad) tiene componentes distintas en cada marco. La matriz de cosenos directores (DCM) \(C_{B/E}\) convierte componentes en ejes Tierra a componentes en ejes cuerpo:
Con ángulos de Euler, la orientación se construye con tres giros sucesivos, en este orden: primero guiñada \(\psi\) alrededor de \(z\), luego cabeceo \(\theta\) alrededor del nuevo \(y\), y por último alabeo \(\phi\) alrededor del nuevo \(x\). Es la secuencia 3-2-1.
Escribe la matriz de un giro de ángulo \(\psi\) alrededor del eje \(z\) que pasa componentes del marco viejo al nuevo. Pista: dibuja los ejes \(x, y\) en el plano, gira el marco un ángulo \(\psi\) y proyecta.
Ver solución
Cada fila es un eje nuevo escrito en el marco viejo. El eje \(x\) nuevo es \((\cos\psi,\sin\psi,0)\), por eso es la primera fila.
Del mismo modo:
¿En qué orden se multiplican las tres matrices para obtener \(C_{B/E}\)? Recuerda que el primer giro actúa primero sobre el vector.
Ver solución
El vector en ejes Tierra se multiplica primero por \(R_z\) (está más a la derecha). Multiplicando (abreviando \(c=\cos\), \(s=\sin\)):
La gravedad en ejes Tierra es \((0,0,g)\). Escribe sus componentes en ejes cuerpo.
Ver solución
Es la tercera columna de \(C_{B/E}\) multiplicada por \(g\):
Comprobación: con el avión nivelado (\(\phi=\theta=0\)) toda la gravedad va por \(z\) cuerpo, hacia la panza. En hover (\(\theta=90^\circ\)) va toda por \(-x\): tira de la cola hacia abajo, y el empuje de los motores (por \(+x\)) la compensa.
La DCM es ortogonal: su inversa es su traspuesta. Para pasar de cuerpo a Tierra usas \(C_{E/B}=C_{B/E}^T\). Esto lo necesitarás para la posición.
El problema de los ángulos de Euler: gimbal lock
Con \(\theta=90^\circ\), el primer giro (\(\psi\), alrededor de la vertical) y el último (\(\phi\), alrededor del morro, que ahora también apunta vertical) giran alrededor del mismo eje. Se pierde un grado de libertad: hay infinitas combinaciones de \(\phi\) y \(\psi\) para la misma orientación, y las ecuaciones de las derivadas de los ángulos se dividen entre \(\cos\theta=0\). Para un avión normal no importa porque nunca vuela a \(90^\circ\). Para un tail-sitter es su punto de operación en hover.
Cuaterniones: la solución
Cualquier orientación se puede alcanzar con un único giro de ángulo \(\eta\) alrededor de un eje unitario \(\mathbf e\) (teorema de Euler). El cuaternión guarda ese giro con cuatro números:
Cuatro números para tres grados de libertad: sobra uno, y por eso existe la restricción de norma unidad. A cambio, no hay ninguna orientación singular. La DCM en función del cuaternión es:
Y para pasar de ángulos de Euler (3-2-1) a cuaternión, con \(c_\phi=\cos(\phi/2)\), \(s_\phi=\sin(\phi/2)\), etc.:
angle2dcm, quat2dcm, eul2quat hacen estas conversiones. Ojo: cada librería tiene su convención (escalar primero o último, giro activo o pasivo). Antes de usar una, compruébala con un caso que sepas a mano, por ejemplo \(\theta=90^\circ\) y la gravedad debe salir \((-g,0,0)\).Newton: ecuaciones de traslación
Aquí sale la ecuación que preguntabas: cómo cambia la velocidad \(u\) (y \(v\), \(w\)). La idea entera cabe en una frase: Newton vale en ejes Tierra, pero queremos escribir la velocidad en ejes cuerpo, que giran. Todo lo demás es hacer la cuenta con cuidado.
Hipótesis
- Cuerpo rígido, masa constante (sin consumo de combustible: tu batería no cambia de masa).
- Tierra plana y sin rotación: el marco NED es inercial. Vale para vuelos cortos y lentos como los tuyos.
- Origen de los ejes cuerpo en el CG.
Paso 1: la derivada de un vector que gira
Escribimos la velocidad con sus componentes en ejes cuerpo: \(\mathbf V=u\,\hat{\mathbf i}+v\,\hat{\mathbf j}+w\,\hat{\mathbf k}\). Pero \(\hat{\mathbf i},\hat{\mathbf j},\hat{\mathbf k}\) son los ejes del avión, y giran con él a velocidad angular \(\boldsymbol\omega=(p,q,r)\).
Un vector unitario \(\hat{\mathbf i}\) gira rígidamente con \(\boldsymbol\omega\). ¿Cuánto vale \(d\hat{\mathbf i}/dt\) visto desde Tierra? Piensa en la velocidad de la punta de un radio que gira: \(\mathbf v=\boldsymbol\omega\times\mathbf r\).
Ver solución
La punta del vector unitario se mueve como un punto de un sólido que gira: su velocidad es \(\boldsymbol\omega\times\) (su posición).
Paso 2: regla del producto
Deriva \(\mathbf V=u\hat{\mathbf i}+v\hat{\mathbf j}+w\hat{\mathbf k}\) respecto al tiempo con la regla del producto y usa el paso 1.
Ver solución
Esto es el teorema de transporte:
Lo usarás otra vez para el momento angular (capítulo 4) y para la estela. Es la herramienta más importante del curso.
Paso 3: desarrollar el producto vectorial
Calcula \(\boldsymbol\omega\times\mathbf V\) con \(\boldsymbol\omega=(p,q,r)\) y \(\mathbf V=(u,v,w)\) usando el determinante.
Ver solución
Paso 4: las tres ecuaciones
Junta todo: \(m(\dot{\mathbf V}_B+\boldsymbol\omega\times\mathbf V)=\mathbf F+m\mathbf g_B\), con la gravedad del capítulo 2. Escribe las tres ecuaciones y despeja \(\dot u,\dot v,\dot w\).
Ver solución
\(X, Y, Z\) son la suma de fuerzas aerodinámicas y de propulsión en ejes cuerpo. Con cuaternión, los términos de gravedad son \(g\) por la tercera columna de \(C_{B/E}(\mathbf q)\): \(2g(q_1q_3-q_0q_2)\), \(2g(q_2q_3+q_0q_1)\), \(g(q_0^2-q_1^2-q_2^2+q_3^2)\).
La ecuación de \(\dot u\), término a término
- \(rv-qw\): no es una fuerza. Aparece porque los ejes donde medimos \(u\) están girando. Si el avión cabecea hacia arriba (\(q>0\)) con \(w>0\), el eje \(x\) se aleja del vector velocidad: \(u\) disminuye y \(w\) aumenta aunque nada empuje. El término \(-qw\) lo recoge.
- \(X_{\text{aero}}\): componente \(x\) cuerpo de sustentación y resistencia: \(L\sin\alpha-D\cos\alpha\) por tira, como en tu
wingStripTheory.m. - \(\sum T_i\): los 4 empujes, todos por \(+x\).
- \(-g\sin\theta\): con el morro arriba, la gravedad frena. En hover (\(\theta=90^\circ\)) es \(-g\) entero.
(a) Hover quieto: \(u=v=w=0\), \(p=q=r=0\), \(\theta=90^\circ\), sin fuerzas aerodinámicas. ¿Qué empuje total hace falta para \(\dot u=0\)?
(b) Viraje nivelado coordinado: \(\theta=0\), \(v=w=0\), \(Y=0\). ¿Qué relación hay entre \(r\), \(u\) y \(\phi\)?
Ver solución
(a) \(0=\sum T_i/m-g\), así que \(\sum T_i=mg\): los motores sostienen el peso.
(b) De la ecuación de \(\dot v\): \(0=-ru+g\sin\phi\), luego \(ru=g\sin\phi\). En un viraje la guiñada en ejes cuerpo es \(r=\dot\psi\cos\phi\), y queda \(\dot\psi=g\tan\phi/u\): la fórmula clásica del viraje coordinado.
Euler: ecuaciones de rotación
Lo mismo que en el capítulo 3, pero con giros. La versión de rotación de Newton dice que el momento total es la derivada del momento angular, otra vez en ejes Tierra. Y otra vez escribimos todo en ejes cuerpo y usamos el teorema de transporte.
Momento angular y tensor de inercia
Cada partícula \(dm\) a una distancia \(\mathbf r\) del CG se mueve con \(\boldsymbol\omega\times\mathbf r\). Sumando \(\mathbf r\times(\boldsymbol\omega\times\mathbf r)\,dm\) sobre todo el avión:
En ejes cuerpo, \(I\) es constante (el avión no cambia de forma). Esa es la razón principal para trabajar en ejes cuerpo. Si el avión es simétrico respecto al plano \(x\)-\(z\), entonces \(I_{xy}=I_{yz}=0\) y solo queda \(I_{xz}\).
Paso 1: teorema de transporte para \(\mathbf H\)
Escribe \(\mathbf M=d\mathbf H/dt|_E\) en ejes cuerpo, igual que hiciste con la velocidad.
Ver solución
Como \(I\) es constante en ejes cuerpo, \(d\mathbf H/dt|_B=I\dot{\boldsymbol\omega}\).
Paso 2: desarrollar las componentes
Con \(I_{xy}=I_{yz}=0\), primero escribe \(\mathbf H=I\boldsymbol\omega\). Luego calcula \(\boldsymbol\omega\times\mathbf H\) y escribe las tres ecuaciones \(L, M, N\).
Ver solución
Paso 3: despejar \(\dot p\) y \(\dot r\)
\(\dot p\) y \(\dot r\) aparecen juntos en \(L\) y \(N\) por culpa de \(I_{xz}\). Es un sistema lineal de 2×2. La solución se escribe con los coeficientes \(\Gamma\) (Stevens & Lewis; Beard & McLain):
En código no hace falta escribirlos: wdot = I \ (M - cross(w, I*w)) resuelve el sistema directamente. Pero sí conviene que los sepas leer, porque así aparecen en los libros y en los exámenes.
Los rotores también tienen momento angular
Cada hélice con su rotor gira a \(\Omega_i\) (miles de rpm) alrededor de \(+x\). Su momento angular \(\mathbf h_i=s_iI_r\Omega_i\,\hat{\mathbf i}\) (con \(s_i=\pm1\) el sentido de giro) se suma al del avión:
Con \(\mathbf h=(H,0,0)\): \(-\boldsymbol\omega\times\mathbf h=(0,-rH,qH)\). Si cabeceas mientras las hélices giran, aparece un momento de guiñada. Si tus hélices giran en pares opuestos (como en tu defineHardware.m, spin = [1 1 -1 -1]), \(H\approx0\) y el efecto se cancela. Esto ya está en motorForces.m.
Cinemática y el modelo de 13 estados
Newton y Euler te dan \(\dot u,\dot v,\dot w,\dot p,\dot q,\dot r\). Faltan dos piezas: cómo cambia la orientación con \(p, q, r\) y cómo cambia la posición con \(u, v, w\). No hay física nueva aquí, solo geometría.
Velocidades de los ángulos de Euler
Ojo: \(p, q, r\) no son \(\dot\phi,\dot\theta,\dot\psi\). Las velocidades angulares están en ejes cuerpo; los ángulos de Euler se miden en ejes intermedios distintos.
\(\dot\phi\) actúa sobre el eje \(x\) cuerpo. \(\dot\theta\) actúa sobre el eje \(y\) intermedio (antes del giro \(\phi\)). \(\dot\psi\) actúa sobre el eje \(z\) Tierra. Pasa cada uno a ejes cuerpo con las matrices del capítulo 2 y súmalos.
Ver solución
Invirtiendo esa matriz:
El determinante de la primera matriz es \(\cos\theta\). Con \(\theta=90^\circ\) no se puede invertir: ahí está el gimbal lock en las ecuaciones.
Cinemática del cuaternión
En un intervalo pequeño \(dt\), el avión gira un ángulo \(|\boldsymbol\omega|dt\) alrededor de \(\boldsymbol\omega\). Componiendo ese giro pequeño con la orientación actual se llega a una ecuación lineal en \(\mathbf q\), sin senos ni divisiones:
Demuestra que con esta ecuación la norma \(\mathbf q^T\mathbf q\) no cambia. Pista: mira qué tipo de matriz es \(\Omega\).
Ver solución
\(\Omega\) es antisimétrica (\(\Omega^T=-\Omega\)), y para cualquier matriz antisimétrica \(\mathbf q^T\Omega\mathbf q=0\). En teoría la norma se conserva. En la práctica, el integrador numérico la va desviando poco a poco, así que se corrige: o normalizas \(\mathbf q\) en cada paso, o añades el término \(\tfrac{k}{2}(1-\mathbf q^T\mathbf q)\,\mathbf q\) a \(\dot{\mathbf q}\).
Posición
La velocidad está en ejes cuerpo; la posición en ejes Tierra. Basta girar el vector con la traspuesta de la DCM:
El modelo completo
Las fuerzas y momentos dependen de \(\mathbf V_B\), \(\boldsymbol\omega\), \(\mathbf u\) y la altitud (densidad). La gravedad depende de la actitud. Ese es todo el acoplamiento.
Fuerzas aerodinámicas
Las ecuaciones de los capítulos 3 a 5 valen para cualquier sólido: un avión, un dron o un ladrillo. Lo que hace que sea tu avión son las fuerzas y momentos. La aerodinámica tiene que entregar seis números en ejes cuerpo, en el CG:
Hay varias formas de construir \(\mathcal A\), de menos a más precisas: strip theory (lo que tienes), tablas de un método de paneles (VSPAERO, XFLR5), CFD o túnel de viento, y finalmente datos de vuelo. La función es la misma; cambia de dónde salen los números.
Nivel 1: strip theory, tira a tira
- Velocidad local de cada tira en su cuarto de cuerda \(\mathbf r\): la del avión, más la debida al giro, más la de la estela de las hélices: \(\mathbf V_\ell=\mathbf V_B+\boldsymbol\omega\times\mathbf r+\Delta\mathbf V_{\text{estela}}\).
- Ángulo de ataque local \(\alpha_\ell=\operatorname{atan2}(w_\ell,u_\ell)\) y presión dinámica \(\bar q_\ell=\tfrac12\rho|\mathbf V_\ell|^2\). La rotación \(p\) hace que el ala que baja vea más ángulo de ataque: eso es el amortiguamiento en alabeo.
- Coeficientes de la sección: \(c_l=c_{l0}+a\,(\alpha_\ell+\tau\delta)\), con límite suave en \(c_{l,\max}\) para la entrada en pérdida, y \(c_d=c_{d0}+c_l^2/(\pi eA\!R)\).
- Fuerzas de la tira: \(dL=\bar q_\ell c\,c_l\,dy\), \(dD=\bar q_\ell c\,c_d\,dy\), giradas a ejes cuerpo con \(\alpha_\ell\).
- Momentos: \(\sum\mathbf r\times d\mathbf F\), más el momento propio del flap.
La pendiente de sustentación de un ala finita (Helmbold, incompresible) y la eficacia del flap (perfil delgado) son:
El flap hacia abajo da más sustentación, pero un momento de picado: la carga extra cae detrás del cuarto de cuerda.
Forma con coeficientes y derivadas de estabilidad
Los libros y las tablas de VSPAERO usan coeficientes adimensionales. Para linealizar o comparar con otros aviones se escriben así (lateral, por ejemplo):
Cada derivada mide cuánto cambia un coeficiente al mover una variable. Tus demos de MATLAB las calculan con diferencias centrales, igual que harás con la matriz \(A\) en el capítulo 10.
Nivel 2: tablas de VSPAERO o XFLR5
- Modela el avión en OpenVSP: ala, deriva, fuselaje, con los flaperones como control surface sub-surfaces y grupos de control (flap: ganancias +1, +1; alerón: +1, −1).
- Barre una rejilla: \(\alpha\) de −10° a 20°, \(\beta\) de −10° a 10°, y cada mando en 3 a 5 valores. Guarda \(C_X, C_Y, C_Z, C_l, C_m, C_n\) (o \(C_L, C_D, \dots\)) respecto a un punto de referencia.
- Saca las derivadas de giro (\(C_{lp}\), \(C_{mq}\), \(C_{nr}\)) del análisis de estabilidad.
- En MATLAB, carga la rejilla y usa
griddedInterpolantpara interpolar en vuelo. - Suma la resistencia viscosa (VSPAERO es no viscoso):
cd0de XFOIL o de la herramienta Parasite Drag de OpenVSP.
No hace falta recalcular para cada posición del CG. Si las tablas están referidas a un punto \(\mathbf r_{\text{ref}}\), el momento respecto al CG es:
Las derivadas de giro sí cambian con el CG, porque la velocidad de cada punto depende de dónde está el eje de giro.
Niveles 3 y 4
CFD (STAR-CCM+, OpenFOAM, SU2): úsalo donde VSPAERO falla, no en toda la envolvente. Por ejemplo, unos pocos casos a \(\alpha\) alto con la hélice girando (modelo de disco actuador o malla rotante). Túnel de viento: mide con hélices funcionando. Vuelo: identificación de sistemas (capítulo 13) corrige las derivadas que más importan para el control.
wingStripTheory.m y finStripTheory.m son el nivel 1. Cuando tengas tablas, escribe una función aeroTables.m con las mismas entradas y salidas que tailsitterAero.m. El resto del modelo no cambia.Propulsión: motor, hélice, estela
Este es el capítulo que más rápido fue en el chat, así que va despacio. La cadena física es:
El acelerador no manda empuje: manda voltaje. El motor acelera hasta que el par que da iguala al par que le pide la hélice. Esa velocidad de giro fija el empuje.
7.1 El motor sin escobillas (BLDC) desde cero
Un motor eléctrico son imanes y bobinas. Dos efectos lo explican todo:
- Hace de generador: al girar, las bobinas producen un voltaje proporcional a la velocidad, la fuerza contraelectromotriz \(e=K_e\,\Omega\).
- Hace de motor: la corriente por las bobinas produce un par proporcional a la corriente, \(Q_m=K_t\,(I-I_0)\). \(I_0\) es la corriente que se pierde en rozamientos y pérdidas magnéticas sin carga.
El circuito, en régimen permanente (se desprecia la inductancia), es una resistencia y un "generador":
Demuestra que \(K_t=K_e\) (en unidades SI). Pista: la potencia eléctrica que "absorbe" la fuerza contraelectromotriz, \(e\cdot I\), se convierte en potencia mecánica \(Q\,\Omega\).
Ver solución
Los fabricantes dan \(K_V\) en rpm/V (las rpm en vacío por voltio). Pasado a SI: \(K_e=K_t=\dfrac{60}{2\pi K_V}\) en V·s/rad o N·m/A. Un motor de \(K_V=130\) tiene \(K_t=0.073\) N·m/A.
El variador (ESC) hace PWM: con acelerador \(t\in[0,1]\), el motor ve en media \(V_m=t\,V_{\text{bat}}\). La batería cae de voltaje con la corriente total: \(V_{\text{bat}}=V_{oc}-R_b\sum I_i\). Por eso el empuje baja durante el vuelo.
7.2 La hélice: coeficientes adimensionales
Por análisis dimensional, empuje, par y potencia de una hélice de diámetro \(D\) que gira a \(n\) rev/s solo dependen de la relación de avance \(J\):
Usando \(P=Q\,\Omega\) y \(\Omega=2\pi n\), relaciona \(C_P\) con \(C_Q\). Luego escribe el rendimiento propulsivo \(\eta=TV/P\) en función de los coeficientes.
Ver solución
En estático (\(J=0\)) \(\eta=0\) aunque la hélice empuje mucho: no hay avance. Para hover se usa otra medida, la figura de mérito (abajo).
Las curvas \(C_T(J)\) y \(C_P(J)\) son lo que publica la base de datos de hélices de UIUC y los ficheros de APC. Tu loadPropData.m las lee. Si no las tienes, propBEMT.m las calcula a partir de la geometría de la pala.
7.3 Teoría de cantidad de movimiento (disco actuador)
El modelo más sencillo: la hélice es un disco de área \(A\) que acelera el aire. Lejos delante el aire va a \(V\), en el disco a \(V+v_i\), y lejos detrás a \(V+v_w\).
(1) Empuje = caudal másico × aumento de velocidad. (2) Aplica Bernoulli delante y detrás del disco por separado (el salto de presión en el disco por el área también es el empuje). Iguala y demuestra que \(v_w=2v_i\).
Ver solución
Igualando: \(V+v_i=V+v_w/2\), luego \(v_w=2v_i\). El aire termina de acelerarse detrás del disco y el chorro se estrecha (contracción de la estela). Sustituyendo:
En hover (\(V=0\)): \(v_i=\sqrt{T/2\rho A}\), y la potencia ideal es \(P_i=Tv_i=T^{3/2}/\sqrt{2\rho A}\). La figura de mérito \(FM=P_i/P_{\text{real}}\) (típico 0.5–0.75) dice lo buena que es la hélice en hover.
7.4 Teoría del elemento de pala (BEMT)
El disco actuador no sabe nada de la forma de la pala. BEMT corta la pala en anillos y trata cada trozo como un perfil 2D, igual que strip theory con el ala. Cada trozo a radio \(r\) ve una velocidad tangencial \(\Omega r\) y una axial \(V+v_i\). El ángulo que forman, \(\phi\), y el paso de la pala, \(\theta\), dan el ángulo de ataque de la sección \(\alpha=\theta-\phi\).
La \(v_i\) de cada anillo se busca para que el empuje del elemento de pala coincida con el de cantidad de movimiento del anillo (\(dT=4\pi r\rho F(V+v_i)v_i\,dr\), con \(F\) la pérdida de punta de Prandtl). Es justo lo que hace propBEMT.m.
7.5 Dónde se juntan motor y hélice: el punto de operación
El motor da un par que baja con la velocidad (porque la fuerza contraelectromotriz se come el voltaje). La hélice pide un par que sube con la velocidad (\(\propto\Omega^2\)). El rotor acelera o frena hasta que se cruzan:
En el widget, baja el voltaje de 100 a 85 V con el mismo acelerador. ¿Qué le pasa al empuje? ¿Qué tendría que hacer el controlador para mantener el hover cuando la batería se descarga?
Ver respuesta
La recta del motor baja, el cruce ocurre a menos rpm y el empuje cae (aproximadamente con el cuadrado de las rpm). El controlador tiene que subir el acelerador. Por eso los autopilotos compensan con la medida del voltaje, o el lazo integral de altura lo corrige solo, con retraso.
7.6 Dinámica de las rpm: el motor no responde al instante
Fuera del equilibrio, la diferencia de pares acelera el rotor (inercia \(I_r\) de rotor + hélice):
Linealizando alrededor del punto de operación sale un sistema de primer orden con constante de tiempo:
Para motores de este tamaño, \(\tau_m\) suele estar entre 20 y 200 ms. Parece poco, pero en hover todo el control de actitud pasa por las rpm, así que \(\tau_m\) limita lo rápido que puede ser tu controlador (capítulo 11). Si metes \(\Omega_i\) como estados, el modelo pasa a 17 estados.
7.7 La estela (slipstream)
Detrás de la hélice el aire va más rápido y el chorro se estrecha. Con la teoría de cantidad de movimiento:
El chorro además gira en el sentido de la hélice (torbellino, swirl), porque el aire se lleva el par que le ha dado la hélice. Eso cambia el ángulo de ataque a un lado y otro del eje: un lado del ala gana sustentación y el otro la pierde.
7.8 Lo que los motores le hacen al avión
| Efecto | Expresión (motor \(i\) en \(\mathbf r_i\)) | Para qué lo usas |
|---|---|---|
| Empuje | \(\mathbf F=(T_i,0,0)\) | Sostener el peso en hover, avanzar en crucero |
| Momento del empuje | \(\mathbf r_i\times\mathbf F\): cabeceo \(z_iT_i\), guiñada \(-y_iT_i\) | Empuje diferencial: control de actitud en hover |
| Par de reacción | Alabeo \(-s_iQ_{m,i}\) | Hélices en sentidos opuestos: control del eje \(x\) |
| Giroscópico | \(-\boldsymbol\omega\times\mathbf h\) | Se cancela con pares que giran al revés |
| Estela | \(\Delta\mathbf V\) en ala y deriva | Da autoridad a flaperones y deflector en hover |
7.9 Usar los datos del fabricante
- Motor (hoja de datos): \(K_V\), resistencia interna, \(I_0\) (con el voltaje de la prueba), corriente máxima.
- ESC y batería: suma sus resistencias a \(R\). Usa el voltaje bajo carga.
- Hélice: curvas \(C_T(J), C_P(J)\) de UIUC o APC, o BEMT con la geometría.
- Tabla de banco del fabricante (acelerador, empuje, corriente, rpm): compara con
checkMotorAgainstTest.my ajustakT. - Tu propio banco de empuje (capítulo 13): mide empuje, par, rpm y corriente. Es lo más fiable.
motorModel.m (7.1, 7.5, 7.6), propBEMT.m (7.4), loadPropData.m y mergeStaticPropData.m (7.9), slipstreamVel.m (7.7), motorForces.m (7.8), defineHardware.m (datos). Para entenderlos, lee motorModel.m con este capítulo al lado: cada línea es una ecuación de 7.1 o 7.5.Ensamblar y simular \(f(\mathbf x,\mathbf u)\)
Ya tienes todas las piezas. Este es el contenido de tu Eqs_of_motion.m, todavía vacío. Escríbelo tú, mirando el capítulo 5; aquí tienes una versión para comparar después.
Ver una versión en MATLAB (compárala con la tuya)
function xdot = tailsitter6dof(t, x, U, W, Fn, Mo, P)
% x = [xN yE zD u v w q0 q1 q2 q3 p q r]' (13 estados)
V = x(4:6); qt = x(7:10); w = x(11:13);
qt = qt / norm(qt);
C = quat2dcm_be(qt); % ejes Tierra -> ejes cuerpo
% fuerzas y momentos (aero + motores + estela), en el CG, ejes cuerpo
F.u = V(1); F.v = V(2); F.w = V(3);
F.p = w(1); F.q = w(2); F.r = w(3);
F.rho = 1.225; % o atmósfera ISA con h = -x(3)
A = tailsitterAero(W, Fn, Mo, F, U);
Fb = [A.Fx; A.Fy; A.Fz];
Mb = [A.Roll; A.Pitch; A.Yaw]; % ya incluye par de reacción y giroscópico
% Newton, Euler y cinemática (capítulo 5)
Vdot = Fb/P.m + C*[0; 0; P.g] - cross(w, V);
wdot = P.I \ (Mb - cross(w, P.I*w));
Om = [0 -w(1) -w(2) -w(3); w(1) 0 w(3) -w(2); w(2) -w(3) 0 w(1); w(3) w(2) -w(1) 0];
qdot = 0.5*Om*qt + 0.5*(1 - qt'*qt)*qt; % término que corrige la norma
pdot = C' * V;
xdot = [pdot; Vdot; qdot; wdot];
end
function C = quat2dcm_be(q)
q0=q(1); q1=q(2); q2=q(3); q3=q(4);
C = [q0^2+q1^2-q2^2-q3^2, 2*(q1*q2+q0*q3), 2*(q1*q3-q0*q2);
2*(q1*q2-q0*q3), q0^2-q1^2+q2^2-q3^2, 2*(q2*q3+q0*q1);
2*(q1*q3+q0*q2), 2*(q2*q3-q0*q1), q0^2-q1^2-q2^2+q3^2];
end
Simular: [t,X] = ode45(@(t,x) tailsitter6dof(t,x,U,W,Fn,Mo,P), [0 10], x0);
La misma idea en Python
import numpy as np
from scipy.integrate import solve_ivp
def f(t, x, u, P, aero):
V, q, w = x[3:6], x[6:10], x[10:13]
q = q / np.linalg.norm(q)
C = quat2dcm_be(q)
Fb, Mb = aero(V, w, u) # tu modelo de fuerzas
Vdot = Fb/P.m + C @ np.array([0, 0, P.g]) - np.cross(w, V)
wdot = np.linalg.solve(P.I, Mb - np.cross(w, P.I @ w))
p, qq, r = w
Om = np.array([[0,-p,-qq,-r],[p,0,r,-qq],[qq,-r,0,p],[r,qq,-p,0]])
qdot = 0.5*Om @ q + 0.5*(1 - q @ q)*q
return np.concatenate([C.T @ V, Vdot, qdot, wdot])
sol = solve_ivp(f, (0, 10), x0, args=(u, P, aero), max_step=0.005)
Integrar en el tiempo
ode45(paso variable) es cómodo para explorar. Con dinámica de motores rápida el sistema se vuelve rígido; si va lento, pruebaode15s.- Para probar controladores usa paso fijo (Runge-Kutta 4) al mismo ritmo que el controlador real o a un múltiplo. Así el simulador se parece al hardware: el controlador se ejecuta cada \(\Delta t\), con su retraso.
- Regla práctica: \(\Delta t\) al menos 10 veces menor que la constante de tiempo más rápida (la de los motores, \(\tau_m\approx\) 20–200 ms).
Pruebas de cordura (hazlas siempre)
| Prueba | Montaje | Resultado esperado |
|---|---|---|
| Caída libre | Motores apagados, sin aerodinámica | \(\dot w\) en ejes Tierra = \(g\); la actitud no cambia |
| Hover | \(\theta=90^\circ\), \(\sum T=mg\) | Se queda quieto (hasta que el error numérico lo mueva) |
| Momento puro | \(L\) constante, sin aerodinámica | \(p\) crece como \(L t/I_{xx}\) (si \(I_{xz}=0\)) |
| Giro de 90° | Gira el avión con \(\mathbf q\) | La gravedad en ejes cuerpo pasa de \(z\) a \(-x\) |
| Energía | Sin aerodinámica ni motores, con giro inicial | \(\tfrac12\boldsymbol\omega^TI\boldsymbol\omega\) constante |
| Norma | Cualquier simulación larga | \(|\mathbf q|=1\) |
Trim: buscar el equilibrio
Un punto de trim es un estado y unas entradas en los que el avión vuela en régimen permanente: velocidades y giros constantes. Matemáticamente, \(\dot{\mathbf x}=0\) para todos los estados menos la posición (que avanza) y, en un viraje, el rumbo.
Hover
Incógnitas: los 4 aceleradores, los mandos y la actitud. Con el avión simétrico, \(\theta=90^\circ\), los dos motores del ala iguales y los de la deriva iguales. Condiciones: \(\sum T_i=mg\) y momentos nulos. Los motores de arriba y abajo tienen que compensar cualquier momento de cabeceo de la estela sobre los flaps.
Crucero
Dada la velocidad \(V\) y vuelo nivelado: incógnitas \(\alpha\) (y por tanto \(\theta=\alpha\)), flaps \(\delta_f\) y acelerador. Condiciones: \(\dot u=\dot w=\dot q=0\). Tres ecuaciones, tres incógnitas.
Transición
Repite el trim para muchas velocidades entre 0 y la de crucero. La curva \(\theta(V)\) y los mandos de trim forman el "pasillo de transición". El controlador se programa a lo largo de esa curva (capítulo 11).
Cómo plantearlo en MATLAB
% incógnitas z = [alpha; df; thr] (crucero nivelado a velocidad V)
res = @(z) trimResidual(z, V, W, Fn, Mo, P); % devuelve [udot; wdot; qdot]
z0 = [deg2rad(4); 0; 0.5];
z = fsolve(res, z0, optimoptions('fsolve','Display','iter'));
function r = trimResidual(z, V, W, Fn, Mo, P)
alpha = z(1); U.df = z(2); U.da = 0; U.dr = 0; U.thr = z(3)*ones(1,4);
x = stateFromTrim(V, alpha); % u = V cos(alpha), w = V sin(alpha), theta = alpha
xd = tailsitter6dof(0, x, U, W, Fn, Mo, P);
r = xd([4 6 12]); % udot, wdot, qdot
end
fmincon y las ecuaciones de trim como restricciones. El mismo problema reaparece en la asignación de mandos (capítulo 11).Linealizar: las matrices \(A\) y \(B\)
Aquí llegas a la matriz que preguntabas. Cerca del trim, las pequeñas perturbaciones se comportan de forma lineal. Es una serie de Taylor de primer orden:
Cada casilla responde a una pregunta: si muevo un poco el estado \(j\), ¿cuánto cambia la derivada del estado \(i\)? Por ejemplo, \(\partial\dot u/\partial\theta=-g\cos\theta_0\): si levantas el morro, la gravedad empieza a frenar.
Cómo se calcula: diferencias centrales
function [A, B] = linearize(f, x0, u0)
% f(x,u) devuelve xdot. Diferencias centrales columna a columna.
n = numel(x0); m = numel(u0);
A = zeros(n); B = zeros(n, m);
for j = 1:n
h = 1e-6*max(1, abs(x0(j))); dx = zeros(n,1); dx(j) = h;
A(:,j) = (f(x0+dx, u0) - f(x0-dx, u0)) / (2*h);
end
for j = 1:m
h = 1e-6*max(1, abs(u0(j))); du = zeros(m,1); du(j) = h;
B(:,j) = (f(x0, u0+du) - f(x0, u0-du)) / (2*h);
end
end
Otra opción es derivar \(f\) simbólicamente (Symbolic Math Toolbox, jacobian; o SymPy en Python). Solo funciona si la aerodinámica es analítica. Con tablas o strip theory, numérico.
El problema del cuaternión: ¿13×13 o 12×12?
Si linealizas el modelo de 13 estados tal cual, \(A\) sale de 13×13 pero con una dirección "falsa": mover las cuatro componentes de \(\mathbf q\) a la vez cambia su norma, y eso no corresponde a ningún movimiento real. Aparece un autovalor espurio y el sistema no es controlable en esa dirección. Tres soluciones:
- Crucero: linealiza con ángulos de Euler (12 estados). Lejos de \(\theta=90^\circ\) no hay problema. Es lo que hace el curso.
- Error de actitud: escribe la actitud como trim por un giro pequeño, \(\mathbf q=\mathbf q_0\otimes[1,\ \tfrac12\delta\boldsymbol\theta]\), y usa los 3 componentes de \(\delta\boldsymbol\theta\) como estados. Queda 12×12 y vale en hover. Es lo que usan los filtros de Kalman de los autopilotos.
- Marco de hover: define los ángulos de Euler respecto a un marco girado 90°. En hover esos ángulos son pequeños.
Qué haces con \(A\) y \(B\)
eig(A)odamp(ss(A,B,C,D)): los modos. En crucero: corto periodo, fugoide, alabeo puro, balanceo holandés, espiral (clases FD13). En hover salen modos distintos, casi neutros y acoplados con la posición.rank(ctrb(A,B)): ¿puedes controlar todos los estados con tus mandos?lqr,place: diseño de controladores (clases 9–12 del curso).
Control para hardware real
Un controlador que funciona en simulación y vibra en el avión casi siempre falla por algo que el modelo no tenía: retrasos, respuesta lenta de los motores, saturación, ruido de los sensores. Este capítulo trata de lo que hace que el control funcione de verdad.
Arquitectura en cascada
Cada lazo es más rápido que el de fuera (típicamente de 3 a 5 veces). El más interno, el de velocidad angular, está limitado por la rapidez de los actuadores y por los retrasos. Así funcionan PX4 y ArduPilot.
Asignación de mandos (mixer)
Los lazos piden un empuje total y tres momentos. Hay que repartirlos entre tus 7 mandos. Linealizando la propulsión y la aerodinámica de los mandos:
\(B^+\) es la pseudoinversa (o una versión con pesos). La tabla de "eficacia de motores" que imprimía demo_tailsitter.m es justamente una parte de \(B_{\text{asig}}\). Ojo: depende de la velocidad. En hover los flaps solo funcionan por la estela; en crucero dominan sobre el empuje diferencial.
Métodos
- PID en cascada: simple, se ajusta en vuelo, es lo que usan los autopilotos abiertos.
- LQR sobre el modelo lineal:
K = lqr(A,B,Q,R). Da un buen punto de partida para las ganancias. Clase 12 del curso. - Programación de ganancias (gain scheduling): un controlador por cada punto del pasillo de transición, interpolando con la velocidad.
- INDI (inversión dinámica no lineal incremental): usa la aceleración angular medida y la eficacia de los mandos para calcular el incremento de mando. Depende poco del modelo aerodinámico y se ha usado mucho en investigación con tail-sitters. Es un buen tema para leer cuando domines lo básico.
Lista para que funcione en hardware
- Saturaciones de mandos y anti-windup en los integradores.
- Controlador discreto al ritmo real (250–1000 Hz en el lazo interno), con el retraso medido.
- Márgenes de estabilidad con modelo de actuador y retraso: como referencia típica, al menos 6 dB de ganancia y 45° de fase.
- Montecarlo: repite las simulaciones con derivadas, inercias, \(\tau_m\) y retrasos variando ±20–30 %. El controlador tiene que funcionar en todas.
- Filtros: pasa-bajo en la derivada y notch para la vibración de las hélices (capítulo 12).
Sensores, filtros y estimación
El controlador no ve el estado \(\mathbf x\): ve lo que miden los sensores, con ruido, sesgo y retraso. Un modelo para diseñar control que funcione en hardware tiene que incluir los sensores y el estimador.
| Sensor | Qué mide | Problemas típicos |
|---|---|---|
| Giróscopo (IMU) | \(p, q, r\) | Sesgo que deriva, ruido, vibración de las hélices |
| Acelerómetro (IMU) | Fuerza específica \((\mathbf F_{\text{aero}}+\mathbf F_{\text{prop}})/m\), no la aceleración | Solo da la dirección de la gravedad si el avión no acelera |
| Magnetómetro | Campo magnético: rumbo | Interferencia de las corrientes de los motores |
| Barómetro | Altitud | Presión de la estela y del viento sobre el sensor |
| GPS | Posición y velocidad | Retraso de 100–200 ms, 5–10 Hz |
| Pitot (velocidad aérea) | \(V\) | No sirve en hover; si está en la estela, mide la estela |
Tu tail-sitter está en hover quieto. ¿Qué mide el acelerómetro en ejes cuerpo? ¿Y en caída libre?
Ver solución
En hover: la fuerza específica es el empuje entre la masa, \((T/m,0,0)=(g,0,0)\). El acelerómetro "siente" \(+g\) por el eje \(x\), aunque el avión no acelere. En caída libre mide cero. Por eso un acelerómetro es un sensor de "hacia dónde empujan las fuerzas que no son la gravedad".
Modelo de sensor
Medida = valor real + sesgo que deriva lentamente + ruido blanco. Añade la frecuencia de muestreo, la cuantización y el retraso. Los valores salen de la hoja de datos del sensor (densidad de ruido, inestabilidad del sesgo) o de una grabación con el avión quieto.
Vibración y filtros
Las hélices excitan la estructura a la frecuencia de paso de pala, \(f=B\cdot\text{rpm}/60\). Con 2 palas a 7000 rpm son 233 Hz. Si el giróscopo muestrea mal, esa vibración aparece como ruido de baja frecuencia (aliasing) y entra al lazo de control. Soluciones: aislar la IMU, filtro anti-aliasing, y un filtro notch que sigue las rpm (los autopilotos lo llaman harmonic notch).
Filtro complementario: la idea de toda la estimación
El giróscopo es bueno a corto plazo (integrado da el ángulo, pero deriva). El acelerómetro es bueno a largo plazo (ve la gravedad, pero es ruidoso y se confunde con las aceleraciones). Se combinan:
El filtro de Kalman extendido (EKF) es la versión sistemática: usa tu modelo para predecir (con el giróscopo y el acelerómetro como entradas) y corrige con GPS, barómetro y magnetómetro, pesando cada fuente con su ruido. PX4 (EKF2) y ArduPilot (EKF3) lo hacen con cuaterniones y error de actitud de 3 componentes, igual que en el capítulo 10. En el curso, la clase 11 (observadores) es la base.
Subir la precisión del modelo
No hace falta un modelo perfecto. Hace falta que sea bueno en lo que afecta al control: alrededor de la frecuencia de corte de los lazos y en los regímenes en los que vas a volar. Ordena las mejoras por lo que cambian en el control, no por lo sofisticadas que parecen.
| Componente | Error típico | Efecto en el control | Cómo mejorarlo |
|---|---|---|---|
| Posición del CG | 1–2 % de cuerda | Muy grande (margen estático) | Pesar con dos básculas o colgar el avión |
| Inercias (CAD) | 5–10 % | Moderado | Péndulo bifilar: 2–5 % |
| Motores y ESC (dinámica) | Normalmente no se modela | Grande en hover | Escalón de acelerador en banco |
| Hélice por BEMT | Empuje 10–20 % | Grande en hover | Banco de empuje: 2–3 % |
| Servos, retrasos, sensores | Se suelen ignorar | Muy grande | Ensayos en banco, chirp, medida de latencia |
| Aerodinámica strip theory | Derivadas 15–25 % | Moderado | VSPAERO, luego CFD o túnel |
| Tablas VLM | ~10 % con flujo adherido | Moderado | Resistencia viscosa; CFD para \(\alpha\) alto |
| CFD | 5–10 % adherido, peor separado | Donde VLM falla | Túnel y datos de vuelo |
Los porcentajes son órdenes de magnitud típicos, no garantías.
Medidas baratas que valen mucho
Inercia con péndulo bifilar
Cuelgas el avión de dos hilos paralelos de longitud \(L\) separados \(D\), lo giras un poco alrededor del eje vertical y mides el periodo \(T\) de la oscilación. Repites con el avión colgado en las tres orientaciones.
Banco de empuje
Mide a la vez empuje, par, rpm, corriente y voltaje, barriendo el acelerador. Con eso calibras \(C_T\), \(C_Q\), \(R\), \(I_0\) y \(K_V\) de verdad. Si puedes, repite con viento (túnel o banco en un coche) para tener \(C_T(J)\). Haz también escalones de acelerador para medir \(\tau_m\).
Servos y retrasos
Manda un escalón y un barrido de frecuencia (chirp) a cada servo y mide su posición: sale el ancho de banda y el límite de velocidad. Mide el retraso total del lazo: tiempo entre que el autopiloto lee la IMU y el motor cambia de rpm.
Identificación de sistemas con datos de vuelo
Es la fuente más fiable, pero es un ciclo que se repite, no un último paso:
- Vuela primero con un controlador prudente, diseñado con el modelo físico.
- Excita los ejes que te interesan: dobletes, 3-2-1-1 o barridos de frecuencia, en cada mando por separado.
- Registra a alta frecuencia: IMU, rpm, corriente, posición de los servos, mandos.
- Estima parámetros físicos (derivadas, \(\tau_m\), retraso) partiendo de tu modelo, no una caja negra. Métodos: error de ecuación (mínimos cuadrados sobre \(\dot p=L_pp+L_{\delta_a}\delta_a+\dots\)), error de salida, o en frecuencia.
- Valida con otro vuelo distinto del que usaste para identificar.
- Actualiza el modelo, rediseña, vuelve a comprobar márgenes.
Herramientas: System Identification Toolbox de MATLAB (tfest, ssest, greyest para modelos con parámetros físicos), CIFER (en frecuencia, estándar en helicópteros), o en Python scipy.optimize.least_squares.
Orden recomendado
- Medir masa, CG, inercias, actuadores y empuje (días de trabajo, gran ganancia).
- Modelo con strip theory y primeros controladores en simulación.
- Tablas de VSPAERO y datos de propulsión.
- CFD o túnel solo donde haga falta (\(\alpha\) alto, interacción hélice-ala).
- Identificación en vuelo, actualizar el modelo, repetir.
Herramientas: MATLAB, Simulink, Python y simuladores
MATLAB y sus toolboxes
| Toolbox | Para qué te sirve aquí |
|---|---|
| MATLAB base | ode45, matrices, gráficas, hgtransform para animar tu geometría en 3D |
| Control System Toolbox | ss, eig, damp, lqr, bode, margin, c2d |
| Optimization Toolbox | fsolve y fmincon para trim |
| Symbolic Math Toolbox | Comprobar derivaciones, jacobian simbólico |
| Aerospace Toolbox | Conversiones DCM, cuaternión y Euler; atmósfera ISA; Aero.Animation; enlace con FlightGear |
| Simulink + Aerospace Blockset | Bloques de 6 grados de libertad (también con cuaternión), atmósfera, viento, actuadores |
| Simulink Control Design | Trim y linealización automática de modelos Simulink |
| System Identification Toolbox | Identificación con datos de vuelo o de banco |
| UAV Toolbox | Interfaz con PX4, escenarios de simulación, visualización |
| Simulink 3D Animation, Simscape Multibody | Visualización 3D y modelos multicuerpo |
| Embedded Coder | Generar C desde Simulink para llevar el controlador al hardware |
Comprueba lo que tienes con ver. Todo lo de este cuaderno se puede hacer solo con MATLAB base, Control System y Optimization.
Simulink: cómo organizar el modelo
Los mismos bloques del capítulo 1, cada uno en un subsistema: Aerodinámica, Propulsión, Cuerpo rígido (6DOF), Sensores, Estimador, Controlador, Actuadores. Tus funciones .m entran tal cual en bloques MATLAB Function. Ventajas de Simulink: ver las señales, controladores discretos a distinto ritmo, y generar código para el hardware. Inconveniente: esconde las ecuaciones. Recomendación: primero escríbelo en código (para entenderlo), después pásalo a Simulink si te hace falta.
Python
| Paquete | Equivale a |
|---|---|
NumPy, SciPy (solve_ivp, optimize) | MATLAB base, ode45, fsolve |
python-control | Control System Toolbox (ss, lqr, bode) |
| SymPy | Symbolic Math |
| CasADi | Optimización con derivadas automáticas: trim, jacobianos exactos, control óptimo |
| JSBSim (bindings de Python) | Motor de dinámica de vuelo completo, aviones definidos en XML con tablas |
| Matplotlib, PyVista | Gráficas y visualización 3D |
Simuladores y autopilotos
- Gazebo (probablemente lo que oíste como "Gasivo"): simulador de robótica con física y 3D. Se usa con PX4 y ArduPilot en modo SITL (el código real del autopiloto corriendo contra el simulador).
- PX4: autopiloto abierto con soporte para VTOL tail-sitter. Su arquitectura (cascada, mixer, EKF2) es la del capítulo 11.
- ArduPilot: otro autopiloto abierto; los tail-sitters van dentro de su modo QuadPlane.
- JSBSim: el motor de dinámica de vuelo que usan FlightGear y otros. Puedes meter ahí tus tablas.
- FlightGear: visualización 3D gratuita; MATLAB y Simulink le pueden mandar el estado del avión.
- X-Plane: simulador comercial, también se conecta a autopilotos.
Ruta típica hacia el hardware: SIL (controlador como software contra tu modelo) → HIL (el autopiloto real, con su procesador, contra el modelo en el PC) → vuelo atado → vuelo libre.
Herramientas aerodinámicas
- OpenVSP / VSPAERO: geometría y VLM/paneles. Tienes el modelo hecho.
- XFLR5: más sencillo; da derivadas de estabilidad de un avión completo.
- AVL: VLM clásico de Mark Drela, rápido para derivadas.
- XFOIL: perfiles 2D con viscosidad: \(c_{l\alpha}\), \(c_{d0}\), \(c_{l,\max}\).
- CFD: STAR-CCM+ (comercial, lo tienes en la universidad), OpenFOAM y SU2 (abiertos).
Visualización 3D, de menos a más
patch+hgtransformen MATLAB con tu geometría: simple y tuyo.Aero.Animationdel Aerospace Toolbox.- FlightGear conectado a MATLAB o Simulink: escenario realista.
- Gazebo con PX4 SITL: cuando el autopiloto real entre en juego.
Enlaces y vídeos
- OpenVSP · Base de datos de hélices UIUC
- Documentación de PX4 · ArduPilot · Gazebo
- JSBSim · FlightGear
- python-control · CasADi
- Caughey, Dynamical Equations for Flight Vehicles (referencia de tus clases FD02)
- Vídeos: busca en YouTube "MATLAB Tech Talks Brian Douglas" (series sobre filtros de Kalman, control en la práctica y simulación de drones) y "PX4 tailsitter".
Tu plan de trabajo
Cómo usar la IA sin dejar de aprender
- Deriva tú primero. Pide a la IA que revise tu derivación, no que la haga.
- Un archivo cada vez. No aceptes cinco archivos nuevos de golpe. Pide uno y que te explique cada línea con la ecuación que implementa.
- Predice antes de ejecutar. Antes de correr una simulación, escribe qué esperas. Si no coincide, ahí hay algo que aprender (o un error).
- Cambia un parámetro y explícalo. Sube la inercia, mueve el CG, quita la estela. Si sabes explicar el cambio, entiendes el modelo.
- Escribe tú las pruebas de cordura (capítulo 8). Son la mejor forma de saber si el código hace lo que crees.
- Lleva un diario de decisiones: qué supones, por qué, de dónde sale cada número.
Fases y tareas
Símbolos y referencias
| Símbolo | Significado | Unidades |
|---|---|---|
| \(u, v, w\) | Velocidades en ejes cuerpo (totales; en Cook son \(U, V, W\)) | m/s |
| \(p, q, r\) | Velocidades angulares en ejes cuerpo | rad/s |
| \(\phi, \theta, \psi\) | Alabeo, cabeceo, guiñada (Euler 3-2-1) | rad |
| \(\mathbf q=(q_0,q_1,q_2,q_3)\) | Cuaternión de actitud, escalar primero | - |
| \(X, Y, Z\) | Fuerzas en ejes cuerpo | N |
| \(L, M, N\) | Momentos de alabeo, cabeceo, guiñada | N·m |
| \(C_{B/E}\) | DCM de ejes Tierra a ejes cuerpo | - |
| \(\alpha, \beta\) | Ángulo de ataque, de resbalamiento | rad |
| \(\bar q\) | Presión dinámica \(\tfrac12\rho V^2\) | Pa |
| \(\delta_f, \delta_a, \delta_r\) | Flaps juntos, alerón (diferencial), deflector de la deriva | rad |
| \(t_i\) | Acelerador del motor \(i\) | 0–1 |
| \(\Omega, n\) | Velocidad de giro de la hélice | rad/s, rev/s |
| \(J\) | Relación de avance \(V/nD\) | - |
| \(C_T, C_Q, C_P\) | Coeficientes de empuje, par, potencia | - |
| \(K_V\); \(K_t=K_e\) | Constante de velocidad; de par y de fuerza contraelectromotriz | rpm/V; N·m/A |
| \(v_i\) | Velocidad inducida en el disco | m/s |
| \(\tau, \tau_m\) | Eficacia del flap; constante de tiempo del motor | -; s |
| \(A, B\) | Jacobianos del modelo linealizado | - |
Tus clases, por tema
- Ejes y notación: FD01. Ecuaciones del movimiento: FD02–FD05. Strip theory: FD06 (dos partes).
- Modos del avión: FD13. Cualidades de vuelo: FD14. Ensayos en vuelo y aumento de estabilidad: FD15–FD18.
- Control: modelado (1), estabilidad (3), lugar de las raíces (5), Bode (6), PID (7), espacio de estados (9), diseño de controladores (10), observadores (11), control óptimo (12).
Libros
- M. V. Cook, Flight Dynamics Principles (el libro del curso).
- B. L. Stevens, F. L. Lewis, E. N. Johnson, Aircraft Control and Simulation: el modelo completo con cuaterniones y los coeficientes \(\Gamma\).
- R. W. Beard, T. W. McLain, Small Unmanned Aircraft: Theory and Practice: el más cercano a tu proyecto, de la física al autopiloto.
- B. Etkin, Dynamics of Atmospheric Flight.
- J. G. Leishman, Principles of Helicopter Aerodynamics: cantidad de movimiento y BEMT a fondo.
- M. Drela, Flight Vehicle Aerodynamics.
- V. Klein, E. A. Morelli, Aircraft System Identification; M. B. Tischler, R. K. Remple, Aircraft and Rotorcraft System Identification.