494 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			494 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| 
 | ||
| 
 | ||
| \chapter{The OpenRocket simulation software}
 | ||
| \label{chap-software}
 | ||
| 
 | ||
| The flight simulation described in the previous chapters was
 | ||
| implemented in the {\it OpenRocket} simulation
 | ||
| software~\cite{openrocket}.  The software was written entirely in Java
 | ||
| for maximum portability between different operating systems.  A
 | ||
| significant amount of effort was put into making the graphical user
 | ||
| interface (UI) robust, intuitive and easy to use.  As of the first
 | ||
| public release the source code contained over 300 classes and over
 | ||
| 47\s000 lines of code (including comments and blank lines).
 | ||
| 
 | ||
| The software was released under the copyleft GNU General Public
 | ||
| License (GPL)~\cite{gnu-gpl}, allowing everybody access to the source code
 | ||
| and permitting use and modification for any purposes.  The only major
 | ||
| restriction placed is that if a modified version is distributed, the
 | ||
| source code for the modifications must also be available under the GNU
 | ||
| GPL.  This ensures that the program stays free and Open Source; a
 | ||
| company cannot simply take the code, enhance it and start selling it
 | ||
| as their own without contributing anything back to the community.
 | ||
| 
 | ||
| In this section the basic architectural designs are discussed and the
 | ||
| main features of the UI are explained.
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| \section{Architectural design}
 | ||
| 
 | ||
| The software has been split into various components within their own
 | ||
| Java packages.  This enables use of the components without needing the
 | ||
| other components.  For example, all of the UI code is within the
 | ||
| \code{gui} package, and the simulation system can be used
 | ||
| independently of it.
 | ||
| 
 | ||
| 
 | ||
| The rocket structure is composed of components, each with their
 | ||
| own class defined within the package \code{rocketcomponent}.  This
 | ||
| provides the base for defining a rocket.  The components are described
 | ||
| in more detail in Section~\ref{sec-rocket-components}.  The simulation
 | ||
| code is separated from the aerodynamic calculation code in the
 | ||
| \code{simulation} and \code{aerodynamics} packages, respectively;
 | ||
| these are discussed in Section~\ref{sec-simulator-calculator}.
 | ||
| 
 | ||
| The package naming convention recommended in the Java Language
 | ||
| Specification is followed~\cite{java-packages}.  Therefore all package
 | ||
| names discussed herein are relative to the package
 | ||
| \url{net.sf.openrocket}.  For example, the rocket components are
 | ||
| defined in the package \url{net.sf.openrocket.rocketcomponent}.
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| \subsection{Rocket components}
 | ||
| \label{sec-rocket-components}
 | ||
| 
 | ||
| The structure of the rocket is split up into {\it components}, for
 | ||
| example nose cones, body tubes and components within the rocket body.
 | ||
| Each component type is defined as a subclass of the abstract
 | ||
| \code{RocketComponent} class.  Each component can contain zero or more
 | ||
| components attached to it, which creates a tree structure containing
 | ||
| the entire rocket design.  The base component of every design is a
 | ||
| \code{Rocket} object, which holds one or more \code{Stage} objects.
 | ||
| These represent the stages of the rocket and hold all of the physical
 | ||
| components.
 | ||
| 
 | ||
| Inheritance has been highly used in the class hierarchy of the
 | ||
| components in order to combine common features of various components.
 | ||
| There are also some abstract classes, such as \code{BodyComponent},
 | ||
| whose sole purpose currently is to allow future extensions.  The
 | ||
| complete component class hierarchy is presented as a UML diagram in
 | ||
| Figure~\ref{fig-rocketcomponent-uml}, and a more detailed description
 | ||
| of each class is presented in Table~\ref{table-rocketcomponents}.
 | ||
| 
 | ||
| \begin{sidewaysfigure}
 | ||
| \centering
 | ||
| \hspace{-1cm}
 | ||
| \epsfig{file=figures/software/rocketcomponents,width=20cm}
 | ||
| \caption{A UML diagram of the rocket component classes.  Abstract
 | ||
|   classes are shown in italics.}
 | ||
| \label{fig-rocketcomponent-uml}
 | ||
| \end{sidewaysfigure}
 | ||
| 
 | ||
| 
 | ||
| \begin{table}
 | ||
| \caption{Descriptions of the rocket component classes and their
 | ||
|   functionality.  Abstract classes are shown in italics.}
 | ||
