diff --git a/src/FDM/LaRCsim/uiuc_aero.c b/src/FDM/LaRCsim/uiuc_aero.c index 2aec73867..24fa87480 100644 --- a/src/FDM/LaRCsim/uiuc_aero.c +++ b/src/FDM/LaRCsim/uiuc_aero.c @@ -28,6 +28,7 @@ DATE PURPOSE BY 3/17/00 Initial test release + 3/09/01 Added callout to UIUC gear function. (DPM) ---------------------------------------------------------------------------- @@ -76,252 +77,8 @@ void uiuc_engine( SCALAR dt, int Initialize ) uiuc_engine_routine(); } -/* *********************************************************************** - * Gear model. Exact copy of C172_gear.c. Additional gear models will be - * added later and the choice of the gear model could be specified at - * runtime. - * ***********************************************************************/ -static void sub3( DATA v1[], DATA v2[], DATA result[] ) + +void uiuc_gear () { - 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 uiuc_gear() -{ -char rcsid[] = "$Id$"; - - /* - * Aircraft specific initializations and data goes here - */ - -#define NUM_WHEELS 3 - - static int num_wheels = NUM_WHEELS; /* number of wheels */ - static DATA d_wheel_rp_body_v[NUM_WHEELS][3] = /* X, Y, Z locations */ - { - { 10., 0., 4. }, /* in feet */ - { -1., 3., 4. }, - { -1., -3., 4. } - }; - static DATA spring_constant[NUM_WHEELS] = /* springiness, lbs/ft */ - { 1500., 5000., 5000. }; - static DATA spring_damping[NUM_WHEELS] = /* damping, lbs/ft/sec */ - { 100., 150., 150. }; - static DATA percent_brake[NUM_WHEELS] = /* percent applied braking */ - { 0., 0., 0. }; /* 0 = none, 1 = full */ - static DATA caster_angle_rad[NUM_WHEELS] = /* steerable tires - in */ - { 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 DATA sliding_mu = 0.5; - static DATA rolling_mu = 0.01; - static DATA max_brake_mu = 0.6; - 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_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 temp3a[3], temp3b[3], tempF[3], 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] = 0.; /* replace with cockpit brake handle connection code */ - percent_brake[2] = percent_brake[1]; - - caster_angle_rad[0] = 0.03*Rudder_pedal; - - for (i=0;i 0.) reaction_normal_force = 0.; - /* to prevent damping component from swamping spring component */ - } - - /* Calculate friction coefficients */ - - forward_mu = (max_brake_mu - rolling_mu)*percent_brake[i] + rolling_mu; - abs_v_wheel_sideward = sqrt(v_wheel_sideward*v_wheel_sideward); - sideward_mu = sliding_mu; - 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.; - - /* 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; - - /* 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 ); - - } + uiuc_gear_routine(); } diff --git a/src/FDM/UIUCModel/Makefile.am b/src/FDM/UIUCModel/Makefile.am index c545856cc..8d5b1709b 100644 --- a/src/FDM/UIUCModel/Makefile.am +++ b/src/FDM/UIUCModel/Makefile.am @@ -20,6 +20,7 @@ libUIUCModel_a_SOURCES = \ uiuc_controlInput.cpp uiuc_controlInput.h \ uiuc_convert.cpp uiuc_convert.h \ uiuc_engine.cpp uiuc_engine.h \ + uiuc_gear.cpp uiuc_gear.h \ uiuc_ice.cpp uiuc_ice.h \ uiuc_initializemaps.cpp uiuc_initializemaps.h \ uiuc_map_CD.cpp uiuc_map_CD.h \ @@ -32,6 +33,7 @@ libUIUCModel_a_SOURCES = \ uiuc_map_engine.cpp uiuc_map_engine.h \ uiuc_map_geometry.cpp uiuc_map_geometry.h \ uiuc_map_ice.cpp uiuc_map_ice.h \ + uiuc_map_gear.cpp uiuc_map_gear.h \ uiuc_map_init.cpp uiuc_map_init.h \ uiuc_map_keyword.cpp uiuc_map_keyword.h \ uiuc_map_mass.cpp uiuc_map_mass.h \ diff --git a/src/FDM/UIUCModel/uiuc_aircraft.h b/src/FDM/UIUCModel/uiuc_aircraft.h index d6895db9f..65ff390ba 100644 --- a/src/FDM/UIUCModel/uiuc_aircraft.h +++ b/src/FDM/UIUCModel/uiuc_aircraft.h @@ -36,11 +36,13 @@ and Weight; added misc map 04/01/2000 (JS) added throttle, longitudinal, lateral, and rudder inputs to record map + 03/09/2001 (DPM) added support for gear ---------------------------------------------------------------------- AUTHOR(S): Bipin Sehgal Jeff Scott + David Megginson ---------------------------------------------------------------------- @@ -96,7 +98,7 @@ #include #include -#include +#include STL_IOSTREAM #include #include "uiuc_parsefile.h" @@ -171,7 +173,8 @@ enum {Cno_flag = 13000, Cn_beta_flag, Cn_p_flag, Cn_r_flag, Cn_da_flag, Cn_dr_flag, Cn_q_flag, Cn_b3_flag, Cnfada_flag, Cnfbetadr_flag}; // gear ======= Landing gear model quantities -// enum {xxx = 14000}; +enum {Dx_gear_flag = 14000, Dy_gear_flag, Dz_gear_flag, cgear_flag, + kgear_flag, muGear_flag, strutLength_flag}; // ice ======== Ice model quantities enum {iceTime_flag = 15000, transientTime_flag, eta_ice_final_flag, @@ -851,6 +854,19 @@ typedef struct map gear_map; #define gear_map aircraft_->gear_map +#define MAX_GEAR 16 + bool gear_model[MAX_GEAR]; + double D_gear_v[MAX_GEAR][3]; + double cgear[MAX_GEAR]; + double kgear[MAX_GEAR]; + double muGear[MAX_GEAR]; + double strutLength[MAX_GEAR]; +#define D_gear_v aircraft_->D_gear_v +#define gear_model aircraft_->gear_model +#define cgear aircraft_->cgear +#define kgear aircraft_->kgear +#define muGear aircraft_->muGear +#define strutLength aircraft_->strutLength /* Variables (token2) ===========================================*/ diff --git a/src/FDM/UIUCModel/uiuc_initializemaps.cpp b/src/FDM/UIUCModel/uiuc_initializemaps.cpp index 775d8c658..8e58d78d2 100644 --- a/src/FDM/UIUCModel/uiuc_initializemaps.cpp +++ b/src/FDM/UIUCModel/uiuc_initializemaps.cpp @@ -18,11 +18,13 @@ HISTORY: 01/26/2000 initial release 04/08/2000 broke up into multiple map_xxxx functions + 03/09/2001 (DPM) initialize gear map ---------------------------------------------------------------------- AUTHOR(S): Bipin Sehgal Jeff Scott + David Megginson ---------------------------------------------------------------------- @@ -81,7 +83,7 @@ void uiuc_initializemaps() uiuc_map_CY(); uiuc_map_Croll(); uiuc_map_Cn(); - // uiuc_map_gear(); + uiuc_map_gear(); uiuc_map_ice(); uiuc_map_record1(); uiuc_map_record2(); diff --git a/src/FDM/UIUCModel/uiuc_initializemaps.h b/src/FDM/UIUCModel/uiuc_initializemaps.h index f6943c2e3..86dfec159 100644 --- a/src/FDM/UIUCModel/uiuc_initializemaps.h +++ b/src/FDM/UIUCModel/uiuc_initializemaps.h @@ -15,6 +15,7 @@ #include "uiuc_map_Croll.h" #include "uiuc_map_Cn.h" #include "uiuc_map_ice.h" +#include "uiuc_map_gear.h" #include "uiuc_map_record1.h" #include "uiuc_map_record2.h" #include "uiuc_map_record3.h" diff --git a/src/FDM/UIUCModel/uiuc_menu.cpp b/src/FDM/UIUCModel/uiuc_menu.cpp index 098920880..1aa2489db 100644 --- a/src/FDM/UIUCModel/uiuc_menu.cpp +++ b/src/FDM/UIUCModel/uiuc_menu.cpp @@ -41,12 +41,14 @@ 04/05/2000 (JS) added Altitude to init and record maps; added zero_Long_trim to controlSurface map + 03/09/2001 (DPM) added support for gear. ---------------------------------------------------------------------- AUTHOR(S): Bipin Sehgal Jeff Scott Michael Selig + David Megginson ---------------------------------------------------------------------- @@ -98,7 +100,7 @@ #endif #include -#include +#include STL_IOSTREAM #include "uiuc_menu.h" @@ -2124,27 +2126,93 @@ void uiuc_menu( string aircraft_name ) } // end Cn map - /* - case gear_flag: { + int index; + token3 >> index; + if (index < 0 || index >= 16) + uiuc_warnings_errors(1, *command_line); switch(gear_map[linetoken2]) { - case kgear: + case Dx_gear_flag: + { + if (check_float(linetoken3)) + token4 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + D_gear_v[index][0] = token_value; + gear_model[index] = true; + break; + } + case Dy_gear_flag: + { + if (check_float(linetoken3)) + token4 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + D_gear_v[index][1] = token_value; + gear_model[index] = true; + break; + } + case Dz_gear_flag: + { + if (check_float(linetoken3)) + token4 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + D_gear_v[index][2] = token_value; + gear_model[index] = true; + break; + } + case cgear_flag: + { + if (check_float(linetoken3)) + token4 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + cgear[index] = token_value; + gear_model[index] = true; + break; + } + case kgear_flag: { - // none yet + if (check_float(linetoken3)) + token4 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + kgear[index] = token_value; + gear_model[index] = true; break; } + case muGear_flag: + { + if (check_float(linetoken3)) + token4 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + muGear[index] = token_value; + gear_model[index] = true; + break; + } + case strutLength_flag: + { + if (check_float(linetoken3)) + token4 >> token_value; + else + uiuc_warnings_errors(1, *command_line); + strutLength[index] = token_value; + gear_model[index] = true; + break; + } default: { uiuc_warnings_errors(2, *command_line); - break; + break; } }; + break; } // end gear map -*/ - case ice_flag: { diff --git a/src/FDM/UIUCModel/uiuc_wrapper.cpp b/src/FDM/UIUCModel/uiuc_wrapper.cpp index 9648e35df..4ad4d1c37 100644 --- a/src/FDM/UIUCModel/uiuc_wrapper.cpp +++ b/src/FDM/UIUCModel/uiuc_wrapper.cpp @@ -18,10 +18,12 @@ ---------------------------------------------------------------------- HISTORY: 01/26/2000 initial release + 03/09/2001 (DPM) added support for gear ---------------------------------------------------------------------- AUTHOR(S): Bipin Sehgal + David Megginson ---------------------------------------------------------------------- @@ -69,6 +71,7 @@ #include "uiuc_aircraftdir.h" #include "uiuc_coefficients.h" #include "uiuc_engine.h" +#include "uiuc_gear.h" #include "uiuc_aerodeflections.h" #include "uiuc_recorder.h" #include "uiuc_menu.h" @@ -81,6 +84,7 @@ SG_USING_STD(endl); extern "C" void uiuc_init_aeromodel (); extern "C" void uiuc_force_moment(double dt); extern "C" void uiuc_engine_routine(); +extern "C" void uiuc_gear_routine(); AIRCRAFT *aircraft_ = new AIRCRAFT; AIRCRAFTDIR *aircraftdir_ = new AIRCRAFTDIR; @@ -137,4 +141,9 @@ void uiuc_engine_routine() uiuc_engine(); } +void uiuc_gear_routine () +{ + uiuc_gear(); +} + //end uiuc_wrapper.cpp diff --git a/src/FDM/UIUCModel/uiuc_wrapper.h b/src/FDM/UIUCModel/uiuc_wrapper.h index ca59a2acb..1a4896829 100644 --- a/src/FDM/UIUCModel/uiuc_wrapper.h +++ b/src/FDM/UIUCModel/uiuc_wrapper.h @@ -2,3 +2,4 @@ void uiuc_init_aeromodel (); void uiuc_force_moment(double dt); void uiuc_engine_routine(); +void uiuc_gear_routine();