0/16
Cuaderno de modelado · VTOL tail-sitter

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.

Resumen claveLo esencial del capítulo. Si solo recuerdas esto, vas bien.
Intenta túUn paso de la derivación o un ejercicio. Coge papel, hazlo, y solo después abre la solución.
Ver solución

Aquí está la respuesta, paso a paso.

CuidadoErrores típicos, signos que se cambian, cosas que fallan en hardware.
En tu códigoQué archivo de tu carpeta 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

  1. 1El mapa: qué estamos construyendo
  2. 2Marcos de referencia y rotaciones
  3. 3Newton: ecuaciones de traslación
  4. 4Euler: ecuaciones de rotación
  5. 5Cinemática y el modelo de 13 estados
  6. 6Fuerzas aerodinámicas
  7. 7Propulsión: motor, hélice, estela
  8. 8Ensamblar y simular f(x,u)
  9. 9Trim: buscar el equilibrio
  10. 10Linealizar: las matrices A y B
  11. 11Control para hardware real
  12. 12Sensores, filtros y estimación
  13. 13Subir la precisión del modelo
  14. 14Herramientas y simuladores
  15. 15Tu plan de trabajo
  16. 16Símbolos y referencias
Capítulo 1

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:

\[ \dot{\mathbf x} = f(\mathbf x, \mathbf u) \]

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

GrupoEstadosQué esEcuació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 cuerpoNewton (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 cuerpoEuler (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).

CuidadoSi más adelante metes la dinámica de los motores (las rpm de cada uno como estado), el estado pasa a 13 + 4 = 17. Si metes la dinámica de los servos, más todavía. No pasa nada: la estructura \(\dot{\mathbf x}=f(\mathbf x,\mathbf u)\) es la misma, solo crece el vector.

Las entradas de tu avión

\[ \mathbf u = \begin{bmatrix} \delta_f & \delta_a & \delta_r & t_1 & t_2 & t_3 & t_4 \end{bmatrix}^T \]

\(\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

Bloques del modelo: estado y entradas alimentan aerodinámica y propulsión; con la gravedad se suman fuerzas y momentos; Newton y Euler dan aceleraciones; la cinemática integra de vuelta al estado. Entradas u Estado x Aerodinámica Propulsión + estela Gravedad Suma F y M en el CG Newton y Euler Cinemática integrar en el tiempo estela

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 sitterQué calculaCapítulo
flowState.mPasa \(V,\alpha,\beta\) o \(u,v,w\) a un estado de flujo común2, 6
wingStripTheory.mAla con flaperones: sustentación, resistencia, momentos6
finStripTheory.mDeriva con deflector6
propBEMT.m, loadPropData.mCoeficientes \(C_T(J)\), \(C_Q(J)\) de la hélice7
motorModel.mMotor sin escobillas + hélice: rpm, empuje, par, corriente7
motorForces.mLos 4 motores: empuje, par de reacción, giroscópico7
slipstreamVel.mVelocidad extra y torbellino de la estela7
tailsitterAero.mSuma todo: \(F\) y \(M\) en el CG8
defineHardware.mDatos reales del motor, hélice y batería7, 13
Eqs_of_motion.m (vacío)Aquí irá \(f(\mathbf x,\mathbf u)\): Newton, Euler, cinemática3, 4, 5, 8
Resumen claveEl modelo es \(\dot{\mathbf x}=f(\mathbf x,\mathbf u)\) con 13 estados. Aerodinámica y propulsión dan fuerzas y momentos. Newton y Euler las convierten en aceleraciones. La cinemática da cómo cambian posición y actitud. Todo lo demás (trim, linealizar, controlar) se construye encima de esa función.
Capítulo 2

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

MarcoOrigen y ejesPara qué sirve
Tierra (NED), \(\mathcal F_E\)Fijo en el suelo. \(x\) al norte, \(y\) al este, \(z\) hacia abajoAhí 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 panzaInercias constantes. Aerodinámica, motores y sensores están fijos aquí.
Viento, \(\mathcal F_W\)\(x\) alineado con la velocidad respecto al aireDonde 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:

\[ V=\sqrt{u^2+v^2+w^2},\qquad \alpha=\operatorname{atan2}(w,u),\qquad \beta=\arcsin\!\left(\frac{v}{V}\right) \]
CuidadoEn hover \(V\approx 0\) y \(\alpha\), \(\beta\) no están definidos. Por eso el modelo trabaja con \(u, v, w\) y no con \(V, \alpha, \beta\). Tu 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:

\[ \mathbf v_B = C_{B/E}\,\mathbf v_E \]

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.

Intenta tú · paso 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
\[ R_z(\psi)=\begin{bmatrix}\cos\psi & \sin\psi & 0\\ -\sin\psi & \cos\psi & 0\\ 0&0&1\end{bmatrix} \]

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:

\[ R_y(\theta)=\begin{bmatrix}\cos\theta&0&-\sin\theta\\0&1&0\\ \sin\theta&0&\cos\theta\end{bmatrix},\qquad R_x(\phi)=\begin{bmatrix}1&0&0\\0&\cos\phi&\sin\phi\\0&-\sin\phi&\cos\phi\end{bmatrix} \]
Intenta tú · paso 2

¿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
\[ C_{B/E}=R_x(\phi)\,R_y(\theta)\,R_z(\psi) \]

El vector en ejes Tierra se multiplica primero por \(R_z\) (está más a la derecha). Multiplicando (abreviando \(c=\cos\), \(s=\sin\)):

\[ C_{B/E}=\begin{bmatrix} c\theta c\psi & c\theta s\psi & -s\theta\\ s\phi s\theta c\psi-c\phi s\psi & s\phi s\theta s\psi+c\phi c\psi & s\phi c\theta\\ c\phi s\theta c\psi+s\phi s\psi & c\phi s\theta s\psi-s\phi c\psi & c\phi c\theta \end{bmatrix} \]
Intenta tú · paso 3

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\):

\[ \mathbf g_B=C_{B/E}\begin{bmatrix}0\\0\\g\end{bmatrix}=g\begin{bmatrix}-\sin\theta\\ \sin\phi\cos\theta\\ \cos\phi\cos\theta\end{bmatrix} \]

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:

\[ \mathbf q=\begin{bmatrix}q_0\\q_1\\q_2\\q_3\end{bmatrix}=\begin{bmatrix}\cos(\eta/2)\\ e_x\sin(\eta/2)\\ e_y\sin(\eta/2)\\ e_z\sin(\eta/2)\end{bmatrix},\qquad q_0^2+q_1^2+q_2^2+q_3^2=1 \]

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:

\[ C_{B/E}=\begin{bmatrix} q_0^2+q_1^2-q_2^2-q_3^2 & 2(q_1q_2+q_0q_3) & 2(q_1q_3-q_0q_2)\\ 2(q_1q_2-q_0q_3) & q_0^2-q_1^2+q_2^2-q_3^2 & 2(q_2q_3+q_0q_1)\\ 2(q_1q_3+q_0q_2) & 2(q_2q_3-q_0q_1) & q_0^2-q_1^2-q_2^2+q_3^2 \end{bmatrix} \]

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.:

\[ \begin{aligned} q_0&=c_\phi c_\theta c_\psi+s_\phi s_\theta s_\psi & q_1&=s_\phi c_\theta c_\psi-c_\phi s_\theta s_\psi\\ q_2&=c_\phi s_\theta c_\psi+s_\phi c_\theta s_\psi & q_3&=c_\phi c_\theta s_\psi-s_\phi s_\theta c_\psi \end{aligned} \]
Orientación en 3D: ángulos de Euler, DCM y cuaternión
Mueve \(\psi\), \(\theta\), \(\phi\). Pon \(\theta=90^\circ\) y mueve \(\psi\) y \(\phi\): verás que hacen lo mismo. Arrastra el dibujo para cambiar el punto de vista.
En tu códigoLas funciones del Aerospace Toolbox 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)\).
Resumen claveEjes cuerpo para dinámica, ejes Tierra para posición y gravedad. La DCM pasa de uno a otro y su inversa es la traspuesta. Los ángulos de Euler tienen una singularidad en \(\theta=\pm90^\circ\), justo el hover de un tail-sitter; el cuaternión no tiene ninguna.
Capítulo 3

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

