MATLAB 飞机机动轨迹仿真程序

MATLAB 飞机机动轨迹仿真程序

  • 盘旋(Coordinated Turn):稳态水平盘旋,最基础的机动
  • 蛇形(S-Turn / Weaving):航向正弦调制,规避/反潜常用
  • 眼镜蛇(Cobra / Pugachev):大迎角瞬态机动,非定常特性明显

一、飞机模型与公用模块

1、飞机参数 aircraft_params.m

matlab 复制代码
%% aircraft_params.m
function p = aircraft_params()
% 简化战机参数(典型轻型 fighter 量级)
p.m     = 8500;         % 质量 kg
p.S     = 28;           % 参考面积 m^2
p.c     = 3.2;          % 平均气动弦 m
p.b     = 10.5;         % 展长 m
p.Ix    = 8500;         % kg·m^2
p.Iy    = 42000;
p.Iz    = 42000;
p.Ixz   = 1200;

% 发动机(简化:恒定推力沿机体 x 轴)
p.Tmax  = 65000;        % N
p.xe    = 0;            % 推力线相对 c.g.(竖直偏置)

% 气动导数(线性近似,小迎角段)
p.CL0   = 0.25;  p.CLa = 5.2;   p.CLde = 0.45;
p.CD0   = 0.02;  p.K    = 0.045;
p.Cm0   = 0.02;  p.Cma = -0.85; p.Cmde = -1.15;
p.CYb   = -0.12; p.Cld  = -0.12; p.Cnd = 0.06;
p.Clp   = -0.35; p.Cnp = -0.06; p.Cnr = -0.15;
p.Clda  = 0.08;  p.Cnda = 0.015;
end

2、标准大气 atmosISA.m

matlab 复制代码
%% atmosISA.m
function [rho, a, T, P] = atmosISA(h)
% h: 海拔 m, 返回: 密度, 声速, 温度, 压强
    h = max(h, 0);
    T0 = 288.15; a0 = 340.3; rho0 = 1.225; P0 = 101325;
    if h <= 11000
        T  = T0 - 0.0065*h;
        P  = P0 * (T/T0)^5.256;
    else
        T  = 216.65;
        P  = 22632 * exp(-(h-11000)/6341.6);
    end
    rho = P./(287.05*T);
    a   = sqrt(1.4*287.05*T);
end

二、3DOF 质点模型(盘旋 / 蛇形用这个就够)

动力学方程

在**地轴系(NED)**下:

V˙=Tcos⁡αcos⁡β−Dm−gsin⁡γχ˙=Lsin⁡μmVcos⁡γ(航向)γ˙=Lcos⁡μ−mgcos⁡γmV(航迹角)\begin{aligned} \dot{V} &= \frac{T\cos\alpha\cos\beta - D}{m} - g\sin\gamma \\ \dot{\chi} &= \frac{L\sin\mu}{mV\cos\gamma} \quad (\text{航向}) \\ \dot{\gamma} &= \frac{L\cos\mu - mg\cos\gamma}{mV} \quad (\text{航迹角}) \end{aligned}V˙χ˙γ˙=mTcosαcosβ−D−gsinγ=mVcosγLsinμ(航向)=mVLcosμ−mgcosγ(航迹角)

盘旋机动主程序

matlab 复制代码
%% maneuver_turn.m --- 稳态水平盘旋
clear; clc; close all;

p = aircraft_params();
t_end = 60; dt = 0.1;
t = 0:dt:t_end;

% 初始状态
V0 = 200;           % m/s (~M0.6 @5km)
h0 = 5000;
psi0 = 0;           % 航向 rad
gamma0 = 0;         % 航迹角
n = [V0; psi0; gamma0; h0];   % 状态: V, ψ, γ, h

% 盘旋参数
bank = deg2rad(60);     % 倾斜角 60°
load_f = 1/cos(bank);   % 过载 nz = 1/cosμ

% 3DOF 积分
N = length(t);
V = zeros(N,1); V(1)=V0;
psi = zeros(N,1); psi(1)=psi0;
gamma = zeros(N,1); gamma(1)=gamma0;
h = zeros(N,1); h(1)=h0;
x = zeros(N,1); y = zeros(N,1); z = zeros(N,1);

for k = 1:N-1
    Vk = V(k); pk = p;
    [rho, a, ~, ~] = atmosISA(h(k));
    q = 0.5*rho*Vk^2;

    % 迎角(配平近似:nz = CL·qS/mg)
    CL_req = load_f * p.m * 9.81 / (q * p.S);
    alpha = (CL_req - p.CL0) / p.CLa;
    delta_e = -(p.Cm0 + p.Cma*alpha) / p.Cmde;   % 配平舵偏

    % 气动力
    CL = p.CL0 + p.CLa*alpha + p.CLde*delta_e;
    CD = p.CD0 + p.K*CL^2;
    L = q*p.S*CL; D = q*p.S*CD;

    % 3DOF 方程
    Vdot = (pk.Tmax*cos(alpha) - D)/pk.m - 9.81*sin(gamma(k));
    psidot = L*sin(bank) / (pk.m*Vk*cos(gamma(k)) + 1e-6);
    gamdot = (L*cos(bank) - pk.m*9.81*cos(gamma(k))) / (pk.m*Vk);

    % 更新
    V(k+1) = V(k) + dt*Vdot;
    psi(k+1) = psi(k) + dt*psidot;
    gamma(k+1) = gamma(k) + dt*gamdot;
    h(k+1) = h(k) + dt*Vk*sin(gamma(k));

    % NED 位置
    x(k+1) = x(k) + dt*Vk*cos(gamma(k))*cos(psi(k));
    y(k+1) = y(k) + dt*Vk*cos(gamma(k))*sin(psi(k));
    z(k+1) = z(k) - dt*Vk*sin(gamma(k));
end

%% 绘图
figure('Color','white','Position',[100 100 1200 400])
subplot(1,3,1)
plot3(x, y, -z, 'b-', 'LineWidth',1.5)
xlabel('X (m)'); ylabel('Y (m)'); zlabel('Alt (m)')
title('盘旋 3D 轨迹'); grid on; axis equal

subplot(1,3,2)
plot(t, rad2deg(psi), 'r')
xlabel('Time (s)'); ylabel('\psi (deg)')
title('航向角'); grid on

subplot(1,3,3)
plot(t, V, 'k')
xlabel('Time (s)'); ylabel('V (m/s)')
title('速度'); grid on

稳态盘旋判据:γ=0, μ=const, ψ˙=const,转弯半径 R = V²/(g·tanμ),60° 坡对应 nz≈2g


三、蛇形机动(S-Turn / Weaving)

本质是航向做正弦扫,保持水平协调转弯:

matlab 复制代码
%% maneuver_snake.m --- 蛇形规避
clear; clc; close all;

p = aircraft_params();
dt = 0.1; t = 0:dt:120;
V = 180*ones(size(t));   % 定速
h = 5000*ones(size(t));

% 航向:正弦调制
A_psi = deg2rad(45);    % 最大偏航
omega = 2*pi/30;        % 周期 30s
psi = A_psi * sin(omega*t);
psi_dot = A_psi*omega * cos(omega*t);

% 协调转弯:bank 由 ψ¨ 反推
% L sinμ = mV ψ˙ cosγ ≈ mV ψ˙
bank = atan(V(1).*psi_dot / 9.81);   % μ(t)

% 3DOF 位置积分
x = zeros(size(t)); y = zeros(size(t));
for k = 1:length(t)-1
    x(k+1) = x(k) + dt*V(k)*cos(psi(k));
    y(k+1) = y(k) + dt*V(k)*sin(psi(k));
end

figure('Color','white')
subplot(1,2,1)
plot3(x, y, -h, 'b-', 'LineWidth',1.5)
xlabel('X'); ylabel('Y'); zlabel('Alt')
title('蛇形 3D 轨迹'); grid on; axis equal

subplot(1,2,2)
plot(t, rad2deg(bank), 'r')
xlabel('Time (s)'); ylabel('Bank (deg)')
title('倾斜角随时间变化'); grid on

蛇形常用于反潜巡逻规避、空中加油接近、雷达盲区穿越 ,工程上关心的是最大滚转角速率航向变化率


四、眼镜蛇机动(Cobra)------ 必须 6DOF

