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} | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 |