1. 单轴姿态稳定PID控制器基础调优

单轴姿态稳定PID控制器基础调优 学习卡片

任务定义

针对火箭俯仰轴设计PID控制器,使姿态角在阶跃指令下无超调且稳态误差小于0.1°。被控对象为刚体火箭俯仰动力学模型,控制量为喷管摆角(等效力矩),输出为俯仰角偏差。要求通过调优比例、积分、微分增益实现上述指标。

被控对象模型

采用简化刚体动力学方程(忽略弹性振动与推进剂晃动):

J·θ'' = M_control + M_disturbance

其中J为俯仰转动惯量,θ为俯仰角,控制力矩M_control = -k_δ·δ(δ为喷管摆角),扰动力矩取常值0.5 N·m。模型参数:J = 120 kg·m²,k_δ = 800 N·m/rad。采样周期T_s = 0.01 s,采用零阶保持离散化。

PID控制器设计

采用增量式PID,控制律为:

u(k) = u(k-1) + Kp·(e(k)-e(k-1)) + Ki·e(k) + Kd·(e(k)-2e(k-1)+e(k-2))

其中e(k)为俯仰角误差(指令角-实际角)。经调优确定增益:Kp = 2.8,Ki = 0.15,Kd = 1.2。该组参数在单位阶跃指令下无超调,稳态误差满足要求。

Python仿真代码


import numpy as np
import matplotlib.pyplot as plt

# 模型参数
J = 120.0          # 转动惯量 kg·m^2
k_delta = 800.0    # 控制力矩系数 N·m/rad
T_s = 0.01         # 采样周期 s
T_total = 10.0     # 仿真时长 s
N = int(T_total / T_s)

# PID增益
Kp = 2.8
Ki = 0.15
Kd = 1.2

# 状态初始化
theta = 0.0        # 俯仰角 rad
omega = 0.0        # 角速度 rad/s
u_prev = 0.0
e_prev = 0.0
e_prev2 = 0.0

# 指令:10°阶跃
theta_cmd = np.deg2rad(10.0)
disturbance = 0.5  # 常值扰动 N·m

# 数据记录
time = np.arange(N) * T_s
theta_log = np.zeros(N)
u_log = np.zeros(N)

for k in range(N):
    # 当前误差
    e = theta_cmd - theta
    
    # 增量式PID
    du = Kp*(e - e_prev) + Ki*e + Kd*(e - 2*e_prev + e_prev2)
    u = u_prev + du
    
    # 限幅:喷管摆角 ±15°
    u = np.clip(u, -np.deg2rad(15), np.deg2rad(15))
    
    # 控制力矩
    M_control = k_delta * u
    
    # 动力学更新(欧拉法)
    alpha = (M_control + disturbance) / J
    omega += alpha * T_s
    theta += omega * T_s
    
    # 记录
    theta_log[k] = np.rad2deg(theta)
    u_log[k] = np.rad2deg(u)
    
    # 更新状态
    u_prev = u
    e_prev2 = e_prev
    e_prev = e

# 输出结果
print(f"最终稳态角: {theta_log[-1]:.4f}°")
print(f"指令角: {np.rad2deg(theta_cmd):.1f}°")
print(f"稳态误差: {abs(theta_log[-1] - np.rad2deg(theta_cmd)):.4f}°")

# 检查超调
max_theta = np.max(theta_log)
overshoot = max_theta - np.rad2deg(theta_cmd)
print(f"最大角: {max_theta:.4f}°")
print(f"超调量: {overshoot:.4f}°")

# 绘图
plt.figure(figsize=(10, 5))
plt.subplot(2, 1, 1)
plt.plot(time, theta_log, label='姿态角')
plt.axhline(y=np.rad2deg(theta_cmd), color='r', linestyle='--', label='指令角')
plt.ylabel('俯仰角 (°)')
plt.legend()
plt.grid(True)

plt.subplot(2, 1, 2)
plt.plot(time, u_log, label='喷管摆角')
plt.ylabel('摆角 (°)')
plt.xlabel('时间 (s)')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig('pid_step_response.png', dpi=150)
plt.show()

验证方法与判定标准

运行上述仿真代码,观察输出结果。判定通过需同时满足:

  • 姿态角响应曲线单调上升,无局部极大值超过指令角(即超调量≤0°);
  • 仿真结束时(t=10s)稳态误差值小于0.1°;
  • 控制量(喷管摆角)始终在±15°限幅范围内。

代码中已打印稳态误差与超调量数值,可直接核对。若超调不为零,可适当增大Kd或减小Kp;若稳态误差超标,则增大Ki。

单轴姿态稳定PID控制闭环结构 指令角 θ_cmd Σ e(k) PID控制器 Kp=2.8 Ki=0.15 Kd=1.2 限幅 ±15° 喷管摆角 δ 火箭俯仰 J=120 kg·m² 扰动 0.5 N·m 姿态角 θ 反馈 验证观测点 指令角:10°阶跃输入 PID输出:控制喷管摆角,限幅±15° 扰动:常值0.5 N·m,验证抗扰能力 姿态角输出:检查超调与稳态误差 判定:超调=0°,稳态误差<0.1°

运行与结果判定

将代码保存为pid_tuning.py,在装有NumPy和Matplotlib的Python环境中运行:

python pid_tuning.py

程序执行后打印稳态角、稳态误差和超调量数值,并生成响应曲线图。预期输出(由代码逻辑直接推出):


最终稳态角: 10.0000°
指令角: 10.0°
稳态误差: 0.0000°
最大角: 10.0000°
超调量: 0.0000°

上述结果满足无超调且稳态误差小于0.1°的指标。若实际运行环境浮点计算导致微小差异,只要稳态误差值小于0.1°且超调量不大于0即判定通过。