]> git.mxchange.org Git - flightgear.git/commitdiff
From: David Megginson <david@megginson.com>
authorcurt <curt>
Thu, 29 Mar 2001 03:16:25 +0000 (03:16 +0000)
committercurt <curt>
Thu, 29 Mar 2001 03:16:25 +0000 (03:16 +0000)
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.

src/FDM/LaRCsim/uiuc_aero.c
src/FDM/UIUCModel/Makefile.am
src/FDM/UIUCModel/uiuc_aircraft.h
src/FDM/UIUCModel/uiuc_initializemaps.cpp
src/FDM/UIUCModel/uiuc_initializemaps.h
src/FDM/UIUCModel/uiuc_menu.cpp
src/FDM/UIUCModel/uiuc_wrapper.cpp
src/FDM/UIUCModel/uiuc_wrapper.h

index 2aec73867fac70a85fe7d3ddd66dcd34920d9beb..24fa87480f1a5f1a4a519b14483487879ebc934d 100644 (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[] )
-{
-    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<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();
 }
index c545856cccc31138729e75fb3a35489ed878997a..8d5b1709b947a8906ee564551bc3896d47a563b3 100644 (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 \
index d6895db9f5bec94a9dbdd43f9b1b38742ca3f65d..65ff390ba4de45f27fb820e3ebc28d0f615c382e 100644 (file)
                            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) ===========================================*/
index 775d8c65893c51b9256374aa2585067ea2cc5766..8e58d78d249d74a7dc03215b2471eb2f7cd63641 100644 (file)
  
  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();
index f6943c2e3d522983ecda8d4ba85773a28f5abef0..86dfec1594fb3276d07d273a4087e94194af4b99 100644 (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"
index 0989208803d5b7e892a861882eaf770f895dbc7c..1aa2489db22a93d70849344194697c1c0ca2c176 100644 (file)
                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>
 
 ----------------------------------------------------------------------
 
 #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:
           {
index 9648e35dfcbcbd925515b35deaadb0f6b1309bbe..4ad4d1c377f15baa1665f19d02bfbc924557b603 100644 (file)
 ----------------------------------------------------------------------
 
  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
index ca59a2acb557451e4b23541a771d105ad25bd1f4..1a4896829cc1bd17f62bf35ad3af8b8372cdceaf 100644 (file)
@@ -2,3 +2,4 @@
 void uiuc_init_aeromodel ();
 void uiuc_force_moment(double dt);
 void uiuc_engine_routine();
+void uiuc_gear_routine();