Physics-based eVTOL Propulsion & Aerodynamic Models
MATLAB state-space propulsion models, motor torque-speed curves, battery discharge models, and coupled airframe aerodynamics for eVTOL control law development
Developed a suite of physics-based plant models in MATLAB that replaced empirical estimates as the design authority for eVTOL development at VTOL Aviation India.
Motor Model
The brushless DC motor is modeled using its electrical and mechanical dynamics:
\[L \frac{di}{dt} = V_{\text{in}} - iR - k_e \omega_m\] \[J_m \dot{\omega}_m = k_t i - \tau_{\text{load}} - b\omega_m\]where \(k_e\) is the back-EMF constant, \(k_t\) the torque constant, \(b\) the viscous damping, and \(\tau_{\text{load}}\) the propeller torque. At steady state this reduces to the torque-speed curve:
\[\omega_m = \frac{V_{\text{in}} - iR}{k_e}, \quad \tau = k_t i\]Curves were parameterized against test stand data across operating voltage and temperature.
Propeller (Blade-Element Momentum Theory)
Thrust and torque are computed by integrating elemental forces along the blade span:
\[dT = \frac{1}{2} \rho c(r) \left( C_L \cos\phi - C_D \sin\phi \right) V_r^2 \, dr\] \[dQ = \frac{1}{2} \rho c(r) \left( C_D \cos\phi + C_L \sin\phi \right) V_r^2 \, r \, dr\]where \(\phi\) is the inflow angle, \(V_r\) the resultant velocity at each blade element, and \(c(r)\) the chord distribution. Integrated thrust and torque coefficients \(C_T(\lambda),\ C_Q(\lambda)\) are tabulated as functions of advance ratio \(\lambda = V_\infty / (nD)\).
Battery Discharge Model
A modified Peukert model captures voltage sag under load:
\[V_{\text{batt}}(t) = V_{\text{oc}}(\text{SoC}) - i(t) \cdot R_{\text{int}}(\text{SoC}, T)\]State of charge evolves as:
\[\dot{\text{SoC}} = -\frac{i(t)}{C_{\text{rated}}}\]Internal resistance \(R_{\text{int}}\) is mapped as a 2D lookup over SoC and temperature, fit to discharge curves measured on the test stand.
Calibration Against Test Data
import numpy as np
from scipy.optimize import curve_fit
def motor_model(V_omega, k_e, k_t, R, b):
V_in, omega = V_omega
i = (V_in - k_e * omega) / R
torque = k_t * i - b * omega
return torque
# Fit model to test stand measurements
popt, pcov = curve_fit(
motor_model,
(V_in_data, omega_data),
torque_data,
p0=[0.01, 0.01, 0.1, 1e-4]
)
k_e, k_t, R, b = popt
Prediction error after calibration was reduced to within 3% across the full operating envelope.
Flight Envelope Analysis
Operating points were established at 50+ trim configurations varying payload, battery state, and altitude. Each trim point yielded linearized state-space matrices used for gain scheduling:
\[\dot{x} = A(\xi) x + B(\xi) u, \quad \xi = [\text{payload},\ \text{SoC},\ h]\]Eigenvalue analysis at each operating point confirmed closed-loop stability before flight test at that configuration.
<!--
See https://www.debugbear.com/blog/responsive-images#w-descriptors-and-the-sizes-attribute and
https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images for info on defining 'sizes' for responsive images
-->
<source
class="responsive-img-srcset"
srcset="/assets/img/personal/envelope_analysis.gif"
sizes="95vw"
>
<img
src="/assets/img/personal/envelope_analysis.gif"
class="img-fluid rounded z-depth-1"
width="100%"
height="auto"
alt="Flight envelope analysis"
data-zoomable
loading="lazy"
onerror="this.onerror=null; $('.responsive-img-srcset').remove();"
>
</picture>
</figure> –>