Branch data Line data Source code
1 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 : :
3 : : Header: FGTrimAxis.h
4 : : Author: Tony Peden
5 : : Date started: 7/3/00
6 : :
7 : : ------------- Copyright (C) 1999 Anthony K. Peden (apeden@earthlink.net) -------------
8 : :
9 : : This program is free software; you can redistribute it and/or modify it under
10 : : the terms of the GNU Lesser General Public License as published by the Free Software
11 : : Foundation; either version 2 of the License, or (at your option) any later
12 : : version.
13 : :
14 : : This program is distributed in the hope that it will be useful, but WITHOUT
15 : : ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 : : FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
17 : : details.
18 : :
19 : : You should have received a copy of the GNU Lesser General Public License along with
20 : : this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21 : : Place - Suite 330, Boston, MA 02111-1307, USA.
22 : :
23 : : Further information about the GNU Lesser General Public License can also be found on
24 : : the world wide web at http://www.gnu.org.
25 : :
26 : : HISTORY
27 : : --------------------------------------------------------------------------------
28 : : 7/3/00 TP Created
29 : :
30 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31 : : SENTRY
32 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
33 : :
34 : : #ifndef FGTRIMAXIS_H
35 : : #define FGTRIMAXIS_H
36 : :
37 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 : : INCLUDES
39 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40 : :
41 : : #include <string>
42 : :
43 : : #include "FGFDMExec.h"
44 : : #include "FGJSBBase.h"
45 : : #include "FGInitialCondition.h"
46 : :
47 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48 : : DEFINITIONS
49 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
50 : :
51 : : #define ID_TRIMAXIS "$Id: FGTrimAxis.h,v 1.4 2006/10/01 22:47:47 jberndt Exp $"
52 : :
53 : : #define DEFAULT_TOLERANCE 0.001
54 : :
55 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56 : : FORWARD DECLARATIONS
57 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
58 : :
59 : : namespace JSBSim {
60 : :
61 [ + + ]: 1122 : const string StateNames[10]= { "all","udot","vdot","wdot","qdot","pdot","rdot",
62 : : "hmgt","nlf"
63 [ + + ][ # # ]: 204 : };
[ # # ]
64 [ + + ][ + - ]: 1628 : const string ControlNames[14]= { "Throttle","Sideslip","Angle of Attack",
[ + + ][ + + ]
65 : : "Elevator","Ailerons","Rudder",
66 : : "Altitude AGL", "Pitch Angle",
67 : : "Roll Angle", "Flight Path Angle",
68 : : "Pitch Trim", "Roll Trim", "Yaw Trim",
69 : : "Heading"
70 [ # # ][ # # ]: 102 : };
71 : :
72 : : class FGInitialCondition;
73 : :
74 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
75 : : CLASS DOCUMENTATION
76 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
77 : :
78 : : /** Models an aircraft axis for purposes of trimming.
79 : : */
80 : :
81 : : /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
82 : : CLASS DECLARATION
83 : : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
84 : :
85 : : enum State { tAll,tUdot,tVdot,tWdot,tQdot,tPdot,tRdot,tHmgt,tNlf };
86 : : enum Control { tThrottle, tBeta, tAlpha, tElevator, tAileron, tRudder, tAltAGL,
87 : : tTheta, tPhi, tGamma, tPitchTrim, tRollTrim, tYawTrim, tHeading };
88 : :
89 : : class FGTrimAxis : public FGJSBBase
90 : : {
91 : : public:
92 : : /** Constructor for Trim Axis class.
93 : : @param fdmex FGFDMExec pointer
94 : : @param IC pointer to initial conditions instance
95 : : @param state a State type (enum)
96 : : @param control a Control type (enum) */
97 : : FGTrimAxis(FGFDMExec* fdmex,
98 : : FGInitialCondition *IC,
99 : : State state,
100 : : Control control );
101 : : /// Destructor
102 : : ~FGTrimAxis();
103 : :
104 : : /** This function iterates through a call to the FGFDMExec::RunIC()
105 : : function until the desired trimming condition falls inside a tolerance.*/
106 : : void Run(void);
107 : :
108 : 0 : double GetState(void) { getState(); return state_value; }
109 : : //Accels are not settable
110 : 0 : inline void SetControl(double value ) { control_value=value; }
111 : 0 : inline double GetControl(void) { return control_value; }
112 : :
113 : 0 : inline State GetStateType(void) { return state; }
114 : 0 : inline Control GetControlType(void) { return control; }
115 : :
116 : 0 : inline string GetStateName(void) { return StateNames[state]; }
117 : 0 : inline string GetControlName(void) { return ControlNames[control]; }
118 : :
119 : 0 : inline double GetControlMin(void) { return control_min; }
120 : 0 : inline double GetControlMax(void) { return control_max; }
121 : :
122 : 0 : inline void SetControlToMin(void) { control_value=control_min; }
123 : 0 : inline void SetControlToMax(void) { control_value=control_max; }
124 : :
125 : : inline void SetControlLimits(double min, double max) {
126 : : control_min=min;
127 : : control_max=max;
128 : : }
129 : :
130 : : inline void SetTolerance(double ff) { tolerance=ff;}
131 : 0 : inline double GetTolerance(void) { return tolerance; }
132 : :
133 : 0 : inline double GetSolverEps(void) { return solver_eps; }
134 : : inline void SetSolverEps(double ff) { solver_eps=ff; }
135 : :
136 : : inline int GetIterationLimit(void) { return max_iterations; }
137 : : inline void SetIterationLimit(int ii) { max_iterations=ii; }
138 : :
139 : : inline int GetStability(void) { return its_to_stable_value; }
140 : 0 : inline int GetRunCount(void) { return total_stability_iterations; }
141 : : double GetAvgStability( void );
142 : :
143 : : void SetThetaOnGround(double ff);
144 : : void SetPhiOnGround(double ff);
145 : :
146 : 0 : inline void SetStateTarget(double target) { state_target=target; }
147 : : inline double GetStateTarget(void) { return state_target; }
148 : :
149 : : bool initTheta(void);
150 : :
151 : : void AxisReport(void);
152 : :
153 : 0 : bool InTolerance(void) { getState(); return (fabs(state_value) <= tolerance); }
154 : :
155 : : private:
156 : : FGFDMExec *fdmex;
157 : : FGInitialCondition *fgic;
158 : :
159 : : State state;
160 : : Control control;
161 : :
162 : : double state_target;
163 : :
164 : : double state_value;
165 : : double control_value;
166 : :
167 : : double control_min;
168 : : double control_max;
169 : :
170 : : double tolerance;
171 : :
172 : : double solver_eps;
173 : :
174 : : double state_convert;
175 : : double control_convert;
176 : :
177 : : int max_iterations;
178 : :
179 : : int its_to_stable_value;
180 : : int total_stability_iterations;
181 : : int total_iterations;
182 : :
183 : : void setThrottlesPct(void);
184 : :
185 : : void getState(void);
186 : : void getControl(void);
187 : : void setControl(void);
188 : :
189 : : double computeHmgt(void);
190 : :
191 : : void Debug(int from);
192 : : };
193 : : }
194 : : #endif
|