Sync. w. JSBSim
This commit is contained in:
parent
619226e9d0
commit
31e3caa4f6
5 changed files with 133 additions and 86 deletions
|
@ -451,6 +451,12 @@ bool FGFDMExec::LoadModel(string model, bool addModelToPath)
|
||||||
Element* document;
|
Element* document;
|
||||||
|
|
||||||
ifstream input_file(aircraftCfgFileName.c_str());
|
ifstream input_file(aircraftCfgFileName.c_str());
|
||||||
|
|
||||||
|
if (!input_file.is_open()) { // file open failed
|
||||||
|
cerr << "Could not open file " << aircraftCfgFileName.c_str() << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
readXML(input_file, *XMLParse);
|
readXML(input_file, *XMLParse);
|
||||||
document = XMLParse->GetDocument();
|
document = XMLParse->GetDocument();
|
||||||
|
|
||||||
|
|
|
@ -70,16 +70,72 @@ CLASS DOCUMENTATION
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||||
|
|
||||||
/** Encapsulates the JSBSim simulation executive.
|
/** Encapsulates the JSBSim simulation executive.
|
||||||
This class is the interface class through which all other simulation classes
|
This class is the executive class through which all other simulation classes
|
||||||
are instantiated, initialized, and run. When integrated with FlightGear (or
|
are instantiated, initialized, and run. When integrated with FlightGear (or
|
||||||
other flight simulator) this class is typically instantiated by an interface
|
other flight simulator) this class is typically instantiated by an interface
|
||||||
class on the simulator side.
|
class on the simulator side.
|
||||||
|
|
||||||
When an aircraft model is loaded the config file is parsed and for each of the
|
At the time of simulation initialization, the interface
|
||||||
sections of the config file (propulsion, flight control, etc.) the
|
class creates an instance of this executive class. The
|
||||||
corresponding Load() method is called (e.g. LoadFCS).
|
executive is subsequently directed to load the chosen aircraft specification
|
||||||
|
file:
|
||||||
|
|
||||||
<h4>JSBSim Debugging Directives</h4>
|
@code
|
||||||
|
fdmex = new FGFDMExec( … );
|
||||||
|
result = fdmex->LoadModel( … );
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
When an aircraft model is loaded, the config file is parsed and for each of the
|
||||||
|
sections of the config file (propulsion, flight control, etc.) the
|
||||||
|
corresponding Load() method is called (e.g. FGFCS::Load()).
|
||||||
|
|
||||||
|
Subsequent to the creation of the executive and loading of the model,
|
||||||
|
initialization is performed. Initialization involves copying control inputs
|
||||||
|
into the appropriate JSBSim data storage locations, configuring it for the set
|
||||||
|
of user supplied initial conditions, and then copying state variables from
|
||||||
|
JSBSim. The state variables are used to drive the instrument displays and to
|
||||||
|
place the vehicle model in world space for visual rendering:
|
||||||
|
|
||||||
|
@code
|
||||||
|
copy_to_JSBsim(); // copy control inputs to JSBSim
|
||||||
|
fdmex->RunIC(); // loop JSBSim once w/o integrating
|
||||||
|
copy_from_JSBsim(); // update the bus
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
Once initialization is complete, cyclic execution proceeds:
|
||||||
|
|
||||||
|
@code
|
||||||
|
copy_to_JSBsim(); // copy control inputs to JSBSim
|
||||||
|
fdmex->Run(); // execute JSBSim
|
||||||
|
copy_from_JSBsim(); // update the bus
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
JSBSim can be used in a standalone mode by creating a compact stub program
|
||||||
|
that effectively performs the same progression of steps as outlined above for
|
||||||
|
the integrated version, but with two exceptions. First, the copy_to_JSBSim()
|
||||||
|
and copy_from_JSBSim() functions are not used because the control inputs are
|
||||||
|
handled directly by the scripting facilities and outputs are handled by the
|
||||||
|
output (data logging) class. Second, the name of a script file can be supplied
|
||||||
|
to the stub program. Scripting (see FGScript) provides a way to supply command
|
||||||
|
inputs to the simulation:
|
||||||
|
|
||||||
|
@code
|
||||||
|
FDMExec = new JSBSim::FGFDMExec();
|
||||||
|
Script = new JSBSim::FGScript( … );
|
||||||
|
Script->LoadScript( ScriptName ); // the script loads the aircraft and ICs
|
||||||
|
result = FDMExec->Run();
|
||||||
|
while (result) { // cyclic execution
|
||||||
|
if (Scripted) if (!Script->RunScript()) break; // execute script
|
||||||
|
result = FDMExec->Run(); // execute JSBSim
|
||||||
|
}
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
The standalone mode has been useful for verifying changes before committing
|
||||||
|
updates to the source code repository. It is also useful for running sets of
|
||||||
|
tests that reveal some aspects of simulated aircraft performance, such as
|
||||||
|
range, time-to-climb, takeoff distance, etc.
|
||||||
|
|
||||||
|
<h3>JSBSim Debugging Directives</h3>
|
||||||
|
|
||||||
This describes to any interested entity the debug level
|
This describes to any interested entity the debug level
|
||||||
requested by setting the JSBSIM_DEBUG environment variable.
|
requested by setting the JSBSIM_DEBUG environment variable.
|
||||||
|
@ -101,8 +157,14 @@ CLASS DOCUMENTATION
|
||||||
- <b>16</b>: When set various parameters are sanity checked and
|
- <b>16</b>: When set various parameters are sanity checked and
|
||||||
a message is printed out when they go out of bounds
|
a message is printed out when they go out of bounds
|
||||||
|
|
||||||
|
<h3>Properties</h3>
|
||||||
|
@property simulator/do_trim Can be set to the integer equivalent to one of
|
||||||
|
tLongitudinal (0), tFull (1), tGround (2), tPullup (3),
|
||||||
|
tCustom (4), tTurn (5). Setting this to a legal value
|
||||||
|
(such as by a script) causes a trim to be performed.
|
||||||
|
|
||||||
@author Jon S. Berndt
|
@author Jon S. Berndt
|
||||||
@version $Id$
|
@version $Revision$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
@ -124,13 +186,14 @@ public:
|
||||||
FGFDMExec::Run() method must be made before the model is executed. A
|
FGFDMExec::Run() method must be made before the model is executed. A
|
||||||
value of 1 means that the model will be executed for each call to the
|
value of 1 means that the model will be executed for each call to the
|
||||||
exec's Run() method. A value of 5 means that the model will only be
|
exec's Run() method. A value of 5 means that the model will only be
|
||||||
executed every 5th call to the exec's Run() method.
|
executed every 5th call to the exec's Run() method. Use of a rate other than
|
||||||
|
one is at this time not recommended.
|
||||||
@param model A pointer to the model being scheduled.
|
@param model A pointer to the model being scheduled.
|
||||||
@param rate The rate at which to execute the model as described above.
|
@param rate The rate at which to execute the model as described above.
|
||||||
@return Currently returns 0 always. */
|
@return Currently returns 0 always. */
|
||||||
int Schedule(FGModel* model, int rate);
|
int Schedule(FGModel* model, int rate);
|
||||||
|
|
||||||
/** This executes each scheduled model in succession.
|
/** This function executes each scheduled model in succession.
|
||||||
@return true if successful, false if sim should be ended */
|
@return true if successful, false if sim should be ended */
|
||||||
bool Run(void);
|
bool Run(void);
|
||||||
|
|
||||||
|
@ -144,7 +207,7 @@ public:
|
||||||
void SetGroundCallback(FGGroundCallback* gc);
|
void SetGroundCallback(FGGroundCallback* gc);
|
||||||
|
|
||||||
/** Loads an aircraft model.
|
/** Loads an aircraft model.
|
||||||
@param AircraftPath path to the aircraft directory. For instance:
|
@param AircraftPath path to the aircraft/ directory. For instance:
|
||||||
"aircraft". Under aircraft, then, would be directories for various
|
"aircraft". Under aircraft, then, would be directories for various
|
||||||
modeled aircraft such as C172/, x15/, etc.
|
modeled aircraft such as C172/, x15/, etc.
|
||||||
@param EnginePath path to the directory under which engine config
|
@param EnginePath path to the directory under which engine config
|
||||||
|
@ -239,8 +302,7 @@ public:
|
||||||
* - tPullup
|
* - tPullup
|
||||||
* - tCustom
|
* - tCustom
|
||||||
* - tTurn
|
* - tTurn
|
||||||
* - tNone
|
* - tNone */
|
||||||
*/
|
|
||||||
void DoTrim(int mode);
|
void DoTrim(int mode);
|
||||||
|
|
||||||
/// Disables data logging to all outputs.
|
/// Disables data logging to all outputs.
|
||||||
|
@ -269,7 +331,7 @@ public:
|
||||||
|
|
||||||
/** Retrieves property or properties matching the supplied string.
|
/** Retrieves property or properties matching the supplied string.
|
||||||
* A string is returned that contains a carriage return delimited list of all
|
* A string is returned that contains a carriage return delimited list of all
|
||||||
* strings in the property catalog that matches the supplied chack string.
|
* strings in the property catalog that matches the supplied check string.
|
||||||
* @param check The string to search for in the property catalog.
|
* @param check The string to search for in the property catalog.
|
||||||
* @return the carriage-return-delimited string containing all matching strings
|
* @return the carriage-return-delimited string containing all matching strings
|
||||||
* in the catalog. */
|
* in the catalog. */
|
||||||
|
|
|
@ -95,21 +95,18 @@ void FGXMLParse::startElement (const char * name, const XMLAttributes &atts)
|
||||||
|
|
||||||
void FGXMLParse::endElement (const char * name)
|
void FGXMLParse::endElement (const char * name)
|
||||||
{
|
{
|
||||||
int size, pos;
|
|
||||||
string local_work_string;
|
string local_work_string;
|
||||||
|
|
||||||
while (!working_string.empty()) {
|
while (!working_string.empty()) {
|
||||||
// clear leading newlines and spaces
|
// clear leading newlines and spaces
|
||||||
while (working_string[0] == '\n' || working_string[0] == ' ')
|
string::size_type pos = working_string.find_first_not_of( " \n");
|
||||||
working_string.erase(0,1);
|
if (pos > 0)
|
||||||
|
working_string.erase(0, pos);
|
||||||
|
|
||||||
// remove spaces (only) from end of string
|
// remove spaces (only) from end of string
|
||||||
size = working_string.size();
|
pos = working_string.find_last_not_of( " ");
|
||||||
while (working_string[size-1] == ' ')
|
if (pos != string::npos)
|
||||||
{
|
working_string.erase( ++pos);
|
||||||
working_string.erase(size-1,1);
|
|
||||||
size = working_string.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!working_string.empty()) {
|
if (!working_string.empty()) {
|
||||||
pos = working_string.find("\n");
|
pos = working_string.find("\n");
|
||||||
|
|
|
@ -458,44 +458,26 @@ void FGAtmosphere::UseInternal(void)
|
||||||
void FGAtmosphere::bind(void)
|
void FGAtmosphere::bind(void)
|
||||||
{
|
{
|
||||||
typedef double (FGAtmosphere::*PMF)(int) const;
|
typedef double (FGAtmosphere::*PMF)(int) const;
|
||||||
PropertyManager->Tie("atmosphere/T-R", this,
|
typedef double (FGAtmosphere::*PMFv)(void) const;
|
||||||
&FGAtmosphere::GetTemperature);
|
PropertyManager->Tie("atmosphere/T-R", this, (PMFv)&FGAtmosphere::GetTemperature);
|
||||||
PropertyManager->Tie("atmosphere/rho-slugs_ft3", this,
|
PropertyManager->Tie("atmosphere/rho-slugs_ft3", this, (PMFv)&FGAtmosphere::GetDensity);
|
||||||
&FGAtmosphere::GetDensity);
|
PropertyManager->Tie("atmosphere/P-psf", this, (PMFv)&FGAtmosphere::GetPressure);
|
||||||
// PropertyManager->Tie("atmosphere/P-psf", this,
|
PropertyManager->Tie("atmosphere/a-fps", this, &FGAtmosphere::GetSoundSpeed);
|
||||||
// &FGAtmosphere::GetPressure);
|
PropertyManager->Tie("atmosphere/T-sl-R", this, &FGAtmosphere::GetTemperatureSL);
|
||||||
PropertyManager->Tie("atmosphere/a-fps", this,
|
PropertyManager->Tie("atmosphere/rho-sl-slugs_ft3", this, &FGAtmosphere::GetDensitySL);
|
||||||
&FGAtmosphere::GetSoundSpeed);
|
PropertyManager->Tie("atmosphere/P-sl-psf", this, &FGAtmosphere::GetPressureSL);
|
||||||
PropertyManager->Tie("atmosphere/T-sl-R", this,
|
PropertyManager->Tie("atmosphere/a-sl-fps", this, &FGAtmosphere::GetSoundSpeedSL);
|
||||||
&FGAtmosphere::GetTemperatureSL);
|
PropertyManager->Tie("atmosphere/theta", this, &FGAtmosphere::GetTemperatureRatio);
|
||||||
PropertyManager->Tie("atmosphere/rho-sl-slugs_ft3", this,
|
PropertyManager->Tie("atmosphere/sigma", this, &FGAtmosphere::GetDensityRatio);
|
||||||
&FGAtmosphere::GetDensitySL);
|
PropertyManager->Tie("atmosphere/delta", this, &FGAtmosphere::GetPressureRatio);
|
||||||
PropertyManager->Tie("atmosphere/P-sl-psf", this,
|
PropertyManager->Tie("atmosphere/a-ratio", this, &FGAtmosphere::GetSoundSpeedRatio);
|
||||||
&FGAtmosphere::GetPressureSL);
|
PropertyManager->Tie("atmosphere/psiw-rad", this, &FGAtmosphere::GetWindPsi);
|
||||||
PropertyManager->Tie("atmosphere/a-sl-fps", this,
|
PropertyManager->Tie("atmosphere/delta-T", this, &FGAtmosphere::GetDeltaT, &FGAtmosphere::SetDeltaT);
|
||||||
&FGAtmosphere::GetSoundSpeedSL);
|
PropertyManager->Tie("atmosphere/T-sl-dev-F", this, &FGAtmosphere::GetSLTempDev, &FGAtmosphere::SetSLTempDev);
|
||||||
PropertyManager->Tie("atmosphere/theta", this,
|
PropertyManager->Tie("atmosphere/density-altitude", this, &FGAtmosphere::GetDensityAltitude);
|
||||||
&FGAtmosphere::GetTemperatureRatio);
|
PropertyManager->Tie("atmosphere/p-turb-rad_sec", this,1, (PMF)&FGAtmosphere::GetTurbPQR);
|
||||||
PropertyManager->Tie("atmosphere/sigma", this,
|
PropertyManager->Tie("atmosphere/q-turb-rad_sec", this,2, (PMF)&FGAtmosphere::GetTurbPQR);
|
||||||
&FGAtmosphere::GetDensityRatio);
|
PropertyManager->Tie("atmosphere/r-turb-rad_sec", this,3, (PMF)&FGAtmosphere::GetTurbPQR);
|
||||||
PropertyManager->Tie("atmosphere/delta", this,
|
|
||||||
&FGAtmosphere::GetPressureRatio);
|
|
||||||
PropertyManager->Tie("atmosphere/a-ratio", this,
|
|
||||||
&FGAtmosphere::GetSoundSpeedRatio);
|
|
||||||
PropertyManager->Tie("atmosphere/psiw-rad", this,
|
|
||||||
&FGAtmosphere::GetWindPsi);
|
|
||||||
PropertyManager->Tie("atmosphere/delta-T", this,
|
|
||||||
&FGAtmosphere::GetDeltaT, &FGAtmosphere::SetDeltaT);
|
|
||||||
PropertyManager->Tie("atmosphere/T-sl-dev-F", this,
|
|
||||||
&FGAtmosphere::GetSLTempDev, &FGAtmosphere::SetSLTempDev);
|
|
||||||
PropertyManager->Tie("atmosphere/density-altitude", this,
|
|
||||||
&FGAtmosphere::GetDensityAltitude);
|
|
||||||
PropertyManager->Tie("atmosphere/p-turb-rad_sec", this,1,
|
|
||||||
(PMF)&FGAtmosphere::GetTurbPQR);
|
|
||||||
PropertyManager->Tie("atmosphere/q-turb-rad_sec", this,2,
|
|
||||||
(PMF)&FGAtmosphere::GetTurbPQR);
|
|
||||||
PropertyManager->Tie("atmosphere/r-turb-rad_sec", this,3,
|
|
||||||
(PMF)&FGAtmosphere::GetTurbPQR);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
@ -504,7 +486,7 @@ void FGAtmosphere::unbind(void)
|
||||||
{
|
{
|
||||||
PropertyManager->Untie("atmosphere/T-R");
|
PropertyManager->Untie("atmosphere/T-R");
|
||||||
PropertyManager->Untie("atmosphere/rho-slugs_ft3");
|
PropertyManager->Untie("atmosphere/rho-slugs_ft3");
|
||||||
// PropertyManager->Untie("atmosphere/P-psf");
|
PropertyManager->Untie("atmosphere/P-psf");
|
||||||
PropertyManager->Untie("atmosphere/a-fps");
|
PropertyManager->Untie("atmosphere/a-fps");
|
||||||
PropertyManager->Untie("atmosphere/T-sl-R");
|
PropertyManager->Untie("atmosphere/T-sl-R");
|
||||||
PropertyManager->Untie("atmosphere/rho-sl-slugs_ft3");
|
PropertyManager->Untie("atmosphere/rho-sl-slugs_ft3");
|
||||||
|
|
|
@ -90,13 +90,13 @@ public:
|
||||||
<i>This function may <b>only</b> be used if Run() is called first.</i> */
|
<i>This function may <b>only</b> be used if Run() is called first.</i> */
|
||||||
inline double GetDensity(void) const {return *density;}
|
inline double GetDensity(void) const {return *density;}
|
||||||
/// Returns the pressure in psf.
|
/// Returns the pressure in psf.
|
||||||
inline double GetPressure(void) const {return *pressure;}
|
double GetPressure(void) const {return *pressure;}
|
||||||
/// Returns the standard pressure at a specified altitude
|
/// Returns the standard pressure at a specified altitude
|
||||||
double GetPressure(double altitude);
|
double GetPressure(double altitude);
|
||||||
/// Returns the standard temperature at a specified altitude
|
/// Returns the standard temperature at a specified altitude
|
||||||
double GetTemperature(double altitude);
|
inline double GetTemperature(double altitude);
|
||||||
/// Returns the standard density at a specified altitude
|
/// Returns the standard density at a specified altitude
|
||||||
double GetDensity(double altitude);
|
inline double GetDensity(double altitude);
|
||||||
/// Returns the speed of sound in ft/sec.
|
/// Returns the speed of sound in ft/sec.
|
||||||
inline double GetSoundSpeed(void) const {return soundspeed;}
|
inline double GetSoundSpeed(void) const {return soundspeed;}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue