1
0
Fork 0

Fix crab angle and ground speed calculation in AILocalTraffic

This commit is contained in:
Csaba Halasz 2009-12-28 18:29:10 +01:00 committed by Tim Moore
parent 8d4a838cd5
commit 1d8be86335

View file

@ -1127,27 +1127,24 @@ void FGAILocalTraffic::FlyTrafficPattern(double dt) {
}
if(inAir) {
// FIXME - at the moment this is a bit screwy
// The velocity correction is applied based on the relative headings.
// Then the heading is changed based on the velocity.
// Which comes first, the chicken or the egg?
// Does it really matter?
// Apply wind to ground-relative velocity if in the air
vel = IAS - (cos((_hdg - wind_from) * DCL_DEGREES_TO_RADIANS) * wind_speed);
//crab = f(track, wind, vel);
// The vector we need to fly is our desired vector minus the wind vector
// TODO - we probably ought to use plib's built in vector types and operations for this
// ie. There's almost *certainly* a better way to do this!
double gxx = vel * sin(track * DCL_DEGREES_TO_RADIANS); // Plane desired velocity x component wrt ground
double gyy = vel * cos(track * DCL_DEGREES_TO_RADIANS); // Plane desired velocity y component wrt ground
double wxx = wind_speed * sin((wind_from + 180.0) * DCL_DEGREES_TO_RADIANS); // Wind velocity x component
double wyy = wind_speed * cos((wind_from + 180.0) * DCL_DEGREES_TO_RADIANS); // Wind velocity y component
double axx = gxx - wxx; // Plane in-air velocity x component
double ayy = gyy - wyy; // Plane in-air velocity y component
// Now we want the angle between gxx and axx (which is the crab)
crab = atan2(ayy - gyy, axx - gxx) * DCL_RADIANS_TO_DEGREES;
//cout << "crab = " << crab << '\n';
// calculate ground speed and crab from the wind triangle
double wind_angle = GetAngleDiff_deg(wind_from + 180, track);
double wind_side = (wind_angle < 0) ? -1.0 : 1.0;
double sine_of_crab = wind_speed / IAS * sin(fabs(wind_angle) * DCL_DEGREES_TO_RADIANS);
if (sine_of_crab >= 1.0) {
// The crosswind component is greater than the IAS,
// we can't keep the aircraft on track.
// Assume increased IAS such that it cancels lateral speed.
// This is unrealistic, but not sure how the rest of the sim
// would react to the aircraft going off course.
// Should be a rare case anyway.
crab = wind_side * 90.0;
} else {
crab = asin(sine_of_crab) * DCL_RADIANS_TO_DEGREES * wind_side;
}
vel = cos(wind_angle * DCL_DEGREES_TO_RADIANS) * wind_speed
+ cos(crab * DCL_DEGREES_TO_RADIANS) * IAS;
} else { // on the ground - crab dosen't apply
crab = 0.0;
}