Simulate an F16 performing a coordinated turn.
The F16 will go unstable due to an unstable longitudinal mode. ------------------------------------------------------------------------ See also ECIToNED, VTToVB, AC, ACBuild, ACInit, ACPlot, DrawAC, HUD, @acstate/acstate.m, Eul2Q, QMult, TimeGUI ------------------------------------------------------------------------
Contents
%-------------------------------------------------------------------------- % Copyright (c) 1997 Princeton Satellite Systems, Inc. % All rights reserved. %-------------------------------------------------------------------------- % Since version 2.0 (ACT) %--------------------------------------------------------------------------
Global for the time GUI
%------------------------ global simulationAction simulationAction = ' ';
Global for the HUD
%------------------- global hUDOutput hUDOutput = struct('pushbutton1',0,'pushbutton2',0,'checkbox1',0,... 'checkbox2',0,'checkbox3',0);
F16 database
%------------- d = ACBuild('F16'); d.theta0 = 0; d.wPlanet = [0;0;0]; d.actuator.name = []; d.aero.name = 'ACAero'; d.engine.name = 'ACEngine'; d.rotor.name = []; d.sensor.name = 'ACSensor'; d.disturb.name = [];
Load the standard atmosphere
%----------------------------- d.atmData = load('AtmData.txt'); d.atmUnits = 'eng';
Control
%--------
d.control.throttle = 0.8349601 + 0.00177955182723;
d.control.elevator = -1.481766 + 0.00136225302829;
d.control.aileron = 0.09553108 - 6.122723107626488e-04;
d.control.rudder = -0.4118124 + 0.00314275758041;
Initial state vector
%--------------------- alpha = 0.23929886303038; beta = 5.066120644138852e-04; vT = 502; v = VTToVB( vT, alpha, beta ); cG = [0.35;0;0]; r = [0;0;0] + [d.equatorialRadiusPlanet;0;0]; eulInit = [1.36428891652801;0.05049248496658;0.23546606115943]; qNEDToB = Eul2Q( eulInit ); qECIToNED = ECIToNED( r, 'quaternion' ); q = QMult( qECIToNED, qNEDToB ); w = [-0.01567467524226;0.29324283670362;0.06118889106375]; wR = 160; engine = 64.12363; mass = 1/1.57e-3; inertia = [9497;55814;63100;0;-982;0]; actuator = []; sensor = []; flex = []; disturb = [];
Initial time and state
%-----------------------
t = 0;
x = acstate( r, q, w, v, wR, mass, inertia, cG, engine, actuator, sensor, flex, disturb );
Initialize the model
%---------------------
dT = 0.1;
nSim = 10/dT;
d = ACInit( x, d );
Set up the HUD
%--------------- dHUD.atmData = d.atmData ; dHUD.atmUnits = 'eng'; cHUD.control = d.control; cHUD.elevatorMax = 90; cHUD.aileronMax = 90; cHUD.rudderMax = 90; cHUD.dT = dT; hHUD = HUD( 'init', dHUD, x, [], cHUD );
Set up the aircraft display
%---------------------------- gF16 = load('gF16'); hF16 = DrawAC( 'init', gF16, x, [], d.atmUnits );
Initialize the plots
%--------------------- plots = [ 'Euler angles';... 'Quaternion ';... 'Angular rate';... 'Position ECI';... 'Velocity ';... 'Alpha ']; dPlot = ACPlot( x, 'init', plots, d, nSim, dT, nSim );
Initialize the time display
%---------------------------- tToGoMem.lastJD = 0; tToGoMem.lastStepsDone = 0; tToGoMem.kAve = 0; [ ratioRealTime, tToGoMem ] = TimeGUI( nSim, 0, tToGoMem, 0, dT, 'F16 Simulation' ); for k = 1:nSim % Display the status message %--------------------------- [ ratioRealTime, tToGoMem ] = TimeGUI( nSim, k, tToGoMem, ratioRealTime, dT ); % HUD information %---------------- hHUD = HUD( 'run', dHUD, x, hHUD, cHUD ); % Plotting %--------- dPlot = ACPlot( x, 'store', dPlot, k ); % 3D Display %----------- hF16 = DrawAC( 'run', gF16, x, hF16, d.atmUnits ); % The simulation %--------------- x = AC( x, t, dT, d ); t = t + dT; % Time control %------------- switch simulationAction case 'pause' pause simulationAction = ' '; case 'stop' return; case 'plot' break; end end TimeGUI('close');
Create the plots
%----------------- ACPlot( x, 'plot', dPlot ); %--------------------------------------