174 lines
5.5 KiB
Plaintext
174 lines
5.5 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 formation
|
||
|
|
|
||
|
|
script_debug_writes off
|
||
|
|
|
||
|
|
script_variables
|
||
|
|
|
||
|
|
//**********************************************************************//
|
||
|
|
//** debugging parameters **//
|
||
|
|
//**********************************************************************//
|
||
|
|
bool mDrawFormationData = false;
|
||
|
|
|
||
|
|
//**********************************************************************//
|
||
|
|
//** formation flying parameters, for offset and tightness **//
|
||
|
|
//**********************************************************************//
|
||
|
|
Array<string> mLeadNames = Array<string>();
|
||
|
|
double mFormationPositionX = -500; #meters in front of of package
|
||
|
|
double mFormationPositionY = 3000; #meters off right wing of package
|
||
|
|
double mGoodFormationRatio = 0.15; #percentage of total offset
|
||
|
|
double mFormationLookAhead = 30.0; #seconds
|
||
|
|
double mFormationAltitude = -1.0; #used if positive
|
||
|
|
|
||
|
|
//**********************************************************************//
|
||
|
|
//********* VARIABLES BELOW THIS LINE ARE NOT FOR USER EDITING *********//
|
||
|
|
//**********************************************************************//
|
||
|
|
WsfDraw mDraw = WsfDraw();
|
||
|
|
bool mLastInPosition = false; #boolean flag, utility, don't change
|
||
|
|
|
||
|
|
end_script_variables
|
||
|
|
|
||
|
|
|
||
|
|
### find escorted platform, return it
|
||
|
|
script WsfPlatform GetFormationLead()
|
||
|
|
WsfPlatform leadPlatform;
|
||
|
|
foreach ( string sLeadName in mLeadNames )
|
||
|
|
{
|
||
|
|
leadPlatform = WsfSimulation.FindPlatform(sLeadName);
|
||
|
|
if (leadPlatform.IsValid() )
|
||
|
|
{
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return leadPlatform;
|
||
|
|
end_script
|
||
|
|
|
||
|
|
|
||
|
|
precondition
|
||
|
|
writeln_d("precondition formation");
|
||
|
|
|
||
|
|
WsfPlatform leadPlatform = GetFormationLead();
|
||
|
|
if (!leadPlatform.IsValid() )
|
||
|
|
{
|
||
|
|
return Failure("no listed lead for formation found!");
|
||
|
|
}
|
||
|
|
|
||
|
|
writeln_d("--- agent ", PLATFORM.Name(), " is in formation with ", leadPlatform.Name());
|
||
|
|
return true;
|
||
|
|
end_precondition
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
script bool AmInFormationPosition(WsfGeoPoint formationPoint, double radius)
|
||
|
|
//make it fly to the inner 50% of the acceptable radius on re-entry
|
||
|
|
if (!mLastInPosition)
|
||
|
|
{
|
||
|
|
radius = 0.5 * radius;
|
||
|
|
}
|
||
|
|
mLastInPosition = false;
|
||
|
|
double range = PLATFORM.GroundRangeTo(formationPoint);
|
||
|
|
if (range <= radius)
|
||
|
|
{
|
||
|
|
mLastInPosition = true;
|
||
|
|
}
|
||
|
|
return mLastInPosition;
|
||
|
|
end_script
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
execute
|
||
|
|
writeln_d("executing formation.");
|
||
|
|
|
||
|
|
//make sure escorted platform exists, find it, save it
|
||
|
|
WsfPlatform leadPlatform = GetFormationLead();
|
||
|
|
if (!leadPlatform.IsValid() )
|
||
|
|
{
|
||
|
|
writeln_d("--- fighter ", PLATFORM.Name(), " no valid platform to escort!");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
//check if I am approximately in my formation position
|
||
|
|
WsfGeoPoint formationPoint = leadPlatform.Location();
|
||
|
|
|
||
|
|
if (mFormationAltitude > 0)
|
||
|
|
{
|
||
|
|
formationPoint.Set(formationPoint.Latitude(), formationPoint.Longitude(), mFormationAltitude);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (mFormationPositionX > 0)
|
||
|
|
{
|
||
|
|
formationPoint.Extrapolate(leadPlatform.Heading(), mFormationPositionX);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
formationPoint.Extrapolate(leadPlatform.Heading()+180, -mFormationPositionX);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (mFormationPositionY > 0)
|
||
|
|
{
|
||
|
|
formationPoint.Extrapolate(leadPlatform.Heading()+90.0, mFormationPositionY);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
formationPoint.Extrapolate(leadPlatform.Heading()-90.0, -mFormationPositionY);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!formationPoint.IsValid())
|
||
|
|
{
|
||
|
|
writeln_d("--- fighter ", PLATFORM.Name(), " invalid formation point from ", leadPlatform.Name());
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (mDrawFormationData == true)
|
||
|
|
{
|
||
|
|
mDraw.SetLayer("behavior_formation");
|
||
|
|
mDraw.SetDuration(PROCESSOR.UpdateInterval());
|
||
|
|
|
||
|
|
// draw line to desired formation position
|
||
|
|
mDraw.SetColor(0, 1, 0); //green
|
||
|
|
mDraw.SetLineSize(4);
|
||
|
|
mDraw.BeginLines();
|
||
|
|
mDraw.Vertex(leadPlatform.Location());
|
||
|
|
mDraw.Vertex(formationPoint);
|
||
|
|
mDraw.End();
|
||
|
|
}
|
||
|
|
|
||
|
|
double radius = mGoodFormationRatio * leadPlatform.SlantRangeTo(formationPoint);
|
||
|
|
|
||
|
|
double formAlt = leadPlatform.Altitude();
|
||
|
|
double formSpeed = leadPlatform.Speed();
|
||
|
|
double formYaw = leadPlatform.Heading();
|
||
|
|
if (formAlt < PLATFORM.Altitude())
|
||
|
|
{
|
||
|
|
formAlt = PLATFORM.Altitude();
|
||
|
|
}
|
||
|
|
WsfGeoPoint tgt = WsfGeoPoint.Construct(formationPoint.Latitude(), formationPoint.Longitude(), formAlt);
|
||
|
|
double lookAheadDistance = mFormationLookAhead * leadPlatform.Speed();
|
||
|
|
tgt.Extrapolate(formYaw, lookAheadDistance);
|
||
|
|
|
||
|
|
if (! AmInFormationPosition(formationPoint, radius))
|
||
|
|
{
|
||
|
|
//fly towards formation position, extrapolated ahead X seconds, in order to catch up to the point in X seconds
|
||
|
|
formSpeed = PLATFORM.GroundRangeTo(tgt) / mFormationLookAhead;
|
||
|
|
}
|
||
|
|
|
||
|
|
#extern bool FlyTarget (WsfPlatform, WsfGeoPoint, double);
|
||
|
|
FlyTarget (PLATFORM, tgt, formSpeed);
|
||
|
|
|
||
|
|
end_execute
|
||
|
|
|
||
|
|
end_behavior
|
||
|
|
|