1. 倾转旋翼机建模基础

倾转旋翼机建模基础:建立三自由度刚体动力学模型 学习卡片

任务说明

建立倾转旋翼机纵向平面内的三自由度刚体动力学模型,状态量取为前向速度 u、垂向速度 w、俯仰角速率 q,输入量为旋翼倾转角度 δ_t 与总推力 T。模型将用于后续控制律设计与仿真验证。

坐标系与受力分析

采用机体坐标系(x轴向前,z轴向下),忽略横航向耦合与弹性变形。旋翼推力方向随倾转角 δ_t 在纵向平面内旋转,分解到机体轴;气动力以升力 L 和阻力 D 表示,作用于压心。重力沿惯性z轴向下,需投影到机体轴。

x_b z_b T δ_t mg 水平 θ V 图例 推力 T 重力 mg 速度 V 倾转角 δ_t

动力学方程

在机体坐标系下应用牛顿第二定律与力矩方程,得到纵向三自由度运动方程:

m(ṙ + q × r) = F_ext
I_yy · q̇ = M_y

展开后得到标量方程组(θ 为俯仰角,α 为迎角,ρ 为空气密度,S 为机翼参考面积):

ṙ = [ T·sin(δ_t) + L·sin(α) - D·cos(α) - m·g·sin(θ) ] / m
ẇ = [ -T·cos(δ_t) - L·cos(α) - D·sin(α) + m·g·cos(θ) ] / m
q̇ = [ T·l_t·cos(δ_t) + M_aero ] / I_yy
θ̇ = q

其中 l_t 为旋翼推力作用点到重心的力臂,M_aero 为气动俯仰力矩。气动力与力矩采用线性化模型:

L = 0.5·ρ·V²·S·C_L(α)
D = 0.5·ρ·V²·S·C_D(α)
M_aero = 0.5·ρ·V²·S·c̄·C_m(α)
C_L = C_L0 + C_Lα·α
C_D = C_D0 + K·C_L²
C_m = C_m0 + C_mα·α

Python仿真实现

以下代码实现上述模型的数值积分,给定初始状态与倾转指令序列,输出状态随时间的变化曲线。

import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

# 物理常数与几何参数
m = 1200.0          # 质量 kg
g = 9.81            # 重力加速度
I_yy = 1800.0       # 俯仰转动惯量 kg·m²
S = 8.5             # 机翼面积 m²
c_bar = 1.8         # 平均气动弦长 m
rho = 1.225         # 空气密度 kg/m³
l_t = 0.6           # 推力力臂 m

# 气动导数
C_L0, C_Lalpha = 0.25, 5.2
C_D0, K = 0.03, 0.045
C_m0, C_malpha = 0.02, -0.6

def aero_coeffs(alpha_deg):
    alpha = np.radians(alpha_deg)
    CL = C_L0 + C_Lalpha * alpha
    CD = C_D0 + K * CL**2
    Cm = C_m0 + C_malpha * alpha
    return CL, CD, Cm

def dynamics(t, state, T_val, delta_t_deg):
    u, w, q, theta = state
    V = np.sqrt(u**2 + w**2)
    if V < 1e-3:
        alpha_deg = 0.0
    else:
        alpha_deg = np.degrees(np.arctan2(w, u))
    delta_t = np.radians(delta_t_deg)
    CL, CD, Cm = aero_coeffs(alpha_deg)
    q_dyn = 0.5 * rho * V**2 * S
    L = q_dyn * CL
    D = q_dyn * CD
    M_aero = q_dyn * c_bar * Cm
    u_dot = (T_val*np.sin(delta_t) + L*np.sin(np.radians(alpha_deg))
             - D*np.cos(np.radians(alpha_deg)) - m*g*np.sin(theta)) / m
    w_dot = (-T_val*np.cos(delta_t) - L*np.cos(np.radians(alpha_deg))
             - D*np.sin(np.radians(alpha_deg)) + m*g*np.cos(theta)) / m
    q_dot = (T_val*l_t*np.cos(delta_t) + M_aero) / I_yy
    theta_dot = q
    return [u_dot, w_dot, q_dot, theta_dot]

# 初始状态:平飞配平点附近
u0, w0, q0, theta0 = 60.0, 2.0, 0.0, np.radians(2.0)
state0 = [u0, w0, q0, theta0]
t_span = (0, 20)
t_eval = np.linspace(0, 20, 1000)

# 输入:倾转角从0°到30°阶跃,推力保持恒定
T_input = 12000.0
delta_t_input = 30.0

sol = solve_ivp(dynamics, t_span, state0, t_eval=t_eval,
                args=(T_input, delta_t_input), method='RK45', rtol=1e-6)

# 绘图
fig, axes = plt.subplots(2, 2, figsize=(10, 7))
axes[0,0].plot(sol.t, sol.y[0], color='#0ea5e9')
axes[0,0].set_ylabel('u (m/s)'); axes[0,0].grid(True)
axes[0,1].plot(sol.t, sol.y[1], color='#f59e0b')
axes[0,1].set_ylabel('w (m/s)'); axes[0,1].grid(True)
axes[1,0].plot(sol.t, np.degrees(sol.y[2]), color='#16a34a')
axes[1,0].set_ylabel('q (deg/s)'); axes[1,0].set_xlabel('t (s)'); axes[1,0].grid(True)
axes[1,1].plot(sol.t, np.degrees(sol.y[3]), color='#dc2626')
axes[1,1].set_ylabel('θ (deg)'); axes[1,1].set_xlabel('t (s)'); axes[1,1].grid(True)
plt.suptitle('Tiltrotor 3-DOF Longitudinal Response (δ_t = 30°)')
plt.tight_layout()
plt.savefig('tiltrotor_response.png', dpi=120)
print('仿真完成,结果已保存为 tiltrotor_response.png')

运行与验证

依赖安装:

pip install numpy scipy matplotlib

运行方式:将上述代码保存为 tiltrotor_model.py,在终端执行 python tiltrotor_model.py。

验证方法:观察输出图片中四个子图曲线。判定标准:

  • 曲线随时间连续光滑,无数值发散(状态量不出现NaN或趋于无穷);
  • 倾转角阶跃至30°后,前向速度 u 呈上升趋势(推力前倾分量增加),垂向速度 w 相应调整,俯仰角速率 q 先响应后趋于稳定,俯仰角 θ 平滑过渡到新平衡值;
  • 若将 delta_t_input 改为0°,系统应保持近似平飞状态,状态量基本不变,用于验证模型配平正确性。

满足以上三点即可判定模型建立正确,可作为后续控制律设计的被控对象模型。