Adds a basic FDM model for LaRCsim debugging purposes.
This commit is contained in:
parent
27a7b7f5d9
commit
9f518ef343
7 changed files with 1180 additions and 7 deletions
|
@ -66,6 +66,22 @@ FGLaRCsim::FGLaRCsim( double dt ) {
|
|||
I_xz = 0.000000E+00;
|
||||
}
|
||||
|
||||
if ( !strcmp(aero->getStringValue(), "basic") ) {
|
||||
copy_to_LaRCsim(); // initialize all of LaRCsim's vars
|
||||
|
||||
//this should go away someday -- formerly done in fg_init.cxx
|
||||
Mass = 2./32.174;
|
||||
I_xx = 0.0454;
|
||||
I_yy = 0.0191;
|
||||
I_zz = 0.0721;
|
||||
I_xz = 0;
|
||||
// Mass = 8.547270E+01;
|
||||
// I_xx = 1.048000E+03;
|
||||
// I_yy = 3.000000E+03;
|
||||
// I_zz = 3.530000E+03;
|
||||
// I_xz = 0.000000E+00;
|
||||
}
|
||||
|
||||
ls_set_model_dt(dt);
|
||||
|
||||
// Initialize our little engine that hopefully might
|
||||
|
@ -161,14 +177,85 @@ void FGLaRCsim::update( double dt ) {
|
|||
* dt);
|
||||
}
|
||||
|
||||
// Apparently the IO360 thrust model is not working.
|
||||
// F_X_engine is zero here.
|
||||
F_X_engine = eng.get_prop_thrust_lbs();
|
||||
// cout << "F_X_engine = " << F_X_engine << '\n';
|
||||
// end c172 if block
|
||||
|
||||
Flap_handle = 30.0 * globals->get_controls()->get_flaps();
|
||||
}
|
||||
// done with c172-larcsim if-block
|
||||
|
||||
if ( !strcmp(aero->getStringValue(), "basic") ) {
|
||||
// set control inputs
|
||||
// cout << "V_calibrated_kts = " << V_calibrated_kts << '\n';
|
||||
eng.set_IAS( V_calibrated_kts );
|
||||
eng.set_Throttle_Lever_Pos( globals->get_controls()->get_throttle( 0 )
|
||||
* 100.0 );
|
||||
eng.set_Propeller_Lever_Pos( 100 );
|
||||
eng.set_Mixture_Lever_Pos( globals->get_controls()->get_mixture( 0 )
|
||||
* 100.0 );
|
||||
eng.set_Magneto_Switch_Pos( globals->get_controls()->get_magnetos(0) );
|
||||
eng.setStarterFlag( globals->get_controls()->get_starter(0) );
|
||||
eng.set_p_amb( Static_pressure );
|
||||
eng.set_T_amb( Static_temperature );
|
||||
|
||||
// update engine model
|
||||
eng.update();
|
||||
|
||||
// Fake control-surface positions
|
||||
fgSetDouble("/surface-positions/flap-pos-norm",
|
||||
fgGetDouble("/controls/flight/flaps"));
|
||||
// FIXME: ignoring trim
|
||||
fgSetDouble("/surface-positions/elevator-pos-norm",
|
||||
fgGetDouble("/controls/flight/elevator"));
|
||||
// FIXME: ignoring trim
|
||||
fgSetDouble("/surface-positions/left-aileron-pos-norm",
|
||||
fgGetDouble("/controls/flight/aileron"));
|
||||
// FIXME: ignoring trim
|
||||
fgSetDouble("/surface-positions/right-aileron-pos-norm",
|
||||
-1 * fgGetDouble("/controls/flight/aileron"));
|
||||
// FIXME: ignoring trim
|
||||
fgSetDouble("/surface-positions/rudder-pos-norm",
|
||||
fgGetDouble("/controls/flight/rudder"));
|
||||
|
||||
// copy engine state values onto "bus"
|
||||
fgSetDouble("/engines/engine/rpm", eng.get_RPM());
|
||||
fgSetDouble("/engines/engine/mp-osi", eng.get_Manifold_Pressure());
|
||||
fgSetDouble("/engines/engine/max-hp", eng.get_MaxHP());
|
||||
fgSetDouble("/engines/engine/power-pct", eng.get_Percentage_Power());
|
||||
fgSetDouble("/engines/engine/egt-degf", eng.get_EGT());
|
||||
fgSetDouble("/engines/engine/cht-degf", eng.get_CHT());
|
||||
fgSetDouble("/engines/engine/prop-thrust", eng.get_prop_thrust_SI());
|
||||
fgSetDouble("/engines/engine/fuel-flow-gph",
|
||||
eng.get_fuel_flow_gals_hr());
|
||||
fgSetDouble("/engines/engine/oil-temperature-degf",
|
||||
eng.get_oil_temp());
|
||||
fgSetDouble("/engines/engine/running", eng.getRunningFlag());
|
||||
fgSetDouble("/engines/engine/cranking", eng.getCrankingFlag());
|
||||
|
||||
static const SGPropertyNode *fuel_freeze
|
||||
= fgGetNode("/sim/freeze/fuel");
|
||||
|
||||
if ( ! fuel_freeze->getBoolValue() ) {
|
||||
//Assume we are using both tanks equally for now
|
||||
fgSetDouble("/consumables/fuel/tank[0]/level-gal_us",
|
||||
fgGetDouble("/consumables/fuel/tank[0]/level-gal_us")
|
||||
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
|
||||
* dt);
|
||||
fgSetDouble("/consumables/fuel/tank[1]/level-gal_us",
|
||||
fgGetDouble("/consumables/fuel/tank[1]/level-gal_us")
|
||||
- (eng.get_fuel_flow_gals_hr() / (2 * 3600))
|
||||
* dt);
|
||||
}
|
||||
|
||||
// Apparently the IO360 thrust model is not working.
|
||||
// F_X_engine is zero here.
|
||||
F_X_engine = eng.get_prop_thrust_lbs();
|
||||
|
||||
Flap_handle = 30.0 * globals->get_controls()->get_flaps();
|
||||
}
|
||||
// done with basic-larcsim if-block
|
||||
|
||||
double save_alt = 0.0;
|
||||
|
||||
// lets try to avoid really screwing up the LaRCsim model
|
||||
|
@ -183,11 +270,14 @@ void FGLaRCsim::update( double dt ) {
|
|||
Long_trim = globals->get_controls()->get_elevator_trim();
|
||||
Rudder_pedal = globals->get_controls()->get_rudder() / speed_up->getIntValue();
|
||||
|
||||
if ( !strcmp(aero->getStringValue(), "c172") ) {
|
||||
Use_External_Engine = 1;
|
||||
} else {
|
||||
Use_External_Engine = 0;
|
||||
}
|
||||
// IO360.cxx for the C172 thrust is broken (not sure why).
|
||||
// So force C172 to use engine model in c172_engine.c instead of the IO360.cxx.
|
||||
// if ( !strcmp(aero->getStringValue(), "c172") ) {
|
||||
// Use_External_Engine = 1;
|
||||
// } else {
|
||||
// Use_External_Engine = 0;
|
||||
// }
|
||||
Use_External_Engine = 0;
|
||||
|
||||
Throttle_pct = globals->get_controls()->get_throttle( 0 ) * 1.0;
|
||||
|
||||
|
|
473
src/FDM/LaRCsim/basic_aero.c
Normal file
473
src/FDM/LaRCsim/basic_aero.c
Normal file
|
@ -0,0 +1,473 @@
|
|||
/***************************************************************************
|
||||
|
||||
TITLE: basic_aero
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
FUNCTION: aerodynamics model based on stability derivatives
|
||||
+ tweaks for nonlinear aero
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
MODULE STATUS: developmental
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
GENEALOGY: based on aero model from crrcsim code (Drela's aero model)
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
DESIGNED BY:
|
||||
|
||||
CODED BY: Michael Selig
|
||||
|
||||
MAINTAINED BY: Michael Selig
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
MODIFICATION HISTORY:
|
||||
|
||||
DATE PURPOSE BY
|
||||
7/25/03 LaRCsim debugging purposes
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
REFERENCES:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
CALLED BY:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
CALLS TO:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
INPUTS:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
OUTPUTS:
|
||||
|
||||
--------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
|
||||
#include "ls_generic.h"
|
||||
#include "ls_cockpit.h"
|
||||
#include "ls_constants.h"
|
||||
#include "ls_types.h"
|
||||
#include "basic_aero.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
#ifdef USENZ
|
||||
#define NZ generic_.n_cg_body_v[2]
|
||||
#else
|
||||
#define NZ 1
|
||||
#endif
|
||||
|
||||
|
||||
extern COCKPIT cockpit_;
|
||||
|
||||
|
||||
void basic_aero(SCALAR dt, int Initialize)
|
||||
// Calculate forces and moments for the current time step. If Initialize is
|
||||
// zero, then re-initialize coefficients by reading in the coefficient file.
|
||||
{
|
||||
static int init = 0;
|
||||
static SCALAR elevator_drela, aileron_drela, rudder_drela;
|
||||
|
||||
SCALAR C_ref;
|
||||
SCALAR B_ref;
|
||||
SCALAR S_ref;
|
||||
SCALAR U_ref;
|
||||
|
||||
/* SCALAR Mass; */
|
||||
/* SCALAR I_xx; */
|
||||
/* SCALAR I_yy; */
|
||||
/* SCALAR I_zz; */
|
||||
/* SCALAR I_xz; */
|
||||
|
||||
SCALAR Alpha_0;
|
||||
SCALAR Cm_0;
|
||||
SCALAR CL_0;
|
||||
SCALAR CL_max;
|
||||
SCALAR CL_min;
|
||||
|
||||
SCALAR CD_prof;
|
||||
SCALAR Uexp_CD;
|
||||
|
||||
SCALAR CL_a;
|
||||
SCALAR Cm_a;
|
||||
|
||||
SCALAR CY_b;
|
||||
SCALAR Cl_b;
|
||||
SCALAR Cn_b;
|
||||
|
||||
SCALAR CL_q;
|
||||
SCALAR Cm_q;
|
||||
|
||||
SCALAR CY_p;
|
||||
SCALAR Cl_p;
|
||||
SCALAR Cn_p;
|
||||
|
||||
SCALAR CY_r;
|
||||
SCALAR Cl_r;
|
||||
SCALAR Cn_r;
|
||||
|
||||
SCALAR CL_de;
|
||||
SCALAR Cm_de;
|
||||
|
||||
SCALAR CY_dr;
|
||||
SCALAR Cl_dr;
|
||||
SCALAR Cn_dr;
|
||||
|
||||
SCALAR CY_da;
|
||||
SCALAR Cl_da;
|
||||
SCALAR Cn_da;
|
||||
|
||||
SCALAR eta_loc;
|
||||
SCALAR CG_arm;
|
||||
SCALAR CL_drop;
|
||||
SCALAR CD_stall = 0.05;
|
||||
int stalling;
|
||||
|
||||
SCALAR span_eff;
|
||||
SCALAR CL_CD0;
|
||||
SCALAR CD_CLsq;
|
||||
SCALAR CD_AIsq;
|
||||
SCALAR CD_ELsq;
|
||||
|
||||
SCALAR Phat, Qhat, Rhat; // dimensionless rotation rates
|
||||
SCALAR CL_left, CL_cent, CL_right; // CL values across the span
|
||||
SCALAR dCL_left,dCL_cent,dCL_right; // stall-induced CL changes
|
||||
SCALAR dCD_left,dCD_cent,dCD_right; // stall-induced CD changes
|
||||
SCALAR dCl,dCn,dCl_stall,dCn_stall; // stall-induced roll,yaw moments
|
||||
SCALAR dCm_stall; // Stall induced pitching moment.
|
||||
SCALAR CL_wing, CD_all, CD_scaled, Cl_w;
|
||||
SCALAR Cl_r_mod,Cn_p_mod;
|
||||
SCALAR CL_drela,CD_drela,Cx_drela,Cy_drela,Cz_drela,Cl_drela,Cm_drela,Cn_drela;
|
||||
SCALAR QS;
|
||||
SCALAR G_11,G_12,G_13;
|
||||
SCALAR G_21,G_22,G_23;
|
||||
SCALAR G_31,G_32,G_33;
|
||||
SCALAR U_body_X,U_body_Y,U_body_Z;
|
||||
SCALAR V_body_X,V_body_Y,V_body_Z;
|
||||
SCALAR W_body_X,W_body_Y,W_body_Z;
|
||||
SCALAR P_atmo,Q_atmo,R_atmo;
|
||||
|
||||
// set the parameters
|
||||
|
||||
C_ref = 0.551667;
|
||||
B_ref = 6.55000;
|
||||
S_ref = 3.61111;
|
||||
U_ref = 19.6850;
|
||||
Alpha_0 = 0.349066E-01;
|
||||
Cm_0 = -0.112663E-01;
|
||||
CL_0 = 0.563172;
|
||||
CL_max = 1.10000;
|
||||
CL_min = -0.600000;
|
||||
CD_prof = 0.200000E-01;
|
||||
Uexp_CD = -0.500000;
|
||||
CL_a = 5.50360;
|
||||
Cm_a = -0.575335;
|
||||
CY_b = -0.415610;
|
||||
Cl_b = -0.250926;
|
||||
Cn_b = 0.567069E-01;
|
||||
CL_q = 7.50999;
|
||||
Cm_q = -11.4975;
|
||||
CY_p = -0.423820;
|
||||
Cl_p = -0.611798;
|
||||
Cn_p = -0.740898E-01;
|
||||
CY_r = 0.297540;
|
||||
Cl_r = 0.139581;
|
||||
Cn_r = -0.687755E-01;
|
||||
CL_de = 0.162000;
|
||||
Cm_de = -0.597537;
|
||||
CY_dr = 0.000000E+00;
|
||||
Cl_dr = 0.000000E+00;
|
||||
Cn_dr = 0.000000E+00;
|
||||
CY_da = -0.135890;
|
||||
Cl_da = -0.307921E-02;
|
||||
Cn_da = 0.527143E-01;
|
||||
span_eff = 0.95;
|
||||
CL_CD0 = 0.0;
|
||||
CD_CLsq = 0.01;
|
||||
CD_AIsq = 0.0;
|
||||
CD_ELsq = 0.0;
|
||||
eta_loc = 0.3;
|
||||
CG_arm = 0.25;
|
||||
CL_drop = 0.5;
|
||||
|
||||
if (!init)
|
||||
{
|
||||
init = -1;
|
||||
}
|
||||
|
||||
// jan's data goes -.5 to .5 while
|
||||
// fgfs data goes +- 1.
|
||||
// so I need to divide by 2 below.
|
||||
elevator = Long_control + Long_trim;
|
||||
aileron = Lat_control;
|
||||
rudder = Rudder_pedal;
|
||||
|
||||
elevator = elevator * 0.5;
|
||||
aileron = aileron * 0.5;
|
||||
rudder = rudder * 0.5;
|
||||
|
||||
|
||||
|
||||
// printf("%f\n",V_rel_wind);
|
||||
|
||||
/* compute gradients of Local velocities w.r.t. Body coordinates
|
||||
G_11 = dU_local/dx_body
|
||||
G_12 = dU_local/dy_body etc. */
|
||||
|
||||
/*
|
||||
G_11 = U_atmo_X*T_local_to_body_11
|
||||
+ U_atmo_Y*T_local_to_body_12
|
||||
+ U_atmo_Z*T_local_to_body_13;
|
||||
G_12 = U_atmo_X*T_local_to_body_21
|
||||
+ U_atmo_Y*T_local_to_body_22
|
||||
+ U_atmo_Z*T_local_to_body_23;
|
||||
G_13 = U_atmo_X*T_local_to_body_31
|
||||
+ U_atmo_Y*T_local_to_body_32
|
||||
+ U_atmo_Z*T_local_to_body_33;
|
||||
|
||||
G_21 = V_atmo_X*T_local_to_body_11
|
||||
+ V_atmo_Y*T_local_to_body_12
|
||||
+ V_atmo_Z*T_local_to_body_13;
|
||||
G_22 = V_atmo_X*T_local_to_body_21
|
||||
+ V_atmo_Y*T_local_to_body_22
|
||||
+ V_atmo_Z*T_local_to_body_23;
|
||||
G_23 = V_atmo_X*T_local_to_body_31
|
||||
+ V_atmo_Y*T_local_to_body_32
|
||||
+ V_atmo_Z*T_local_to_body_33;
|
||||
|
||||
G_31 = W_atmo_X*T_local_to_body_11
|
||||
+ W_atmo_Y*T_local_to_body_12
|
||||
+ W_atmo_Z*T_local_to_body_13;
|
||||
G_32 = W_atmo_X*T_local_to_body_21
|
||||
+ W_atmo_Y*T_local_to_body_22
|
||||
+ W_atmo_Z*T_local_to_body_23;
|
||||
G_33 = W_atmo_X*T_local_to_body_31
|
||||
+ W_atmo_Y*T_local_to_body_32
|
||||
+ W_atmo_Z*T_local_to_body_33;
|
||||
*/
|
||||
|
||||
//printf("%f %f %f %f\n",W_atmo_X,W_atmo_Y,G_31,G_32);
|
||||
|
||||
/* now compute gradients of Body velocities w.r.t. Body coordinates */
|
||||
/* U_body_x = dU_body/dx_body etc. */
|
||||
|
||||
/*
|
||||
U_body_X = T_local_to_body_11*G_11
|
||||
+ T_local_to_body_12*G_21
|
||||
+ T_local_to_body_13*G_31;
|
||||
U_body_Y = T_local_to_body_11*G_12
|
||||
+ T_local_to_body_12*G_22
|
||||
+ T_local_to_body_13*G_32;
|
||||
U_body_Z = T_local_to_body_11*G_13
|
||||
+ T_local_to_body_12*G_23
|
||||
+ T_local_to_body_13*G_33;
|
||||
|
||||
V_body_X = T_local_to_body_21*G_11
|
||||
+ T_local_to_body_22*G_21
|
||||
+ T_local_to_body_23*G_31;
|
||||
V_body_Y = T_local_to_body_21*G_12
|
||||
+ T_local_to_body_22*G_22
|
||||
+ T_local_to_body_23*G_32;
|
||||
V_body_Z = T_local_to_body_21*G_13
|
||||
+ T_local_to_body_22*G_23
|
||||
+ T_local_to_body_23*G_33;
|
||||
|
||||
W_body_X = T_local_to_body_31*G_11
|
||||
+ T_local_to_body_32*G_21
|
||||
+ T_local_to_body_33*G_31;
|
||||
W_body_Y = T_local_to_body_31*G_12
|
||||
+ T_local_to_body_32*G_22
|
||||
+ T_local_to_body_33*G_32;
|
||||
W_body_Z = T_local_to_body_31*G_13
|
||||
+ T_local_to_body_32*G_23
|
||||
+ T_local_to_body_33*G_33;
|
||||
*/
|
||||
|
||||
/* set rotation rates of airmass motion */
|
||||
/* BUG
|
||||
P_atmo = W_body_X;
|
||||
Q_atmo = -W_body_Y;
|
||||
R_atmo = V_body_Z;
|
||||
*/
|
||||
|
||||
/*
|
||||
P_atmo = W_body_Y;
|
||||
Q_atmo = -W_body_X;
|
||||
R_atmo = V_body_X;
|
||||
*/
|
||||
|
||||
P_atmo = 0;
|
||||
Q_atmo = 0;
|
||||
R_atmo = 0;
|
||||
|
||||
// printf("%f %f %f\n",P_atmo,Q_atmo,R_atmo);
|
||||
if (V_rel_wind != 0)
|
||||
{
|
||||
/* set net effective dimensionless rotation rates */
|
||||
Phat = (P_body - P_atmo) * B_ref / (2.0*V_rel_wind);
|
||||
Qhat = (Q_body - Q_atmo) * C_ref / (2.0*V_rel_wind);
|
||||
Rhat = (R_body - R_atmo) * B_ref / (2.0*V_rel_wind);
|
||||
}
|
||||
else
|
||||
{
|
||||
Phat=0;
|
||||
Qhat=0;
|
||||
Rhat=0;
|
||||
}
|
||||
|
||||
// printf("Phat: %f Qhat: %f Rhat: %f\n",Phat,Qhat,Rhat);
|
||||
|
||||
/* compute local CL at three spanwise locations */
|
||||
CL_left = CL_0 + CL_a*(Std_Alpha - Alpha_0 - Phat*eta_loc);
|
||||
CL_cent = CL_0 + CL_a*(Std_Alpha - Alpha_0 );
|
||||
CL_right = CL_0 + CL_a*(Std_Alpha - Alpha_0 + Phat*eta_loc);
|
||||
|
||||
// printf("CL_left: %f CL_cent: %f CL_right: %f\n",CL_left,CL_cent,CL_right);
|
||||
|
||||
/* set CL-limit changes */
|
||||
dCL_left = 0.;
|
||||
dCL_cent = 0.;
|
||||
dCL_right = 0.;
|
||||
|
||||
stalling=0;
|
||||
if (CL_left > CL_max)
|
||||
{
|
||||
dCL_left = CL_max-CL_left -CL_drop;
|
||||
stalling=1;
|
||||
}
|
||||
|
||||
if (CL_cent > CL_max)
|
||||
{
|
||||
dCL_cent = CL_max-CL_cent -CL_drop;
|
||||
stalling=1;
|
||||
}
|
||||
|
||||
if (CL_right > CL_max)
|
||||
{
|
||||
dCL_right = CL_max-CL_right -CL_drop;
|
||||
stalling=1;
|
||||
}
|
||||
|
||||
if (CL_left < CL_min)
|
||||
{
|
||||
dCL_left = CL_min-CL_left -CL_drop;
|
||||
stalling=1;
|
||||
}
|
||||
|
||||
if (CL_cent < CL_min)
|
||||
{
|
||||
dCL_cent = CL_min-CL_cent -CL_drop;
|
||||
stalling=1;
|
||||
}
|
||||
|
||||
if (CL_right < CL_min)
|
||||
{
|
||||
dCL_right = CL_min-CL_right -CL_drop;
|
||||
stalling=1;
|
||||
}
|
||||
|
||||
/* set average wing CL */
|
||||
CL_wing = CL_0 + CL_a*(Std_Alpha-Alpha_0)
|
||||
+ 0.25*dCL_left + 0.5*dCL_cent + 0.25*dCL_right;
|
||||
|
||||
// printf("CL_wing: %f\n",CL_wing);
|
||||
|
||||
|
||||
/* correct profile CD for CL dependence and aileron dependence */
|
||||
CD_all = CD_prof
|
||||
+ CD_CLsq*(CL_wing-CL_CD0)*(CL_wing-CL_CD0)
|
||||
+ CD_AIsq*aileron*aileron
|
||||
+ CD_ELsq*elevator*elevator;
|
||||
|
||||
// printf("CD_all:%lf\n",CD_all);
|
||||
|
||||
/* scale profile CD with Reynolds number via simple power law */
|
||||
if (V_rel_wind > 0.1)
|
||||
{
|
||||
CD_scaled = CD_all*pow(((double)V_rel_wind/(double)U_ref),Uexp_CD);
|
||||
}
|
||||
else
|
||||
{
|
||||
CD_scaled=CD_all;
|
||||
}
|
||||
|
||||
// printf("CD_scaled:%lf\n",CD_scaled);
|
||||
|
||||
|
||||
|
||||
/* Scale lateral cross-coupling derivatives with wing CL */
|
||||
Cl_r_mod = Cl_r*CL_wing/CL_0;
|
||||
Cn_p_mod = Cn_p*CL_wing/CL_0;
|
||||
|
||||
// printf("Cl_r_mod: %f Cn_p_mod: %f\n",Cl_r_mod,Cn_p_mod);
|
||||
|
||||
/* total average CD with induced and stall contributions */
|
||||
dCD_left = CD_stall*dCL_left *dCL_left ;
|
||||
dCD_cent = CD_stall*dCL_cent *dCL_cent ;
|
||||
dCD_right = CD_stall*dCL_right*dCL_right;
|
||||
|
||||
/* total CL, with pitch rate and elevator contributions */
|
||||
CL_drela = (CL_wing + CL_q*Qhat + CL_de*elevator)*Cos_alpha;
|
||||
|
||||
// printf("CL:%f\n",CL);
|
||||
|
||||
/* assymetric stall will cause roll and yaw moments */
|
||||
dCl = 0.45*-1*(dCL_right-dCL_left)*0.5*eta_loc;
|
||||
dCn = 0.45*(dCD_right-dCD_left)*0.5*eta_loc;
|
||||
dCm_stall = (0.25*dCL_left + 0.5*dCL_cent + 0.25*dCL_right)*CG_arm;
|
||||
|
||||
// printf("dCl: %f dCn:%f\n",dCl,dCn);
|
||||
|
||||
/* stall-caused moments in body axes */
|
||||
dCl_stall = dCl*Cos_alpha - dCn*Sin_alpha;
|
||||
dCn_stall = dCl*Sin_alpha + dCn*Cos_alpha;
|
||||
|
||||
/* total CD, with induced and stall contributions */
|
||||
|
||||
Cl_w = Cl_b*Std_Beta + Cl_p*Phat + Cl_r_mod*Rhat
|
||||
+ dCl_stall + Cl_da*aileron;
|
||||
CD_drela = CD_scaled
|
||||
+ (CL*CL + 32.0*Cl_w*Cl_w)*S_ref/(B_ref*B_ref*3.14159*span_eff)
|
||||
+ 0.25*dCD_left + 0.5*dCD_cent + 0.25*dCD_right;
|
||||
|
||||
//printf("CL: %f CD:%f L/D:%f\n",CL,CD,CL/CD);
|
||||
|
||||
/* total forces in body axes */
|
||||
Cx_drela = -CD_drela*Cos_alpha + CL_drela*Sin_alpha*Cos_beta*Cos_beta;
|
||||
Cz_drela = -CD_drela*Sin_alpha - CL_drela*Cos_alpha*Cos_beta*Cos_beta;
|
||||
Cy_drela = CY_b*Std_Beta + CY_p*Phat + CY_r*Rhat + CY_dr*rudder;
|
||||
|
||||
/* total moments in body axes */
|
||||
Cl_drela = Cl_b*Std_Beta + Cl_p*Phat + Cl_r_mod*Rhat + Cl_dr*rudder
|
||||
+ dCl_stall + Cl_da*aileron;
|
||||
Cn_drela = Cn_b*Std_Beta + Cn_p_mod*Phat + Cn_r*Rhat + Cn_dr*rudder
|
||||
+ dCn_stall + Cn_da*aileron;
|
||||
Cm_drela = Cm_0 + Cm_a*(Std_Alpha-Alpha_0) +dCm_stall
|
||||
+ Cm_q*Qhat + Cm_de*elevator;
|
||||
|
||||
/* set dimensional forces and moments */
|
||||
QS = 0.5*Density*V_rel_wind*V_rel_wind * S_ref;
|
||||
|
||||
F_X_aero = Cx_drela * QS;
|
||||
F_Y_aero = Cy_drela * QS;
|
||||
F_Z_aero = Cz_drela * QS;
|
||||
|
||||
M_l_aero = Cl_drela * QS * B_ref;
|
||||
M_m_aero = Cm_drela * QS * C_ref;
|
||||
M_n_aero = Cn_drela * QS * B_ref;
|
||||
// printf("%f %f %f %f %f %f\n",F_X_aero,F_Y_aero,F_Z_aero,M_l_aero,M_m_aero,M_n_aero);
|
||||
}
|
||||
|
81
src/FDM/LaRCsim/basic_aero.h
Normal file
81
src/FDM/LaRCsim/basic_aero.h
Normal file
|
@ -0,0 +1,81 @@
|
|||
/*basic_aero.h*/
|
||||
|
||||
#ifndef __BASIC_AERO_H
|
||||
#define __BASIC_AERO_H
|
||||
|
||||
|
||||
|
||||
#include <FDM/LaRCsim/ls_types.h>
|
||||
|
||||
/*global declarations of aero model parameters*/
|
||||
|
||||
extern SCALAR CLadot;
|
||||
extern SCALAR CLq;
|
||||
extern SCALAR CLde;
|
||||
extern SCALAR CLob;
|
||||
|
||||
extern SCALAR CLa;
|
||||
extern SCALAR CLo;
|
||||
|
||||
|
||||
extern SCALAR Cdob;
|
||||
extern SCALAR Cda; /*Not used*/
|
||||
extern SCALAR Cdde;
|
||||
|
||||
extern SCALAR Cma;
|
||||
extern SCALAR Cmadot;
|
||||
extern SCALAR Cmq;
|
||||
extern SCALAR Cmob;
|
||||
extern SCALAR Cmde;
|
||||
|
||||
extern SCALAR Clbeta;
|
||||
extern SCALAR Clp;
|
||||
extern SCALAR Clr;
|
||||
extern SCALAR Clda;
|
||||
extern SCALAR Cldr;
|
||||
|
||||
extern SCALAR Cnbeta;
|
||||
extern SCALAR Cnp;
|
||||
extern SCALAR Cnr;
|
||||
extern SCALAR Cnda;
|
||||
extern SCALAR Cndr;
|
||||
|
||||
extern SCALAR Cybeta;
|
||||
extern SCALAR Cyp;
|
||||
extern SCALAR Cyr;
|
||||
extern SCALAR Cyda;
|
||||
extern SCALAR Cydr;
|
||||
|
||||
/*nondimensionalization quantities*/
|
||||
/*units here are ft and lbs */
|
||||
extern SCALAR cbar; /*mean aero chord ft*/
|
||||
extern SCALAR b; /*wing span ft */
|
||||
extern SCALAR Sw; /*wing planform surface area ft^2*/
|
||||
extern SCALAR rPiARe; /*reciprocal of Pi*AR*e*/
|
||||
extern SCALAR lbare; /*elevator moment arm MAC*/
|
||||
|
||||
extern SCALAR Weight; /*lbs*/
|
||||
extern SCALAR MaxTakeoffWeight,EmptyWeight;
|
||||
extern SCALAR Cg; /*%MAC*/
|
||||
extern SCALAR Zcg; /*%MAC*/
|
||||
|
||||
|
||||
extern SCALAR CLwbh,CL,cm,cd,cn,cy,croll,cbar_2V,b_2V,qS,qScbar,qSb;
|
||||
extern SCALAR CLo,Cdo,Cmo;
|
||||
|
||||
extern SCALAR F_X_wind,F_Y_wind,F_Z_wind;
|
||||
|
||||
extern SCALAR long_trim;
|
||||
|
||||
|
||||
extern SCALAR elevator, aileron, rudder;
|
||||
|
||||
|
||||
extern SCALAR Flap_Position;
|
||||
|
||||
extern int Flaps_In_Transit;
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
90
src/FDM/LaRCsim/basic_engine.c
Normal file
90
src/FDM/LaRCsim/basic_engine.c
Normal file
|
@ -0,0 +1,90 @@
|
|||
/***************************************************************************
|
||||
|
||||
TITLE: basic_engine.c
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
FUNCTION: dummy engine routine
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
MODULE STATUS: incomplete
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
GENEALOGY:
|
||||
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
DESIGNED BY: designer
|
||||
|
||||
CODED BY: programmer
|
||||
|
||||
MAINTAINED BY: maintainer
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
MODIFICATION HISTORY:
|
||||
|
||||
DATE PURPOSE BY
|
||||
|
||||
CURRENT RCS HEADER INFO:
|
||||
|
||||
$Header$
|
||||
|
||||
* Revision 1.1 92/12/30 13:21:46 bjax
|
||||
* Initial revision
|
||||
*
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
REFERENCES:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
CALLED BY: ls_model();
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
CALLS TO: none
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
INPUTS:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
OUTPUTS:
|
||||
|
||||
--------------------------------------------------------------------------*/
|
||||
#include <math.h>
|
||||
#include "ls_types.h"
|
||||
#include "ls_constants.h"
|
||||
#include "ls_generic.h"
|
||||
#include "ls_sim_control.h"
|
||||
#include "ls_cockpit.h"
|
||||
#include "basic_aero.h"
|
||||
|
||||
extern SIM_CONTROL sim_control_;
|
||||
|
||||
void basic_engine( SCALAR dt, int init ) {
|
||||
|
||||
// c172
|
||||
// F_X_engine = Throttle_pct * 421;
|
||||
// neo 2m slope
|
||||
F_X_engine = Throttle_pct * 8;
|
||||
F_Y_engine = 0.0;
|
||||
F_Z_engine = 0.0;
|
||||
M_l_engine = 0.0;
|
||||
M_m_engine = 0.0;
|
||||
M_n_engine = 0.0;
|
||||
|
||||
|
||||
// printf("Throttle_pct %f\n", Throttle_pct);
|
||||
// printf("F_X_engine %f\n", F_X_engine);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
349
src/FDM/LaRCsim/basic_gear.c
Normal file
349
src/FDM/LaRCsim/basic_gear.c
Normal file
|
@ -0,0 +1,349 @@
|
|||
/***************************************************************************
|
||||
|
||||
TITLE: gear
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
FUNCTION: Landing gear model for example simulation
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
MODULE STATUS: developmental
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
GENEALOGY: Created 931012 by E. B. Jackson
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
DESIGNED BY: E. B. Jackson
|
||||
|
||||
CODED BY: E. B. Jackson
|
||||
|
||||
MAINTAINED BY: E. B. Jackson
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
MODIFICATION HISTORY:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
REFERENCES:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
CALLED BY:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
CALLS TO:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
INPUTS:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
OUTPUTS:
|
||||
|
||||
--------------------------------------------------------------------------*/
|
||||
#include <math.h>
|
||||
#include "ls_types.h"
|
||||
#include "ls_constants.h"
|
||||
#include "ls_generic.h"
|
||||
#include "ls_cockpit.h"
|
||||
|
||||
#define HEIGHT_AGL_WHEEL d_wheel_rwy_local_v[2]
|
||||
|
||||
|
||||
static void sub3( DATA v1[], DATA v2[], DATA result[] )
|
||||
{
|
||||
result[0] = v1[0] - v2[0];
|
||||
result[1] = v1[1] - v2[1];
|
||||
result[2] = v1[2] - v2[2];
|
||||
}
|
||||
|
||||
static void add3( DATA v1[], DATA v2[], DATA result[] )
|
||||
{
|
||||
result[0] = v1[0] + v2[0];
|
||||
result[1] = v1[1] + v2[1];
|
||||
result[2] = v1[2] + v2[2];
|
||||
}
|
||||
|
||||
static void cross3( DATA v1[], DATA v2[], DATA result[] )
|
||||
{
|
||||
result[0] = v1[1]*v2[2] - v1[2]*v2[1];
|
||||
result[1] = v1[2]*v2[0] - v1[0]*v2[2];
|
||||
result[2] = v1[0]*v2[1] - v1[1]*v2[0];
|
||||
}
|
||||
|
||||
static void multtrans3x3by3( DATA m[][3], DATA v[], DATA result[] )
|
||||
{
|
||||
result[0] = m[0][0]*v[0] + m[1][0]*v[1] + m[2][0]*v[2];
|
||||
result[1] = m[0][1]*v[0] + m[1][1]*v[1] + m[2][1]*v[2];
|
||||
result[2] = m[0][2]*v[0] + m[1][2]*v[1] + m[2][2]*v[2];
|
||||
}
|
||||
|
||||
static void mult3x3by3( DATA m[][3], DATA v[], DATA result[] )
|
||||
{
|
||||
result[0] = m[0][0]*v[0] + m[0][1]*v[1] + m[0][2]*v[2];
|
||||
result[1] = m[1][0]*v[0] + m[1][1]*v[1] + m[1][2]*v[2];
|
||||
result[2] = m[2][0]*v[0] + m[2][1]*v[1] + m[2][2]*v[2];
|
||||
}
|
||||
|
||||
static void clear3( DATA v[] )
|
||||
{
|
||||
v[0] = 0.; v[1] = 0.; v[2] = 0.;
|
||||
}
|
||||
|
||||
void basic_gear()
|
||||
{
|
||||
char rcsid[] = "junk";
|
||||
#define NUM_WHEELS 4
|
||||
|
||||
// char gear_strings[NUM_WHEELS][12]={"nose","right main", "left main", "tail skid"};
|
||||
/*
|
||||
* Aircraft specific initializations and data goes here
|
||||
*/
|
||||
|
||||
|
||||
static int num_wheels = NUM_WHEELS; /* number of wheels */
|
||||
static DATA d_wheel_rp_body_v[NUM_WHEELS][3] = /* X, Y, Z locations,full extension */
|
||||
{
|
||||
{ .422, 0., .29 }, /*nose*/ /* in feet */
|
||||
{ 0.026, 0.006, .409 }, /*right main*/
|
||||
{ 0.026, -.006, .409 }, /*left main*/
|
||||
{ -1.32, 0, .17 } /*tail skid */
|
||||
};
|
||||
// static DATA gear_travel[NUM_WHEELS] = /*in Z-axis*/
|
||||
// { -0.5, 2.5, 2.5, 0};
|
||||
static DATA spring_constant[NUM_WHEELS] = /* springiness, lbs/ft */
|
||||
{ 2., .65, .65, 1. };
|
||||
static DATA spring_damping[NUM_WHEELS] = /* damping, lbs/ft/sec */
|
||||
{ 1., .3, .3, .5 };
|
||||
static DATA percent_brake[NUM_WHEELS] = /* percent applied braking */
|
||||
{ 0., 0., 0., 0. }; /* 0 = none, 1 = full */
|
||||
static DATA caster_angle_rad[NUM_WHEELS] = /* steerable tires - in */
|
||||
{ 0., 0., 0., 0}; /* radians, +CW */
|
||||
/*
|
||||
* End of aircraft specific code
|
||||
*/
|
||||
|
||||
/*
|
||||
* Constants & coefficients for tyres on tarmac - ref [1]
|
||||
*/
|
||||
|
||||
/* skid function looks like:
|
||||
*
|
||||
* mu ^
|
||||
* |
|
||||
* max_mu | +
|
||||
* | /|
|
||||
* sliding_mu | / +------
|
||||
* | /
|
||||
* | /
|
||||
* +--+------------------------>
|
||||
* | | | sideward V
|
||||
* 0 bkout skid
|
||||
* V V
|
||||
*/
|
||||
|
||||
|
||||
static int it_rolls[NUM_WHEELS] = { 1,1,1,0};
|
||||
static DATA sliding_mu[NUM_WHEELS] = { 0.5, 0.5, 0.5, 0.3};
|
||||
static DATA rolling_mu[NUM_WHEELS] = { 0.01, 0.01, 0.01, 0.0};
|
||||
static DATA max_brake_mu[NUM_WHEELS] ={ 0.0, 0.6, 0.6, 0.0};
|
||||
static DATA max_mu = 0.8;
|
||||
static DATA bkout_v = 0.1;
|
||||
static DATA skid_v = 1.0;
|
||||
/*
|
||||
* Local data variables
|
||||
*/
|
||||
|
||||
DATA d_wheel_cg_body_v[3]; /* wheel offset from cg, X-Y-Z */
|
||||
DATA d_wheel_cg_local_v[3]; /* wheel offset from cg, N-E-D */
|
||||
DATA d_wheel_rwy_local_v[3]; /* wheel offset from rwy, N-E-U */
|
||||
DATA v_wheel_cg_local_v[3]; /*wheel velocity rel to cg N-E-D*/
|
||||
// DATA v_wheel_body_v[3]; /* wheel velocity, X-Y-Z */
|
||||
DATA v_wheel_local_v[3]; /* wheel velocity, N-E-D */
|
||||
DATA f_wheel_local_v[3]; /* wheel reaction force, N-E-D */
|
||||
// DATA altitude_local_v[3]; /*altitude vector in local (N-E-D) i.e. (0,0,h)*/
|
||||
// DATA altitude_body_v[3]; /*altitude vector in body (X,Y,Z)*/
|
||||
DATA temp3a[3];
|
||||
// DATA temp3b[3];
|
||||
DATA tempF[3];
|
||||
DATA tempM[3];
|
||||
DATA reaction_normal_force; /* wheel normal (to rwy) force */
|
||||
DATA cos_wheel_hdg_angle, sin_wheel_hdg_angle; /* temp storage */
|
||||
DATA v_wheel_forward, v_wheel_sideward, abs_v_wheel_sideward;
|
||||
DATA forward_mu, sideward_mu; /* friction coefficients */
|
||||
DATA beta_mu; /* breakout friction slope */
|
||||
DATA forward_wheel_force, sideward_wheel_force;
|
||||
|
||||
int i; /* per wheel loop counter */
|
||||
|
||||
/*
|
||||
* Execution starts here
|
||||
*/
|
||||
|
||||
beta_mu = max_mu/(skid_v-bkout_v);
|
||||
clear3( F_gear_v ); /* Initialize sum of forces... */
|
||||
clear3( M_gear_v ); /* ...and moments */
|
||||
|
||||
/*
|
||||
* Put aircraft specific executable code here
|
||||
*/
|
||||
|
||||
percent_brake[1] = Brake_pct[0];
|
||||
percent_brake[2] = Brake_pct[1];
|
||||
|
||||
caster_angle_rad[0] =
|
||||
(0.01 + 0.04 * (1 - V_calibrated_kts / 130)) * Rudder_pedal;
|
||||
|
||||
|
||||
for (i=0;i<num_wheels;i++) /* Loop for each wheel */
|
||||
{
|
||||
/* printf("%s:\n",gear_strings[i]); */
|
||||
|
||||
|
||||
|
||||
/*========================================*/
|
||||
/* Calculate wheel position w.r.t. runway */
|
||||
/*========================================*/
|
||||
|
||||
|
||||
/* printf("\thgcg: %g, theta: %g,phi: %g\n",D_cg_above_rwy,Theta*RAD_TO_DEG,Phi*RAD_TO_DEG); */
|
||||
|
||||
|
||||
/* First calculate wheel location w.r.t. cg in body (X-Y-Z) axes... */
|
||||
|
||||
sub3( d_wheel_rp_body_v[i], D_cg_rp_body_v, d_wheel_cg_body_v );
|
||||
|
||||
/* then converting to local (North-East-Down) axes... */
|
||||
|
||||
multtrans3x3by3( T_local_to_body_m, d_wheel_cg_body_v, d_wheel_cg_local_v );
|
||||
|
||||
|
||||
/* Runway axes correction - third element is Altitude, not (-)Z... */
|
||||
|
||||
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* since altitude = -Z */
|
||||
|
||||
/* Add wheel offset to cg location in local axes */
|
||||
|
||||
add3( d_wheel_cg_local_v, D_cg_rwy_local_v, d_wheel_rwy_local_v );
|
||||
|
||||
/* remove Runway axes correction so right hand rule applies */
|
||||
|
||||
d_wheel_cg_local_v[2] = -d_wheel_cg_local_v[2]; /* now Z positive down */
|
||||
|
||||
/*============================*/
|
||||
/* Calculate wheel velocities */
|
||||
/*============================*/
|
||||
|
||||
/* contribution due to angular rates */
|
||||
|
||||
cross3( Omega_body_v, d_wheel_cg_body_v, temp3a );
|
||||
|
||||
/* transform into local axes */
|
||||
|
||||
multtrans3x3by3( T_local_to_body_m, temp3a,v_wheel_cg_local_v );
|
||||
|
||||
/* plus contribution due to cg velocities */
|
||||
|
||||
add3( v_wheel_cg_local_v, V_local_rel_ground_v, v_wheel_local_v );
|
||||
|
||||
clear3(f_wheel_local_v);
|
||||
reaction_normal_force=0;
|
||||
if( HEIGHT_AGL_WHEEL < 0. )
|
||||
/*the wheel is underground -- which implies ground contact
|
||||
so calculate reaction forces */
|
||||
{
|
||||
/*===========================================*/
|
||||
/* Calculate forces & moments for this wheel */
|
||||
/*===========================================*/
|
||||
|
||||
/* Add any anticipation, or frame lead/prediction, here... */
|
||||
|
||||
/* no lead used at present */
|
||||
|
||||
/* Calculate sideward and forward velocities of the wheel
|
||||
in the runway plane */
|
||||
|
||||
cos_wheel_hdg_angle = cos(caster_angle_rad[i] + Psi);
|
||||
sin_wheel_hdg_angle = sin(caster_angle_rad[i] + Psi);
|
||||
|
||||
v_wheel_forward = v_wheel_local_v[0]*cos_wheel_hdg_angle
|
||||
+ v_wheel_local_v[1]*sin_wheel_hdg_angle;
|
||||
v_wheel_sideward = v_wheel_local_v[1]*cos_wheel_hdg_angle
|
||||
- v_wheel_local_v[0]*sin_wheel_hdg_angle;
|
||||
|
||||
|
||||
/* Calculate normal load force (simple spring constant) */
|
||||
|
||||
reaction_normal_force = 0.;
|
||||
|
||||
reaction_normal_force = spring_constant[i]*d_wheel_rwy_local_v[2]
|
||||
- v_wheel_local_v[2]*spring_damping[i];
|
||||
/* printf("\treaction_normal_force: %g\n",reaction_normal_force); */
|
||||
|
||||
if (reaction_normal_force > 0.) reaction_normal_force = 0.;
|
||||
/* to prevent damping component from swamping spring component */
|
||||
|
||||
|
||||
/* Calculate friction coefficients */
|
||||
|
||||
if(it_rolls[i])
|
||||
{
|
||||
forward_mu = (max_brake_mu[i] - rolling_mu[i])*percent_brake[i] + rolling_mu[i];
|
||||
abs_v_wheel_sideward = sqrt(v_wheel_sideward*v_wheel_sideward);
|
||||
sideward_mu = sliding_mu[i];
|
||||
if (abs_v_wheel_sideward < skid_v)
|
||||
sideward_mu = (abs_v_wheel_sideward - bkout_v)*beta_mu;
|
||||
if (abs_v_wheel_sideward < bkout_v) sideward_mu = 0.;
|
||||
}
|
||||
else
|
||||
{
|
||||
forward_mu=sliding_mu[i];
|
||||
sideward_mu=sliding_mu[i];
|
||||
}
|
||||
|
||||
/* Calculate foreward and sideward reaction forces */
|
||||
|
||||
forward_wheel_force = forward_mu*reaction_normal_force;
|
||||
sideward_wheel_force = sideward_mu*reaction_normal_force;
|
||||
if(v_wheel_forward < 0.) forward_wheel_force = -forward_wheel_force;
|
||||
if(v_wheel_sideward < 0.) sideward_wheel_force = -sideward_wheel_force;
|
||||
/* printf("\tFfwdgear: %g Fsidegear: %g\n",forward_wheel_force,sideward_wheel_force);
|
||||
*/
|
||||
/* Rotate into local (N-E-D) axes */
|
||||
|
||||
f_wheel_local_v[0] = forward_wheel_force*cos_wheel_hdg_angle
|
||||
- sideward_wheel_force*sin_wheel_hdg_angle;
|
||||
f_wheel_local_v[1] = forward_wheel_force*sin_wheel_hdg_angle
|
||||
+ sideward_wheel_force*cos_wheel_hdg_angle;
|
||||
f_wheel_local_v[2] = reaction_normal_force;
|
||||
|
||||
/* Convert reaction force from local (N-E-D) axes to body (X-Y-Z) */
|
||||
mult3x3by3( T_local_to_body_m, f_wheel_local_v, tempF );
|
||||
|
||||
/* Calculate moments from force and offsets in body axes */
|
||||
|
||||
cross3( d_wheel_cg_body_v, tempF, tempM );
|
||||
|
||||
/* Sum forces and moments across all wheels */
|
||||
|
||||
add3( tempF, F_gear_v, F_gear_v );
|
||||
add3( tempM, M_gear_v, M_gear_v );
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
printf("\tN: %g,dZrwy: %g dZdotrwy: %g\n",reaction_normal_force,HEIGHT_AGL_WHEEL,v_wheel_cg_local_v[2]);
|
||||
printf("\tFxgear: %g Fygear: %g, Fzgear: %g\n",F_X_gear,F_Y_gear,F_Z_gear);
|
||||
printf("\tMgear: %g, Lgear: %g, Ngear: %g\n\n",M_m_gear,M_l_gear,M_n_gear);
|
||||
|
||||
|
||||
}
|
||||
}
|
79
src/FDM/LaRCsim/basic_init.c
Normal file
79
src/FDM/LaRCsim/basic_init.c
Normal file
|
@ -0,0 +1,79 @@
|
|||
/***************************************************************************
|
||||
|
||||
TITLE: basic_init.c
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
FUNCTION:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
MODULE STATUS: developmental
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
GENEALOGY:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
DESIGNED BY: EBJ
|
||||
|
||||
CODED BY: EBJ
|
||||
|
||||
MAINTAINED BY: EBJ
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
MODIFICATION HISTORY:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
REFERENCES:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
CALLED BY:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
CALLS TO:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
INPUTS:
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
OUTPUTS:
|
||||
|
||||
--------------------------------------------------------------------------*/
|
||||
#include "ls_types.h"
|
||||
#include "ls_generic.h"
|
||||
#include "ls_cockpit.h"
|
||||
#include "ls_constants.h"
|
||||
#include "basic_aero.h"
|
||||
|
||||
void basic_init( void ) {
|
||||
|
||||
Throttle[3] = 0.2;
|
||||
|
||||
Dx_pilot = 0; Dy_pilot = 0; Dz_pilot = 0;
|
||||
/* Mass=2300*INVG; */
|
||||
/* I_xx=948; */
|
||||
/* I_yy=1346; */
|
||||
/* I_zz=1967; */
|
||||
/* I_xz=0; */
|
||||
Mass = 2./32.174;
|
||||
I_xx = 0.0454;
|
||||
I_yy = 0.0191;
|
||||
I_zz = 0.0721;
|
||||
I_xz = 0;
|
||||
|
||||
|
||||
Flap_Position=Flap_handle;
|
||||
Flaps_In_Transit=0;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
11
src/FDM/LaRCsim/basic_init.h
Normal file
11
src/FDM/LaRCsim/basic_init.h
Normal file
|
@ -0,0 +1,11 @@
|
|||
/* a quick navion_init.h */
|
||||
|
||||
|
||||
#ifndef _BASIC_INIT_H
|
||||
#define _BASIC_INIT_H
|
||||
|
||||
|
||||
void basic_init( void );
|
||||
|
||||
|
||||
#endif _BASIC_INIT_H
|
Loading…
Reference in a new issue