Files
lab1/processors/quantum_agents/aiai/behavior_pursue_speed.txt

113 lines
4.1 KiB
Plaintext
Raw Normal View History

2025-09-12 15:20:28 +08:00
# ****************************************************************************
# 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