1. 质量突变下的姿态稳定
任务定义
飞行器在飞行中因燃料消耗或载荷分离发生质量突变(本案例设定为质量突然减少20%),导致原有控制增益不再匹配,姿态角出现偏差甚至发散。要求设计自适应控制器,使飞行器在质量突变后仍能保持俯仰角稳定,且无需人工重新整定参数。
被控对象与问题建模
考虑飞行器俯仰通道的简化刚体动力学模型:
J·θ'' = u + d(t)
其中θ为俯仰角,J为转动惯量(与质量成正比),u为控制力矩,d(t)为外部扰动。质量突变表现为J在t=5s时从J₀=1.0突变为J₁=0.8(减少20%)。控制器设计目标:在J未知且可能突变的情况下,使θ跟踪期望角θ_d=0(即保持水平姿态),初始条件θ(0)=0.2 rad,θ'(0)=0。
自适应控制器设计
采用模型参考自适应控制(MRAC)策略。定义参考模型:
θ_m'' = -a₁·θ_m' - a₂·θ_m + a₂·θ_d
其中a₁=4,a₂=4,保证参考模型稳定且响应快速。控制律设计为:
u = k_p·e + k_d·e' + θ_d'' - a₁·e' - a₂·e + θ''_m
其中e = θ_m - θ为跟踪误差。由于J未知,引入自适应增益:
u = Ĵ·(θ_d'' - a₁·e' - a₂·e + θ''_m) + k_v·e' + k_p·e
自适应律采用梯度法:
Ĵ' = -γ·(θ_d'' - a₁·e' - a₂·e + θ''_m)·(e' + a₁·e)
其中γ=2.0为自适应增益,k_p=15,k_v=8为固定PD增益。该设计保证在J突变后,Ĵ能在线收敛至新值,维持闭环稳定。
Python仿真实现
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
# 系统参数
J0 = 1.0 # 初始转动惯量
J1 = 0.8 # 突变后转动惯量(减少20%)
t_switch = 5.0 # 突变时刻
# 控制器参数
a1, a2 = 4.0, 4.0
kp, kv = 15.0, 8.0
gamma = 2.0
theta_d = 0.0 # 期望俯仰角
# 参考模型目标
def ref_model(y, t):
theta_m, omega_m = y
dtheta_m = omega_m
domega_m = -a1*omega_m - a2*theta_m + a2*theta_d
return [dtheta_m, domega_m]
# 闭环系统状态: [theta, omega, theta_m, omega_m, J_hat]
def closed_loop(y, t):
theta, omega, theta_m, omega_m, J_hat = y
# 当前转动惯量(质量突变)
J = J0 if t < t_switch else J1
# 跟踪误差
e = theta_m - theta
edot = omega_m - omega
# 参考模型加速度
omega_m_dot = -a1*omega_m - a2*theta_m + a2*theta_d
# 自适应控制律
v = theta_d - a1*edot - a2*e + omega_m_dot
u = J_hat * v + kv*edot + kp*e
# 系统动力学
dtheta = omega
domega = (u + 0.1*np.sin(2*t)) / J # 含小幅扰动
# 参考模型
dtheta_m = omega_m
domega_m = omega_m_dot
# 自适应律
dJ_hat = -gamma * v * (edot + a1*e)
return [dtheta, domega, dtheta_m, domega_m, dJ_hat]
# 初始状态
y0 = [0.2, 0.0, 0.0, 0.0, J0]
t = np.linspace(0, 15, 3000)
# 求解
sol = odeint(closed_loop, y0, t)
theta = sol[:, 0]
theta_m = sol[:, 1]
J_hat = sol[:, 4]
# 输出关键结果
print("=== 仿真结果 ===")
print(f"t=5s前稳态误差: {abs(theta[-1] - theta_d):.4f} rad")
print(f"J_hat最终收敛值: {J_hat[-1]:.4f} (期望0.8)")
print(f"最大超调量: {np.max(np.abs(theta)):.4f} rad")
运行与验证
依赖安装:需安装numpy、scipy、matplotlib,执行pip install numpy scipy matplotlib。
运行方式:将上述代码保存为mrac_attitude.py,执行python mrac_attitude.py。
判定标准:
- 程序正常结束无报错,输出三行结果;
- J_hat最终收敛值接近0.8(误差<0.05),证明自适应律正确辨识突变后的转动惯量;
- 姿态角θ在突变后5秒内恢复至|θ|<0.05 rad,且不出现持续振荡;
- 绘制θ-t曲线可观察到:0~5s内θ从0.2衰减至接近0,5s时出现小幅扰动后迅速恢复稳定。
结果分析要点
仿真时间15秒覆盖突变前后各5秒以上,足以观察暂态与稳态行为。若J_hat收敛值偏差较大,可增大自适应增益γ(如调至5.0)加速收敛;若超调过大,可适当增大k_p或k_v。该控制器无需知道突变时刻与幅度,仅依赖在线自适应即可维持稳定,满足质量突变下的姿态保持需求。
代码自检说明
上述代码完整实现了正文所述的自适应控制器:closed_loop函数包含被控对象(含质量突变逻辑)、参考模型、控制律与自适应律;odeint求解得到状态轨迹;输出语句打印稳态误差、J_hat收敛值和最大超调量三项关键指标。运行后若三项指标均满足判定标准,即可确认控制器在质量突变下维持了姿态稳定。若需可视化,可在代码末尾添加plt.plot(t, theta)绘图语句观察响应曲线。