1. 倾转旋翼机建模基础
任务说明
建立倾转旋翼机纵向平面内的三自由度刚体动力学模型,状态量取为前向速度 u、垂向速度 w、俯仰角速率 q,输入量为旋翼倾转角度 δ_t 与总推力 T。模型将用于后续控制律设计与仿真验证。
坐标系与受力分析
采用机体坐标系(x轴向前,z轴向下),忽略横航向耦合与弹性变形。旋翼推力方向随倾转角 δ_t 在纵向平面内旋转,分解到机体轴;气动力以升力 L 和阻力 D 表示,作用于压心。重力沿惯性z轴向下,需投影到机体轴。
动力学方程
在机体坐标系下应用牛顿第二定律与力矩方程,得到纵向三自由度运动方程:
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°,系统应保持近似平飞状态,状态量基本不变,用于验证模型配平正确性。
满足以上三点即可判定模型建立正确,可作为后续控制律设计的被控对象模型。