Sync. w. JSBSim CVS.
This commit is contained in:
parent
3cdea0705d
commit
ae77c7d75a
10 changed files with 356 additions and 189 deletions
|
@ -108,7 +108,8 @@ CLASS DOCUMENTATION
|
||||||
at those conditions? Check the speed, altitude, configuration (flaps,
|
at those conditions? Check the speed, altitude, configuration (flaps,
|
||||||
gear, etc.), weight, cg, and anything else that may be relevant.
|
gear, etc.), weight, cg, and anything else that may be relevant.
|
||||||
|
|
||||||
Example usage:<pre>
|
Example usage:
|
||||||
|
@code
|
||||||
FGFDMExec* FDMExec = new FGFDMExec();
|
FGFDMExec* FDMExec = new FGFDMExec();
|
||||||
|
|
||||||
FGInitialCondition* fgic = new FGInitialCondition(FDMExec);
|
FGInitialCondition* fgic = new FGInitialCondition(FDMExec);
|
||||||
|
@ -119,7 +120,8 @@ CLASS DOCUMENTATION
|
||||||
if( !fgt.DoTrim() ) {
|
if( !fgt.DoTrim() ) {
|
||||||
cout << "Trim Failed" << endl;
|
cout << "Trim Failed" << endl;
|
||||||
}
|
}
|
||||||
fgt.Report(); </pre>
|
fgt.Report();
|
||||||
|
@endcode
|
||||||
@author Tony Peden
|
@author Tony Peden
|
||||||
@version "$Id$"
|
@version "$Id$"
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -77,7 +77,13 @@ FGFunction::FGFunction(FGPropertyManager* propMan, Element* el, string prefix)
|
||||||
// data types
|
// data types
|
||||||
if (operation == string("property")) {
|
if (operation == string("property")) {
|
||||||
property_name = element->GetDataLine();
|
property_name = element->GetDataLine();
|
||||||
Parameters.push_back(new FGPropertyValue(PropertyManager->GetNode(property_name)));
|
FGPropertyManager* newNode = PropertyManager->GetNode(property_name);
|
||||||
|
if (newNode == 0) {
|
||||||
|
cerr << "The property " << property_name << " is undefined." << endl;
|
||||||
|
abort();
|
||||||
|
} else {
|
||||||
|
Parameters.push_back(new FGPropertyValue( newNode ));
|
||||||
|
}
|
||||||
} else if (operation == string("value")) {
|
} else if (operation == string("value")) {
|
||||||
Parameters.push_back(new FGRealValue(element->GetDataAsNumber()));
|
Parameters.push_back(new FGRealValue(element->GetDataAsNumber()));
|
||||||
} else if (operation == string("table")) {
|
} else if (operation == string("table")) {
|
||||||
|
|
|
@ -158,6 +158,12 @@ FGTable::FGTable(FGPropertyManager* propMan, Element* el) : PropertyManager(prop
|
||||||
property_string = axisElement->GetDataLine();
|
property_string = axisElement->GetDataLine();
|
||||||
node = PropertyManager->GetNode(property_string);
|
node = PropertyManager->GetNode(property_string);
|
||||||
|
|
||||||
|
if (node == 0) {
|
||||||
|
cerr << "IndependenVar property, " << property_string
|
||||||
|
<< " in Table definition is not defined." << endl;
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
|
||||||
lookup_axis = axisElement->GetAttributeValue("lookup");
|
lookup_axis = axisElement->GetAttributeValue("lookup");
|
||||||
if (lookup_axis == string("row")) {
|
if (lookup_axis == string("row")) {
|
||||||
lookupProperty[eRow] = node;
|
lookupProperty[eRow] = node;
|
||||||
|
|
|
@ -81,67 +81,110 @@ CLASS DOCUMENTATION
|
||||||
which comprise the control laws for an axis are defined sequentially in
|
which comprise the control laws for an axis are defined sequentially in
|
||||||
the configuration file. For instance, for the X-15:
|
the configuration file. For instance, for the X-15:
|
||||||
|
|
||||||
<pre>
|
@code
|
||||||
\<flight_control name="X-15 SAS">
|
<flight_control name="X-15 SAS">
|
||||||
\<channel>
|
<channel>
|
||||||
\<component name="Pitch Trim Sum" type="SUMMER">
|
<summer name="Pitch Trim Sum">
|
||||||
<input> fcs/elevator-cmd-norm </input>
|
<input> fcs/elevator-cmd-norm </input>
|
||||||
<input> fcs/pitch-trim-cmd-norm </input>
|
<input> fcs/pitch-trim-cmd-norm </input>
|
||||||
<clipto>
|
<clipto>
|
||||||
<min>-1</min>
|
<min>-1</min>
|
||||||
<max>1</max>
|
<max>1</max>
|
||||||
</clipto>
|
</clipto>
|
||||||
\</component>
|
</summer>
|
||||||
|
|
||||||
\<component name="Pitch Command Scale" TYPE="AEROSURFACE_SCALE">
|
<aerosurface_scale name="Pitch Command Scale">
|
||||||
<input> fcs/pitch-trim-sum </input>
|
<input> fcs/pitch-trim-sum </input>
|
||||||
<limit>
|
<range>
|
||||||
<min> -50 </min>
|
<min> -50 </min>
|
||||||
<max> 50 </max>
|
<max> 50 </max>
|
||||||
</limit>
|
</range>
|
||||||
\</component>
|
</aerosurface_scale>
|
||||||
|
|
||||||
... etc.
|
... etc.
|
||||||
</pre>
|
@endcode
|
||||||
|
|
||||||
In the above case we can see the first few components of the pitch channel
|
In the above case we can see the first few components of the pitch channel
|
||||||
defined. The input to the first component, as can be seen in the "Pitch trim
|
defined. The input to the first component (a summer), as can be seen in the "Pitch trim
|
||||||
sum" component, is really the sum of two parameters: elevator command (from
|
sum" component, is really the sum of two parameters: elevator command (from
|
||||||
the stick - a pilot input), and pitch trim. The type of this component is
|
the stick - a pilot input), and pitch trim.
|
||||||
"Summer".
|
|
||||||
The next component created is an aerosurface scale component - a type of
|
The next component created is an aerosurface scale component - a type of
|
||||||
gain (see the LoadFCS() method for insight on how the various types of
|
gain (see the LoadFCS() method for insight on how the various types of
|
||||||
components map into the actual component classes). This continues until the
|
components map into the actual component classes). This continues until the
|
||||||
final component for an axis when the
|
final component for an axis when the
|
||||||
\<output> element specifies where the output is supposed to go. See the
|
\<output> element is usually used to specify where the output is supposed to go. See the
|
||||||
individual components for more information on how they are mechanized.
|
individual components for more information on how they are mechanized.
|
||||||
|
|
||||||
Another option for the flight controls portion of the config file is that in
|
Another option for the flight controls portion of the config file is that in
|
||||||
addition to using the "NAME" attribute in,
|
addition to using the "NAME" attribute in,
|
||||||
|
|
||||||
<pre>
|
@code
|
||||||
\<flight_control name="X-15 SAS">
|
\<flight_control name="X-15 SAS">
|
||||||
</pre>
|
@endcode
|
||||||
|
|
||||||
one can also supply a filename:
|
one can also supply a filename:
|
||||||
|
|
||||||
<pre>
|
@code
|
||||||
\<flight_control name="X-15 SAS" file="X15.xml">
|
\<flight_control name="X-15 SAS" file="X15.xml">
|
||||||
\</flight_control>
|
\</flight_control>
|
||||||
</pre>
|
@endcode
|
||||||
|
|
||||||
In this case, the FCS would be read in from another file.
|
In this case, the FCS would be read in from another file.
|
||||||
|
|
||||||
|
<h2>Properties</h2>
|
||||||
|
@property fcs/aileron-cmd-norm normalized aileron command
|
||||||
|
@property fcs/elevator-cmd-norm normalized elevator command
|
||||||
|
@property fcs/rudder-cmd-norm
|
||||||
|
@property fcs/steer-cmd-norm
|
||||||
|
@property fcs/flap-cmd-norm
|
||||||
|
@property fcs/speedbrake-cmd-norm
|
||||||
|
@property fcs/spoiler-cmd-norm
|
||||||
|
@property fcs/pitch-trim-cmd-norm
|
||||||
|
@property fcs/roll-trim-cmd-norm
|
||||||
|
@property fcs/yaw-trim-cmd-norm
|
||||||
|
@property gear/gear-cmd-norm
|
||||||
|
@property fcs/left-aileron-pos-rad
|
||||||
|
@property fcs/left-aileron-pos-deg
|
||||||
|
@property fcs/left-aileron-pos-norm
|
||||||
|
@property fcs/mag-left-aileron-pos-rad
|
||||||
|
@property fcs/right-aileron-pos-rad
|
||||||
|
@property fcs/right-aileron-pos-deg
|
||||||
|
@property fcs/right-aileron-pos-norm
|
||||||
|
@property fcs/mag-right-aileron-pos-rad
|
||||||
|
@property fcs/elevator-pos-rad
|
||||||
|
@property fcs/elevator-pos-deg
|
||||||
|
@property fcs/elevator-pos-norm
|
||||||
|
@property fcs/mag-elevator-pos-rad
|
||||||
|
@property fcs/rudder-pos-rad
|
||||||
|
@property fcs/rudder-pos-deg
|
||||||
|
@property fcs/rudder-pos-norm
|
||||||
|
@property fcs/mag-rudder-pos-rad
|
||||||
|
@property fcs/flap-pos-rad
|
||||||
|
@property fcs/flap-pos-deg
|
||||||
|
@property fcs/flap-pos-norm
|
||||||
|
@property fcs/speedbrake-pos-rad
|
||||||
|
@property fcs/speedbrake-pos-deg
|
||||||
|
@property fcs/speedbrake-pos-norm
|
||||||
|
@property fcs/mag-speedbrake-pos-rad
|
||||||
|
@property fcs/spoiler-pos-rad
|
||||||
|
@property fcs/spoiler-pos-deg
|
||||||
|
@property fcs/spoiler-pos-norm
|
||||||
|
@property fcs/mag-spoiler-pos-rad
|
||||||
|
@property gear/gear-pos-norm
|
||||||
|
|
||||||
@author Jon S. Berndt
|
@author Jon S. Berndt
|
||||||
@version $Id$
|
@version $Revision$
|
||||||
@see FGFCSComponent
|
@see FGFCSComponent
|
||||||
@see FGXMLElement
|
@see FGXMLElement
|
||||||
@see FGGain
|
@see FGGain
|
||||||
@see FGSummer
|
@see FGSummer
|
||||||
@see FGSwitch
|
@see FGSwitch
|
||||||
|
@see FGFCSFunction
|
||||||
|
@see FGCondition
|
||||||
@see FGGradient
|
@see FGGradient
|
||||||
@see FGFilter
|
@see FGFilter
|
||||||
@see FGDeadBand
|
@see FGDeadBand
|
||||||
|
@see FGKinemat
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
@ -461,9 +504,7 @@ public:
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
/** Loads the Flight Control System.
|
/** Loads the Flight Control System.
|
||||||
The FGAircraft instance is actually responsible for reading the config file
|
Load() is called from FGFDMExec.
|
||||||
and calling the various Load() methods of the other systems, passing in
|
|
||||||
the XML Element instance pointer. Load() is called from FGAircraft.
|
|
||||||
@param el pointer to the Element instance
|
@param el pointer to the Element instance
|
||||||
@return true if succesful */
|
@return true if succesful */
|
||||||
bool Load(Element* el);
|
bool Load(Element* el);
|
||||||
|
|
|
@ -54,6 +54,7 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
|
||||||
Input = Output = clipmin = clipmax = 0.0;
|
Input = Output = clipmin = clipmax = 0.0;
|
||||||
OutputNode = treenode = 0;
|
OutputNode = treenode = 0;
|
||||||
ClipMinPropertyNode = ClipMaxPropertyNode = 0;
|
ClipMinPropertyNode = ClipMaxPropertyNode = 0;
|
||||||
|
clipMinSign = clipMaxSign = 1.0;
|
||||||
IsOutput = clip = false;
|
IsOutput = clip = false;
|
||||||
string input, clip_string;
|
string input, clip_string;
|
||||||
|
|
||||||
|
@ -121,12 +122,14 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
|
||||||
if (clip_el) {
|
if (clip_el) {
|
||||||
clip_string = clip_el->FindElementValue("min");
|
clip_string = clip_el->FindElementValue("min");
|
||||||
if (clip_string.find_first_not_of("+-.0123456789") != string::npos) { // it's a property
|
if (clip_string.find_first_not_of("+-.0123456789") != string::npos) { // it's a property
|
||||||
|
if (clip_string[0] == '-') clipMinSign = -1.0;
|
||||||
ClipMinPropertyNode = PropertyManager->GetNode( clip_string );
|
ClipMinPropertyNode = PropertyManager->GetNode( clip_string );
|
||||||
} else {
|
} else {
|
||||||
clipmin = clip_el->FindElementValueAsNumber("min");
|
clipmin = clip_el->FindElementValueAsNumber("min");
|
||||||
}
|
}
|
||||||
clip_string = clip_el->FindElementValue("max");
|
clip_string = clip_el->FindElementValue("max");
|
||||||
if (clip_string.find_first_not_of("+-.0123456789") != string::npos) { // it's a property
|
if (clip_string.find_first_not_of("+-.0123456789") != string::npos) { // it's a property
|
||||||
|
if (clip_string[0] == '-') clipMaxSign = -1.0;
|
||||||
ClipMaxPropertyNode = PropertyManager->GetNode( clip_string );
|
ClipMaxPropertyNode = PropertyManager->GetNode( clip_string );
|
||||||
} else {
|
} else {
|
||||||
clipmax = clip_el->FindElementValueAsNumber("max");
|
clipmax = clip_el->FindElementValueAsNumber("max");
|
||||||
|
@ -166,8 +169,8 @@ bool FGFCSComponent::Run(void)
|
||||||
void FGFCSComponent::Clip(void)
|
void FGFCSComponent::Clip(void)
|
||||||
{
|
{
|
||||||
if (clip) {
|
if (clip) {
|
||||||
if (ClipMinPropertyNode != 0) clipmin = ClipMinPropertyNode->getDoubleValue();
|
if (ClipMinPropertyNode != 0) clipmin = clipMinSign*ClipMinPropertyNode->getDoubleValue();
|
||||||
if (ClipMaxPropertyNode != 0) clipmax = ClipMaxPropertyNode->getDoubleValue();
|
if (ClipMaxPropertyNode != 0) clipmax = clipMaxSign*ClipMaxPropertyNode->getDoubleValue();
|
||||||
if (Output > clipmax) Output = clipmax;
|
if (Output > clipmax) Output = clipmax;
|
||||||
else if (Output < clipmin) Output = clipmin;
|
else if (Output < clipmin) Output = clipmin;
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,7 @@ CLASS DOCUMENTATION
|
||||||
|
|
||||||
/** Base class for JSBSim Flight Control System Components.
|
/** Base class for JSBSim Flight Control System Components.
|
||||||
The Flight Control System (FCS) for JSBSim consists of the FCS container
|
The Flight Control System (FCS) for JSBSim consists of the FCS container
|
||||||
class (see \URL[FGFCS]{FGFCS.html}), the FGFCSComponent base class, and the
|
class (see FGFCS), the FGFCSComponent base class, and the
|
||||||
component classes from which can be constructed a string, or channel. See:
|
component classes from which can be constructed a string, or channel. See:
|
||||||
|
|
||||||
- FGSwitch
|
- FGSwitch
|
||||||
|
@ -119,6 +119,7 @@ protected:
|
||||||
double Input;
|
double Input;
|
||||||
double Output;
|
double Output;
|
||||||
double clipmax, clipmin;
|
double clipmax, clipmin;
|
||||||
|
float clipMinSign, clipMaxSign;
|
||||||
bool IsOutput;
|
bool IsOutput;
|
||||||
bool clip;
|
bool clip;
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
Author: Jon S. Berndt
|
Author: Jon S. Berndt
|
||||||
Date started: 4/2000
|
Date started: 4/2000
|
||||||
|
|
||||||
------------- Copyright (C) -------------
|
------------- Copyright (C) 2000 Jon S. Berndt jsb@hal-pc.org -------------
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
|
@ -57,115 +57,163 @@ CLASS DOCUMENTATION
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||||
|
|
||||||
/** Encapsulates a filter for the flight control system.
|
/** Encapsulates a filter for the flight control system.
|
||||||
The filter component can simulate any filter up to second order. The
|
The filter component can simulate any first or second order filter. The
|
||||||
Tustin substitution is used to take filter definitions from LaPlace space to the
|
Tustin substitution is used to take filter definitions from LaPlace space to the
|
||||||
time domain. The general format for a filter specification is:
|
time domain. The general format for a filter specification is:
|
||||||
|
|
||||||
<pre>
|
@code
|
||||||
\<component name="name" type="type">
|
<typename name="name">
|
||||||
\<input> property \</input>
|
<input> property </input>
|
||||||
\<c1> value \<c/1>
|
<c1> value </c1>
|
||||||
[\<c2> value \<c/2>]
|
[<c2> value </c2>]
|
||||||
[\<c3> value \<c/3>]
|
[<c3> value </c3>]
|
||||||
[\<c4> value \<c/4>]
|
[<c4> value </c4>]
|
||||||
[\<c5> value \<c/5>]
|
[<c5> value </c5>]
|
||||||
[\<c6> value \<c/6>]
|
[<c6> value </c6>]
|
||||||
[\<output> property \<output>]
|
[<clipto>
|
||||||
\</component>
|
<min> {[-]property name | value} </min>
|
||||||
</pre>
|
<max> {[-]property name | value} </max>
|
||||||
|
</clipto>]
|
||||||
|
[<output> property </output>]
|
||||||
|
</typename>
|
||||||
|
@endcode
|
||||||
|
|
||||||
For a lag filter of the form,
|
For a lag filter of the form,
|
||||||
<pre>
|
|
||||||
|
@code
|
||||||
C1
|
C1
|
||||||
------
|
------
|
||||||
s + C1
|
s + C1
|
||||||
</pre>
|
@endcode
|
||||||
|
|
||||||
the corresponding filter definition is:
|
the corresponding filter definition is:
|
||||||
<pre>
|
|
||||||
\<component name="name" type="LAG_FILTER">
|
@code
|
||||||
\<input> property \</input>
|
<lag_filter name="name">
|
||||||
\<c1> value \<c/1>
|
<input> property </input>
|
||||||
[\<output> property \<output>]
|
<c1> value </c1>
|
||||||
\</component>
|
[<clipto>
|
||||||
</pre>
|
<min> {[-]property name | value} </min>
|
||||||
|
<max> {[-]property name | value} </max>
|
||||||
|
</clipto>]
|
||||||
|
[<output> property <output>]
|
||||||
|
</lag_filter>
|
||||||
|
@endcode
|
||||||
|
|
||||||
As an example, for the specific filter:
|
As an example, for the specific filter:
|
||||||
<pre>
|
|
||||||
|
@code
|
||||||
600
|
600
|
||||||
------
|
------
|
||||||
s + 600
|
s + 600
|
||||||
</pre>
|
@endcode
|
||||||
|
|
||||||
the corresponding filter definition could be:
|
the corresponding filter definition could be:
|
||||||
<pre>
|
|
||||||
\<component name="Heading Roll Error Lag" type="LAG_FILTER">
|
@code
|
||||||
\<input> fcs/heading-command \</input>
|
<lag_filter name="Heading Roll Error Lag">
|
||||||
\<c1> 600 \</c1>
|
<input> fcs/heading-command </input>
|
||||||
\</component>
|
<c1> 600 </c1>
|
||||||
</pre>
|
</lag_filter>
|
||||||
|
@endcode
|
||||||
|
|
||||||
For a lead-lag filter of the form:
|
For a lead-lag filter of the form:
|
||||||
<pre>
|
|
||||||
|
@code
|
||||||
C1*s + C2
|
C1*s + C2
|
||||||
---------
|
---------
|
||||||
C3*s + C4
|
C3*s + C4
|
||||||
</pre>
|
@endcode
|
||||||
|
|
||||||
The corresponding filter definition is:
|
The corresponding filter definition is:
|
||||||
<pre>
|
|
||||||
\<component name="name" type="LEAD_LAG_FILTER">
|
@code
|
||||||
\<input> property \</input>
|
<lead_lag_filter name="name">
|
||||||
\<c1> value \<c/1>
|
<input> property </input>
|
||||||
\<c2> value \<c/2>
|
<c1> value <c/1>
|
||||||
\<c3> value \<c/3>
|
<c2> value <c/2>
|
||||||
\<c4> value \<c/4>
|
<c3> value <c/3>
|
||||||
[\<output> property \<output>]
|
<c4> value <c/4>
|
||||||
\</component>
|
[<clipto>
|
||||||
</pre>
|
<min> {[-]property name | value} </min>
|
||||||
|
<max> {[-]property name | value} </max>
|
||||||
|
</clipto>]
|
||||||
|
[<output> property </output>]
|
||||||
|
</lead_lag_filter>
|
||||||
|
@endcode
|
||||||
|
|
||||||
For a washout filter of the form:
|
For a washout filter of the form:
|
||||||
<pre>
|
|
||||||
|
@code
|
||||||
s
|
s
|
||||||
------
|
------
|
||||||
s + C1
|
s + C1
|
||||||
</pre>
|
@endcode
|
||||||
|
|
||||||
The corresponding filter definition is:
|
The corresponding filter definition is:
|
||||||
<pre>
|
|
||||||
\<component name="name" type="WASHOUT_FILTER">
|
@code
|
||||||
\<input> property \</input>
|
<washout_filter name="name">
|
||||||
\<c1> value \</c1>
|
<input> property </input>
|
||||||
[\<output> property \<output>]
|
<c1> value </c1>
|
||||||
\</component>
|
[<clipto>
|
||||||
</pre>
|
<min> {[-]property name | value} </min>
|
||||||
|
<max> {[-]property name | value} </max>
|
||||||
|
</clipto>]
|
||||||
|
[<output> property </output>]
|
||||||
|
</washout_filter>
|
||||||
|
@endcode
|
||||||
|
|
||||||
For a second order filter of the form:
|
For a second order filter of the form:
|
||||||
<pre>
|
|
||||||
|
@code
|
||||||
C1*s^2 + C2*s + C3
|
C1*s^2 + C2*s + C3
|
||||||
------------------
|
------------------
|
||||||
C4*s^2 + C5*s + C6
|
C4*s^2 + C5*s + C6
|
||||||
</pre>
|
@endcode
|
||||||
|
|
||||||
The corresponding filter definition is:
|
The corresponding filter definition is:
|
||||||
<pre>
|
|
||||||
\<component name="name" type="SECOND_ORDER_FILTER">
|
@code
|
||||||
\<input> property \</input>
|
<second_order_filter name="name">
|
||||||
\<c1> value \<c/1>
|
<input> property </input>
|
||||||
\<c2> value \<c/2>
|
<c1> value </c1>
|
||||||
\<c3> value \<c/3>
|
<c2> value </c2>
|
||||||
\<c4> value \<c/4>
|
<c3> value </c3>
|
||||||
\<c5> value \<c/5>
|
<c4> value </c4>
|
||||||
\<c6> value \<c/6>
|
<c5> value </c5>
|
||||||
[\<output> property \<output>]
|
<c6> value </c6>
|
||||||
\</component>
|
[<clipto>
|
||||||
</pre>
|
<min> {[-]property name | value} </min>
|
||||||
|
<max> {[-]property name | value} </max>
|
||||||
|
</clipto>]
|
||||||
|
[<output> property </output>]
|
||||||
|
</second_order_filter>
|
||||||
|
@endcode
|
||||||
|
|
||||||
For an integrator of the form:
|
For an integrator of the form:
|
||||||
<pre>
|
|
||||||
|
@code
|
||||||
C1
|
C1
|
||||||
---
|
---
|
||||||
s
|
s
|
||||||
</pre>
|
@endcode
|
||||||
|
|
||||||
The corresponding filter definition is:
|
The corresponding filter definition is:
|
||||||
<pre>
|
|
||||||
\<component name="name" type="INTEGRATOR">
|
@code
|
||||||
\<input> property \</input>
|
<integrator name="name">
|
||||||
\<c1> value \<c/1>
|
<input> property </input>
|
||||||
[\<trigger> property \</trigger>]
|
<c1> value </c1>
|
||||||
[\<output> property \<output>]
|
[<trigger> property </trigger>]
|
||||||
\</component>
|
[<clipto>
|
||||||
</pre>
|
<min> {[-]property name | value} </min>
|
||||||
|
<max> {[-]property name | value} </max>
|
||||||
|
</clipto>]
|
||||||
|
[<output> property </output>]
|
||||||
|
</integrator>
|
||||||
|
@endcode
|
||||||
|
|
||||||
For the integrator, the trigger features the following behavior. If the trigger
|
For the integrator, the trigger features the following behavior. If the trigger
|
||||||
property value is:
|
property value is:
|
||||||
- 0: no action is taken - the output is calculated normally
|
- 0: no action is taken - the output is calculated normally
|
||||||
|
@ -177,7 +225,8 @@ is so that the last component in a "string" can copy its value to the appropriat
|
||||||
output, such as the elevator, or speedbrake, etc.
|
output, such as the elevator, or speedbrake, etc.
|
||||||
|
|
||||||
@author Jon S. Berndt
|
@author Jon S. Berndt
|
||||||
@version $Id$
|
@version $Revision$
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
Header: FGGain.h
|
Header: FGGain.h
|
||||||
Author:
|
Author: Jon Berndt
|
||||||
Date started:
|
Date started: 1998 ?
|
||||||
|
|
||||||
------------- Copyright (C) -------------
|
------------- Copyright (C) 1998 by Jon S. Berndt, jsb@hal-pc.org -------------
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
|
@ -68,98 +68,155 @@ CLASS DOCUMENTATION
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||||
|
|
||||||
/** Encapsulates a gain component for the flight control system.
|
/** Encapsulates a gain component for the flight control system.
|
||||||
The gain component merely multiplies the input by a gain. The form of the
|
The gain component merely multiplies the input by a gain. The <b>pure gain</b> form
|
||||||
gain component specification is:
|
of the component specification is:
|
||||||
<pre>
|
|
||||||
\<component name="name" type="PURE_GAIN">
|
|
||||||
\<input> property \</input>
|
|
||||||
\<gain> value \</gain>
|
|
||||||
[\<output> property \</output>]
|
|
||||||
\</component>
|
|
||||||
</pre>
|
|
||||||
Note: as is the case with the Summer component, the input property name may be
|
|
||||||
immediately preceded by a minus sign to invert that signal.
|
|
||||||
|
|
||||||
The scheduled gain component multiplies the input by a variable gain that is
|
@code
|
||||||
|
<pure_gain name="name">
|
||||||
|
<input> {[-]property} </input>
|
||||||
|
<gain> {property name | value} </gain>
|
||||||
|
[<clipto>
|
||||||
|
<min> {property name | value} </min>
|
||||||
|
<max> {property name | value} </max>
|
||||||
|
</clipto>]
|
||||||
|
[<output> {property} </output>]
|
||||||
|
</pure_gain>
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
@code
|
||||||
|
<pure_gain name="Roll AP Wing Leveler">
|
||||||
|
<input>fcs/attitude/sensor/phi-rad</input>
|
||||||
|
<gain>2.0</gain>
|
||||||
|
<clipto>
|
||||||
|
<min>-0.255</min>
|
||||||
|
<max>0.255</max>
|
||||||
|
</clipto>
|
||||||
|
</pure_gain>
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
Note: the input property name may be immediately preceded by a minus sign to
|
||||||
|
invert that signal.
|
||||||
|
|
||||||
|
The <b>scheduled gain</b> component multiplies the input by a variable gain that is
|
||||||
dependent on another property (such as qbar, altitude, etc.). The lookup
|
dependent on another property (such as qbar, altitude, etc.). The lookup
|
||||||
mapping is in the form of a table. This kind of component might be used, for
|
mapping is in the form of a table. This kind of component might be used, for
|
||||||
example, in a case where aerosurface deflection must only be commanded to
|
example, in a case where aerosurface deflection must only be commanded to
|
||||||
acceptable settings - i.e at higher qbar the commanded elevator setting might
|
acceptable settings - i.e at higher qbar the commanded elevator setting might
|
||||||
be attenuated. The form of the scheduled gain component specification is:
|
be attenuated. The form of the scheduled gain component specification is:
|
||||||
<pre>
|
|
||||||
\<COMPONENT NAME="name" TYPE="SCHEDULED_GAIN">
|
@code
|
||||||
INPUT \<property>
|
<scheduled_gain name="name">
|
||||||
[GAIN \<value>]
|
<input> {[-]property} </input>
|
||||||
SCHEDULED_BY \<property>
|
<table>
|
||||||
ROWS \<number_of_rows>
|
<tableData>
|
||||||
\<lookup_value gain_value>
|
...
|
||||||
?
|
</tableData>
|
||||||
[CLIPTO \<min> \<max> 1]
|
</table>
|
||||||
[OUTPUT \<property>]
|
[<clipto>
|
||||||
\</COMPONENT>
|
<min> {[-]property name | value} </min>
|
||||||
</pre>
|
<max> {[-]property name | value} </max>
|
||||||
|
</clipto>]
|
||||||
|
[<gain> {property name | value} </gain>]
|
||||||
|
[<output> {property} </output>]
|
||||||
|
</scheduled_gain>
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
@code
|
||||||
|
<scheduled_gain name="Scheduled Steer Pos Deg">
|
||||||
|
<input>fcs/steer-cmd-norm</input>
|
||||||
|
<table>
|
||||||
|
<independentVar>velocities/vg-fps</independentVar>
|
||||||
|
<tableData>
|
||||||
|
10.0 80.0
|
||||||
|
50.0 15.0
|
||||||
|
150.0 2.0
|
||||||
|
</tableData>
|
||||||
|
</table>
|
||||||
|
<gain>0.017</gain>
|
||||||
|
<output>fcs/steer-pos-rad</output>
|
||||||
|
</scheduled_gain>
|
||||||
|
@endcode
|
||||||
|
|
||||||
An overall GAIN may be supplied that is multiplicative with the scheduled gain.
|
An overall GAIN may be supplied that is multiplicative with the scheduled gain.
|
||||||
|
|
||||||
Note: as is the case with the Summer component, the input property name may
|
Note: the input property name may be immediately preceded by a minus sign to
|
||||||
be immediately preceded by a minus sign to invert that signal.
|
invert that signal.
|
||||||
|
|
||||||
Here is an example of a scheduled gain component specification:
|
In the example above, we see the utility of the overall gain value in
|
||||||
<pre>
|
|
||||||
\<COMPONENT NAME="Pitch Scheduled Gain 1" TYPE="SCHEDULED_GAIN">
|
|
||||||
INPUT fcs/pitch-gain-1
|
|
||||||
GAIN 0.017
|
|
||||||
SCHEDULED_BY fcs/elevator-pos-rad
|
|
||||||
ROWS 22
|
|
||||||
-0.68 -26.548
|
|
||||||
-0.595 -20.513
|
|
||||||
-0.51 -15.328
|
|
||||||
-0.425 -10.993
|
|
||||||
-0.34 -7.508
|
|
||||||
-0.255 -4.873
|
|
||||||
-0.17 -3.088
|
|
||||||
-0.085 -2.153
|
|
||||||
0 -2.068
|
|
||||||
0.085 -2.833
|
|
||||||
0.102 -3.088
|
|
||||||
0.119 -3.377
|
|
||||||
0.136 -3.7
|
|
||||||
0.153 -4.057
|
|
||||||
0.17 -4.448
|
|
||||||
0.187 -4.873
|
|
||||||
0.272 -7.508
|
|
||||||
0.357 -10.993
|
|
||||||
0.442 -15.328
|
|
||||||
0.527 -20.513
|
|
||||||
0.612 -26.548
|
|
||||||
0.697 -33.433
|
|
||||||
\</COMPONENT>
|
|
||||||
</pre>
|
|
||||||
In the example above, we see the utility of the overall GAIN value in
|
|
||||||
effecting a degrees-to-radians conversion.
|
effecting a degrees-to-radians conversion.
|
||||||
|
|
||||||
The aerosurface scale component is a modified version of the simple gain
|
The <b>aerosurface scale</b> component is a modified version of the simple gain
|
||||||
component. The normal purpose
|
component. The purpose for this component is to take control inputs from the
|
||||||
for this component is to take control inputs that range from -1 to +1 or
|
domain minimum and maximum, as specified (or from -1 to +1 by default) and
|
||||||
from 0 to +1 and scale them to match the expected inputs to a flight control
|
scale them to map to a specified range. This can be done, for instance, to match
|
||||||
system. For instance, the normal and expected ability of a pilot to push or
|
the component outputs to the expected inputs to a flight control system.
|
||||||
pull on a control stick is about 50 pounds. The input to the pitch channelb
|
|
||||||
lock diagram of a flight control system is in units of pounds. Yet, the
|
The zero_centered element dictates whether the domain-to-range mapping is linear
|
||||||
joystick control input is usually in a range from -1 to +1. The form of the
|
or centered about zero. For example, if zero_centered is false, and if the domain
|
||||||
aerosurface scaling component specification is:
|
or range is not symmetric about zero, and an input value is zero, the output
|
||||||
<pre>
|
will not be zero. Let's say that the domain is min=-2 and max=+4, with a range
|
||||||
\<COMPONENT NAME="name" TYPE="AEROSURFACE_SCALE">
|
of -1 to +1. If the input is 0.0, then the "normalized" input is calculated to
|
||||||
INPUT \<property>
|
be 33% of the way from the minimum to the maximum. That input would be mapped
|
||||||
MIN \<value>
|
to an output of -0.33, which is 33% of the way from the range minimum to maximum.
|
||||||
MAX \<value>
|
If zero_centered is set to true (or 1) then an input of 0.0 will be mapped to an
|
||||||
[GAIN \<value>]
|
output of 0.0, although if either the domain or range are unsymmetric about
|
||||||
[OUTPUT \<property>]
|
0.0, then the scales for the positive and negative portions of the input domain
|
||||||
\</COMPONENT>
|
(above and below 0.0) will be different. The zero_centered element is true by
|
||||||
</pre>
|
default. Note that this feature may be important for some control surface mappings,
|
||||||
Note: as is the case with the Summer component, the input property name may be
|
where the maximum upper and lower deflections may be different, but where a zero
|
||||||
immediately preceded by a minus sign to invert that signal.
|
setting is desired to be the "undeflected" value, and where full travel of the
|
||||||
|
stick is desired to cause a full deflection of the control surface.
|
||||||
|
|
||||||
|
The form of the aerosurface scaling component specification is:
|
||||||
|
|
||||||
|
@code
|
||||||
|
<aerosurface_scale name="name">
|
||||||
|
<input> {[-]property name} </input>
|
||||||
|
<domain>
|
||||||
|
<min> {value} </min> <!-- If omitted, default is -1.0 ->
|
||||||
|
<max> {value} </max> <!-- If omitted, default is 1.0 ->
|
||||||
|
</domain>
|
||||||
|
<range>
|
||||||
|
<min> {value} </min> <!-- If omitted, default is 0 ->
|
||||||
|
<max> {value} </max> <!-- If omitted, default is 0 ->
|
||||||
|
</range>
|
||||||
|
<zero_centered< value </zero_centered>
|
||||||
|
[<clipto>
|
||||||
|
<min> {[-]property name | value} </min>
|
||||||
|
<max> {[-]property name | value} </max>
|
||||||
|
</clipto>]
|
||||||
|
[<gain> {property name | value} </gain>]
|
||||||
|
[<output> {property} </output>]
|
||||||
|
</aerosurface_scale>
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
Note: the input property name may be immediately preceded by a minus sign to
|
||||||
|
invert that signal.
|
||||||
|
|
||||||
|
For instance, the normal and expected ability of a
|
||||||
|
pilot to push or pull on a control stick is about 50 pounds. The input to the
|
||||||
|
pitch channel block diagram of a flight control system is often in units of pounds.
|
||||||
|
Yet, the joystick control input usually defines a span from -1 to +1. The aerosurface_scale
|
||||||
|
form of the gain component maps the inputs to the desired output range. The example
|
||||||
|
below shoes a simple aerosurface_scale component that maps the joystick
|
||||||
|
input to a range of +/- 50, which represents pilot stick force in pounds for the F-16.
|
||||||
|
|
||||||
|
@code
|
||||||
|
<aerosurface_scale name="Pilot input">
|
||||||
|
<input>fcs/elevator-cmd-norm</input>
|
||||||
|
<range>
|
||||||
|
<min> -50 </min> <!-- If omitted, default is 0 ->
|
||||||
|
<max> 50 </max> <!-- If omitted, default is 0 ->
|
||||||
|
</range>
|
||||||
|
</aerosurface_scale>
|
||||||
|
@endcode
|
||||||
|
|
||||||
@author Jon S. Berndt
|
@author Jon S. Berndt
|
||||||
@version $Id$
|
@version $Revision$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
|
@ -99,6 +99,8 @@ will be *anywhere* from 0.95 to 1.05 of the actual "perfect" value at any time -
|
||||||
even varying all the way from 0.95 to 1.05 in adjacent frames - whatever the delta
|
even varying all the way from 0.95 to 1.05 in adjacent frames - whatever the delta
|
||||||
time.
|
time.
|
||||||
|
|
||||||
|
@author Jon S. Berndt
|
||||||
|
@version $Revision$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
|
@ -223,7 +223,7 @@ double FGPropeller::GetPowerRequired(void)
|
||||||
cPReq = cPower->GetValue(J);
|
cPReq = cPower->GetValue(J);
|
||||||
} else { // Variable pitch prop
|
} else { // Variable pitch prop
|
||||||
|
|
||||||
if (MaxRPM != MinRPM) { // fixed-speed prop
|
if (MaxRPM != MinRPM) { // constant speed prop
|
||||||
|
|
||||||
// do normal calculation when propeller is neither feathered nor reversed
|
// do normal calculation when propeller is neither feathered nor reversed
|
||||||
if (!Feathered) {
|
if (!Feathered) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue