From 0ab39eea99c4a63621498e05c2c0561b74aa6530 Mon Sep 17 00:00:00 2001 From: curt Date: Thu, 29 Mar 2001 03:16:25 +0000 Subject: [PATCH] From: David Megginson I have created a set of patches to provide configurable landing gear for the UIUC models. The patches (including four new files) are available at http://megginson.com/private/fgfs/uiuc-20010309.tar.gz A modified UIUC configuration file for the Twin Otter (DHC-6) is available at http://megginson.com/private/fgfs/aircraft.dat It should be possible to configure appropriate gear for all of the UIUC models now. As a bonus, the models also support braking, both absolute and differential, as well as nose-wheel steering (all of which are currently missing from the UIUC models) -- when you land, you don't have to keep rolling off the end of the runway anymore, and you don't have to bank to steer in a taxi. My sample configuration file contains absolutely bizarre, wild guesses, and many places that I didn't even bother to guess properly. The only actual data I had was the wing-span of the DHC-6 (65ft), which I used for positioning the wing tips. The wing-tips for this model actually work now -- I hit the aileron hard while accelerating for take-off, and the wingtip noticeably strikes the ground and bounces up (quite dramatic in external view using the DHC-6 model from Wolfram's site). Details ------- The UIUC models now support up to 16 gear points each where a gear point is anything in the aircraft that can come in contact with the ground, including the tail and wing-tips. I have added the following new fields to the UIUC configuration files, where is an integer between 0 and 15, and is a real number: gear Dx_gear # x offset from CG [ft] gear Dy_gear # y offset from CG [ft] gear Dz_gear # z offset from CG [ft] gear cgear # spring damping [lbs/ft/sec] gear kgear # springiness [lbs/ft] gear muGear # rolling coefficient gear strutLength # gear travel [ft] (not yet used) Most of these names were already pencilled into the UIUC documentation (as TODO items), but I had to make up Dx_gear, Dy_gear, and Dz_gear -- if those are inappropriate, I'd appreciate suggestions for better names. It will be necessary to modify the other UIUC configuration files to include some kind of gear support as well, or the planes will sink nose-first into the ground down to their CG's (it's actually quite funny to watch with an external view). Background ---------- As I frequently remind everyone here, I have no math background worth spitting at, so I will not even pretend to have done the hard stuff. The UIUC code uses a copy of a very old version of the LaRCsim c172_gear.c -- I wanted to update it with Tony Peden's excellent newer version, which includes differential braking among other goodies (the UIUC models don't support brakes, period). I copied the newer code into uiuc_aero.c, and it compiled and ran, but all of the planes ended up sitting on their tails with their noses in the air. Since Tony made his gear code nicely parameterized, I experimented with different values, and found that it wasn't too hard to balance the Twin Otter by moving the gear back a bit. At first, I used properties to set different values, but then I decided to integrate the whole thing properly into the UIUC configuration framework. Thanks to Tony Peden, who did the real modelling work -- I can take credit only for two or three hours of integration. It turns out that Tony's code is generalized enough to deal with a wide range of different gear structures -- I suspect that it will even work for the 747, when I get around to trying some values. --- src/FDM/LaRCsim/uiuc_aero.c | 249 +--------------------- src/FDM/UIUCModel/Makefile.am | 2 + src/FDM/UIUCModel/uiuc_aircraft.h | 20 +- src/FDM/UIUCModel/uiuc_initializemaps.cpp | 4 +- src/FDM/UIUCModel/uiuc_initializemaps.h | 1 + src/FDM/UIUCModel/uiuc_menu.cpp | 84 +++++++- src/FDM/UIUCModel/uiuc_wrapper.cpp | 9 + src/FDM/UIUCModel/uiuc_wrapper.h | 1 + 8 files changed, 113 insertions(+), 257 deletions(-) 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[] ) -{ - 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() +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(); -- 2.39.5