Jon Berndt
2004-04-30 11:59:53 UTC
I've made some more progress in building an example autopilot using the
JSBSim flight control components. I already have a wing leveler for the
C-172, but I added an altitude hold module last night. The idea - in words -
behind the altitude hold concept (at least the way I have implemented it) is
that once a target altitude has been set, one can determine the error
between where you are and where you want to be. This error term is limited
to 100, filtered with a slight lag, and then multiplied by 0.1 in order to
get a commanded HDOT (time derivative of altitude, or rate of climb) of 600
ft/min. This error is run through the altitude hold switch, and either this
quantity or zero is passed to a proportional-integral controller (PI). The
output from these two components is summed, multiplied by an appropriate
gain, and the signal is sent to the elevator. I have a plot online of
altitude versus time as the C-172 is commanded to fly (from takeoff) to 800
feet, then 850, then 600, then 2000 ft:
http://www.jsbsim.org/JSBSimAltHoldAP.pdf
The autopilot is configured in JSBSim as follows:
<COMPONENT NAME="Altitude Error" TYPE="SUMMER">
INPUT -position/h-sl-ft
INPUT ap/altitude_setpoint
CLIPTO -100 100
</COMPONENT>
<COMPONENT NAME="Alt Error Lag" TYPE="LAG_FILTER">
INPUT fcs/altitude-error
C1 0.25
</COMPONENT>
<COMPONENT NAME="HDot Command" TYPE="PURE_GAIN">
INPUT fcs/alt-error-lag
GAIN 0.1
</COMPONENT>
<COMPONENT NAME="HDot Error" TYPE="SUMMER">
INPUT fcs/hdot-command
INPUT -velocities/h-dot-fps
</COMPONENT>
<COMPONENT NAME="AP Alt Hold Switch" TYPE="SWITCH">
<TEST LOGIC="DEFAULT" VALUE="0.0">
</TEST>
<TEST LOGIC="AND" VALUE="fcs/hdot-error">
ap/altitude_hold == 1
</TEST>
</COMPONENT>
<COMPONENT NAME="Integral" TYPE="INTEGRATOR">
INPUT fcs/ap-alt-hold-switch
C1 0.0041
</COMPONENT>
<COMPONENT NAME="Proportional" TYPE="PURE_GAIN">
INPUT fcs/ap-alt-hold-switch
GAIN 0.035
</COMPONENT>
<COMPONENT NAME="Control Summer" TYPE="SUMMER">
INPUT fcs/integral
INPUT fcs/proportional
CLIPTO -1.0 1.0
</COMPONENT>
<COMPONENT NAME="Elevator" TYPE="PURE_GAIN">
INPUT fcs/control-summer
GAIN -1.0
OUTPUT ap/elevator_cmd
</COMPONENT>
-- end --
I've got some ideas for future enhancements, including a scheduled target
rate-of-climb, so that the aircraft does not try and achieve 600 ft/min near
its service ceiling or something silly like that. Also to be added is an
automatic cutoff or safety feature, and perhaps the use of throttle to
control altitude as appropriate. I guess I really need to read up on
specific A/P operation, but this is presently being modeled to give the
ability for JSBSim aircraft to fly automatic batch runs for testing, etc.
I am going to include this in the JSBSim automatic flight document soon, and
will have a block diagram with this, too.
Jon
JSBSim flight control components. I already have a wing leveler for the
C-172, but I added an altitude hold module last night. The idea - in words -
behind the altitude hold concept (at least the way I have implemented it) is
that once a target altitude has been set, one can determine the error
between where you are and where you want to be. This error term is limited
to 100, filtered with a slight lag, and then multiplied by 0.1 in order to
get a commanded HDOT (time derivative of altitude, or rate of climb) of 600
ft/min. This error is run through the altitude hold switch, and either this
quantity or zero is passed to a proportional-integral controller (PI). The
output from these two components is summed, multiplied by an appropriate
gain, and the signal is sent to the elevator. I have a plot online of
altitude versus time as the C-172 is commanded to fly (from takeoff) to 800
feet, then 850, then 600, then 2000 ft:
http://www.jsbsim.org/JSBSimAltHoldAP.pdf
The autopilot is configured in JSBSim as follows:
<COMPONENT NAME="Altitude Error" TYPE="SUMMER">
INPUT -position/h-sl-ft
INPUT ap/altitude_setpoint
CLIPTO -100 100
</COMPONENT>
<COMPONENT NAME="Alt Error Lag" TYPE="LAG_FILTER">
INPUT fcs/altitude-error
C1 0.25
</COMPONENT>
<COMPONENT NAME="HDot Command" TYPE="PURE_GAIN">
INPUT fcs/alt-error-lag
GAIN 0.1
</COMPONENT>
<COMPONENT NAME="HDot Error" TYPE="SUMMER">
INPUT fcs/hdot-command
INPUT -velocities/h-dot-fps
</COMPONENT>
<COMPONENT NAME="AP Alt Hold Switch" TYPE="SWITCH">
<TEST LOGIC="DEFAULT" VALUE="0.0">
</TEST>
<TEST LOGIC="AND" VALUE="fcs/hdot-error">
ap/altitude_hold == 1
</TEST>
</COMPONENT>
<COMPONENT NAME="Integral" TYPE="INTEGRATOR">
INPUT fcs/ap-alt-hold-switch
C1 0.0041
</COMPONENT>
<COMPONENT NAME="Proportional" TYPE="PURE_GAIN">
INPUT fcs/ap-alt-hold-switch
GAIN 0.035
</COMPONENT>
<COMPONENT NAME="Control Summer" TYPE="SUMMER">
INPUT fcs/integral
INPUT fcs/proportional
CLIPTO -1.0 1.0
</COMPONENT>
<COMPONENT NAME="Elevator" TYPE="PURE_GAIN">
INPUT fcs/control-summer
GAIN -1.0
OUTPUT ap/elevator_cmd
</COMPONENT>
-- end --
I've got some ideas for future enhancements, including a scheduled target
rate-of-climb, so that the aircraft does not try and achieve 600 ft/min near
its service ceiling or something silly like that. Also to be added is an
automatic cutoff or safety feature, and perhaps the use of throttle to
control altitude as appropriate. I guess I really need to read up on
specific A/P operation, but this is presently being modeled to give the
ability for JSBSim aircraft to fly automatic batch runs for testing, etc.
I am going to include this in the JSBSim automatic flight document soon, and
will have a block diagram with this, too.
Jon