⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fgtrimaxis.cpp

📁 6 DOF Missle Simulation
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Header:       FGTrimAxis.cpp Author:       Tony Peden Date started: 7/3/00 --------- Copyright (C) 1999  Anthony K. Peden (apeden@earthlink.net) --------- This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser 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 Lesser General Public License can also be found on the world wide web at http://www.gnu.org. HISTORY--------------------------------------------------------------------------------7/3/00   TP   Created%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%INCLUDES%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/#ifdef _MSC_VER#  pragma warning (disable : 4786)#endif#include <string>#include <cstdlib>#include <FGFDMExec.h>#include <models/FGAtmosphere.h>#include "FGInitialCondition.h"#include "FGTrimAxis.h"#include <models/FGAircraft.h>#include <models/FGPropulsion.h>#include <models/FGAerodynamics.h>namespace JSBSim {static const char *IdSrc = "$Id$";static const char *IdHdr = ID_TRIMAXIS;/*****************************************************************************/FGTrimAxis::FGTrimAxis(FGFDMExec* fdex, FGInitialCondition* ic, State st,                       Control ctrl) {  fdmex=fdex;  fgic=ic;  state=st;  control=ctrl;  max_iterations=10;  control_value=0;  its_to_stable_value=0;  total_iterations=0;  total_stability_iterations=0;  state_convert=1.0;  control_convert=1.0;  state_value=0;  state_target=0;  switch(state) {    case tUdot: tolerance = DEFAULT_TOLERANCE; break;    case tVdot: tolerance = DEFAULT_TOLERANCE; break;    case tWdot: tolerance = DEFAULT_TOLERANCE; break;    case tQdot: tolerance = DEFAULT_TOLERANCE / 10; break;    case tPdot: tolerance = DEFAULT_TOLERANCE / 10; break;    case tRdot: tolerance = DEFAULT_TOLERANCE / 10; break;    case tHmgt: tolerance = 0.01; break;    case  tNlf: state_target=1.0; tolerance = 1E-5; break;    case tAll: break;  }  solver_eps=tolerance;  switch(control) {  case tThrottle:    control_min=0;    control_max=1;    control_value=0.5;    break;  case tBeta:    control_min=-30*degtorad;    control_max=30*degtorad;    control_convert=radtodeg;    break;  case tAlpha:    control_min=fdmex->GetAerodynamics()->GetAlphaCLMin();    control_max=fdmex->GetAerodynamics()->GetAlphaCLMax();    if(control_max <= control_min) {      control_max=20*degtorad;      control_min=-5*degtorad;    }    control_value= (control_min+control_max)/2;    control_convert=radtodeg;    solver_eps=tolerance/100;    break;  case tPitchTrim:  case tElevator:  case tRollTrim:  case tAileron:  case tYawTrim:  case tRudder:    control_min=-1;    control_max=1;    state_convert=radtodeg;    solver_eps=tolerance/100;    break;  case tAltAGL:    control_min=0;    control_max=30;    control_value=fdmex->GetPropagate()->GetDistanceAGL();    solver_eps=tolerance/100;    break;  case tTheta:    control_min=fdmex->GetPropagate()->GetEuler(eTht) - 5*degtorad;    control_max=fdmex->GetPropagate()->GetEuler(eTht) + 5*degtorad;    state_convert=radtodeg;    break;  case tPhi:    control_min=fdmex->GetPropagate()->GetEuler(ePhi) - 30*degtorad;    control_max=fdmex->GetPropagate()->GetEuler(ePhi) + 30*degtorad;    state_convert=radtodeg;    control_convert=radtodeg;    break;  case tGamma:    solver_eps=tolerance/100;    control_min=-80*degtorad;    control_max=80*degtorad;    control_convert=radtodeg;    break;  case tHeading:    control_min=fdmex->GetPropagate()->GetEuler(ePsi) - 30*degtorad;    control_max=fdmex->GetPropagate()->GetEuler(ePsi) + 30*degtorad;    state_convert=radtodeg;    break;  }  Debug(0);}/*****************************************************************************/FGTrimAxis::~FGTrimAxis(void){  Debug(1);}/*****************************************************************************/void FGTrimAxis::getState(void) {  switch(state) {  case tUdot: state_value=fdmex->GetPropagate()->GetUVWdot(1)-state_target; break;  case tVdot: state_value=fdmex->GetPropagate()->GetUVWdot(2)-state_target; break;  case tWdot: state_value=fdmex->GetPropagate()->GetUVWdot(3)-state_target; break;  case tQdot: state_value=fdmex->GetPropagate()->GetPQRdot(2)-state_target;break;  case tPdot: state_value=fdmex->GetPropagate()->GetPQRdot(1)-state_target; break;  case tRdot: state_value=fdmex->GetPropagate()->GetPQRdot(3)-state_target; break;  case tHmgt: state_value=computeHmgt()-state_target; break;  case tNlf:  state_value=fdmex->GetAircraft()->GetNlf()-state_target; break;  case tAll: break;  }}/*****************************************************************************///States are not settablevoid FGTrimAxis::getControl(void) {  switch(control) {  case tThrottle:  control_value=fdmex->GetFCS()->GetThrottleCmd(0); break;  case tBeta:      control_value=fdmex->GetAuxiliary()->Getbeta(); break;  case tAlpha:     control_value=fdmex->GetAuxiliary()->Getalpha();  break;  case tPitchTrim: control_value=fdmex->GetFCS() -> GetPitchTrimCmd(); break;  case tElevator:  control_value=fdmex->GetFCS() -> GetDeCmd(); break;  case tRollTrim:  case tAileron:   control_value=fdmex->GetFCS() -> GetDaCmd(); break;  case tYawTrim:  case tRudder:    control_value=fdmex->GetFCS() -> GetDrCmd(); break;  case tAltAGL:    control_value=fdmex->GetPropagate()->GetDistanceAGL();break;  case tTheta:     control_value=fdmex->GetPropagate()->GetEuler(eTht); break;  case tPhi:       control_value=fdmex->GetPropagate()->GetEuler(ePhi); break;  case tGamma:     control_value=fdmex->GetAuxiliary()->GetGamma();break;  case tHeading:   control_value=fdmex->GetPropagate()->GetEuler(ePsi); break;  }}/*****************************************************************************/double FGTrimAxis::computeHmgt(void) {  double diff;  diff   = fdmex->GetPropagate()->GetEuler(ePsi) -             fdmex->GetAuxiliary()->GetGroundTrack();  if( diff < -M_PI ) {     return (diff + 2*M_PI);  } else if( diff > M_PI ) {     return (diff - 2*M_PI);  } else {     return diff;  }}/*****************************************************************************/void FGTrimAxis::setControl(void) {  switch(control) {  case tThrottle:  setThrottlesPct(); break;  case tBeta:      fgic->SetBetaRadIC(control_value); break;  case tAlpha:     fgic->SetAlphaRadIC(control_value);  break;  case tPitchTrim: fdmex->GetFCS()->SetPitchTrimCmd(control_value); break;  case tElevator:  fdmex->GetFCS()->SetDeCmd(control_value); break;  case tRollTrim:  case tAileron:   fdmex->GetFCS()->SetDaCmd(control_value); break;  case tYawTrim:  case tRudder:    fdmex->GetFCS()->SetDrCmd(control_value); break;  case tAltAGL:    fgic->SetAltitudeAGLFtIC(control_value); break;  case tTheta:     fgic->SetThetaRadIC(control_value); break;  case tPhi:       fgic->SetPhiRadIC(control_value); break;  case tGamma:     fgic->SetFlightPathAngleRadIC(control_value); break;  case tHeading:   fgic->SetPsiRadIC(control_value); break;  }}/*****************************************************************************/// the aircraft center of rotation is no longer the cg once the gear// contact the ground so the altitude needs to be changed when pitch// and roll angle are adjusted.  Instead of attempting to calculate the// new center of rotation, pick a gear unit as a reference and use its// location vector to calculate the new height change. i.e. new altitude =// earth z component of that vector (which is in body axes )void FGTrimAxis::SetThetaOnGround(double ff) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -