Revamped the "External" flight model.
This commit is contained in:
parent
1fd9270267
commit
5fdede6f75
4 changed files with 94 additions and 106 deletions
49
src/FDM/External.cxx
Normal file
49
src/FDM/External.cxx
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
// External.cxx -- interface to the "External"-ly driven flight model
|
||||||
|
//
|
||||||
|
// Written by Curtis Olson, started November 1999.
|
||||||
|
//
|
||||||
|
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
|
||||||
|
#include "External.hxx"
|
||||||
|
|
||||||
|
|
||||||
|
// Initialize the External flight model, dt is the time increment
|
||||||
|
// for each subsequent iteration through the EOM
|
||||||
|
int FGExternal::init( double dt ) {
|
||||||
|
// cout << "FGExternal::init()" << endl;
|
||||||
|
|
||||||
|
// set valid time for this record
|
||||||
|
stamp_time();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Run an iteration of the EOM. This is essentially a NOP here
|
||||||
|
// because these values are getting filled in elsewhere based on
|
||||||
|
// external input.
|
||||||
|
int FGExternal::update( int multiloop ) {
|
||||||
|
// cout << "FGExternal::update()" << endl;
|
||||||
|
|
||||||
|
// double time_step = (1.0 / current_options.get_model_hz()) * multiloop;
|
||||||
|
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
42
src/FDM/External.hxx
Normal file
42
src/FDM/External.hxx
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
// External.hxx -- interface to the "External"-ly driven flight model
|
||||||
|
//
|
||||||
|
// Written by Curtis Olson, started November 1999.
|
||||||
|
//
|
||||||
|
// Copyright (C) 1999 Curtis L. Olson - curt@flightgear.org
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// 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.
|
||||||
|
//
|
||||||
|
// 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _EXTERNAL_HXX
|
||||||
|
#define _EXTERNAL_HXX
|
||||||
|
|
||||||
|
|
||||||
|
#include "flight.hxx"
|
||||||
|
|
||||||
|
|
||||||
|
class FGExternal: public FGInterface {
|
||||||
|
|
||||||
|
public:
|
||||||
|
// reset flight params to a specific position
|
||||||
|
int init( double dt );
|
||||||
|
|
||||||
|
// update position based on inputs, positions, velocities, etc.
|
||||||
|
int update( int multiloop );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _EXTERNAL_HXX
|
|
@ -1,9 +1,10 @@
|
||||||
SUBDIRS = Balloon External JSBsim LaRCsim
|
SUBDIRS = Balloon JSBsim LaRCsim
|
||||||
|
|
||||||
noinst_LIBRARIES = libFlight.a
|
noinst_LIBRARIES = libFlight.a
|
||||||
|
|
||||||
libFlight_a_SOURCES = \
|
libFlight_a_SOURCES = \
|
||||||
Balloon.cxx Balloon.h \
|
Balloon.cxx Balloon.h \
|
||||||
|
External.cxx External.hxx \
|
||||||
flight.cxx flight.hxx \
|
flight.cxx flight.hxx \
|
||||||
JSBsim.cxx JSBsim.hxx \
|
JSBsim.cxx JSBsim.hxx \
|
||||||
LaRCsim.cxx LaRCsim.hxx \
|
LaRCsim.cxx LaRCsim.hxx \
|
||||||
|
|
|
@ -24,13 +24,13 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <Debug/logstream.hxx>
|
#include <Debug/logstream.hxx>
|
||||||
#include <FDM/External/external.hxx>
|
|
||||||
#include <FDM/LaRCsim/ls_interface.h>
|
#include <FDM/LaRCsim/ls_interface.h>
|
||||||
#include <Include/fg_constants.h>
|
#include <Include/fg_constants.h>
|
||||||
#include <Main/options.hxx>
|
#include <Main/options.hxx>
|
||||||
#include <Math/fg_geodesy.hxx>
|
#include <Math/fg_geodesy.hxx>
|
||||||
#include <Time/timestamp.hxx>
|
#include <Time/timestamp.hxx>
|
||||||
|
|
||||||
|
#include "External.hxx"
|
||||||
#include "flight.hxx"
|
#include "flight.hxx"
|
||||||
#include "JSBsim.hxx"
|
#include "JSBsim.hxx"
|
||||||
#include "LaRCsim.hxx"
|
#include "LaRCsim.hxx"
|
||||||
|
@ -89,110 +89,6 @@ void FGInterface::extrapolate( int time_offset ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Initialize the flight model parameters
|
|
||||||
int fgFDMInit(int model, FGInterface& f, double dt) {
|
|
||||||
double save_alt = 0.0;
|
|
||||||
|
|
||||||
FG_LOG( FG_FLIGHT ,FG_INFO, "Initializing flight model" );
|
|
||||||
|
|
||||||
base_fdm_state = f;
|
|
||||||
|
|
||||||
if ( model == FGInterface::FG_SLEW ) {
|
|
||||||
// fgSlewInit(dt);
|
|
||||||
#ifndef __MWERKS__ // -dw- 04/22/99 JSB sim not ported yet
|
|
||||||
} else if ( model == FGInterface::FG_JSBSIM ) {
|
|
||||||
fgJSBsimInit(dt, f);
|
|
||||||
fgJSBsim_2_FGInterface(base_fdm_state);
|
|
||||||
#endif
|
|
||||||
} else if ( model == FGInterface::FG_LARCSIM ) {
|
|
||||||
// lets try to avoid really screwing up the LaRCsim model
|
|
||||||
if ( base_fdm_state.get_Altitude() < -9000.0 ) {
|
|
||||||
save_alt = base_fdm_state.get_Altitude();
|
|
||||||
base_fdm_state.set_Altitude( 0.0 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// translate FG to LaRCsim structure
|
|
||||||
FGInterface_2_LaRCsim(base_fdm_state);
|
|
||||||
|
|
||||||
// initialize LaRCsim
|
|
||||||
fgLaRCsimInit(dt);
|
|
||||||
|
|
||||||
FG_LOG( FG_FLIGHT, FG_INFO, "FG pos = " <<
|
|
||||||
base_fdm_state.get_Latitude() );
|
|
||||||
|
|
||||||
// translate LaRCsim back to FG structure
|
|
||||||
fgLaRCsim_2_FGInterface(base_fdm_state);
|
|
||||||
|
|
||||||
// but lets restore our original bogus altitude when we are done
|
|
||||||
if ( save_alt < -9000.0 ) {
|
|
||||||
base_fdm_state.set_Altitude( save_alt );
|
|
||||||
}
|
|
||||||
} else if ( model == FGInterface::FG_EXTERNAL ) {
|
|
||||||
fgExternalInit(base_fdm_state);
|
|
||||||
} else {
|
|
||||||
FG_LOG( FG_FLIGHT, FG_WARN,
|
|
||||||
"Unimplemented flight model == " << model );
|
|
||||||
}
|
|
||||||
|
|
||||||
// set valid time for this record
|
|
||||||
base_fdm_state.stamp_time();
|
|
||||||
|
|
||||||
f = base_fdm_state;
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
// Run multiloop iterations of the flight model
|
|
||||||
int fgFDMUpdate(int model, FGInterface& f, int multiloop, int time_offset) {
|
|
||||||
double time_step, start_elev, end_elev;
|
|
||||||
|
|
||||||
// printf("Altitude = %.2f\n", FG_Altitude * 0.3048);
|
|
||||||
|
|
||||||
// set valid time for this record
|
|
||||||
base_fdm_state.stamp_time();
|
|
||||||
|
|
||||||
time_step = (1.0 / current_options.get_model_hz()) * multiloop;
|
|
||||||
start_elev = base_fdm_state.get_Altitude();
|
|
||||||
|
|
||||||
if ( model == FGInterface::FG_SLEW ) {
|
|
||||||
// fgSlewUpdate(f, multiloop);
|
|
||||||
#ifndef __MWERKS__ // -dw- 04/22/99 JSB sim not ported yet
|
|
||||||
} else if ( model == FGInterface::FG_JSBSIM ) {
|
|
||||||
fgJSBsimUpdate(base_fdm_state, multiloop);
|
|
||||||
f = base_fdm_state;
|
|
||||||
#endif
|
|
||||||
} else if ( model == FGInterface::FG_LARCSIM ) {
|
|
||||||
fgLaRCsimUpdate(base_fdm_state, multiloop);
|
|
||||||
// extrapolate position based on actual time
|
|
||||||
// f = extrapolate_fdm( base_fdm_state, time_offset );
|
|
||||||
f = base_fdm_state;
|
|
||||||
} else if ( model == FGInterface::FG_EXTERNAL ) {
|
|
||||||
// fgExternalUpdate(f, multiloop);
|
|
||||||
FGTimeStamp current;
|
|
||||||
current.stamp();
|
|
||||||
f = base_fdm_state;
|
|
||||||
f.extrapolate( current - base_fdm_state.get_time_stamp() );
|
|
||||||
} else {
|
|
||||||
FG_LOG( FG_FLIGHT, FG_WARN,
|
|
||||||
"Unimplemented flight model == " << model );
|
|
||||||
}
|
|
||||||
|
|
||||||
end_elev = base_fdm_state.get_Altitude();
|
|
||||||
|
|
||||||
if ( time_step > 0.0 ) {
|
|
||||||
// feet per second
|
|
||||||
base_fdm_state.set_Climb_Rate( (end_elev - start_elev) / time_step );
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Set the altitude (force)
|
// Set the altitude (force)
|
||||||
void fgFDMForceAltitude(int model, double alt_meters) {
|
void fgFDMForceAltitude(int model, double alt_meters) {
|
||||||
double sea_level_radius_meters;
|
double sea_level_radius_meters;
|
||||||
|
|
Loading…
Reference in a new issue