1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7 ------------- Copyright (C) 1999 Jon S. Berndt (jon@jsbsim.org) -------------
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
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
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.
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.
27 --------------------------------------------------------------------------------
30 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
37 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
39 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
45 #include "models/flight_control/FGFCSComponent.h"
46 #include "models/FGModel.h"
47 #include "models/FGLGear.h"
48 #include "input_output/FGXMLFileRead.h"
50 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
54 #define ID_FCS "$Id: FGFCS.h,v 1.39 2011/08/14 20:15:56 jberndt Exp $"
56 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
62 typedef enum { ofRad=0, ofDeg, ofNorm, ofMag , NForms} OutputForm;
64 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
66 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
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:
78 <flight_control name="X-15 SAS">
80 <summer name="Pitch Trim Sum">
81 <input> fcs/elevator-cmd-norm </input>
82 <input> fcs/pitch-trim-cmd-norm </input>
89 <aerosurface_scale name="Pitch Command Scale">
90 <input> fcs/pitch-trim-sum </input>
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.
111 Another option for the flight controls portion of the config file is that in
112 addition to using the "NAME" attribute in,
115 <flight_control name="X-15 SAS">
118 one can also supply a filename:
121 <flight_control name="X-15 SAS" file="X15.xml">
125 In this case, the FCS would be read in from another file.
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
170 @author Jon S. Berndt
171 @version $Revision: 1.39 $
186 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
188 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
190 class FGFCS : public FGModel, public FGXMLFileRead
195 @param Executive a pointer to the parent executive object */
200 bool InitModel(void);
202 /** Runs the Flight Controls model; called by the Executive
203 Can pass in a value indicating if the executive is directing the simulation to Hold.
204 @param Holding if true, the executive has been directed to hold the sim from
205 advancing time. Some models may ignore this flag, such as the Input
206 model, which may need to be active to listen on a socket for the
207 "Resume" command to be given.
208 @return false if no error */
209 bool Run(bool Holding);
211 /// @name Pilot input command retrieval
213 /** Gets the aileron command.
214 @return aileron command in range from -1.0 - 1.0 */
215 double GetDaCmd(void) const { return DaCmd; }
217 /** Gets the elevator command.
218 @return elevator command in range from -1.0 - 1.0 */
219 double GetDeCmd(void) const { return DeCmd; }
221 /** Gets the rudder command.
222 @return rudder command in range from -1.0 - 1.0 */
223 double GetDrCmd(void) const { return DrCmd; }
225 /** Gets the steering command.
226 @return steering command in range from -1.0 - 1.0 */
227 double GetDsCmd(void) const { return DsCmd; }
229 /** Gets the flaps command.
230 @return flaps command in range from 0 to 1.0 */
231 double GetDfCmd(void) const { return DfCmd; }
233 /** Gets the speedbrake command.
234 @return speedbrake command in range from 0 to 1.0 */
235 double GetDsbCmd(void) const { return DsbCmd; }
237 /** Gets the spoiler command.
238 @return spoiler command in range from 0 to 1.0 */
239 double GetDspCmd(void) const { return DspCmd; }
241 /** Gets the throttle command.
242 @param engine engine ID number
243 @return throttle command in range from 0 - 1.0 for the given engine */
244 double GetThrottleCmd(int engine) const;
246 vector <double> GetThrottleCmd() const {return ThrottleCmd;}
248 /** Gets the mixture command.
249 @param engine engine ID number
250 @return mixture command in range from 0 - 1.0 for the given engine */
251 double GetMixtureCmd(int engine) const { return MixtureCmd[engine]; }
253 vector <double> GetMixtureCmd() const {return MixtureCmd;}
255 /** Gets the prop pitch command.
256 @param engine engine ID number
257 @return pitch command in range from 0.0 - 1.0 for the given engine */
258 double GetPropAdvanceCmd(int engine) const { return PropAdvanceCmd[engine]; }
260 /** Gets the prop feather command.
261 @param engine engine ID number
262 @return feather command for the given engine (on / off)*/
263 bool GetFeatherCmd(int engine) const { return PropFeatherCmd[engine]; }
265 /** Gets the pitch trim command.
266 @return pitch trim command in range from -1.0 to 1.0 */
267 double GetPitchTrimCmd(void) const { return PTrimCmd; }
269 /** Gets the rudder trim command.
270 @return rudder trim command in range from -1.0 - 1.0 */
271 double GetYawTrimCmd(void) const { return YTrimCmd; }
273 /** Gets the aileron trim command.
274 @return aileron trim command in range from -1.0 - 1.0 */
275 double GetRollTrimCmd(void) const { return RTrimCmd; }
277 /** Get the gear extend/retract command. 0 commands gear up, 1 down.
279 @return the current value of the gear extend/retract command*/
280 double GetGearCmd(void) const { return GearCmd; }
283 /// @name Aerosurface position retrieval
285 /** Gets the left aileron position.
286 @return aileron position in radians */
287 double GetDaLPos( int form = ofRad )
288 const { return DaLPos[form]; }
290 /** Gets the right aileron position.
291 @return aileron position in radians */
292 double GetDaRPos( int form = ofRad )
293 const { return DaRPos[form]; }
295 /** Gets the elevator position.
296 @return elevator position in radians */
297 double GetDePos( int form = ofRad )
298 const { return DePos[form]; }
300 /** Gets the rudder position.
301 @return rudder position in radians */
302 double GetDrPos( int form = ofRad )
303 const { return DrPos[form]; }
305 /** Gets the speedbrake position.
306 @return speedbrake position in radians */
307 double GetDsbPos( int form = ofRad )
308 const { return DsbPos[form]; }
310 /** Gets the spoiler position.
311 @return spoiler position in radians */
312 double GetDspPos( int form = ofRad )
313 const { return DspPos[form]; }
315 /** Gets the flaps position.
316 @return flaps position in radians */
317 double GetDfPos( int form = ofRad )
318 const { return DfPos[form]; }
320 /** Gets the throttle position.
321 @param engine engine ID number
322 @return throttle position for the given engine in range from 0 - 1.0 */
323 double GetThrottlePos(int engine) const;
325 vector <double> GetThrottlePos() const {return ThrottlePos;}
327 /** Gets the mixture position.
328 @param engine engine ID number
329 @return mixture position for the given engine in range from 0 - 1.0 */
330 double GetMixturePos(int engine) const { return MixturePos[engine]; }
332 vector <double> GetMixturePos() const {return MixturePos;}
334 /** Gets the steering position.
335 @return steering position in degrees */
336 double GetSteerPosDeg(int gear) const { return SteerPosDeg[gear]; }
338 vector <double> GetSteerPosDeg() const {return SteerPosDeg;}
340 /** Gets the gear position (0 up, 1 down), defaults to down
341 @return gear position (0 up, 1 down) */
342 double GetGearPos(void) const { return GearPos; }
344 /** Gets the tailhook position (0 up, 1 down)
345 @return tailhook position (0 up, 1 down) */
346 double GetTailhookPos(void) const { return TailhookPos; }
348 /** Gets the wing fold position (0 unfolded, 1 folded)
349 @return wing fold position (0 unfolded, 1 folded) */
350 double GetWingFoldPos(void) const { return WingFoldPos; }
352 /** Gets the prop pitch position.
353 @param engine engine ID number
354 @return prop pitch position for the given engine in range from 0 - 1.0 */
355 double GetPropAdvance(int engine) const { return PropAdvance[engine]; }
357 vector <double> GetPropAdvance() const { return PropAdvance; }
359 /** Gets the prop feather position.
360 @param engine engine ID number
361 @return prop fether for the given engine (on / off)*/
362 bool GetPropFeather(int engine) const { return PropFeather[engine]; }
364 vector <bool> GetPropFeather() const { return PropFeather; }
367 /** Retrieves all component names for inclusion in output stream
368 @param delimiter either a tab or comma string depending on output type
369 @return a string containing the descriptive names for all components */
370 std::string GetComponentStrings(const std::string& delimiter) const;
372 /** Retrieves all component outputs for inclusion in output stream
373 @param delimiter either a tab or comma string depending on output type
374 @return a string containing the numeric values for the current set of
376 std::string GetComponentValues(const std::string& delimiter) const;
378 /// @name Pilot input command setting
380 /** Sets the aileron command
381 @param cmd aileron command */
382 void SetDaCmd( double cmd ) { DaCmd = cmd; }
384 /** Sets the elevator command
385 @param cmd elevator command in percent*/
386 void SetDeCmd(double cmd ) { DeCmd = cmd; }
388 /** Sets the rudder command
389 @param cmd rudder command in percent*/
390 void SetDrCmd(double cmd) { DrCmd = cmd; }
392 /** Sets the steering command
393 @param cmd steering command in percent*/
394 void SetDsCmd(double cmd) { DsCmd = cmd; }
396 /** Sets the flaps command
397 @param cmd flaps command in percent*/
398 void SetDfCmd(double cmd) { DfCmd = cmd; }
400 /** Sets the speedbrake command
401 @param cmd speedbrake command in percent*/
402 void SetDsbCmd(double cmd) { DsbCmd = cmd; }
404 /** Sets the spoilers command
405 @param cmd spoilers command in percent*/
406 void SetDspCmd(double cmd) { DspCmd = cmd; }
408 /** Sets the pitch trim command
409 @param cmd pitch trim command in percent*/
410 void SetPitchTrimCmd(double cmd) { PTrimCmd = cmd; }
412 /** Sets the rudder trim command
413 @param cmd rudder trim command in percent*/
414 void SetYawTrimCmd(double cmd) { YTrimCmd = cmd; }
416 /** Sets the aileron trim command
417 @param cmd aileron trim command in percent*/
418 void SetRollTrimCmd(double cmd) { RTrimCmd = cmd; }
420 /** Sets the throttle command for the specified engine
421 @param engine engine ID number
422 @param cmd normalized throttle command (0.0 - 1.0)*/
423 void SetThrottleCmd(int engine, double cmd);
425 /** Sets the mixture command for the specified engine
426 @param engine engine ID number
427 @param cmd normalized mixture command (0.0 - 1.0)*/
428 void SetMixtureCmd(int engine, double cmd);
430 /** Set the gear extend/retract command, defaults to down
431 @param gear command 0 for up, 1 for down */
432 void SetGearCmd(double gearcmd) { GearCmd = gearcmd; }
434 /** Sets the propeller pitch command for the specified engine
435 @param engine engine ID number
436 @param cmd mixture command in percent (0.0 - 1.0)*/
437 void SetPropAdvanceCmd(int engine, double cmd);
439 /** Sets the propeller feather command for the specified engine
440 @param engine engine ID number
441 @param cmd feather (bool)*/
442 void SetFeatherCmd(int engine, bool cmd);
445 /// @name Aerosurface position setting
447 /** Sets the left aileron position
448 @param cmd left aileron position in radians*/
449 void SetDaLPos( int form , double pos );
451 /** Sets the right aileron position
452 @param cmd right aileron position in radians*/
453 void SetDaRPos( int form , double pos );
455 /** Sets the elevator position
456 @param cmd elevator position in radians*/
457 void SetDePos( int form , double pos );
459 /** Sets the rudder position
460 @param cmd rudder position in radians*/
461 void SetDrPos( int form , double pos );
463 /** Sets the flaps position
464 @param cmd flaps position in radians*/
465 void SetDfPos( int form , double pos );
467 /** Sets the speedbrake position
468 @param cmd speedbrake position in radians*/
469 void SetDsbPos( int form , double pos );
471 /** Sets the spoiler position
472 @param cmd spoiler position in radians*/
473 void SetDspPos( int form , double pos );
475 /** Sets the actual throttle setting for the specified engine
476 @param engine engine ID number
477 @param cmd normalized throttle setting (0.0 - 1.0)*/
478 void SetThrottlePos(int engine, double cmd);
480 /** Sets the actual mixture setting for the specified engine
481 @param engine engine ID number
482 @param cmd normalized mixture setting (0.0 - 1.0)*/
483 void SetMixturePos(int engine, double cmd);
485 /** Sets the steering position
486 @param cmd steering position in degrees*/
487 void SetSteerPosDeg(int gear, double pos) { SteerPosDeg[gear] = pos; }
489 /** Set the gear extend/retract position, defaults to down
490 @param gear position 0 up, 1 down */
491 void SetGearPos(double gearpos) { GearPos = gearpos; }
493 /** Set the tailhook position
494 @param tailhook position 0 up, 1 down */
495 void SetTailhookPos(double hookpos) { TailhookPos = hookpos; }
497 /** Set the wing fold position
498 @param wing fold position 0 unfolded, 1 folded */
499 void SetWingFoldPos(double foldpos) { WingFoldPos = foldpos; }
501 /** Sets the actual prop pitch setting for the specified engine
502 @param engine engine ID number
503 @param cmd prop pitch setting in percent (0.0 - 1.0)*/
504 void SetPropAdvance(int engine, double cmd);
506 /** Sets the actual prop feather setting for the specified engine
507 @param engine engine ID number
508 @param cmd prop fether setting (bool)*/
509 void SetPropFeather(int engine, bool cmd);
512 /// @name Landing Gear brakes
514 /** Sets the left brake group
515 @param cmd brake setting in percent (0.0 - 1.0) */
516 void SetLBrake(double cmd) {BrakePos[FGLGear::bgLeft] = cmd;}
518 /** Sets the right brake group
519 @param cmd brake setting in percent (0.0 - 1.0) */
520 void SetRBrake(double cmd) {BrakePos[FGLGear::bgRight] = cmd;}
522 /** Sets the center brake group
523 @param cmd brake setting in percent (0.0 - 1.0) */
524 void SetCBrake(double cmd) {BrakePos[FGLGear::bgCenter] = cmd;}
526 /** Gets the brake for a specified group.
527 @param bg which brakegroup to retrieve the command for
528 @return the brake setting for the supplied brake group argument */
529 double GetBrake(FGLGear::BrakeGroup bg);
531 vector <double> GetBrakePos() const {return BrakePos;}
533 /** Gets the left brake.
534 @return the left brake setting. */
535 double GetLBrake(void) const {return BrakePos[FGLGear::bgLeft];}
537 /** Gets the right brake.
538 @return the right brake setting. */
539 double GetRBrake(void) const {return BrakePos[FGLGear::bgRight];}
541 /** Gets the center brake.
542 @return the center brake setting. */
543 double GetCBrake(void) const {return BrakePos[FGLGear::bgCenter];}
546 enum SystemType { stFCS, stSystem, stAutoPilot };
548 /** Loads the Flight Control System.
549 Load() is called from FGFDMExec.
550 @param el pointer to the Element instance
551 @param systype type of system (FCS, Autopilot, System)
552 @return true if succesful */
553 bool Load(Element* el, SystemType systype);
555 std::ifstream* FindSystemFile(const std::string& system_filename);
556 std::string FindSystemFullPathname(const std::string& system_filename);
558 void AddThrottle(void);
559 void AddGear(unsigned int NumGear);
562 FGPropertyManager* GetPropertyManager(void) { return PropertyManager; }
564 bool GetTrimStatus(void) const { return FDMExec->GetTrimStatus(); }
567 unsigned int NumGear;
571 double DaCmd, DeCmd, DrCmd, DsCmd, DfCmd, DsbCmd, DspCmd;
572 double DePos[NForms], DaLPos[NForms], DaRPos[NForms], DrPos[NForms];
573 double DfPos[NForms], DsbPos[NForms], DspPos[NForms];
574 double PTrimCmd, YTrimCmd, RTrimCmd;
575 std::vector <double> ThrottleCmd;
576 std::vector <double> ThrottlePos;
577 std::vector <double> MixtureCmd;
578 std::vector <double> MixturePos;
579 std::vector <double> PropAdvanceCmd;
580 std::vector <double> PropAdvance;
581 std::vector <bool> PropFeatherCmd;
582 std::vector <bool> PropFeather;
583 std::vector <double> SteerPosDeg;
584 double LeftBrake, RightBrake, CenterBrake; // Brake settings
585 vector <double> BrakePos; // left, center, right - defined by FGLGear:: enum
586 double GearCmd,GearPos;
587 double TailhookPos, WingFoldPos;
589 typedef std::vector <FGFCSComponent*> FCSCompVec;
591 FCSCompVec FCSComponents;
592 FCSCompVec APComponents;
594 void bindModel(void);
595 void bindThrottle(unsigned int);
596 void Debug(int from);