1
0
Fork 0

Attempt to shore up the numerical stability of the AI aircraft movement

computations.  This is probably not needed, but use double's consistently.
This commit is contained in:
curt 2006-07-27 02:27:43 +00:00
parent 1c2a3cc5ac
commit 5fc834f7f5

View file

@ -169,7 +169,7 @@ void FGAIAircraft::SetPerformance(const PERF_STRUCT *ps) {
void FGAIAircraft::Run(double dt) { void FGAIAircraft::Run(double dt) {
FGAIAircraft::dt = dt; FGAIAircraft::dt = dt;
if (fp) { if (fp) {
time_t now = time(NULL) + fgGetLong("/sim/time/warp"); time_t now = time(NULL) + fgGetLong("/sim/time/warp");
ProcessFlightPlan(dt, now); ProcessFlightPlan(dt, now);
@ -233,27 +233,36 @@ void FGAIAircraft::Run(double dt) {
} else { } else {
speed_diff = groundTargetSpeed - speed; speed_diff = groundTargetSpeed - speed;
} }
if (fabs(speed_diff) > 0.2) { if (speed_diff > 0.0) {
if (speed_diff > 0.0) speed += performance->accel * dt;
speed += performance->accel * dt; if ( speed > tgt_speed ) speed = tgt_speed; // don't overshoot
if (speed_diff < 0.0) { } else if (speed_diff < 0.0) {
if (no_roll) { // was (!no_roll) but seems more logical this way (ground brakes). if (no_roll) {
speed -= performance->decel * dt * 3; // on ground (aircraft can't roll)
} else { speed -= performance->decel * dt * 3;
speed -= performance->decel * dt; } else {
} speed -= performance->decel * dt;
} }
if ( speed < tgt_speed ) speed = tgt_speed; // don't overshoot
} }
// convert speed to degrees per second // convert speed to degrees per second
speed_north_deg_sec = cos( hdg / SG_RADIANS_TO_DEGREES ) speed_north_deg_sec = cos( hdg * SGD_DEGREES_TO_RADIANS )
* speed * 1.686 / ft_per_deg_lat; * speed * 1.686 / ft_per_deg_lat;
speed_east_deg_sec = sin( hdg / SG_RADIANS_TO_DEGREES ) speed_east_deg_sec = sin( hdg * SGD_DEGREES_TO_RADIANS )
* speed * 1.686 / ft_per_deg_lon; * speed * 1.686 / ft_per_deg_lon;
// set new position // set new position
pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt); pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt);
pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt); pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt);
/* printf("%.7f %0.4f %.7f %.5f %.7f %.7f %.8f %.8f %.9f %.9f\n",
dt, hdg, speed, ft_per_deg_lat,
cos( hdg * SGD_DEGREES_TO_RADIANS ),
speed * 1.686 / ft_per_deg_lat,
speed_north_deg_sec, speed_east_deg_sec,
pos.getLatitudeDeg(), pos.getLongitudeDeg()); */
//if (!(finite(pos.lat()) && finite(pos.lon()))) //if (!(finite(pos.lat()) && finite(pos.lon())))
// { // {
// cerr << "Position is not finite" << endl; // cerr << "Position is not finite" << endl;