\[ m\left.\frac{d\mathbf V}{dt}\right|_E=\mathbf F_{\text{aero}}+\mathbf F_{\text{prop}}+m\mathbf g \]

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)\).

Intenta tú

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
\[ \frac{d\hat{\mathbf i}}{dt}=\boldsymbol\omega\times\hat{\mathbf i},\qquad \frac{d\hat{\mathbf j}}{dt}=\boldsymbol\omega\times\hat{\mathbf j},\qquad \frac{d\hat{\mathbf k}}{dt}=\boldsymbol\omega\times\hat{\mathbf k} \]

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

Intenta tú

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
\[ \left.\frac{d\mathbf V}{dt}\right|_E=\underbrace{\dot u\hat{\mathbf i}+\dot v\hat{\mathbf j}+\dot w\hat{\mathbf k}}_{\text{lo que ve el piloto}}+\underbrace{u\,\boldsymbol\omega\times\hat{\mathbf i}+v\,\boldsymbol\omega\times\hat{\mathbf j}+w\,\boldsymbol\omega\times\hat{\mathbf k}}_{=\ \boldsymbol\omega\times\mathbf V} \]

Esto es el teorema de transporte:

\[ \left.\frac{d\mathbf V}{dt}\right|_E=\left.\frac{d\mathbf V}{dt}\right|_B+\boldsymbol\omega\times\mathbf V \]

Lo usarás otra vez para el momento angular (capítulo 4) y para la estela. Es la herramienta más importante del curso.

Por qué aparece \(\boldsymbol\omega\times\mathbf V\): un viraje visto desde arriba
El avión vuela a \(u\) constante y gira con \(r\) constante. En ejes cuerpo la velocidad no cambia nunca (\(\dot u=\dot v=0\)), pero en ejes Tierra el vector velocidad gira: hay una aceleración hacia el centro que vale \(r\,u\). Esa es la componente \(y\) de \(\boldsymbol\omega\times\mathbf V\).
Radio de giro \(u/r\)-
Aceleración centrípeta \(ru\)-
En g-
Alabeo coordinado-

Paso 3: desarrollar el producto vectorial

Intenta tú

