782 lines
32 KiB
TeX
782 lines
32 KiB
TeX
|
|
|||
|
|
|||
|
\chapter{Flight simulation}
|
|||
|
\label{chap-simulation}
|
|||
|
|
|||
|
In this chapter the actual flight simulation is analyzed. First in
|
|||
|
Section~\ref{sec-atmospheric-properties} methods for simulating
|
|||
|
atmospheric conditions and wind are presented. Then in
|
|||
|
Section~\ref{sec-flight-modeling} the actual simulation procedure is
|
|||
|
developed.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\section{Atmospheric properties}
|
|||
|
\label{sec-atmospheric-properties}
|
|||
|
|
|||
|
In order to calculate the aerodynamic forces acting on the rocket it
|
|||
|
is necessary to know the prevailing atmospheric conditions. Since the
|
|||
|
atmosphere is not constant with altitude, a model must be developed to
|
|||
|
account for the changes. Wind also plays an important role in the
|
|||
|
flight of a rocket, and therefore it is important to have a realistic
|
|||
|
wind model in use during the simulation.
|
|||
|
|
|||
|
|
|||
|
\subsection{Atmospheric model}
|
|||
|
|
|||
|
The atmospheric model is responsible to estimating the atmospheric
|
|||
|
conditions at varying altitudes. The properties that are of most
|
|||
|
interest are the density of air $\rho$ (which is a scaling parameter
|
|||
|
to the aerodynamic coefficients via the dynamic pressure
|
|||
|
$\frac{1}{2}\rho v^2$) and the speed of sound $c$ (which affects the
|
|||
|
Mach number of the rocket, which in turn affects its aerodynamic
|
|||
|
properties). These may in turn be calculated from the air pressure
|
|||
|
$p$ and temperature $T$.
|
|||
|
|
|||
|
Several models exist that define standard atmospheric conditions as a
|
|||
|
function of altitude, including the Internaltional Standard
|
|||
|
Atmosphere (ISA)~\cite{international-standard-atmosphere} and the
|
|||
|
U.S. Standard Atmosphere~\cite{US-standard-atmosphere}. These two
|
|||
|
models yield identical temperature and pressure profiles for altitudes
|
|||
|
up to 32~km.
|
|||
|
|
|||
|
The models are based on the assumption that air follows the ideal gas
|
|||
|
law
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\rho = \frac{Mp}{RT}
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
where $M$ is the molecular mass of air and $R$ is the ideal gas
|
|||
|
constant. From the equilibrium of hydrostatic forces the differential
|
|||
|
equation for pressure as a function of altitude $z$ can be found as
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\dif p = -g_0 \rho \dif z = -g_0 \frac{Mp}{RT} \dif z
|
|||
|
\label{eq-pressure-altitude}
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
where $g_0$ is the gravitational acceleration. If the temperature of
|
|||
|
air were to be assumed to be constant, this would yield an exponential
|
|||
|
diminishing of air pressure.
|
|||
|
|
|||
|
The ISA and U.S. Standard Atmospheres further specity a standard
|
|||
|
temperature and pressure at sea level and a temperature profile for
|
|||
|
the atmosphere. The temperature profile is given as eight
|
|||
|
temperatures for different altitudes, which are then linearly
|
|||
|
interpolated. The temperature profile and base pressures for the ISA
|
|||
|
model are presented in Table~\ref{table-ISA-model}. These values
|
|||
|
along with equation~(\ref{eq-pressure-altitude}) define the
|
|||
|
temperature/pressure profile as a function of altitude.
|
|||
|
|
|||
|
\begin{table}
|
|||
|
\caption{Layers defined in the International Standard
|
|||
|
Atmosphere~\cite{wiki-ISA-layers}}
|
|||
|
\label{table-ISA-model}
|
|||
|
\begin{center}
|
|||
|
\begin{tabular}{ccccl}
|
|||
|
\hline
|
|||
|
Layer & Altitude$^\dagger$ & Temperature & Lapse rate &
|
|||
|
\multicolumn{1}{c}{Pressure} \\
|
|||
|
& m & $^\circ$C & $^\circ$C/km & \multicolumn{1}{c}{Pa} \\
|
|||
|
\hline
|
|||
|
0 & 0 & $+15.0$ & $-6.5$ & 101\s325 \\
|
|||
|
1 & 11\s000 & $-56.5$ & $+0.0$ & \num22\s632 \\
|
|||
|
2 & 20\s000 & $-56.5$ & $+1.0$ & \num\num5\s474.9 \\
|
|||
|
3 & 32\s000 & $-44.5$ & $+2.8$ & \num\num\num\s868.02 \\
|
|||
|
4 & 47\s000 & \num$-2.5$ & $+0.0$ & \num\num\num\s110.91 \\
|
|||
|
5 & 51\s000 & \num$-2.5$ & $-2.8$ & \num\num\num\s\num66.939 \\
|
|||
|
6 & 71\s000 & $-58.5$ & $-2.0$ & \num\num\num\s\num\num3.9564 \\
|
|||
|
7 & 84\s852 & $-86.2$ & & \num\num\num\s\num\num0.3734 \\
|
|||
|
\hline
|
|||
|
\end{tabular}
|
|||
|
\end{center}
|
|||
|
\vspace{-3mm}
|
|||
|
{\footnotesize $^\dagger$ Altitude is the geopotential height which
|
|||
|
does not account for the diminution of gravity at high altitudes.}
|
|||
|
\vspace{3mm}
|
|||
|
\end{table}
|
|||
|
|
|||
|
These models are totally static and do not take into account any local
|
|||
|
flight conditions. Many rocketeers may be interested in flight
|
|||
|
differences during summer and winter and what kind of effect air pressure
|
|||
|
has on the flight. These are also parameters that can easily be
|
|||
|
measured on site when launching rockets. On the other hand, it is
|
|||
|
generally hard to know a specific temperature profile for a specific
|
|||
|
day. Therefore the atmospheric model was extended to allow the user
|
|||
|
to specify the base conditions either at mean sea level or at the
|
|||
|
altitude of the launch site. These values are simply assigned to the
|
|||
|
first layer of the atmospheric model. Most model rockets do not
|
|||
|
exceed altitudes of a few kilometers, and therefore the flight
|
|||
|
conditions at the launch site will dominate the flight.
|
|||
|
|
|||
|
One parameter that also has an effect on air density and the speed of
|
|||
|
sound is humidity. The standard models do not include any definition
|
|||
|
of humidity as a function of altitude. Furthermore, the effect of
|
|||
|
humidity on air density and the speed of sound is marginal. The
|
|||
|
difference in air density and the speed of sound between completely dry
|
|||
|
air and saturated air at standard conditions are both less than 1\%.
|
|||
|
Therefore the effect of humidity has been ignored.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\subsection{Wind modeling}
|
|||
|
|
|||
|
Wind plays a critical role in the flight of model rockets. As has
|
|||
|
been seen, large angles of attack may cause rockets to lose a
|
|||
|
significant amount of stability and even go unstable. Over-stable
|
|||
|
rockets may weathercock and turn into the wind. In a perfectly static
|
|||
|
atmosphere a rocket would, in principle, fly its entire flight
|
|||
|
directly upwards at zero angle of attack. Therefore, the effect of
|
|||
|
wind must be taken into account in a full rocket simulation.
|
|||
|
|
|||
|
Most model rocketeers, however, do not have access to a full wind
|
|||
|
profile of the area they are launching in. Different layers of air
|
|||
|
may have different wind velocities and directions. Modeling such
|
|||
|
complex patterns is beyond the scope of this project. Therefore, the
|
|||
|
goal is to produce a realistic wind model that can be specified with
|
|||
|
only a few parameters understandable to the user and that covers
|
|||
|
altitudes of most rocket flights. Extensions to allow for multiple
|
|||
|
air layers may be added in the future.
|
|||
|
|
|||
|
In addition to a constant average velocity, wind always has some
|
|||
|
degree of turbulence in it. The effect of turbulence can be modeled
|
|||
|
by summing the steady flow of air and a random, zero-mean turbulence
|
|||
|
velocity. Two central aspects of the turbulence velocity are the
|
|||
|
amplitude of the variation and the frequencies at which they occur.
|
|||
|
Therefore a reasonable turbulence model is achieved by a random
|
|||
|
process that produces a sequence with a similar distribution and
|
|||
|
frequency spectrum as that of real wind.
|
|||
|
|
|||
|
Several models of the spectrum of wind turbulence at specific
|
|||
|
altitudes exist. Two commonly used such spectra are the {\it Kaimal}
|
|||
|
and {\it von K<>rm<72>n} wind turbulence
|
|||
|
spectra~\cite[p.~23]{wind-energy-handbook}:
|
|||
|
%
|
|||
|
\begin{eqnarray}
|
|||
|
\mbox{Kaimal:} & & \frac{S_u(f)}{\sigma_u^2} =
|
|||
|
\frac{4 L_{1u} / U}{(1 + 6fL_{1u}/U)^{5/3}} \label{eq-kaimal-wind} \\
|
|||
|
%
|
|||
|
\mbox{von K<>rm<72>n:} & & \frac{S_u(f)}{\sigma_u^2} =
|
|||
|
\frac{4 L_{2u} / U}{(1 + 70.8(fL_{2u}/U)^2)^{5/6}} \label{eq-karman-wind}
|
|||
|
\end{eqnarray}
|
|||
|
|
|||
|
Here $S_u(f)$ is the spectral density function of the turbulence
|
|||
|
velocity and $f$ the turbulence frequency, $\sigma_u$ the standard
|
|||
|
deviation of the turbulence velocity, $L_{1u}$ and $L_{2u}$ length
|
|||
|
parameters and $U$ the average wind speed.
|
|||
|
|
|||
|
Both models approach the asymptotic limit
|
|||
|
$S_u(f)/\sigma_u^2 \sim f^{-5/3}$ quite fast. Above frequencies of
|
|||
|
0.5~Hz the difference between equation~(\ref{eq-kaimal-wind}) and the
|
|||
|
same equation without the term 1 in the denominator is less than 4\%.
|
|||
|
Since the time scale of a model rocket's flight is quite short, the
|
|||
|
effect of extremely low frequencies can be ignored. Therefore
|
|||
|
turbulence may reasonably well be modelled by utilizing
|
|||
|
{\it pink noise} that has a spectrum of $1/f^\alpha$ with $\alpha=5/3$.
|
|||
|
True pink noise has the additional useful property of being
|
|||
|
scale-invariant. This means that a stream of pink noise samples may
|
|||
|
be generated and assumed to be at any sampling rate while maintaining
|
|||
|
their spectral properties.
|
|||
|
|
|||
|
Discerete samples of pink noise with spectrum $1/f^\alpha$ can be
|
|||
|
generated by applying a suitable digital filter to {\it white noise},
|
|||
|
which is simply uncorrelated pseudorandom numbers. One such filter is
|
|||
|
the infinite impulse response (IIR) filter presented by
|
|||
|
Kasdin~\cite{pink-filter}:
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
x_n = w_n - a_1 x_{n-1} - a_2 x_{n-2} - a_3 x_{n-3} - \ldots
|
|||
|
\label{eq-pink-generator}
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
where $x_i$ are the generated samples, $w_n$ is a generated white
|
|||
|
random number and the coefficients are computed using
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\begin{array}{rl}
|
|||
|
a_0 & = 1 \\
|
|||
|
a_k & = \del{k-1-\frac{\alpha}{2}} \frac{a_{k-1}}{k}.
|
|||
|
\end{array}
|
|||
|
\label{eq-pink-coefficients}
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
The infinite sum may be truncated with a suitable number of terms.
|
|||
|
In the context of IIR filters these terms are calles {\it poles}.
|
|||
|
Experimentation showed that already 1--3 poles provides a reasonably
|
|||
|
accurate frequency spectrum in the high frequency range.
|
|||
|
|
|||
|
One problem in using pink noise as a turbulence velocity
|
|||
|
model is that the power spectrum of pure pink noise goes to
|
|||
|
infinity at very low frequencies. This means that a long sequence
|
|||
|
of random values may deviate significantly from zero. However, when
|
|||
|
using the truncated IIR filter of equation~(\ref{eq-pink-generator}),
|
|||
|
the spectrum density becomes constant below a certain limiting
|
|||
|
frequency, dependent on the number of poles used. By adjusting the
|
|||
|
number of poles used, the limiting frequency can be adjusted to a value
|
|||
|
suitable for model rocket flight. Specifically, the number of poles
|
|||
|
must be selected such that the limiting frequency is suitable at the
|
|||
|
chosen sampling rate.
|
|||
|
|
|||
|
It is also desirable that the simulation resolution does not affect
|
|||
|
the wind conditions. For example, a simulation with a time step of
|
|||
|
10~ms should experience the same wind conditions as a simulation with
|
|||
|
a time step of 5~ms. This is achieved by selecting a constant
|
|||
|
turbulence generation frequency and interpolating between the
|
|||
|
generated points when necessary. The fixed frequency was chosen at
|
|||
|
20~Hz, which can still simulate fluctuations at a time scale of 0.1
|
|||
|
seconds.
|
|||
|
|
|||
|
\begin{figure}[p]
|
|||
|
\centering
|
|||
|
\epsfig{file=figures/wind/pinktime, width=105mm}
|
|||
|
\caption{The effect of the number of IIR filter poles on two 20 second
|
|||
|
samples of generated turbulence, normalized so that the two-pole
|
|||
|
sequence has standard deviation one.}
|
|||
|
\label{fig-pink-poles}
|
|||
|
\end{figure}
|
|||
|
|
|||
|
\begin{figure}[p]
|
|||
|
\centering
|
|||
|
\epsfig{file=figures/wind/pinkfreq, width=95mm}
|
|||
|
\caption{The average power spectrum of 100 turbulence
|
|||
|
simulations using a two-pole IIR filter (solid) and the Kaimal
|
|||
|
turbulence spectrum (dashed); vertical axis arbitrary.}
|
|||
|
\label{fig-pink-spectrum}
|
|||
|
\end{figure}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
The effect of the number of poles is depicted in
|
|||
|
Figure~\ref{fig-pink-poles}, where two pink noise sequences were
|
|||
|
generated from the same random number source with two-pole and
|
|||
|
ten-pole IIR filters. A small number of poles generates values strongly
|
|||
|
centered on zero, while a larger number of poles introduces more low
|
|||
|
frequency variability. Since the free-flight time of a typical model
|
|||
|
rocket is of the order of 5--30 seconds, it is desireable that the
|
|||
|
maximum gust length during the flight is substantially shorter than
|
|||
|
this. Therefore the pink noise generator used by the wind model was
|
|||
|
chosen to contain only two poles, which has a limiting frequency of
|
|||
|
approximately 0.3~Hz when sampled at 20~Hz. This means that gusts of
|
|||
|
wind longer than 3--5 seconds will be rare in the simulted turbulence,
|
|||
|
which is a suitable gust length for modeling typical model rocket
|
|||
|
flight. Figure~\ref{fig-pink-spectrum} depicts the resulting pink
|
|||
|
noise spectrum of the two-pole IIR filter and the Kaimal spectrum of
|
|||
|
equation~(\ref{eq-kaimal-wind}) scaled to match each other.
|
|||
|
|
|||
|
|
|||
|
%, which causes frequency
|
|||
|
%components below approximately 0.3~Hz to be subdued. Therefore, gusts
|
|||
|
%of wind longer than 3--5 seconds will be rare in the simulated wind, a
|
|||
|
%suitable time scale for the flight of a model rocket.
|
|||
|
%Figure~\ref{fig-turbulence}(a) shows a 20 second sample of the
|
|||
|
%generated turbulence, normalized to have a standard deviation of one.
|
|||
|
%Figure~\ref{fig-turbulence}(b) depicts the actual frequency spectrum
|
|||
|
%of the generated turbulence and the Kaimal spectrum of
|
|||
|
%equation~(\ref{eq-kaimal-wind}) scaled to match each other.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
To simplify the model, the average wind speed is assumed to be
|
|||
|
constant with altitude and in a constant direction. This allows
|
|||
|
specifying the model parameters using just the average wind speed and
|
|||
|
its standard deviation. An alternative parameter for specifying the
|
|||
|
turbulence amplitude is the {\it turbulence intensity}, which is the
|
|||
|
percentage that the standard deviation is of the average wind
|
|||
|
velocity,
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
I_u = \frac{\sigma_u}{U}.
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
Wind farm load design standards typically specify turbulence
|
|||
|
intensities around 10\ldots20\%~\cite[p.~22]{wind-energy-handbook}.
|
|||
|
It is assumed that these intensities are at the top of the range of
|
|||
|
conditions in which model rockets are typically flown.
|
|||
|
|
|||
|
Overall, the process to generate the wind velocity as a function of
|
|||
|
time from the average wind velocity $U$ and standard deviation
|
|||
|
$\sigma_u$ can be summarized in the following steps:
|
|||
|
%
|
|||
|
\begin{enumerate}
|
|||
|
%\item[Input:] Average wind velocity $U$ and standard deviation
|
|||
|
% $\sigma_u$.
|
|||
|
%
|
|||
|
\item Generate a pink noise sample $x_n$ from a Gaussian white noise
|
|||
|
sample $w_n$ using equations~(\ref{eq-pink-generator}) and
|
|||
|
(\ref{eq-pink-coefficients}) with two memory terms included.
|
|||
|
|
|||
|
\item Scale the sample to a standard deviation one. This is performed
|
|||
|
by dividing the value by a previously calculated standard deviation
|
|||
|
of a long, unscaled pink noise sequence (2.252 for the two-pole IIR
|
|||
|
filter).
|
|||
|
|
|||
|
\item The wind velocity at time $n\cdot\Delta t$ ($\Delta t = 0.05\rm~s$)
|
|||
|
is $U_n = U + \sigma_u x_n$. Velocities in between are interpolated.
|
|||
|
\end{enumerate}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\section{Modeling rocket flight}
|
|||
|
\label{sec-flight-modeling}
|
|||
|
|
|||
|
|
|||
|
Modeling of rocket flight is based on Newton's laws. The basic forces
|
|||
|
acting upon a rocket are gravity, thrust from the motors and
|
|||
|
aerodynamic forces and moments. These forces and moments are
|
|||
|
calculated and integrated numerically to yield a simulation over a
|
|||
|
full flight.
|
|||
|
|
|||
|
Since most model rockets fly at a maximum a few kilometers high, the
|
|||
|
curvature of the Earth is not taken into account. Assuming a flat
|
|||
|
Earth allows us to use simple Cartesian coordinates to represent the
|
|||
|
position and altitude of the rocket. As a consequence, the coriolis
|
|||
|
effect when flying long distances north or south is not simulated
|
|||
|
either.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\subsection{Coordinates and orientation}
|
|||
|
|
|||
|
During a rocket's flight many quantities, such as the aerodynamical
|
|||
|
forces and thrust from the motors, are relative to the rocket itself,
|
|||
|
while others, such as the position and gravitational force, are more
|
|||
|
naturally described relative to the launch site. Therefore two sets
|
|||
|
of coordinates are defined, the {\it rocket coordinates}, which are
|
|||
|
the same as used in Chapter~\ref{chap-aerodynamics}, and
|
|||
|
{\it world coordinates}, which is a fixed coordinate system with the
|
|||
|
origin at the position of launch.
|
|||
|
|
|||
|
The position and velocity of a rocket are most naturally maintained as
|
|||
|
Cartesian world coordinates. Following normal convensions, the
|
|||
|
$xy$-plane is selected to be parallel to the ground and the $z$-axis
|
|||
|
is chosen to point upwards. In flight dynamics of aircraft the
|
|||
|
$z$-axis often points towards the earth, but in the case of rockets it
|
|||
|
is natural to have the rocket's altitude as the $z$-coordinate.
|
|||
|
|
|||
|
Since the wind is assumed to be unidirectional and the Coriolis effect
|
|||
|
is ignored, it may be assumed that the wind is directed along the
|
|||
|
$x$-axis. The angle of the launch rod may then be positioned relative
|
|||
|
to the direction of the wind without any loss of generality.
|
|||
|
|
|||
|
Determining the orientation of a rocket is more complicated. A
|
|||
|
natural choise for defining the orientation would be to use the
|
|||
|
spherical coordinate zenith and azimuth angles $(\theta, \phi)$ and an
|
|||
|
additional roll angle parameter. Another choise common in aviation is
|
|||
|
to use {\it Euler angles}~\cite{wiki-euler-angles}. However, both of
|
|||
|
these systems have notable shortcomings. Both systems have
|
|||
|
singularity points, in which the value of some parameter is
|
|||
|
ambiguous. With spherical coordinates, this is the direction of the
|
|||
|
$z$-axis, in which case the azimuth angle $\phi$ has no effect on the
|
|||
|
position. Rotations that occur near these points must often be
|
|||
|
handled as special cases. Furthermore, rotations in spherical
|
|||
|
coordinate systems contain complex trigonometric formulae which are
|
|||
|
prone to programming errors.
|
|||
|
|
|||
|
The solution to the singularity problem is to introduce an extra
|
|||
|
parameter and an additional constraint to the system. For example,
|
|||
|
the direction of a rocket could be defined by a three-dimensional unit
|
|||
|
vector $(x,y,z)$ instead of just the zenith and azimuth angles. The
|
|||
|
additional constraint is that the vector must be of unit length. This
|
|||
|
kind of representation has no singularity points which would require
|
|||
|
special consideration.
|
|||
|
|
|||
|
Furthermore, Euler's rotation theorem states that a rigid body can be
|
|||
|
rotated from any orientation to any other orientation by a single
|
|||
|
rotation around a specific axis~\cite{wiki-euler-rotation-theorem}.
|
|||
|
Therefore instead of defining quantities that define the orientation
|
|||
|
of the rocket we can define a three-dimensional rotation that rotates
|
|||
|
the rocket from a known reference orientation to the current
|
|||
|
orientation. This has the additional advantage that the same rotation
|
|||
|
and its inverse can be used to transform any vector between world
|
|||
|
coordinates and rocket coordinates.
|
|||
|
|
|||
|
A simple and efficient way of descibing the 3D rotation is by using
|
|||
|
{\it unit quaternions}. Each unit quaternion corresponds to a unique
|
|||
|
3D rotation, and they are remarkably simple to combine and use. The
|
|||
|
following section will present a brief overview of the properties of
|
|||
|
quaternions.
|
|||
|
|
|||
|
The fixed reference orientation of the rocket defines the rocket
|
|||
|
pointing towards the positive $z$-axis in world coordinates and an
|
|||
|
arbitrary but fixed roll angle. The orientation of the rocket is then
|
|||
|
stored as a unit quaternion that rotates the rocket from this
|
|||
|
reference orientation to its current orientation.
|
|||
|
This rotation can also be used to transform vectors from world
|
|||
|
coordinates to rocket coordinates and its inverse from rocket
|
|||
|
coordinates to world coordinates. (Note that the rocket's initial
|
|||
|
orientation on the launch pad may already be different than its
|
|||
|
reference orientation if the launch rod is not completely vertical.)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\subsection{Quaternions}
|
|||
|
|
|||
|
{\it Quaternions} are an extension of complex numbers into four
|
|||
|
dimensions. The usefulness of quaternions arises from their use in
|
|||
|
spatial rotations. Similar to the way multiplication with a complex
|
|||
|
number of unit length $e^{i\phi}$ corresponds to a rotation of angle
|
|||
|
$\phi$ around the origin on the complex plane, multiplication with
|
|||
|
unit quaternions correspond to specific 3D rotations around an axis.
|
|||
|
A more thorough review of quaternions and their use in spatial
|
|||
|
rotations is available in Wikipedia~\cite{wiki-quaternion-rotations}.
|
|||
|
|
|||
|
The typical notation of quaternions resembles the addition of a scalar
|
|||
|
and a vector:
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
q = w + x\vi + y\vj + z\vk = w + \vect v
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
Addition of quaternions and multiplication with a scalar operate as
|
|||
|
expected. However, the multiplication of two quaternions is
|
|||
|
non-commutative (in general $ab \neq ba$) and follows the rules
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\vi^2 = \vj^2 = \vk^2 = \vi\vj\vk = -1.
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
As a corollary, the following equations hold:
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\begin{array}{rl}
|
|||
|
\vi\vj = \vk \hspace{15mm}& \vj\vi = -\vk \\
|
|||
|
\vj\vk = \vi \hspace{15mm}& \vk\vj = -\vi \\
|
|||
|
\vk\vi = \vj \hspace{15mm}& \vi\vk = -\vj
|
|||
|
\end{array}
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
The general multiplication of two quaternions becomes
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\begin{array}{rl}
|
|||
|
(a + b\vi + c\vj + d\vk)(w + x\vi + y\vj + z\vk)\;\; =
|
|||
|
& (aw-bx-cy-dz) \\
|
|||
|
& + (ax+bw+cz-dy)\;\vi \\
|
|||
|
& + (ay-bz+cw+dx)\;\vj \\
|
|||
|
& + (az+by-cx+dw)\;\vk
|
|||
|
\end{array}
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
while the norm of a quaternion is defined in the normal manner
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
|q| = \sqrt{w^2+x^2+y^2+z^2}.
|
|||
|
\end{equation}
|
|||
|
|
|||
|
The usefulness of quaternions becomes evident when we consider a
|
|||
|
rotation around a vector $\vect u$, $|\vect u|=1$ by an angle $\phi$.
|
|||
|
Let
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
q = \cos\frac{\phi}{2} + \vect u \sin\frac{\phi}{2}.
|
|||
|
\label{eq-rotation-quaternion}
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
Now the previously mentioned rotation of a three-dimensional vector
|
|||
|
$\vect v$ defined by $\vi$, $\vj$ and $\vk$ is equivalent to the
|
|||
|
quaternion product
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\vect v \mapsto q\vect v q^{-1}.
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
Similarly, the inverse rotation is equivalent to the transformation
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\vect v \mapsto q^{-1} \vect v q.
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
The problem simplifies even further, since for unit quaternions
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
q^{-1} = (w + x\vi + y\vj + z\vk)^{-1} = w - x\vi - y\vj - z\vk.
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
Vectors can therefore be considered quaternions with no scalar
|
|||
|
component and their rotation is equivalent to the left- and right-sided
|
|||
|
multiplication with unit quaternions, requiring a total of 24
|
|||
|
floating-point multiplications. Even if this does not make the
|
|||
|
rotations more efficient, it simplifies the trigonometry considerably
|
|||
|
and therefore helps reduce programming errors.
|
|||
|
|
|||
|
|
|||
|
\subsection{Mass and moment of inertia calculations}
|
|||
|
\label{sec-mass-inertia}
|
|||
|
|
|||
|
Converting the forces and moments into linear and angluar acceleration
|
|||
|
requires knowledge of the rocket's mass and moments of inertia. The
|
|||
|
mass of a component can be easily calculated from its volume and
|
|||
|
density. Due to the highly symmetrical nature of rockets, the rocket
|
|||
|
centerline is commonly a principal axis for the moments of inertia.
|
|||
|
Furthermore, the moments of inertia around the in the $y$- and
|
|||
|
$z$-axes are very close to one another. Therefore as a simplification
|
|||
|
only two moments of inertia are calculated, the longitudal and
|
|||
|
rotational moment of inertia. These can be easily calculated for each
|
|||
|
component using standard formulae~\cite{wiki-moments-of-inertia} and
|
|||
|
combined to yield the moments of the entire rocket.
|
|||
|
|
|||
|
This is a good way of calculating the mass, CG and inertia of a rocket
|
|||
|
during the design phase. However, actual rocket components often have
|
|||
|
a slightly different density or additional sources of mass such as
|
|||
|
glue attached to them. These cannot be effectively modeled by the
|
|||
|
simulator, since it would be extremely tedious to define all these
|
|||
|
properties. Instead, some properties of the components can be
|
|||
|
overridden to utilize measured values.
|
|||
|
|
|||
|
Two properties that can very easily be measured are the mass and
|
|||
|
CG position of a component. Measuring the moments of inertia is a
|
|||
|
much harder task. Therefore the moments of inertia are still computed
|
|||
|
automatically, but are scaled by the overridden measurement values.
|
|||
|
|
|||
|
If the mass of a component is overridden by a measured value, the
|
|||
|
moments of inertia are scaled linearly according to the mass. This
|
|||
|
assumes that the extra weight is distributed evenly along the
|
|||
|
component. If the CG position is overridden, there is no knowledge
|
|||
|
where the extra weight is at. Therefore as a best guess the moments
|
|||
|
of inertia are updated by shifting the moment axis according to the
|
|||
|
parallel axis theorem.
|
|||
|
|
|||
|
As the components are computed individually and then combined, the
|
|||
|
overriding can take place either for individual components or larger
|
|||
|
combinations. It is especially useful is to override the mass and/or CG
|
|||
|
position of the entire rocket. This allows constructing a rocket from
|
|||
|
components whose masses are not precisely known and afterwards scaling
|
|||
|
the moments of inertia to closely match true values.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\subsection{Flight simulation}
|
|||
|
|
|||
|
The process of simulating rocket flight can be broken down into the
|
|||
|
following steps:
|
|||
|
|
|||
|
\begin{enumerate}
|
|||
|
\setcounter{enumi}{-1}
|
|||
|
\item Initialize the rocket in a known position and orientation at
|
|||
|
time $t=0$.
|
|||
|
\item Compute the local wind velocity and other atmospheric conditions.
|
|||
|
\item Compute the current airspeed, angle of attack, lateral wind
|
|||
|
direction and other flight parameters.
|
|||
|
\item Compute the aerodynamic forces and moments affecting the rocket.
|
|||
|
\item Compute the effect of motor thrust and gravity.
|
|||
|
\item Compute the mass and moments of inertia of the rocket and from
|
|||
|
these the linear and rotational acceleration of the rocket.
|
|||
|
\item Numerically integrate the acceleration to the rocket's position
|
|||
|
and orientation during a time step $\Delta t$ and update the current
|
|||
|
time $t \mapsto t+\Delta t$.
|
|||
|
\end{enumerate}
|
|||
|
|
|||
|
Steps 1--6 are repeated until an end criteria is met, typically until
|
|||
|
the rocket has landed.
|
|||
|
|
|||
|
The computation of the atmospheric properties and instantaneous wind
|
|||
|
velocity were discussed in Section~\ref{sec-atmospheric-properties}.
|
|||
|
The local wind velocity is added to the rocket velocity to get the
|
|||
|
airspeed velocity of the rocket. By inverse rotation this quantity is
|
|||
|
obtained in rocket coordinates, from which the angle of attack and
|
|||
|
other flight parameters can be computed.
|
|||
|
|
|||
|
After the instantaneous flight parameters are known, the aerodynamic
|
|||
|
forces can be computed as discussed in
|
|||
|
Chapter~\ref{chap-aerodynamics}. The computed forces are in the
|
|||
|
rocket coordinates, and can be converted to world coordinates by
|
|||
|
applying the orientation rotation. The thrust from the motors is
|
|||
|
similarly calculated from the thrust curves and converted to world
|
|||
|
coordinates, while the direction of gravity is already in world
|
|||
|
coordinates. When all of the the forces and moments acting upon the
|
|||
|
rocket are known, the linear and rotational accelerations can be
|
|||
|
calculated using the mass and moments of inertia discussed in
|
|||
|
Section~\ref{sec-mass-inertia}.
|
|||
|
|
|||
|
The numerical integration is performed using the Runge-Kutta~4 (RK4)
|
|||
|
integration method. In order to simulate the differential equations
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\begin{split}
|
|||
|
x''(t) &= a(t) \\
|
|||
|
\phi''(t) &= \alpha(t)
|
|||
|
\end{split}
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
the equation is first divided into first-order equations using the
|
|||
|
substitutions $v(t)=x'(t)$ and $\omega(t)=\phi'(t)$:
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\begin{split}
|
|||
|
v'(t) &= a(t) \\
|
|||
|
x'(t) &= v(t) \\
|
|||
|
\omega'(t) &= \alpha(t) \\
|
|||
|
\phi'(t) &= \omega(t)
|
|||
|
\end{split}
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
For brevity, this is presented in the first order representation
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
y' = f(y,\; t)
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
where $y$ is a vector function containing the position and orientation
|
|||
|
of the rocket.
|
|||
|
|
|||
|
Next the right-hand side is evaluated at four positions, dependent on
|
|||
|
the previous evaluations:
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\begin{split}
|
|||
|
k_1 &= f(y_0,\; t_0) \\
|
|||
|
k_2 &= f(y_0 + k_1\:\mbox{$\frac{\Delta t}{2}$},\;
|
|||
|
t_0 + \mbox{$\frac{\Delta t}{2}$}) \\
|
|||
|
k_3 &= f(y_0 + k_2\:\mbox{$\frac{\Delta t}{2}$},\;
|
|||
|
t_0 + \mbox{$\frac{\Delta t}{2}$}) \\
|
|||
|
k_4 &= f(y_0 + k_3\:\Delta t,\; t_0 + \Delta t)
|
|||
|
\end{split}
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
Finally, the result is a weighted sum of these values:
|
|||
|
%
|
|||
|
\begin{align}
|
|||
|
y_1 &= y_0 + \frac{1}{6}\left(k_1+2k_2+2k_3+k_4\right)\,\Delta t \\
|
|||
|
t_1 &= t_0 + \Delta t
|
|||
|
\end{align}
|
|||
|
|
|||
|
Computing the values $k_1\ldots k_4$ involves performing steps~1--5
|
|||
|
four times per simulation iteration, but results in significantly
|
|||
|
better simulation precision. The method is a fourth-order integration
|
|||
|
method, meaning that the error incurred during one simulation step is
|
|||
|
of the order $O(\Delta t^5)$ and of the total simulation
|
|||
|
$O(\Delta t^4)$. This is a considerable improvement
|
|||
|
over, for example, simple Euler integration, which has a total error
|
|||
|
of the order $O(\Delta t)$. Halving the time step in an Euler
|
|||
|
integration only halves the total error, but reduces the error of a
|
|||
|
RK4 simulation 16-fold.
|
|||
|
|
|||
|
The example above used a total rotation vector $\phi$ to contain the
|
|||
|
orientation of the rocket. Instead, this is replaced by the rotation
|
|||
|
quaternion, which can be utilized directly as a transformation between
|
|||
|
world and rocket coordinates. Instead of updating the total rotation
|
|||
|
vector,
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
\phi_1 = \phi_0 + \omega\,\Delta t,
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
the orientation quaternion $o$ is updated by the same amount by
|
|||
|
%
|
|||
|
\begin{equation}
|
|||
|
o_1 = \del{\cos\del{|\omega|\,\Delta t} +
|
|||
|
\hat\omega\sin\del{|\omega|\,\Delta t}} \cdot o_0.
|
|||
|
\end{equation}
|
|||
|
%
|
|||
|
The first term is simply the unit quaternion corresponding to the
|
|||
|
3D rotation $\omega\,\Delta t$ as in
|
|||
|
equation~(\ref{eq-rotation-quaternion}). It is applied to the
|
|||
|
previous value $o_0$ by multiplying the quaternion from the left.
|
|||
|
This update is performed both during the calculation of
|
|||
|
$k_2\ldots k_4$ and when computing the final step result. Finally, in
|
|||
|
order to improve numerical stability, the quaternion is normalized to
|
|||
|
unit length.
|
|||
|
|
|||
|
Since most of a rocket's flight occurs in a straight line, rather
|
|||
|
large time steps can be utilized. However, the rocket may encounter
|
|||
|
occasional oscillation, which may affect its flight notably.
|
|||
|
Therefore the time step utilized is dynamically reduced in cases where
|
|||
|
the angular velocity or angular acceleration exceeds a predefined
|
|||
|
limit. This allows utilizing reasonably large time steps for most of
|
|||
|
the flight, while maintaining the accuracy during oscillation.
|
|||
|
|
|||
|
|
|||
|
\subsection{Recovery simulation}
|
|||
|
|
|||
|
All model rockets must have some recovery system for safe landing.
|
|||
|
This is typically done either using a parachute or a streamer. When a
|
|||
|
parachute is deployed the rocket typically splits in half, and it is
|
|||
|
no longer practical to compute the orientation of the rocket.
|
|||
|
Therefore at this point the simulation changes to a simpler, three
|
|||
|
degree of freedom simulation, where only the position of the rocket is
|
|||
|
computed.
|
|||
|
|
|||
|
The entire drag coefficient of the rocket is assumed to come from the
|
|||
|
deployed recovery devices. For parachutes the drag coefficient is
|
|||
|
by default 0.8~\cite[p.~13-23]{hoerner} with the reference area being the
|
|||
|
area of the parachute. The user can also define their own drag
|
|||
|
coefficient.
|
|||
|
|
|||
|
The drag coefficient of streamers depend on the material, width and
|
|||
|
length of the streamer. The drag coefficient and optimization of
|
|||
|
streamers has been an item of much intrest within the rocketry
|
|||
|
community, with competitions being held on streamer descent time
|
|||
|
durations~\cite{streamer-optimization}. In order to estimate the drag
|
|||
|
coefficient of streamers, a series of experiments were perfomed using
|
|||
|
the $40\times40\times120$~cm wind tunnel of
|
|||
|
Pollux~\cite{pollux-wind-tunnel}. The experiments were performed
|
|||
|
using various materials, widths and lengths of streamers and at
|
|||
|
different wind speeds. From these results an empirical formula was
|
|||
|
devised that estimates the drag coefficient of streamers. The
|
|||
|
experimental results and the derivation of the empirical formula are
|
|||
|
presented in Appendix~\ref{app-streamers}. Validation performed with
|
|||
|
an independent set of measurements indicates that the drag coefficient
|
|||
|
is estimated with an accuracy of about 20\%, which translates to a
|
|||
|
descent velocity accuracy within 15\% of the true value.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
\subsection{Simulation events}
|
|||
|
|
|||
|
Numerous different events may cause actions to be taken during a
|
|||
|
rocket's flight. For example in high-power rockets the burnout or
|
|||
|
ignition charge of the first stage's motor may trigger the ignition of
|
|||
|
a second stage motor. Similarly a flight computer may deploy a small
|
|||
|
drogue parachute when apogee is detected and the main parachute is
|
|||
|
deployed later at a predefined lower altitude. To accomodate
|
|||
|
different configurations a simulation event system is used, where
|
|||
|
events may cause other events to be triggered.
|
|||
|
|
|||
|
Table~\ref{tab-simulation-events} lists the available simulation
|
|||
|
events and which of them can be used to trigger motor ignition or recovery
|
|||
|
device deployment. Each trigger event may additionally include a
|
|||
|
delay time. For example, one motor may be configured to ignite at
|
|||
|
launch and a second motor to ignite using a timer at 5 seconds after
|
|||
|
launch. Alternatively, a short delay of 0.5--1 seconds may be used to
|
|||
|
simulate the delay of an ejection charge igniting the upper stage
|
|||
|
motors.
|
|||
|
|
|||
|
The flight events are also stored along with the simulated flight data
|
|||
|
for later analysis. They are also available to the simulation
|
|||
|
listeners, described in Section~\ref{sec-listeners}, to act upon
|
|||
|
specific conditions.
|
|||
|
|
|||
|
\begin{table}
|
|||
|
\caption{Simulation events and the actions they may trigger (motor
|
|||
|
ignition or recovery device deployment).}
|
|||
|
\label{tab-simulation-events}
|
|||
|
%
|
|||
|
\begin{center}
|
|||
|
\begin{tabular}{ll}
|
|||
|
Event description & Triggers \\
|
|||
|
\hline
|
|||
|
Rocket launch at $t=0$ & Ignition, recovery \\
|
|||
|
Motor ignition & None \\
|
|||
|
Motor burnout & Ignition \\
|
|||
|
Motor ejection charge & Ignition, recovery \\
|
|||
|
Launch rod cleared & None \\
|
|||
|
Apogee detected & Recovery \\
|
|||
|
Change in altitude & Recovery \\
|
|||
|
Touchdown after flight & None \\
|
|||
|
Deployment of a recovery device & None \\
|
|||
|
End of simulation & None \\
|
|||
|
\hline
|
|||
|
\end{tabular}
|
|||
|
\end{center}
|
|||
|
\end{table}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|