| \label{table-rocketcomponents}
 | ||
| \sloppy\footnotesize
 | ||
| \vspace{\baselineskip}
 | ||
| \hspace{-5mm}\begin{tabular}{lp{80mm}}
 | ||
| Component class & Description \\
 | ||
| \hline
 | ||
| \code{\textit{RocketComponent}}: &
 | ||
|   The base class of all components,
 | ||
|   including common features such as child component handling. \\
 | ||
| 
 | ||
| \hspace{3mm}\code{Rocket}: &
 | ||
|   The base component of a
 | ||
|   rocket design, provides change event notifications. \\
 | ||
| 
 | ||
| \hspace{3mm}\code{\textit{ComponentAssembly}}: &
 | ||
|   A base component for an assembly of external components.  This could
 | ||
|   in the future be extended to allow multiple rocket bodies next to
 | ||
|   each other. \\
 | ||
| 
 | ||
| \hspace{6mm}\code{Stage}: &
 | ||
|   A separable stage of the rocket. \\
 | ||
| 
 | ||
| \hspace{3mm}\code{\textit{ExternalComponent}}: &
 | ||
|   An external component that has an effect on the aerodynamics of the
 | ||
|   rocket. \\
 | ||
| 
 | ||
| \hspace{6mm}\code{\textit{BodyComponent}}: &
 | ||
|   A portion of the main rocket body, defined in cylindrical coordinates
 | ||
|   by $r = f(x, \theta)$. \\
 | ||
| 
 | ||
| \hspace{9mm}\code{\textit{SymmetricComponent}}: &
 | ||
|   An axisymmetrical body component. \\
 | ||
| 
 | ||
| \hspace{12mm}\code{Transition}: &
 | ||
|   A symmetrical transition (shoulder or boattail). \\
 | ||
| 
 | ||
| \hspace{15mm}\code{NoseCone}: &
 | ||
|   A transition with the initial radius zero. \\
 | ||
| 
 | ||
| \hspace{12mm}\code{BodyTube}: &
 | ||
|   A cylindrical body tube.  Can be used as a motor mount. \\
 | ||
| 
 | ||
| \hspace{6mm}\code{\textit{FinSet}}: &
 | ||
|   A set of one or more fins. \\
 | ||
| 
 | ||
| \hspace{9mm}\code{TrapezoidalFinSet}: &
 | ||
|   A set of trapezoidal fins. \\
 | ||
| 
 | ||
| \hspace{9mm}\code{EllipticalFinSet}: &
 | ||
|   A set of elliptical fins. \\
 | ||
| 
 | ||
| \hspace{9mm}\code{FreeformFinSet}: &
 | ||
|   A set of free-form fins. \\
 | ||
| 
 | ||
| \hspace{6mm}\code{LaunchLug}: &
 | ||
|   A launch lug or rail pin. \\
 | ||
| 
 | ||
| \hspace{3mm}\code{\textit{InternalComponent}}: &
 | ||
|   An internal component that may affect the mass of the rocket but not
 | ||
|   its aerodynamics. \\
 | ||
| 
 | ||
| \hspace{6mm}\code{\textit{StructuralComponent}}: &
 | ||
|   A structural internal component, with specific shape and density. \\
 | ||
| 
 | ||
| \hspace{9mm}\code{\textit{RingComponent}}: &
 | ||
|   A hollow cylindrical component. \\
 | ||
| 
 | ||
| \hspace{12mm}\code{\textit{ThicknessRingComponent}}: &
 | ||
|   A component defined by an outer radius and shell thickness. \\
 | ||
| 
 | ||
| \hspace{15mm}\code{InnerTube}: &
 | ||
|   An inner tube.  Can be used as a motor mount and can be clustered. \\
 | ||
| 
 | ||
| \hspace{15mm}\code{TubeCoupler}: &
 | ||
|   A coupler tube. \\
 | ||
| 
 | ||
| \hspace{15mm}\code{EngineBlock}: &
 | ||
|   An engine block. \\
 | ||
| 
 | ||
| \hspace{12mm}\code{\textit{RadiusRingComponent}}: &
 | ||
|   A component defined by an inner and outer radius. \\
 | ||
| 
 | ||
| \hspace{15mm}\code{CenteringRing}: &
 | ||