Calcula \(\boldsymbol\omega\times\mathbf V\) con \(\boldsymbol\omega=(p,q,r)\) y \(\mathbf V=(u,v,w)\) usando el determinante.

Ver solución
\[ \boldsymbol\omega\times\mathbf V=\begin{vmatrix}\hat{\mathbf i}&\hat{\mathbf j}&\hat{\mathbf k}\\p&q&r\\u&v&w\end{vmatrix}=\begin{bmatrix}qw-rv\\ ru-pw\\ pv-qu\end{bmatrix} \]

Paso 4: las tres ecuaciones

Intenta tú

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
\[ \begin{aligned} \dot u&=rv-qw+\frac{X}{m}-g\sin\theta\\ \dot v&=pw-ru+\frac{Y}{m}+g\sin\phi\cos\theta\\ \dot w&=qu-pv+\frac{Z}{m}+g\cos\phi\cos\theta \end{aligned} \]

\(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

\[ \dot u=\underbrace{rv-qw}_{\text{giro de los ejes}}+\underbrace{\frac{X_{\text{aero}}+\sum T_i}{m}}_{\text{fuerzas}}\;\underbrace{-\,g\sin\theta}_{\text{gravedad}} \]
Intenta tú · comprobaciones

(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.

CuidadoEn clase (Cook) la derivación se hace con un elemento de masa: velocidad de cada partícula \(\mathbf V+\boldsymbol\omega\times\mathbf r\), y se integra sobre el avión. Como el origen está en el CG, \(\int\mathbf r\,dm=0\) y sale exactamente lo mismo. Si pones el origen fuera del CG aparecen términos extra.
Resumen clave\(\dot{\mathbf V}_B=\mathbf F/m+\mathbf g_B-\boldsymbol\omega\times\mathbf V\). Los términos \(qw-rv\), \(ru-pw\), \(pv-qu\) salen del teorema de transporte, no son fuerzas.
Capítulo 4

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:

\[ \mathbf H=\int\mathbf r\times(\boldsymbol\omega\times\mathbf r)\,dm=I\,\boldsymbol\omega,\qquad I=\begin{bmatrix}I_{xx}&-I_{xy}&-I_{xz}\\-I_{xy}&I_{yy}&-I_{yz}\\-I_{xz}&-I_{yz}&I_{zz}\end{bmatrix} \]
\[ I_{xx}=\int(y^2+z^2)\,dm,\quad I_{yy}=\int(x^2+z^2)\,dm,\quad I_{zz}=\int(x^2+y^2)\,dm,\quad I_{xz}=\int xz\,dm \]

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}\).

Dato de tu aviónTu tail-sitter tiene la deriva y los motores de punta repartidos arriba y abajo por igual. Eso lo hace casi simétrico también respecto al plano \(x\)-\(y\), así que \(I_{xz}\) será pequeño. Compruébalo con el widget de abajo.

Paso 1: teorema de transporte para \(\mathbf H\)

Intenta tú

Escribe \(\mathbf M=d\mathbf H/dt|_E\) en ejes cuerpo, igual que hiciste con la velocidad.

Ver solución
\[ \mathbf M=\left.\frac{d\mathbf H}{dt}\right|_B+\boldsymbol\omega\times\mathbf H=I\dot{\boldsymbol\omega}+\boldsymbol\omega\times(I\boldsymbol\omega) \]

Como \(I\) es constante en ejes cuerpo, \(d\mathbf H/dt|_B=I\dot{\boldsymbol\omega}\).

Paso 2: desarrollar las componentes

Intenta tú

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
\[ \mathbf H=\begin{bmatrix}I_{xx}p-I_{xz}r\\ I_{yy}q\\ I_{zz}r-I_{xz}p\end{bmatrix},\qquad \boldsymbol\omega\times\mathbf H=\begin{bmatrix}(I_{zz}-I_{yy})qr-I_{xz}pq\\ (I_{xx}-I_{zz})pr+I_{xz}(p^2-r^2)\\ (I_{yy}-I_{xx})pq+I_{xz}qr\end{bmatrix} \]
\[ \begin{aligned} L&=I_{xx}\dot p-I_{xz}\dot r+(I_{zz}-I_{yy})qr-I_{xz}pq\\ M&=I_{yy}\dot q+(I_{xx}-I_{zz})pr+I_{xz}(p^2-r^2)\\ N&=I_{zz}\dot r-I_{xz}\dot p+(I_{yy}-I_{xx})pq+I_{xz}qr \end{aligned} \]
CorrecciónEn el chat te escribí la ecuación de \(N\) con \((I_{xx}-I_{yy})pq\). El signo correcto es \((I_{yy}-I_{xx})pq\), como arriba. Compruébalo poniendo \(I_{xz}=0\): queda \(I_{zz}\dot r=N+(I_{xx}-I_{yy})pq\), que es la forma de los libros.

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):

