2000-11-03 23:02:47 +00:00
|
|
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-02-11 21:05:34 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
Module: FGState.cpp
|
|
|
|
Author: Jon Berndt
|
|
|
|
Date started: 11/17/98
|
|
|
|
Called by: FGFDMExec and accessed by all models.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
------------- Copyright (C) 1999 Jon S. Berndt (jsb@hal-pc.org) -------------
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
This program is free software; you can redistribute it and/or modify it under
|
|
|
|
the terms of the GNU General Public License as published by the Free Software
|
|
|
|
Foundation; either version 2 of the License, or (at your option) any later
|
|
|
|
version.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
|
|
details.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
|
|
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
|
|
Place - Suite 330, Boston, MA 02111-1307, USA.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
Further information about the GNU General Public License can also be found on
|
|
|
|
the world wide web at http://www.gnu.org.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
FUNCTIONAL DESCRIPTION
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
See header file.
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
HISTORY
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
11/17/98 JSB Created
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-02-05 21:26:01 +00:00
|
|
|
INCLUDES
|
2000-11-03 23:02:47 +00:00
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
1999-02-05 21:26:01 +00:00
|
|
|
|
1999-02-26 22:09:10 +00:00
|
|
|
#ifdef FGFS
|
2000-02-15 03:30:01 +00:00
|
|
|
# include <simgear/compiler.h>
|
2001-06-05 20:58:48 +00:00
|
|
|
# include <math.h>
|
1999-02-26 22:09:10 +00:00
|
|
|
#else
|
2001-10-05 20:19:59 +00:00
|
|
|
# if defined(sgi) && !defined(__GNUC__)
|
|
|
|
# include <math.h>
|
|
|
|
# else
|
|
|
|
# include <cmath>
|
|
|
|
# endif
|
2000-10-02 23:07:30 +00:00
|
|
|
#endif
|
2000-07-06 21:02:46 +00:00
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
#include "FGState.h"
|
|
|
|
|
2001-03-30 01:04:50 +00:00
|
|
|
static const char *IdSrc = "$Id$";
|
2000-10-14 02:10:10 +00:00
|
|
|
static const char *IdHdr = ID_STATE;
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
MACROS
|
2000-11-03 23:02:47 +00:00
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
2000-10-02 23:07:30 +00:00
|
|
|
|
|
|
|
#define RegisterVariable(ID,DEF) coeffdef[#ID] = ID; paramdef[ID] = DEF
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
CLASS IMPLEMENTATION
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
//
|
|
|
|
// For every term registered here there must be a corresponding handler in
|
|
|
|
// GetParameter() below that retrieves that parameter. Also, there must be an
|
|
|
|
// entry in the enum eParam definition in FGDefs.h. The ID is what must be used
|
|
|
|
// in any config file entry which references that item.
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2000-04-24 23:49:06 +00:00
|
|
|
FGState::FGState(FGFDMExec* fdex) : mTb2l(3,3),
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
mTl2b(3,3),
|
|
|
|
mTs2b(3,3),
|
2001-03-30 01:04:50 +00:00
|
|
|
vQtrn(4),
|
2001-04-17 21:19:54 +00:00
|
|
|
vlastQdot(4),
|
|
|
|
vQdot(4),
|
|
|
|
vTmp(4),
|
2001-10-05 20:19:59 +00:00
|
|
|
vEuler(3),
|
|
|
|
vUVW(3),
|
|
|
|
vLocalVelNED(3),
|
|
|
|
vLocalEuler(3)
|
2000-05-27 05:48:14 +00:00
|
|
|
{
|
1999-02-11 21:05:34 +00:00
|
|
|
FDMExec = fdex;
|
|
|
|
|
1999-02-05 21:26:01 +00:00
|
|
|
a = 1000.0;
|
2000-01-10 21:07:00 +00:00
|
|
|
sim_time = 0.0;
|
|
|
|
dt = 1.0/120.0;
|
2001-03-30 01:04:50 +00:00
|
|
|
ActiveEngine = -1;
|
2001-04-17 21:19:54 +00:00
|
|
|
|
2001-06-05 20:58:48 +00:00
|
|
|
Aircraft = FDMExec->GetAircraft();
|
|
|
|
Translation = FDMExec->GetTranslation();
|
|
|
|
Rotation = FDMExec->GetRotation();
|
|
|
|
Position = FDMExec->GetPosition();
|
|
|
|
FCS = FDMExec->GetFCS();
|
|
|
|
Output = FDMExec->GetOutput();
|
|
|
|
Atmosphere = FDMExec->GetAtmosphere();
|
|
|
|
Aerodynamics = FDMExec->GetAerodynamics();
|
2001-10-29 19:00:24 +00:00
|
|
|
GroundReactions = FDMExec->GetGroundReactions();
|
2001-10-30 02:51:13 +00:00
|
|
|
Propulsion = FDMExec->GetPropulsion();
|
2001-04-17 21:19:54 +00:00
|
|
|
|
2001-03-30 01:04:50 +00:00
|
|
|
RegisterVariable(FG_TIME, " time " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_QBAR, " qbar " );
|
|
|
|
RegisterVariable(FG_WINGAREA, " wing_area " );
|
|
|
|
RegisterVariable(FG_WINGSPAN, " wingspan " );
|
|
|
|
RegisterVariable(FG_CBAR, " cbar " );
|
|
|
|
RegisterVariable(FG_ALPHA, " alpha " );
|
|
|
|
RegisterVariable(FG_ALPHADOT, " alphadot " );
|
|
|
|
RegisterVariable(FG_BETA, " beta " );
|
|
|
|
RegisterVariable(FG_BETADOT, " betadot " );
|
2001-04-17 21:19:54 +00:00
|
|
|
RegisterVariable(FG_PHI, " roll_angle " );
|
|
|
|
RegisterVariable(FG_THT, " pitch_angle " );
|
|
|
|
RegisterVariable(FG_PSI, " heading_angle " );
|
2001-03-30 01:04:50 +00:00
|
|
|
RegisterVariable(FG_PITCHRATE, " pitch_rate " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_ROLLRATE, " roll_rate " );
|
|
|
|
RegisterVariable(FG_YAWRATE, " yaw_rate " );
|
2001-04-17 21:19:54 +00:00
|
|
|
RegisterVariable(FG_CL_SQRD, " Clift_sqrd " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_MACH, " mach " );
|
|
|
|
RegisterVariable(FG_ALTITUDE, " altitude " );
|
|
|
|
RegisterVariable(FG_BI2VEL, " BI2Vel " );
|
|
|
|
RegisterVariable(FG_CI2VEL, " CI2Vel " );
|
|
|
|
RegisterVariable(FG_ELEVATOR_POS, " elevator_pos " );
|
|
|
|
RegisterVariable(FG_AILERON_POS, " aileron_pos " );
|
|
|
|
RegisterVariable(FG_RUDDER_POS, " rudder_pos " );
|
|
|
|
RegisterVariable(FG_SPDBRAKE_POS, " speedbrake_pos " );
|
|
|
|
RegisterVariable(FG_SPOILERS_POS, " spoiler_pos " );
|
|
|
|
RegisterVariable(FG_FLAPS_POS, " flaps_pos " );
|
|
|
|
RegisterVariable(FG_ELEVATOR_CMD, " elevator_cmd " );
|
|
|
|
RegisterVariable(FG_AILERON_CMD, " aileron_cmd " );
|
|
|
|
RegisterVariable(FG_RUDDER_CMD, " rudder_cmd " );
|
|
|
|
RegisterVariable(FG_SPDBRAKE_CMD, " speedbrake_cmd " );
|
|
|
|
RegisterVariable(FG_SPOILERS_CMD, " spoiler_cmd " );
|
|
|
|
RegisterVariable(FG_FLAPS_CMD, " flaps_cmd " );
|
|
|
|
RegisterVariable(FG_THROTTLE_CMD, " throttle_cmd " );
|
|
|
|
RegisterVariable(FG_THROTTLE_POS, " throttle_pos " );
|
2001-10-30 02:51:13 +00:00
|
|
|
RegisterVariable(FG_MIXTURE_CMD, " mixture_cmd " );
|
|
|
|
RegisterVariable(FG_MIXTURE_POS, " mixture_pos " );
|
|
|
|
RegisterVariable(FG_MAGNETO_CMD, " magneto_cmd " );
|
|
|
|
RegisterVariable(FG_STARTER_CMD, " starter_cmd " );
|
2001-03-30 01:04:50 +00:00
|
|
|
RegisterVariable(FG_ACTIVE_ENGINE, " active_engine " );
|
2000-10-02 23:07:30 +00:00
|
|
|
RegisterVariable(FG_HOVERB, " height/span " );
|
2001-03-30 01:04:50 +00:00
|
|
|
RegisterVariable(FG_PITCH_TRIM_CMD, " pitch_trim_cmd " );
|
2001-04-05 21:14:37 +00:00
|
|
|
RegisterVariable(FG_LEFT_BRAKE_CMD, " left_brake_cmd " );
|
|
|
|
RegisterVariable(FG_RIGHT_BRAKE_CMD," right_brake_cmd ");
|
|
|
|
RegisterVariable(FG_CENTER_BRAKE_CMD," center_brake_cmd ");
|
2001-10-05 20:19:59 +00:00
|
|
|
RegisterVariable(FG_ALPHAH, " h-tail alpha " );
|
|
|
|
RegisterVariable(FG_ALPHAW, " wing alpha " );
|
|
|
|
RegisterVariable(FG_LBARH, " h-tail arm " );
|
|
|
|
RegisterVariable(FG_LBARV, " v-tail arm " );
|
|
|
|
RegisterVariable(FG_HTAILAREA, " h-tail area " );
|
|
|
|
RegisterVariable(FG_VTAILAREA, " v-tail area " );
|
|
|
|
RegisterVariable(FG_VBARH, " h-tail volume " );
|
|
|
|
RegisterVariable(FG_VBARV, " v-tail volume " );
|
2001-04-06 22:59:31 +00:00
|
|
|
RegisterVariable(FG_SET_LOGGING, " data_logging " );
|
2001-03-30 01:04:50 +00:00
|
|
|
|
|
|
|
if (debug_lvl & 2) cout << "Instantiated: FGState" << endl;
|
1999-02-05 21:26:01 +00:00
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2001-03-30 01:04:50 +00:00
|
|
|
FGState::~FGState()
|
|
|
|
{
|
|
|
|
if (debug_lvl & 2) cout << "Destroyed: FGState" << endl;
|
|
|
|
}
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
|
|
|
|
float FGState::GetParameter(eParam val_idx) {
|
2001-04-17 21:19:54 +00:00
|
|
|
float scratch;
|
|
|
|
|
2000-10-02 23:07:30 +00:00
|
|
|
switch(val_idx) {
|
2001-03-30 01:04:50 +00:00
|
|
|
case FG_TIME:
|
|
|
|
return sim_time;
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_QBAR:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->Getqbar();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_WINGAREA:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Aircraft->GetWingArea();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_WINGSPAN:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Aircraft->GetWingSpan();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_CBAR:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Aircraft->Getcbar();
|
2001-10-05 20:19:59 +00:00
|
|
|
case FG_LBARH:
|
|
|
|
return Aircraft->Getlbarh();
|
|
|
|
case FG_LBARV:
|
|
|
|
return Aircraft->Getvbarh();
|
|
|
|
case FG_HTAILAREA:
|
|
|
|
return Aircraft->GetHTailArea();
|
|
|
|
case FG_VTAILAREA:
|
|
|
|
return Aircraft->GetVTailArea();
|
|
|
|
case FG_VBARH:
|
|
|
|
return Aircraft->Getvbarh();
|
|
|
|
case FG_VBARV:
|
|
|
|
return Aircraft->Getvbarv();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ALPHA:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->Getalpha();
|
2001-10-05 20:19:59 +00:00
|
|
|
case FG_ALPHAW:
|
|
|
|
return Translation->Getalpha() + Aircraft->GetWingIncidence();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ALPHADOT:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->Getadot();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_BETA:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->Getbeta();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_BETADOT:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->Getbdot();
|
|
|
|
case FG_PHI:
|
|
|
|
return Rotation->Getphi();
|
|
|
|
case FG_THT:
|
|
|
|
return Rotation->Gettht();
|
|
|
|
case FG_PSI:
|
|
|
|
return Rotation->Getpsi();
|
2001-03-30 01:04:50 +00:00
|
|
|
case FG_PITCHRATE:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Rotation->GetPQR(eQ);
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ROLLRATE:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Rotation->GetPQR(eP);
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_YAWRATE:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Rotation->GetPQR(eR);
|
|
|
|
case FG_CL_SQRD:
|
|
|
|
if (Translation->Getqbar() > 0.00)
|
2001-06-05 20:58:48 +00:00
|
|
|
scratch = Aerodynamics->GetvLastFs(eLift)/(Aircraft->GetWingArea()*Translation->Getqbar());
|
2001-04-17 21:19:54 +00:00
|
|
|
else
|
|
|
|
scratch = 0.0;
|
|
|
|
return scratch*scratch;
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ELEVATOR_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDePos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_AILERON_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDaPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_RUDDER_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDrPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_SPDBRAKE_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDsbPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_SPOILERS_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDspPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_FLAPS_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDfPos();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ELEVATOR_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDeCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_AILERON_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDaCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_RUDDER_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDrCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_SPDBRAKE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDsbCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_SPOILERS_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDspCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_FLAPS_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetDfCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_MACH:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Translation->GetMach();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_ALTITUDE:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Position->Geth();
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_BI2VEL:
|
2001-04-17 21:19:54 +00:00
|
|
|
if(Translation->GetVt() > 0)
|
|
|
|
return Aircraft->GetWingSpan()/(2.0 * Translation->GetVt());
|
2000-10-02 23:07:30 +00:00
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
case FG_CI2VEL:
|
2001-04-17 21:19:54 +00:00
|
|
|
if(Translation->GetVt() > 0)
|
|
|
|
return Aircraft->Getcbar()/(2.0 * Translation->GetVt());
|
2000-10-02 23:07:30 +00:00
|
|
|
else
|
|
|
|
return 0;
|
|
|
|
case FG_THROTTLE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
if (ActiveEngine < 0) return FCS->GetThrottleCmd(0);
|
|
|
|
else return FCS->GetThrottleCmd(ActiveEngine);
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_THROTTLE_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
if (ActiveEngine < 0) return FCS->GetThrottlePos(0);
|
|
|
|
else return FCS->GetThrottlePos(ActiveEngine);
|
2001-10-30 02:51:13 +00:00
|
|
|
case FG_MAGNETO_CMD:
|
|
|
|
if (ActiveEngine < 0) return Propulsion->GetEngine(0)->GetMagnetos();
|
|
|
|
else return Propulsion->GetEngine(ActiveEngine)->GetMagnetos();
|
|
|
|
case FG_STARTER_CMD:
|
|
|
|
if (ActiveEngine < 0) {
|
|
|
|
if (Propulsion->GetEngine(0)->GetStarter()) return 1.0;
|
|
|
|
else return 0.0;
|
|
|
|
} else {
|
|
|
|
if (Propulsion->GetEngine(ActiveEngine)->GetStarter()) return 1.0;
|
|
|
|
else return 0.0;
|
|
|
|
}
|
|
|
|
case FG_MIXTURE_CMD:
|
|
|
|
if (ActiveEngine < 0) return FCS->GetMixtureCmd(0);
|
|
|
|
else return FCS->GetMixtureCmd(ActiveEngine);
|
|
|
|
case FG_MIXTURE_POS:
|
|
|
|
if (ActiveEngine < 0) return FCS->GetMixturePos(0);
|
|
|
|
else return FCS->GetMixturePos(ActiveEngine);
|
2000-10-02 23:07:30 +00:00
|
|
|
case FG_HOVERB:
|
2001-04-17 21:19:54 +00:00
|
|
|
return Position->GetHOverB();
|
2001-03-30 01:04:50 +00:00
|
|
|
case FG_PITCH_TRIM_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
return FCS->GetPitchTrimCmd();
|
2000-10-02 23:07:30 +00:00
|
|
|
default:
|
2001-10-30 02:51:13 +00:00
|
|
|
cerr << "FGState::GetParameter() - No handler for parameter " << paramdef[val_idx] << endl;
|
2000-10-02 23:07:30 +00:00
|
|
|
return 0.0;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
|
|
|
|
float FGState::GetParameter(string val_string) {
|
|
|
|
return GetParameter(coeffdef[val_string]);
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
|
|
|
|
eParam FGState::GetParameterIndex(string val_string) {
|
|
|
|
return coeffdef[val_string];
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-10-02 23:07:30 +00:00
|
|
|
|
|
|
|
void FGState::SetParameter(eParam val_idx, float val) {
|
|
|
|
switch(val_idx) {
|
|
|
|
case FG_ELEVATOR_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDePos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_AILERON_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDaPos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_RUDDER_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDrPos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_SPDBRAKE_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDsbPos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_SPOILERS_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDspPos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_FLAPS_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDfPos(val);
|
2000-10-02 23:07:30 +00:00
|
|
|
break;
|
|
|
|
case FG_THROTTLE_POS:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetThrottlePos(ActiveEngine,val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
2001-10-30 02:51:13 +00:00
|
|
|
case FG_MIXTURE_POS:
|
|
|
|
FCS->SetMixturePos(ActiveEngine,val);
|
|
|
|
break;
|
2001-03-30 01:04:50 +00:00
|
|
|
|
|
|
|
case FG_ELEVATOR_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDeCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_AILERON_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDaCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_RUDDER_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDrCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_SPDBRAKE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDsbCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_SPOILERS_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDspCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_FLAPS_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetDfCmd(val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
|
|
|
case FG_THROTTLE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetThrottleCmd(ActiveEngine,val);
|
2001-03-30 01:04:50 +00:00
|
|
|
break;
|
2001-10-30 02:51:13 +00:00
|
|
|
case FG_MIXTURE_CMD:
|
|
|
|
FCS->SetMixtureCmd(ActiveEngine,val);
|
|
|
|
break;
|
|
|
|
case FG_MAGNETO_CMD:
|
|
|
|
Propulsion->GetEngine(ActiveEngine)->SetMagnetos(val); // need to account for -1
|
|
|
|
break;
|
|
|
|
case FG_STARTER_CMD:
|
|
|
|
if (val < 0.001)
|
|
|
|
Propulsion->GetEngine(ActiveEngine)->SetStarter(false); // need to account for -1
|
|
|
|
else if (val >= 0.001)
|
|
|
|
Propulsion->GetEngine(ActiveEngine)->SetStarter(true); // need to account for -1
|
|
|
|
break;
|
2001-03-30 01:04:50 +00:00
|
|
|
case FG_ACTIVE_ENGINE:
|
|
|
|
ActiveEngine = (int)val;
|
|
|
|
break;
|
|
|
|
|
2001-04-05 21:14:37 +00:00
|
|
|
case FG_LEFT_BRAKE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetLBrake(val);
|
2001-04-05 21:14:37 +00:00
|
|
|
break;
|
|
|
|
case FG_CENTER_BRAKE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetCBrake(val);
|
2001-04-05 21:14:37 +00:00
|
|
|
break;
|
|
|
|
case FG_RIGHT_BRAKE_CMD:
|
2001-04-17 21:19:54 +00:00
|
|
|
FCS->SetRBrake(val);
|
2001-04-05 21:14:37 +00:00
|
|
|
break;
|
|
|
|
|
2001-04-06 22:59:31 +00:00
|
|
|
case FG_SET_LOGGING:
|
2001-04-17 21:19:54 +00:00
|
|
|
if (val < -0.01) Output->Disable();
|
|
|
|
else if (val > 0.01) Output->Enable();
|
|
|
|
else Output->Toggle();
|
2001-04-06 22:59:31 +00:00
|
|
|
break;
|
|
|
|
|
2001-03-30 01:04:50 +00:00
|
|
|
default:
|
|
|
|
cerr << "Parameter '" << val_idx << "' (" << paramdef[val_idx] << ") not handled" << endl;
|
2000-10-02 23:07:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
1999-08-17 21:18:11 +00:00
|
|
|
//***************************************************************************
|
|
|
|
//
|
|
|
|
// Reset: Assume all angles READ FROM FILE IN DEGREES !!
|
|
|
|
//
|
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
bool FGState::Reset(string path, string acname, string fname)
|
|
|
|
{
|
1999-02-13 01:12:03 +00:00
|
|
|
string resetDef;
|
2001-10-05 20:19:59 +00:00
|
|
|
string token="";
|
|
|
|
|
1999-02-11 21:05:34 +00:00
|
|
|
float U, V, W;
|
|
|
|
float phi, tht, psi;
|
2000-04-28 19:59:46 +00:00
|
|
|
float latitude, longitude, h;
|
2001-10-05 20:19:59 +00:00
|
|
|
float wdir, wmag, wnorth, weast;
|
1999-02-05 21:26:01 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
# ifndef macintosh
|
2000-11-14 20:31:58 +00:00
|
|
|
resetDef = path + "/" + acname + "/" + fname + ".xml";
|
2001-10-05 20:19:59 +00:00
|
|
|
# else
|
|
|
|
resetDef = path + ";" + acname + ";" + fname + ".xml";
|
|
|
|
# endif
|
|
|
|
|
|
|
|
FGConfigFile resetfile(resetDef);
|
|
|
|
if (!resetfile.IsOpen()) return false;
|
|
|
|
|
|
|
|
resetfile.GetNextConfigLine();
|
|
|
|
token = resetfile.GetValue();
|
|
|
|
if (token != "initialize") {
|
|
|
|
cerr << "The reset file " << resetDef
|
|
|
|
<< " does not appear to be a reset file" << endl;
|
1999-02-05 21:26:01 +00:00
|
|
|
return false;
|
|
|
|
}
|
2001-10-05 20:19:59 +00:00
|
|
|
|
|
|
|
resetfile.GetNextConfigLine();
|
|
|
|
resetfile >> token;
|
|
|
|
while (token != "/initialize" && token != "EOF") {
|
|
|
|
if (token == "UBODY") resetfile >> U;
|
|
|
|
if (token == "VBODY") resetfile >> V;
|
|
|
|
if (token == "WBODY") resetfile >> W;
|
|
|
|
if (token == "LATITUDE") resetfile >> latitude;
|
|
|
|
if (token == "LONGITUDE") resetfile >> longitude;
|
|
|
|
if (token == "PHI") resetfile >> phi;
|
|
|
|
if (token == "THETA") resetfile >> tht;
|
|
|
|
if (token == "PSI") resetfile >> psi;
|
|
|
|
if (token == "ALTITUDE") resetfile >> h;
|
|
|
|
if (token == "WINDDIR") resetfile >> wdir;
|
|
|
|
if (token == "VWIND") resetfile >> wmag;
|
|
|
|
|
|
|
|
resetfile >> token;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Position->SetLatitude(latitude*DEGTORAD);
|
|
|
|
Position->SetLongitude(longitude*DEGTORAD);
|
|
|
|
Position->Seth(h);
|
|
|
|
|
|
|
|
wnorth = wmag*KTSTOFPS*cos(wdir*DEGTORAD);
|
|
|
|
weast = wmag*KTSTOFPS*sin(wdir*DEGTORAD);
|
|
|
|
|
|
|
|
Initialize(U, V, W, phi*DEGTORAD, tht*DEGTORAD, psi*DEGTORAD,
|
|
|
|
latitude*DEGTORAD, longitude*DEGTORAD, h, wnorth, weast, 0.0);
|
|
|
|
|
|
|
|
return true;
|
1999-02-05 21:26:01 +00:00
|
|
|
}
|
|
|
|
|
1999-08-17 21:18:11 +00:00
|
|
|
//***************************************************************************
|
|
|
|
//
|
|
|
|
// Initialize: Assume all angles GIVEN IN RADIANS !!
|
|
|
|
//
|
1999-02-05 21:26:01 +00:00
|
|
|
|
1999-07-31 04:55:23 +00:00
|
|
|
void FGState::Initialize(float U, float V, float W,
|
|
|
|
float phi, float tht, float psi,
|
2001-10-05 20:19:59 +00:00
|
|
|
float Latitude, float Longitude, float H,
|
|
|
|
float wnorth, float weast, float wdown)
|
|
|
|
{
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
float alpha, beta;
|
2000-04-28 19:59:46 +00:00
|
|
|
float qbar, Vt;
|
2001-10-05 20:19:59 +00:00
|
|
|
FGColumnVector3 vAero;
|
2000-04-28 19:59:46 +00:00
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
Position->SetLatitude(Latitude);
|
|
|
|
Position->SetLongitude(Longitude);
|
|
|
|
Position->Seth(H);
|
1999-07-31 04:55:23 +00:00
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
Atmosphere->Run();
|
2001-10-05 20:19:59 +00:00
|
|
|
|
|
|
|
vLocalEuler << phi << tht << psi;
|
|
|
|
Rotation->SetEuler(vLocalEuler);
|
1999-07-31 04:55:23 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
InitMatrices(phi, tht, psi);
|
|
|
|
|
|
|
|
vUVW << U << V << W;
|
|
|
|
Translation->SetUVW(vUVW);
|
|
|
|
|
|
|
|
Atmosphere->SetWindNED(wnorth, weast, wdown);
|
|
|
|
|
|
|
|
vAero = vUVW + mTl2b*Atmosphere->GetWindNED();
|
|
|
|
|
|
|
|
if (vAero(eW) != 0.0)
|
|
|
|
alpha = vAero(eU)*vAero(eU) > 0.0 ? atan2(vAero(eW), vAero(eU)) : 0.0;
|
1999-07-31 04:55:23 +00:00
|
|
|
else
|
|
|
|
alpha = 0.0;
|
2001-10-05 20:19:59 +00:00
|
|
|
if (vAero(eV) != 0.0)
|
|
|
|
beta = vAero(eU)*vAero(eU)+vAero(eW)*vAero(eW) > 0.0 ? atan2(vAero(eV), (fabs(vAero(eU))/vAero(eU))*sqrt(vAero(eU)*vAero(eU) + vAero(eW)*vAero(eW))) : 0.0;
|
1999-07-31 04:55:23 +00:00
|
|
|
else
|
|
|
|
beta = 0.0;
|
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
Translation->SetAB(alpha, beta);
|
1999-07-31 04:55:23 +00:00
|
|
|
|
|
|
|
Vt = sqrt(U*U + V*V + W*W);
|
2001-04-17 21:19:54 +00:00
|
|
|
Translation->SetVt(Vt);
|
2000-04-28 19:59:46 +00:00
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
Translation->SetMach(Vt/Atmosphere->GetSoundSpeed());
|
2000-10-02 23:07:30 +00:00
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
qbar = 0.5*(U*U + V*V + W*W)*Atmosphere->GetDensity();
|
|
|
|
Translation->Setqbar(qbar);
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2000-04-28 19:59:46 +00:00
|
|
|
vLocalVelNED = mTb2l*vUVW;
|
2001-04-17 21:19:54 +00:00
|
|
|
Position->SetvVel(vLocalVelNED);
|
1999-07-31 04:55:23 +00:00
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-07-31 04:55:23 +00:00
|
|
|
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
void FGState::Initialize(FGInitialCondition *FGIC) {
|
1999-12-20 20:24:49 +00:00
|
|
|
|
1999-08-17 21:18:11 +00:00
|
|
|
float tht,psi,phi;
|
2000-04-28 19:59:46 +00:00
|
|
|
float U, V, W, h;
|
|
|
|
float latitude, longitude;
|
2001-10-05 20:19:59 +00:00
|
|
|
float wnorth,weast, wdown;
|
|
|
|
|
1999-08-17 21:18:11 +00:00
|
|
|
latitude = FGIC->GetLatitudeRadIC();
|
|
|
|
longitude = FGIC->GetLongitudeRadIC();
|
|
|
|
h = FGIC->GetAltitudeFtIC();
|
|
|
|
U = FGIC->GetUBodyFpsIC();
|
|
|
|
V = FGIC->GetVBodyFpsIC();
|
|
|
|
W = FGIC->GetWBodyFpsIC();
|
|
|
|
tht = FGIC->GetThetaRadIC();
|
|
|
|
phi = FGIC->GetPhiRadIC();
|
|
|
|
psi = FGIC->GetPsiRadIC();
|
2001-10-05 20:19:59 +00:00
|
|
|
wnorth = FGIC->GetWindNFpsIC();
|
|
|
|
weast = FGIC->GetWindEFpsIC();
|
|
|
|
wdown = FGIC->GetWindDFpsIC();
|
2000-10-28 16:30:30 +00:00
|
|
|
|
2001-04-17 21:19:54 +00:00
|
|
|
Position->SetSeaLevelRadius( FGIC->GetSeaLevelRadiusFtIC() );
|
|
|
|
Position->SetRunwayRadius( FGIC->GetSeaLevelRadiusFtIC() +
|
2000-10-28 16:30:30 +00:00
|
|
|
FGIC->GetTerrainAltitudeFtIC() );
|
2000-11-03 23:02:47 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
// need to fix the wind speed args, here.
|
|
|
|
Initialize(U, V, W, phi, tht, psi, latitude, longitude, h, wnorth, weast, wdown);
|
1999-08-17 21:18:11 +00:00
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-08-17 21:18:11 +00:00
|
|
|
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
bool FGState::StoreData(string fname) {
|
1999-02-26 22:09:10 +00:00
|
|
|
ofstream datafile(fname.c_str());
|
1999-02-05 21:26:01 +00:00
|
|
|
|
|
|
|
if (datafile) {
|
2001-04-17 21:19:54 +00:00
|
|
|
datafile << Translation->GetUVW(eU);
|
|
|
|
datafile << Translation->GetUVW(eV);
|
|
|
|
datafile << Translation->GetUVW(eW);
|
|
|
|
datafile << Position->GetLatitude();
|
|
|
|
datafile << Position->GetLongitude();
|
|
|
|
datafile << Rotation->GetEuler(ePhi);
|
|
|
|
datafile << Rotation->GetEuler(eTht);
|
|
|
|
datafile << Rotation->GetEuler(ePsi);
|
|
|
|
datafile << Position->Geth();
|
1999-02-05 21:26:01 +00:00
|
|
|
datafile.close();
|
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
cerr << "Could not open dump file " << fname << endl;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
1999-02-05 21:26:01 +00:00
|
|
|
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
void FGState::InitMatrices(float phi, float tht, float psi) {
|
2000-04-24 23:49:06 +00:00
|
|
|
float thtd2, psid2, phid2;
|
|
|
|
float Sthtd2, Spsid2, Sphid2;
|
|
|
|
float Cthtd2, Cpsid2, Cphid2;
|
|
|
|
float Cphid2Cthtd2;
|
|
|
|
float Cphid2Sthtd2;
|
|
|
|
float Sphid2Sthtd2;
|
|
|
|
float Sphid2Cthtd2;
|
|
|
|
|
|
|
|
thtd2 = tht/2.0;
|
|
|
|
psid2 = psi/2.0;
|
|
|
|
phid2 = phi/2.0;
|
|
|
|
|
|
|
|
Sthtd2 = sin(thtd2);
|
|
|
|
Spsid2 = sin(psid2);
|
|
|
|
Sphid2 = sin(phid2);
|
|
|
|
|
|
|
|
Cthtd2 = cos(thtd2);
|
|
|
|
Cpsid2 = cos(psid2);
|
|
|
|
Cphid2 = cos(phid2);
|
|
|
|
|
|
|
|
Cphid2Cthtd2 = Cphid2*Cthtd2;
|
|
|
|
Cphid2Sthtd2 = Cphid2*Sthtd2;
|
|
|
|
Sphid2Sthtd2 = Sphid2*Sthtd2;
|
|
|
|
Sphid2Cthtd2 = Sphid2*Cthtd2;
|
|
|
|
|
|
|
|
vQtrn(1) = Cphid2Cthtd2*Cpsid2 + Sphid2Sthtd2*Spsid2;
|
|
|
|
vQtrn(2) = Sphid2Cthtd2*Cpsid2 - Cphid2Sthtd2*Spsid2;
|
|
|
|
vQtrn(3) = Cphid2Sthtd2*Cpsid2 + Sphid2Cthtd2*Spsid2;
|
|
|
|
vQtrn(4) = Cphid2Cthtd2*Spsid2 - Sphid2Sthtd2*Cpsid2;
|
|
|
|
|
|
|
|
CalcMatrices();
|
1999-02-05 21:26:01 +00:00
|
|
|
}
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-04-24 23:49:06 +00:00
|
|
|
|
Updates from the Jon and Tony show.
Tony submitted:
JSBsim:
Added trimming routine, it is longitudinal & in-air only at this point
Added support for taking wind & weather data from external source
Added support for flaps.
Added independently settable pitch trim
Added alphamin and max to config file, stall modeling and warning to
follow
c172.cfg:
Flaps!
Adjusted Cmo, model should be speed stable now
FG:
Hooked up Christian's weather code, should be using it soon.
Hooked up the trimming routine. Note that the X-15 will not trim.
This is not a model or trimming routine deficiency, just the
nature of the X-15
The trimming routine sets the pitch trim and and throttle at startup.
The throttle is set using Norman's code for the autothrottle so the
autothrottle is on by default. --notrim will turn it off.
Added --vc, --mach, and --notrim switches
(vc is airspeed in knots)
uBody, vBody, and wBody are still supported, last one entered
on the command line counts, i.e. you can set vc or mach or u,v,
and w but any combination will be ignored.
2000-05-16 21:35:11 +00:00
|
|
|
void FGState::CalcMatrices(void) {
|
2000-04-24 23:49:06 +00:00
|
|
|
float Q0Q0, Q1Q1, Q2Q2, Q3Q3;
|
|
|
|
float Q0Q1, Q0Q2, Q0Q3, Q1Q2;
|
|
|
|
float Q1Q3, Q2Q3;
|
|
|
|
|
|
|
|
Q0Q0 = vQtrn(1)*vQtrn(1);
|
|
|
|
Q1Q1 = vQtrn(2)*vQtrn(2);
|
|
|
|
Q2Q2 = vQtrn(3)*vQtrn(3);
|
|
|
|
Q3Q3 = vQtrn(4)*vQtrn(4);
|
|
|
|
Q0Q1 = vQtrn(1)*vQtrn(2);
|
|
|
|
Q0Q2 = vQtrn(1)*vQtrn(3);
|
|
|
|
Q0Q3 = vQtrn(1)*vQtrn(4);
|
|
|
|
Q1Q2 = vQtrn(2)*vQtrn(3);
|
|
|
|
Q1Q3 = vQtrn(2)*vQtrn(4);
|
|
|
|
Q2Q3 = vQtrn(3)*vQtrn(4);
|
|
|
|
|
2000-05-27 05:48:14 +00:00
|
|
|
mTl2b(1,1) = Q0Q0 + Q1Q1 - Q2Q2 - Q3Q3;
|
|
|
|
mTl2b(1,2) = 2*(Q1Q2 + Q0Q3);
|
|
|
|
mTl2b(1,3) = 2*(Q1Q3 - Q0Q2);
|
|
|
|
mTl2b(2,1) = 2*(Q1Q2 - Q0Q3);
|
|
|
|
mTl2b(2,2) = Q0Q0 - Q1Q1 + Q2Q2 - Q3Q3;
|
|
|
|
mTl2b(2,3) = 2*(Q2Q3 + Q0Q1);
|
|
|
|
mTl2b(3,1) = 2*(Q1Q3 + Q0Q2);
|
|
|
|
mTl2b(3,2) = 2*(Q2Q3 - Q0Q1);
|
|
|
|
mTl2b(3,3) = Q0Q0 - Q1Q1 - Q2Q2 + Q3Q3;
|
|
|
|
|
|
|
|
mTb2l = mTl2b;
|
|
|
|
mTb2l.T();
|
2000-04-24 23:49:06 +00:00
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
void FGState::IntegrateQuat(FGColumnVector3 vPQR, int rate) {
|
2000-04-24 23:49:06 +00:00
|
|
|
vQdot(1) = -0.5*(vQtrn(2)*vPQR(eP) + vQtrn(3)*vPQR(eQ) + vQtrn(4)*vPQR(eR));
|
|
|
|
vQdot(2) = 0.5*(vQtrn(1)*vPQR(eP) + vQtrn(3)*vPQR(eR) - vQtrn(4)*vPQR(eQ));
|
|
|
|
vQdot(3) = 0.5*(vQtrn(1)*vPQR(eQ) + vQtrn(4)*vPQR(eP) - vQtrn(2)*vPQR(eR));
|
|
|
|
vQdot(4) = 0.5*(vQtrn(1)*vPQR(eR) + vQtrn(2)*vPQR(eQ) - vQtrn(3)*vPQR(eP));
|
|
|
|
vQtrn += 0.5*dt*rate*(vlastQdot + vQdot);
|
|
|
|
|
|
|
|
vQtrn.Normalize();
|
|
|
|
|
|
|
|
vlastQdot = vQdot;
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
FGColumnVector3& FGState::CalcEuler(void) {
|
2000-07-06 21:02:46 +00:00
|
|
|
if (mTl2b(3,3) == 0.0) mTl2b(3,3) = 0.0000001;
|
|
|
|
if (mTl2b(1,1) == 0.0) mTl2b(1,1) = 0.0000001;
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2000-07-06 21:02:46 +00:00
|
|
|
vEuler(ePhi) = atan2(mTl2b(2,3), mTl2b(3,3));
|
2000-05-27 05:48:14 +00:00
|
|
|
vEuler(eTht) = asin(-mTl2b(1,3));
|
2000-07-06 21:02:46 +00:00
|
|
|
vEuler(ePsi) = atan2(mTl2b(1,2), mTl2b(1,1));
|
2000-04-24 23:49:06 +00:00
|
|
|
|
|
|
|
if (vEuler(ePsi) < 0.0) vEuler(ePsi) += 2*M_PI;
|
|
|
|
|
|
|
|
return vEuler;
|
|
|
|
}
|
|
|
|
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
FGMatrix33& FGState::GetTs2b(float alpha, float beta)
|
|
|
|
{
|
2000-04-24 23:49:06 +00:00
|
|
|
float ca, cb, sa, sb;
|
|
|
|
|
|
|
|
ca = cos(alpha);
|
|
|
|
sa = sin(alpha);
|
|
|
|
cb = cos(beta);
|
|
|
|
sb = sin(beta);
|
|
|
|
|
|
|
|
mTs2b(1,1) = -ca*cb;
|
|
|
|
mTs2b(1,2) = -ca*sb;
|
|
|
|
mTs2b(1,3) = sa;
|
2000-05-02 18:25:30 +00:00
|
|
|
mTs2b(2,1) = -sb;
|
2000-04-24 23:49:06 +00:00
|
|
|
mTs2b(2,2) = cb;
|
|
|
|
mTs2b(2,3) = 0.0;
|
|
|
|
mTs2b(3,1) = -sa*cb;
|
|
|
|
mTs2b(3,2) = -sa*sb;
|
|
|
|
mTs2b(3,3) = -ca;
|
|
|
|
|
|
|
|
return mTs2b;
|
|
|
|
}
|
|
|
|
|
2001-10-05 20:19:59 +00:00
|
|
|
|
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
|
|
|
|
void FGState::ReportState(void) {
|
|
|
|
char out[80], flap[10], gear[10];
|
|
|
|
|
|
|
|
cout << endl << " JSBSim State" << endl;
|
|
|
|
snprintf(out,80," Weight: %7.0f lbs. CG: %5.1f, %5.1f, %5.1f inches\n",
|
|
|
|
FDMExec->GetMassBalance()->GetWeight(),
|
|
|
|
FDMExec->GetMassBalance()->GetXYZcg(1),
|
|
|
|
FDMExec->GetMassBalance()->GetXYZcg(2),
|
|
|
|
FDMExec->GetMassBalance()->GetXYZcg(3));
|
|
|
|
cout << out;
|
|
|
|
if( FCS->GetDfPos() <= 0.01)
|
|
|
|
snprintf(flap,10,"Up");
|
|
|
|
else
|
|
|
|
snprintf(flap,10,"%2.0f",FCS->GetDfPos());
|
2001-10-29 19:00:24 +00:00
|
|
|
if(GroundReactions->GetGearUp() == true)
|
2001-10-05 20:19:59 +00:00
|
|
|
snprintf(gear,10,"Up");
|
|
|
|
else
|
|
|
|
snprintf(gear,10,"Down");
|
|
|
|
snprintf(out,80, " Flaps: %3s Gear: %4s\n",flap,gear);
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Speed: %4.0f KCAS Mach: %5.2f\n",
|
|
|
|
FDMExec->GetAuxiliary()->GetVcalibratedKTS(),
|
|
|
|
GetParameter(FG_MACH) );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Altitude: %7.0f ft. AGL Altitude: %7.0f ft.\n",
|
|
|
|
Position->Geth(),
|
|
|
|
Position->GetDistanceAGL() );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Angle of Attack: %6.2f deg Pitch Angle: %6.2f deg\n",
|
|
|
|
GetParameter(FG_ALPHA)*RADTODEG,
|
|
|
|
Rotation->Gettht()*RADTODEG );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Flight Path Angle: %6.2f deg Climb Rate: %5.0f ft/min\n",
|
|
|
|
Position->GetGamma()*RADTODEG,
|
|
|
|
Position->Gethdot()*60 );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Normal Load Factor: %4.2f g's Pitch Rate: %5.2f deg/s\n",
|
|
|
|
Aerodynamics->GetNlf(),
|
|
|
|
GetParameter(FG_PITCHRATE)*RADTODEG );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Heading: %3.0f deg true Sideslip: %5.2f deg\n",
|
|
|
|
Rotation->Getpsi()*RADTODEG,
|
|
|
|
GetParameter(FG_BETA)*RADTODEG );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Bank Angle: %5.2f deg\n",
|
|
|
|
Rotation->Getphi()*RADTODEG );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Elevator: %5.2f deg Left Aileron: %5.2f deg Rudder: %5.2f deg\n",
|
|
|
|
GetParameter(FG_ELEVATOR_POS)*RADTODEG,
|
|
|
|
GetParameter(FG_AILERON_POS)*RADTODEG,
|
|
|
|
GetParameter(FG_RUDDER_POS)*RADTODEG );
|
|
|
|
cout << out;
|
|
|
|
snprintf(out,80, " Throttle: %5.2f%c\n",
|
|
|
|
FCS->GetThrottlePos(0),'%' );
|
|
|
|
cout << out;
|
|
|
|
|
|
|
|
snprintf(out,80, " Wind Components: %5.2f kts head wind, %5.2f kts cross wind\n",
|
|
|
|
FDMExec->GetAuxiliary()->GetHeadWind()*jsbFPSTOKTS,
|
|
|
|
FDMExec->GetAuxiliary()->GetCrossWind()*jsbFPSTOKTS );
|
|
|
|
cout << out;
|
|
|
|
|
|
|
|
snprintf(out,80, " Ground Speed: %4.0f knots , Ground Track: %3.0f deg true\n",
|
|
|
|
Position->GetVground()*jsbFPSTOKTS,
|
|
|
|
Position->GetGroundTrack()*RADTODEG );
|
|
|
|
cout << out;
|
|
|
|
|
|
|
|
}
|
2000-11-03 23:02:47 +00:00
|
|
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
2000-04-24 23:49:06 +00:00
|
|
|
|
2001-03-30 01:04:50 +00:00
|
|
|
void FGState::Debug(void)
|
|
|
|
{
|
|
|
|
//TODO: Add your source code here
|
|
|
|
}
|
|
|
|
|