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:
parent
1c2a3cc5ac
commit
5fc834f7f5
1 changed files with 21 additions and 12 deletions
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue