基于MATLAB的BTT导弹六自由度(6DOF)模块化全过程仿真系统 - README
项目简介
本项目构建了一个高保真的倾斜转弯 (Bank-to-Turn, BTT) 导弹六自由度数值仿真环境。系统采用模块化设计,基于MATLAB平台开发,旨在解耦动力学、制导、控制、气动、推力及环境等子系统。通过本项目,用户可以模拟导弹从发射、巡航到末端攻击的全弹道过程,深入研究BTT控制逻辑及六自由度建模原理。
功能特性
- 高精度求解器:采用四阶龙格-库塔 (RK4) 积分算法,确保微分方程求解的精度与稳定性。
- 全自由度建模:基于刚体这一物理模型,包含平动(位置、速度)与转动(姿态、角速度)的完整六自由度解算。
- 防死锁姿态解算:全程使用四元数 (Quaternion) 进行姿态更新,有效避免欧拉角描述下的万向节死锁问题。
- BTT制导控制策略:
* 实现了“滚转以转弯”的经典BTT逻辑。
* 包含比例导引 (PNG) 制导律。
* 设计了基于PID的三通道自动驾驶仪(滚转、俯仰、偏航)。
- 变质量动力学:仿真模型考虑了燃料消耗导致的质量变化及转动惯量变化。
- 详细数据记录:记录飞行全过程中的状态量、指令量、气动量及弹目相对信息,便于后续分析。
系统要求
- MATLAB R2016b 或更高版本
- 无需额外工具箱 (基于基础MATLAB函数实现)
使用方法
直接运行
main.m 脚本即可启动仿真。
程序将自动执行以下流程:
- 初始化导弹参数、初始状态及目标状态。
- 进入时间步进循环,进行制导解算与动力学积分。
- 在控制台实时输出仿真进度(时间、距离、马赫数、高度)。
- 仿真结束后调用绘图函数展示结果(注:绘图功能需参考项目中具体的
Plot_Results 实现)。
---
核心代码与算法分析 (main.m)
main.m 是系统的核心入口与调度中心,其实际功能逻辑如下:
1. 仿真初始化 (Initialization)
程序首先定义了仿真的基本时空框架与物理参数:
- 时间参数:设定仿真步长为
0.001s (1kHz),最大时长 20s。 - 导弹物理模型:定义了发射质量 (120kg)、秒流量 (5kg/s)、发动机工作时间 (8s) 以及参考几何尺寸和转动惯量。
- 初始状态:设定导弹位于高度5000m,初速300m/s,初始姿态平飞。
- 坐标系定义:使用NED (北东地) 作为地面惯性系,状态向量包含位置、体轴系速度、四元数及角速度。
2. 制导与控制回路 (GNC Loop)
在时间主循环中,代码实现了完整的制导控制逻辑:
A. 导引律 (Guidance Law)
采用比例导引律 (PNG):
- 计算弹目相对距离
R_mag 与相对速度 V_rel。 - 计算视线角速率
Omega_LOS。 - 根据导航比
N=4.0 计算惯性系下的需用加速度 acc_cmd_n。 - 将加速度指令投影至弹体坐标系,得到侧向
n_yc 和垂向 n_zc 过载指令。
B. BTT 逻辑 (Bank-to-Turn Logic)
实现了将全方向的制导指令转化为BTT控制指令的核心算法:
- 滚转策略:计算合力方向
phi_err = atan2(n_yc, -n_zc)。目的是通过滚转导弹,使弹体-Z轴(升力方向)对准所需的加速度矢量方向。 - 过载分配:侧向通道目标是消除侧向过载(使其趋于0),俯仰通道负责提供全部的合成过载
n_lat_total。 - 死区逻辑:当指令过载小于 5.0m/s² 时,锁定滚转角,防止小幅值指令引起姿态高频抖动。
C. 自动驾驶仪 (Autopilot)
设计了三个通道的控制器来执行BTT逻辑:
- 滚转通道 (Roll):采用PD控制器。根据
phi_err 计算滚转角速率指令 p_cmd,驱动副翼 (de) 消除滚转误差。代码中包含了滚转速率限幅。 - 俯仰通道 (Pitch):采用PID结构的过载驾驶仪。根据总需用过载
az_cmd (负的合成过载) 与当前运动状态反馈,计算升降舵偏角 (de)。包含简化的攻角增稳逻辑。 - 偏航通道 (Yaw):侧滑角镇定控制器。通过反馈侧滑角 (近似值
v/u) 和偏航角速度 r,计算方向舵偏角 (dr),以实现协调转弯 (Coordinated Turn),尽量保持侧滑角为零。
3. 注意事项与保护机制
- 舵偏限幅:所有气动舵面的偏转角度被限制在 $pm 25$ 度以内。
- 终止条件:
*
命中判定:当弹目距离小于 10m 且仿真时间大于 1.0s 时,判定为命中。
*
坠地判定:当高度坐标 (NED系下的Z轴) 大于 10m 时,判定为坠地。
4. 动力学解算 (RK4 Integration)
代码使用标准的四阶龙格-库塔法求解非线性微分方程组:
- 在每个积分步长内,假设舵偏控制量保持不变 (零阶保持器)。
- 调用
Dynamics_Model 函数四次 (k1 到 k4) 计算状态导数。 - 四元数归一化:每次积分更新后,强制对四元数进行归一化处理,防止数值积分误差累积导致姿态矩阵非正交。
---
关键子函数说明
Dynamics_Model (动力学模型)
该函数是物理引擎的核心,负责计算导弹的状态导数
dState:
- 变质量计算:根据当前时间判断发动机是否工作。若在工作时间内,实时更新导弹质量及转动惯量
Ixx, Iyy, Izz;若燃料耗尽,则锁定为空弹质量。 - 受力分析:
* 调用
Calculate_Forces_Moments (外部函数) 获取气动力和气动力矩。
* 计算重力,并利用四元数构建的旋转矩阵将其转换至弹体坐标系。
* 计算推力,假设推力恒定沿弹体X轴作用。
- 微分方程组:
*
位置微分:将体轴系速度转换回地面惯性系。
*
速度微分:基于牛顿第二定律,包含科里奥利项 (Omega x V)。
*
姿态微分:基于四元数运动学方程求解。
*
角速度微分:基于欧拉动力学方程 (Euler's equations for rigid body dynamics)。