|   A ring for centering components. \\
 | ||
| 
 | ||
| \hspace{15mm}\code{Bulkhead}: &
 | ||
|   A solid bulkhead (inner radius zero). \\
 | ||
| 
 | ||
| \hspace{6mm}\code{\textit{MassObject}}: &
 | ||
|   An internal component shaped approximately like a solid cylinder and
 | ||
|   with a specific mass. \\
 | ||
| 
 | ||
| \hspace{9mm}\code{MassComponent}: &
 | ||
|   A generic component with specific mass, for example payload. \\
 | ||
| 
 | ||
| \hspace{9mm}\code{\textit{RecoveryDevice}}: &
 | ||
|   A recovery device. \\
 | ||
| 
 | ||
| \hspace{12mm}\code{Parachute}: &
 | ||
|   A parachute. \\
 | ||
| 
 | ||
| \hspace{12mm}\code{Streamer}: &
 | ||
|   A streamer. \\
 | ||
| 
 | ||
| \hspace{9mm}\code{ShockCord}: &
 | ||
|   A shock cord with a specified material and length. \\
 | ||
| 
 | ||
| \hline
 | ||
| \end{tabular}
 | ||
| \end{table}
 | ||
| 
 | ||
| 
 | ||
| Additionally four interfaces are defined for the components,
 | ||
| \code{MotorMount}, \code{Clusterable}, \code{Radial\-Parent} and
 | ||
| \code{Coaxial}.  Components implementing the \code{Motor\-Mount}
 | ||
| interface, currently \code{Body\-Tube} and \code{Inner\-Tube}, can
 | ||
| function as motor mounts and have motors loaded in them.  The
 | ||
| \code{Clusterable} interface signifies that the component can be
 | ||
| clustered in various configurations.  Currently only the
 | ||
| \code{Inner\-Tube} component can be clustered.  Components and motors
 | ||
| that are attached to a clustered inner tube are automatically
 | ||
| replicated to all tubes within the cluster.  The \code{Radial\-Parent}
 | ||
| interface allows inner components to automatically identify their
 | ||
| correct inner and outer radii based on their parent and sibling
 | ||
| components.  For example, a coupler tube can automatically detect its
 | ||
| radius based on the inner radius of the parent body tube.
 | ||
| \code{Coaxial} on the other hand provides a generic interface for
 | ||
| accessing and modifying properties of fixed-radius components. 
 | ||
| 
 | ||
| 
 | ||
| Since the software functionality is divided into different packages,
 | ||
| all component similarities cannot be directly be exploited through
 | ||
| inheritance.  For example, the method of drawing a nose cone shape
 | ||
| belongs to the \url{gui.rocketfigure} package, however, it can share
 | ||
| the same code that draws a transition.  For these purposes, reflective
 | ||
| programming is used extensively.  The code for drawing both nose cones
 | ||
| and transitions is provided in the class
 | ||
| \code{gui.rocketfigure.SymmetricComponentShapes}, while the simpler
 | ||
| body tube is drawn by the class \code{BodyTubeShapes}.  The correct
 | ||
| class is derived and instantiated dynamically based on the component
 | ||
| class.  This allows easily sharing functionality common to different
 | ||
| components while still having loose coupling between the rocket
 | ||
| structure, presentation, computation and storage methods.
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| \subsection{Aerodynamic calculators and simulators}
 | ||
| \label{sec-simulator-calculator}
 | ||
| 
 | ||
| One of the key aspects in the design of the simulation implementation
 | ||
| was extensibility.  Therefore all aerodynamic calculation code is
 | ||
| separated in the package \code{aerodynamics} and all simulation code
 | ||
| is in the package \code{simulator}.  This allows adding new
 | ||
| implementations of the aerodynamic calculators and simulators
 | ||
| independently.  For example, a simulator using Euler integration was
 | ||
| written in the early stages of development, and later replaced by the
 | ||
| Runge-Kutta~4 simulator.  Similarly, a different method of calculating
 | ||
| the aerodynamic forces, such as CFD, could be implemented and used by
 | ||
| the existing simulators.
 | ||
| 
 | ||
| The basis for all aerodynamic calculations is the interface
 | ||
| \code{Aerodynamic\-Calculator}.  The current implementation, based on
 | ||
| the Barrowman methods, is implemented in the class
 | ||
| \code{Barrowman\-Calculator}.  This implementation caches mid-results
 | ||
