113 lines
4.1 KiB
Plaintext
113 lines
4.1 KiB
Plaintext
# ****************************************************************************
|
|
# CUI
|
|
#
|
|
# The Advanced Framework for Simulation, Integration, and Modeling (AFSIM)
|
|
#
|
|
# The use, dissemination or disclosure of data in this file is subject to
|
|
# limitation or restriction. See accompanying README and LICENSE for details.
|
|
# ****************************************************************************
|
|
|
|
|
|
behavior pursue_speed
|
|
|
|
script_debug_writes off
|
|
|
|
script_variables
|
|
|
|
WsfTrack mTargetTrack;
|
|
|
|
// these values suggested for air to air fighters & jets
|
|
double mMatchSpeedDistanceMin = 1 * 1852; # 1 mile
|
|
double mMatchSpeedDistanceMax = 20 * 1852; # 20 miles
|
|
double mWaitSpeed = 293.941; //mach 0.95 at 25200 ft altitude
|
|
double mInterceptSpeed = 600 * MATH.MPS_PER_NMPH();
|
|
|
|
#double mWaitSpeed = 500 * MATH.MPS_PER_NMPH();
|
|
#double mInterceptSpeed = 800 * MATH.MPS_PER_NMPH();
|
|
#double mInterceptSpeed = 293.941; //mach 0.95 at 25200 ft altitude
|
|
|
|
end_script_variables
|
|
|
|
precondition
|
|
writeln_d(PLATFORM.Name(), " precondition pursue_speed, T=", TIME_NOW);
|
|
if (!PROCESSOR.IsA_TypeOf("WSF_RIPR_PROCESSOR"))
|
|
{
|
|
return Failure("behavior not attached to a RIPR processor!");
|
|
} // ((WsfRIPRProcessor)PROCESSOR)
|
|
//get target from ripr processor, to be sure
|
|
mTargetTrack = ((WsfRIPRProcessor)PROCESSOR).GetTarget();
|
|
if (mTargetTrack.IsNull() || !mTargetTrack.IsValid())
|
|
{
|
|
writeln_d(" No valid target track found to pursue!");
|
|
return Failure("target track not found");
|
|
}
|
|
return true;
|
|
end_precondition
|
|
|
|
|
|
execute
|
|
string comment = write_str(PLATFORM.Name(), " executing pursue_speed, T=", TIME_NOW);
|
|
writeln_d(comment);
|
|
#PLATFORM.Comment(comment);
|
|
|
|
extern double mDesiredSpeed;
|
|
|
|
mDesiredSpeed = mInterceptSpeed;
|
|
if (mTargetTrack.VelocityValid())
|
|
{
|
|
if (mTargetTrack.AirDomain())
|
|
{
|
|
#extern double EffectiveRange(WsfPlatform, WsfTrack);
|
|
|
|
double speedOfTarget = mTargetTrack.Speed();
|
|
double effRange = EffectiveRange(PLATFORM, mTargetTrack);
|
|
double distanceWindow = mMatchSpeedDistanceMax - mMatchSpeedDistanceMin;
|
|
double speedWindow = mInterceptSpeed - speedOfTarget;
|
|
|
|
if(effRange < mMatchSpeedDistanceMax && effRange > mMatchSpeedDistanceMin)
|
|
{
|
|
double rangeScale = (effRange - mMatchSpeedDistanceMin) / distanceWindow;
|
|
mDesiredSpeed = speedOfTarget + (speedWindow * rangeScale);
|
|
writeln_d(PLATFORM.Name(), " pursue-target, speed scaled down in matching window!");
|
|
}
|
|
else if (effRange <= mMatchSpeedDistanceMin)
|
|
{
|
|
mDesiredSpeed = speedOfTarget * 0.99;
|
|
writeln_d(PLATFORM.Name(), " pursue-target, speed set to match target!");
|
|
}
|
|
|
|
if (mDesiredSpeed < mWaitSpeed)
|
|
{
|
|
mDesiredSpeed = mWaitSpeed;
|
|
writeln_d(PLATFORM.Name(), " pursue-target, speed was lower than wait speed, adjust!");
|
|
}
|
|
}
|
|
else if (mTargetTrack.LandDomain())
|
|
{
|
|
writeln_d(PLATFORM.Name(), " pursue-target, target is land domain, adjust speed!");
|
|
double speedOfTarget = mTargetTrack.Speed();
|
|
double range = PLATFORM.GroundRangeTo(mTargetTrack);
|
|
double distanceWindow = mMatchSpeedDistanceMax - mMatchSpeedDistanceMin;
|
|
double speedWindow = mInterceptSpeed - speedOfTarget;
|
|
|
|
if(range < mMatchSpeedDistanceMax && range > mMatchSpeedDistanceMin)
|
|
{
|
|
double rangeScale = (range - mMatchSpeedDistanceMin) / distanceWindow;
|
|
mDesiredSpeed = speedOfTarget + (speedWindow * rangeScale);
|
|
}
|
|
else if (range <= mMatchSpeedDistanceMin)
|
|
{
|
|
mDesiredSpeed = speedOfTarget * 0.99;
|
|
}
|
|
|
|
if (mDesiredSpeed < mWaitSpeed)
|
|
{
|
|
mDesiredSpeed = mWaitSpeed;
|
|
}
|
|
}
|
|
}
|
|
|
|
end_execute
|
|
|
|
end_behavior
|