Simulink导弹制导系统仿真 模型文件 使用指南 视频讲解
Simulink导弹制导系统仿真
模型文件
使用指南
视频讲解
模型主要功能
该模型模拟了导弹拦截目标的过程,包含三个主要子系统:
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 标记通常代表导引头的模式切换(例如从搜索模式切换到跟踪模式,或滤波器参数切换)。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)