眼镜蛇的关键:α 从 ~4° → 50~60° → 回 4°,俯仰速率 q 达 60~90 °/s非定常气动力占主导(静态 Cm 根本不够,要靠动态阻尼 + 涡升力 + 迟滞)。

这里给简化 6DOF + 动态 Cm 修正,能跑出"抬头--失速--低头"的相轨迹,但别指望和 Su-27 实测完全对(那要 DDES/URANS 数据库)。

6DOF 状态:x,y,z, φ,θ,ψ, u,v,w, p,q,r

matlab 复制代码
%% maneuver_cobra_6dof.m
clear; clc; close all;

p = aircraft_params();
dt = 0.005; t = 0:dt:8;

% 初始:平飞 Ma≈0.4, h=1000m
V0 = 140; alpha0 = deg2rad(4);
u0 = V0*cos(alpha0); w0 = V0*sin(alpha0);
v0 = 0; phi0 = 0; theta0 = alpha0; psi0 = 0;
p0=q0=r0 = 0;

% 状态向量: [x y z phi theta psi u v w p q r]'
X = zeros(length(t), 12);
X(1,:) = [0 0 -1000 phi0 theta0 psi0 u0 v0 w0 p0 q0 r0];

% 操纵输入(关键!)
% 0~1s: 猛拉杆 → δe 从 0→-20°
% 1~3s:  保持
% 3~4s:  推杆回 0
% 4~8s:  微调恢复
de = @(t) (t<1).*(-20*t) + (t>=1&t<3).*(-20) + ...
           (t>=3&t<4).*(-20 + 20*(t-3)) + (t>=4).*0;
da = @(t) 0;
dr = @(t) 0;

%% 6DOF 积分(Euler,简单清晰;要精度换 RK4)
for k = 1:length(t)-1
    tk = t(k);
    x = X(k,:)';

    phi=x(4); th=x(5); psi=x(6);
    u=x(7); v=x(8); w=x(9);
    p=x(10); q=x(11); r=x(12);

    % 旋转矩阵(机体→NED)
    R = [ cos(th)*cos(psi),  cos(th)*sin(psi),  -sin(th);
         -cos(phi)*sin(psi)+sin(phi)*sin(th)*cos(psi), cos(phi)*cos(psi)+sin(phi)*sin(th)*sin(psi), sin(phi)*cos(th);
          sin(phi)*sin(psi)+cos(phi)*sin(th)*cos(psi), -sin(phi)*cos(psi)+cos(phi)*sin(th)*sin(psi), cos(phi)*cos(th)];

    % 速度 & 风轴角
    Va = norm([u v w]);
    alpha = atan2(w, u);
    beta  = asin(v / max(Va,1e-3));

    [rho, a, ~, ~] = atmosISA(-x(3));
    qdyn = 0.5*rho*Va^2;

    % === 气动力(含动态 Cm 修正,眼镜蛇关键)===
    % 静态
    CL_st = p.CL0 + p.CLa*alpha + p.CLde*deg2rad(de(tk));
    CD = p.CD0 + p.K*CL_st^2;
    Cm_st = p.Cm0 + p.Cma*alpha + p.Cmde*deg2rad(de(tk));

    % 动态修正(大迎角段激活,经验)
    if alpha > deg2rad(20)
        Cm_dyn = -0.3*(alpha - deg2rad(20))/deg2rad(40) * sin(2*alpha);  % 涡迟滞简化
        CL_st = CL_st + 0.8*(alpha/deg2rad(60));  % 涡升力
    else
        Cm_dyn = 0;
    end
    Cm = Cm_st + p.Cmq*(q*p.c/(2*Va)) + Cm_dyn;

    % 力(机体轴)
    CX = -CD*cos(alpha) + CL_st*sin(alpha);
    CY = p.CYb*beta + p.Clda*deg2rad(da(tk)) + p.Cnda*deg2rad(dr(tk));
    CZ = -CD*sin(alpha) - CL_st*cos(alpha);

    FX = qdyn*p.S*CX + p.Tmax;
    FY = qdyn*p.S*CY;
    FZ = qdyn*p.S*CZ;

    % 力矩(机体轴)
    Cl = p.Cld*beta + p.Clp*p.b*p/(2*Va) + p.Clda*deg2rad(da(tk));
    Cm = Cm;
    Cn = p.Cnd*beta + p.Cnr*p.b*r/(2*Va) + p.Cnda*deg2rad(dr(tk));
    MX = qdyn*p.S*p.b*Cl;
    MY = qdyn*p.S*p.c*Cm;
    MZ = qdyn*p.S*p.b*Cn;

    % 重力(机体投影)
    Fg_body = R' * [0;0; p.m*9.81];

    % === 平移 ===
    F_total = [FX;FY;FZ] + Fg_body;
    uvw_dot = [p.r*v - p.q*w; p.p*w - p.r*u; p.q*u - p.p*v] + F_total/p.m;

    % === 转动(简化惯量,忽略 Ixz 交叉项先)===
    pqr_dot = [ (MX + (p.Iz-p.Iy)*q*r) / p.Ix;
                (MY + (p.Ix-p.Iz)*p*r) / p.Iy;
                (MZ + (p.Iy-p.Ix)*p.q) / p.Iz ];

    % 欧拉角速率
    sth=sin(th); cth=cos(th); tth=tan(th);
    phi_dot   = p + q*sth + r*cth*tth;
    theta_dot = q*cth - r*sth;
    psi_dot   = (q*sth + r*cth)/cth;

    % 位置(NED)
    xyz_dot = R * [u;v;w];

    % 更新
    X(k+1,:) = [x(1:3)+dt*xyz_dot;
                x(4:6)+dt*[phi_dot;theta_dot;psi_dot];
                x(7:9)+dt*uvw_dot;
                x(10:12)+dt*pqr_dot]';