\[ \Gamma=I_{xx}I_{zz}-I_{xz}^2 \]
\[ \begin{aligned} \dot p&=\Gamma_1pq-\Gamma_2qr+\Gamma_3L+\Gamma_4N\\ \dot q&=\Gamma_5pr-\Gamma_6(p^2-r^2)+\frac{M}{I_{yy}}\\ \dot r&=\Gamma_7pq-\Gamma_1qr+\Gamma_4L+\Gamma_8N \end{aligned} \]
\[ \Gamma_1=\frac{I_{xz}(I_{xx}-I_{yy}+I_{zz})}{\Gamma},\ \Gamma_2=\frac{I_{zz}(I_{zz}-I_{yy})+I_{xz}^2}{\Gamma},\ \Gamma_3=\frac{I_{zz}}{\Gamma},\ \Gamma_4=\frac{I_{xz}}{\Gamma} \]
\[ \Gamma_5=\frac{I_{zz}-I_{xx}}{I_{yy}},\ \Gamma_6=\frac{I_{xz}}{I_{yy}},\ \Gamma_7=\frac{(I_{xx}-I_{yy})I_{xx}+I_{xz}^2}{\Gamma},\ \Gamma_8=\frac{I_{xx}}{\Gamma} \]

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:

\[ I\dot{\boldsymbol\omega}+\boldsymbol\omega\times(I\boldsymbol\omega)=\mathbf M_{\text{aero}}+\mathbf M_{\text{prop}}\;\underbrace{-\,\boldsymbol\omega\times\textstyle\sum\mathbf h_i}_{\text{giroscópico}}\;\underbrace{-\,\textstyle\sum\dot{\mathbf h}_i}_{\text{reacción al acelerar}} \]

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.

Construye el tensor de inercia con masas puntuales
Ejemplo de un tail-sitter de 3 m de envergadura (valores inventados). Mueve la batería y las masas y mira cómo cambian el CG y las inercias. Origen: borde de ataque en la raíz, \(x\) hacia delante.
Masa total-
CG \(x\)-
\(I_{xx}\)-
\(I_{yy}\)-
\(I_{zz}\)-
\(I_{xz}\)-

Resumen clave\(I\dot{\boldsymbol\omega}=\mathbf M-\boldsymbol\omega\times(I\boldsymbol\omega)\). El término \(\boldsymbol\omega\times I\boldsymbol\omega\) acopla los ejes (por ejemplo, alabear y guiñar a la vez produce momento de cabeceo). Los rotores añaden su propio término giroscópico.
Capítulo 5

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.

Intenta tú

\(\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
\[ \begin{bmatrix}p\\q\\r\end{bmatrix}=\begin{bmatrix}\dot\phi\\0\\0\end{bmatrix}+R_x(\phi)\begin{bmatrix}0\\ \dot\theta\\0\end{bmatrix}+R_x(\phi)R_y(\theta)\begin{bmatrix}0\\0\\ \dot\psi\end{bmatrix}=\begin{bmatrix}1&0&-\sin\theta\\0&\cos\phi&\sin\phi\cos\theta\\0&-\sin\phi&\cos\phi\cos\theta\end{bmatrix}\begin{bmatrix}\dot\phi\\ \dot\theta\\ \dot\psi\end{bmatrix} \]

Invirtiendo esa matriz:

\[ \begin{bmatrix}\dot\phi\\ \dot\theta\\ \dot\psi\end{bmatrix}=\begin{bmatrix}1&\sin\phi\tan\theta&\cos\phi\tan\theta\\0&\cos\phi&-\sin\phi\\0&\sin\phi/\cos\theta&\cos\phi/\cos\theta\end{bmatrix}\begin{bmatrix}p\\q\\r\end{bmatrix} \]

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:

\[ \dot{\mathbf q}=\frac12\,\Omega(\boldsymbol\omega)\,\mathbf q,\qquad \Omega(\boldsymbol\omega)=\begin{bmatrix}0&-p&-q&-r\\p&0&r&-q\\q&-r&0&p\\r&q&-p&0\end{bmatrix} \]
Intenta tú

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
\[ \frac{d}{dt}(\mathbf q^T\mathbf q)=2\mathbf q^T\dot{\mathbf q}=\mathbf q^T\Omega\,\mathbf q=0 \]

\(\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:

\[ \begin{bmatrix}\dot x_N\\ \dot y_E\\ \dot z_D\end{bmatrix}=C_{B/E}^T\begin{bmatrix}u\\v\\w\end{bmatrix},\qquad h=-z_D \]

El modelo completo

Las 13 ecuaciones
\[ \begin{aligned} \dot{\mathbf r}_E&=C_{B/E}(\mathbf q)^T\,\mathbf V_B && \text{(3) posición}\\ \dot{\mathbf V}_B&=\frac{\mathbf F_{\text{aero}}+\mathbf F_{\text{prop}}}{m}+C_{B/E}(\mathbf q)\begin{bmatrix}0\\0\\g\end{bmatrix}-\boldsymbol\omega\times\mathbf V_B && \text{(3) Newton}\\ \dot{\mathbf q}&=\tfrac12\,\Omega(\boldsymbol\omega)\,\mathbf q && \text{(4) actitud}\\ \dot{\boldsymbol\omega}&=I^{-1}\big[\mathbf M_{\text{aero}}+\mathbf M_{\text{prop}}-\boldsymbol\omega\times(I\boldsymbol\omega+\textstyle\sum\mathbf h_i)\big] && \text{(3) Euler} \end{aligned} \]

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.

CuidadoLos ángulos de Euler los puedes calcular a partir de \(\mathbf q\) para mostrarlos o para el controlador de crucero, pero no los integres: en hover se rompen. Otra opción que usan los autopilotos de tail-sitters es definir un marco de referencia "de hover" girado 90°, de modo que en hover los ángulos relativos a ese marco sean pequeños.
Capítulo 6

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:

\[ (X, Y, Z, L, M, N)_{\text{aero}} = \mathcal A(u,v,w,p,q,r,\ \delta_f,\delta_a,\delta_r,\ \text{estela},\ \rho) \]

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

  1. 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}}\).
  2. Á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.
  3. 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)\).
  4. 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\).
  5. 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:

