4. 带视场约束的滑模制导律设计

任务定义

针对导弹拦截机动目标场景,设计一种带视场约束的滑模制导律。要求:视线角速率在有限时间内收敛至零附近,同时导弹速度矢量与视线之间的夹角(视场角)始终不超过给定约束值。本案例采用滑模控制方法,通过构造包含视场角约束的滑模面与自适应切换增益实现上述目标。

问题建模

考虑二维拦截几何,定义视线角为 q,弹目相对距离为 r,导弹速度 V_m,目标速度 V_t。视线角速率动态方程为:

dq/dt = q_dot
dq_dot/dt = -(2 * r_dot * q_dot) / r - (a_m * cos(eta_m)) / r + (a_t * cos(eta_t)) / r

其中 a_m 为导弹法向加速度(制导指令),a_t 为目标法向加速度(未知有界扰动),eta_m 为导弹前置角,eta_t 为目标前置角。视场角约束定义为 |eta_m| ≤ η_max,其中 eta_m = q - θ_m,θ_m 为导弹弹道倾角。

滑模面与制导律设计

定义滑模面为:

s = q_dot + λ * q

其中 λ > 0 为设计参数。为保证视场角约束,引入屏障函数 B(eta_m) = 1 / (η_max² - eta_m²),构造增广滑模面:

s_aug = s + k_b * B(eta_m) * q_dot

其中 k_b > 0 为约束权重。制导律设计为:

a_m = (r / cos(eta_m)) * [ (2 * r_dot * q_dot) / r + λ * q_dot + k_b * d(B)/dt * q_dot + k_b * B * (-(2*r_dot*q_dot)/r) + ρ * sign(s_aug) + k_s * s_aug ]

其中 ρ 为切换增益(需大于目标扰动上界),k_s > 0 为趋近律系数。当 |eta_m| → η_max 时,B → ∞,s_aug 迅速增大,产生强修正指令将视场角拉回约束内。

代码实现

import numpy as np
from scipy.integrate import solve_ivp

# 拦截场景参数
V_m = 300.0          # 导弹速度 m/s
V_t = 150.0          # 目标速度 m/s
eta_max = np.deg2rad(30.0)  # 视场角约束 30°
lambda_ = 2.0        # 滑模面系数
k_b = 0.5            # 屏障函数权重
k_s = 3.0            # 趋近律系数
rho = 20.0           # 切换增益(大于目标机动上界)
a_t_max = 15.0       # 目标最大机动 m/s²

# 初始状态: [r, r_dot, q, q_dot, theta_m, theta_t]
# r=3000m, 接近速度-250m/s, q=10°, q_dot=0.02rad/s
init_state = [3000.0, -250.0, np.deg2rad(10.0), 0.02, np.deg2rad(5.0), np.deg2rad(15.0)]

def guidance_dynamics(t, state):
    r, r_dot, q, q_dot, theta_m, theta_t = state
    
    # 视场角(前置角)
    eta_m = q - theta_m
    eta_t = q - theta_t
    
    # 目标机动(未知但有界,模拟阶跃机动)
    a_t = a_t_max * (1 if t > 1.0 else 0)
    
    # 屏障函数及其导数
    B = 1.0 / (eta_max**2 - eta_m**2)
    dB_deta = 2 * eta_m / (eta_max**2 - eta_m**2)**2
    # d(eta_m)/dt = q_dot - theta_m_dot, theta_m_dot = a_m / V_m
    # 此处先计算不含a_m的项,a_m在下面求解
    
    # 滑模面
    s = q_dot + lambda_ * q
    s_aug = s + k_b * B * q_dot
    
    # 求解制导指令 a_m(隐式,因theta_m_dot依赖a_m)
    # 采用一次迭代近似:先用当前theta_m_dot=0计算a_m,再更新
    theta_m_dot = 0.0  # 初始猜测
    for _ in range(3):  # 固定点迭代
        d_eta_m_dt = q_dot - theta_m_dot
        dB_dt = dB_deta * d_eta_m_dt
        
        # 制导律(不含目标项,目标视为扰动)
        term1 = (2 * r_dot * q_dot) / r
        term2 = lambda_ * q_dot
        term3 = k_b * dB_dt * q_dot
        term4 = k_b * B * (-term1)
        term5 = rho * np.sign(s_aug) + k_s * s_aug
        
        a_m = (r / np.cos(eta_m)) * (term1 + term2 + term3 + term4 + term5)
        
        # 更新theta_m_dot
        theta_m_dot = a_m / V_m
    
    # 状态导数
    dr_dt = r_dot
    dr_dot_dt = (V_t**2 - V_m**2 + r_dot**2) / r  # 简化的相对运动学
    dq_dt = q_dot
    dq_dot_dt = -(2 * r_dot * q_dot) / r - (a_m * np.cos(eta_m)) / r + (a_t * np.cos(eta_t)) / r
    dtheta_m_dt = a_m / V_m
    dtheta_t_dt = a_t / V_t
    
    return [dr_dt, dr_dot_dt, dq_dt, dq_dot_dt, dtheta_m_dt, dtheta_t_dt]

# 仿真
t_span = (0, 5.0)
t_eval = np.linspace(0, 5.0, 500)
sol = solve_ivp(guidance_dynamics, t_span, init_state, t_eval=t_eval, rtol=1e-6, atol=1e-8)

# 提取结果
r = sol.y[0]
q = sol.y[2]
q_dot = sol.y[3]
theta_m = sol.y[4]
eta_m = q - theta_m

# 验证指标
max_eta = np.max(np.abs(eta_m))
final_q_dot = np.abs(q_dot[-1])
print(f"最大视场角: {np.rad2deg(max_eta):.2f}° (约束: {np.rad2deg(eta_max):.0f}°)")
print(f"终端视线角速率: {final_q_dot:.4f} rad/s")
print(f"视场角约束满足: {'是' if max_eta <= eta_max else '否'}")
print(f"视线角速率收敛: {'是' if final_q_dot < 0.005 else '否'}")

验证方法

运行上述仿真代码,观察输出指标。判定标准为:

  1. 视场角约束:全程 |eta_m| ≤ 30°,即输出中“最大视场角”不超过30°;
  2. 收敛性:终端时刻视线角速率值小于0.005 rad/s;
  3. 动态过程:若绘制 eta_m 时间曲线,可见其接近但不超过约束边界,且 q_dot 单调衰减。
带视场约束滑模制导律仿真验证 视场角 η_m 响应 +30° -30° 0s 5s 时间 视线角速率 q̇ 收敛 0.02 0 0s 5s 关键设计要素 屏障函数 B(η_m) = 1/(η_max² - η_m²):当视场角接近约束时,B 急剧增大 增广滑模面 s_aug = s + k_b·B·q̇:约束项与收敛项耦合 切换项 ρ·sign(s_aug):抑制目标机动等有界扰动 固定点迭代求解 a_m:处理 θ̇_m 对 a_m 的隐式依赖 仿真条件:V_m=300m/s, V_t=150m/s, η_max=30°, 目标1s后阶跃机动15m/s²

结果判定

代码执行后,若打印的“最大视场角”不超过30°且“终端视线角速率”小于0.005 rad/s,则判定制导律设计满足任务要求。仿真过程中视场角曲线应始终位于±30°边界内,视线角速率曲线单调衰减至零附近。若视场角超限,可增大 k_b 或减小 lambda_;若收敛过慢,可增大 k_s 或 rho。