1
0
Fork 0

From: David Megginson <david@megginson.com>

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 <index> is an
integer between 0 and 15, and <value> is a real number:

  gear <index> Dx_gear <value>     # x offset from CG [ft]
  gear <index> Dy_gear <value>     # y offset from CG [ft]
  gear <index> Dz_gear <value>     # z offset from CG [ft]
  gear <index> cgear <value>       # spring damping [lbs/ft/sec]
  gear <index> kgear <value>       # springiness [lbs/ft]
  gear <index> muGear <value>      # rolling coefficient
  gear <index> strutLength <value> # 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.
This commit is contained in:
curt 2001-03-29 03:16:25 +00:00
parent 84816c13af
commit 0ab39eea99
8 changed files with 114 additions and 258 deletions

View file

@ -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<num_wheels;i++) /* Loop for each wheel */
{
/*========================================*/
/* Calculate wheel position w.r.t. runway */
/*========================================*/
/* 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, temp3b );
/* plus contribution due to cg velocities */
add3( temp3b, V_local_rel_ground_v, v_wheel_local_v );
/*===========================================*/
/* 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.;
if( d_wheel_rwy_local_v[2] < 0. )
{
reaction_normal_force = spring_constant[i]*d_wheel_rwy_local_v[2]
- v_wheel_local_v[2]*spring_damping[i];
if (reaction_normal_force > 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();
}

View file

@ -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 \

View file

@ -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 <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
David Megginson <david@megginson.com>
----------------------------------------------------------------------
@ -96,7 +98,7 @@
#include <simgear/compiler.h>
#include <map>
#include <iostream>
#include STL_IOSTREAM
#include <math.h>
#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 <string,int> 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) ===========================================*/

View file

@ -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 <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
David Megginson <david@megginson.com>
----------------------------------------------------------------------
@ -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();

View file

@ -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"

View file

@ -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 <bsehgal@uiuc.edu>
Jeff Scott <jscott@mail.com>
Michael Selig <m-selig@uiuc.edu>
David Megginson <david@megginson.com>
----------------------------------------------------------------------
@ -98,7 +100,7 @@
#endif
#include <stdlib.h>
#include <iostream>
#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:
{

View file

@ -18,10 +18,12 @@
----------------------------------------------------------------------
HISTORY: 01/26/2000 initial release
03/09/2001 (DPM) added support for gear
----------------------------------------------------------------------
AUTHOR(S): Bipin Sehgal <bsehgal@uiuc.edu>
David Megginson <david@megginson.com>
----------------------------------------------------------------------
@ -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

View file

@ -2,3 +2,4 @@
void uiuc_init_aeromodel ();
void uiuc_force_moment(double dt);
void uiuc_engine_routine();
void uiuc_gear_routine();