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:
parent
11290e8022
commit
24820e6d5a
7 changed files with 100 additions and 154 deletions
|
@ -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 //
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue