Missile Optimization Guidance
Problem Description
Generally, assuming the target is stationary or moving at low speed, the geometric representation of guidance within a two-dimensional horizontal plane is shown as follow:
Among them V_i are the velocities of the i th missile, respectively. The remaining flight time of the i-th missile is represented by guidance flight state parameters such as line of sight distance r_i , line of sight angle q_i , rake angle \varphi_i , and trajectory angle \theta_i , as shown in the figure (for simplicity, the index of the i-th missile is omitted) Missile guidance follows the so-called proportional guidance relationship, which is \varphi=\theta − q, \dot{\theta} = N(t) \dot q. Among them N is the guidance gain (proportional guidance coefficient) that varies over time, Therefore, the dynamic equation of missile line of sight angle can be expressed as:
Among them p_0, p_1 are coefficients related to aerodynamic lift, aerodynamic drag, and missile parameters.
The lateral acceleration of the missile is described as:
Simply put, consider the limitation of maximum lateral overload during missile guidance:
In addition, based on the constraints of landing angle and finite field of view, the guided flight process also includes the following boundary constraints:
Optimal Proportional Guidance
The optimization objective comprehensively considers overload (least squares) integration and maximizing end velocity, and the OCP model is defined as:
Modeling
N = 100
prob = multi_stage_problem('guidance', NN + 1)
g = 9.81
t0 = 0
vMin, vMax = 1.0, 1000.0
ngMin, ngMax = -16.0, 16.0
r0, q0, v0, varphi0 = prob.parameters(['r0', 'q0', 'v0', 'varphi0'], stage_dependent=False)
rf, qf, varphif = prob.parameters(['rf', 'qf', 'varphif'], stage_dependent=False)
rMin, rMax = prob.parameters(['rMin', 'rMax'], stage_dependent=False)
qMin, qMax = prob.parameters(['qMin', 'qMax'], stage_dependent=False)
varphiMin, varphiMax = prob.parameters(['varphiMin', 'varphiMax'], stage_dependent=False)
aMin, aMax = prob.parameters(['aMin', 'aMax'], stage_dependent=False)
tfMin, tfMax = prob.parameters(['tfMin', 'tfMax'], stage_dependent=False)
vfWeight, aWeight, ngWeight = prob.parameters(['vfWeight', 'aWeight', 'ngWeight'], stage_dependent=False)
r = prob.variable('r', hard_lowerbound=rMin, hard_upperbound=rMax)
q = prob.variable('q', hard_lowerbound=qMin, hard_upperbound=qMax)
v = prob.variable('v', hard_lowerbound=vMin, hard_upperbound=vMax)
varphi = prob.variable('varphi', hard_lowerbound=varphiMin, hard_upperbound=varphiMax)
ng = prob.variable('ng', hard_lowerbound=ngMin, hard_upperbound=ngMax)
tf = prob.variable('tf', hard_lowerbound=tfMin, hard_upperbound=tfMax)
rho = 1.211
CD0 = 0.005
Sref = 0.29
m = 200.0
K = 0.03
p0 = 0.5 * rho * CD0 * Sref / m
p1 = 2 * m * K / (rho * Sref ** 2)
""" ode """
dr = -v * cos(varphi)
dq = -v * sin(varphi) / (r)
dv = -p0 * v ** 2 - p1 * (v * sin(varphi) / (r)) ** 2 * ng ** 2
dvarphi = (1 - ng) * v * sin(varphi) / (r)
dxdt = [dr, dq, dv, dvarphi, 0]
ts = tf / NN
ode = differential_equation(
state=[r, q, v, varphi, tf],
state_dot=dxdt,
stepsize=ts,
discretization_method='trapezoid')
prob.equality(ode)
# inequality
a = ng * v ** 2 * sin(varphi) / (r)
ineqa = general_inequality(expr=[a, a], sign=['>=', '<='], bound=[aMin, aMax])
prob.inequality(ineqa)
# minimize fuel consumption
obj_a = general_objective(aWeight * a ** 2 + ngWeight * ng ** 2)
prob.objective(obj_a)
obj_v = general_objective(-vfWeight * v)
prob.end_objective(obj_v)
seq = general_equality([r - r0, q - q0, v - v0, varphi - varphi0])
prob.start_equality(seq)
eeq = general_equality([r - rf, q - qf, varphi - varphif])
prob.end_equality(eeq)
option = codegen_option()
codegen = code_generator()
codegen.codegen(prob, option)
Solution
[1]. Jiang, Huan, et al. "Cooperative guidance with multiple constraints using convex optimization." Aerospace science and technology 79 (2018)