\[ a=\frac{2\pi A\!R}{2+\sqrt{4+A\!R^2\,(1+\tan^2\Lambda_{c/2})}},\qquad \tau=1-\frac{\theta_f-\sin\theta_f}{\pi},\qquad \theta_f=\arccos\!\left(2\frac{c_f}{c}-1\right) \]
\[ \Delta c_{m,c/4}=-\tfrac12\sin\theta_f\,(1-\cos\theta_f)\,\delta \]

El flap hacia abajo da más sustentación, pero un momento de picado: la carga extra cae detrás del cuarto de cuerda.

El ala tira a tira (ala de ejemplo de 10 m a 60 m/s)
La curva es la sustentación por unidad de envergadura; el área bajo ella es la sustentación total. Mueve el alabeo \(p\): el ala que baja ve más ángulo de ataque y aparece un momento que frena el giro.
Sustentación-
\(C_L\)-
Momento de alabeo-
Momento de picado de los flaps-

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):

\[ C_l=C_{l\beta}\beta+C_{lp}\hat p+C_{lr}\hat r+C_{l\delta_a}\delta_a+C_{l\delta_r}\delta_r,\qquad \hat p=\frac{pb}{2V},\ \hat r=\frac{rb}{2V},\qquad L=\bar qSb\,C_l \]

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.

CuidadoEn hover \(V\to0\) y \(\hat p=pb/2V\) explota. Para un tail-sitter es mejor que el modelo trabaje con fuerzas dimensionales calculadas a partir de la velocidad local (como hace tu strip theory) y no con coeficientes referidos a la velocidad de vuelo.

Nivel 2: tablas de VSPAERO o XFLR5

  1. 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).
  2. 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.
  3. Saca las derivadas de giro (\(C_{lp}\), \(C_{mq}\), \(C_{nr}\)) del análisis de estabilidad.
  4. En MATLAB, carga la rejilla y usa griddedInterpolant para interpolar en vuelo.
  5. Suma la resistencia viscosa (VSPAERO es no viscoso): cd0 de 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:

\[ \mathbf M_{CG}=\mathbf M_{\text{ref}}+(\mathbf r_{\text{ref}}-\mathbf r_{CG})\times\mathbf F \]

Las derivadas de giro sí cambian con el CG, porque la velocidad de cada punto depende de dónde está el eje de giro.

Límites del nivel 2VLM y paneles suponen flujo adherido: no predicen la entrada en pérdida ni la resistencia, y no ven bien la interacción hélice-ala. En la transición del tail-sitter el ala pasa por ángulos de ataque altísimos. Ahí necesitarás datos de CFD o túnel, o un modelo empírico de placa plana más allá de la pérdida (\(c_N\approx 2\sin\alpha\)).

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.

En tu códigowingStripTheory.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.
Resumen claveLa aerodinámica es una función que devuelve 6 números en ejes cuerpo. Strip theory, tablas o CFD son formas distintas de rellenarla. Diseña el código para poder cambiar de una a otra sin tocar las ecuaciones del movimiento.
Capítulo 7

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:

batería→ ESC (variador)→ motor→ eje girando a Ω→ hélice→ empuje, par, estela

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:

El circuito, en régimen permanente (se desprecia la inductancia), es una resistencia y un "generador":

\[ V_m=R\,I+K_e\,\Omega \quad\Rightarrow\quad I=\frac{V_m-K_e\Omega}{R} \]
Intenta tú

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
\[ K_e\Omega\,I=K_tI\,\Omega\quad\Rightarrow\quad K_t=K_e \]

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\):

\[ T=C_T(J)\,\rho n^2D^4,\qquad Q=C_Q(J)\,\rho n^2D^5,\qquad P=C_P(J)\,\rho n^3D^5,\qquad J=\frac{V}{nD} \]
Intenta tú

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
\[ C_P=2\pi C_Q,\qquad \eta=\frac{TV}{P}=\frac{C_T\,\rho n^2D^4\,V}{C_P\,\rho n^3D^5}=J\,\frac{C_T}{C_P} \]

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\).

Intenta tú

(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
\[ T=\dot m\,v_w=\rho A(V+v_i)\,v_w,\qquad T=A\,\Delta p=A\,\rho\Big(V+\tfrac{v_w}{2}\Big)v_w \]

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:

\[ T=2\rho A\,(V+v_i)\,v_i\quad\Rightarrow\quad v_i=-\frac V2+\sqrt{\frac{V^2}{4}+\frac{T}{2\rho A}} \]

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\).

\[ dT=\tfrac12\rho W^2c\,(c_l\cos\phi-c_d\sin\phi)\,B\,dr,\qquad dQ=\tfrac12\rho W^2c\,(c_l\sin\phi+c_d\cos\phi)\,B\,r\,dr \]

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.

