mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
implement augmented proportional navigation
This commit is contained in:
parent
187c6d35c3
commit
a93eb6433d
@ -22,8 +22,8 @@ class CfgAmmo {
|
|||||||
defaultSeekerLockMode = "LOAL";
|
defaultSeekerLockMode = "LOAL";
|
||||||
seekerLockModes[] = { "LOAL", "LOBL" };
|
seekerLockModes[] = { "LOAL", "LOBL" };
|
||||||
|
|
||||||
defaultNavigationType = "ProportionalNavigation";
|
defaultNavigationType = "AugmentedProportionalNavigation";
|
||||||
navigationTypes[] = { "ProportionalNavigation" };
|
navigationTypes[] = { "AugmentedProportionalNavigation" };
|
||||||
|
|
||||||
seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
|
seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
|
||||||
seekerAngle = 50; // Angle from the shooter's view that can track the missile
|
seekerAngle = 50; // Angle from the shooter's view that can track the missile
|
||||||
@ -62,8 +62,8 @@ class CfgAmmo {
|
|||||||
defaultSeekerLockMode = "LOAL";
|
defaultSeekerLockMode = "LOAL";
|
||||||
seekerLockModes[] = { "LOAL", "LOBL" };
|
seekerLockModes[] = { "LOAL", "LOBL" };
|
||||||
|
|
||||||
defaultNavigationType = "ProportionalNavigation";
|
defaultNavigationType = "AugmentedProportionalNavigation";
|
||||||
navigationTypes[] = { "ProportionalNavigation" };
|
navigationTypes[] = { "AugmentedProportionalNavigation" };
|
||||||
|
|
||||||
seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
|
seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
|
||||||
seekerAngle = 50; // Angle from the shooter's view that can track the missile
|
seekerAngle = 50; // Angle from the shooter's view that can track the missile
|
||||||
|
@ -83,6 +83,10 @@ class CfgAmmo {
|
|||||||
|
|
||||||
activeRadarEngageDistance = 1000;
|
activeRadarEngageDistance = 1000;
|
||||||
seekerMaxRange = 2000; // distance that the hellfire internal radar can scan
|
seekerMaxRange = 2000; // distance that the hellfire internal radar can scan
|
||||||
|
|
||||||
|
// we can get target acceleration data from radar
|
||||||
|
defaultNavigationType = "AugmentedProportionalNavigation";
|
||||||
|
navigationTypes[] = { "AugmentedProportionalNavigation" };
|
||||||
};
|
};
|
||||||
|
|
||||||
// Vanilla lock system vars
|
// Vanilla lock system vars
|
||||||
|
@ -98,4 +98,8 @@ class GVAR(NavigationTypes) {
|
|||||||
functionName = QFUNC(navigationType_proNav);
|
functionName = QFUNC(navigationType_proNav);
|
||||||
onFired = QFUNC(proNav_onFired);
|
onFired = QFUNC(proNav_onFired);
|
||||||
};
|
};
|
||||||
|
class AugmentedProportionalNavigation {
|
||||||
|
functionName = QFUNC(navigationType_augmentedProNav);
|
||||||
|
onFired = QFUNC(proNav_onFired);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
@ -29,6 +29,7 @@ PREP(attackProfile_JAV_DIR);
|
|||||||
PREP(attackProfile_JAV_TOP);
|
PREP(attackProfile_JAV_TOP);
|
||||||
|
|
||||||
// Navigation Profiles
|
// Navigation Profiles
|
||||||
|
PREP(navigationType_augmentedProNav);
|
||||||
PREP(navigationType_proNav);
|
PREP(navigationType_proNav);
|
||||||
PREP(navigationType_lineOfSight);
|
PREP(navigationType_lineOfSight);
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ if (_seekerTargetPos isEqualTo [0, 0, 0]) exitWith {
|
|||||||
};
|
};
|
||||||
|
|
||||||
private _projectilePos = getPosASLVisual _projectile;
|
private _projectilePos = getPosASLVisual _projectile;
|
||||||
|
private _distanceToTarget2d = _projectilePos distance2d _seekerTargetPos;
|
||||||
|
|
||||||
private _closingRate = vectorMagnitude velocity _projectile;
|
private _closingRate = vectorMagnitude velocity _projectile;
|
||||||
private _timeToGo = (_projectilePos distance _seekerTargetPos) / _closingRate;
|
private _timeToGo = (_projectilePos distance _seekerTargetPos) / _closingRate;
|
||||||
@ -44,7 +45,7 @@ private _atMinRotationAngle = _angleToTarget >= (0.5 * _pitchRate * _timeToGo);
|
|||||||
|
|
||||||
private _returnTargetPos = _seekerTargetPos;
|
private _returnTargetPos = _seekerTargetPos;
|
||||||
|
|
||||||
if !(_atMinRotationAngle) then {
|
if (!_atMinRotationAngle && _distanceToTarget2d >= 500 && _timeToGo >= 10) then {
|
||||||
// 10 degree pitch up
|
// 10 degree pitch up
|
||||||
_returnTargetPos = _seekerTargetPos vectorAdd [0, 0, (_projectilePos distance _seekerTargetPos) * sin 10];
|
_returnTargetPos = _seekerTargetPos vectorAdd [0, 0, (_projectilePos distance _seekerTargetPos) * sin 10];
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,63 @@
|
|||||||
|
#include "script_component.hpp"
|
||||||
|
/*
|
||||||
|
* Author: Brandon (TCVM)
|
||||||
|
* Determine path for projectile to take in accordance to proportional navigation, takes target acceleration into account
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* Guidance Arg Array <ARRAY>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* Commanded acceleration normal to LOS in world space <ARRAY>
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [] call ace_missileguidance_fnc_navigationType_augmentedProNav
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos"];
|
||||||
|
_args params ["_firedEH", "", "", "", "_stateParams"];
|
||||||
|
_firedEH params ["","","","","","","_projectile"];
|
||||||
|
_stateParams params ["", "", "", "","_navigationParams"];
|
||||||
|
_navigationParams params ["_lastMissileFrame", "_navigationGain"];
|
||||||
|
_lastMissileFrame params ["_lastTargetPosition", "_lastTargetVelocity", "_lastLineOfSight"];
|
||||||
|
|
||||||
|
// Proportional navigation implemented via "Fundamentals of proportional navigation" by Stephen Murtaugh and Harry Criel
|
||||||
|
private _projectileVelocity = velocity _projectile;
|
||||||
|
|
||||||
|
// integrate target velocity for realistic inference of velocity
|
||||||
|
private _targetVelocity = _lastTargetVelocity;
|
||||||
|
private _targetAcceleration = [0, 0, 0];
|
||||||
|
if (_timestep != 0) then {
|
||||||
|
_targetVelocity = (_seekerTargetPos vectorDiff _lastTargetPosition) vectorMultiply (1 / _timestep);
|
||||||
|
_targetAcceleration = (_targetVelocity vectorDiff _lastTargetVelocity) vectorMultiply (1 / _timestep);
|
||||||
|
};
|
||||||
|
|
||||||
|
private _closingVelocity = _targetVelocity vectorDiff _projectileVelocity;
|
||||||
|
|
||||||
|
private _lineOfSight = vectorNormalized (_profileAdjustedTargetPos vectorDiff getPosASLVisual _projectile);
|
||||||
|
|
||||||
|
private _targetAccelerationProjected = _lineOfSight vectorMultiply (_targetAcceleration vectorDotProduct _lineOfSight);
|
||||||
|
_targetAcceleration = _targetAcceleration vectorDiff _targetAccelerationProjected;
|
||||||
|
systemChat str vectorMagnitude _targetAcceleration;
|
||||||
|
// the los rate is tiny, so we multiply by a constant of a power of ten to get more aggressive acceleration
|
||||||
|
// this is just due to how we measure our LOS delta, the vectors involved are _tiny_
|
||||||
|
private _losDelta = _lineOfSight vectorDiff _lastLineOfSight;
|
||||||
|
private _losRate = if (_timestep == 0) then {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
10 * (vectorMagnitude _losDelta) / _timestep;
|
||||||
|
};
|
||||||
|
|
||||||
|
private _lateralAcceleration = (_navigationGain * _losRate);
|
||||||
|
private _commandedAcceleration = _closingVelocity vectorMultiply _lateralAcceleration;
|
||||||
|
_commandedAcceleration = _commandedAcceleration vectorAdd (_losDelta vectorMultiply (0.5 * _navigationGain * vectorMagnitude _targetAcceleration));
|
||||||
|
|
||||||
|
// we need acceleration normal to our LOS
|
||||||
|
private _commandedAccelerationProjected = _lineOfSight vectorMultiply (_commandedAcceleration vectorDotProduct _lineOfSight);
|
||||||
|
_commandedAcceleration = _commandedAcceleration vectorDiff _commandedAccelerationProjected;
|
||||||
|
|
||||||
|
if (accTime > 0) then {
|
||||||
|
_navigationParams set [0, [_seekerTargetPos, _targetVelocity, _lineOfSight]];
|
||||||
|
};
|
||||||
|
|
||||||
|
_commandedAcceleration
|
@ -1,24 +1,24 @@
|
|||||||
Weapon Configs:
|
Weapon Configs:
|
||||||
Hellfire - Laser
|
X Hellfire - Laser
|
||||||
AGM-65 - Laser
|
X AGM-65 - Laser
|
||||||
DAGR - Laser
|
X DAGR - Laser
|
||||||
GBU-12 - Laser
|
X GBU-12 - Laser
|
||||||
|
|
||||||
Dragon - SACLOS
|
X Dragon - SACLOS
|
||||||
Metis - SACLOS
|
X Metis - SACLOS
|
||||||
HOT - SACLOS
|
X HOT - SACLOS
|
||||||
|
|
||||||
Javelin - Optical
|
X Javelin - Optical
|
||||||
NLAW - PLOS
|
X NLAW - PLOS
|
||||||
|
|
||||||
Vikhr - Beam Rider SACLOS
|
Vikhr - Beam Rider SACLOS
|
||||||
|
|
||||||
R-73 - Infrared
|
R-73 - Infrared
|
||||||
AIM-9 - Infrared
|
AIM-9 - Infrared
|
||||||
|
AIM-132 - Infrared
|
||||||
|
|
||||||
R-77 - AHR
|
R-77 - AHR
|
||||||
AIM-120 - AHR
|
X AIM-120 - AHR
|
||||||
AIM-132 - AHR
|
|
||||||
|
|
||||||
KH-25 - Optical
|
KH-25 - Optical
|
||||||
AGM-65 - Optical
|
AGM-65 - Optical
|
||||||
@ -58,6 +58,10 @@ Navigation Types:
|
|||||||
Navigation States:
|
Navigation States:
|
||||||
Todo
|
Todo
|
||||||
|
|
||||||
|
Navigation Types:
|
||||||
|
X Augmented Pro-Nav
|
||||||
|
Zero Effort Miss
|
||||||
|
|
||||||
General To-Do:
|
General To-Do:
|
||||||
Add more weapons
|
Add more weapons
|
||||||
X Fix GBU drag
|
X Fix GBU drag
|
||||||
|
Loading…
Reference in New Issue
Block a user