init
This commit is contained in:
122
processors/ripr_agents/aiai/behavior_snap_shot.txt
Normal file
122
processors/ripr_agents/aiai/behavior_snap_shot.txt
Normal file
@@ -0,0 +1,122 @@
|
||||
# ****************************************************************************
|
||||
# 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 snap_shot
|
||||
|
||||
script_variables
|
||||
double cDIVE_ALTITUDE = 304.8; # 1000 feet
|
||||
double cDEFAULT_SPEED = 200.0; # m/s
|
||||
double cMIN_SPEED = 0.0; # m/s
|
||||
double cGRAVITY_ACCEL = 9.80665; # 1 G
|
||||
double cDEFAULT_ACCEL = (cGRAVITY_ACCEL * 7.5); # m/s^2 ~7.5 Gs
|
||||
double cMAX_RADIAL_ACCEL = 100 * cGRAVITY_ACCEL; //larger than possible, make the aircraft limit the turn
|
||||
end_script_variables
|
||||
|
||||
|
||||
precondition
|
||||
writeln("precondition snap_shot");
|
||||
|
||||
//this behavior applies when a snap shot is required and won't be suicide
|
||||
WsfTrack targetTrack = PROCESSOR.GetTarget();
|
||||
WsfMover mover = PLATFORM.Mover();
|
||||
|
||||
if (targetTrack.IsNull() || !targetTrack.IsValid() || mover.IsNull() || !mover.IsValid())
|
||||
{
|
||||
writeln("target or mover not valid for executing snap_shot");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
//distance versus turn radius
|
||||
#double turnRadius = mover.TurnRadius();
|
||||
#double range = PLATFORM.SlantRangeTo(targetTrack);
|
||||
#writeln("turn radius = ", turnRadius, ", my range = ", range);
|
||||
#double maxVelocityAllowed = mover.CornerVelocity(targetTrack.CurrentLocation());
|
||||
#double mySpeed = PLATFORM.Speed();
|
||||
#writeln("max corner speed = ", maxVelocityAllowed, ", my speed = ", mySpeed);
|
||||
|
||||
//check if I've already fired at the target
|
||||
if (PROCESSOR.WeaponsActive(targetTrack) > 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//check the relative angles and speeds between agent and the target
|
||||
double relMe = MATH.Fabs( PLATFORM.RelativeBearingTo(targetTrack) );
|
||||
double relHim = MATH.Fabs( targetTrack.RelativeBearingTo(PLATFORM) );
|
||||
//lets try multiplying relative angles by speed
|
||||
//lower relative angle and lower speed is better for snap shotting
|
||||
if ((relMe * PLATFORM.Speed()) > (relHim*targetTrack.Speed()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//check if I'm already pointed at the target
|
||||
if (relMe < 5.0) //within five degrees
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//check if any threats are within visual range ~20 nm
|
||||
//check for side
|
||||
#extern double mVisualRange;
|
||||
int totalThreatsWVR = 0;
|
||||
foreach (WsfLocalTrack t in PLATFORM.MasterTrackList())
|
||||
{
|
||||
if (!t.SideValid() || t.Side() != PLATFORM.Side())
|
||||
{
|
||||
if (PLATFORM.SlantRangeTo(t) < mVisualRange)
|
||||
{
|
||||
totalThreatsWVR = totalThreatsWVR + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (totalThreatsWVR > 1) //don't slow down if other threats are nearby
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
//check if a snapshot would help me actually fire at my target (create a fake track that has relative bearing = 0)
|
||||
WsfTrack projectedTarget = WsfTrack();
|
||||
projectedTarget.SetBearing(0);
|
||||
projectedTarget.SetRange(PLATFORM.SlantRangeTo(targetTrack));
|
||||
projectedTarget.SetElevation(PLATFORM.RelativeElevationOf(targetTrack.CurrentLocation()));
|
||||
projectedTarget.SetAirDomain();
|
||||
Vec3 v = targetTrack.VelocityWCS();
|
||||
projectedTarget.SetVelocityWCS(v.X(), v.Y(), v.Z());
|
||||
#extern string GetWeaponForThreat(WsfPlatform, WsfTrack);
|
||||
string wStr = GetWeaponForThreat(PLATFORM, projectedTarget); #checks domain & kinematic capability, & valid quantity remaining
|
||||
if (wStr == "")
|
||||
{
|
||||
writeln("checking snap_shot, projected target could NOT be fired upon");
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
||||
return true;
|
||||
}
|
||||
end_precondition
|
||||
|
||||
|
||||
execute
|
||||
writeln("executing snap_shot.");
|
||||
PLATFORM.Comment("snap_shot");
|
||||
|
||||
WsfTrack targetTrack = PROCESSOR.GetTarget();
|
||||
|
||||
#extern bool FlyTarget( WsfPlatform, WsfGeoPoint, double);
|
||||
FlyTarget( PLATFORM, targetTrack.CurrentLocation(), cMIN_SPEED);
|
||||
|
||||
end_execute
|
||||
|
||||
end_behavior
|
||||
Reference in New Issue
Block a user