1
0
Fork 0
flightgear/src/FDM/UIUCModel/uiuc_auto_pilot.cpp

166 lines
5 KiB
C++
Raw Normal View History

/**********************************************************************
FILENAME: uiuc_auto_pilot.cpp
----------------------------------------------------------------------
DESCRIPTION: calls autopilot routines
----------------------------------------------------------------------
STATUS: alpha version
----------------------------------------------------------------------
REFERENCES:
----------------------------------------------------------------------
HISTORY: 09/04/2003 initial release (with PAH)
10/31/2003 added ALH autopilot
11/04/2003 added RAH and HH autopilots
----------------------------------------------------------------------
AUTHOR(S): Robert Deters <rdeters@uiuc.edu>
----------------------------------------------------------------------
VARIABLES:
----------------------------------------------------------------------
INPUTS: -V_rel_wind (or U_body)
-dyn_on_speed
-ice on/off
-phugoid on/off
----------------------------------------------------------------------
OUTPUTS: -CL
-CD
-Cm
-CY
-Cl
-Cn
----------------------------------------------------------------------
CALLED BY: uiuc_coefficients
----------------------------------------------------------------------
CALLS TO: uiuc_coef_lift
uiuc_coef_drag
----------------------------------------------------------------------
COPYRIGHT: (C) 2003 by Michael Selig
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 Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**********************************************************************/
#include "uiuc_auto_pilot.h"
//#include <stdio.h>
void uiuc_auto_pilot(double dt)
{
double V_rel_wind_ms;
double Altitude_m;
//static bool ap_pah_on_prev = false;
static int ap_pah_init = 0;
//static bool ap_alh_on_prev = false;
static int ap_alh_init = 0;
static int ap_rah_init = 0;
static int ap_hh_init = 0;
double ap_alt_ref_m;
double bw_m;
double ail_rud[2];
V_rel_wind_ms = V_rel_wind * 0.3048;
Altitude_m = Altitude * 0.3048;
if (ap_pah_on && icing_demo==false && Simtime>=ap_pah_start_time)
{
//ap_Theta_ref_rad = ap_Theta_ref_deg * DEG_TO_RAD;
//if (ap_pah_on_prev == false) {
//ap_pah_init = 1;
//ap_pah_on_prev = true;
//}
elevator = pah_ap(Theta, Theta_dot, ap_Theta_ref_rad, V_rel_wind_ms, dt,
ap_pah_init);
if (elevator*RAD_TO_DEG <= -1*demax)
elevator = -1*demax * DEG_TO_RAD;
if (elevator*RAD_TO_DEG >= demin)
elevator = demin * DEG_TO_RAD;
pilot_elev_no=true;
ap_pah_init=1;
//printf("elv1=%f\n",elevator);
}
if (ap_alh_on && icing_demo==false && Simtime>=ap_alh_start_time)
{
ap_alt_ref_m = ap_alt_ref_ft * 0.3048;
//if (ap_alh_on_prev == false)
//ap_alh_init = 0;
elevator = alh_ap(Theta, Theta_dot, ap_alt_ref_m, Altitude_m,
V_rel_wind_ms, dt, ap_alh_init);
if (elevator*RAD_TO_DEG <= -1*demax)
elevator = -1*demax * DEG_TO_RAD;
if (elevator*RAD_TO_DEG >= demin)
elevator = demin * DEG_TO_RAD;
pilot_elev_no=true;
ap_alh_init = 1;
}
if (ap_rah_on && icing_demo==false && Simtime>=ap_rah_start_time)
{
bw_m = bw * 0.3048;
rah_ap(Phi, Phi_dot, ap_Phi_ref_rad, V_rel_wind_ms, dt,
bw_m, Psi_dot, ail_rud, ap_rah_init);
aileron = ail_rud[0];
rudder = ail_rud[1];
if (aileron*RAD_TO_DEG <= -1*damax)
aileron = -1*damax * DEG_TO_RAD;
if (aileron*RAD_TO_DEG >= damin)
aileron = damin * DEG_TO_RAD;
if (rudder*RAD_TO_DEG <= -1*drmax)
rudder = -1*drmax * DEG_TO_RAD;
if (rudder*RAD_TO_DEG >= drmin)
rudder = drmin * DEG_TO_RAD;
pilot_ail_no=true;
pilot_rud_no=true;
ap_rah_init = 1;
}
if (ap_hh_on && icing_demo==false && Simtime>=ap_hh_start_time)
{
bw_m = bw * 0.3048;
hh_ap(Phi, Psi, Phi_dot, ap_Psi_ref_rad, V_rel_wind_ms, dt,
bw_m, Psi_dot, ail_rud, ap_hh_init);
aileron = ail_rud[0];
rudder = ail_rud[1];
if (aileron*RAD_TO_DEG <= -1*damax)
aileron = -1*damax * DEG_TO_RAD;
if (aileron*RAD_TO_DEG >= damin)
aileron = damin * DEG_TO_RAD;
if (rudder*RAD_TO_DEG <= -1*drmax)
rudder = -1*drmax * DEG_TO_RAD;
if (rudder*RAD_TO_DEG >= drmin)
rudder = drmin * DEG_TO_RAD;
pilot_ail_no=true;
pilot_rud_no=true;
ap_hh_init = 1;
}
}