]> git.mxchange.org Git - flightgear.git/blob - src/FDM/JSBSim/models/FGFCS.h
a2b5927688a892c1effc0bc308531bb72d9557ca
[flightgear.git] / src / FDM / JSBSim / models / FGFCS.h
1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2
3  Header:       FGGFCS.h
4  Author:       Jon S. Berndt
5  Date started: 12/12/98
6
7  ------------- Copyright (C) 1999  Jon S. Berndt (jon@jsbsim.org) -------------
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 12/12/98   JSB   Created
29
30 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
31 SENTRY
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
33
34 #ifndef FGFCS_H
35 #define FGFCS_H
36
37 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38 INCLUDES
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
40
41 #include <iosfwd>
42 #include <vector>
43
44 #include <string>
45 #include "models/flight_control/FGFCSComponent.h"
46 #include "models/FGModel.h"
47 #include "models/FGLGear.h"
48 #include "input_output/FGXMLFileRead.h"
49
50 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51 DEFINITIONS
52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
53
54 #define ID_FCS "$Id: FGFCS.h,v 1.30 2010/09/05 17:31:40 jberndt Exp $"
55
56 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57 FORWARD DECLARATIONS
58 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
59
60 namespace JSBSim {
61
62 typedef enum { ofRad=0, ofDeg, ofNorm, ofMag , NForms} OutputForm;
63
64 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65 CLASS DOCUMENTATION
66 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
67
68 /** Encapsulates the Flight Control System (FCS) functionality.
69     This class also encapsulates the identical "system" and "autopilot" capability.
70     FGFCS owns and contains the list of FGFCSComponents
71     that define a system or systems for the modeled aircraft. The config file
72     for the aircraft contains a description of the control path that starts at
73     an input or command and ends at an effector, e.g. an aerosurface. The FCS
74     components which comprise the control laws for an axis are defined
75     sequentially in the configuration file. For instance, for the X-15:
76
77     @code
78     <flight_control name="X-15 SAS">
79       <channel>
80         <summer name="Pitch Trim Sum">
81            <input> fcs/elevator-cmd-norm </input>
82            <input> fcs/pitch-trim-cmd-norm </input>
83            <clipto>
84              <min>-1</min>
85              <max>1</max>
86            </clipto>
87         </summer>
88
89         <aerosurface_scale name="Pitch Command Scale">
90           <input> fcs/pitch-trim-sum </input>
91           <range>
92             <min> -50 </min>
93             <max>  50 </max>
94           </range>
95         </aerosurface_scale>
96
97         ... etc.
98     @endcode
99
100     In the above case we can see the first few components of the pitch channel
101     defined. The input to the first component (a summer), as can be seen in the "Pitch trim
102     sum" component, is really the sum of two parameters: elevator command (from
103     the stick - a pilot input), and pitch trim.
104     The next component created is an aerosurface scale component - a type of
105     gain (see the LoadFCS() method for insight on how the various types of
106     components map into the actual component classes).  This continues until the
107     final component for an axis when the
108     \<output> element is usually used to specify where the output is supposed to go. See the
109     individual components for more information on how they are mechanized.
110
111     Another option for the flight controls portion of the config file is that in
112     addition to using the "NAME" attribute in,
113
114     @code
115     <flight_control name="X-15 SAS">
116     @endcode
117
118     one can also supply a filename:
119
120     @code
121     <flight_control name="X-15 SAS" file="X15.xml">
122     </flight_control>
123     @endcode
124
125     In this case, the FCS would be read in from another file.
126
127     <h2>Properties</h2>
128     @property fcs/aileron-cmd-norm normalized aileron command
129     @property fcs/elevator-cmd-norm normalized elevator command
130     @property fcs/rudder-cmd-norm
131     @property fcs/steer-cmd-norm
132     @property fcs/flap-cmd-norm
133     @property fcs/speedbrake-cmd-norm
134     @property fcs/spoiler-cmd-norm
135     @property fcs/pitch-trim-cmd-norm
136     @property fcs/roll-trim-cmd-norm
137     @property fcs/yaw-trim-cmd-norm
138     @property gear/gear-cmd-norm
139     @property fcs/left-aileron-pos-rad
140     @property fcs/left-aileron-pos-deg
141     @property fcs/left-aileron-pos-norm
142     @property fcs/mag-left-aileron-pos-rad
143     @property fcs/right-aileron-pos-rad
144     @property fcs/right-aileron-pos-deg
145     @property fcs/right-aileron-pos-norm
146     @property fcs/mag-right-aileron-pos-rad
147     @property fcs/elevator-pos-rad
148     @property fcs/elevator-pos-deg
149     @property fcs/elevator-pos-norm
150     @property fcs/mag-elevator-pos-rad
151     @property fcs/rudder-pos-rad
152     @property fcs/rudder-pos-deg
153     @property fcs/rudder-pos-norm
154     @property fcs/mag-rudder-pos-rad
155     @property fcs/flap-pos-rad
156     @property fcs/flap-pos-deg
157     @property fcs/flap-pos-norm
158     @property fcs/speedbrake-pos-rad
159     @property fcs/speedbrake-pos-deg
160     @property fcs/speedbrake-pos-norm
161     @property fcs/mag-speedbrake-pos-rad
162     @property fcs/spoiler-pos-rad
163     @property fcs/spoiler-pos-deg
164     @property fcs/spoiler-pos-norm
165     @property fcs/mag-spoiler-pos-rad
166     @property fcs/wing-fold-pos-norm
167     @property gear/gear-pos-norm
168     @property gear/tailhook-pos-norm
169
170     @author Jon S. Berndt
171     @version $Revision: 1.30 $
172     @see FGActuator
173     @see FGDeadBand
174     @see FGFCSFunction
175     @see FGFilter
176     @see FGGain
177     @see FGKinemat
178     @see FGPID
179     @see FGSensor
180     @see FGSummer
181     @see FGSwitch
182     @see FGFCSComponent
183     @see Element
184 */
185
186 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
187 CLASS DECLARATION
188 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
189
190 class FGFCS : public FGModel, public FGXMLFileRead
191 {
192
193 public:
194   /** Constructor
195       @param Executive a pointer to the parent executive object */
196   FGFCS(FGFDMExec*);
197   /// Destructor
198   ~FGFCS();
199
200   bool InitModel(void);
201
202   /** Runs the Flight Controls model; called by the Executive
203       @return false if no error */
204   bool Run(void);
205
206   /// @name Pilot input command retrieval
207   //@{
208   /** Gets the aileron command.
209       @return aileron command in range from -1.0 - 1.0 */
210   double GetDaCmd(void) const { return DaCmd; }
211
212   /** Gets the elevator command.
213       @return elevator command in range from -1.0 - 1.0 */
214   double GetDeCmd(void) const { return DeCmd; }
215
216   /** Gets the rudder command.
217       @return rudder command in range from -1.0 - 1.0 */
218   double GetDrCmd(void) const { return DrCmd; }
219
220   /** Gets the steering command.
221       @return steering command in range from -1.0 - 1.0 */
222   double GetDsCmd(void) const { return DsCmd; }
223
224   /** Gets the flaps command.
225       @return flaps command in range from 0 to 1.0 */
226   double GetDfCmd(void) const { return DfCmd; }
227
228   /** Gets the speedbrake command.
229       @return speedbrake command in range from 0 to 1.0 */
230   double GetDsbCmd(void) const { return DsbCmd; }
231
232   /** Gets the spoiler command.
233       @return spoiler command in range from 0 to 1.0 */
234   double GetDspCmd(void) const { return DspCmd; }
235
236   /** Gets the throttle command.
237       @param engine engine ID number
238       @return throttle command in range from 0 - 1.0 for the given engine */
239   double GetThrottleCmd(int engine) const;
240
241   /** Gets the mixture command.
242       @param engine engine ID number
243       @return mixture command in range from 0 - 1.0 for the given engine */
244   double GetMixtureCmd(int engine) const { return MixtureCmd[engine]; }
245
246   /** Gets the prop pitch command.
247       @param engine engine ID number
248       @return pitch command in range from 0.0 - 1.0 for the given engine */
249   double GetPropAdvanceCmd(int engine) const { return PropAdvanceCmd[engine]; }
250
251   /** Gets the prop feather command.
252       @param engine engine ID number
253       @return feather command for the given engine (on / off)*/
254   bool GetFeatherCmd(int engine) const { return PropFeatherCmd[engine]; }
255
256   /** Gets the pitch trim command.
257       @return pitch trim command in range from -1.0 to 1.0 */
258   double GetPitchTrimCmd(void) const { return PTrimCmd; }
259
260   /** Gets the rudder trim command.
261       @return rudder trim command in range from -1.0 - 1.0 */
262   double GetYawTrimCmd(void) const { return YTrimCmd; }
263
264   /** Gets the aileron trim command.
265       @return aileron trim command in range from -1.0 - 1.0 */
266   double GetRollTrimCmd(void) const { return RTrimCmd; }
267
268   /** Get the gear extend/retract command. 0 commands gear up, 1 down.
269       defaults to down.
270       @return the current value of the gear extend/retract command*/
271   double GetGearCmd(void) const { return GearCmd; }
272   //@}
273
274   /// @name Aerosurface position retrieval
275   //@{
276   /** Gets the left aileron position.
277       @return aileron position in radians */
278   double GetDaLPos( int form = ofRad )
279                          const { return DaLPos[form]; }
280
281   /** Gets the right aileron position.
282       @return aileron position in radians */
283   double GetDaRPos( int form = ofRad )
284                          const { return DaRPos[form]; }
285
286   /** Gets the elevator position.
287       @return elevator position in radians */
288   double GetDePos( int form = ofRad )
289                          const { return DePos[form]; }
290
291   /** Gets the rudder position.
292       @return rudder position in radians */
293   double GetDrPos( int form = ofRad )
294                          const { return DrPos[form]; }
295
296   /** Gets the speedbrake position.
297       @return speedbrake position in radians */
298   double GetDsbPos( int form = ofRad )
299                          const { return DsbPos[form]; }
300
301   /** Gets the spoiler position.
302       @return spoiler position in radians */
303   double GetDspPos( int form = ofRad )
304                          const { return DspPos[form]; }
305
306   /** Gets the flaps position.
307       @return flaps position in radians */
308   double GetDfPos( int form = ofRad )
309                          const { return DfPos[form]; }
310
311   /** Gets the throttle position.
312       @param engine engine ID number
313       @return throttle position for the given engine in range from 0 - 1.0 */
314   double GetThrottlePos(int engine) const;
315
316   /** Gets the mixture position.
317       @param engine engine ID number
318       @return mixture position for the given engine in range from 0 - 1.0 */
319   double GetMixturePos(int engine) const { return MixturePos[engine]; }
320
321   /** Gets the steering position.
322       @return steering position in degrees */
323   double GetSteerPosDeg(int gear) const { return SteerPosDeg[gear]; }
324
325   /** Gets the gear position (0 up, 1 down), defaults to down
326       @return gear position (0 up, 1 down) */
327   double GetGearPos(void) const { return GearPos; }
328
329   /** Gets the tailhook position (0 up, 1 down)
330       @return tailhook position (0 up, 1 down) */
331   double GetTailhookPos(void) const { return TailhookPos; }
332
333   /** Gets the wing fold position (0 unfolded, 1 folded)
334       @return wing fold position (0 unfolded, 1 folded) */
335   double GetWingFoldPos(void) const { return WingFoldPos; }
336
337   /** Gets the prop pitch position.
338       @param engine engine ID number
339       @return prop pitch position for the given engine in range from 0 - 1.0 */
340   double GetPropAdvance(int engine) const { return PropAdvance[engine]; }
341
342   /** Gets the prop feather position.
343       @param engine engine ID number
344       @return prop fether for the given engine (on / off)*/
345   bool GetPropFeather(int engine) const { return PropFeather[engine]; }
346   //@}
347
348   /** Retrieves the State object pointer.
349       This is used by the FGFCS-owned components.
350       @return pointer to the State object */
351   FGState* GetState(void) { return State; }
352
353   /** Retrieves all component names for inclusion in output stream
354       @param delimiter either a tab or comma string depending on output type
355       @return a string containing the descriptive names for all components */
356   std::string GetComponentStrings(const std::string& delimiter);
357
358   /** Retrieves all component outputs for inclusion in output stream
359       @param delimiter either a tab or comma string depending on output type
360       @return a string containing the numeric values for the current set of
361       component outputs */
362   std::string GetComponentValues(const std::string& delimiter);
363
364   /// @name Pilot input command setting
365   //@{
366   /** Sets the aileron command
367       @param cmd aileron command */
368   void SetDaCmd( double cmd ) { DaCmd = cmd; }
369
370   /** Sets the elevator command
371       @param cmd elevator command in percent*/
372   void SetDeCmd(double cmd ) { DeCmd = cmd; }
373
374   /** Sets the rudder command
375       @param cmd rudder command in percent*/
376   void SetDrCmd(double cmd) { DrCmd = cmd; }
377
378   /** Sets the steering command
379       @param cmd steering command in percent*/
380   void SetDsCmd(double cmd) { DsCmd = cmd; }
381
382   /** Sets the flaps command
383       @param cmd flaps command in percent*/
384   void SetDfCmd(double cmd) { DfCmd = cmd; }
385
386   /** Sets the speedbrake command
387       @param cmd speedbrake command in percent*/
388   void SetDsbCmd(double cmd) { DsbCmd = cmd; }
389
390   /** Sets the spoilers command
391       @param cmd spoilers command in percent*/
392   void SetDspCmd(double cmd) { DspCmd = cmd; }
393
394   /** Sets the pitch trim command
395       @param cmd pitch trim command in percent*/
396   void SetPitchTrimCmd(double cmd) { PTrimCmd = cmd; }
397
398   /** Sets the rudder trim command
399       @param cmd rudder trim command in percent*/
400   void SetYawTrimCmd(double cmd) { YTrimCmd = cmd; }
401
402   /** Sets the aileron trim command
403       @param cmd aileron trim command in percent*/
404   void SetRollTrimCmd(double cmd) { RTrimCmd = cmd; }
405
406   /** Sets the throttle command for the specified engine
407       @param engine engine ID number
408       @param cmd normalized throttle command (0.0 - 1.0)*/
409   void SetThrottleCmd(int engine, double cmd);
410
411   /** Sets the mixture command for the specified engine
412       @param engine engine ID number
413       @param cmd normalized mixture command (0.0 - 1.0)*/
414   void SetMixtureCmd(int engine, double cmd);
415
416   /** Set the gear extend/retract command, defaults to down
417       @param gear command 0 for up, 1 for down */
418    void SetGearCmd(double gearcmd) { GearCmd = gearcmd; }
419
420   /** Sets the propeller pitch command for the specified engine
421       @param engine engine ID number
422       @param cmd mixture command in percent (0.0 - 1.0)*/
423   void SetPropAdvanceCmd(int engine, double cmd);
424
425    /** Sets the propeller feather command for the specified engine
426       @param engine engine ID number
427       @param cmd feather (bool)*/
428   void SetFeatherCmd(int engine, bool cmd);
429   //@}
430
431   /// @name Aerosurface position setting
432   //@{
433   /** Sets the left aileron position
434       @param cmd left aileron position in radians*/
435   void SetDaLPos( int form , double pos );
436
437   /** Sets the right aileron position
438       @param cmd right aileron position in radians*/
439   void SetDaRPos( int form , double pos );
440
441   /** Sets the elevator position
442       @param cmd elevator position in radians*/
443   void SetDePos( int form , double pos );
444
445   /** Sets the rudder position
446       @param cmd rudder position in radians*/
447   void SetDrPos( int form , double pos );
448
449    /** Sets the flaps position
450       @param cmd flaps position in radians*/
451   void SetDfPos( int form , double pos );
452
453   /** Sets the speedbrake position
454       @param cmd speedbrake position in radians*/
455   void SetDsbPos( int form , double pos );
456
457   /** Sets the spoiler position
458       @param cmd spoiler position in radians*/
459   void SetDspPos( int form , double pos );
460
461   /** Sets the actual throttle setting for the specified engine
462       @param engine engine ID number
463       @param cmd normalized throttle setting (0.0 - 1.0)*/
464   void SetThrottlePos(int engine, double cmd);
465
466   /** Sets the actual mixture setting for the specified engine
467       @param engine engine ID number
468       @param cmd normalized mixture setting (0.0 - 1.0)*/
469   void SetMixturePos(int engine, double cmd);
470
471   /** Sets the steering position
472       @param cmd steering position in degrees*/
473   void SetSteerPosDeg(int gear, double pos) { SteerPosDeg[gear] = pos; }
474
475   /** Set the gear extend/retract position, defaults to down
476       @param gear position 0 up, 1 down       */
477    void SetGearPos(double gearpos) { GearPos = gearpos; }
478
479   /** Set the tailhook position
480       @param tailhook position 0 up, 1 down       */
481    void SetTailhookPos(double hookpos) { TailhookPos = hookpos; }
482
483   /** Set the wing fold position
484       @param wing fold position 0 unfolded, 1 folded  */
485    void SetWingFoldPos(double foldpos) { WingFoldPos = foldpos; }
486
487   /** Sets the actual prop pitch setting for the specified engine
488       @param engine engine ID number
489       @param cmd prop pitch setting in percent (0.0 - 1.0)*/
490   void SetPropAdvance(int engine, double cmd);
491
492   /** Sets the actual prop feather setting for the specified engine
493       @param engine engine ID number
494       @param cmd prop fether setting (bool)*/
495   void SetPropFeather(int engine, bool cmd);
496   //@}
497
498     /// @name Landing Gear brakes
499   //@{
500   /** Sets the left brake group
501       @param cmd brake setting in percent (0.0 - 1.0) */
502   void SetLBrake(double cmd) {LeftBrake = cmd;}
503
504   /** Sets the right brake group
505       @param cmd brake setting in percent (0.0 - 1.0) */
506   void SetRBrake(double cmd) {RightBrake = cmd;}
507
508   /** Sets the center brake group
509       @param cmd brake setting in percent (0.0 - 1.0) */
510   void SetCBrake(double cmd) {CenterBrake = cmd;}
511
512   /** Gets the brake for a specified group.
513       @param bg which brakegroup to retrieve the command for
514       @return the brake setting for the supplied brake group argument */
515   double GetBrake(FGLGear::BrakeGroup bg);
516
517   /** Gets the left brake.
518       @return the left brake setting. */
519   double GetLBrake(void) const {return LeftBrake;}
520
521   /** Gets the right brake.
522       @return the right brake setting. */
523   double GetRBrake(void) const {return RightBrake;}
524
525   /** Gets the center brake.
526       @return the center brake setting. */
527   double GetCBrake(void) const {return CenterBrake;}
528   //@}
529
530   enum SystemType { stFCS, stSystem, stAutoPilot }; 
531
532   /** Loads the Flight Control System.
533       Load() is called from FGFDMExec.
534       @param el pointer to the Element instance
535       @param systype type of system (FCS, Autopilot, System) 
536       @return true if succesful */
537   bool Load(Element* el, SystemType systype);
538
539   std::ifstream* FindSystemFile(const std::string& system_filename);
540   std::string FindSystemFullPathname(const std::string& system_filename);
541
542   void AddThrottle(void);
543   void AddGear(void);
544   double GetDt(void);
545
546   FGPropertyManager* GetPropertyManager(void) { return PropertyManager; }
547
548   void LateBind(void);
549
550 private:
551   double DaCmd, DeCmd, DrCmd, DsCmd, DfCmd, DsbCmd, DspCmd;
552   double DePos[NForms], DaLPos[NForms], DaRPos[NForms], DrPos[NForms];
553   double DfPos[NForms], DsbPos[NForms], DspPos[NForms];
554   double PTrimCmd, YTrimCmd, RTrimCmd;
555   std::vector <double> ThrottleCmd;
556   std::vector <double> ThrottlePos;
557   std::vector <double> MixtureCmd;
558   std::vector <double> MixturePos;
559   std::vector <double> PropAdvanceCmd;
560   std::vector <double> PropAdvance;
561   std::vector <bool> PropFeatherCmd;
562   std::vector <bool> PropFeather;
563   std::vector <double> SteerPosDeg;
564   double LeftBrake, RightBrake, CenterBrake; // Brake settings
565   double GearCmd,GearPos;
566   double TailhookPos, WingFoldPos;
567
568   typedef std::vector <FGFCSComponent*> FCSCompVec;
569   FCSCompVec Systems;
570   FCSCompVec FCSComponents;
571   FCSCompVec APComponents;
572   void bind(void);
573   void bindModel(void);
574   void bindThrottle(unsigned int);
575   void Debug(int from);
576 };
577 }
578
579 #endif
580