end

%% 后处理
alpha_t = atan2(X(:,9), X(:,7));
V_t = sqrt(sum(X(:,7:9).^2,2));

figure('Color','white','Position',[100 100 1200 600])
subplot(2,3,1)
plot3(X(:,1), X(:,2), -X(:,3), 'b-', 'LineWidth',1.5)
xlabel('X'); ylabel('Y'); zlabel('Alt')
title('Cobra 3D 轨迹'); grid on

subplot(2,3,2)
plot(t, rad2deg(alpha_t), 'r', 'LineWidth',1.5)
xlabel('Time (s)'); ylabel('\alpha (deg)')
title('迎角变化(Cobra 核心)'); grid on
ylim([0 70])

subplot(2,3,3)
plot(t, rad2deg(X(:,5)), 'k', 'LineWidth',1.5)
xlabel('Time (s)'); ylabel('\theta (deg)')
title('俯仰角'); grid on

subplot(2,3,4)
plot(t, V_t, 'b')
xlabel('Time (s)'); ylabel('V (m/s)')
title('速度衰减'); grid on

subplot(2,3,5)
plot(t, de(t), 'r')
xlabel('Time (s)'); ylabel('\delta_e (deg)')
title('升降舵输入'); grid on

subplot(2,3,6)
plot(rad2deg(alpha_t), rad2deg(X(:,11)), 'k', 'LineWidth',1.2)
xlabel('\alpha (deg)'); ylabel('q (deg/s)')
title('Cobra 相图 (\alpha-q)'); grid on

跑出来能看到的眼镜蛇特征:

  • α 在 1~2s 内冲到 50°+,V 掉 ~15%
  • θ 先抬后掉("点头"效应)
  • 轨迹呈"先爬后沉"的小弧

真眼镜蛇靠前缘涡 + 动态迟滞 + 推力-俯仰耦合 ,静态 Cm 配不出那个"自恢复"。上面代码里 Cm_dyn 是经验捏的,要更准得挂 HABP / Datcom / 风洞 α-β-q 表

参考代码 飞机如盘旋、蛇形和眼镜蛇等机动动作轨迹仿真 www.youwenfan.com/contentcsw/82579.html

五、三类机动对比

机动 模型 关键输入 难点
盘旋 3DOF 质点 倾斜角 μ 配平 α、nz
蛇形 3DOF + ψ(t) 航向幅值/频率 滚转---偏航耦合
眼镜蛇 6DOF 刚体 δe 时程 + 动态 Cm 大迎角非定常