This article describes simple ways to model helicopter control responses. These are based on a linear state-space approach.

We’ll start here with the simplest models. We won’t account for rotor flapping or off-axis effects. We’ll focus on pitch here, but the model is applicable to roll and yaw. We’ll provide real helicopter flight test data for comparison.

An actual helicopter pitch response to a longitudinal cyclic \(\theta_s\) step is shown in the plot below. The blue line in the 2nd plot is the pitch rate \(q\) as a function of time. The orange line is the same variable, but as predicted by the model. The model implements a linear differential equation $$\begin{equation} \dot{q}= M_{\theta_s} \Delta \theta_s + M_q q ,\label{eq:linpit1} \end{equation}$$

where the \(M_*\) are constants, adjusted to match the aircraft response and \(\Delta \theta_s\) is the size of the cyclic control input. In this case, the model matches the flight test data to within 2 deg/s. Python source code for this simple model is provided below the plots. It's quite simple: it uses the equation above to compute \(\dot{q}\) and then integrates it in time.

`def longitudinal_resp(t, y, M_fas=-1.6, M_q=-0.8):`

` p, q = y`

` fa = np.interp(t, fas.index, fas.values) # lookup flt test long cyclic input`

` pdot = 0.0 # ignore roll`

` qdot = M_fas*(fa-bfas) + M_q*q`

` return (pdot, qdot)`

`#load your flt test data`

`tmax = 9.0`

`from scipy.integrate import solve_ivp, RK23`

`import numpy as np`

`sol = solve_ivp(longitudinal_resp, [0., tmax], (0.,0.), RK23)`

`model_q = np.interp(df.index, sol.t, sol.y[1])`

`# plot your results`

We’ll now see a limitation of such models. The plot below shows another real helicopter control response. In this case the rate oscillates. Try as we may, tuning the \(M_*\) can not produce this oscillatory behavior. In fact, given a step control input, all these simple models can do is transition from the initial rate to a final rate \(q’\), where \(M_{\theta_s} \Delta \theta_s = -M_q q’\). At that point the acceleration is 0 and the rate is fixed.

One way to model the aircraft more closely is to add a flapping degree of freedom \(\beta_c\). Flapping is roughly proportional to cyclic input, but is also affected by other variables like advance ratio and pitch rate. A simple example of a model including flapping would be

$$ \begin{equation} \ddot{\beta_c} = K_{\theta_s}\Delta \theta_s +K_{\beta_c} \beta_c + K_{\dot{\beta_c}} \dot{\beta_c}, \end{equation}$$

$$\begin{equation} \dot{q}= M_{\beta_c} \beta_c + M_q q , \end{equation}$$

where the \(K_*\) are again constants set to match flight test data. This model will provide an oscillatory response after a control step is input. Put simply, the cyclic input changes the flapping but results in oscillations of flapping about an equilibrium value. Somewhat like a simple spring, mass and damper system. The oscillations in flapping induce oscillations in helicopter attitude.

Helicopters experience off-axis responses as well. For example, longitudinal cyclic and pitch dynamics will affect roll behavior. Lateral cyclic and roll dynamics will affect pitch behavior. We describe off-axis responses in more detail here. The models explained above ignored such behavior: they only considered on-axis responses. Off-axis behavior can be approximated by extending Equation \eqref{eq:linpit1} to become

$$\begin{equation} \dot{q}= M_{\theta_s} \Delta \theta_s + M_q q + M_{\theta_c} \Delta \theta_c + M_p p .\label{eq:linpitoff} \end{equation}$$

Two terms were added to the end of the equation, adding (1) pitch acceleration proportional to lateral cyclic input and (2) pitch acceleration proportional to roll rate. Of course, the magnitude of \(M_{\theta_c}\) should be much smaller than \(M_{\theta_s}\): the lateral cyclic should influence pitch much less than longitudinal cyclic. For more information about off-axis modeling see this paper.

The models described thus far depended on control positions, angular rates and flapping. While this is sufficient for some applications, it will have gross errors when applied across a large portion of the flight envelope. For example, flapping changes with airspeed via a phenomena known as flap-back. More powerful-but still linear-models may contain many more state variables including e.g. body velocities \(u,v,w\). For an example see page 13 of this paper. When doing so, it typically becomes easier to use matrix notation in place of the notation we've used above. If the state of the system is denoted \(\bar{x}\) and the control inputs \(\bar{u}\) then it's convenient to reduce the notation for the linear system to

$$ \begin{equation} \dot{\bar{x}} = A\bar{x}+G\bar{u}. \end{equation} $$

To relate this to our explanation above, note that \(\bar{x}\) above contained only \(q\) in the first example, and later \(\beta_c\): \(\bar{x}=(q,\beta_c )\). The matrix \(A\) contains the constants we denoted by \(M_*\) and \(K_*\) above. Finally, \(\bar{u}\) above included the control inputs, flapping and rates, i.e. \(\bar{u}=(\Delta \theta_s , q, \beta_c , \dot{\beta_c} ,\Delta \theta_c ,p)\).

The models described above are intended to be used locally, in a small region of the flight envelope. For example, a model may be applicable for level flight at 100 knots. The ideal constants \(M_{\theta_s}\) and \(M_q\) may be significantly different in another flight condition. To handle this, modelers may create sets \(M_{\theta_s}(x)\), \(M_q(x)\) of such values as a function of some parameter(s) \(x\). For example, \(x\) may be airspeed or a combination of parameters like advance ratio, inflow ratio and CG location.

These local linear models may be 'stitched' together to create a full flight envelope model. For a simple example, say \(x\) is airspeed. At any time in the simulation, we could select \(M_{\theta_s}\) and \(M_q\) by linear interpolation from \(M_{\theta_s}(x)\) and \(M_q(x)\). Of course, trim control positions also need to be adjusted accordingly. Such a model may then be used across the flight envelope, e.g. in a pilot training simulator. For more information about stitching models together see this paper.