1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
#include <math.h>
#include <stdio.h>
#include <Vlib.h>
#undef printf
/*
* ---------------- z = 0 in body coordinates
* ^
* | r{m,n}.z (constant)
* v
* o gear attachment point
* ^
* | c{m,n}.z strut extension (0 - c{m,n}Max)
* v
* ^
* | G{m,n} strut + tire length (constant)
* v
* ---------------- ground
*
*/
struct balance_data {
double weight; /* weight for this test */
VPoint rm; /* rest main gear ground contact point (input),
rest main gear attachment point (output) */
VPoint rn; /* rest nose gear ground contact point (input),
rest nose gear attachment point (output) */
double cm, cn; /* rest extension values of each strut */
double cmMax, cnMax; /* maximum extension values of each strut */
double Gm, Gn; /* strut + tire lengths */
double Km, Kn; /* string constants (output) */
double Gpz; /* the old "grounding point" Z value */
};
void
balance (s)
struct balance_data *s;
{
double theta, cosTheta, sinTheta;
double Fmz, Fnz;
/*
* Determine the rest pitch angle of the aircraft body
*/
theta = - atan2 (s->rn.z - s->rm.z, s->rn.x - s->rm.x);
cosTheta = cos(theta);
sinTheta = sin(theta);
printf ("Theta = %f degrees (positive down)\n", theta * 180.0 / M_PI);
/*
* Determine correct rm/rn values
*/
s->rn.z = s->rn.z - s->Gn - s->cn;
s->rm.z = s->rm.z - s->Gm - s->cm;
/*
* Determine spring constants
*/
Fmz = (s->weight * s->rn.x) / (s->rn.x - s->rm.x);
Fnz = s->weight - Fmz;
s->Km = Fmz / (s->cmMax - s->cm);
s->Kn = Fnz / (s->cnMax - s->cn);
/*
* Determine the initial grounding point
*/
s->Gpz = s->rm.x * sinTheta + (s->rm.z + s->Gm + s->cm) * cosTheta;
}
main()
{
struct balance_data s;
/*
* Wheel contact locations for the aircraft fully loaded at rest.
*/
VSetPoint (s.rn, 4.1165, 0.0, 2.029);
VSetPoint (s.rm, -0.3489, 4.0118, 2.0299);
/*
* Gross weight
*/
s.weight = 1450 + 300;
/*
* Maximum oleo extension lengths
*/
s.cnMax = 0.5;
s.cmMax = 0.5;
/*
* The length of the wheel and lower landing gear strut
*/
s.Gm = 1.0;
s.Gn = 1.0;
/*
* Rest oleo extension; must be less than cnMax or cmMax; usually about
* half the max value.
*/
s.cm = 0.20;
s.cn = 0.25;
printf ("Input:\n");
printf ("nose contact = %lf %lf %lf\n", s.rn.x, s.rn.y, s.rn.z);
printf ("main's contact = %lf %lf %lf\n", s.rm.x, s.rm.y, s.rm.z);
printf ("Weight = %lf\n", s.weight);
balance(&s);
printf ("\nOutput:\n");
printf ("rm = %lf, %lf, %lf\n", s.rm.x, s.rm.y, s.rm.z);
printf ("rn = %lf, %lf, %lf\n", s.rn.x, s.rn.y, s.rn.z);
printf ("Km = %lf\n", s.Km);
printf ("Kn = %lf\n", s.Kn);
printf ("Grounding point (z) = %lf\n", s.Gpz);
printf ("\n\"inventory\" form:\n\n");
printf ("\tRm\t\t{%lg, %lg, %lg}\n", s.rm.x, s.rm.y, s.rm.z);
printf ("\tRn\t\t{%lg, %lg, %lg}\n", s.rn.x, s.rn.y, s.rn.z);
printf ("\tKm\t\t%lg\n", s.Km);
printf ("\tKn\t\t%lg\n", s.Kn);
printf ("\tGm\t\t%lg\n", s.Gm);
printf ("\tGn\t\t%lg\n", s.Gn);
printf ("\tCmMax\t\t%lg\n", s.cmMax);
printf ("\tCnMax\t\t%lg\n", s.cnMax);
printf ("\tGroundingPoint\t{0.0, 0.0, %lg}\n", s.Gpz);
exit (0);
}
|