Simulink导弹制导系统仿真
模型文件
使用指南
视频讲解
fu

模型主要功能

该模型模拟了导弹拦截目标的过程,包含三个主要子系统:

Seeker/Tracker (导引头/跟踪器):计算视线角(Look Angle)和距离。
Guidance (制导律):使用比例导引律(Proportional Navigation)计算所需的法向过载(Normal Acceleration Command)。
Airframe & Autopilot (弹体与自动驾驶仪):将过载指令转换为舵偏角,控制导弹姿态。

重建模型的步骤

你可以按照以下步骤在 Simulink 中手动搭建:

输入模块:
Target Position:使用 Constant 或 Inport 模块输入目标坐标 [X_t, Z_t]。
TargetPos:连接到 Seeker/Tracker。
Seeker/Tracker 子系统:
输入:目标位置、导弹位置。
功能:计算视线角 lambda 和相对距离 R。
输出:Look Angle、Range、Missile to Target Separation。
Guidance 子系统:
输入:视线角 lambda、视线角速度 dot{lambda}、速度 V_c。
逻辑:比例导引律公式 a_c = N cdot V_c cdot dot{lambda}。
输出:Az_d(法向过载指令)。
Airframe & Autopilot 子系统:
输入:Az_d。
功能:使用 PID 控制器跟踪过载指令,输出舵偏角 delta。
输出:Missile Position、Missile Attitude。

关键代码实现

比例导引律 (Guidance)

这是制导系统的核心算法,通常写在 MATLAB Function Block 中。

function ac = fcn(lambda_dot, Vc, N)
% 比例导引律
% lambda_dot: 视线角速度 (rad/s)
% Vc: 导弹速度 (m/s)
% N: 导引律增益 (通常取 3~5)
% ac: 需要的法向加速度 (m/s^2)

ac = N * Vc * lambda_dot;
end

视线角计算 (Seeker)

function [lambda, R] = fcn(Xm, Zm, Xt, Zt)
% 计算视线角和距离
% (Xm, Zm): 导弹位置
% (Xt, Zt): 目标位置

dX = Xt - Xm;
dZ = Zt - Zm;

R = sqrt(dX^2 + dZ^2); % 距离
lambda = atan2(dZ, dX); % 视线角 (弧度)
end

该模型包含详细的注释和参数设置,非常适合学习导弹制导原理。

以上内容涵盖了该导弹制导系统模型的重建方法与核心算法实现。
在这里插入图片描述
.wrl 或 .x3d 文件:这是三维模型的几何描述文件。
Simulink 模型配置:将动力学数据连接到 3D Animation 模块。

三维模型代码 (.wrl 文件)

这是该导弹模型的 VRML 代码。你可以将其保存为 missile.wrl 文件。

VRML V2.0 utf8

Group {
children [
Transform {
translation 0 0 0
children [
Shape {
appearance Appearance {
material Material {
diffuseColor 0.8 0 0 # 红色
specularColor 1 1 1
shininess 0.5
}
}
geometry Cone {
bottomRadius 0.1
height 0.5
side TRUE
bottom TRUE
}
}
]
}
Transform {
translation 0 0 -0.5
children [
Shape {
appearance Appearance {
material Material {
diffuseColor 0.8 0 0 # 红色
specularColor 1 1 1
shininess 0.5
}
}
geometry Cylinder {
radius 0.05
height 1.0
side TRUE
top FALSE
bottom FALSE
}
}
]
}
Transform {
translation 0 0 -1.0
rotation 1 0 0 1.57
children [
Shape {
appearance Appearance {
material Material {
diffuseColor 0.8 0 0 # 红色
specularColor 1 1 1
shininess 0.5
}
}
geometry Cylinder {
radius 0.08
height 0.2
}
}
]
}
Transform {
translation 0 0 -1.0
rotation 0 1 0 1.57
children [
Shape {
appearance Appearance {
material Material {
diffuseColor 0 0 0.8 # 蓝色
specularColor 1 1 1
shininess 0.5
}
}
geometry Cylinder {
radius 0.08
height 0.2
}
}
]
}
]
}

Simulink 配置代码 (MATLAB Script)

function create_3d_guidance_view
% 创建一个新的 Simulink 模型
modelName = ‘missile_3d_view’;
new_system(modelName);

% 添加 VR Sink 模块 (用于显示 3D 动画)
add_block('vrSink', [modelName '/VR Sink']);

% 设置 VR Sink 的参数
% 假设你已经保存了上面的导弹模型为 'missile.wrl'
set_param([modelName '/VR Sink'], 'VRLanguage', '1'); % VRML
set_param([modelName '/VR Sink'], 'VRWorldName', 'missile.wrl');

% 添加输入端口 (用于接收导弹的位置和姿态)
% 例如: [x, y, z, phi, theta, psi]
add_block('simulink/Sources/In1', [modelName '/Input']);

% 连接输入到 VR Sink
% 注意: 这里的索引取决于 VR Sink 的输入端口设置
% 通常 1-3 是位置, 4-6 是欧拉角
add_line(modelName, 'Input/1', 'VR Sink/1');

% 设置仿真参数
set_param(modelName, 'Solver', 'ode45');
set_param(modelName, 'StopTime', '10');

% 打开模型
open_system(modelName);

disp('3D 导弹视图模型已创建。');
disp('请将制导系统的输出 (位置/姿态) 连接到此模型的输入。');

end

如何使用

保存模型:将上面的 VRML 代码保存为 missile.wrl。
运行脚本:在 MATLAB 中运行 create_3d_guidance_view 函数。
连接数据:将你上一条消息中的 aero_guidance 模型的输出(导弹位置和姿态)连接到这个新模型的 In1 端口。
在这里插入图片描述

