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,
|
||||
gear, etc.), weight, cg, and anything else that may be relevant.
|
||||
|
||||
Example usage:<pre>
|
||||
Example usage:
|
||||
@code
|
||||
FGFDMExec* FDMExec = new FGFDMExec();
|
||||
|
||||
FGInitialCondition* fgic = new FGInitialCondition(FDMExec);
|
||||
|
@ -119,7 +120,8 @@ CLASS DOCUMENTATION
|
|||
if( !fgt.DoTrim() ) {
|
||||
cout << "Trim Failed" << endl;
|
||||
}
|
||||
fgt.Report(); </pre>
|
||||
fgt.Report();
|
||||
@endcode
|
||||
@author Tony Peden
|
||||
@version "$Id$"
|
||||
*/
|
||||
|
|
|
@ -77,7 +77,13 @@ FGFunction::FGFunction(FGPropertyManager* propMan, Element* el, string prefix)
|
|||
// data types
|
||||
if (operation == string("property")) {
|
||||
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")) {
|
||||
Parameters.push_back(new FGRealValue(element->GetDataAsNumber()));
|
||||
} else if (operation == string("table")) {
|
||||
|
|
|
@ -158,6 +158,12 @@ FGTable::FGTable(FGPropertyManager* propMan, Element* el) : PropertyManager(prop
|
|||
property_string = axisElement->GetDataLine();
|
||||
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");
|
||||
if (lookup_axis == string("row")) {
|
||||
lookupProperty[eRow] = node;
|
||||
|
|
|
@ -81,67 +81,110 @@ CLASS DOCUMENTATION
|
|||
which comprise the control laws for an axis are defined sequentially in
|
||||
the configuration file. For instance, for the X-15:
|
||||
|
||||
<pre>
|
||||
\<flight_control name="X-15 SAS">
|
||||
\<channel>
|
||||
\<component name="Pitch Trim Sum" type="SUMMER">
|
||||
@code
|
||||
<flight_control name="X-15 SAS">
|
||||
<channel>
|
||||
<summer name="Pitch Trim Sum">
|
||||
<input> fcs/elevator-cmd-norm </input>
|
||||
<input> fcs/pitch-trim-cmd-norm </input>
|
||||
<clipto>
|
||||
<min>-1</min>
|
||||
<max>1</max>
|
||||
</clipto>
|
||||
\</component>
|
||||
</summer>
|
||||
|
||||
\<component name="Pitch Command Scale" TYPE="AEROSURFACE_SCALE">
|
||||
<aerosurface_scale name="Pitch Command Scale">
|
||||
<input> fcs/pitch-trim-sum </input>
|
||||
<limit>
|
||||
<range>
|
||||
<min> -50 </min>
|
||||
<max> 50 </max>
|
||||
</limit>
|
||||
\</component>
|
||||
</range>
|
||||
</aerosurface_scale>
|
||||
|
||||
... etc.
|
||||
</pre>
|
||||
@endcode
|
||||
|
||||
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
|
||||
the stick - a pilot input), and pitch trim. The type of this component is
|
||||
"Summer".
|
||||
the stick - a pilot input), and pitch trim.
|
||||
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
|
||||
components map into the actual component classes). This continues until 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.
|
||||
|
||||
Another option for the flight controls portion of the config file is that in
|
||||
addition to using the "NAME" attribute in,
|
||||
|
||||
<pre>
|
||||
@code
|
||||
\<flight_control name="X-15 SAS">
|
||||
</pre>
|
||||
@endcode
|
||||
|
||||
one can also supply a filename:
|
||||
|
||||
<pre>
|
||||
@code
|
||||
\<flight_control name="X-15 SAS" file="X15.xml">
|
||||
\</flight_control>
|
||||
</pre>
|
||||
@endcode
|
||||
|
||||
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
|
||||
@version $Id$
|
||||
@version $Revision$
|
||||
@see FGFCSComponent
|
||||
@see FGXMLElement
|
||||
@see FGGain
|
||||
@see FGSummer
|
||||
@see FGSwitch
|
||||
@see FGFCSFunction
|
||||
@see FGCondition
|
||||
@see FGGradient
|
||||
@see FGFilter
|
||||
@see FGDeadBand
|
||||
@see FGKinemat
|
||||
*/
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
@ -461,9 +504,7 @@ public:
|
|||
//@}
|
||||
|
||||
/** Loads the Flight Control System.
|
||||
The FGAircraft instance is actually responsible for reading the config file
|
||||
and calling the various Load() methods of the other systems, passing in
|
||||
the XML Element instance pointer. Load() is called from FGAircraft.
|
||||
Load() is called from FGFDMExec.
|
||||
@param el pointer to the Element instance
|
||||
@return true if succesful */
|
||||
bool Load(Element* el);
|
||||
|
|
|
@ -54,6 +54,7 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
|
|||
Input = Output = clipmin = clipmax = 0.0;
|
||||
OutputNode = treenode = 0;
|
||||
ClipMinPropertyNode = ClipMaxPropertyNode = 0;
|
||||
clipMinSign = clipMaxSign = 1.0;
|
||||
IsOutput = clip = false;
|
||||
string input, clip_string;
|
||||
|
||||
|
@ -121,12 +122,14 @@ FGFCSComponent::FGFCSComponent(FGFCS* _fcs, Element* element) : fcs(_fcs)
|
|||
if (clip_el) {
|
||||
clip_string = clip_el->FindElementValue("min");
|
||||
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 );
|
||||
} else {
|
||||
clipmin = clip_el->FindElementValueAsNumber("min");
|
||||
}
|
||||
clip_string = clip_el->FindElementValue("max");
|
||||
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 );
|
||||
} else {
|
||||
clipmax = clip_el->FindElementValueAsNumber("max");
|
||||
|
@ -166,8 +169,8 @@ bool FGFCSComponent::Run(void)
|
|||
void FGFCSComponent::Clip(void)
|
||||
{
|
||||
if (clip) {
|
||||
if (ClipMinPropertyNode != 0) clipmin = ClipMinPropertyNode->getDoubleValue();
|
||||
if (ClipMaxPropertyNode != 0) clipmax = ClipMaxPropertyNode->getDoubleValue();
|
||||
if (ClipMinPropertyNode != 0) clipmin = clipMinSign*ClipMinPropertyNode->getDoubleValue();
|
||||
if (ClipMaxPropertyNode != 0) clipmax = clipMaxSign*ClipMaxPropertyNode->getDoubleValue();
|
||||
if (Output > clipmax) Output = clipmax;
|
||||
else if (Output < clipmin) Output = clipmin;
|
||||
}
|
||||
|
|
|
@ -69,7 +69,7 @@ CLASS DOCUMENTATION
|
|||
|
||||
/** Base class for JSBSim Flight Control System Components.
|
||||
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:
|
||||
|
||||
- FGSwitch
|
||||
|
@ -119,6 +119,7 @@ protected:
|
|||
double Input;
|
||||
double Output;
|
||||
double clipmax, clipmin;
|
||||
float clipMinSign, clipMaxSign;
|
||||
bool IsOutput;
|
||||
bool clip;
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Jon S. Berndt
|
||||
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
|
||||
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.
|
||||
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
|
||||
time domain. The general format for a filter specification is:
|
||||
|
||||
<pre>
|
||||
\<component name="name" type="type">
|
||||
\<input> property \</input>
|
||||
\<c1> value \<c/1>
|
||||
[\<c2> value \<c/2>]
|
||||
[\<c3> value \<c/3>]
|
||||
[\<c4> value \<c/4>]
|
||||
[\<c5> value \<c/5>]
|
||||
[\<c6> value \<c/6>]
|
||||
[\<output> property \<output>]
|
||||
\</component>
|
||||
</pre>
|
||||
@code
|
||||
<typename name="name">
|
||||
<input> property </input>
|
||||
<c1> value </c1>
|
||||
[<c2> value </c2>]
|
||||
[<c3> value </c3>]
|
||||
[<c4> value </c4>]
|
||||
[<c5> value </c5>]
|
||||
[<c6> value </c6>]
|
||||
[<clipto>
|
||||
<min> {[-]property name | value} </min>
|
||||
<max> {[-]property name | value} </max>
|
||||
</clipto>]
|
||||
[<output> property </output>]
|
||||
</typename>
|
||||
@endcode
|
||||
|
||||
For a lag filter of the form,
|
||||
<pre>
|
||||
|
||||
@code
|
||||
C1
|
||||
------
|
||||
s + C1
|
||||
</pre>
|
||||
@endcode
|
||||
|
||||
the corresponding filter definition is:
|
||||
<pre>
|
||||
\<component name="name" type="LAG_FILTER">
|
||||
\<input> property \</input>
|
||||
\<c1> value \<c/1>
|
||||
[\<output> property \<output>]
|
||||
\</component>
|
||||
</pre>
|
||||
|
||||
@code
|
||||
<lag_filter name="name">
|
||||
<input> property </input>
|
||||
<c1> value </c1>
|
||||
[<clipto>
|
||||
<min> {[-]property name | value} </min>
|
||||
<max> {[-]property name | value} </max>
|
||||
</clipto>]
|
||||
[<output> property <output>]
|
||||
</lag_filter>
|
||||
@endcode
|
||||
|
||||
As an example, for the specific filter:
|
||||
<pre>
|
||||
|
||||
@code
|
||||
600
|
||||
------
|
||||
s + 600
|
||||
</pre>
|
||||
@endcode
|
||||
|
||||
the corresponding filter definition could be:
|
||||
<pre>
|
||||
\<component name="Heading Roll Error Lag" type="LAG_FILTER">
|
||||
\<input> fcs/heading-command \</input>
|
||||
\<c1> 600 \</c1>
|
||||
\</component>
|
||||
</pre>
|
||||
|
||||
@code
|
||||
<lag_filter name="Heading Roll Error Lag">
|
||||
<input> fcs/heading-command </input>
|
||||
<c1> 600 </c1>
|
||||
</lag_filter>
|
||||
@endcode
|
||||
|
||||
For a lead-lag filter of the form:
|
||||
<pre>
|
||||
|
||||
@code
|
||||
C1*s + C2
|
||||
---------
|
||||
C3*s + C4
|
||||
</pre>
|
||||
@endcode
|
||||
|
||||
The corresponding filter definition is:
|
||||
<pre>
|
||||
\<component name="name" type="LEAD_LAG_FILTER">
|
||||
\<input> property \</input>
|
||||
\<c1> value \<c/1>
|
||||
\<c2> value \<c/2>
|
||||
\<c3> value \<c/3>
|
||||
\<c4> value \<c/4>
|
||||
[\<output> property \<output>]
|
||||
\</component>
|
||||
</pre>
|
||||
|
||||
@code
|
||||
<lead_lag_filter name="name">
|
||||
<input> property </input>
|
||||
<c1> value <c/1>
|
||||
<c2> value <c/2>
|
||||
<c3> value <c/3>
|
||||
<c4> value <c/4>
|
||||
[<clipto>
|
||||
<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:
|
||||
<pre>
|
||||
|
||||
@code
|
||||
s
|
||||
------
|
||||
s + C1
|
||||
</pre>
|
||||
@endcode
|
||||
|
||||
The corresponding filter definition is:
|
||||
<pre>
|
||||
\<component name="name" type="WASHOUT_FILTER">
|
||||
\<input> property \</input>
|
||||
\<c1> value \</c1>
|
||||
[\<output> property \<output>]
|
||||
\</component>
|
||||
</pre>
|
||||
|
||||
@code
|
||||
<washout_filter name="name">
|
||||
<input> property </input>
|
||||
<c1> value </c1>
|
||||
[<clipto>
|
||||
<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:
|
||||
<pre>
|
||||
|
||||
@code
|
||||
C1*s^2 + C2*s + C3
|
||||
------------------
|
||||
C4*s^2 + C5*s + C6
|
||||
</pre>
|
||||
@endcode
|
||||
|
||||
The corresponding filter definition is:
|
||||
<pre>
|
||||
\<component name="name" type="SECOND_ORDER_FILTER">
|
||||
\<input> property \</input>
|
||||
\<c1> value \<c/1>
|
||||
\<c2> value \<c/2>
|
||||
\<c3> value \<c/3>
|
||||
\<c4> value \<c/4>
|
||||
\<c5> value \<c/5>
|
||||
\<c6> value \<c/6>
|
||||
[\<output> property \<output>]
|
||||
\</component>
|
||||
</pre>
|
||||
|
||||
@code
|
||||
<second_order_filter name="name">
|
||||
<input> property </input>
|
||||
<c1> value </c1>
|
||||
<c2> value </c2>
|
||||
<c3> value </c3>
|
||||
<c4> value </c4>
|
||||
<c5> value </c5>
|
||||
<c6> value </c6>
|
||||
[<clipto>
|
||||
<min> {[-]property name | value} </min>
|
||||
<max> {[-]property name | value} </max>
|
||||
</clipto>]
|
||||
[<output> property </output>]
|
||||
</second_order_filter>
|
||||
@endcode
|
||||
|
||||
For an integrator of the form:
|
||||
<pre>
|
||||
|
||||
@code
|
||||
C1
|
||||
---
|
||||
s
|
||||
</pre>
|
||||
@endcode
|
||||
|
||||
The corresponding filter definition is:
|
||||
<pre>
|
||||
\<component name="name" type="INTEGRATOR">
|
||||
\<input> property \</input>
|
||||
\<c1> value \<c/1>
|
||||
[\<trigger> property \</trigger>]
|
||||
[\<output> property \<output>]
|
||||
\</component>
|
||||
</pre>
|
||||
|
||||
@code
|
||||
<integrator name="name">
|
||||
<input> property </input>
|
||||
<c1> value </c1>
|
||||
[<trigger> property </trigger>]
|
||||
[<clipto>
|
||||
<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
|
||||
property value is:
|
||||
- 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.
|
||||
|
||||
@author Jon S. Berndt
|
||||
@version $Id$
|
||||
@version $Revision$
|
||||
|
||||
*/
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
Header: FGGain.h
|
||||
Author:
|
||||
Date started:
|
||||
Author: Jon Berndt
|
||||
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
|
||||
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.
|
||||
The gain component merely multiplies the input by a gain. The form of the
|
||||
gain 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 gain component merely multiplies the input by a gain. The <b>pure gain</b> form
|
||||
of the component specification is:
|
||||
|
||||
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
|
||||
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
|
||||
acceptable settings - i.e at higher qbar the commanded elevator setting might
|
||||
be attenuated. The form of the scheduled gain component specification is:
|
||||
<pre>
|
||||
\<COMPONENT NAME="name" TYPE="SCHEDULED_GAIN">
|
||||
INPUT \<property>
|
||||
[GAIN \<value>]
|
||||
SCHEDULED_BY \<property>
|
||||
ROWS \<number_of_rows>
|
||||
\<lookup_value gain_value>
|
||||
?
|
||||
[CLIPTO \<min> \<max> 1]
|
||||
[OUTPUT \<property>]
|
||||
\</COMPONENT>
|
||||
</pre>
|
||||
|
||||
@code
|
||||
<scheduled_gain name="name">
|
||||
<input> {[-]property} </input>
|
||||
<table>
|
||||
<tableData>
|
||||
...
|
||||
</tableData>
|
||||
</table>
|
||||
[<clipto>
|
||||
<min> {[-]property name | value} </min>
|
||||
<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.
|
||||
|
||||
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.
|
||||
Note: the input property name may be immediately preceded by a minus sign to
|
||||
invert that signal.
|
||||
|
||||
Here is an example of a scheduled gain component specification:
|
||||
<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
|
||||
In the example above, we see the utility of the overall gain value in
|
||||
effecting a degrees-to-radians conversion.
|
||||
|
||||
The aerosurface scale component is a modified version of the simple gain
|
||||
component. The normal purpose
|
||||
for this component is to take control inputs that range from -1 to +1 or
|
||||
from 0 to +1 and scale them to match the expected inputs to a flight control
|
||||
system. 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 channelb
|
||||
lock diagram of a flight control system is in units of pounds. Yet, the
|
||||
joystick control input is usually in a range from -1 to +1. The form of the
|
||||
aerosurface scaling component specification is:
|
||||
<pre>
|
||||
\<COMPONENT NAME="name" TYPE="AEROSURFACE_SCALE">
|
||||
INPUT \<property>
|
||||
MIN \<value>
|
||||
MAX \<value>
|
||||
[GAIN \<value>]
|
||||
[OUTPUT \<property>]
|
||||
\</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 <b>aerosurface scale</b> component is a modified version of the simple gain
|
||||
component. The purpose for this component is to take control inputs from the
|
||||
domain minimum and maximum, as specified (or from -1 to +1 by default) and
|
||||
scale them to map to a specified range. This can be done, for instance, to match
|
||||
the component outputs to the expected inputs to a flight control system.
|
||||
|
||||
The zero_centered element dictates whether the domain-to-range mapping is linear
|
||||
or centered about zero. For example, if zero_centered is false, and if the domain
|
||||
or range is not symmetric about zero, and an input value is zero, the output
|
||||
will not be zero. Let's say that the domain is min=-2 and max=+4, with a range
|
||||
of -1 to +1. If the input is 0.0, then the "normalized" input is calculated to
|
||||
be 33% of the way from the minimum to the maximum. That input would be mapped
|
||||
to an output of -0.33, which is 33% of the way from the range minimum to maximum.
|
||||
If zero_centered is set to true (or 1) then an input of 0.0 will be mapped to an
|
||||
output of 0.0, although if either the domain or range are unsymmetric about
|
||||
0.0, then the scales for the positive and negative portions of the input domain
|
||||
(above and below 0.0) will be different. The zero_centered element is true by
|
||||
default. Note that this feature may be important for some control surface mappings,
|
||||
where the maximum upper and lower deflections may be different, but where a zero
|
||||
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
|
||||
@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
|
||||
time.
|
||||
|
||||
@author Jon S. Berndt
|
||||
@version $Revision$
|
||||
*/
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
|
|
@ -223,7 +223,7 @@ double FGPropeller::GetPowerRequired(void)
|
|||
cPReq = cPower->GetValue(J);
|
||||
} 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
|
||||
if (!Feathered) {
|
||||
|
|
Loading…
Add table
Reference in a new issue