| for performance reasons.
 | ||
| 
 | ||
| Flight simulation is split into the
 | ||
| interfaces \code{Simulation\-Engine}, which is responsible for
 | ||
| maintaining the flow of the simulation and handling events (such as
 | ||
| motor ignition), and \code{Simulation\-Stepper}, which is responsible
 | ||
| for taking individual time steps while simulating (using {\it e.g.}
 | ||
| RK4 iteration).
 | ||
| 
 | ||
| Similar abstraction has been performed for the atmospheric temperature
 | ||
| and pressure model with the \code{Atmospheric\-Model} interface, the
 | ||
| gravity model with \code{Gravity\-Model}, the wind modelling with
 | ||
| \code{Wind\-Model} and different rocket motor types by the
 | ||
| \code{Motor} class, among others.
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| \subsection{Simulation listeners}
 | ||
| \label{sec-listeners}
 | ||
| 
 | ||
| Simulation listeners are pieces of code that can dynamically be
 | ||
| configured to listen to and interact with a simulation while it is
 | ||
| running.  The listeners are called before and after each simulation
 | ||
| step, each simulation event and any calculations performed during
 | ||
| flight simulation.  The listeners may simply gather flight data for
 | ||
| use outside the simulation or modify the rocket or simulation during
 | ||
| the flight.  This allows great potential for extensibility both
 | ||
| internally and externally.
 | ||
| 
 | ||
| Listeners are used internally for various purposes such as retrieving
 | ||
| flight progress information when the user is running simulations and
 | ||
| cancelling the simulations when necessary.  Implementing such
 | ||
| functionality otherwise would have required a lot of special case
 | ||
| handling directly within the simulation code.
 | ||
| 
 | ||
| Listeners can also be used to modify the simulation or the rocket
 | ||
| during its flight.  The successor project of Haisun<75><6E>t<EFBFBD> included
 | ||
| an active roll stabilization system, where a flight computer 
 | ||
| measured the roll rate using two magnetometers and used a PID controller
 | ||
| to adjust two auxiliary fins to cancel out any roll produced by
 | ||
| inevitable imperfections in the main fins.  A simulation listener was
 | ||
| written that initially simulated the PID controller purely in Java, which
 | ||
| modified the cant angle of the auxiliary fins during the simulation.
 | ||
| Later a similar listener interfaced the external flight computer
 | ||
| directly using a serial data link.  The listener fed the simulated
 | ||
| flight data to the controller which computed and reported the control
 | ||
| actions back to the simulator.  This system helped identify and fix
 | ||
| numerous bugs in the flight computer software, which would have
 | ||
| otherwise been nearly impossible to fully test.  It is expected that
 | ||
| the simulation listeners will be an invaluable tool for more ambitious
 | ||
| model rocket enthusiasts.
 | ||
| 
 | ||
| A listener is produced by implementing the \code{Simulation\-Listener}
 | ||
| and optionally \code{Simulation\-Event\-Listener} and
 | ||
| \code{Simulation\-Computation\-Listener} interfaces, or by extending
 | ||
| the \code{Abstract\-Simulation\-Listener} class.  The UI includes the
 | ||
| option of defining custom simulation listeners to be utilized during
 | ||
| flight simulation.
 | ||
| 
 | ||
| 
 | ||
| \subsection{Warnings}
 | ||
| \label{sec-warnings}
 | ||
| 
 | ||
| The aerodynamic calculations and simulations are based on certain
 | ||
| assumptions and simplifications, such as a low angle of attack and a
 | ||
| smooth, continuous rocket body.  The rocket component architecture
 | ||
| makes it possible to create designs that break these assumptions.
 | ||
| Instead of limiting the options of the design, the aerodynamic
 | ||
| calculator and simulator can produce warnings about such issues.
 | ||
| These warnings are presented to the user during the design of the
 | ||
| rocket or after simulations.  It is then left up to the user to judge
 | ||
| whether such violations are significant enough to cast doubt to the
 | ||
| validity of the results.
 | ||
| 
 | ||
| 
 | ||
| \subsection{File format}
 | ||
| 
 | ||
| An XML-based file format was devised for storing the rocket designs
 | ||
| and simulations.  The use of XML allows using many existing tools for
 | ||
| reading and writing the files, allows easy extensibility and makes the
 | ||