El triángulo de velocidades de un trozo de pala
Horizontal: velocidad de giro \(\Omega r\). Vertical: velocidad axial \(V+v_i\). La sustentación \(dL\) es perpendicular al viento relativo \(W\); su componente axial es empuje y la tangencial es par. Sube la velocidad de vuelo: \(\phi\) crece, \(\alpha\) baja y el empuje cae.
\(\Omega r\)-
Ángulo de flujo \(\phi\)-
Paso de pala \(\theta\)-
Ángulo de ataque \(\alpha\)-

\(v_i\) se toma de un empuje típico para no complicar el dibujo. Diámetro 0.5 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:

\[ \underbrace{K_t\!\left(\frac{tV_{\text{bat}}-K_e\Omega}{R}-I_0\right)}_{Q_m(\Omega)}=\underbrace{C_Q(J)\,\rho n^2D^5}_{Q_p(\Omega)} \]
Punto de operación: par del motor contra par de la hélice
Recta: par del motor para el acelerador elegido. Curva: par que pide la hélice a esa velocidad de vuelo. El cruce fija las rpm, el empuje y la corriente. Datos de ejemplo (\(K_V=130\), \(R=0.03\,\Omega\), 100 V, hélice de 0.5 m).
rpm-
Empuje-
Corriente-
Potencia eléctrica-
Intenta tú

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):

\[ I_r\,\dot\Omega=Q_m(\Omega,t)-Q_p(\Omega,V) \]

Linealizando alrededor del punto de operación sale un sistema de primer orden con constante de tiempo:

\[ \tau_m=\frac{I_r}{\dfrac{K_tK_e}{R}+\dfrac{\partial Q_p}{\partial\Omega}} \]

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:

\[ v(x)=v_i\left(1+\frac{x}{\sqrt{x^2+R^2}}\right),\qquad R_s(x)=R\sqrt{\frac{V+v_i}{V+v(x)}} \]

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.

La estela vista de lado
Prueba la velocidad 0 (hover): fuera de la estela no hay aire, y los flaperones solo funcionan en la parte del ala que está dentro de la estela.
Empuje-
\(v_i\) en el disco-
Aire en el ala-
Ganancia de \(\bar q\)-
Ángulo de swirl-

7.8 Lo que los motores le hacen al avión

