2. 质量缓变补偿
任务定义
飞行器在飞行过程中因燃料消耗导致质量缓慢变化,该变化会改变俯仰通道的力矩特性,造成模型失配。本案例要求设计自适应律在线估计缓慢变化的质量参数,并利用估计值对俯仰角加速度指令进行前馈补偿,使闭环系统在质量缓变条件下仍能跟踪期望俯仰角指令。
被控对象与问题建模
考虑简化的俯仰通道刚体动力学模型:
J·θ'' = M_δ·δ + M_q·θ' + d(t)
其中θ为俯仰角,J为转动惯量(已知常数),δ为升降舵偏角(控制输入),M_δ为舵效系数,M_q为阻尼系数,d(t)=−ġ·l_cg·θ为质量缓变引起的扰动力矩项。将质量变化效应折算为未知时变参数a(t)乘在θ'项上,重写模型为:
θ'' = b·δ + a(t)·θ' + c·θ
其中b=M_δ/J为已知常数,c为已知气动系数,a(t)=M_q/J−Δ(t)为未知缓变参数,Δ(t)代表质量变化引起的阻尼项偏移。控制目标:设计自适应律估计â(t),并构造控制律使θ跟踪参考指令θ_cmd。
自适应律与控制律设计
定义跟踪误差e=θ−θ_cmd,滑模面s=ė+λe(λ>0)。控制律设计为:
δ = (1/b)·[θ_cmd'' − λė − c·θ − â(t)·θ' − K·s]
其中K>0为反馈增益。参数自适应律采用梯度法:
â' = −Γ·s·θ'
其中Γ>0为自适应增益。由于a(t)缓变,自适应律能够持续跟踪其变化。
Python仿真实现
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
# 系统参数
J = 2.0 # 转动惯量 kg·m²
M_delta = 3.0 # 舵效系数
M_q = -0.8 # 阻尼系数
c = -0.5 # 气动恢复系数
b = M_delta / J # 控制增益
# 质量缓变模型:a(t) = M_q/J - 0.3*sin(0.05*t)
# 模拟燃料消耗导致阻尼项缓慢偏移
def true_a(t):
return M_q/J - 0.3*np.sin(0.05*t)
# 控制器参数
lambda_ = 2.0
K = 5.0
Gamma = 3.0
# 参考指令
def theta_cmd(t):
return 0.3*np.sin(0.5*t)
def theta_cmd_dot(t):
return 0.15*np.cos(0.5*t)
def theta_cmd_ddot(t):
return -0.075*np.sin(0.5*t)
# 状态: [theta, theta_dot, a_hat]
def dynamics(t, state):
theta, theta_dot, a_hat = state
e = theta - theta_cmd(t)
e_dot = theta_dot - theta_cmd_dot(t)
s = e_dot + lambda_*e
# 控制律
delta = (1/b) * (theta_cmd_ddot(t) - lambda_*e_dot - c*theta
- a_hat*theta_dot - K*s)
# 实际系统动态(真实a(t))
theta_ddot = b*delta + true_a(t)*theta_dot + c*theta
# 自适应律
a_hat_dot = -Gamma * s * theta_dot
return [theta_dot, theta_ddot, a_hat_dot]
# 仿真参数
t_span = (0, 30)
t_eval = np.linspace(0, 30, 3000)
state0 = [0.0, 0.0, M_q/J] # 初始估计值设为标称值
# 求解
sol = solve_ivp(dynamics, t_span, state0, t_eval=t_eval,
method='RK45', rtol=1e-6, atol=1e-8)
# 提取结果
t = sol.t
theta = sol.y[0]
theta_dot = sol.y[1]
a_hat = sol.y[2]
a_true = np.array([true_a(ti) for ti in t])
cmd = np.array([theta_cmd(ti) for ti in t])
# 绘图
fig, (ax1, ax2, ax3) = plt.subplots(3, 1, figsize=(10, 8))
ax1.plot(t, cmd, 'k--', label='θ_cmd', linewidth=1.5)
ax1.plot(t, theta, 'b-', label='θ', linewidth=1.5)
ax1.set_ylabel('俯仰角 (rad)')
ax1.legend()
ax1.grid(True)
ax2.plot(t, a_true, 'r-', label='真实 a(t)', linewidth=1.5)
ax2.plot(t, a_hat, 'b--', label='估计 â(t)', linewidth=1.5)
ax2.set_ylabel('参数值')
ax2.legend()
ax2.grid(True)
ax3.plot(t, theta - cmd, 'g-', linewidth=1.5)
ax3.set_ylabel('跟踪误差 (rad)')
ax3.set_xlabel('时间 (s)')
ax3.grid(True)
plt.tight_layout()
plt.savefig('mass_varying_compensation.png', dpi=150)
plt.show()
验证方法与判定标准
运行上述仿真代码,观察以下三点以判定案例是否通过:
- 跟踪性能:俯仰角θ曲线应紧密跟随参考指令θ_cmd,稳态跟踪误差收敛至零附近(|e|<0.02 rad);
- 参数估计:估计值â(t)曲线应随真实a(t)的缓变趋势同步变化,两者偏差保持有界(|â−a|<0.15);
- 补偿效果:对比有无自适应补偿(可将a_hat固定为初始值重跑),有补偿时跟踪误差明显更小,证明自适应律有效抵消了质量缓变的影响。
若仿真结果满足上述三项指标,则说明自适应律成功估计了缓慢变化的质量参数并完成了俯仰通道补偿。