#if NEVER // 使用编译指令确保此文件永远不会被编译
// Matlab/Simulink集成示例代码 - .NET Assembly直接调用方式
//
// 【适用场景】
// - Matlab R2019b或更高版本
// - 需要在Simulink模型中集成威胁源仿真
// - 实时仿真数据交换和时间同步
//
// 【前置条件】
// 1. 将 ThreatSource.dll 放入 Matlab 路径或指定目录
// 2. 将 data/ 目录复制到 Matlab 工作目录下
// 3. Matlab版本支持 .NET 8.0
//
// 展示如何将Matlab/Simulink与ThreatSource仿真系统集成
// 需要实现的核心功能: .NET Assembly加载、数据交换、时间同步
using ThreatSource.Simulation;
using ThreatSource.Data;
using ThreatSource.Missile;
using ThreatSource.Equipment;
using ThreatSource.Utils;
using System;
using System.Collections.Generic;
///
/// Matlab/Simulink适配器类,演示如何将威胁源库集成到Matlab/Simulink中
///
///
/// 该类提供以下功能:
/// - .NET Assembly方式的Matlab集成
/// - 简化的API接口,便于Matlab调用
/// - 实时数据交换和状态同步
/// - 事件处理和回调机制
/// - 与Simulink时间步长的协调
/// 本示例代码作为集成参考,可根据具体需求进行修改
///
public class MatlabSimulinkAdapter
{
#region 私有字段
///
/// 仿真管理器实例
///
private ISimulationManager _simulationManager;
///
/// 数据管理器实例
///
private ThreatSourceDataManager _dataManager;
///
/// Matlab创建的实体映射
///
private Dictionary _matlabEntities = new Dictionary();
///
/// 当前仿真时间
///
private double _currentTime = 0.0;
///
/// 仿真时间步长
///
private double _timeStep = 0.01;
///
/// 是否已初始化
///
private bool _isInitialized = false;
#endregion
#region 构造函数
///
/// 初始化Matlab/Simulink适配器的新实例
///
public MatlabSimulinkAdapter()
{
InitializeSimulation();
}
///
/// 初始化仿真系统
///
private void InitializeSimulation()
{
try
{
// 创建仿真管理器
_simulationManager = new SimulationManager();
// 创建数据管理器
_dataManager = new ThreatSourceDataManager();
Console.WriteLine("[MatlabAdapter] 威胁源仿真系统初始化完成");
}
catch (Exception ex)
{
Console.WriteLine($"[MatlabAdapter] 初始化失败: {ex.Message}");
throw;
}
}
#endregion
#region Matlab公共接口
///
/// 启动仿真系统
///
/// 仿真时间步长(秒)
/// 启动是否成功
public bool StartSimulation(double timeStep = 0.01)
{
try
{
if (!_isInitialized)
{
_timeStep = timeStep;
_simulationManager.StartSimulation(timeStep);
_isInitialized = true;
Console.WriteLine($"[MatlabAdapter] 仿真已启动,时间步长: {timeStep}s");
}
return true;
}
catch (Exception ex)
{
Console.WriteLine($"[MatlabAdapter] 启动仿真失败: {ex.Message}");
return false;
}
}
///
/// 更新仿真状态(在Simulink中每个时间步调用)
///
/// 时间步长
/// 更新是否成功
public bool UpdateSimulation(double deltaTime)
{
try
{
if (!_isInitialized) return false;
_simulationManager.Update(deltaTime);
_currentTime += deltaTime;
return true;
}
catch (Exception ex)
{
Console.WriteLine($"[MatlabAdapter] 仿真更新失败: {ex.Message}");
return false;
}
}
///
/// 创建目标实体(供Matlab调用)
///
/// 实体ID
/// X坐标
/// Y坐标
/// Z坐标
/// X方向速度
/// Y方向速度
/// Z方向速度
/// 创建是否成功
public bool CreateTarget(string entityId, double posX, double posY, double posZ,
double velX, double velY, double velZ)
{
try
{
var targetPos = new Vector3D(posX, posY, posZ);
var targetVel = new Vector3D(velX, velY, velZ);
var tankInitialMotion = new KinematicState
{
Position = targetPos,
Orientation = new Orientation(0, 0, Math.Atan2(velY, velX)),
Speed = targetVel.Magnitude()
};
var tankProperties = new EquipmentProperties
{
InfraredRadiationIntensity = 10.0,
UltravioletRadiationIntensity = 10.0,
MillimeterWaveRadiationIntensity = 10.0
};
var tank = new Tank(entityId, tankProperties, tankInitialMotion, _simulationManager);
_simulationManager.RegisterEntity(entityId, tank);
_matlabEntities[entityId] = tank;
Console.WriteLine($"[MatlabAdapter] 成功创建目标: {entityId}");
return true;
}
catch (Exception ex)
{
Console.WriteLine($"[MatlabAdapter] 创建目标失败: {ex.Message}");
return false;
}
}
///
/// 创建红外成像制导导弹
///
/// 导弹ID
/// 发射位置X
/// 发射位置Y
/// 发射位置Z
/// 目标ID
/// 创建是否成功
public bool CreateIRMissile(string entityId, double posX, double posY, double posZ, string targetId)
{
try
{
var launchPos = new Vector3D(posX, posY, posZ);
var missileInitialMotion = new KinematicState
{
Position = launchPos,
Orientation = new Orientation(0, 0, 0),
Speed = 100
};
var properties = new MissileProperties
{
MaxSpeed = 1000,
MaxFlightTime = 100,
MaxFlightDistance = 10000,
MaxAcceleration = 50,
ProportionalNavigationCoefficient = 3,
Mass = 100,
ExplosionRadius = 10,
HitProbability = 0.9,
Type = MissileType.InfraredImagingTerminalGuidance
};
var guidanceConfig = new InfraredImagingGuidanceConfig
{
JammingResistanceThreshold = 1e-3
};
var missile = new InfraredImagingTerminalGuidanceMissile(
entityId, properties, missileInitialMotion, guidanceConfig, _simulationManager);
if (!string.IsNullOrEmpty(targetId))
{
missile.SetTarget(targetId);
}
_simulationManager.RegisterEntity(entityId, missile);
_matlabEntities[entityId] = missile;
Console.WriteLine($"[MatlabAdapter] 成功创建红外导弹: {entityId}");
return true;
}
catch (Exception ex)
{
Console.WriteLine($"[MatlabAdapter] 创建红外导弹失败: {ex.Message}");
return false;
}
}
///
/// 创建毫米波制导导弹
///
/// 导弹ID
/// 发射位置X
/// 发射位置Y
/// 发射位置Z
/// 目标ID
/// 创建是否成功
public bool CreateMMWMissile(string entityId, double posX, double posY, double posZ, string targetId)
{
try
{
var launchPos = new Vector3D(posX, posY, posZ);
var missileInitialMotion = new KinematicState
{
Position = launchPos,
Orientation = new Orientation(0, 0, 0),
Speed = 100
};
var properties = new MissileProperties
{
MaxSpeed = 1000,
MaxFlightTime = 100,
MaxFlightDistance = 10000,
MaxAcceleration = 50,
ProportionalNavigationCoefficient = 3,
Mass = 100,
ExplosionRadius = 10,
HitProbability = 0.9,
Type = MissileType.MillimeterWaveTerminalGuidance
};
var guidanceConfig = new MillimeterWaveGuidanceConfig
{
FieldOfViewAngle = 30,
TransmitPower = 0.5,
AntennaGainDB = 25,
WaveFrequency = 94e9
};
var missile = new MillimeterWaveTerminalGuidedMissile(
entityId, properties, missileInitialMotion, guidanceConfig, _simulationManager);
if (!string.IsNullOrEmpty(targetId))
{
missile.SetTarget(targetId);
}
_simulationManager.RegisterEntity(entityId, missile);
_matlabEntities[entityId] = missile;
Console.WriteLine($"[MatlabAdapter] 成功创建毫米波导弹: {entityId}");
return true;
}
catch (Exception ex)
{
Console.WriteLine($"[MatlabAdapter] 创建毫米波导弹失败: {ex.Message}");
return false;
}
}
///
/// 获取实体状态(供Matlab调用)
///
/// 实体ID
/// 状态数组 [x, y, z, vx, vy, vz, roll, pitch, yaw, isActive]
public double[] GetEntityState(string entityId)
{
try
{
var entity = _simulationManager.GetEntityById(entityId);
if (entity is ISimulationElement simElement)
{
return ConvertToMatlabStateArray(simElement);
}
return new double[10]; // 返回零数组
}
catch (Exception ex)
{
Console.WriteLine($"[MatlabAdapter] 获取实体状态失败: {ex.Message}");
return new double[10];
}
}
///
/// 设置实体位置(供Matlab调用)
///
/// 实体ID
/// X坐标
/// Y坐标
/// Z坐标
/// 设置是否成功
public bool SetEntityPosition(string entityId, double posX, double posY, double posZ)
{
try
{
var entity = _simulationManager.GetEntityById(entityId);
if (entity is ISimulationElement simElement)
{
simElement.KState.Position = new Vector3D(posX, posY, posZ);
return true;
}
return false;
}
catch (Exception ex)
{
Console.WriteLine($"[MatlabAdapter] 设置实体位置失败: {ex.Message}");
return false;
}
}
///
/// 获取所有实体ID列表(供Matlab调用)
///
/// 实体ID字符串数组
public string[] GetAllEntityIds()
{
try
{
var allEntities = _simulationManager.GetAllEntities();
var entityIds = new List();
foreach (var entity in allEntities)
{
if (entity is ISimulationElement simElement)
{
entityIds.Add(simElement.Id);
}
}
return entityIds.ToArray();
}
catch (Exception ex)
{
Console.WriteLine($"[MatlabAdapter] 获取实体列表失败: {ex.Message}");
return new string[0];
}
}
///
/// 停止仿真
///
public void StopSimulation()
{
try
{
_simulationManager.StopSimulation();
_isInitialized = false;
_matlabEntities.Clear();
_currentTime = 0.0;
Console.WriteLine("[MatlabAdapter] 仿真已停止");
}
catch (Exception ex)
{
Console.WriteLine($"[MatlabAdapter] 停止仿真失败: {ex.Message}");
}
}
///
/// 获取当前仿真时间
///
/// 当前仿真时间(秒)
public double GetCurrentTime()
{
return _currentTime;
}
///
/// 检查实体是否存在
///
/// 实体ID
/// 实体是否存在
public bool EntityExists(string entityId)
{
var entity = _simulationManager.GetEntityById(entityId);
return entity != null;
}
#endregion
#region 私有辅助方法
///
/// 将仿真元素转换为Matlab状态数组
///
/// 仿真元素
/// 状态数组 [x, y, z, vx, vy, vz, roll, pitch, yaw, isActive]
private double[] ConvertToMatlabStateArray(ISimulationElement element)
{
var pos = element.KState.Position;
var ori = element.KState.Orientation;
var speed = element.KState.Speed;
// 计算速度分量
var vx = speed * Math.Cos(ori.Yaw) * Math.Cos(ori.Pitch);
var vy = speed * Math.Sin(ori.Yaw) * Math.Cos(ori.Pitch);
var vz = speed * Math.Sin(ori.Pitch);
return new double[]
{
pos.X, pos.Y, pos.Z, // 位置 [0-2]
vx, vy, vz, // 速度 [3-5]
ori.Roll, ori.Pitch, ori.Yaw, // 姿态 [6-8]
element.IsActive ? 1.0 : 0.0 // 活动状态 [9]
};
}
#endregion
}
///
/// Matlab/Simulink仿真示例类
///
///
/// 该类演示了:
/// - Matlab/Simulink仿真系统的初始化
/// - 适配器的配置和使用
/// - 典型的导弹-目标仿真场景
/// 用于指导实际项目中的集成实现
///
public class MatlabSimulinkExample
{
private MatlabSimulinkAdapter _adapter;
///
/// 初始化示例
///
public void Initialize()
{
_adapter = new MatlabSimulinkAdapter();
Console.WriteLine("Matlab/Simulink ThreatSource集成示例初始化完成");
}
///
/// 运行基本仿真示例
///
public void RunBasicSimulationExample()
{
try
{
// 启动仿真系统
if (!_adapter.StartSimulation(0.01))
{
Console.WriteLine("仿真启动失败");
return;
}
// 创建目标
bool targetCreated = _adapter.CreateTarget(
"target_001",
5000, 0, 1000, // 位置: 5km距离,1km高度
-50, 0, 0 // 速度: 50m/s向西移动
);
if (!targetCreated)
{
Console.WriteLine("目标创建失败");
return;
}
// 创建红外制导导弹
bool missileCreated = _adapter.CreateIRMissile(
"missile_001",
0, 0, 100, // 发射位置: 起始位置,100m高度
"target_001" // 目标ID
);
if (missileCreated)
{
Console.WriteLine("基本仿真示例场景创建成功");
// 运行仿真步骤示例
for (int i = 0; i < 10; i++)
{
_adapter.UpdateSimulation(0.01);
// 获取导弹状态
var missileState = _adapter.GetEntityState("missile_001");
Console.WriteLine($"时间: {_adapter.GetCurrentTime():F2}s, 导弹位置: [{missileState[0]:F1}, {missileState[1]:F1}, {missileState[2]:F1}]");
// 在实际Simulink中,这里会是Simulink的时间步进
System.Threading.Thread.Sleep(10);
}
}
else
{
Console.WriteLine("导弹创建失败");
}
}
catch (Exception ex)
{
Console.WriteLine($"运行仿真示例失败: {ex.Message}");
}
}
///
/// 运行多导弹仿真示例
///
public void RunMultiMissileExample()
{
try
{
// 启动仿真
_adapter.StartSimulation(0.01);
// 创建多个目标
_adapter.CreateTarget("target_001", 3000, 1000, 800, -30, -10, 0);
_adapter.CreateTarget("target_002", 4000, -500, 1200, -40, 20, 0);
// 创建不同类型的导弹
_adapter.CreateIRMissile("ir_missile_001", 0, 0, 100, "target_001");
_adapter.CreateMMWMissile("mmw_missile_001", 100, 0, 100, "target_002");
Console.WriteLine("多导弹仿真示例场景创建成功");
// 显示所有实体
var entityIds = _adapter.GetAllEntityIds();
Console.WriteLine($"仿真中共有 {entityIds.Length} 个实体:");
foreach (var id in entityIds)
{
Console.WriteLine($" - {id}");
}
}
catch (Exception ex)
{
Console.WriteLine($"运行多导弹示例失败: {ex.Message}");
}
}
///
/// 清理资源
///
public void Cleanup()
{
_adapter?.StopSimulation();
Console.WriteLine("Matlab/Simulink ThreatSource集成示例已清理");
}
}
#endif // 结束编译指令块