| files human-readable.  The user has the option of including all
 | ||
| simulated data in the file, storing the data at specific time
 | ||
| intervals or storing only the simulation launch conditions.  To reduce
 | ||
| the file size, the files can additionally be compressed using the
 | ||
| standard GZIP compression algorithm~\cite{GZIP}.  The files are
 | ||
| compressed and uncompressed automatically by the software.  The file
 | ||
| extension .ORK was chosen for the design files, an abbreviation of the
 | ||
| software name that at the same time had no previous uses as a file
 | ||
| extension.
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| \section{User interface design}
 | ||
| 
 | ||
| The user interface was designed with the intent of being robust but
 | ||
| yet easy to use even for inexperienced users.  The main window,
 | ||
| depicted in Figure~\ref{fig-main-window}(a) with the design of the
 | ||
| original Haisun<75><6E>t<EFBFBD> rocket, consists of a schematic drawing of the
 | ||
| rocket, the tree structure of the rocket components and
 | ||
| buttons for adding new components to the structure. Components can
 | ||
| be selected or edited by clicking and double-clicking either the tree
 | ||
| view or the component in the schematic diagram.  The selected
 | ||
| components are drawn in bold to give a visual clue to the position
 | ||
| of the component.
 | ||
| 
 | ||
| The schematic drawing can be viewed either from the side or from the
 | ||
| rear, can be zoomed in and out and rotated along the centerline.  The
 | ||
| schematic diagram view also presents basic information about the
 | ||
| rocket, such as the design name, length, maximum diameter, mass and
 | ||
| possible warnings about the design. It also calculates the CG and CP
 | ||
| positions continuously during design and shows them both numerically
 | ||
| and on the diagram.  Additionally, a simulation is automatically run
 | ||
| in the background after each modification and the main results are
 | ||
| presented in the lower left corner of the diagram.  Many users are
 | ||
| interested in the maximum altitude or velocity of the rocket, and this
 | ||
| allows an immediate feedback on the effect of the changes they are
 | ||
| making to the design.  The flight information typically takes less
 | ||
| than a second to update.
 | ||
| 
 | ||
| The upper part of the main window can also be changed to view
 | ||
| simulation results, Figure~\ref{fig-main-window}(b).  Many simulations
 | ||
| can be added with different launch conditions and motor configurations
 | ||
| to investigate their effects.  Each simulation has a row which
 | ||
| presents the basic information about the simulation.  The first column
 | ||
| gives an immediate visual clue to the status of the simulation; a gray
 | ||
| ball indicates that the simulation has not been run yet, green
 | ||
| indicates an up-to-date simulation, red indicates that the design has
 | ||
| been changed after the simulation was run and yellow indicates that
 | ||
| the simulation information was loaded from a file, but that the file
 | ||
| states it to be up-to-date.  The simulations can be run one or several
 | ||
| at a time.  The software automatically utilizes several threads when
 | ||
| running multiple simulations on a multi-CPU computer to utilize the
 | ||
| full processing capacity.
 | ||
| 
 | ||
| Figure~\ref{fig-various-dialogs} shows two dialogs that are used
 | ||
| to modify and analyze the designs.  The components are edited using a
 | ||
| small dialog window that allows the user to either fill in the exact
 | ||
| numerical values specifying the shape of the component or use sliders
 | ||
| to modify them.  The user can change the units by clicking on them, or
 | ||
| set default values from the preferences.  Different tabs allow control
 | ||
| over the mass and CG override settings, figure color options, motor
 | ||
| mount and cluster options and more.  The Component analysis dialog
 | ||
| shown in the figure can be used to analyze the effect of individual
 | ||
| components on the total stability, drag and roll characteristics of
 | ||
| the rocket.
 | ||
| 
 | ||
| Similarly, the launch conditions and simulator options can be edited
 | ||
| in the corresponding dialog.  The simulator options also allow the
 | ||
| user to define custom simulation listeners to use during the
 | ||
| simulations.  The simulation edit dialog is also used for later data
 | ||
| analysis.  The simulated data can be plotted in a variety of ways as
 | ||
| shown in Figure~\ref{fig-plotting}.  The user can use predefined plot
 | ||
| settings or define their own.  Up to 15 different variables out of the
 | ||
| 47 quantities computed can be plotted at a time.  The variable on the
 | ||
