1
0
Fork 0

Move the radar update code to the AIBase class. There seems to be a problem where all targets disappear whenever one of them disappears, but that was present in the previous update also.

This commit is contained in:
ehofman 2004-06-11 13:49:07 +00:00
parent 11290e8022
commit 24820e6d5a
7 changed files with 100 additions and 154 deletions

View file

@ -97,9 +97,9 @@ void FGAIAircraft::unbind() {
void FGAIAircraft::update(double dt) { void FGAIAircraft::update(double dt) {
FGAIBase::update(dt);
Run(dt); Run(dt);
Transform(); Transform();
FGAIBase::update(dt);
} }
void FGAIAircraft::SetPerformance(const PERF_STRUCT *ps) { void FGAIAircraft::SetPerformance(const PERF_STRUCT *ps) {
@ -118,15 +118,9 @@ void FGAIAircraft::Run(double dt) {
double turn_circum_ft; double turn_circum_ft;
double speed_north_deg_sec; double speed_north_deg_sec;
double speed_east_deg_sec; double speed_east_deg_sec;
double ft_per_deg_lon;
double ft_per_deg_lat;
double dist_covered_ft; double dist_covered_ft;
double alpha; double alpha;
// get size of a degree at this latitude
ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.lat()/SG_RADIANS_TO_DEGREES);
ft_per_deg_lon = 365228.16 * cos(pos.lat() / SG_RADIANS_TO_DEGREES);
// adjust speed // adjust speed
double speed_diff = tgt_speed - speed; double speed_diff = tgt_speed - speed;
if (fabs(speed_diff) > 0.2) { if (fabs(speed_diff) > 0.2) {
@ -237,85 +231,7 @@ void FGAIAircraft::Run(double dt) {
//###########################// //###########################//
// do calculations for radar // // do calculations for radar //
//###########################// //###########################//
double radar_range_ft2 = fgGetDouble("/instrumentation/radar/range"); double range_ft2 = UpdateRadar(manager);
radar_range_ft2 *= SG_NM_TO_METER * SG_METER_TO_FEET;
radar_range_ft2 *= radar_range_ft2;
double user_latitude = manager->get_user_latitude();
double user_longitude = manager->get_user_longitude();
double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat;
double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon;
double range_ft2 = lat_range*lat_range + lon_range*lon_range;
//
// Test whether the target is within radar range.
//
in_range = (range_ft2 <= radar_range_ft2);
if ( in_range )
{
props->setBoolValue("radar/in-range", true);
// copy values from the AIManager
double user_altitude = manager->get_user_altitude();
double user_heading = manager->get_user_heading();
double user_pitch = manager->get_user_pitch();
double user_yaw = manager->get_user_yaw();
double user_speed = manager->get_user_speed();
// calculate range to target in feet and nautical miles
double range_ft = sqrt( range_ft2 );
range = range_ft / 6076.11549;
// calculate bearing to target
if (pos.lat() >= user_latitude) {
bearing = atan2(lat_range, lon_range) * SG_RADIANS_TO_DEGREES;
if (pos.lon() >= user_longitude) {
bearing = 90.0 - bearing;
} else {
bearing = 270.0 + bearing;
}
} else {
bearing = atan2(lon_range, lat_range) * SG_RADIANS_TO_DEGREES;
if (pos.lon() >= user_longitude) {
bearing = 180.0 - bearing;
} else {
bearing = 180.0 + bearing;
}
}
// calculate look left/right to target, without yaw correction
horiz_offset = bearing - user_heading;
if (horiz_offset > 180.0) horiz_offset -= 360.0;
if (horiz_offset < -180.0) horiz_offset += 360.0;
// calculate elevation to target
elevation = atan2( altitude_ft - user_altitude, range_ft )
* SG_RADIANS_TO_DEGREES;
// calculate look up/down to target
vert_offset = elevation + user_pitch;
/* this calculation needs to be fixed, but it isn't important anyway
// calculate range rate
double recip_bearing = bearing + 180.0;
if (recip_bearing > 360.0) recip_bearing -= 360.0;
double my_horiz_offset = recip_bearing - hdg;
if (my_horiz_offset > 180.0) my_horiz_offset -= 360.0;
if (my_horiz_offset < -180.0) my_horiz_offset += 360.0;
rdot = (-user_speed * cos( horiz_offset * SG_DEGREES_TO_RADIANS ))
+(-speed * 1.686 * cos( my_horiz_offset * SG_DEGREES_TO_RADIANS ));
*/
// now correct look left/right for yaw
horiz_offset += user_yaw;
// calculate values for radar display
y_shift = range * cos( horiz_offset * SG_DEGREES_TO_RADIANS);
x_shift = range * sin( horiz_offset * SG_DEGREES_TO_RADIANS);
rotation = hdg - user_heading;
if (rotation < 0.0) rotation += 360.0;
}
//************************************// //************************************//
// Tanker code // // Tanker code //

View file

@ -56,10 +56,9 @@ void FGAIBallistic::unbind() {
} }
void FGAIBallistic::update(double dt) { void FGAIBallistic::update(double dt) {
FGAIBase::update(dt);
Run(dt); Run(dt);
Transform(); Transform();
FGAIBase::update(dt);
} }

View file

@ -66,6 +66,8 @@ FGAIBase::~FGAIBase() {
} }
void FGAIBase::update(double dt) { void FGAIBase::update(double dt) {
ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.lat()/SG_RADIANS_TO_DEGREES);
ft_per_deg_lon = 365228.16 * cos(pos.lat() / SG_RADIANS_TO_DEGREES);
} }
@ -182,6 +184,91 @@ void FGAIBase::unbind() {
props->untie("controls/lighting/nav-lights"); props->untie("controls/lighting/nav-lights");
} }
double FGAIBase::UpdateRadar(FGAIManager* manager)
{
double radar_range_ft2 = fgGetDouble("/instrumentation/radar/range");
radar_range_ft2 *= SG_NM_TO_METER * SG_METER_TO_FEET * 1.1; // + 10%
radar_range_ft2 *= radar_range_ft2;
double user_latitude = manager->get_user_latitude();
double user_longitude = manager->get_user_longitude();
double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat;
double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon;
double range_ft2 = lat_range*lat_range + lon_range*lon_range;
//
// Test whether the target is within radar range.
//
in_range = (range_ft2 && (range_ft2 <= radar_range_ft2));
if ( in_range )
{
props->setBoolValue("radar/in-range", true);
// copy values from the AIManager
double user_altitude = manager->get_user_altitude();
double user_heading = manager->get_user_heading();
double user_pitch = manager->get_user_pitch();
double user_yaw = manager->get_user_yaw();
double user_speed = manager->get_user_speed();
// calculate range to target in feet and nautical miles
double range_ft = sqrt( range_ft2 );
range = range_ft / 6076.11549;
// calculate bearing to target
if (pos.lat() >= user_latitude) {
bearing = atan2(lat_range, lon_range) * SG_RADIANS_TO_DEGREES;
if (pos.lon() >= user_longitude) {
bearing = 90.0 - bearing;
} else {
bearing = 270.0 + bearing;
}
} else {
bearing = atan2(lon_range, lat_range) * SG_RADIANS_TO_DEGREES;
if (pos.lon() >= user_longitude) {
bearing = 180.0 - bearing;
} else {
bearing = 180.0 + bearing;
}
}
// calculate look left/right to target, without yaw correction
horiz_offset = bearing - user_heading;
if (horiz_offset > 180.0) horiz_offset -= 360.0;
if (horiz_offset < -180.0) horiz_offset += 360.0;
// calculate elevation to target
elevation = atan2( altitude * SG_METER_TO_FEET - user_altitude, range_ft )
* SG_RADIANS_TO_DEGREES;
// calculate look up/down to target
vert_offset = elevation + user_pitch;
/* this calculation needs to be fixed, but it isn't important anyway
// calculate range rate
double recip_bearing = bearing + 180.0;
if (recip_bearing > 360.0) recip_bearing -= 360.0;
double my_horiz_offset = recip_bearing - hdg;
if (my_horiz_offset > 180.0) my_horiz_offset -= 360.0;
if (my_horiz_offset < -180.0) my_horiz_offset += 360.0;
rdot = (-user_speed * cos( horiz_offset * SG_DEGREES_TO_RADIANS ))
+(-speed * 1.686 * cos( my_horiz_offset * SG_DEGREES_TO_RADIANS ));
*/
// now correct look left/right for yaw
horiz_offset += user_yaw;
// calculate values for radar display
y_shift = range * cos( horiz_offset * SG_DEGREES_TO_RADIANS);
x_shift = range * sin( horiz_offset * SG_DEGREES_TO_RADIANS);
rotation = hdg - user_heading;
if (rotation < 0.0) rotation += 360.0;
}
return range_ft2;
}
/* /*
* getters and Setters * getters and Setters

View file

@ -76,6 +76,9 @@ protected:
double altitude; // meters above sea level double altitude; // meters above sea level
double vs; // vertical speed, feet per minute double vs; // vertical speed, feet per minute
double ft_per_deg_lon;
double ft_per_deg_lat;
// these describe the model's desired state // these describe the model's desired state
double tgt_heading; // target heading, degrees true double tgt_heading; // target heading, degrees true
double tgt_altitude; // target altitude, *feet* above sea level double tgt_altitude; // target altitude, *feet* above sea level
@ -109,6 +112,8 @@ protected:
void Transform(); void Transform();
double UpdateRadar(FGAIManager* manager);
string _type_str; string _type_str;
object_type _otype; object_type _otype;
int index; int index;
@ -182,5 +187,5 @@ inline int FGAIBase::getID() { return id; }
inline FGAIBase::object_type FGAIBase::getType() { return _otype; } inline FGAIBase::object_type FGAIBase::getType() { return _otype; }
#endif // _FG_AIBASE_HXX #endif // _FG_AIBASE_HXX

View file

@ -57,9 +57,9 @@ void FGAIShip::unbind() {
void FGAIShip::update(double dt) { void FGAIShip::update(double dt) {
FGAIBase::update(dt);
Run(dt); Run(dt);
Transform(); Transform();
FGAIBase::update(dt);
} }

View file

@ -59,9 +59,9 @@ void FGAIStorm::unbind() {
void FGAIStorm::update(double dt) { void FGAIStorm::update(double dt) {
FGAIBase::update(dt);
Run(dt); Run(dt);
Transform(); Transform();
FGAIBase::update(dt);
} }
@ -71,12 +71,6 @@ void FGAIStorm::Run(double dt) {
double speed_north_deg_sec; double speed_north_deg_sec;
double speed_east_deg_sec; double speed_east_deg_sec;
double ft_per_deg_lon;
double ft_per_deg_lat;
// get size of a degree at this latitude
ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.lat()/SG_RADIANS_TO_DEGREES);
ft_per_deg_lon = 365228.16 * cos(pos.lat() / SG_RADIANS_TO_DEGREES);
// 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 / SG_RADIANS_TO_DEGREES )
@ -88,64 +82,9 @@ void FGAIStorm::Run(double dt) {
pos.setlat( pos.lat() + speed_north_deg_sec * dt); pos.setlat( pos.lat() + speed_north_deg_sec * dt);
pos.setlon( pos.lon() + speed_east_deg_sec * dt); pos.setlon( pos.lon() + speed_east_deg_sec * dt);
double altitude_ft = altitude * SG_METER_TO_FEET;
//###########################// //###########################//
// do calculations for radar // // do calculations for radar //
//###########################// //###########################//
UpdateRadar(manager);
// copy values from the AIManager
double user_latitude = manager->get_user_latitude();
double user_longitude = manager->get_user_longitude();
double user_altitude = manager->get_user_altitude();
double user_heading = manager->get_user_heading();
double user_pitch = manager->get_user_pitch();
double user_yaw = manager->get_user_yaw();
// double user_speed = manager->get_user_speed();
// calculate range to target in feet and nautical miles
double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat;
double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon;
double range_ft = sqrt( lat_range*lat_range + lon_range*lon_range );
range = range_ft / 6076.11549;
// calculate bearing to target
if (pos.lat() >= user_latitude) {
bearing = atan2(lat_range, lon_range) * SG_RADIANS_TO_DEGREES;
if (pos.lon() >= user_longitude) {
bearing = 90.0 - bearing;
} else {
bearing = 270.0 + bearing;
}
} else {
bearing = atan2(lon_range, lat_range) * SG_RADIANS_TO_DEGREES;
if (pos.lon() >= user_longitude) {
bearing = 180.0 - bearing;
} else {
bearing = 180.0 + bearing;
}
}
// calculate look left/right to target, without yaw correction
horiz_offset = bearing - user_heading;
if (horiz_offset > 180.0) horiz_offset -= 360.0;
if (horiz_offset < -180.0) horiz_offset += 360.0;
// calculate elevation to target
elevation = atan2( altitude_ft - user_altitude, range_ft )
* SG_RADIANS_TO_DEGREES;
// calculate look up/down to target
vert_offset = elevation + user_pitch;
// now correct look left/right for yaw
horiz_offset += user_yaw;
// calculate values for radar display
y_shift = range * cos( horiz_offset * SG_DEGREES_TO_RADIANS);
x_shift = range * sin( horiz_offset * SG_DEGREES_TO_RADIANS);
rotation = hdg - user_heading;
if (rotation < 0.0) rotation += 360.0;
} }

View file

@ -63,9 +63,9 @@ void FGAIThermal::unbind() {
void FGAIThermal::update(double dt) { void FGAIThermal::update(double dt) {
FGAIBase::update(dt);
Run(dt); Run(dt);
Transform(); Transform();
FGAIBase::update(dt);
} }