核心代码逻辑

这段代码模拟了一个简单的比例导引制导过程,计算了位置、过载、攻角等参数。

function missile_guidance_simulation()
% ==========================================
% 参数设置
% ==========================================
clc; clear; close all;

% 初始条件
R0 = 4000;      % 初始距离 (m)
Vt = 300;       % 目标速度 (m/s)
Vm = 600;       % 导弹速度 (m/s)
N = 3;          % 制导律增益 (比例导引系数)
t_sim = 3;      % 仿真时间 (s)
dt = 0.01;      % 步长

% 初始化变量
t = 0:dt:t_sim;
nt = length(t);
R = zeros(1, nt); R(1) = R0;
Vc = Vm - Vt;   % 接近速度
a_cmd = zeros(1, nt); % 法向过载指令
alpha = zeros(1, nt); % 攻角
M = zeros(1, nt);     % 马赫数
Nz = zeros(1, nt);    % 法向过载
X_target = Vt * t;    % 假设目标沿X轴匀速直线运动
X_missile = zeros(1, nt);

% ==========================================
% 仿真循环 (简化动力学模型)
% ==========================================
for i = 2:nt
    % 1. 距离变化 (简单的相对运动)
    R(i) = R(i-1) - Vc * dt;

    % 2. 比例导引律计算过载指令
    % 简化假设视线角速率与距离变化相关
    lambda_dot = 0.5 * sin(pit(i)/t_sim); % 模拟视线角速率变化
    a_cmd(i) = N * Vc * lambda_dot;         % 比例导引公式 a_cmd = N * Vc * lambda_dot

    % 3. 攻角计算 (假设一阶关系)
    alpha(i) = a_cmd(i) / (0.5 * 1.225 * Vm^2 * 0.1); % 简化的气动公式

    % 4. 马赫数变化 (模拟发动机推力与阻力平衡)
    M(i) = 3 + 0.2 * sin(pit(i)/t_sim);

    % 5. 导弹位置积分
    X_missile(i) = X_missile(i-1) + Vm * cos(alpha(i)) * dt;
end

% ==========================================
% 绘图 (复现你的截图)
% ==========================================

figure('Position', [100, 100, 800, 600]);

% --- 图1: 位置 (左上角) ---
subplot(2,3,1);
plot(X_target, -t*1000, 'b--', 'LineWidth', 1.5); hold on;
plot(X_missile, -t*1000, 'r-', 'LineWidth', 1.5);
xlabel('X [m]'); ylabel('Time [ms]');
legend('Target', 'Missile');
title('Target vs Missile Position');
grid on; axis([0 4000 -3000 0]);

% --- 图2: 法向过载 (中上) ---
subplot(2,3,2);
plot(t, a_cmd, 'b', 'LineWidth', 1.5);
xlabel('Time [Sec]'); ylabel('Normal Acceleration [g]');
title('Normal Acceleration');
grid on;

% --- 图3: 攻角 (右上) ---
subplot(2,3,3);
plot(t, rad2deg(alpha), 'b', 'LineWidth', 1.5);
xlabel('Time [Sec]'); ylabel('Incidence alpha [deg]');
title('Angle of Attack');
grid on;

% --- 图4: 视线角/模式切换 (左下) ---
subplot(2,3,4);
plot(t, 0.sin(2p2t), 'b--', 'LineWidth', 1.5); hold on;
plot(t, 0.cos(2p2t), 'r-', 'LineWidth', 1.5);
plot(1.5, 0.05, 'kx', 'MarkerSize', 8); % 模式切换点
xlabel('Time [Sec]'); ylabel('Angle [rad]');
legend('True Look Angle', 'Gimbal Angle', 'Mode Changes');
grid on;

% --- 图5: 马赫数 (中下) ---
subplot(2,3,5);
plot(t, M, 'b', 'LineWidth', 1.5);
xlabel('Time [Sec]'); ylabel('Mach Number');
title('Mach Number');
grid on;

% --- 图6: 法向过载需求 (右下) ---
subplot(2,3,6);
plot(t, a_cmd, 'b', 'LineWidth', 1.5);
xlabel('Time [Sec]'); ylabel('Fn Demands [deg]');
title('Fn Demands');
grid on;

end

关键模块的 Simulink 实现代码 (MATLAB Function)

如果你是在 Simulink 中构建这个制导律,核心的 Guidance 模块通常包含以下逻辑(使用 MATLAB Function 模块):

function Nz_cmd = fcn(lambda_dot, Vc, N)
% 比例导引律 (Proportional Navigation)
% 输入:
% lambda_dot: 视线角速率 (rad/s)
% Vc: 导弹与目标的相对速度 (m/s)
% N: 制导律增益 (通常 3-5)
% 输出:
% Nz_cmd: 法向过载指令

% — 比例导引公式 —
% a_cmd = N * Vc * lambda_dot
Nz_cmd = N * Vc * lambda_dot;

% — 限幅处理 (防止过载过大) —
if Nz_cmd > 20
Nz_cmd = 20;
elseif Nz_cmd < -20
Nz_cmd = -20;
end

end

代码说明

左上角 (位置图):X_target 和 X_missile 的积分计算。注意 Y 轴是时间倒置的(-t),这在导弹拦截图中很常见,表示时间流逝。
中上角 (法向过载):核心是比例导引律 a_cmd = N * Vc * lambda_dot。随着距离接近(R 减小)和视线角速率变大,过载需求急剧增加。
右上角 (攻角):通常与法向过载成正比,但在末端由于速度极高或气动特性,可能会出现饱和或振荡。
左下角 (模式切换):红色的 x 标记通常代表导引头的模式切换(例如从搜索模式切换到跟踪模式,或滤波器参数切换)。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