| horizontal axis can be freely selected, and the other variables can be
 | ||
| plotted on one of two vertical axis, on either side of the plot.  The
 | ||
| user can either specify whether a variable should plot on the left or
 | ||
| right axis or let the software decide the most suitable axis.  Typical
 | ||
| plots include the altitude, vertical velocity and acceleration of the
 | ||
| rocket with time or the drag coefficient as a function of the Mach
 | ||
| number.
 | ||
| 
 | ||
| 
 | ||
| \begin{figure}
 | ||
| \hspace{-7mm}
 | ||
| \begin{tabular}{m{1mm}m{10cm}}
 | ||
| \hspace{-5mm}(a) &
 | ||
| \epsfig{file=figures/pix/openrocket-main-haisunaata,scale=0.5} \\
 | ||
| \hspace{-5mm}(b) &
 | ||
| \epsfig{file=figures/pix/openrocket-simulations-haisunaata,scale=0.5}
 | ||
| 
 | ||
| \end{tabular}
 | ||
| \caption{The main design window of OpenRocket; (a) the design
 | ||
|   view and (b) the simulation view.}
 | ||
| \label{fig-main-window}
 | ||
| \end{figure}
 | ||
| 
 | ||
| \begin{figure}
 | ||
| \centering
 | ||
| \epsfig{file=figures/pix/openrocket-dialog-edit,scale=0.5}
 | ||
| \vspace{2cm} \\
 | ||
| \epsfig{file=figures/pix/openrocket-dialog-analysis,scale=0.5}
 | ||
| \vspace{1cm} \\
 | ||
| \caption{Dialog windows for editing the properties of a nose cone
 | ||
|   and for analyzing the influence of individual components on
 | ||
|   the stability, drag and roll characteristics of the rocket.}
 | ||
| \label{fig-various-dialogs}
 | ||
| \end{figure}
 | ||
| 
 | ||
| \begin{figure}
 | ||
| \centering
 | ||
| \epsfig{file=figures/pix/openrocket-dialog-plot-options,scale=0.5}
 | ||
| \vspace{2cm} \\
 | ||
| \epsfig{file=figures/pix/openrocket-dialog-plot,scale=0.5}
 | ||
| \vspace{1cm} \\
 | ||
| \caption{Dialog window for changing the simulation plot options and a
 | ||
|   plot of the simulated flight of the Haisun<75><6E>t<EFBFBD> hybrid rocket.}
 | ||
| \label{fig-plotting}
 | ||
| \end{figure}
 | ||
| 
 | ||
| Advanced users may also export the flight data in CSV format for
 | ||
| further analysis using other tools.
 | ||
| 
 | ||
| %
 | ||
| %\section{Future enhancements}
 | ||
| %
 | ||
| %Numerous features have been planned and taken into account during the
 | ||
| %design of the software.  Below are listed a few of the planned
 | ||
| %features and how they have been taken into account:
 | ||
| %
 | ||
| %{\it Alternative aerodynamic calculators.}  For example CFD could be
 | ||
| %used to calculate the aerodynamic properties, allowing even better
 | ||
| %simulation accuracy.  The calculators have been abstracted by the
 | ||
| %\code{AerodynamicCalculator} interface so they can easily be
 | ||
| %interchanged.
 | ||
| %
 | ||
| %{\it Alternative simulators.}  These could take into account for
 | ||
| %example the curvature of the Earth and include the Coriolis effect.
 | ||
| %New simulators can be created by implementing the
 | ||
| %\code{Simulation\-Stepper} interface.
 | ||
| %
 | ||
| %{\it Export and import of flight data.}  The simulated data could be
 | ||
| %exported for further analysis as comma separated values (CSV).
 | ||
| %Similarly, experimental data could be imported either from files or
 | ||
| %directly from altimeters.  Support for imported data already exists in
 | ||
| %the core functionalities.
 | ||
| %
 | ||
| %{\it Importing database files.}  The motor database is easily
 | ||
| %extendable to read external thrust curves.  Also data of commercially
 | ||
| %available rocket components could be imported and available in the
 | ||
| %component edit dialog.
 | ||
| %
 | ||
| %{\it Further UI enhancements.}  These could include for example a 3D
 | ||
| %view of the rocket, an animation of the rocket flight, a ``wizard''
 | ||
| %dialog for easily creating new designs, {\it etc.}
 | ||
| %
 |