EfectoExpresió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ónAlabeo \(-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 derivaDa autoridad a flaperones y deflector en hover

7.9 Usar los datos del fabricante

  1. Motor (hoja de datos): \(K_V\), resistencia interna, \(I_0\) (con el voltaje de la prueba), corriente máxima.
  2. ESC y batería: suma sus resistencias a \(R\). Usa el voltaje bajo carga.
  3. Hélice: curvas \(C_T(J), C_P(J)\) de UIUC o APC, o BEMT con la geometría.
  4. Tabla de banco del fabricante (acelerador, empuje, corriente, rpm): compara con checkMotorAgainstTest.m y ajusta kT.
  5. Tu propio banco de empuje (capítulo 13): mide empuje, par, rpm y corriente. Es lo más fiable.
Lo que el modelo aún no tieneFlujo oblicuo sobre la hélice: en la transición el aire entra de lado y aparece una fuerza normal en el disco (y el efecto P). Tampoco tiene el efecto suelo en el despegue, ni la influencia del ala sobre la hélice (el ala frena el aire por delante). Para la transición, el flujo oblicuo es el siguiente que conviene añadir.
En tu códigomotorModel.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.
Resumen claveAcelerador → voltaje → rpm (cruce de pares motor y hélice) → empuje \(C_T\rho n^2D^4\). Las rpm tardan \(\tau_m\) en responder. La estela acelera el aire detrás de la hélice y da autoridad a los mandos en hover.
Capítulo 8

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

Pruebas de cordura (hazlas siempre)

PruebaMontajeResultado esperado
Caída libreMotores 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íaSin aerodinámica ni motores, con giro inicial\(\tfrac12\boldsymbol\omega^TI\boldsymbol\omega\) constante
NormaCualquier simulación larga\(|\mathbf q|=1\)
Resumen clave\(f(\mathbf x,\mathbf u)\) son unas 25 líneas. Lo difícil no es escribirla, es comprobarla: cada prueba de cordura descubre un tipo de error distinto (signos, marcos, unidades).
Capítulo 9

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.

\[ \dot u=\dot v=\dot w=0,\qquad \dot p=\dot q=\dot r=0,\qquad \dot\phi=\dot\theta=0 \]

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
Cuidado: tu avión está sobreactuadoTienes 7 mandos y solo 6 grados de libertad. Hay infinitos trims posibles (por ejemplo, más empuje arriba y flap compensando). Elige uno con un criterio: mínima potencia o mínimo uso de mandos, con fmincon y las ecuaciones de trim como restricciones. El mismo problema reaparece en la asignación de mandos (capítulo 11).
Resumen claveTrim = resolver \(f(\mathbf x,\mathbf u)=0\) para las variables libres. Es el punto alrededor del cual linealizas y diseñas el control. Para un tail-sitter hay una familia continua de trims, del hover al crucero.
Capítulo 10

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:

\[ \dot{\mathbf x}=f(\mathbf x_0+\Delta\mathbf x,\mathbf u_0+\Delta\mathbf u)\approx\underbrace{f(\mathbf x_0,\mathbf u_0)}_{=0\ \text{en trim}}+\underbrace{\frac{\partial f}{\partial\mathbf x}}_{A}\Delta\mathbf x+\underbrace{\frac{\partial f}{\partial\mathbf u}}_{B}\Delta\mathbf u \]
\[ A_{ij}=\frac{\partial\dot x_i}{\partial x_j},\qquad B_{ij}=\frac{\partial\dot x_i}{\partial u_j} \]

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

La derivada como recta tangente
Curva de sustentación con entrada en pérdida. La recta tangente en \(\alpha_0\) es lo que ve el modelo lineal; la cuerda entre \(\alpha_0\pm h\) es la diferencia central. Fíjate en lo mal que funciona la linealización cerca de la pérdida.
Pendiente exacta-
Diferencia central-
Error-
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:

  1. Crucero: linealiza con ángulos de Euler (12 estados). Lejos de \(\theta=90^\circ\) no hay problema. Es lo que hace el curso.
  2. 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.
  3. Marco de hover: define los ángulos de Euler respecto a un marco girado 90°. En hover esos ángulos son pequeños.
Mapa de la matriz \(A\) (crucero recto y nivelado, 12 estados)
Toca una casilla para ver qué significa. Azul: bloque longitudinal. Ámbar: lateral-direccional. Gris: posición. Las casillas vacías son cero en vuelo simétrico: por eso los dos bloques se pueden estudiar por separado.

Toca una casilla.

Qué haces con \(A\) y \(B\)

Resumen clave\(A=\partial f/\partial\mathbf x\), \(B=\partial f/\partial\mathbf u\), evaluadas en un trim. Se calculan perturbando cada estado y cada mando. Con cuaterniones, reduce a 12 estados usando un error de actitud de 3 componentes.
Capítulo 11

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

posición→ velocidad→ actitud→ velocidad angular→ asignación de mandos→ motores y servos

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:

\[ \begin{bmatrix}T\\L\\M\\N\end{bmatrix}=B_{\text{asig}}(V)\,\begin{bmatrix}t_1\\t_2\\t_3\\t_4\\ \delta_f\\ \delta_a\\ \delta_r\end{bmatrix}\quad\Rightarrow\quad \mathbf u=B_{\text{asig}}^{+}\,\boldsymbol\nu \]

\(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.

Cuidado con los nombres en hoverEn hover el eje \(x\) cuerpo apunta al cielo. Un giro alrededor de \(x\) (alabeo en crucero) es un cambio de rumbo en hover, y un giro alrededor de \(z\) cuerpo (guiñada en crucero) es una inclinación lateral en hover. Los autopilotos de tail-sitters reetiquetan los ejes en hover para no confundirse.

Métodos

Por qué el retraso y la lentitud de los motores importan
Control de cabeceo en hover con un PD. El momento llega a través de los motores (primer orden con \(\tau_m\)) y con un retraso puro (filtros, muestreo, comunicaciones). Sube el retraso con las mismas ganancias y mira cómo aparece la oscilación.
Sobreoscilación-
Tiempo de asentamiento-
Estado-

Lista para que funcione en hardware

Resumen claveDiseña sobre el modelo lineal, verifica sobre el no lineal con actuadores, retrasos, ruido y saturaciones. Lo que más limita el control en hover son la respuesta de los motores y los retrasos, no la aerodinámica.
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.

SensorQué mideProblemas 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ónSolo da la dirección de la gravedad si el avión no acelera
MagnetómetroCampo magnético: rumboInterferencia de las corrientes de los motores
BarómetroAltitudPresión de la estela y del viento sobre el sensor
GPSPosición y velocidadRetraso de 100–200 ms, 5–10 Hz
Pitot (velocidad aérea)\(V\)No sirve en hover; si está en la estela, mide la estela
Intenta tú

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

\[ \mathbf y=h(\mathbf x)+\mathbf b+\mathbf n,\qquad \dot{\mathbf b}=\mathbf n_b \]

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:

\[ \hat\theta_{k+1}=\alpha\,(\hat\theta_k+q_k\,\Delta t)+(1-\alpha)\,\theta_{\text{acel},k} \]
Filtro complementario con datos simulados
Gris: la verdad. Ámbar: el ángulo del acelerómetro (ruidoso). Azul: la estimación. Con \(\alpha\) cerca de 1 confías en el giróscopo (suave, pero deriva con el sesgo); con \(\alpha\) bajo confías en el acelerómetro (ruidoso).
Error medio-

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.

Resumen claveSimula lo que el controlador verá de verdad: sensores con ruido, sesgo y retraso, y el estimador. Un controlador que solo se ha probado con el estado perfecto no está probado.
Capítulo 13

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.

ComponenteError típicoEfecto en el controlCómo mejorarlo
Posición del CG1–2 % de cuerdaMuy grande (margen estático)Pesar con dos básculas o colgar el avión
Inercias (CAD)5–10 %ModeradoPéndulo bifilar: 2–5 %
Motores y ESC (dinámica)Normalmente no se modelaGrande en hoverEscalón de acelerador en banco
Hélice por BEMTEmpuje 10–20 %Grande en hoverBanco de empuje: 2–3 %
Servos, retrasos, sensoresSe suelen ignorarMuy grandeEnsayos en banco, chirp, medida de latencia
Aerodinámica strip theoryDerivadas 15–25 %ModeradoVSPAERO, luego CFD o túnel
Tablas VLM~10 % con flujo adheridoModeradoResistencia viscosa; CFD para \(\alpha\) alto
CFD5–10 % adherido, peor separadoDonde VLM fallaTú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.

\[ I=\frac{m\,g\,T^2D^2}{16\pi^2L} \]
Calculadora del péndulo bifilar
Inercia-
Error si \(T\) se mide con ±0.05 s-

Mide 20 oscilaciones y divide: el error del cronómetro baja 20 veces. Resta la inercia del soporte si lo usas.

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:

  1. Vuela primero con un controlador prudente, diseñado con el modelo físico.
  2. Excita los ejes que te interesan: dobletes, 3-2-1-1 o barridos de frecuencia, en cada mando por separado.
  3. Registra a alta frecuencia: IMU, rpm, corriente, posición de los servos, mandos.
  4. 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.
  5. Valida con otro vuelo distinto del que usaste para identificar.
  6. 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

  1. Medir masa, CG, inercias, actuadores y empuje (días de trabajo, gran ganancia).
  2. Modelo con strip theory y primeros controladores en simulación.
  3. Tablas de VSPAERO y datos de propulsión.
  4. CFD o túnel solo donde haga falta (\(\alpha\) alto, interacción hélice-ala).
  5. Identificación en vuelo, actualizar el modelo, repetir.
Resumen claveLas mejoras más baratas (CG, inercias, motores, retrasos) suelen dar más que la aerodinámica cara. La identificación en vuelo es un ciclo: vuela, mide, corrige el modelo, rediseña.
Capítulo 14

Herramientas: MATLAB, Simulink, Python y simuladores

MATLAB y sus toolboxes

ToolboxPara qué te sirve aquí
MATLAB baseode45, matrices, gráficas, hgtransform para animar tu geometría en 3D
Control System Toolboxss, eig, damp, lqr, bode, margin, c2d
Optimization Toolboxfsolve y fmincon para trim
Symbolic Math ToolboxComprobar derivaciones, jacobian simbólico
Aerospace ToolboxConversiones DCM, cuaternión y Euler; atmósfera ISA; Aero.Animation; enlace con FlightGear
Simulink + Aerospace BlocksetBloques de 6 grados de libertad (también con cuaternión), atmósfera, viento, actuadores
Simulink Control DesignTrim y linealización automática de modelos Simulink
System Identification ToolboxIdentificación con datos de vuelo o de banco
UAV ToolboxInterfaz con PX4, escenarios de simulación, visualización
Simulink 3D Animation, Simscape MultibodyVisualización 3D y modelos multicuerpo
Embedded CoderGenerar 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

PaqueteEquivale a
NumPy, SciPy (solve_ivp, optimize)MATLAB base, ode45, fsolve
python-controlControl System Toolbox (ss, lqr, bode)
SymPySymbolic Math
CasADiOptimizació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, PyVistaGráficas y visualización 3D

Simuladores y 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

Visualización 3D, de menos a más

  1. patch + hgtransform en MATLAB con tu geometría: simple y tuyo.
  2. Aero.Animation del Aerospace Toolbox.
  3. FlightGear conectado a MATLAB o Simulink: escenario realista.
  4. Gazebo con PX4 SITL: cuando el autopiloto real entre en juego.

Enlaces y vídeos

Capítulo 15

Tu plan de trabajo

Cómo usar la IA sin dejar de aprender

  1. Deriva tú primero. Pide a la IA que revise tu derivación, no que la haga.
  2. 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.
  3. Predice antes de ejecutar. Antes de correr una simulación, escribe qué esperas. Si no coincide, ahí hay algo que aprender (o un error).
  4. Cambia un parámetro y explícalo. Sube la inercia, mueve el CG, quita la estela. Si sabes explicar el cambio, entiendes el modelo.
  5. Escribe tú las pruebas de cordura (capítulo 8). Son la mejor forma de saber si el código hace lo que crees.
  6. Lleva un diario de decisiones: qué supones, por qué, de dónde sale cada número.

Fases y tareas

Capítulo 16

Símbolos y referencias

SímboloSignificadoUnidades
\(u, v, w\)Velocidades en ejes cuerpo (totales; en Cook son \(U, V, W\))m/s
\(p, q, r\)Velocidades angulares en ejes cuerporad/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 cuerpoN
\(L, M, N\)Momentos de alabeo, cabeceo, guiñadaN·m
\(C_{B/E}\)DCM de ejes Tierra a ejes cuerpo-
\(\alpha, \beta\)Ángulo de ataque, de resbalamientorad
\(\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 derivarad
\(t_i\)Acelerador del motor \(i\)0–1
\(\Omega, n\)Velocidad de giro de la hélicerad/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 contraelectromotrizrpm/V; N·m/A
\(v_i\)Velocidad inducida en el discom/s
\(\tau, \tau_m\)Eficacia del flap; constante de tiempo del motor-; s
\(A, B\)Jacobianos del modelo linealizado-

Tus clases, por tema

Libros