Files
lab1/platforms/brawler/alternatives/behavior_alt3441_tail_attack.txt

332 lines
12 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.
# ****************************************************************************
// converted BRAWLER v7.5 alt34.f -> alt344.f
// Replicates the 3,4,4,1 alternative behavior
// alt3441_tail_attack
include_once BrawlerScriptUtil.txt
behavior alt3441_tail_attack
script_debug_writes off
script_variables
WsfQuantumTaskerProcessor processor;
WsfPerceptionProcessor perception;
WsfBrawlerPlatform brawlerPlatform;
WsfLocalTrack targetTrack;
//**********************************************************************//
//** debugging parameters **//
//**********************************************************************//
bool mDrawSteering = false;
//**********************************************************************//
//** alternative parameters **//
//**********************************************************************//
// Flag used to enable/disable this alternative
bool mAlternative3441Enabled = true;
// Alternative ID
int ilevel = 3;
int kalt = 4;
int icall = 4;
int lcall = 1;
Vec3 a0; # maneuver plane
Vec3 dir0; # direction vector
double gmx; # max Gs
double spd0; # speed or throttle setting (depending on spdmod)
int spdmod;
//**********************************************************************//
//********* VARIABLES BELOW THIS LINE ARE NOT FOR USER EDITING *********//
//**********************************************************************//
WsfDraw mDraw = WsfDraw();
double mLastTime = 0.0;
double grav = 32.17405;
end_script_variables
on_init
if (PROCESSOR.IsA_TypeOf("WSF_QUANTUM_TASKER_PROCESSOR"))
{
processor = (WsfQuantumTaskerProcessor)PROCESSOR;
}
perception = (WsfPerceptionProcessor)PLATFORM.Processor("perception");
brawlerPlatform = (WsfBrawlerPlatform)PLATFORM;
end_on_init
#when talatk() is done:
# dir0 is normalized
# spd0 is in units of ft/sec (or set to 3.0 for throttle mode)
script void talatk()
writeln_d("alt3441 tail attack: talatk");
# # local declarations
# integer jacid
# real t,pres,dens,vs,pr,dr,xcarot(3),vcarot(3)
# real xprj(3),vprj(3),rhprj(3,3),dlag,dlagn,dlagun,vtemp(3)
# real dxtail(3),aprj(3),ause(3),dt,spdwtd,x_tgt(3)
# data dlagn/5000./,dlagun/1000./
# # ENDDEC
# # SET TARGET POSITION BEHIND TARGET A/C A DISTANCE DLAG
# jacid = iacidt(iac)
# dlag=dlagn
# if(.not.noaim) dlag= (ppmrmn+ppmrmx)/2.
# if(mslpp.eq.nummis+1) dlag= dlagun
# # GET POSITION OF AC 5 SECONDS IN FUTURE:
# dt = 5.
# #if (xp(3,iac).ge.trkr_neg_alt) call nabort('talatk...tgt more than /par/trkr_neg_alt feet below ground')
# call xmit3(xp(1,iac),x_tgt)
# if (x_tgt(3).ge.0.) x_tgt(3) = -1.0
# call atmos(-x_tgt(3),t,pres,dens,vs,pr,dr)
# call a_lim(x_tgt,vp(1,iac),ap(1,iac),dt,casmin(iac)/sqrt(dr),ause)
# call projw(x_tgt,vp(1,iac),ause,dt,xprj,vprj,aprj,rhprj)
# call vmake(-dlag,vprj,vtemp)
# call vsum(x_tgt,vtemp,dxtail)
# call vsub(dxtail,xp(1,me),dxtail)
# call vecinc(vp(1,iac),0.5/tproj3,dxtail,dir0)
# spd0 = xmag(dir0)
# spdmod = desspd
# spdwtd = spdnow(me)+almax*tproj3*1.1
# if (spd0 .gt. spdwtd)
# {
# spd0 = 3.
# spdmod = thrttl
# }
# call vnorm(dir0,dir0)
double dlagn = 5000.0;
double dlagun = 1000.0;
double dlag = dlagn;
## check if we have a weapon task - it shouldn't reach this point if we didn't
#if(.not.noaim) dlag= (ppmrmn+ppmrmx)/2.
## check if we have a weapon, otherwise close at gun range
#if(mslpp.eq.nummis+1) dlag= dlagun
if (!HaveWeapon(PLATFORM))
{
dlag = dlagun;
}
# GET POSITION OF AC 5 SECONDS IN FUTURE:
double dt = 5.0;
#if (xp(3,iac).ge.trkr_neg_alt) call nabort('talatk...tgt more than /par/trkr_neg_alt feet below ground')
# call xmit3(xp(1,iac),x_tgt)
# ##LBM - dont do projection for now
# if (x_tgt(3).ge.0.) x_tgt(3) = -1.0
# call atmos(-x_tgt(3),t,pres,dens,vs,pr,dr)
# call a_lim(x_tgt,vp(1,iac),ap(1,iac),dt,casmin(iac)/sqrt(dr),ause)
# call projw(x_tgt,vp(1,iac),ause,dt,xprj,vprj,aprj,rhprj)
//LBM - not able to perceive target's acceleration
//assume target's velocity after dt is same as now
//LBM - convert everything to feet when calculating against BRAWLER constants
// convert back to meters to call WSF commands
Vec3 vprj = targetTrack.VelocityNED();
Vec3 vtemp = vprj.Normal();
vtemp.Scale(-dlag);
# Vec3 x_tgt; //target position
# Vec3 xp; //my position
# Vec3 dxtail = Vec3.Add(x_tgt,vtemp); #adding vtemp is not accounted for in the line below
# dxtail = Vec3.Subtract(dxtail,xp);
Vec3 dx = RelativePositionNED(PLATFORM.Location(), targetTrack.CurrentLocation());
dx.Scale(MATH.FT_PER_M());
Vec3 dxtail = Vec3.Add(dx,vtemp);
Vec3 vpt = targetTrack.VelocityNED();
vpt.Scale(MATH.FT_PER_M());
dxtail.Scale(0.5/brawlerPlatform.ProjectedTimeDelta());
dir0 = Vec3.Add(vpt,dxtail);
spd0 = dir0.Magnitude(); #ft/sec
spdmod = 1; //(desspd = 1, thrttl = 2, desacc = 3)
#double almax = brawlerPlatform.MaxForwardAccelWithGravity() * MATH.M_PER_FT();
double almax = brawlerPlatform.MaxForwardAccelWithGravity(); #ft/sec^2
double spdwtd = PLATFORM.Speed()*MATH.FT_PER_M() + almax * brawlerPlatform.ProjectedTimeDelta() * 1.1;
if (spd0 > spdwtd)
{
spd0 = 3.0;
spdmod = 2; //(desspd = 1, thrttl = 2, desacc = 3)
}
dir0.Normalize();
end_script
precondition
#writeln_d(PLATFORM.Name(), " precondition alt3441 tail_attack, T=", TIME_NOW);
### Evaluate conditions that would prevent behavior alternative from running
if (!PROCESSOR.IsA_TypeOf("WSF_QUANTUM_TASKER_PROCESSOR"))
{
writeln_d("not a quantum tasker!");
return Failure("behavior not attached to a WSF_QUANTUM_TASKER_PROCESSOR");
}
if (!mAlternative3441Enabled)
{
writeln_d("behavior not enabled!");
return Failure("behavior alternative not enabled");
}
WsfTaskList tasks = processor.TasksReceivedOfType("WEAPON");
if(tasks.Count() <= 0)
{
writeln_d("no weapon (target) tasks!");
return Failure("no weapon (target) tasks!");
}
WsfTask targetTask = tasks.Entry(0);
targetTrack = PLATFORM.MasterTrackList().Find(targetTask.LocalTrackId());
if (!targetTrack.IsValid())
{
writeln_d("no target track!");
return Failure("no target track!");
}
if (!targetTrack.VelocityValid())
{
string msg = write_str("T=",TIME_NOW,", alt ", ilevel, kalt, icall, lcall, " target track does not have valid velocity!");
writeln_d(msg);
return Failure(msg);
}
##alt344.f line 172 - 224
int iactn = 4;
# GENERATE TURNS IN MANEUVER PLANE CONTAINING LOS TO OPPONENT
Vec3 dxpme = RelativePositionNED(PLATFORM.Location(),targetTrack.CurrentLocation());
Vec3 vp = PLATFORM.VelocityNED();
Vec3 vp_iac = targetTrack.VelocityNED();
bool bhndme = (Vec3.Dot(dxpme,vp) < 0.0);
bool bhndhm = (Vec3.Dot(dxpme,vp_iac) > 0.0);
if (bhndme && bhndhm)
{
# BEHIND EACH OTHER: WANT COURSE REVERSAL
# USE TAIL ATTACK FOR NOW
talatk();
}
else if (bhndme && !bhndhm)
{
# HE'S ON MY TAIL!: NO TAIL ATTACK ALTERNATIVE GENERATED
string msg = write_str("T=",TIME_NOW,", alt ", ilevel, kalt, icall, lcall, " HE IS ON MY TAIL! NO TAIL ATTACK!");
writeln_d(msg);
return Failure(msg);
}
else if (!bhndme && bhndhm)
{
# I'M ON HIS TAIL!: GENERATE TAIL ATTACK
talatk();
}
else if (!bhndme && !bhndhm)
{
# NOSE TO NOSE: PLAN INTERCEPT
#call aimpt(xp(1,me),spdnow(me),xp(1,iac),vp(1,iac),spdnow(iac),daimpt,lsoln);
WsfWaypoint aimptWP = WsfWaypoint();
double intTime = PLATFORM.InterceptLocation3D(targetTrack, aimptWP);
#if (lsoln)
if (intTime > 0)
{
WsfGeoPoint daimpt = aimptWP.Location();
#call vsub(daimpt,xp(1,me),dxaim);
Vec3 dxaim = RelativePositionNED(PLATFORM.Location(), daimpt); #NED coordinates
dir0 = dxaim.Normal();
spd0 = 3.0;
spdmod = 2; //(desspd = 1, thrttl = 2, desacc = 3)
}
else
{
//return Failure("ERROR: intercept somehow not possible, even though head to head with target!");
# ASSUME OVERSHOOT, SO TRY A TAIL ATTACK
talatk();
}
}
else
{
//call nabort('AL344...UNKNOWN GEOMETRY');
string msg = write_str("T=",TIME_NOW,", alt ", ilevel, kalt, icall, lcall, " ...UNKNOWN GEOMETRY");
writeln_d(msg);
return Failure(msg);
}
//lmore = .true.
double gmxsu = brawlerPlatform.MaxTacticalGs();
gmx = gmxsu;
### Project and Evaluate (Score) Maneuver Alternative
double score = 0;
if (spdmod == 2)
{
score = brawlerPlatform.EvaluateVectorWithThrottle(dir0, gmx, spd0, ilevel, kalt, icall, lcall);
}
else
{
score = brawlerPlatform.EvaluateVectorWithSpeed(dir0, gmx, spd0 * MATH.M_PER_FT(), ilevel, kalt, icall, lcall);
}
writeln_d("T=", TIME_NOW, ", 3441_tail_attack = ", score);
writeln_d("raw = ", brawlerPlatform.RawManeuverValueComponent("offensive"),
", ", brawlerPlatform.RawManeuverValueComponent("low speed recovery"),
", ", brawlerPlatform.RawManeuverValueComponent("defensive"),
", ", brawlerPlatform.RawManeuverValueComponent("illumination"),
", ", brawlerPlatform.RawManeuverValueComponent("missile evasion"),
", ", brawlerPlatform.RawManeuverValueComponent("missile aiming"));
writeln_d("component = ", brawlerPlatform.ManeuverValueComponent("offensive"),
", ", brawlerPlatform.ManeuverValueComponent("low speed recovery"),
", ", brawlerPlatform.ManeuverValueComponent("defensive"),
", ", brawlerPlatform.ManeuverValueComponent("illumination"),
", ", brawlerPlatform.ManeuverValueComponent("missile evasion"),
", ", brawlerPlatform.ManeuverValueComponent("missile aiming"));
writeln_d("tunnel = ", brawlerPlatform.TunnelVisionMultiplier("offensive"),
", ", brawlerPlatform.TunnelVisionMultiplier("low speed recovery"),
", ", brawlerPlatform.TunnelVisionMultiplier("defensive"),
", ", brawlerPlatform.TunnelVisionMultiplier("illumination"),
", ", brawlerPlatform.TunnelVisionMultiplier("missile evasion"),
", ", brawlerPlatform.TunnelVisionMultiplier("missile aiming"));
writeln_d("bias = ", brawlerPlatform.InherentBiasFaults("aggressiveness"),
", ", brawlerPlatform.InherentBiasFaults("mutual support"),
", ", brawlerPlatform.InherentBiasFaults("airspeed maintenance"));
writeln_d("mult = ", brawlerPlatform.OffensiveMultiplier(),
", ", brawlerPlatform.DefensiveMultiplier());
if (targetTrack.Target().IsValid())
{
writeln_d("engage = ", brawlerPlatform.LastEngagementValue(targetTrack.Target()));
}
return score;
end_precondition
execute
writeln_d("3441_tail_attack");
## what was evaluated should be actually performed now
if (spdmod == 2)
{
PLATFORM.FlyVectorWithThrottle(dir0, gmx, spd0);
}
else
{
PLATFORM.FlyVectorWithSpeed(dir0, gmx, spd0 * MATH.M_PER_FT());
}
end_execute
end_behavior