Initial revision.
This commit is contained in:
parent
408742c48c
commit
5513830175
2 changed files with 272 additions and 0 deletions
184
src/FDM/JSBSim/filtersjb/FGKinemat.cpp
Normal file
184
src/FDM/JSBSim/filtersjb/FGKinemat.cpp
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
Module: FGKinemat.cpp
|
||||||
|
Author: Tony Peden, for flight control system authored by Jon S. Berndt
|
||||||
|
Date started: 12/02/01
|
||||||
|
|
||||||
|
------------- Copyright (C) 2000 Anthony K. Peden -------------
|
||||||
|
|
||||||
|
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., 59 Temple
|
||||||
|
Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Further information about the GNU General Public License can also be found on
|
||||||
|
the world wide web at http://www.gnu.org.
|
||||||
|
|
||||||
|
FUNCTIONAL DESCRIPTION
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
HISTORY
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
COMMENTS, REFERENCES, and NOTES
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
INCLUDES
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||||
|
|
||||||
|
#include "FGKinemat.h"
|
||||||
|
|
||||||
|
static const char *IdSrc = "$Id$";
|
||||||
|
static const char *IdHdr = ID_FLAPS;
|
||||||
|
|
||||||
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
CLASS IMPLEMENTATION
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||||
|
|
||||||
|
FGKinemat::FGKinemat(FGFCS* fcs, FGConfigFile* AC_cfg) : FGFCSComponent(fcs),
|
||||||
|
AC_cfg(AC_cfg) {
|
||||||
|
string token;
|
||||||
|
double tmpDetent;
|
||||||
|
double tmpTime;
|
||||||
|
|
||||||
|
Detents.clear();
|
||||||
|
TransitionTimes.clear();
|
||||||
|
|
||||||
|
Type = AC_cfg->GetValue("TYPE");
|
||||||
|
Name = AC_cfg->GetValue("NAME");
|
||||||
|
AC_cfg->GetNextConfigLine();
|
||||||
|
|
||||||
|
while ((token = AC_cfg->GetValue()) != string("/COMPONENT")) {
|
||||||
|
*AC_cfg >> token;
|
||||||
|
if (token == "ID") {
|
||||||
|
*AC_cfg >> ID;
|
||||||
|
} else if (token == "INPUT") {
|
||||||
|
token = AC_cfg->GetValue("INPUT");
|
||||||
|
if (token.find("FG_") != token.npos) {
|
||||||
|
*AC_cfg >> token;
|
||||||
|
InputIdx = fcs->GetState()->GetParameterIndex(token);
|
||||||
|
InputType = itPilotAC;
|
||||||
|
}
|
||||||
|
} else if ( token == "DETENTS" ) {
|
||||||
|
*AC_cfg >> NumDetents;
|
||||||
|
for(int i=0;i<NumDetents;i++) {
|
||||||
|
*AC_cfg >> tmpDetent;
|
||||||
|
*AC_cfg >> tmpTime;
|
||||||
|
Detents.push_back(tmpDetent);
|
||||||
|
TransitionTimes.push_back(tmpTime);
|
||||||
|
}
|
||||||
|
} else if (token == "OUTPUT") {
|
||||||
|
|
||||||
|
IsOutput = true;
|
||||||
|
*AC_cfg >> sOutputIdx;
|
||||||
|
OutputIdx = fcs->GetState()->GetParameterIndex(sOutputIdx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug_lvl > 1) {
|
||||||
|
cout << " ID: " << ID << endl;
|
||||||
|
cout << " INPUT: " << InputIdx << endl;
|
||||||
|
cout << " DETENTS: " << NumDetents << endl;
|
||||||
|
for(int i=0;i<NumDetents;i++) {
|
||||||
|
cout << " " << Detents[i] << " " << TransitionTimes[i] << endl;
|
||||||
|
}
|
||||||
|
if (IsOutput) cout << " OUTPUT: " <<sOutputIdx << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug_lvl & 2) cout << "Instantiated: FGKinemat" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
FGKinemat::~FGKinemat()
|
||||||
|
{
|
||||||
|
if (debug_lvl & 2) cout << "Destroyed: FGKinemat" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
bool FGKinemat::Run(void ) {
|
||||||
|
double dt=fcs->GetState()->Getdt();
|
||||||
|
double output_transit_rate=0;
|
||||||
|
|
||||||
|
FGFCSComponent::Run(); // call the base class for initialization of Input
|
||||||
|
InputCmd = Input*Detents[NumDetents-1];
|
||||||
|
OutputPos = fcs->GetState()->GetParameter(OutputIdx);
|
||||||
|
|
||||||
|
if(InputCmd < Detents[0]) {
|
||||||
|
fi=0;
|
||||||
|
InputCmd=Detents[0];
|
||||||
|
lastInputCmd=InputCmd;
|
||||||
|
OutputPos=Detents[0];
|
||||||
|
Output=OutputPos;
|
||||||
|
} else if(InputCmd > Detents[NumDetents-1]) {
|
||||||
|
fi=NumDetents-1;
|
||||||
|
InputCmd=Detents[fi];
|
||||||
|
lastInputCmd=InputCmd;
|
||||||
|
OutputPos=Detents[fi];
|
||||||
|
Output=OutputPos;
|
||||||
|
} else {
|
||||||
|
//cout << "FGKinemat::Run Handle: " << InputCmd << " Position: " << OutputPos << endl;
|
||||||
|
if(dt <= 0)
|
||||||
|
OutputPos=InputCmd;
|
||||||
|
else {
|
||||||
|
if(InputCmd != lastInputCmd) {
|
||||||
|
|
||||||
|
InTransit=1;
|
||||||
|
}
|
||||||
|
if(InTransit) {
|
||||||
|
|
||||||
|
//fprintf(stderr,"InputCmd: %g, OutputPos: %g\n",InputCmd,OutputPos);
|
||||||
|
fi=0;
|
||||||
|
while(Detents[fi] < InputCmd) {
|
||||||
|
fi++;
|
||||||
|
}
|
||||||
|
if(OutputPos < InputCmd) {
|
||||||
|
if(TransitionTimes[fi] > 0)
|
||||||
|
output_transit_rate=(Detents[fi] - Detents[fi-1])/TransitionTimes[fi];
|
||||||
|
else
|
||||||
|
output_transit_rate=(Detents[fi] - Detents[fi-1])/5;
|
||||||
|
} else {
|
||||||
|
if(TransitionTimes[fi+1] > 0)
|
||||||
|
output_transit_rate=(Detents[fi] - Detents[fi+1])/TransitionTimes[fi+1];
|
||||||
|
else
|
||||||
|
output_transit_rate=(Detents[fi] - Detents[fi+1])/5;
|
||||||
|
}
|
||||||
|
if(fabs(OutputPos - InputCmd) > dt*output_transit_rate)
|
||||||
|
OutputPos+=output_transit_rate*dt;
|
||||||
|
else {
|
||||||
|
InTransit=0;
|
||||||
|
OutputPos=InputCmd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lastInputCmd=InputCmd;
|
||||||
|
Output=OutputPos;
|
||||||
|
}
|
||||||
|
//cout << "FGKinemat::Run Handle: " << InputCmd << " Position: " << OutputPos << " Output: " << Output << endl;
|
||||||
|
if (IsOutput) {
|
||||||
|
//cout << "Calling SetOutput()" << endl;
|
||||||
|
SetOutput();
|
||||||
|
}
|
||||||
|
//cout << "Out FGKinemat::Run" << endl;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
void FGKinemat::Debug(void)
|
||||||
|
{
|
||||||
|
//TODO: Add your source code here
|
||||||
|
}
|
||||||
|
|
88
src/FDM/JSBSim/filtersjb/FGKinemat.h
Normal file
88
src/FDM/JSBSim/filtersjb/FGKinemat.h
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
Header: FGKinemat.h
|
||||||
|
Author: Tony Peden, for flight control system authored by Jon S. Berndt
|
||||||
|
Date started: 12/02/01
|
||||||
|
|
||||||
|
------------- Copyright (C) Anthony K. Peden -------------
|
||||||
|
|
||||||
|
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., 59 Temple
|
||||||
|
Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
Further information about the GNU General Public License can also be found on
|
||||||
|
the world wide web at http://www.gnu.org.
|
||||||
|
|
||||||
|
HISTORY
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
COMMENTS, REFERENCES, and NOTES
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
SENTRY
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||||
|
|
||||||
|
#ifndef FGKinemat_H
|
||||||
|
#define FGKinemat_H
|
||||||
|
|
||||||
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
INCLUDES
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||||
|
|
||||||
|
#ifdef FGFS
|
||||||
|
# include <simgear/compiler.h>
|
||||||
|
# ifdef SG_HAVE_STD_INCLUDES
|
||||||
|
# include <vector>
|
||||||
|
# else
|
||||||
|
# include <vector.h>
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# include <vector>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "FGFCSComponent.h"
|
||||||
|
#include "../FGConfigFile.h"
|
||||||
|
|
||||||
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
DEFINES
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||||
|
|
||||||
|
#define ID_FLAPS "$Id$"
|
||||||
|
|
||||||
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
CLASS DECLARATION
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||||
|
|
||||||
|
class FGKinemat : public FGFCSComponent {
|
||||||
|
public:
|
||||||
|
FGKinemat(FGFCS* fcs, FGConfigFile* AC_cfg);
|
||||||
|
~FGKinemat();
|
||||||
|
bool Run (void );
|
||||||
|
|
||||||
|
private:
|
||||||
|
FGConfigFile* AC_cfg;
|
||||||
|
vector<double> Detents;
|
||||||
|
vector<double> TransitionTimes;
|
||||||
|
int NumDetents,fi;
|
||||||
|
double lastInputCmd;
|
||||||
|
double InputCmd;
|
||||||
|
double OutputPos;
|
||||||
|
bool InTransit;
|
||||||
|
|
||||||
|
void Debug(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Add table
Reference in a new issue