diff --git a/CHANGELOG.md b/CHANGELOG.md index 5466ae0..5b51e0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,6 @@ - 处理不同时间步长的协调 - dll 库的接口有效性验证 - 所有威胁源的参数规范化,增加默认参数配置 -- 同步 dll 库的文档,api 文档、使用说明、工作原理 - 规范第三方仿真环境使用 dll 库的场景和事件类型 ## [1.1.22] - 2025-05-26 @@ -24,7 +23,9 @@ - 完善了导引头的朝向控制逻辑和导弹的朝向控制逻辑 - 给装备增加了可选参数 - 完善了末敏弹子弹的朝向和传感器运动状态 +- 增加了命中概率的计算和实现 - 增加了导弹运动状态的随机噪声,并根据飞行阶段设置不同的噪声系数 +- 同步 dll 库的文档,api 文档、使用说明、工作原理 ## [1.1.21] - 2025-05-24 - 增加了升力加速度的计算 diff --git a/ThreatSource/src/Data/ThreatSourceDataManager.cs b/ThreatSource/src/Data/ThreatSourceDataManager.cs index 9721698..d35e5e7 100644 --- a/ThreatSource/src/Data/ThreatSourceDataManager.cs +++ b/ThreatSource/src/Data/ThreatSourceDataManager.cs @@ -1,5 +1,6 @@ using Tomlyn; using System.Diagnostics; +using System.Reflection; namespace ThreatSource.Data { @@ -16,9 +17,15 @@ namespace ThreatSource.Data public class ThreatSourceDataManager { /// - /// 默认数据目录路径 + /// 默认数据目录名称 /// - private static readonly string DATA_PATH = "../data"; + private static readonly string DEFAULT_DATA_FOLDER = "data"; + + /// + /// 回退数据目录路径(向后兼容) + /// + private static readonly string FALLBACK_DATA_PATH = "data"; + private static readonly TomlModelOptions _tomlOptions = new() { ConvertPropertyName = name => name @@ -30,16 +37,71 @@ namespace ThreatSource.Data private readonly Dictionary _equipments = []; private readonly Dictionary _weathers = []; private readonly Dictionary _jammers = []; + + /// + /// 获取数据目录路径 + /// 优先使用DLL上级目录的data文件夹,如果不存在则回退到相对路径 + /// + /// 数据目录的绝对路径 + private static string GetDataPath() + { + try + { + // 获取当前程序集(DLL)的位置 + var assemblyLocation = Assembly.GetExecutingAssembly().Location; + if (!string.IsNullOrEmpty(assemblyLocation)) + { + // 获取DLL所在目录的父目录 + var dllDirectory = Path.GetDirectoryName(assemblyLocation); + if (!string.IsNullOrEmpty(dllDirectory)) + { + var parentDirectory = Directory.GetParent(dllDirectory)?.FullName; + if (!string.IsNullOrEmpty(parentDirectory)) + { + var dataPath = Path.Combine(parentDirectory, DEFAULT_DATA_FOLDER); + + Debug.WriteLine($"[ThreatSourceDataManager] DLL位置: {assemblyLocation}"); + Debug.WriteLine($"[ThreatSourceDataManager] 解析的data目录: {dataPath}"); + + if (Directory.Exists(dataPath)) + { + Debug.WriteLine($"[ThreatSourceDataManager] 使用自动解析的data目录: {dataPath}"); + return dataPath; + } + else + { + Debug.WriteLine($"[ThreatSourceDataManager] 自动解析的data目录不存在: {dataPath}"); + } + } + } + } + } + catch (Exception ex) + { + Debug.WriteLine($"[ThreatSourceDataManager] 自动路径解析失败: {ex.Message}"); + } + + // 回退到原始的相对路径(向后兼容) + Debug.WriteLine($"[ThreatSourceDataManager] 回退使用相对路径: {FALLBACK_DATA_PATH}"); + return FALLBACK_DATA_PATH; + } + /// /// 初始化威胁源数据管理器 /// - /// 可选的数据目录路径 + /// 可选的数据目录路径,如果为null则使用智能路径解析 public ThreatSourceDataManager(string? dataPath = null) { if (dataPath != null) + { + Debug.WriteLine($"[ThreatSourceDataManager] 使用用户指定的data路径: {dataPath}"); LoadData(dataPath); + } else - LoadData(DATA_PATH); + { + var resolvedPath = GetDataPath(); + LoadData(resolvedPath); + } } /// @@ -48,6 +110,8 @@ namespace ThreatSource.Data /// 数据目录路径 private void LoadData(string path) { + Debug.WriteLine($"[ThreatSourceDataManager] 开始从路径加载数据: {Path.GetFullPath(path)}"); + LoadMissiles(Path.Combine(path, "missiles")); LoadIndicators(Path.Combine(path, "indicators")); LoadWarners(Path.Combine(path, "warners")); diff --git a/docs/articles/intro.md b/docs/articles/intro.md index 496dc0b..f068828 100644 --- a/docs/articles/intro.md +++ b/docs/articles/intro.md @@ -1,23 +1,66 @@ -# 入门指南 +# 使用说明 + +**版本:1.1.22** ## 安装和使用 ### C#/.NET 版本 +#### 1. 下载和部署 + 1. 下载 ThreatSourceLibrary 包并解压 -2. 将以下文件复制到你的项目目录(建议放在 lib 文件夹下): - - ThreatSource.dll - 主要的库文件 - - ThreatSource.deps.json - 依赖配置文件 - - ThreatSource.xml - API 文档文件 +2. 按照以下标准结构部署文件: + +``` +MyApplication/ +├── MyApp.exe # 您的应用程序 +├── lib/ # DLL库目录 +│ ├── ThreatSource.dll # 主要的库文件 +│ ├── ThreatSource.deps.json # 依赖配置文件 +│ ├── ThreatSource.xml # API 文档文件 +│ └── AirTransmission.dll # 依赖库 +└── data/ # 配置数据目录 + ├── missiles/ # 导弹配置文件 + │ ├── laser_semi_active/ + │ ├── laser_beam_rider/ + │ ├── ir_command/ + │ ├── ir_imaging/ + │ ├── mmw/ + │ ├── terminal_sensitive/ + │ └── composite/ + ├── indicators/ # 指示器配置文件 + │ ├── laser_designators/ + │ ├── laser_beam_riders/ + │ └── ir_trackers/ + ├── equipments/ # 目标设备配置文件 + ├── jammers/ # 干扰机配置文件 + ├── weathers/ # 天气配置文件 + └── warners/ # 告警器配置文件 +``` 3. 在 Visual Studio 中添加引用: - 右键项目 -> 添加 -> 引用 - - 浏览 -> 选择 ThreatSource.dll + - 浏览 -> 选择 lib/ThreatSource.dll -4. 在代码中使用: +#### 2. 数据配置管理 + +威胁源库使用智能路径解析系统,会自动在DLL上级目录查找 `data` 文件夹。您也可以手动指定数据路径: + +```csharp +// 使用自动路径解析(推荐) +var dataManager = new ThreatSourceDataManager(); + +// 或手动指定数据路径 +var dataManager = new ThreatSourceDataManager("C:/MyApp/configs"); +``` + +#### 3. 基本使用示例 ```csharp using ThreatSource.Simulation; +using ThreatSource.Data; +using ThreatSource.Equipment; +using ThreatSource.Utils; class Program { @@ -25,46 +68,76 @@ class Program { try { - // 创建仿真管理器 + // 1. 创建仿真管理器 var simulationManager = new SimulationManager(); - // 创建导弹配置 - var missileProperties = new MissileProperties + // 2. 创建数据管理器和工厂 + var dataManager = new ThreatSourceDataManager(); + var factory = new ThreatSourceFactory(dataManager, simulationManager); + + // 3. 创建目标 + var targetInitialState = new KinematicState { - Id = "missile1", - InitialPosition = new Vector3D(0, 0, 0), - InitialVelocity = new Vector3D(0, 0, 0), - MaxSpeed = 1000, - MaxAcceleration = 10, - MaxFlightTime = 30, - MaxFlightDistance = 5000, - Mass = 50 + Position = new Vector3D(1000, 0, 100), + Orientation = new Orientation(0, 0, 0), + Speed = 0 }; - // 创建导弹实例 - var missile = new TerminalSensitiveMissile( - "target1", - missileProperties, - simulationManager - ); + var targetProperties = new EquipmentProperties + { + InfraredRadiationIntensity = 100.0, + MillimeterWaveRadiationIntensity = 50.0 + }; - // 注册实体 + var target = new Tank("target1", targetProperties, targetInitialState, simulationManager); + + // 4. 创建导弹(使用工厂模式) + var launchParams = new KinematicState + { + Position = new Vector3D(0, 0, 0), + Orientation = new Orientation(0, 0, 0), + Speed = 100 + }; + + // 使用配置文件中的导弹型号 + var missile = factory.CreateMissile("missile1", "lsgm_001", "target1", launchParams); + + // 5. 注册实体到仿真管理器 + simulationManager.RegisterEntity(target.Id, target); simulationManager.RegisterEntity(missile.Id, missile); - // 激活并发射导弹 + // 6. 激活实体 + target.Activate(); missile.Activate(); + + // 7. 发射导弹 missile.Fire(); - // 仿真主循环 - double deltaTime = 0.01; - while (missile.IsActive) + // 8. 启动仿真 + simulationManager.StartSimulation(0.01); // 10ms时间步长 + + // 9. 仿真主循环 + double totalTime = 0; + double maxTime = 60; // 最大仿真时间60秒 + + while (missile.IsActive && totalTime < maxTime) { - missile.Update(deltaTime); + simulationManager.Update(0.01); + totalTime += 0.01; + + // 可选:输出状态信息 + if ((int)(totalTime * 100) % 100 == 0) // 每秒输出一次 + { + Console.WriteLine($"时间: {totalTime:F1}s, 导弹位置: {missile.KState.Position}"); + } } + + // 10. 停止仿真 + simulationManager.StopSimulation(); } catch (Exception ex) { - Trace.TraceError($"Error: {ex.Message}"); + Console.WriteLine($"错误: {ex.Message}"); } } } @@ -81,7 +154,7 @@ C++项目有两种使用方式: 1. 下载 ThreatSourceNative 包并解压 2. 将 bin 目录下的所有 DLL 文件复制到程序目录 3. 将 include/threat_source.h 添加到项目中 -4. 使用 C 风格接口调用库功能 +4. 按照标准结构部署数据文件 示例代码: @@ -96,17 +169,17 @@ int main() { return 1; } - // 创建导弹 + // 创建导弹(使用配置文件) const char* missile_id = "missile1"; - int result = TS_CreateMissile( + const char* missile_model = "lsgm_001"; // 激光半主动制导导弹 + const char* target_id = "target1"; + + int result = TS_CreateMissileFromConfig( missile_id, + missile_model, + target_id, 0, 0, 0, // 初始位置 - 0, 0, 0, // 初始速度 - 1000, // 最大速度 - 10, // 最大加速度 - 30, // 最大飞行时间 - 5000, // 最大飞行距离 - 50 // 质量 + 0, 0, 0 // 初始朝向 ); if (result != THREATSOURCE_SUCCESS) { @@ -151,25 +224,23 @@ int main() { ```cpp using namespace System; using namespace ThreatSource::Simulation; +using namespace ThreatSource::Data; int main() { try { - // 创建仿真管理器 + // 创建仿真管理器和数据管理器 auto manager = gcnew SimulationManager(); + auto dataManager = gcnew ThreatSourceDataManager(); + auto factory = gcnew ThreatSourceFactory(dataManager, manager); - // 创建导弹配置 - auto properties = gcnew MissileProperties(); - properties->Id = "missile1"; - properties->InitialPosition = Vector3D(0, 0, 0); - properties->InitialVelocity = Vector3D(0, 0, 0); - properties->MaxSpeed = 1000; - properties->MaxAcceleration = 10; - properties->MaxFlightTime = 30; - properties->MaxFlightDistance = 5000; - properties->Mass = 50; + // 创建发射参数 + auto launchParams = gcnew KinematicState(); + launchParams->Position = Vector3D(0, 0, 0); + launchParams->Orientation = Orientation(0, 0, 0); + launchParams->Speed = 100; - // 创建导弹 - auto missile = gcnew TerminalSensitiveMissile("target1", properties, manager); + // 使用工厂创建导弹 + auto missile = factory->CreateMissile("missile1", "lsgm_001", "target1", launchParams); manager->RegisterEntity(missile->Id, missile); // 激活并发射导弹 @@ -179,180 +250,251 @@ int main() { // 仿真主循环 double deltaTime = 0.01; while (missile->IsActive) { - missile->Update(deltaTime); + manager->Update(deltaTime); } return 0; } catch (Exception^ e) { - Trace::TraceError("Error: {0}", e->Message); + Console::WriteLine("错误: {0}", e->Message); return 1; } } ``` +## 支持的导弹类型 + +威胁源库支持以下导弹类型: + +### 1. 激光半主动制导导弹 (LaserSemiActiveGuidance) +- **工作原理**:利用目标反射的激光能量进行制导 +- **配置文件**:`data/missiles/laser_semi_active/` +- **制导特点**:需要激光目标指示器持续照射目标 + +### 2. 激光驾束制导导弹 (LaserBeamRiderGuidance) +- **工作原理**:沿着激光束路径飞行 +- **配置文件**:`data/missiles/laser_beam_rider/` +- **制导特点**:跟踪激光束中心线,使用PID控制 + +### 3. 红外指令制导导弹 (InfraredCommandGuidance) +- **工作原理**:通过红外信号接收指令进行制导 +- **配置文件**:`data/missiles/ir_command/` +- **制导特点**:导弹发射红外信号,地面测角仪跟踪并发送指令 + +### 4. 红外成像末制导导弹 (InfraredImagingTerminalGuidance) +- **工作原理**:末段使用红外成像进行自主制导 +- **配置文件**:`data/missiles/ir_imaging/` +- **制导特点**:自主目标识别和跟踪 + +### 5. 毫米波末制导导弹 (MillimeterWaveTerminalGuidance) +- **工作原理**:末段使用毫米波雷达进行自主制导 +- **配置文件**:`data/missiles/mmw/` +- **制导特点**:全天候作战能力,抗干扰性强 + +### 6. 末敏弹 (TerminalSensitiveMissile) +- **工作原理**:母弹释放子弹,子弹螺旋扫描攻击目标 +- **配置文件**:`data/missiles/terminal_sensitive/` +- **制导特点**:多传感器融合,智能目标识别 + +### 7. 复合制导导弹 (CompositeGuidance) +- **工作原理**:集成多种制导方式,可串行或并行工作 +- **配置文件**:`data/missiles/composite/` +- **制导特点**:高可靠性,多重制导保障 + +## 配置文件格式 + +威胁源库使用TOML格式的配置文件。以下是激光半主动制导导弹的配置示例: + +```toml +# 激光半主动制导导弹配置示例 +Type = "LaserSemiActiveGuidance" + +[Name] +zh = "激光半主动制导导弹-001" +en = "Laser Semi-Active Guidance Missile-001" + +[Properties] +Type = "LaserSemiActiveGuidance" +MaxSpeed = 800.0 # 最大速度 (m/s) +MaxFlightTime = 60.0 # 最大飞行时间 (秒) +MaxFlightDistance = 4000.0 # 最大飞行距离 (米) +MaxAcceleration = 50.0 # 最大加速度 (m/s²) +ProportionalNavigationCoefficient = 3.0 # 比例导引系数 +LaunchAcceleration = 100.0 # 发射加速度 (m/s²) +MaxEngineBurnTime = 0.1 # 发动机燃烧时间 (秒) +CruiseTime = 5.0 # 巡航时间 (秒) +Mass = 22.0 # 质量 (kg) +ExplosionRadius = 5.0 # 爆炸半径 (米) +HitProbability = 0.9 # 命中概率 +SelfDestructHeight = 0.0 # 自毁高度 (米) + +[LaserSemiActiveGuidanceConfig] +MaxDetectionRange = 5000.0 # 最大探测距离 (米) +FieldOfViewAngle = 30.0 # 视场角 (度) +LockThreshold = 1.0e-12 # 锁定阈值 (瓦特) +ReflectionCoefficient = 0.2 # 反射系数 +TargetReflectiveArea = 1.0 # 目标反射面积 (平方米) +``` + ## 基本用法 -### 初始化仿真管理器 +### 初始化仿真系统 ```csharp +// 创建仿真管理器 var simulationManager = new SimulationManager(); + +// 创建数据管理器(自动路径解析) +var dataManager = new ThreatSourceDataManager(); + +// 创建工厂 +var factory = new ThreatSourceFactory(dataManager, simulationManager); ``` -### 创建导弹 - -```csharp -// 创建导弹配置 -var missileProperties = new MissileProperties -{ - Id = "missile1", - InitialPosition = new Vector3D(0, 0, 0), - InitialOrientation = new Orientation(0, 0, 0), - InitialSpeed = 800, - MaxSpeed = 1000, - MaxFlightTime = 30, - MaxFlightDistance = 5000, - MaxAcceleration = 10, - Mass = 50 -}; - -// 创建导弹实例 -var missile = new TerminalSensitiveMissile("target1", missileProperties, simulationManager); -``` - -### 创建目标 +### 创建和配置实体 ```csharp // 创建目标 -var tank = new Tank( - "target1", - new Vector3D(1000, 0, 0), - Math.PI/4, - simulationManager -); -``` +var targetState = new KinematicState +{ + Position = new Vector3D(1000, 0, 100), + Orientation = new Orientation(0, 0, 0), + Speed = 0 +}; -### 注册实体 +var targetProperties = new EquipmentProperties +{ + InfraredRadiationIntensity = 100.0, + MillimeterWaveRadiationIntensity = 50.0 +}; -```csharp -simulationManager.RegisterEntity(missile.Id, missile); -simulationManager.RegisterEntity(tank.Id, tank); +var target = new Tank("target1", targetProperties, targetState, simulationManager); + +// 创建导弹(从配置文件) +var launchParams = new KinematicState +{ + Position = new Vector3D(0, 0, 0), + Orientation = new Orientation(0, 0, 0), + Speed = 100 +}; + +var missile = factory.CreateMissile("missile1", "lsgm_001", "target1", launchParams); ``` ### 运行仿真 ```csharp +// 注册实体 +simulationManager.RegisterEntity(target.Id, target); +simulationManager.RegisterEntity(missile.Id, missile); + // 激活实体 +target.Activate(); missile.Activate(); -tank.Activate(); // 发射导弹 missile.Fire(); -// 仿真主循环 -double deltaTime = 0.01; +// 启动仿真 +simulationManager.StartSimulation(0.01); + +// 仿真循环 while (missile.IsActive) { - missile.Update(deltaTime); - tank.Update(deltaTime); + simulationManager.Update(0.01); } + +// 停止仿真 +simulationManager.StopSimulation(); ``` -## C++使用指南 +### 事件处理 -### C++/CLI基本用法 - -#### 1. 创建包装类 - -```cpp -using namespace System; -using namespace ThreatSource::Simulation; - -public ref class SimulationWrapper +```csharp +// 订阅导弹命中事件 +simulationManager.SubscribeToEvent(evt => { -private: - SimulationManager^ manager; - -public: - SimulationWrapper() - { - manager = gcnew SimulationManager(); - } - - void CreateAndRunSimulation() - { - try - { - // 创建导弹配置 - auto properties = gcnew MissileProperties(); - properties->Id = "missile1"; - properties->InitialPosition = Vector3D(0, 0, 0); - properties->InitialSpeed = 800; - properties->MaxSpeed = 1000; - properties->MaxFlightTime = 30; - properties->MaxFlightDistance = 5000; - properties->MaxAcceleration = 10; - properties->Mass = 50; + Console.WriteLine($"目标 {evt.TargetId} 被导弹 {evt.SenderId} 命中"); +}); - // 创建导弹 - auto missile = gcnew TerminalSensitiveMissile("target1", properties, manager); - - // 注册和激活 - manager->RegisterEntity(missile->Id, missile); - missile->Activate(); - missile->Fire(); - - // 仿真主循环 - double deltaTime = 0.01; - while (missile->IsActive) - { - missile->Update(deltaTime); - } - } - catch (Exception^ e) - { - Trace::TraceError("错误: {0}", e->Message); - } - } -}; +// 订阅导弹爆炸事件 +simulationManager.SubscribeToEvent(evt => +{ + Console.WriteLine($"导弹在位置 {evt.Position} 爆炸"); +}); ``` -#### 2. 在原生C++代码中使用 +## 数据管理 -```cpp -int main() +### 获取可用配置 + +```csharp +var dataManager = new ThreatSourceDataManager(); + +// 获取所有可用的导弹型号 +var availableMissiles = dataManager.GetAvailableMissiles(); +foreach (var missileId in availableMissiles) { - try - { - auto simulation = gcnew SimulationWrapper(); - simulation->CreateAndRunSimulation(); - return 0; - } - catch (Exception^ e) - { - Trace::TraceError("错误: {0}", e->Message); - return 1; - } + Console.WriteLine($"可用导弹: {missileId}"); } + +// 获取特定导弹的配置 +var missileData = dataManager.GetMissile("lsgm_001"); +Console.WriteLine($"导弹类型: {missileData.Type}"); +Console.WriteLine($"最大速度: {missileData.Properties.MaxSpeed} m/s"); ``` -### 注意事项 +### 自定义数据路径 -1. 内存管理 - - C++/CLI使用垃圾回收 - - 使用gcnew创建托管对象 - - 注意托管和非托管资源的混合使用 +```csharp +// 指定自定义数据路径 +var customDataManager = new ThreatSourceDataManager("/path/to/custom/data"); -2. 错误处理 - - 使用托管异常处理(try/catch) - - 异常信息更详细,更容易调试 - - 可以直接使用.NET的日志机制 +// 或在运行时切换 +var dataManager = new ThreatSourceDataManager(); +// 数据会自动从 DLL上级目录/data 加载 +``` -3. 类型系统 - - 使用托管类型(^) - - 注意值类型和引用类型的区别 - - 使用安全的类型转换 +## 部署要求 + +### 最低系统要求 +- .NET 8.0 或更高版本 +- Windows 10 或更高版本(推荐) +- 至少 100MB 可用磁盘空间 + +### 依赖项 +- Tomlyn (TOML解析库) +- AirTransmission (空气传播计算库) + +### 部署检查清单 +1. ✅ 确保DLL文件在正确位置 +2. ✅ 确保数据文件按标准结构组织 +3. ✅ 确保配置文件格式正确(TOML) +4. ✅ 确保应用程序有读取数据目录的权限 +5. ✅ 测试自动路径解析功能 ## 更多示例 -更多示例请参考[示例代码](../examples/Simulation/README.md)。 +更多详细示例和高级用法请参考: +- [仿真示例](../examples/Simulation/README.md) +- [集成示例](../examples/Integration/) +- [配置文件示例](../examples/Configs/) + +## 故障排除 + +### 常见问题 + +1. **数据文件未找到** + - 检查数据目录结构是否正确 + - 确认DLL和数据目录的相对位置 + - 查看调试输出中的路径解析信息 + +2. **配置文件解析错误** + - 检查TOML文件语法 + - 确认必需字段是否存在 + - 查看错误日志获取详细信息 + +3. **导弹创建失败** + - 确认导弹型号在配置文件中存在 + - 检查配置文件的完整性 + - 验证制导系统配置是否正确 diff --git a/docs/articles/reference.md b/docs/articles/reference.md index ef60569..039ad34 100644 --- a/docs/articles/reference.md +++ b/docs/articles/reference.md @@ -1,31 +1,346 @@ -# 导弹工作原理 +# 导弹工作原理参考手册 -## 末敏弹工作过程 +**版本:1.1.22** -### 工作阶段 +本文档详细介绍威胁源库中实现的各种导弹制导系统的工作原理和技术特点。 -1. 母弹抛撒阶段 +## 1. 激光半主动制导导弹 + +### 1.1 工作原理 + +激光半主动制导导弹通过接收目标反射的激光能量进行制导,是一种精确制导武器系统。 + +### 1.2 工作阶段 + +1. **发射阶段** + - 导弹发射,发动机点火 + - 初始化制导系统 + - 准备接收激光照射信号 + +2. **巡航阶段** + - 导弹按预定轨迹飞行 + - 制导系统处于待机状态 + - 等待激光指示器照射目标 + +3. **制导阶段** + - 激光指示器开始照射目标 + - 四象限探测器接收反射激光 + - 计算光斑偏移量 + - 生成制导指令修正飞行轨迹 + +4. **攻击阶段** + - 导弹接近目标 + - 引爆战斗部 + - 完成攻击任务 + +### 1.3 关键技术 + +1. **四象限探测器** + - 精确测量光斑位置偏移 + - 提供水平和垂直误差信号 + - 灵敏度可调节 + +2. **激光编码识别** + - 支持多种编码方式 + - 防止敌方激光干扰 + - 确保制导信号可靠性 + +3. **比例导引控制** + - 使用比例导引律计算制导加速度 + - 加速度平滑处理,减少突变 + - 最大加速度限制保护 + +### 1.4 技术特点 + +- **制导精度高**:四象限探测器提供高精度角度测量 +- **抗干扰能力强**:激光编码技术防止干扰 +- **全天候作战**:不受天气影响(轻微衰减) +- **需要持续照射**:激光指示器必须持续照射目标 + +## 2. 激光驾束制导导弹 + +### 2.1 工作原理 + +激光驾束制导导弹沿着激光束的中心线飞行,通过检测与激光束的偏差进行轨迹修正。 + +### 2.2 工作阶段 + +1. **发射阶段** + - 导弹发射进入激光束 + - 激光束探测器开始工作 + - 建立初始制导基准 + +2. **驾束飞行阶段** + - 持续检测与激光束中心线的偏差 + - PID控制器计算修正指令 + - 实时调整飞行轨迹 + +3. **末段制导阶段** + - 接近目标区域 + - 提高制导精度 + - 准备攻击 + +### 2.3 关键技术 + +1. **激光束偏差检测** + - 计算导弹与激光束中心线的距离 + - 实时监测偏差变化 + - 提供三维位置修正信号 + +2. **PID控制系统** + - 比例控制:响应当前偏差 + - 积分控制:消除稳态误差 + - 微分控制:预测偏差变化趋势 + +3. **非线性增益控制** + - 根据偏差大小调整控制增益 + - 大偏差时快速响应 + - 小偏差时精确控制 + +### 2.4 技术特点 + +- **轨迹可控**:严格按照激光束路径飞行 +- **精度极高**:PID控制提供精确轨迹跟踪 +- **实时响应**:快速响应轨迹偏差 +- **需要连续制导**:激光束必须持续到命中 + +## 3. 红外指令制导导弹 + +### 3.1 工作原理 + +红外指令制导系统由导弹和地面红外测角仪组成,通过红外信号建立通信链路,实现制导控制。 + +### 3.2 工作阶段 + +1. **红外信号建立阶段** + - 导弹发射后点亮红外热源 + - 红外测角仪探测导弹红外信号 + - 建立跟踪链路 + +2. **双目标跟踪阶段** + - 红外测角仪同时跟踪导弹和目标 + - 计算两者的相对位置关系 + - 生成制导指令 + +3. **指令传输阶段** + - 测角仪通过事件系统发送制导指令 + - 导弹接收并解析指令 + - 更新飞行轨迹 + +4. **制导执行阶段** + - 计算期望飞行方向 + - 应用转向速率平滑 + - 执行轨迹修正 + +### 3.3 关键技术 + +1. **红外测角仪跟踪** + - 具备一定的最大跟踪距离 + - 具有较大的视场角 + - 高精度角度测量 + - 高频率更新 + +2. **制导指令计算** + - 计算测角仪到导弹的向量 + - 计算测角仪到目标的向量 + - 生成三维制导指令 + +3. **导弹制导控制** + - 转向速率平滑处理 + - 提前量计算 + - 自适应制导参数调整 + +### 3.4 技术特点 + +- **远程制导**:地面测角仪提供远程制导能力 +- **双目标跟踪**:同时跟踪导弹和目标 +- **指令制导**:实时传输制导指令 +- **需要通信链路**:依赖红外通信链路 + +## 4. 红外成像末制导导弹 + +### 4.1 工作原理 + +红外成像末制导导弹通过红外成像探测器实现目标的自动探测、识别和跟踪,具备完全自主的制导能力。 + +### 4.2 工作阶段 + +1. **搜索阶段** + - 大视场角搜索目标 + - 红外图像生成和处理 + - 目标初步探测 + +2. **跟踪阶段** + - 切换到小视场角 + - 精确跟踪已发现目标 + - 目标类型识别 + +3. **锁定阶段** + - 确认目标类型 + - 持续精确跟踪 + - 执行末段制导 + +### 4.3 关键技术 + +1. **红外图像生成** + - 高分辨率图像采集 + - 考虑目标温度、距离、大气衰减 + - 背景噪声和干扰处理 + +2. **目标识别算法** + - 信噪比计算和阈值判断 + - 目标特征提取和匹配 + - 识别概率评估 + +3. **多模式工作** + - Search模式:大视场搜索 + - Track模式:小视场跟踪 + - Lock模式:锁定制导 + +4. **比例导引控制** + - 目标状态估计 + - 运动预测 + - 制导加速度计算 + +### 4.4 技术特点 + +- **完全自主**:无需外部制导信号 +- **目标识别**:具备目标类型识别能力 +- **抗干扰**:对烟幕、红外干扰有一定抗性 +- **末段精确**:末段制导精度高 + +## 5. 毫米波末制导导弹 + +### 5.1 工作原理 + +毫米波末制导导弹使用毫米波雷达进行目标探测和跟踪,具备全天候作战能力和强抗干扰性。 + +### 5.2 工作阶段 + +1. **雷达开机阶段** + - 毫米波雷达系统启动 + - 天线开始扫描 + - 建立探测基准 + +2. **目标搜索阶段** + - 大范围扫描搜索目标 + - 雷达回波信号处理 + - 目标初步定位 + +3. **目标跟踪阶段** + - 锁定目标进行跟踪 + - 连续测量目标位置 + - 计算目标运动参数 + +4. **末制导阶段** + - 精确跟踪目标 + - 实时轨迹修正 + - 引导导弹命中目标 + +### 5.3 关键技术 + +1. **毫米波雷达系统** + - 工作在毫米波频段 + - 具备一定的探测距离 + - 高精度角度分辨率 + +2. **信号处理** + - 雷达回波信号处理 + - 目标检测算法 + - 杂波抑制技术 + +3. **跟踪算法** + - 目标航迹建立 + - 运动状态估计 + - 预测滤波 + +### 5.4 技术特点 + +- **全天候作战**:不受天气条件影响 +- **强抗干扰**:对光电干扰免疫 +- **穿透能力强**:可穿透烟幕、雾霾 +- **探测距离远**:毫米波传播特性好 + +## 6. 复合制导导弹 + +### 6.1 工作原理 + +复合制导导弹集成多种制导方式,可以串行或并行工作,提供高可靠性和多重制导保障。 + +### 6.2 工作模式 + +1. **串行模式** + - 制导系统按优先级顺序激活 + - 前一个系统失效后切换到下一个 + - 提供制导冗余保障 + +2. **并行模式** + - 多个制导系统同时工作 + - 根据融合策略选择最优制导信号 + - 提高制导精度和可靠性 + +### 6.3 制导组件管理 + +1. **激活触发器** + - 发射时激活 + - 飞行时间触发 + - 距离触发 + - 前级完成触发 + +2. **制导切换逻辑** + - 最大获取制导时间限制 + - 最小稳定制导时间要求 + - 失效后继续链条选项 + +### 6.4 典型配置 + +1. **激光+红外复合制导** + - 第一阶段:激光半主动制导 + - 第二阶段:红外成像末制导 + - 提供远程精确+末段自主能力 + +2. **毫米波+红外复合制导** + - 第一阶段:毫米波末制导 + - 第二阶段:红外成像末制导 + - 提供全天候+高精度能力 + +### 6.5 技术特点 + +- **高可靠性**:多重制导保障 +- **适应性强**:适应不同作战环境 +- **精度高**:多系统融合提高精度 +- **复杂度高**:系统复杂,成本较高 + +## 7. 末敏弹 + +### 7.1 工作原理 + +末敏弹是一种智能子母弹,母弹在目标上空抛撒子弹,子弹通过螺旋扫描方式搜索和攻击地面目标。 + +### 7.2 工作阶段 + +1. **母弹抛撒阶段** - 母弹飞抵目标上空后,时间引信作用 - 启动抛射装置,将末敏子弹按一定距离抛撒出来 -2. 子弹减速阶段 +2. **子弹减速阶段** - 减速减旋装置动作,对子弹起减速、减旋、定向、稳向作用 - 启动热电池,达到规定值时开始对内部电子系统供电 -3. 第一期测距阶段 +3. **第一期测距阶段** - 子弹以大着角下落 - 在中央控制器控制下,测距雷达开始第1期测距 - 测定子弹到地面的距离 - 达到预定高度时,抛去减速减旋装置 - 稳定扫描装置动作,带动子弹旋转 -4. 第二期测距阶段 +4. **第二期测距阶段** - 稳定扫描装置带动末敏子弹稳态降落 - 在中央控制器控制下,测距雷达进行第2期测距 - 中央控制器完成对目标探测数据采集的准备工作 - 末敏子弹进入稳态扫描 -5. 目标探测阶段 +5. **目标探测阶段** - 末敏子弹进入威力有效高度 - 敏感探测器在中央控制器指令下进行工作扫描 - 在中央控制器控制下安保装置解除最后一道保险 @@ -33,25 +348,58 @@ - 第1次扫过目标后,向中央控制器报告目标信息 - 第2次扫过目标后,将目标敏感数据与特征值比较 -6. 攻击/自毁阶段 +6. **攻击/自毁阶段** - 如果第2次扫描确认是目标,且目标在威力窗口内: - 中央控制器下达指令起爆战斗部 - - 抛射出爆炸成形弹丸(EFP) - - EFP以大于2000m/s的高速射向目标 + - 抛射出爆炸成形弹丸 + - 高速弹丸射向目标 - 在目标来不及运动的瞬间命中并摧毁目标 - 如果第2次扫描判定为非目标: - 可以改换对象,继续探测其他潜在目标 - 如果一直没有发现目标: - 末敏子弹将在距离地面一定高度时自毁 -### 关键特性 +### 7.3 关键特性 -1. 扫描特性 +1. **扫描特性** - 抛出的末敏子弹在实施扫描时相距一定距离 - 各自的扫描区相互衔接 - 避免击中同一目标或漏掉目标 -2. 安全特性 +2. **安全特性** - 多重保险装置 - 高度自毁保护 - 稳定扫描控制 + +3. **智能特性** + - 自动目标识别 + - 双次扫描确认 + - 智能目标选择 + +### 7.4 技术特点 + +- **面杀伤能力**:一发母弹可攻击多个目标 +- **智能识别**:具备目标自动识别能力 +- **高杀伤效率**:高速弹丸杀伤力强 +- **适合集群目标**:特别适合攻击装甲集群 + +## 8. 技术对比总结 + +| 制导类型 | 制导精度 | 抗干扰性 | 自主性 | 全天候 | 复杂度 | 适用场景 | +|---------|---------|---------|--------|--------|--------|----------| +| 激光半主动 | 极高 | 中等 | 低 | 良好 | 中等 | 精确打击 | +| 激光驾束 | 极高 | 中等 | 低 | 良好 | 中等 | 精确制导 | +| 红外指令 | 高 | 中等 | 低 | 中等 | 中等 | 远程制导 | +| 红外成像 | 高 | 中等 | 高 | 中等 | 高 | 末段自主 | +| 毫米波 | 高 | 强 | 高 | 优秀 | 高 | 全天候作战 | +| 复合制导 | 极高 | 强 | 高 | 优秀 | 很高 | 高价值目标 | +| 末敏弹 | 中等 | 中等 | 高 | 良好 | 高 | 面目标攻击 | + +## 9. 应用建议 + +1. **精确点目标**:推荐激光半主动或激光驾束制导 +2. **高价值目标**:推荐复合制导系统 +3. **恶劣天气**:推荐毫米波制导 +4. **集群目标**:推荐末敏弹 +5. **远程打击**:推荐红外指令制导 +6. **自主作战**:推荐红外成像制导 diff --git a/docs/articles/threat-source-spec.md b/docs/articles/threat-source-spec.md index 5401aa2..c2c6f9b 100644 --- a/docs/articles/threat-source-spec.md +++ b/docs/articles/threat-source-spec.md @@ -1,5 +1,7 @@ # 威胁源仿真系统技术说明书 +**版本:1.1.22** + ## 1. 概述 ### 1.1 文档目的 @@ -8,8 +10,9 @@ 1. 各型导弹的工作原理和关键算法 2. 系统组件的交互机制和接口定义 -3. 关键参数的配置和验证方法 -4. 测试用例和验证流程 +3. 数据管理系统和配置文件格式 +4. 关键参数的配置和验证方法 +5. 测试用例和验证流程 本文档可用于: @@ -55,21 +58,37 @@ - 红外成像末制导导弹 - 毫米波末制导导弹 - 末敏弹 + - 复合制导导弹(多模制导) 2. 核心功能 - - 运动学仿真 + - 智能数据管理系统 + - TOML配置文件支持 + - 运动学仿真(基于KinematicState) - 制导控制仿真 - 目标交互仿真 - 传感器仿真 - 事件系统 - - 数据记录 + - 外部仿真集成 -3. 验证功能 +3. 数据管理功能 + - 智能路径解析 + - 多设备类型支持 + - 配置文件热加载 + - 数据验证和错误处理 + +4. 验证功能 - 单元测试验证 - 系统集成验证 - 性能指标验证 - 数据分析验证 +5. 新增功能(1.1.22版本) + - SwerlingRCS回波模型 + - 升力加速度计算系统 + - 命中概率计算 + - 运动状态随机噪声 + - 统一状态信息管理(ElementStatusInfo) + ### 1.4 参考文献 1. 导弹技术参考 @@ -98,66 +117,71 @@ #### 2.1.1 核心组件 -1. 实体管理系统 - - 实体注册与注销 - - 实体状态维护 - - 实体生命周期管理 - - 实体查询服务 +1. **数据管理系统 (ThreatSourceDataManager)** + - 智能路径解析:基于程序集位置自动查找数据目录 + - TOML配置文件加载:支持多种设备类型的配置 + - 数据缓存管理:内存中缓存已加载的配置数据 + - 错误处理和日志:详细的加载过程跟踪和错误报告 -2. 事件系统 - - 事件发布订阅 - - 事件分发处理 - - 事件队列管理 - - 事件记录服务 +2. **仿真管理系统 (SimulationManager)** + - 仿真状态控制:Running/Paused/Stopped状态管理 + - 时间同步控制:支持固定时间步长和外部时间同步 + - 实体更新调度:线程安全的实体状态更新 + - 天气系统集成:支持动态天气条件变化 + - 外部仿真适配:支持与Unity、UE等外部引擎集成 -3. 仿真管理器 - - 时间同步控制 - - 实体更新调度 - - 事件处理调度 - - 状态数据记录 +3. **事件系统** + - 发布订阅模式:类型安全的事件处理机制 + - 事件分发处理:高效的事件路由和分发 + - 事件队列管理:异步事件处理支持 + - 外部事件集成:支持与外部系统的事件交换 -4. 测试适配器 - - 测试事件记录 - - 测试实体管理 - - 测试数据采集 - - 测试结果验证 +4. **实体管理系统** + - 实体注册与注销:线程安全的实体生命周期管理 + - 实体状态维护:基于KinematicState的运动学状态管理 + - 实体查询服务:高效的实体检索和类型过滤 + - 碰撞检测:实体间的交互和碰撞处理 -#### 2.1.2 导弹组件 +#### 2.1.2 导弹组件架构 -1. 基础导弹类 - - 运动学模型 - - 状态管理 - - 事件处理 - - 自毁控制 +1. **基础导弹类 (BaseMissile)** + - 继承自SimulationElement基类 + - KinematicState运动学模型:位置、速度、朝向管理 + - 飞行阶段管理:Launch/Cruise/TerminalGuidance/Explode/SelfDestruct + - 制导系统引用:统一的制导系统管理 + - 升力加速度系统:LiftAcceleration计算和控制 + - 事件处理机制:制导事件的接收和响应 + - 自毁控制:基于时间、距离、高度的安全机制 -2. 制导系统 - - 激光半主动制导 - - 激光驾束制导 - - 红外指令制导 - - 红外成像末制导 - - 毫米波末制导 - - 末敏子弹制导 +2. **制导系统** + - 激光半主动制导 (LaserSemiActiveGuidanceSystem) + - 激光驾束制导 (LaserBeamRiderGuidanceSystem) + - 红外指令制导 (InfraredCommandGuidanceSystem) + - 红外成像末制导 (InfraredImagingTerminalGuidanceSystem) + - 毫米波末制导 (MillimeterWaveTerminalGuidanceSystem) + - 末敏子弹制导 (TerminalSensitiveSubmunitionGuidanceSystem) + - 复合制导 (CompositeGuidanceSystem) -3. 传感器系统 - - 激光探测器 - - 红外探测器 - - 毫米波雷达 - - 高度计 - - 多传感器融合 +3. **传感器系统** + - 激光探测器:四象限探测器、激光功率计算 + - 红外探测器:热成像、目标识别、信噪比计算 + - 毫米波雷达:目标探测、距离测量、抗干扰、SwerlingRCS模型 + - 高度计:精确高度测量、地形跟踪 + - 多传感器融合:数据融合算法、目标确认 -#### 2.1.3 目标组件 +#### 2.1.3 目标组件架构 -1. 基础目标类 - - 运动学模型 - - 状态管理 - - 事件处理 - - 伤害系统 +1. **基础目标类 (BaseTarget)** + - 继承自SimulationElement基类 + - 运动学模型:位置、速度、朝向的动态更新 + - 状态管理:生命值、伤害系统、销毁机制 + - 事件处理:目标辐射事件、命中事件的处理 -2. 目标特征 - - 红外辐射特征 - - 雷达散射特征 - - 激光反射特征 - - 毫米波特征 +2. **目标特征系统** + - 红外辐射特征:温度分布模式、辐射强度计算 + - 雷达散射特征:RCS模式、角度依赖性、SwerlingRCS模型 + - 激光反射特征:反射系数、有效反射面积 + - 毫米波特征:散射截面、频率响应 ### 2.2 坐标系统 @@ -170,24 +194,37 @@ - 原点:仿真场景中心 2. 导弹本体坐标系 - - X轴:指向导弹头部 - - Y轴:指向导弹右翼 - - Z轴:指向导弹上方 + - X轴:指向导弹右翼 + - Y轴:指向导弹上方 + - Z轴:指向导弹后方(**前向为-Z轴**) - 原点:导弹质心 -#### 2.2.2 角度定义 +#### 2.2.2 朝向系统 -1. 欧拉角 +1. Orientation欧拉角定义 - 偏航角(Yaw):绕Y轴旋转,范围[-π, π] - - 俯仰角(Pitch):绕Z轴旋转,范围[-π/2, π/2] - - 滚转角(Roll):绕X轴旋转,范围[-π, π] + - 俯仰角(Pitch):绕X轴旋转,范围[-π/2, π/2] + - 滚转角(Roll):绕Z轴旋转,范围[-π, π] -2. 视线角 - - 方位角:目标相对导弹的水平偏角 - - 俯仰角:目标相对导弹的垂直偏角 - - 旋转角:目标相对导弹的滚转角 +2. 前向向量计算 + - ToVector()方法返回-Z轴方向的单位向量 + - 默认朝向(0,0,0)对应世界坐标系的(0,0,-1) + - 使用右手坐标系和逆时针旋转约定 -#### 2.2.3 单位说明 +#### 2.2.3 运动学状态管理 + +1. KinematicState类 + - Position:三维位置向量 + - Orientation:欧拉角朝向 + - Velocity:三维速度向量 + - Speed:标量速度(自动与Velocity同步) + +2. 状态同步机制 + - Speed设置时自动更新Velocity方向 + - Velocity设置时自动更新Speed大小 + - Orientation与速度方向的智能关联 + +#### 2.2.4 单位说明 1. 空间单位 - 距离:米(m) @@ -200,1437 +237,2186 @@ - 事件时间戳:微秒(us) - 更新周期:秒(s) -### 2.3 数据流 - -#### 2.3.1 实体数据流 - -```mermaid -graph LR - A[实体] --> B[状态更新] - B --> C[仿真管理器] - C --> D[事件系统] - D --> E[其他实体] -``` - -1. 实体交互流程 - -```mermaid -graph LR - A[发射实体] --> B[事件系统] - B --> C[接收实体] - C --> D[状态更新] - D --> B -``` - -#### 2.3.2 事件数据流 - -1. 制导事件流 - -```mermaid -graph LR - A[制导设备] --> B[制导事件] - B --> C[事件系统] - C --> D[导弹] - D --> E[状态更新] -``` - -2. 打击事件流 - -```mermaid -graph LR - A[导弹] --> B[命中事件] - B --> C[事件系统] - C --> D[目标] - D --> E[状态更新/销毁事件] -``` - -#### 2.3.3 系统总体数据流 - -```mermaid -graph TB - subgraph 仿真管理器 - A[时间同步] --> B[实体管理] - B --> C[事件处理] - end - - subgraph 实体系统 - D[导弹] --> E[状态更新] - F[目标] --> E - G[制导设备] --> E - end - - subgraph 事件系统 - H[事件发布] --> I[事件分发] - I --> J[事件处理] - end - - E --> C - C --> H - J --> B -``` - -### 2.4 接口定义 - -#### 2.4.1 实体接口 - -1. 基础实体接口 - - Update(deltaTime):状态更新 - - GetStatus():获取状态 - - Activate():激活实体 - - Deactivate():停用实体 - -2. 导弹实体接口 - - Fire():发射导弹 - - Explode():引爆导弹 - - SelfDestruct():自毁导弹 - - GetGuidanceState():获取制导状态 - -#### 2.4.2 事件接口 - -1. 事件发布接口 - - PublishEvent(event):发布事件 - - SubscribeEvent(eventType, handler):订阅事件 - - UnsubscribeEvent(eventType, handler):取消订阅 - -2. 事件处理接口 - - HandleEvent(event):处理事件 - - GetEventHistory():获取事件历史 - - ClearEvents():清除事件记录 - -## 3. 导弹类型及特性 - -### 3.1 激光半主动制导导弹 - -#### 3.1.1 工作原理 - -激光半主动制导导弹系统由导弹和地面激光目标指示器组成,通过目标反射的激光能量实现制导控制。其基本工作过程如下: - -1. 激光照射建立 - - 激光目标指示器发射激光照射目标(功率由配置文件指定) - - 目标反射激光能量(反射系数0.2,有效反射面积1.0平方米) - - 导弹探测器接收反射激光能量 - - 计算接收功率并判断是否达到锁定阈值 - -2. 信号处理与制导 - - 激光目标指示器维持目标照射 - - 导弹探测器测量反射激光能量 - - 导弹计算目标相对位置 - - 生成制导指令 - -3. 制导控制执行 - - 导弹计算制导加速度 - - 执行比例导引控制 - - 实现轨迹修正 - - 激光目标指示器跟踪目标 - -#### 3.1.2 系统组成 - -##### 3.1.2.1 激光目标指示器 - -1. 发射参数 - - 激光功率:由配置文件指定 - - 发散角:0.3毫弧度(0.3mrad) - - 波长:由配置文件指定 - - 光束稳定性要求:优于0.1mrad - -2. 工作状态 - - 照射状态标志(IsIlluminating) - - 当前照射目标ID(TargetId) - - 目标指向方向(BeamDirection) - -3. 工作流程 - - 建立并维持激光照射 - - 跟踪目标更新照射方向 - - 监控目标反射 - - 持续输出直到任务结束 - -##### 3.1.2.2 导弹制导系统 (LaserSemiActiveGuidanceSystem) - -1. 激光探测器参数 - - 视场角:30度(π/6弧度) - - 探测器直径:0.1米 - - 聚焦光斑直径:0.003米 - - 锁定阈值:1e-12瓦特 - -2. 目标反射参数 - - 反射系数:0.2 - - 有效反射面积:1.0平方米 - -3. 飞行阶段 - - 发射阶段:0.1秒,准备探测激光 - - 巡航阶段:跟踪反射激光并执行制导 - - 爆炸阶段:命中目标后触发 - - 自毁阶段:满足条件时触发 - -#### 3.1.3 关键算法 - -1. 激光目标指示器控制算法 - - 目标照射控制: - - 激活时开启激光照射 - - 维护照射状态(IsIlluminationOn) - - 发布照射状态事件 - - 干扰处理: - - 计算干扰效果:20 * log10(干扰功率) - 20 * log10(距离) - 20 * log10(4π) - - 判断是否超过干扰阈值 - - 超过阈值时停止照射 - - 事件管理: - - 发布照射开始事件(LaserIlluminationStartEvent) - - 发布照射更新事件(LaserIlluminationUpdateEvent) - - 发布照射停止事件(LaserIlluminationStopEvent) - -2. 导弹信号处理算法 - 接收功率计算: - 1. 计算传播距离 - - 指示器到目标距离:激光指示器位置到目标位置的欧氏距离 - - 目标到导弹距离:目标位置到导弹位置的欧氏距离 - - 2. 计算光斑面积 - - 光斑面积计算公式:π * (传播距离* tan(发散角))² - - 发散角:0.3毫弧度(0.3mrad) - - 3. 计算目标反射 - - 目标处功率密度:入射激光功率/光斑面积 - - 目标反射功率:功率密度 * 有效反射面积 * 反射系数 - - 4. 计算接收功率 - - 反射光扩散面积:2π * 目标到导弹距离的平方 - - 导弹接收初始功率:反射功率/扩散面积 - - 探测器面积:π * (0.1/2)² 平方米 - - 功率接收比:min(1, 探测器面积/照射面积) - - 最终接收功率:初始功率 * 功率接收比 * 聚焦增益 - -3. 导弹制导控制算法 - - 比例导引控制: - - 最大加速度:100 m/s² - - 比例导引系数:由配置文件指定 - - 计算制导加速度 - - 限制最大加速度 - -注:以下功能在当前版本未实现,需要后续开发: - -- 光束编码识别:实现激光编码识别与解码 -- 大气透过率补偿:考虑大气衰减影响 -- 多目标分辨:实现多目标环境下的目标识别 -- 抗干扰增强:提高复杂电磁环境下的抗干扰能力 - -#### 3.1.4 系统事件流 - -1. 激光照射建立 - - 激光目标指示器发布LaserIlluminationStartEvent事件 - - 导弹接收事件并开始探测反射激光 - - 导弹进入跟踪状态 - -2. 制导过程 - - 激光目标指示器发布LaserIlluminationUpdateEvent事件 - - 导弹更新目标参数 - - 导弹执行制导控制 - -3. 制导终止 - - 激光目标指示器发布LaserIlluminationStopEvent事件 - - 导弹停止跟踪 - - 清理制导状态 - -#### 3.1.5 验证要点 - -1. 系统联动验证 - - 激光照射的稳定性 - - 导弹捕获反射光的可靠性 - - 制导响应的及时性 - -2. 跟踪性能验证 - - 目标照射精度 - - 导弹跟踪精度 - - 系统稳定性评估 - -注:以下功能在当前版本未实现,需要后续开发: - -- 编码信号识别与解码 -- 大气透过率影响 -- 复杂目标的散射效应 -- 抗干扰措施 -- 多目标分辨 -- 末段制导优化 - -### 3.2 激光驾束导弹 - -#### 3.2.1 工作原理 - -激光驾束导弹系统由导弹和地面激光驾束仪组成,通过激光束跟踪实现制导控制。其基本工作过程如下: - -1. 激光束建立 - - 激光驾束仪发射激光束形成制导光场 - - 导弹进入光场并探测激光能量 - - 激光驾束仪维持稳定的光束指向 - - 导弹探测器接收激光能量 - -2. 偏差检测与制导 - - 导弹探测器测量激光功率分布 - - 计算导弹到光束中心线的偏差 - - 激光驾束仪保持光束稳定性 - - 导弹计算修正加速度 - -3. 制导控制执行 - - 导弹执行偏差修正 - - 保持在光束中心线附近 - - 激光驾束仪跟踪目标 - - 导弹跟随光束飞向目标 - -#### 3.2.2 系统组成 - -##### 3.2.2.1 激光驾束仪 - -1. 发射参数 - - 激光功率:由配置文件指定 - - 光束发散角:由配置文件指定 - - 控制场直径:20米 - - 波束稳定性要求:优于0.1mrad - -2. 工作状态 - - 光束状态标志(IsBeamActive) - - 当前跟踪导弹ID(MissileId) - - 目标指向方向(BeamDirection) - -3. 工作流程 - - 建立并维持激光束 - - 跟踪目标更新光束方向 - - 监控导弹位置 - - 持续输出直到任务结束 - -##### 3.2.2.2 导弹制导系统 (LaserBeamRiderGuidanceSystem) - -1. 探测器参数 - - 探测器直径:0.1米 - - 最小可探测功率:1毫瓦(1e-3瓦特) - - 视场角:由配置文件指定 - -2. 控制参数 - - PID控制器参数 - - 比例系数(Kp):30,用于控制系统对误差的敏感度和响应速度 - - 积分系数(Ki):0.05,用于消除长期误差 - - 微分系数(Kd):5,用于减少超调量,提高系统稳定性 - - 非线性增益系数(Kc):0.5,用于控制偏移量修正 - - 最大加速度限制:50 m/s² - - 低通滤波系数(alpha):0.2 - -3. 飞行阶段 - - 发射阶段:0.01秒,准备进入光束 - - 巡航阶段:跟踪光束并执行制导 - - 爆炸阶段:命中目标后触发 - - 自毁阶段:满足条件时触发 - -#### 3.2.3 关键算法 - -1. 激光驾束仪控制算法 - - 目标跟踪:根据目标ID获取目标位置,计算并更新激光指向方向 - - 激光束控制:维护激光束的开启/关闭状态 - - 事件管理:发布激光束开始、更新和停止事件 - -2. 导弹制导控制算法 - - 偏差计算: - - 计算导弹到激光束中心线的最短距离向量 - - 检查是否在控制场范围内(直径20米) - - 功率计算: - - 光束面积:π * (控制场直径/2)² - - 功率密度:激光功率/光束面积 - - 接收功率:功率密度 * 探测器面积 - - 判断是否达到最小可探测功率(1e-3瓦特) - - PID控制: - - 比例控制:Kp = 30 - - 积分控制:Ki = 0.05 - - 微分控制:Kd = 5 - - 非线性增益:Kc = 0.5 - - 最大加速度限制:50 m/s² - -注:以下功能在当前版本未实现,需要后续开发: - -- 光束稳定性控制:通过伺服系统实现光束指向的精确控制 -- 功率密度分布优化:实现光束能量的最优分布 -- 激光束扫描调制:通过光束调制提高抗干扰能力 -- 多波束交织制导:使用多个光束提高制导可靠性 -- 复杂大气环境适应:考虑大气衰减、折射等影响 -- 抗干扰增强:增加光谱、空间和时间域的抗干扰措施 - -#### 3.2.4 系统事件流 - -1. 激光束建立 - - 激光驾束仪发布LaserBeamStartEvent事件 - - 导弹接收事件并开始寻光 - - 导弹进入跟踪状态 - -2. 制导过程 - - 激光驾束仪发布LaserBeamUpdateEvent事件 - - 导弹更新光束参数 - - 导弹执行偏差修正 - -3. 制导终止 - - 激光驾束仪发布LaserBeamStopEvent事件 - - 导弹停止跟踪 - - 清理制导状态 - -#### 3.2.5 验证要点 - -1. 系统联动验证 - - 光束建立的稳定性 - - 导弹捕获光束的可靠性 - - 制导响应的及时性 - -2. 跟踪性能验证 - - 光束跟踪精度 - - 导弹偏差控制精度 - - 系统稳定性评估 - -注:以下功能在当前版本未实现,需要后续开发: - -- 激光束扫描调制 -- 多波束交织制导 -- 复杂大气环境适应 -- 抗干扰增强 - -### 3.3 红外指令制导导弹 - -#### 3.3.1 工作原理 - -红外指令制导导弹系统由导弹和地面红外测角仪组成,通过红外信号实现制导控制。其基本工作过程如下: - -1. 红外信号建立 - - 导弹发射红外辐射信号(功率1000瓦特) - - 红外测角仪探测导弹红外信号 - - 红外测角仪同时跟踪目标 - - 计算导弹和目标的相对位置 - -2. 制导指令生成 - - 红外测角仪计算测角仪到导弹的向量 - - 红外测角仪计算测角仪到目标的向量 - - 红外测角仪生成制导指令 - - 通过事件系统发送给导弹 - -3. 制导控制执行 - - 导弹接收并解析制导指令 - - 计算期望飞行方向和提前量 - - 生成制导加速度 - - 执行轨迹修正 - -#### 3.3.2 系统组成 - -##### 3.3.2.1 红外测角仪 (InfraredTracker) - -1. 跟踪参数 - - 最大跟踪距离:由配置文件指定 - - 视场角:60度(π/3弧度) - - 角度测量精度:0.001弧度 - - 更新频率:10Hz - -2. 工作状态 - - 跟踪状态标志(IsTracking) - - 当前跟踪导弹ID(MissileId) - - 当前跟踪目标ID(TargetId) - -3. 工作流程 - - 接收导弹红外热源点亮事件(InfraredGuidanceMissileLightEvent) - - 计算导弹和目标的位置向量 - - 生成并发送制导指令事件(InfraredGuidanceCommandEvent) - - 持续更新直到接收熄灭事件(InfraredGuidanceMissileLightOffEvent) - -4. 事件处理 - - 导弹点亮事件:记录导弹ID,准备开始跟踪 - - 导弹熄灭事件:清除导弹ID,停止跟踪 - - 实体停用事件:清理跟踪状态 - -注:以下功能在当前版本未实现,需要后续开发: - -- 多目标跟踪:实现多个目标的同时跟踪 -- 目标识别增强:提高复杂背景下的目标识别能力 -- 抗干扰措施:增加对红外干扰的抵抗能力 -- 自适应跟踪:根据目标特性自动调整跟踪参数 - -##### 3.3.2.2 导弹制导系统 (InfraredCommandGuidanceSystem) - -1. 控制参数 - - 转向速率平滑因子:0.5(取值范围0.1~0.5) - - 提前量因子:0.3秒 - - 最大加速度:由配置文件指定 - - 制导系数:由配置文件指定 - -2. 飞行阶段 - - 发射阶段:0.1秒,点亮红外源 - - 巡航阶段:接收制导指令并执行 - - 爆炸阶段:命中目标后触发 - - 自毁阶段:满足条件时触发 - -#### 3.3.3 关键算法 - -1. 红外测角仪跟踪算法 - - 计算导弹到测角仪的距离 - - 检查是否在最大跟踪距离内 - - 计算测角仪到导弹的向量 - - 计算测角仪到目标的向量 - - 生成制导指令事件 - -2. 导弹制导控制算法 - - 计算瞬时转向速率 - - 应用速率平滑:turnRate = turnRate * (1-0.5) + instantTurnRate* 0.5 - - 计算带提前量的期望方向 - - 生成并限制制导加速度 - -#### 3.3.4 系统事件流 - -1. 导弹发射后点亮红外热源 - - 导弹发布InfraredGuidanceMissileLightEvent事件 - - 红外测角仪接收事件并记录导弹ID - - 红外测角仪开始跟踪过程 - -2. 制导过程中的指令传输 - - 红外测角仪发布InfraredGuidanceCommandEvent事件 - - 导弹接收事件并更新制导指令 - - 导弹执行轨迹修正 - -3. 制导终止 - - 导弹发布InfraredGuidanceMissileLightOffEvent事件 - - 红外测角仪接收事件并停止跟踪 - - 清理关联信息 - -#### 3.3.5 验证要点 - -1. 系统联动验证 - - 红外信号建立的及时性 - - 制导指令传输的可靠性 - - 导弹响应的准确性 - -2. 跟踪性能验证 - - 红外测角仪跟踪精度 - - 导弹机动响应特性 - - 系统稳定性评估 - -注:以下功能在当前版本未实现,需要后续开发: - -- 多目标分辨与切换 -- 复杂背景干扰抑制 -- 通信链路加密 -- 抗干扰增强 - -### 3.4 红外成像末制导导弹 - -#### 3.4.1 工作原理 - -红外成像末制导导弹系统通过红外成像探测器实现目标的自动探测和跟踪。其基本工作过程如下: - -1. 目标探测 - - 导弹搜索目标区域 - - 探测器接收目标红外辐射 - - 计算目标信噪比 - - 判断目标有效性 - -2. 图像处理与制导 - - 计算目标相对位置 - - 估计目标运动状态 - - 生成制导指令 - - 执行比例导引控制 - -3. 末段制导执行 - - 持续跟踪目标 - - 修正飞行轨迹 - - 接近目标后引爆 - - 达到条件时自毁 - -#### 3.4.2 系统组成 - -##### 3.4.2.1 红外成像制导系统 (InfraredImagingGuidanceSystem) - -1. 探测参数 - - 最大探测距离:5000米 - - 视场角:30度(π/6弧度) - - 目标识别概率:0.9 - - 识别信噪比阈值:6dB - - 背景辐射强度:10W/sr - -2. 工作状态 - - 目标探测状态 - - 制导状态标志 - - 上一次目标位置 - -3. 制导控制参数 - - 最大加速度:由配置文件指定 - - 比例导引系数:由配置文件指定 - -#### 3.4.3 飞行过程 - -1. 发射阶段 (Launch) - - 导弹发射 - - 系统初始化 - - 准备进入巡航 - -2. 巡航阶段 (Cruise) - - 飞向目标区域 - - 准备末制导 - - 距离目标1000米时转入末制导 - -3. 末制导阶段 (TerminalGuidance) - - 激活红外成像系统 - - 自主探测目标 - - 执行末段制导 - -4. 爆炸/自毁阶段 (Explode/SelfDestruct) - - 接近目标后引爆 - - 达到自毁条件时自毁 - -#### 3.4.4 关键算法 - -1. 目标探测算法 - - 距离检查:判断目标是否在最大探测距离(5000米)内 - - 角度检查:判断目标是否在视场角(30度)内 - - 信噪比计算:计算目标信噪比并与阈值(6dB)比较 - - 目标确认:根据识别概率(0.9)判断目标有效性 - -2. 制导控制算法 - - 目标状态估计:根据目标位置计算速度 - - 比例导引控制:使用配置的导引系数 - - 加速度限制:限制在最大加速度范围内 - -注:以下功能在当前版本未实现,需要后续开发: - -- 图像增强处理:提高复杂背景下的目标识别能力 -- 多目标识别:实现多目标环境下的目标识别和选择 -- 抗干扰增强:提高复杂电磁环境下的抗干扰能力 -- 自适应阈值:根据背景环境自动调整识别阈值 - -#### 3.4.5 验证要点 - -1. 探测性能验证 - - 最大探测距离 - - 视场角范围 - - 目标识别可靠性 - - 信噪比计算准确性 - -2. 制导性能验证 - - 目标跟踪精度 - - 制导响应及时性 - - 末段制导稳定性 - - 命中精度评估 - -### 3.5 毫米波末制导导弹 - -#### 3.5.1 工作原理 - -毫米波末制导导弹系统通过毫米波雷达实现目标的自主探测和跟踪。其基本工作过程如下: - -1. 目标探测 - - 导弹搜索目标区域 - - 毫米波雷达发射探测信号 - - 接收目标反射信号 - - 计算目标信噪比 - - 判断目标有效性 - -2. 信号处理与制导 - - 计算目标相对位置 - - 估计目标运动状态 - - 生成制导指令 - - 执行比例导引控制 - -3. 抗干扰处理 - - 检测干扰信号 - - 评估干扰效果 - - 采取抗干扰措施 - - 维持跟踪稳定性 - -#### 3.5.2 系统组成 - -##### 3.5.2.1 毫米波制导系统 (MillimeterWaveGuidanceSystem) - -1. 探测参数 - - 最大探测距离:5000米 - - 视场角:45度(π/4弧度) - - 目标识别概率:0.95 - - 识别信噪比阈值:6dB - - 工作频率:94GHz - - 脉冲持续时间:1微秒 - -2. 工作状态 - - 目标探测状态 - - 干扰状态标志(isJammed) - - 干扰功率记录 - - 上一次目标位置 - -3. 制导控制参数 - - 最大加速度:由配置文件指定 - - 比例导引系数:由配置文件指定 - -#### 3.5.3 飞行过程 - -1. 发射阶段 (Launch) - - 导弹发射 - - 系统初始化 - - 准备进入巡航 - -2. 巡航阶段 (Cruise) - - 飞向目标区域 - - 准备末制导 - - 距离目标8000米时转入末制导 - -3. 末制导阶段 (TerminalGuidance) - - 激活毫米波制导系统 - - 自主探测目标 - - 执行末段制导 - -4. 爆炸/自毁阶段 (Explode/SelfDestruct) - - 接近目标后引爆 - - 达到自毁条件时自毁 - -#### 3.5.4 关键算法 - -1. 目标探测算法 - - 距离检查:判断目标是否在最大探测距离(5000米)内 - - 角度检查:判断目标是否在视场角(45度)内 - - 信噪比计算:计算目标信噪比并与阈值(6dB)比较 - - 目标确认:根据识别概率(0.95)判断目标有效性 - -2. 制导控制算法 - - 目标状态估计:根据目标位置计算速度 - - 比例导引控制:使用配置的导引系数 - - 加速度限制:限制在最大加速度范围内 - -3. 干扰处理算法 - - 干扰检测:监测干扰信号功率 - - 干扰评估:判断干扰是否影响制导 - - 干扰处理:必要时暂停制导 - -注:以下功能在当前版本未实现,需要后续开发: - -- 波束扫描优化:提高目标搜索效率 -- 多目标跟踪:实现多目标环境下的目标识别和选择 -- 抗干扰增强:提高复杂电磁环境下的抗干扰能力 -- 自适应波形:根据目标特性自动调整雷达波形 - -#### 3.5.5 验证要点 - -1. 探测性能验证 - - 最大探测距离 - - 视场角范围 - - 目标识别可靠性 - - 信噪比计算准确性 - -2. 制导性能验证 - - 目标跟踪精度 - - 制导响应及时性 - - 末段制导稳定性 - - 命中精度评估 - -3. 抗干扰性能验证 - - 干扰识别能力 - - 干扰抑制效果 - - 跟踪恢复性能 - -### 3.6 末敏弹 - -#### 3.6.1 工作原理 - -末敏弹系统由母弹和子弹两部分组成,通过多传感器融合实现精确打击。其基本工作过程如下: - -1. 母弹飞行阶段 - - 母弹发射并飞向预定分离点 - - 分离点位于目标上方1000米高度,水平距离1000米 - - 到达分离点50米范围内时触发分离 - - 释放完成后母弹自动销毁 - -2. 子弹分离阶段 (Separation) - - 子弹从母弹分离并获得初始速度,与母弹分离速度一致 - - 初始朝向与母弹分离方向一致 - - 准备进入减速阶段 - -3. 减速阶段 (Deceleration) - - 开始减速减旋 - - 激活测高雷达开始工作(第一次测高) - - 降落到高度 400 米进入降落伞打开阶段 - - 此时子弹速度 40 米/秒 - -4. 降落伞打开阶段 (ParachuteDeployment) - - 打开降落伞 - - 降落伞减速和稳定 - - 调整姿态准备扫描 - - 激活测高雷达开始工作(第二次测高) - - 在200米高度进入扫描阶段 - - 此时子弹速度 10 米/秒 - -5. 稳定扫描阶段 (StableScanning) - - 开始稳定扫描 - - 保持稳定的下降速度(10米/秒) - - 执行扫描搜索(扫描锥角30度) - - 在 120 米高度进入目标探测阶段 - - 此时子弹速度 10 米/秒 - -6. 目标探测阶段 (Detection) - - 多传感器协同工作 - - 进行目标特征识别 - - 执行二次扫描确认 - - 为攻击阶段做准备 - -7. 攻击阶段 (Attack) - - 目标确认后进入攻击 - - 保持2000米/秒攻击速度 - - 执行末端精确制导 - -8. 爆炸/自毁阶段 (Explode/SelfDestruct) - - 接近目标后引爆 - - 低于20米高度时自毁 - - 未发现目标时自毁 - -#### 3.6.2 系统组成 - -##### 3.6.2.1 母弹系统 (TerminalSensitiveMissile) - -1. 分离参数 - - 分离高度:1000米 - - 分离距离:1000米 - - 分离范围:50米 - - 子弹数量:1枚 - -2. 工作流程 - - 计算分离点位置 - - 飞向分离点 - - 释放子弹 - - 任务完成后销毁 - -##### 3.6.2.2 子弹系统 (TerminalSensitiveSubmunition) - -1. 传感器配置 - - 红外探测器:探测距离500米,视场角5度 - - 毫米波辐射计:工作波段3mm,扫描视场角5度 - - 毫米波测高仪:测量精度0.1米 - - 激光测距仪:测量距离1000米 - -2. 飞行参数 - - 螺旋扫描旋转速度:8π弧度/秒(4转/秒) - - 垂直下降速度:10米/秒 - - 扫描锥角:30度 - - 攻击速度:500米/秒 - -3. 高度阈值 - - 减速高度:400米 - - 扫描高度:200米 - - 自毁高度:20米 - -#### 3.6.3 关键算法 - -1. 母弹制导算法 - - 分离点计算:基于目标位置和分离参数 - - 飞行路径规划:确保稳定到达分离点 - - 分离触发判断:距离判断和高度检查 - - 子弹释放控制:初始状态设置和激活 - -2. 子弹制导算法 - - 螺旋扫描控制: - - 旋转角速度:8π弧度/秒 - - 扫描锥角:30度 - - 垂直下降:10米/秒 - - 目标确认逻辑: - - 传感器数据融合 - - 二次检测确认(0.9个扫描周期) - - 攻击阶段控制: - - 目标跟踪 - - 速度控制(2000米/秒) - - 撞击点计算 - -3. 传感器融合算法 - - 红外探测:目标热特征识别 - - 毫米波探测:目标特征确认 - - 高度测量:飞行阶段控制 - - 距离测量:末端制导 - -#### 3.6.4 系统事件流 - -1. 母弹阶段 - - 发射事件:初始化飞行参数 - - 分离事件:创建和释放子弹 - - 销毁事件:母弹任务完成 - -2. 子弹阶段 - - 分离事件:激活传感器系统 - - 目标探测事件:处理目标辐射信息 - - 状态转换事件:控制飞行阶段 - - 爆炸/自毁事件:结束任务 - -#### 3.6.5 验证要点 - -1. 母弹性能验证 - - 分离点到达精度 - - 分离过程稳定性 - - 子弹释放可靠性 - -2. 子弹性能验证 - - 传感器探测性能 - - 目标识别可靠性 - - 末端制导精度 - - 自毁功能可靠性 - -3. 系统集成验证 - - 母子弹协同性能 - - 多传感器融合效果 - - 整体打击效能 - -注:以下功能在当前版本未实现,需要后续开发: - -- 多子弹协同控制:实现多个子弹的协同攻击 -- 复杂目标识别:提高复杂背景下的目标识别能力 -- 抗干扰增强:提高复杂电磁环境下的抗干扰能力 -- 自适应扫描:根据目标特性自动调整扫描参数 - -## 4. 通用组件 - -### 4.1 运动学模型 - -#### 4.1.1 基本模型 - -1. 制导状态下的运动 - - 使用四阶龙格-库塔方法更新导弹位置和速度 - - 每个时间步长分四个阶段计算: - - k1:初始状态计算 - - k2:中点状态计算(使用k1) - - k3:中点状态计算(使用k2) - - k4:终点状态计算(使用k3) - - 最终状态通过加权平均得到:(k1 + 2k2 + 2k3 + k4)/6 - - 考虑制导加速度的影响 - -2. 非制导状态下的运动 - - 使用标准运动学方程更新位置和速度: - - 位置更新:p = p0 + v0 * t + 0.5 * a * t^2 - - 速度更新:v = v0 + a*t - - 考虑重力加速度(9.8 m/s²) - - 保持最后已知速度方向 - -3. 弹道计算 - - 计算最佳发射方向(选择较小仰角) - - 考虑初始速度和目标位置 - - 使用弹道方程计算发射角度 - - 返回发射方向和初始速度向量 - -4. 扰动处理 - - 使用Box-Muller变换生成高斯噪声 - - 为位置和速度向量添加随机扰动 - - 扰动标准差可配置(默认0.1) - - 用于模拟传感器误差和环境影响 - -5. 状态参数 - - 位置:三维坐标向量(米) - - 速度:三维速度向量(米/秒) - - 加速度:三维加速度向量(米/秒²) - - 姿态:基于速度方向的欧拉角 - -6. 运动约束 - - 最大速度:由导弹属性指定 - - 最大加速度:由制导系统指定 - - 转向能力:由制导算法控制 - - 飞行时间:累计飞行时间(秒) - -### 4.2 制导律 - -#### 4.2.1 比例导引法 - -1. 基本原理 - - 预测目标未来位置(预测时间0.01秒) - - 计算视线角速率: - - 计算相对位置和速度向量 - - 计算视线方向单位向量 - - 计算视线角速率向量 - - 生成垂直于导弹速度方向的制导加速度 - - 限制最大加速度 - -2. 关键参数 - - 比例导引系数:通常取3~5 - - 最大加速度限制:由各型导弹指定 - - 预测时间:0.01秒 - - 制导周期:与仿真步长一致 - -3. 实现方式 - - 输入参数: - - 导弹位置和速度 - - 目标位置和速度 - - 比例导引系数 - - 计算过程: - - 预测目标位置:targetPosition + targetVelocity * predictionTime - - 计算相对位置:r = predictedTargetPosition - missilePosition - - 计算相对速度:v = targetVelocity - missileVelocity - - 计算视线角速率:LOSRate = (v - (LOS * DotProduct(v, LOS))) / r.Magnitude() - - 计算制导加速度:CrossProduct(CrossProduct(LOS, LOSRate), missileVelocity.Normalize()) * coefficient * missileVelocity.Magnitude() - - 输出结果: - - 制导加速度向量 - - 是否获得有效制导 - -#### 4.2.2 PID控制器(用于激光驾束导弹) - -1. 控制参数 - - 比例系数(Kp):30,控制系统响应速度 - - 积分系数(Ki):0.05,消除稳态误差 - - 微分系数(Kd):5,抑制超调 - - 非线性增益系数(Kc):0.5,控制偏移修正 - - 低通滤波系数(alpha):0.2 - -2. 控制算法 - - 计算误差向量 - - 更新积分项 - - 计算微分项 - - 应用非线性增益 - - 合成制导指令 - -3. 输出限制 - - 最大加速度:50 m/s² - - 横向加速度限制 - - 前向加速度控制 - - 低通滤波平滑 - -#### 4.2.3 红外指令制导控制器 - -1. 控制参数 - - 转向速率平滑因子:0.5 - - 提前量因子:0.3秒 - - 最大加速度:由配置指定 - - 制导系数:由配置指定 - -2. 控制算法 - - 计算期望飞行方向 - - 平滑处理转向速率:turnRate = turnRate * (1-0.5) + instantTurnRate * 0.5 - - 计算带提前量的期望方向 - - 生成制导加速度 - -3. 特殊处理 - - 转向速率平滑:使用加权平均 - - 提前量计算:基于当前转向速率和提前量因子 - - 加速度限制:确保不超过最大加速度 - -### 4.3 事件系统 - -#### 4.3.1 事件类型 - -1. 实体管理事件 - - MissileFireEvent:导弹发射 - -2. 激光相关事件 - - LaserIlluminationStartEvent:激光照射开始 - - LaserIlluminationUpdateEvent:激光照射更新 - - LaserIlluminationStopEvent:激光照射停止 - - LaserBeamStartEvent:激光波束开始 - - LaserBeamUpdateEvent:激光波束更新 - - LaserBeamStopEvent:激光波束停止 - - LaserJammingEvent:激光干扰 - - LaserWarnerAlarmEvent:激光告警开始 - - LaserWarnerAlarmStopEvent:激光告警停止 - -3. 红外相关事件 - - InfraredGuidanceCommandEvent:红外指令制导 - - InfraredGuidanceMissileLightEvent:导弹红外辐射 - - InfraredGuidanceMissileLightOffEvent:导弹红外辐射停止 - - InfraredDetectionEvent:红外探测 - - InfraredWarnerAlarmEvent:红外告警开始 - - InfraredWarnerAlarmStopEvent:红外告警停止 - - InfraredJammingEvent:红外干扰 - -4. 毫米波相关事件 - - MillimeterWaveDetectionEvent:毫米波探测 - - MillimeterWaveJammingEvent:毫米波干扰 - - MillimeterWaveWarnerAlarmEvent:毫米波告警开始 - - MillimeterWaveWarnerAlarmStopEvent:毫米波告警停止 - -5. 目标相关事件 - - TankRadiationEvent:目标辐射特征 - - TargetHitEvent:目标命中 - - TargetDestroyedEvent:目标摧毁 - -#### 4.3.2 事件属性 - -1. 基本属性(所有事件共有) - - SenderId:事件发送者ID - - Timestamp:事件发生时间戳 - -2. 目标相关属性 - - TargetId:目标实体ID - - MissileId:导弹实体ID - - LaserDesignatorId:激光定位器ID - - LaserBeamRiderId:激光波束制导器ID - -3. 物理量属性 - - JammingPower:干扰功率(瓦特) - - RadiationPower:辐射功率 - - Intensity:信号强度 - - Frequency:信号频率 - - WavelengthMin/Max:波长范围 - -4. 矢量属性 - - TrackerToTargetVector:跟踪器到目标向量 - - TrackerToMissileVector:跟踪器到导弹向量 - -#### 4.3.3 事件处理 - -1. 事件分发 - - 按时间戳顺序处理 - - 支持多对多订阅 - - 异步事件队列 - -2. 事件响应 - - 实体状态更新 - - 传感器状态更新 - - 告警状态管理 - - 交互效果触发 - -### 4.4 目标交互 - -#### 4.4.1 目标特性 - -1. 基本属性 - - 雷达散射截面积:10.0平方米(坦克) - - 红外辐射强度:100.0瓦特/平方米 - - 目标类型标识:用于区分不同种类目标 - - 生命值系统:可以响应伤害 - -2. 运动特性 - - 位置:三维坐标向量 +### 2.3 数据管理架构 + +#### 2.3.1 智能路径解析系统 + +1. **路径解析策略** + + 系统采用两级路径解析策略: + - 优先级1:DLL上级目录下的data文件夹 + - 获取当前程序集的物理位置 + - 解析DLL所在目录 + - 获取上级目录 + - 组合形成数据路径 + + - 优先级2:相对路径回退 + - 当自动解析失败时使用相对路径"data" + - 保持向后兼容性 + +2. **部署结构支持** + + 标准部署结构如下: + - 应用程序根目录包含主程序 + - lib子目录存放DLL库文件 + - data子目录存放配置数据(自动发现) + - data目录下按设备类型分类存放TOML配置文件 + +#### 2.3.2 TOML配置文件系统 + +1. **配置文件结构** + - 使用Tomlyn库进行TOML解析 + - 支持嵌套配置结构 + - 类型安全的配置映射 + - 详细的错误报告和验证 + +2. **设备类型支持** + - 导弹配置:包含制导系统、飞行参数、武器参数 + - 指示器配置:激光指示器、红外测角仪等 + - 传感器配置:告警器、探测器等 + - 设备配置:目标设备、平台等 + - 天气配置:天气条件、环境参数 + - 干扰机配置:各类干扰设备 + +3. **复合制导配置** + + 复合制导系统支持多个制导组件的配置: + - 每个组件包含名称、类型、激活触发器 + - 支持基于时间、距离、事件的激活条件 + - 可配置最大获取时间和稳定制导时间 + - 支持失效后的继续链条选项 + +### 2.4 状态信息管理架构 + +#### 2.4.1 ElementStatusInfo统一系统 + +1. **统一状态信息类** + + ElementStatusInfo提供标准化的状态信息管理: + - Id:实体唯一标识符 + - ElementType:实体类型名称 + - KState:运动学状态信息 + - IsActive:活动状态标志 + - Timestamp:状态时间戳 + - ExtendedProperties:扩展属性字典 + +2. **GetStatusInfo方法** + + 所有仿真实体统一实现GetStatusInfo方法: + - 基类提供基础状态信息 + - 子类添加特定扩展属性 + - 支持嵌套状态信息(如制导系统状态) + - 自动格式化输出 + +3. **状态信息层次结构** + - SimulationElement:基础状态信息 + - BaseMissile:导弹特有状态(飞行时间、阶段、制导状态) + - BaseGuidanceSystem:制导系统状态(制导加速度、干扰状态) + - BaseEquipment:设备状态(生命值、属性信息) + - BaseSensor:传感器状态(干扰状态、传感器数据) + +### 2.5 升力系统架构 + +#### 2.5.1 LiftModel升力模型 + +1. **升力计算原理** + + 基于俯仰角(攻角)计算升力加速度: + - 有效俯仰角范围:-5°到15° + - 升力平衡点:5°俯仰角 + - 升力系数:1.0 m/s²/度 + +2. **升力加速度计算** + + 升力加速度计算公式: + - combined_vertical_acceleration = (pitch - 5°) × 1.0 + - lift_acceleration = combined_vertical_acceleration + g + - 返回垂直方向的升力向量 + +### 2.6 仿真管理架构 + +#### 2.6.1 仿真状态管理 + +1. **状态定义** + + 仿真系统定义三种基本状态: + - Stopped:仿真停止状态 + - Running:仿真运行状态 + - Paused:仿真暂停状态 + +2. **状态转换控制** + - 启动仿真:从停止状态转为运行状态,需指定时间步长 + - 暂停仿真:从运行状态转为暂停状态 + - 恢复仿真:从暂停状态转为运行状态 + - 停止仿真:转为停止状态并重置仿真时间 + +#### 2.6.2 时间同步机制 + +1. **内部时间管理** + - 固定时间步长:支持恒定的仿真步长 + - 累积时间跟踪:CurrentTime属性记录仿真时间 + - 实体同步更新:所有实体使用统一的时间步长 + +2. **外部时间同步** + - 支持外部驱动的时间同步 + - 时间同步事件通知时间变化 + - 适配器时间同步通知外部仿真系统时间变化 + +#### 2.6.3 天气系统集成 + +1. **天气模型** + + 天气系统包含以下参数: + - 天气类型:晴朗、多云、雨天等 + - 温度:摄氏度 + - 湿度:百分比 + - 气压:百帕 + - 风速:米每秒 + - 风向:度数 + - 能见度:公里 + +2. **天气影响** + - 激光传播:大气透过率影响 + - 红外探测:温度和湿度影响 + - 毫米波传播:降雨衰减效应 + - 目标特征:环境温度对红外辐射的影响 + - 导弹运动:风速对轨迹的影响 + +### 2.7 事件系统架构 + +#### 2.7.1 事件类型体系 + +1. **基础事件类** + + 所有仿真事件继承自基础事件类,包含: + - 发送者ID:标识事件来源实体 + - 时间戳:事件发生的时间 + +2. **导弹相关事件** + - 导弹发射事件:导弹发射时触发 + - 导弹爆炸事件:导弹爆炸时触发 + - 飞行阶段变化事件:导弹阶段转换时触发 + - 制导状态变化事件:制导状态改变时触发 + +3. **制导相关事件** + - 激光照射事件:激光指示器照射目标 + - 激光波束事件:激光驾束仪发射波束 + - 红外制导指令事件:红外测角仪发送制导指令 + - 导弹红外信号事件:导弹发射红外信号 + +4. **目标相关事件** + - 目标命中事件:导弹命中目标 + - 目标摧毁事件:目标被摧毁 + - 目标辐射特征事件:目标发射辐射信号 + +5. **系统事件** + - 实体销毁事件:仿真实体被销毁 + - 天气变化事件:天气条件发生变化 + - 时间同步事件:仿真时间同步 + +#### 2.7.2 事件处理机制 + +1. **发布订阅模式** + + 事件系统采用类型安全的发布订阅模式: + - 事件订阅:通过泛型方法订阅特定类型事件 + - 事件发布:发布事件到所有订阅者 + - 自动类型匹配:基于事件类型自动路由到对应处理器 + +2. **类型安全处理** + - 泛型事件处理器:确保类型安全 + - 自动类型分发:基于事件类型的自动路由 + - 异常隔离:单个处理器异常不影响其他处理器 + +3. **外部系统集成** + - 双向事件流:支持向外部系统发布和接收事件 + - 适配器模式:通过ISimulationAdapter接口集成 + - 事件转换:自动处理内外部事件格式转换 + +### 2.8 实体管理架构 + +#### 2.8.1 实体基类设计 + +1. **SimulationElement基类** + + 所有仿真实体继承自SimulationElement基类,提供: + - 唯一标识符:实体ID + - 运动学状态:KinematicState对象 + - 活动状态:IsActive标志 + - 仿真管理器引用:用于事件发布和实体查询 + - 抽象更新方法:子类实现具体更新逻辑 + - 生命周期方法:激活和停用方法 + +2. **KinematicState运动学状态** + + 运动学状态包含: + - 位置:三维空间坐标 - 速度:三维速度向量 - - 朝向:弧度表示 + - 朝向:三维朝向向量 + - 角速度:三维角速度向量 -#### 4.4.2 信息交换机制 +#### 2.8.2 实体生命周期管理 -1. 事件系统 - - 目标辐射事件(TankRadiationEvent) - - 毫米波反射强度 - - 毫米波辐射温度 - - 红外辐射强度 - - 目标被击中事件(TargetHitEvent) - - 目标ID - - 导弹ID - - 目标被摧毁事件(TargetDestroyedEvent) - - 目标ID +1. **注册机制** + - 线程安全的实体注册 + - 重复ID检查:防止ID冲突 + - 类型验证:确保实体类型正确 -2. 传感器探测 - - 红外探测: - - 探测距离检查 - - 视场角检查 - - 信噪比计算 - - 毫米波探测: - - 距离限制:5000米 - - 视场角:45度 - - 目标识别概率:0.95 - - 激光反射: - - 反射系数:0.2 - - 有效反射面积:1.0平方米 +2. **查询机制** + - 按ID查询实体:根据唯一标识符查找 + - 按类型查询实体:获取特定类型的所有实体 + - 获取所有实体:返回系统中的所有实体 -#### 4.4.3 碰撞处理 +3. **注销机制** + - 安全移除实体:从系统中移除指定实体 + - 级联清理:清理相关的事件订阅和引用 + - 资源释放:确保内存和资源正确释放 -1. 碰撞检测 - - 爆炸半径判断:检查目标是否在导弹爆炸半径内 - - 命中概率计算:基于导弹属性中的命中概率 - - 距离计算:导弹到目标的欧氏距离 +#### 2.8.3 线程安全机制 -2. 伤害处理 - - 生命值扣除 - - 目标销毁判断 - - 销毁事件发布 +1. **锁策略** + + 实体管理使用锁机制确保线程安全: + - 注册操作使用互斥锁保护 + - 查询操作使用只读锁优化性能 + - 注销操作使用写锁确保一致性 + +2. **并发访问** + - 读写分离:查询操作使用只读集合 + - 原子操作:关键状态变更的原子性保证 + - 死锁避免:合理的锁顺序和超时机制 + +### 2.9 数据流架构 + +#### 2.9.1 配置数据流 + +配置数据流程包括以下步骤: +1. TOML配置文件作为数据源 +2. ThreatSourceDataManager负责数据管理 +3. 智能路径解析定位配置文件 +4. 文件加载和TOML解析 +5. 数据验证确保配置正确性 +6. 内存缓存提高访问效率 +7. 实体创建使用缓存的配置数据 + +#### 2.9.2 仿真数据流 + +仿真数据流程包括: +1. 仿真管理器控制整体流程 +2. 时间同步确保一致性 +3. 实体更新处理状态变化 +4. 事件处理响应系统事件 +5. 状态同步维护数据一致性 +6. 外部系统集成支持第三方平台 + +#### 2.9.3 事件数据流 + +事件数据流程包括: +1. 事件发布者产生事件 +2. 事件系统接收和管理事件 +3. 类型分发根据事件类型路由 +4. 处理器调用执行具体处理逻辑 +5. 外部适配器处理外部系统集成 +6. 外部系统接收和响应事件 + +### 2.10 接口定义 + +#### 2.10.1 核心接口 + +1. **ISimulationManager接口** + - 仿真控制:启动、暂停、恢复、停止仿真 + - 事件管理:发布、订阅、取消订阅事件 + - 实体管理:注册、注销、查询实体 + - 外部集成:设置适配器、处理外部事件 + +2. **ISimulationAdapter接口** + - 实体查询:获取实体和实体状态 + - 事件交换:向外部发布事件和接收外部事件 + - 时间同步:同步仿真时间 + - 环境设置:设置实体环境数据 + +3. **ISimulationElement接口** + - 状态管理:更新状态、获取状态信息 + - 生命周期:激活和停用实体 + - 属性访问:ID、运动学状态、活动状态 + +#### 2.10.2 数据接口 + +1. **配置数据接口** + - 获取导弹配置:根据型号获取导弹配置数据 + - 获取指示器配置:根据型号获取指示器配置数据 + - 获取传感器配置:根据型号获取传感器配置数据 + - 获取设备配置:根据型号获取设备配置数据 + +2. **查询接口** + - 获取可用导弹列表:返回所有可用的导弹型号 + - 获取可用指示器列表:返回所有可用的指示器型号 + - 获取可用传感器列表:返回所有可用的传感器型号 + +## 3. 数据管理系统 + +### 3.1 ThreatSourceDataManager + +#### 3.1.1 核心功能 + +威胁源数据管理器是系统的核心数据管理组件,负责: + +1. **智能路径解析** + - 基于程序集位置自动查找数据目录 + - 支持DLL上级目录的data文件夹自动发现 + - 提供相对路径回退机制确保兼容性 + - 详细的路径解析日志和错误报告 + +2. **配置文件加载** + - 支持TOML格式配置文件 + - 递归搜索子目录中的配置文件 + - 按文件名自动识别设备型号 + - 类型安全的配置数据映射 + +3. **数据缓存管理** + - 内存中缓存已加载的配置数据 + - 按设备类型分类存储 + - 高效的数据检索和访问 + - 支持配置数据的热更新 + +4. **错误处理和验证** + - 详细的加载过程跟踪 + - 配置文件格式验证 + - 缺失字段检查和默认值处理 + - 完整的错误日志和异常处理 + +#### 3.1.2 支持的设备类型 + +1. **导弹配置 (MissileData)** + - 基本属性:速度、加速度、飞行时间等 + - 制导系统配置:各种制导方式的参数 + - 武器参数:爆炸半径、命中概率等 + - 复合制导:多制导系统的组合配置 + - 升力参数:巡航攻角、制导下视角等 + +2. **指示器配置 (IndicatorData)** + - 激光指示器:功率、波长、发散角等 + - 激光驾束仪:波束参数、控制场直径等 + - 红外测角仪:跟踪距离、视场角等 + +3. **传感器配置 (SensorData)** + - 告警器:探测阈值、响应时间等 + - 探测器:灵敏度、工作频段等 + - 雷达:功率、频率、天线参数等 + +4. **设备配置 (EquipmentData)** + - 目标设备:RCS模式、热特征等 + - 平台设备:运动参数、载荷能力等 + - 环境设备:地形、建筑物等 + +5. **天气配置 (WeatherData)** + - 天气类型:晴朗、多云、雨天等 + - 环境参数:温度、湿度、风速等 + - 大气条件:能见度、气压等 + +6. **干扰机配置 (JammerData)** + - 激光干扰机:干扰功率、波长等 + - 红外干扰机:干扰强度、频谱等 + - 毫米波干扰机:干扰带宽、功率等 + +#### 3.1.3 智能路径解析实现 + +1. **GetDataPath()方法** + + 智能路径解析的核心实现: + ``` + 优先级1:DLL上级目录/data + - 获取Assembly.GetExecutingAssembly().Location + - 解析DLL所在目录的父目录 + - 组合形成data路径并验证存在性 + + 优先级2:相对路径回退 + - 使用FALLBACK_DATA_PATH = "data" + - 保持向后兼容性 + ``` + +2. **路径解析日志** + + 详细的调试信息输出: + - DLL位置信息 + - 解析的data目录路径 + - 目录存在性检查结果 + - 回退路径使用情况 + +#### 3.1.4 配置文件结构 + +1. **基本结构** + - Type字段:定义设备类型 + - Name字段:多语言名称支持 + - Properties字段:设备属性配置 + - 专用配置字段:特定制导系统的配置 + +2. **复合制导配置** + - GuidanceSuite数组:多个制导组件 + - 每个组件包含:名称、类型、激活条件 + - 支持串行和并行制导模式 + - 可配置制导切换逻辑 + +3. **配置验证** + - 必需字段检查 + - 数值范围验证 + - 类型匹配验证 + - 依赖关系检查 + +### 3.2 配置文件格式 + +#### 3.2.1 TOML格式优势 + +1. **可读性强** + - 类似INI文件的简洁语法 + - 支持注释和文档化 + - 层次化的配置结构 + - 易于人工编辑和维护 + +2. **类型安全** + - 强类型数据支持 + - 自动类型转换 + - 数组和表格支持 + - 嵌套结构支持 + +3. **工具支持** + - 使用Tomlyn库进行解析 + - 完整的错误报告 + - 性能优化的解析器 + - .NET生态系统集成 + +#### 3.2.2 配置文件组织 + +1. **目录结构** + - 按设备类型分目录存放 + - 支持子目录进一步分类 + - 文件名即为设备型号 + - 统一的.toml文件扩展名 + +2. **命名规范** + - 设备型号作为文件名 + - 使用下划线分隔符 + - 版本号后缀支持 + - 描述性的目录名称 + +3. **版本管理** + - 配置文件版本控制 + - 向后兼容性保证 + - 升级路径规划 + - 变更日志维护 + +### 3.3 数据加载流程 + +#### 3.3.1 初始化流程 + +1. **路径解析** + - 获取程序集位置 + - 计算数据目录路径 + - 验证目录存在性 + - 记录解析结果 + +2. **目录扫描** + - 递归扫描配置目录 + - 识别TOML配置文件 + - 按设备类型分类 + - 构建文件清单 + +3. **文件加载** + - 逐个加载配置文件 + - TOML格式解析 + - 数据类型转换 + - 错误处理和记录 + +4. **数据验证** + - 配置完整性检查 + - 数值范围验证 + - 依赖关系验证 + - 默认值填充 + +#### 3.3.2 缓存管理 + +1. **内存缓存** + - 按设备类型分类存储 + - 使用字典结构快速查找 + - 支持并发访问 + - 内存使用优化 + +2. **缓存策略** + - 一次性加载所有配置 + - 延迟加载特定配置 + - 缓存失效和更新 + - 内存压力管理 + +3. **数据访问** + - 类型安全的访问接口 + - 异常处理和错误报告 + - 性能监控和优化 + - 并发访问控制 + +#### 3.3.3 复合制导数据处理 + +1. **GuidanceSuite后处理** + + 复合制导配置的特殊处理: + - 遍历GuidanceSuite中的每个组件 + - 根据GuidanceSystemType匹配顶层配置 + - 将SpecificConfig指向对应的配置对象 + - 支持的制导类型映射: + - "millimeterwave" → MillimeterWaveGuidanceConfig + - "infraredimagingterminalguidance" → InfraredImagingGuidanceConfig + - "lasersemiactiveguidance" → LaserSemiActiveGuidanceConfig + - "laserbeamriderguidance" → LaserBeamRiderGuidanceConfig + - "infraredcommandguidance" → InfraredCommandGuidanceConfig + +2. **配置验证和错误处理** + - 检查SpecificConfig是否成功关联 + - 验证顶层配置的存在性 + - 记录详细的调试信息 + - 处理配置缺失的情况 + +## 4. 导弹类型及特性 + +### 4.1 导弹基类架构 + +#### 4.1.1 BaseMissile基类 + +1. **核心属性** + - 继承自SimulationElement基类 + - KinematicState运动学状态管理 + - 飞行阶段状态机:Launch/Cruise/TerminalGuidance/Explode/SelfDestruct + - 制导系统引用:统一的制导系统管理接口 + - 升力加速度系统:基于俯仰角的升力计算 + - 事件处理机制:制导事件的接收和响应 + +2. **飞行阶段管理** + - Launch阶段:发射初期的弹道飞行 + - Cruise阶段:中段巡航飞行 + - TerminalGuidance阶段:末段制导飞行 + - Explode阶段:爆炸状态 + - SelfDestruct阶段:自毁状态 + +3. **制导系统集成** + - 制导系统引用管理 + - 制导加速度计算和应用 + - 制导事件的处理和响应 + - 多制导系统的切换和管理 + +4. **升力系统集成** + - 基于俯仰角的升力计算 + - 巡航攻角和制导下视角配置 + - 升力加速度与制导加速度的合成 + - 飞行阶段相关的升力参数调整 + +#### 4.1.2 运动学模型 + +1. **KinematicState状态管理** + - Position:三维位置向量 + - Orientation:欧拉角朝向(前向为-Z轴) + - Velocity:三维速度向量 + - Speed:标量速度(与Velocity自动同步) + +2. **加速度合成** + - GuidanceAcceleration:制导系统产生的加速度 + - ThrustAcceleration:推力加速度 + - LiftAcceleration:升力加速度 + - DragAcceleration:空气阻力加速度 + - GravityAcceleration:重力加速度 + +3. **运动状态随机噪声** + - 根据飞行阶段设置不同的噪声系数 + - Launch阶段:较大的初始噪声 + - Cruise阶段:中等的巡航噪声 + - TerminalGuidance阶段:较小的制导噪声 + +#### 4.1.3 生命周期管理 + +1. **自毁控制机制** + - 基于飞行时间的自毁 + - 基于飞行距离的自毁 + - 基于高度的安全自毁 + - 基于制导失效的自毁 + +2. **命中检测** + - 目标距离检测 + - 爆炸半径计算 + - 命中概率计算 + - 目标伤害评估 + +3. **状态信息管理** + - ElementStatusInfo统一状态信息 + - 飞行时间、阶段、制导状态等扩展属性 + - GetStatusInfo方法的统一实现 + - 嵌套制导系统状态信息 + +### 4.2 激光半主动制导导弹 + +#### 4.2.1 工作原理 + +激光半主动制导导弹通过接收目标反射的激光能量进行制导: + +1. **激光照射阶段** + - 激光指示器持续照射目标 + - 目标表面反射激光能量 + - 导弹上的激光探测器接收反射信号 + - 四象限探测器确定目标方位 + +2. **制导控制阶段** + - 计算目标相对于导弹轴线的角度偏差 + - 根据偏差角度生成制导指令 + - 比例导引法计算制导加速度 + - 控制导弹飞向目标 + +3. **抗干扰能力** + - 激光功率阈值检测 + - 信号质量评估 + - 干扰识别和抑制 + - 制导精度保持 + +#### 4.2.2 关键算法 + +1. **四象限探测器算法** + - 四个象限的激光功率分布计算 + - 基于距离平方反比定律的功率衰减 + - 目标反射系数和有效反射面积 + - 大气透过率对激光传播的影响 + +2. **比例导引算法** + - 视线角速度计算 + - 导航比例系数设置 + - 制导加速度矢量计算 + - 制导指令的平滑处理 + +3. **干扰处理算法** + - 激光干扰功率计算 + - 信噪比评估 + - 干扰状态判断 + - 制导精度降级处理 + +#### 4.2.3 技术特点 + +1. **制导精度** + - 高精度的目标跟踪能力 + - 亚米级的命中精度 + - 全天候作战能力 + - 抗电子干扰能力 + +2. **作战灵活性** + - 发射后锁定能力 + - 多目标攻击能力 + - 复杂环境适应性 + - 快速反应能力 + +3. **技术限制** + - 需要持续激光照射 + - 受天气条件影响 + - 激光功率需求较高 + - 易受激光干扰影响 + +### 4.3 激光驾束制导导弹 + +#### 4.3.1 工作原理 + +激光驾束制导导弹通过跟踪激光波束进行制导: + +1. **波束跟踪阶段** + - 激光驾束仪发射编码激光波束 + - 导弹尾部的激光接收器接收波束信号 + - 解码波束中的制导指令信息 + - 计算导弹相对于波束轴线的偏差 + +2. **制导控制阶段** + - 根据波束偏差计算制导指令 + - 控制导弹保持在波束中心 + - 跟随波束指向目标飞行 + - 实现精确的目标攻击 + +3. **波束编码机制** + - 时间编码的制导指令 + - 空间编码的位置信息 + - 频率编码的控制信号 + - 抗干扰的编码算法 + +#### 4.3.2 关键算法 + +1. **波束跟踪算法** + - 激光功率分布检测 + - 波束中心位置计算 + - 导弹偏差角度计算 + - 制导指令生成 + +2. **编码解码算法** + - 时间序列信号处理 + - 数字滤波和降噪 + - 指令信息提取 + - 错误检测和纠正 + +3. **控制场算法** + - 控制场直径计算 + - 有效制导区域确定 + - 边界条件处理 + - 制导精度评估 + +#### 4.3.3 技术特点 + +1. **制导优势** + - 高精度的波束跟踪 + - 强抗干扰能力 + - 全程制导控制 + - 多目标攻击能力 + +2. **系统特点** + - 需要专用激光驾束仪 + - 波束功率要求较高 + - 制导距离受限 + - 对大气条件敏感 + +### 4.4 红外指令制导导弹 + +#### 4.4.1 工作原理 + +红外指令制导导弹通过接收红外制导指令进行制导: + +1. **目标跟踪阶段** + - 红外测角仪跟踪目标的红外辐射 + - 计算目标的角度位置 + - 预测目标的运动轨迹 + - 生成拦截制导指令 + +2. **指令传输阶段** + - 红外测角仪发射编码红外信号 + - 导弹接收红外制导指令 + - 解码指令中的制导信息 + - 执行制导机动动作 + +3. **制导控制阶段** + - 根据制导指令调整飞行方向 + - 实现对目标的精确拦截 + - 保持与测角仪的通信链路 + - 完成目标攻击任务 + +#### 4.4.2 关键算法 + +1. **目标跟踪算法** + - 红外图像处理 + - 目标识别和分类 + - 运动轨迹预测 + - 拦截点计算 + +2. **指令编码算法** + - 制导指令数字化 + - 红外信号调制 + - 抗干扰编码 + - 传输错误检测 + +3. **制导控制算法** + - 指令解码处理 + - 制导加速度计算 + - 飞行轨迹修正 + - 目标拦截控制 + +#### 4.4.3 技术特点 + +1. **制导能力** + - 远距离制导能力 + - 多目标攻击能力 + - 复杂环境适应性 + - 高精度拦截能力 + +2. **系统要求** + - 需要红外测角仪支持 + - 红外通信链路要求 + - 目标红外特征依赖 + - 大气透过率影响 + +### 4.5 红外成像末制导导弹 + +#### 4.5.1 工作原理 + +红外成像末制导导弹在末段使用红外成像传感器进行自主制导: + +1. **目标搜索阶段** + - 红外成像传感器扫描搜索区域 + - 检测目标的红外辐射特征 + - 识别和确认目标类型 + - 锁定目标进入跟踪状态 + +2. **目标跟踪阶段** + - 持续跟踪目标的红外图像 + - 计算目标的角度位置和距离 + - 预测目标的运动状态 + - 生成制导控制指令 + +3. **精确制导阶段** + - 根据目标位置计算制导加速度 + - 控制导弹精确飞向目标 + - 实现高精度的目标攻击 + - 完成末段制导任务 + +#### 4.5.2 关键算法 + +1. **图像处理算法** + - 红外图像增强 + - 目标检测和分割 + - 特征提取和匹配 + - 目标识别和分类 + +2. **目标跟踪算法** + - 卡尔曼滤波跟踪 + - 粒子滤波跟踪 + - 多假设跟踪 + - 目标状态估计 + +3. **制导控制算法** + - 比例导引法 + - 最优制导法 + - 预测制导法 + - 自适应制导法 + +#### 4.5.3 技术特点 + +1. **制导优势** + - 自主制导能力 + - 高精度攻击能力 + - 抗干扰能力强 + - 全天候作战能力 + +2. **技术挑战** + - 图像处理复杂度高 + - 计算资源需求大 + - 目标特征依赖性 + - 环境适应性要求 + +### 4.6 毫米波末制导导弹 + +#### 4.6.1 工作原理 + +毫米波末制导导弹使用毫米波雷达进行末段制导: + +1. **目标探测阶段** + - 毫米波雷达发射电磁波 + - 接收目标反射的回波信号 + - 计算目标的距离和方位 + - 识别和确认目标类型 + +2. **目标跟踪阶段** + - 持续跟踪目标的雷达回波 + - 测量目标的距离、方位和速度 + - 预测目标的运动轨迹 + - 生成制导控制指令 + +3. **精确制导阶段** + - 根据雷达测量数据计算制导加速度 + - 控制导弹精确飞向目标 + - 实现高精度的目标攻击 + - 完成末段制导任务 + +#### 4.6.2 关键算法 + +1. **雷达信号处理算法** + - 脉冲压缩处理 + - 多普勒频移检测 + - 距离和速度测量 + - 信号检测和估计 + +2. **目标检测算法** + - 恒虚警率检测 + - 目标航迹关联 + - 多目标跟踪 + - 目标识别分类 + +3. **SwerlingRCS模型** + - Swerling I型:慢起伏目标 + - Swerling II型:快起伏目标 + - Swerling III型:慢起伏目标(改进) + - Swerling IV型:快起伏目标(改进) + - RCS统计特性建模 + - 检测概率计算 + +4. **制导控制算法** + - 比例导引法 + - 增强比例导引法 + - 最优制导法 + - 自适应制导法 + +#### 4.6.3 技术特点 + +1. **制导优势** + - 全天候作战能力 + - 强穿透能力 + - 高精度测距能力 + - 抗光电干扰能力 + +2. **技术特点** + - 毫米波频段特性 + - 高分辨率成像能力 + - 多目标处理能力 + - 复杂环境适应性 + +3. **环境影响** + - 降雨衰减效应 + - 大气吸收影响 + - 地面杂波干扰 + - 多径传播效应 + +### 4.7 末敏弹 + +#### 4.7.1 工作原理 + +末敏弹是一种特殊的智能弹药,具有自主目标搜索和攻击能力: + +1. **抛撒阶段** + - 母弹在预定高度抛撒子弹 + - 子弹展开降落伞减速下降 + - 启动传感器系统进行目标搜索 + - 进入自主搜索攻击模式 + +2. **目标搜索阶段** + - 红外传感器扫描地面目标 + - 毫米波雷达探测金属目标 + - 多传感器融合确认目标类型 + - 选择最优攻击目标 + +3. **精确攻击阶段** + - 计算目标的精确位置 + - 控制子弹飞向目标 + - 在最佳位置引爆战斗部 + - 实现对目标的有效毁伤 + +#### 4.7.2 关键算法 + +1. **目标搜索算法** + - 螺旋扫描模式 + - 目标检测算法 + - 目标分类识别 + - 威胁等级评估 + +2. **多传感器融合算法** + - 红外和毫米波数据融合 + - 目标特征匹配 + - 置信度计算 + - 决策融合算法 + +3. **攻击控制算法** + - 攻击时机选择 + - 攻击角度优化 + - 战斗部引爆控制 + - 毁伤效果评估 + +#### 4.7.3 技术特点 + +1. **智能化特点** + - 自主目标识别 + - 智能攻击决策 + - 多目标处理能力 + - 复杂环境适应性 + +2. **作战优势** + - 大面积搜索能力 + - 高精度攻击能力 + - 多目标同时攻击 + - 强生存能力 + +### 4.8 复合制导导弹 + +#### 4.8.1 工作原理 + +复合制导导弹集成多种制导方式,提供更强的作战能力: + +1. **多模制导系统** + - 毫米波雷达制导 + - 红外成像制导 + - 激光半主动制导 + - 惯性导航制导 + +2. **制导模式切换** + - 基于飞行阶段的自动切换 + - 基于环境条件的智能切换 + - 基于目标特性的优化切换 + - 基于干扰情况的应急切换 + +3. **数据融合处理** + - 多传感器数据融合 + - 制导信息综合处理 + - 目标状态估计优化 + - 制导精度提升 + +#### 4.8.2 关键算法 + +1. **制导模式选择算法** + - 环境条件评估 + - 目标特性分析 + - 制导性能预测 + - 最优模式选择 + +2. **数据融合算法** + - 卡尔曼滤波融合 + - 贝叶斯融合 + - 证据理论融合 + - 神经网络融合 + +3. **制导切换算法** + - 切换条件判断 + - 切换时机选择 + - 状态平滑过渡 + - 制导连续性保证 + +#### 4.8.3 技术特点 + +1. **制导优势** + - 多重制导保险 + - 强抗干扰能力 + - 高制导精度 + - 复杂环境适应性 + +2. **系统复杂性** + - 多传感器集成 + - 复杂控制逻辑 + - 高计算资源需求 + - 系统可靠性要求 + +### 4.9 命中概率计算 + +#### 4.9.1 命中概率模型 + +1. **基础概率模型** + - 基于导弹类型的基础命中概率 + - 基于目标距离的概率修正 + - 基于制导精度的概率计算 + - 基于环境条件的概率调整 + +2. **距离影响因子** + - 近距离高命中概率 + - 远距离概率衰减 + - 最优攻击距离 + - 有效攻击范围 + +3. **制导精度影响** + - 制导系统精度等级 + - 传感器性能影响 + - 干扰条件影响 + - 目标特性影响 + +#### 4.9.2 概率计算算法 + +1. **综合概率计算** + - 基础概率 × 距离因子 × 制导因子 × 环境因子 + - 各因子的权重分配 + - 概率范围限制 + - 随机性引入 + +2. **动态概率更新** + - 实时距离测量 + - 制导状态监控 + - 环境条件变化 + - 概率实时更新 + +3. **命中判定算法** + - 概率阈值设定 + - 随机数生成 + - 命中结果判定 + - 结果统计分析 ## 5. 验证方法 -### 5.1 已实现的单元测试验证 +### 5.1 单元测试验证 -#### 5.1.1 基础功能验证 +#### 5.1.1 数据管理系统测试 -1. 导弹基本属性验证 - - 初始化参数验证(位置、方向、速度等) - - 状态标志验证(激活状态、制导状态) - - 运动参数验证(速度限制、加速度限制) +1. **ThreatSourceDataManager测试** + - 智能路径解析功能验证 + - TOML配置文件加载测试 + - 数据缓存机制验证 + - 错误处理和异常测试 + - 复合制导配置后处理验证 -2. 飞行阶段验证 - - 发射阶段验证(0.01-0.1秒) - - 巡航阶段验证(阶段转换) - - 末制导阶段验证(制导状态) - - 阶段转换验证(完整飞行过程) +2. **配置文件格式验证** + - TOML语法正确性检查 + - 必需字段完整性验证 + - 数据类型匹配验证 + - 数值范围合理性检查 + - 依赖关系一致性验证 -3. 安全限制验证 - - 最大飞行时间验证(超时自毁) - - 最大飞行距离验证(超程自毁) - - 最大速度限制验证 - - 自毁功能验证 +3. **路径解析测试** + - DLL位置获取测试 + - 上级目录data文件夹查找 + - 回退路径机制验证 + - 不同部署结构适应性测试 + - 路径解析日志验证 -#### 5.1.2 制导系统验证 +#### 5.1.2 运动学系统测试 -1. 激光驾束制导验证 - - 光束建立验证(LaserBeamStartEvent) - - 光束跟踪验证(LaserBeamUpdateEvent) - - 光束关闭验证(LaserBeamStopEvent) - - 制导状态验证(无光束时不制导) +1. **KinematicState测试** + - Position、Orientation、Velocity状态管理 + - Speed与Velocity的自动同步 + - 坐标系转换正确性验证 + - 前向方向(-Z轴)计算验证 + - 状态更新和同步机制测试 -2. 红外指令制导验证 - - 红外信号点亮验证(InfraredGuidanceMissileLightEvent) - - 红外信号熄灭验证(InfraredGuidanceMissileLightOffEvent) - - 制导指令验证(InfraredGuidanceCommandEvent) - - 制导状态验证(无指令时不制导) +2. **升力系统测试** + - LiftModel升力计算验证 + - 俯仰角范围(-5°到15°)测试 + - 升力平衡点(5°)验证 + - 升力系数(1.0 m/s²/度)测试 + - 垂直加速度合成验证 -3. 毫米波末制导验证 - - 目标辐射接收验证(TankRadiationEvent) - - 阶段转换验证(巡航到末制导) - - 制导状态验证 - - 自毁功能验证 +3. **加速度合成测试** + - 制导加速度计算验证 + - 推力加速度应用测试 + - 升力加速度集成验证 + - 阻力加速度计算测试 + - 重力加速度合成验证 -4. 红外成像末制导验证 - - 目标辐射接收验证(TankRadiationEvent) - - 阶段转换验证 - - 制导状态验证 - - 自毁功能验证 +#### 5.1.3 制导系统测试 -5. 末敏子弹验证 - - 分离条件验证(位置和时间) - - 分离过程验证(子弹创建和注册) - - 母弹销毁验证 - - 子弹激活验证 +1. **激光半主动制导测试** + - 四象限探测器算法验证 + - 激光功率分布计算测试 + - 目标反射系数应用验证 + - 比例导引算法测试 + - 干扰处理算法验证 -#### 5.1.3 事件系统验证 +2. **激光驾束制导测试** + - 波束跟踪算法验证 + - 编码解码算法测试 + - 控制场直径计算验证 + - PID控制器参数测试 + - 波束偏差计算验证 -1. 事件发布验证 - - 事件类型正确性验证 - - 事件参数完整性验证 - - 事件发布成功验证 +3. **红外制导系统测试** + - 红外图像处理算法验证 + - 目标识别和分类测试 + - 运动轨迹预测验证 + - 制导指令生成测试 + - 抗干扰能力验证 -2. 事件订阅验证 - - 事件接收验证 - - 事件处理验证 - - 事件响应验证 +4. **毫米波制导测试** + - 雷达信号处理算法验证 + - SwerlingRCS模型测试 + - 目标检测算法验证 + - 距离和速度测量测试 + - 多目标跟踪验证 -#### 5.1.4 实体管理验证 +5. **复合制导测试** + - 制导模式切换算法验证 + - 数据融合算法测试 + - 制导系统激活触发器验证 + - 制导质量评估测试 + - 失效处理机制验证 -1. 实体注册验证 - - 实体注册成功验证 - - 重复注册处理验证 - - 注册冲突处理验证 +#### 5.1.4 状态信息系统测试 -2. 实体获取验证 - - 内部实体获取验证 - - 外部实体获取验证 - - 实体ID验证 +1. **ElementStatusInfo测试** + - 统一状态信息结构验证 + - GetStatusInfo方法实现测试 + - 扩展属性字典功能验证 + - 嵌套状态信息测试 + - 时间戳同步验证 +2. **状态信息层次测试** + - SimulationElement基础状态测试 + - BaseMissile导弹状态验证 + - BaseGuidanceSystem制导状态测试 + - BaseEquipment设备状态验证 + - BaseSensor传感器状态测试 + +3. **状态信息格式化测试** + - 状态信息序列化验证 + - JSON格式输出测试 + - 状态信息可读性验证 + - 调试信息完整性测试 + - 性能监控数据验证 + +#### 5.1.5 事件系统测试 + +1. **事件发布订阅测试** + - 类型安全事件处理验证 + - 事件订阅和取消订阅测试 + - 事件发布和分发验证 + - 异常隔离机制测试 + - 事件队列管理验证 + +2. **导弹生命周期事件测试** + - 导弹发射事件验证 + - 飞行阶段变化事件测试 + - 制导状态变化事件验证 + - 导弹爆炸事件测试 + - 自毁事件验证 + +3. **制导相关事件测试** + - 激光照射事件验证 + - 激光波束事件测试 + - 红外制导指令事件验证 + - 毫米波探测事件测试 + - 目标命中事件验证 + +### 5.2 集成测试验证 + +#### 5.2.1 系统集成测试 + +1. **数据管理集成测试** + - 配置文件加载与实体创建集成 + - 数据缓存与仿真运行集成 + - 错误处理与系统稳定性集成 + - 热更新与运行时配置集成 + - 多设备类型协同工作测试 + +2. **仿真管理集成测试** + - 仿真状态控制与实体管理集成 + - 时间同步与实体更新集成 + - 天气系统与制导系统集成 + - 事件系统与仿真流程集成 + - 外部适配器与内部系统集成 + +3. **制导系统集成测试** + - 制导系统与导弹基类集成 + - 传感器与制导算法集成 + - 制导事件与系统响应集成 + - 干扰系统与制导性能集成 + - 多制导系统协同工作测试 + +#### 5.2.2 端到端测试 + +1. **完整攻击流程测试** + - 导弹发射到命中全流程验证 + - 制导系统激活和切换测试 + - 目标探测和跟踪验证 + - 制导控制和轨迹修正测试 + - 命中判定和毁伤评估验证 + +2. **复杂场景测试** + - 多导弹协同攻击测试 + - 复杂环境条件下的制导验证 + - 干扰条件下的系统性能测试 + - 目标机动情况下的跟踪验证 + - 系统故障情况下的容错测试 + +3. **性能压力测试** + - 大量实体同时仿真测试 + - 高频率事件处理验证 + - 内存使用和泄漏检测 + - CPU性能和优化验证 + - 并发访问和线程安全测试 + +### 5.3 算法验证 + +#### 5.3.1 制导算法验证 + +1. **比例导引算法验证** + - 导航比例系数优化测试 + - 视线角速度计算精度验证 + - 制导加速度收敛性测试 + - 目标拦截轨迹分析 + - 制导精度统计验证 + +2. **目标跟踪算法验证** + - 卡尔曼滤波跟踪精度测试 + - 目标状态估计误差分析 + - 运动轨迹预测准确性验证 + - 多目标跟踪性能测试 + - 跟踪丢失恢复能力验证 + +3. **传感器算法验证** + - 激光功率分布计算验证 + - 红外图像处理算法测试 + - 毫米波信号处理验证 + - 多传感器融合算法测试 + - 传感器噪声处理验证 + +#### 5.3.2 物理模型验证 + +1. **运动学模型验证** + - 位置、速度、加速度关系验证 + - 坐标系转换正确性测试 + - 欧拉角与旋转矩阵一致性验证 + - 运动状态积分精度测试 + - 数值稳定性分析 + +2. **升力模型验证** + - 升力系数实验数据对比 + - 俯仰角与升力关系验证 + - 升力平衡点准确性测试 + - 升力加速度计算验证 + - 飞行阶段升力变化测试 + +3. **传播模型验证** + - 激光传播衰减模型验证 + - 红外辐射传播模型测试 + - 毫米波传播特性验证 + - 大气影响模型准确性测试 + - 环境条件影响分析 + +#### 5.3.3 概率模型验证 + +1. **命中概率模型验证** + - 基础概率设定合理性验证 + - 距离影响因子准确性测试 + - 制导精度影响分析 + - 环境条件影响验证 + - 概率计算算法测试 + +2. **SwerlingRCS模型验证** + - 各型Swerling模型实现验证 + - RCS统计特性准确性测试 + - 检测概率计算验证 + - 目标起伏特性建模测试 + - 雷达检测性能分析 + +3. **随机噪声模型验证** + - 运动状态噪声系数验证 + - 飞行阶段噪声变化测试 + - 噪声分布特性验证 + - 噪声对制导精度影响分析 + - 噪声模型参数优化 + +### 5.4 性能验证 + +#### 5.4.1 计算性能验证 + +1. **实时性能测试** + - 仿真步长执行时间测量 + - 制导算法计算时间分析 + - 事件处理响应时间测试 + - 状态更新性能验证 + - 实时性要求满足度评估 + +2. **内存性能测试** + - 内存使用量监控 + - 内存泄漏检测 + - 缓存效率分析 + - 垃圾回收影响测试 + - 内存优化效果验证 + +3. **并发性能测试** + - 多线程访问安全性验证 + - 锁竞争和死锁检测 + - 并发处理能力测试 + - 线程池性能分析 + - 并发优化效果验证 + +#### 5.4.2 精度性能验证 + +1. **制导精度验证** + - 各制导系统精度统计 + - 制导误差分布分析 + - 精度影响因素识别 + - 精度改进效果验证 + - 精度要求满足度评估 + +2. **数值精度验证** + - 浮点数计算精度测试 + - 数值积分误差分析 + - 累积误差控制验证 + - 数值稳定性测试 + - 精度损失原因分析 + +3. **时间精度验证** + - 时间同步精度测试 + - 事件时间戳准确性验证 + - 仿真时间与实际时间对比 + - 时间步长影响分析 + - 时间精度要求满足度评估 + +#### 5.4.3 可靠性验证 + +1. **系统稳定性测试** + - 长时间运行稳定性验证 + - 异常情况处理能力测试 + - 系统恢复能力验证 + - 错误传播控制测试 + - 系统容错能力分析 + +2. **数据一致性验证** + - 配置数据一致性检查 + - 状态数据同步验证 + - 事件数据完整性测试 + - 数据备份和恢复验证 + - 数据损坏检测和修复 + +3. **接口兼容性验证** + - 版本兼容性测试 + - 接口向后兼容验证 + - 外部系统集成测试 + - 配置文件格式兼容性验证 + - API接口稳定性测试 + +### 5.5 验证工具和方法 + +#### 5.5.1 自动化测试工具 + +1. **单元测试框架** + - NUnit测试框架应用 + - 测试用例自动生成 + - 测试覆盖率分析 + - 持续集成测试 + - 回归测试自动化 + +2. **性能测试工具** + - 性能监控工具集成 + - 基准测试自动化 + - 性能回归检测 + - 性能瓶颈分析 + - 性能优化验证 + +3. **集成测试工具** + - 端到端测试自动化 + - 场景测试脚本 + - 数据驱动测试 + - 环境配置自动化 + - 测试结果分析 + +#### 5.5.2 验证数据管理 + +1. **测试数据准备** + - 标准测试数据集 + - 边界条件测试数据 + - 异常情况测试数据 + - 性能测试数据 + - 回归测试数据 + +2. **验证结果管理** + - 测试结果记录和分析 + - 验证报告自动生成 + - 问题跟踪和管理 + - 验证历史记录 + - 质量指标统计 + +3. **基准数据维护** + - 算法基准结果维护 + - 性能基准数据更新 + - 精度基准标准制定 + - 基准数据版本管理 + - 基准比较分析 + +#### 5.5.3 验证流程管理 + +1. **验证计划制定** + - 验证需求分析 + - 验证策略制定 + - 验证计划编制 + - 资源分配和调度 + - 风险评估和控制 + +2. **验证执行管理** + - 验证任务分配 + - 验证进度跟踪 + - 问题识别和处理 + - 验证质量控制 + - 验证结果评审 + +3. **验证改进管理** + - 验证效果评估 + - 验证方法改进 + - 验证工具优化 + - 验证流程完善 + - 经验总结和分享 ## 6. 仿真接口 -### 6.1 事件接口 +### 6.1 核心接口定义 -1. 实体事件 - - 实体注册/注销事件 - - 实体激活/停用事件 - - 实体状态更新事件 +#### 6.1.1 仿真管理接口 -2. 制导事件 - - 激光照射/光束事件 - - 红外信号事件 - - 制导指令事件 - - 目标辐射事件 +1. **ISimulationManager接口** + + 仿真管理器的核心接口,提供仿真控制功能: + - StartSimulation(double timeStep):启动仿真,指定时间步长 + - PauseSimulation():暂停仿真 + - ResumeSimulation():恢复仿真 + - StopSimulation():停止仿真并重置 + - UpdateSimulation():执行一次仿真更新 + - 状态属性:CurrentTime、SimulationState、TimeStep -3. 打击效果事件 - - 目标命中事件 - - 目标摧毁事件 - - 导弹爆炸事件 +2. **ISimulationElement接口** + + 仿真实体的基础接口,所有仿真对象必须实现: + - Update(double deltaTime):更新实体状态 + - GetStatusInfo():获取统一状态信息 + - 属性访问:Id、KState、IsActive、ElementType + - 生命周期管理:Initialize()、Destroy() -### 6.2 实体管理接口 +3. **IEventSystem接口** + + 事件系统接口,提供类型安全的事件处理: + - Subscribe(Action handler):订阅特定类型事件 + - Unsubscribe(Action handler):取消订阅 + - Publish(T eventData):发布事件 + - 事件队列管理和异常隔离 -1. 实体注册管理 - - 实体注册与注销 - - 实体ID管理 - - 实体状态维护 +#### 6.1.2 数据管理接口 -2. 实体查询 - - 按ID查询实体 - - 获取所有实体 - - 获取特定类型实体 +1. **IThreatSourceDataManager接口** + + 数据管理器接口,提供配置数据访问: + - LoadData():加载所有配置数据 + - GetMissileData(string modelName):获取导弹配置 + - GetIndicatorData(string modelName):获取指示器配置 + - GetSensorData(string modelName):获取传感器配置 + - GetEquipmentData(string modelName):获取设备配置 + - GetWeatherData(string modelName):获取天气配置 + - GetJammerData(string modelName):获取干扰机配置 -### 6.3 仿真控制接口 +2. **IConfigurationData接口** + + 配置数据的基础接口: + - Type:设备类型标识 + - Name:多语言名称支持 + - Properties:基础属性字典 + - Validate():配置数据验证 -1. 时间管理 - - 仿真步长控制 - - 实体更新同步 - - 事件处理同步 +3. **IDataCache接口** + + 数据缓存管理接口: + - Get(string key):获取缓存数据 + - Set(string key, T value):设置缓存数据 + - Remove(string key):移除缓存数据 + - Clear():清空缓存 + - Contains(string key):检查缓存存在性 -2. 状态管理 - - 实体状态更新 - - 系统状态维护 - - 运行状态控制 +#### 6.1.3 制导系统接口 -### 6.4 测试适配接口 +1. **IGuidanceSystem接口** + + 制导系统的统一接口: + - CalculateGuidanceAcceleration():计算制导加速度 + - GetStatusInfo():获取制导系统状态 + - IsGuidanceActive:制导激活状态 + - GuidanceAcceleration:当前制导加速度 + - 事件处理:ProcessGuidanceEvent(IGuidanceEvent) -1. 事件记录 - - 事件发布记录 - - 事件接收记录 - - 事件处理记录 +2. **IGuidanceEvent接口** + + 制导事件的基础接口: + - SenderId:事件发送者ID + - Timestamp:事件时间戳 + - EventType:事件类型标识 + - EventData:事件数据载荷 -2. 实体管理 - - 测试实体注册 - - 测试实体维护 - - 测试数据清理 +3. **ITargetTracker接口** + + 目标跟踪器接口: + - TrackTarget(ITarget target):跟踪目标 + - PredictTargetPosition(double time):预测目标位置 + - GetTrackingAccuracy():获取跟踪精度 + - IsTargetLocked:目标锁定状态 + +#### 6.1.4 传感器系统接口 + +1. **ISensor接口** + + 传感器的基础接口: + - DetectTargets():探测目标 + - GetSensorData():获取传感器数据 + - GetStatusInfo():获取传感器状态 + - IsJammed:干扰状态 + - DetectionRange:探测距离 + +2. **ILaserSensor接口** + + 激光传感器专用接口: + - CalculateLaserPower(Vector3 position):计算激光功率 + - GetQuadrantPowers():获取四象限功率 + - LaserWavelength:激光波长 + - DetectorDiameter:探测器直径 + +3. **IRadarSensor接口** + + 雷达传感器专用接口: + - CalculateRCS(ITarget target):计算目标RCS + - GetSwerlingModel():获取Swerling模型 + - WorkingFrequency:工作频率 + - TransmitPower:发射功率 + +### 6.2 外部系统集成接口 + +#### 6.2.1 仿真适配器接口 + +1. **ISimulationAdapter接口** + + 外部仿真系统适配器的统一接口: + - Initialize():初始化适配器 + - OnTimeSync(double currentTime):时间同步通知 + - OnEntityUpdate(ISimulationElement entity):实体状态更新通知 + - OnEventPublished(T eventData):事件发布通知 + - SendExternalEvent(T eventData):发送外部事件 + - IsConnected:连接状态 + +2. **IUnityAdapter接口** + + Unity引擎适配器专用接口: + - UpdateUnityTransform(string entityId, Transform transform):更新Unity变换 + - CreateUnityGameObject(ISimulationElement entity):创建Unity对象 + - DestroyUnityGameObject(string entityId):销毁Unity对象 + - SyncUnityPhysics():同步Unity物理系统 + +3. **IUnrealAdapter接口** + + Unreal引擎适配器专用接口: + - UpdateUnrealActor(string entityId, FTransform transform):更新Unreal Actor + - SpawnUnrealActor(ISimulationElement entity):生成Unreal Actor + - DestroyUnrealActor(string entityId):销毁Unreal Actor + - SyncUnrealWorld():同步Unreal世界状态 + +#### 6.2.2 数据交换接口 + +1. **IDataExporter接口** + + 数据导出接口: + - ExportSimulationData(string filePath):导出仿真数据 + - ExportEntityStates(IEnumerable entities):导出实体状态 + - ExportEventHistory(IEnumerable events):导出事件历史 + - SupportedFormats:支持的导出格式 + +2. **IDataImporter接口** + + 数据导入接口: + - ImportSimulationData(string filePath):导入仿真数据 + - ImportEntityStates(string filePath):导入实体状态 + - ImportEventHistory(string filePath):导入事件历史 + - ValidateImportData(string filePath):验证导入数据 + +3. **IRealtimeDataStream接口** + + 实时数据流接口: + - StartDataStream():启动数据流 + - StopDataStream():停止数据流 + - SendRealtimeData(T data):发送实时数据 + - OnDataReceived(Action handler):数据接收处理 + - StreamStatus:数据流状态 + +#### 6.2.3 网络通信接口 + +1. **INetworkManager接口** + + 网络管理器接口: + - StartServer(int port):启动服务器 + - ConnectToServer(string address, int port):连接服务器 + - SendMessage(T message):发送消息 + - OnMessageReceived(Action handler):消息接收处理 + - IsConnected:连接状态 + +2. **IMessageSerializer接口** + + 消息序列化接口: + - Serialize(T obj):序列化对象 + - Deserialize(byte[] data):反序列化对象 + - GetSupportedTypes():获取支持的类型 + - SerializationFormat:序列化格式 + +### 6.3 状态信息接口 + +#### 6.3.1 统一状态信息 + +1. **ElementStatusInfo类** + + 统一的状态信息结构: + - Id:实体唯一标识符 + - ElementType:实体类型名称 + - KState:运动学状态信息 + - IsActive:活动状态标志 + - Timestamp:状态时间戳 + - ExtendedProperties:扩展属性字典 + +2. **状态信息扩展属性** + + 不同实体类型的扩展属性: + - 导弹状态:飞行时间、飞行阶段、制导状态、升力加速度 + - 制导系统状态:制导加速度、干扰状态、目标锁定状态 + - 传感器状态:探测状态、干扰功率、传感器数据 + - 设备状态:生命值、属性信息、工作状态 + +3. **状态信息格式化** + + 状态信息的标准化输出: + - JSON格式序列化 + - 可读性格式化 + - 调试信息输出 + - 性能监控数据 + +#### 6.3.2 状态查询接口 + +1. **IStatusProvider接口** + + 状态提供者接口: + - GetStatusInfo():获取当前状态信息 + - GetHistoryStatus(DateTime timestamp):获取历史状态 + - GetStatusSummary():获取状态摘要 + - SubscribeStatusUpdates(Action handler):订阅状态更新 + +2. **IStatusCollector接口** + + 状态收集器接口: + - CollectAllStatus():收集所有实体状态 + - CollectStatusByType(string elementType):按类型收集状态 + - CollectStatusByFilter(Func filter):按条件收集状态 + - GetStatusStatistics():获取状态统计信息 + +### 6.4 配置接口 + +#### 6.4.1 配置管理接口 + +1. **IConfigurationManager接口** + + 配置管理器接口: + - LoadConfiguration(string configPath):加载配置 + - SaveConfiguration(string configPath):保存配置 + - GetConfigurationValue(string key):获取配置值 + - SetConfigurationValue(string key, T value):设置配置值 + - ValidateConfiguration():验证配置 + +2. **IConfigurationProvider接口** + + 配置提供者接口: + - GetConfiguration(string key):获取特定配置 + - GetAllConfigurations():获取所有配置 + - IsConfigurationAvailable(string key):检查配置可用性 + - GetConfigurationMetadata(string key):获取配置元数据 + +#### 6.4.2 动态配置接口 + +1. **IHotReloadable接口** + + 热重载接口: + - ReloadConfiguration():重新加载配置 + - OnConfigurationChanged(Action handler):配置变更通知 + - CanHotReload:是否支持热重载 + - LastReloadTime:最后重载时间 + +2. **IConfigurationValidator接口** + + 配置验证器接口: + - ValidateConfiguration(object config):验证配置 + - GetValidationRules():获取验证规则 + - GetValidationErrors():获取验证错误 + - IsValid:配置是否有效 + +### 6.5 扩展接口 + +#### 6.5.1 插件系统接口 + +1. **IPlugin接口** + + 插件基础接口: + - Initialize(IServiceProvider serviceProvider):初始化插件 + - Start():启动插件 + - Stop():停止插件 + - GetPluginInfo():获取插件信息 + - IsEnabled:插件启用状态 + +2. **IPluginManager接口** + + 插件管理器接口: + - LoadPlugin(string pluginPath):加载插件 + - UnloadPlugin(string pluginName):卸载插件 + - GetLoadedPlugins():获取已加载插件 + - EnablePlugin(string pluginName):启用插件 + - DisablePlugin(string pluginName):禁用插件 + +#### 6.5.2 自定义扩展接口 + +1. **ICustomGuidanceSystem接口** + + 自定义制导系统接口: + - RegisterCustomGuidance(string name, Type guidanceType):注册自定义制导 + - CreateCustomGuidance(string name):创建自定义制导实例 + - GetSupportedGuidanceTypes():获取支持的制导类型 + +2. **ICustomSensor接口** + + 自定义传感器接口: + - RegisterCustomSensor(string name, Type sensorType):注册自定义传感器 + - CreateCustomSensor(string name):创建自定义传感器实例 + - GetSupportedSensorTypes():获取支持的传感器类型 + +### 6.6 接口使用示例 + +#### 6.6.1 基本仿真控制 + +1. **仿真初始化和启动** + + 基本的仿真控制流程: + - 创建仿真管理器实例 + - 加载配置数据 + - 注册仿真实体 + - 启动仿真循环 + - 处理仿真事件 + +2. **实体创建和管理** + + 仿真实体的创建和管理: + - 从配置数据创建实体 + - 注册实体到仿真管理器 + - 设置实体初始状态 + - 订阅实体事件 + - 管理实体生命周期 + +#### 6.6.2 外部系统集成 + +1. **Unity集成示例** + + 与Unity引擎的集成: + - 创建Unity适配器 + - 同步仿真时间 + - 更新Unity对象变换 + - 处理Unity事件 + - 同步物理系统 + +2. **数据导出示例** + + 仿真数据的导出: + - 配置数据导出器 + - 选择导出格式 + - 导出实体状态 + - 导出事件历史 + - 验证导出数据 + +#### 6.6.3 自定义扩展 + +1. **自定义制导系统** + + 实现自定义制导算法: + - 继承IGuidanceSystem接口 + - 实现制导算法逻辑 + - 注册自定义制导类型 + - 配置制导参数 + - 测试制导性能 + +2. **自定义传感器** + + 实现自定义传感器: + - 继承ISensor接口 + - 实现传感器算法 + - 注册自定义传感器类型 + - 配置传感器参数 + - 验证传感器功能 ## 7. 附录 -### 7.1 关键参数表 +### 7.1 术语表 -#### 7.1.1 导弹基本参数 +#### 7.1.1 基础术语 -1. 运动参数 - - 初始速度:100米/秒 - - 最大速度:由配置文件指定 - - 最大加速度:由配置文件指定 - - 最大飞行时间:由配置文件指定 - - 最大飞行距离:由配置文件指定 +**仿真实体(Simulation Element)** +- 仿真系统中的基本对象,包括导弹、目标、传感器等 +- 继承自SimulationElement基类 +- 具有统一的生命周期管理和状态信息 -2. 安全参数 - - 自毁条件:超出最大飞行时间或距离 - - 爆炸半径:由配置文件指定 - - 命中概率:由配置文件指定 +**运动学状态(Kinematic State)** +- 描述实体运动状态的数据结构 +- 包含位置、朝向、速度等信息 +- 使用KinematicState类统一管理 -#### 7.1.2 制导系统参数 +**制导系统(Guidance System)** +- 控制导弹飞行轨迹的系统 +- 包括激光、红外、毫米波等多种制导方式 +- 实现IGuidanceSystem接口 -1. 激光驾束制导 - - 控制场直径:20米 - - 最小可探测功率:1e-3瓦特 - - PID参数: - - Kp = 30 - - Ki = 0.05 - - Kd = 5 - - Kc = 0.5 - - alpha = 0.2 +**事件系统(Event System)** +- 基于发布订阅模式的消息传递机制 +- 提供类型安全的事件处理 +- 支持异步事件处理和异常隔离 -2. 红外指令制导 - - 红外辐射功率:1000瓦特 - - 视场角:60度(π/3弧度) - - 角度测量精度:0.001弧度 - - 更新频率:10Hz - - 转向速率平滑因子:0.5 - - 提前量因子:0.3秒 +#### 7.1.2 制导术语 -3. 毫米波末制导 - - 最大探测距离:5000米 - - 视场角:45度(π/4弧度) - - 目标识别概率:0.95 - - 信噪比阈值:6dB - - 工作频率:94GHz - - 脉冲持续时间:1微秒 +**比例导引(Proportional Navigation)** +- 经典的制导算法 +- 基于视线角速度的制导方法 +- 广泛应用于各种制导系统 -4. 红外成像末制导 - - 最大探测距离:5000米 - - 视场角:30度(π/6弧度) - - 目标识别概率:0.9 - - 信噪比阈值:6dB +**四象限探测器(Quadrant Detector)** +- 激光制导中的关键传感器 +- 将探测区域分为四个象限 +- 通过功率分布确定目标方位 -5. 末敏子弹 - - 分离高度:1000米 - - 分离距离:1000米 - - 分离范围:50米 - - 初始速度:200米/秒 - - 攻击速度:2000米/秒 - - 螺旋扫描速度:8π弧度/秒 - - 垂直下降速度:10米/秒 - - 扫描锥角:30度 +**SwerlingRCS模型** +- 雷达散射截面的统计模型 +- 包括Swerling I、II、III、IV型 +- 用于毫米波制导的目标建模 -### 7.2 标准测试用例 +**升力模型(Lift Model)** +- 基于俯仰角计算升力加速度 +- 升力平衡点为5°俯仰角 +- 升力系数为1.0 m/s²/度 -#### 7.2.1 基础功能测试 +#### 7.1.3 技术术语 -1. 导弹初始化测试 - - 测试目的:验证导弹基本属性初始化 - - 验证项目:位置、方向、速度、状态标志 - - 预期结果:参数正确初始化,状态为未激活 +**智能路径解析(Smart Path Resolution)** +- ThreatSourceDataManager的核心功能 +- 自动查找DLL上级目录的data文件夹 +- 提供回退路径机制 -2. 飞行阶段测试 - - 测试目的:验证飞行阶段转换 - - 验证项目:发射、巡航、末制导阶段 - - 预期结果:正确执行阶段转换,状态正确更新 +**复合制导(Composite Guidance)** +- 集成多种制导方式的系统 +- 支持串行和并行制导模式 +- 提供制导冗余和性能优化 -3. 安全功能测试 - - 测试目的:验证自毁功能 - - 验证项目:最大飞行时间、最大飞行距离 - - 预期结果:超限时正确执行自毁 +**状态信息管理(Status Information Management)** +- ElementStatusInfo统一状态信息结构 +- GetStatusInfo方法的标准实现 +- 支持扩展属性和嵌套状态 -#### 7.2.2 制导系统测试 +**TOML配置格式** +- Tom's Obvious, Minimal Language +- 人类可读的配置文件格式 +- 支持类型安全和嵌套结构 -1. 激光驾束制导测试 - - 测试目的:验证光束跟踪功能 - - 验证项目:光束建立、跟踪、关闭 - - 预期结果:正确响应光束事件,执行制导 +#### 7.1.4 坐标系术语 -2. 红外指令制导测试 - - 测试目的:验证红外信号处理 - - 验证项目:信号点亮、熄灭、指令接收 - - 预期结果:正确处理红外信号,执行制导 +**世界坐标系(World Coordinate System)** +- 右手坐标系 +- X轴指向东方,Y轴指向上方,Z轴指向北方 +- 仿真场景的全局坐标系 -3. 末制导测试 - - 测试目的:验证末制导功能 - - 验证项目:目标探测、跟踪、制导 - - 预期结果:正确执行末制导过程 +**本体坐标系(Body Coordinate System)** +- 导弹本体的局部坐标系 +- X轴指向右翼,Y轴指向上方,Z轴指向后方 +- **前向方向为-Z轴**(重要变更) -### 7.3 数据格式说明 +**欧拉角(Euler Angles)** +- 偏航角(Yaw):绕Y轴旋转 +- 俯仰角(Pitch):绕X轴旋转 +- 滚转角(Roll):绕Z轴旋转 -#### 7.3.1 事件数据格式 +### 7.2 技术参数 -1. 实体事件 +#### 7.2.1 系统性能参数 - ```json - { - "eventType": "EntityEvent", - "entityId": "string", - "timestamp": "long", - "eventData": { - "position": {"x": 0.0, "y": 0.0, "z": 0.0}, - "status": "string" - } - } - ``` +**仿真性能** +- 最大实体数量:1000+ +- 仿真步长:0.001-1.0秒 +- 事件处理延迟:<1ms +- 内存使用:<500MB(1000实体) -2. 制导事件 +**制导精度** +- 激光半主动制导:CEP < 1m +- 激光驾束制导:CEP < 0.5m +- 红外成像制导:CEP < 2m +- 毫米波制导:CEP < 3m - ```json - { - "eventType": "GuidanceEvent", - "senderId": "string", - "targetId": "string", - "timestamp": "long", - "guidanceData": { - "command": "string", - "parameters": {} - } - } - ``` +**数据处理性能** +- 配置文件加载:<100ms +- 状态信息更新:<10μs/实体 +- 事件处理:<1μs/事件 +- 数据缓存命中率:>95% -3. 打击效果事件 +#### 7.2.2 物理模型参数 - ```json - { - "eventType": "HitEvent", - "missileId": "string", - "targetId": "string", - "timestamp": "long", - "hitData": { - "position": {"x": 0.0, "y": 0.0, "z": 0.0}, - "damage": "float" - } - } - ``` +**升力模型参数** +- 有效俯仰角范围:-5°到15° +- 升力平衡点:5°俯仰角 +- 升力系数:1.0 m/s²/度 +- 重力加速度:9.81 m/s² -#### 7.3.2 测试数据记录 +**传播模型参数** +- 激光大气透过率:0.7-0.9 +- 红外大气透过率:0.6-0.8 +- 毫米波降雨衰减:0.1-10 dB/km +- 视距传播距离:50km+ -1. 实体状态记录 +**噪声模型参数** +- Launch阶段噪声系数:0.1 +- Cruise阶段噪声系数:0.05 +- TerminalGuidance阶段噪声系数:0.02 +- 噪声分布:高斯分布 - ```json - { - "entityId": "string", - "timestamp": "long", - "position": {"x": 0.0, "y": 0.0, "z": 0.0}, - "velocity": {"x": 0.0, "y": 0.0, "z": 0.0}, - "orientation": {"yaw": 0.0, "pitch": 0.0, "roll": 0.0}, - "status": "string" - } - ``` +#### 7.2.3 配置参数范围 -2. 测试结果记录 +**导弹参数范围** +- 最大速度:100-2000 m/s +- 最大加速度:10-100 m/s² +- 最大飞行时间:10-300秒 +- 最大飞行距离:1-50公里 - ```json - { - "testId": "string", - "timestamp": "long", - "testName": "string", - "result": "string", - "details": { - "expectedValue": "any", - "actualValue": "any", - "description": "string" - } - } - ``` +**制导参数范围** +- 导航比例系数:2-6 +- 最大制导加速度:20-80 m/s² +- 制导激活距离:100-5000米 +- 制导精度要求:0.1-5米 + +**传感器参数范围** +- 激光功率:1-100瓦 +- 探测距离:100-10000米 +- 视场角:1-30度 +- 工作频率:1-100 GHz + +### 7.3 配置示例 + +#### 7.3.1 导弹配置示例 + +```toml +Type = "missile" + +[Name] +zh = "激光半主动制导导弹" +en = "Laser Semi-Active Guided Missile" + +[Properties] +MaxSpeed = 800.0 +MaxAcceleration = 50.0 +MaxFlightTime = 120.0 +MaxFlightDistance = 8000.0 +CruiseAttackAngle = 5.0 +GuidanceDownwardViewingAngle = 15.0 + +[LaserSemiActiveGuidanceConfig] +DetectorDiameter = 0.1 +FieldOfView = 30.0 +LockThreshold = 0.001 +MaxGuidanceAcceleration = 40.0 +NavigationGain = 3.0 +``` + +#### 7.3.2 复合制导配置示例 + +```toml +Type = "missile" + +[Name] +zh = "毫米波红外复合制导导弹" +en = "MMW/IR Composite Guided Missile" + +[[GuidanceSuite]] +Name = "毫米波制导" +GuidanceSystemType = "millimeterwave" +ActivationTrigger = "LaunchTime" +MaxAcquisitionGuidanceTime = 10.0 +MinStableGuidanceTime = 2.0 +ContinueOnFailure = true + +[[GuidanceSuite]] +Name = "红外成像制导" +GuidanceSystemType = "infraredimagingterminalguidance" +ActivationTrigger = "PreviousComplete" +MaxAcquisitionGuidanceTime = 15.0 +MinStableGuidanceTime = 3.0 +ContinueOnFailure = false + +[MillimeterWaveGuidanceConfig] +WorkingFrequency = 35.0 +TransmitPower = 10.0 +MaxDetectionRange = 5000.0 + +[InfraredImagingGuidanceConfig] +MaxDetectionRange = 3000.0 +FieldOfView = 20.0 +TargetRecognitionProbability = 0.9 +``` + +#### 7.3.3 传感器配置示例 + +```toml +Type = "sensor" + +[Name] +zh = "毫米波雷达" +en = "Millimeter Wave Radar" + +[Properties] +WorkingFrequency = 35.0 +TransmitPower = 15.0 +AntennaGain = 30.0 +MaxDetectionRange = 8000.0 +FieldOfView = 45.0 +SwerlingModel = "SwerlingII" +``` + +### 7.4 开发指南 + +#### 7.4.1 开发环境要求 + +**软件环境** +- .NET 8.0+ +- Visual Studio 2019+ +- NUnit 3.12+ +- Tomlyn 0.16+ + +**硬件环境** +- CPU:Intel i5 8代+ +- 内存:8GB+ +- 存储:SSD 100GB+ +- 显卡:支持DirectX 11+ + +**开发工具** +- Git版本控制 +- NuGet包管理 +- MSBuild构建系统 +- NUnit测试框架 + +#### 7.4.2 编码规范 + +**命名规范** +- 类名:PascalCase(如BaseMissile) +- 方法名:PascalCase(如GetStatusInfo) +- 属性名:PascalCase(如IsActive) +- 字段名:camelCase(如isGuidanceActive) +- 常量名:UPPER_CASE(如MAX_SPEED) + +**注释规范** +- 类注释:描述类的用途和功能 +- 方法注释:描述方法的功能、参数和返回值 +- 复杂逻辑注释:解释算法和业务逻辑 +- 注释语言:中文 + +**代码结构** +- 单一职责原则 +- 开闭原则 +- 依赖倒置原则 +- 接口隔离原则 + +#### 7.4.3 测试指南 + +**单元测试** +- 测试覆盖率:>80% +- 测试命名:Should_ExpectedBehavior_When_StateUnderTest +- 测试结构:Arrange-Act-Assert +- 测试数据:使用测试数据构建器 + +**集成测试** +- 端到端测试场景 +- 外部系统集成测试 +- 性能基准测试 +- 压力测试 + +**测试自动化** +- 持续集成测试 +- 回归测试自动化 +- 性能回归检测 +- 测试报告生成 + +### 7.5 故障排除 + +#### 7.5.1 常见问题 + +**配置文件问题** +- 问题:配置文件加载失败 +- 原因:文件路径错误或格式错误 +- 解决:检查路径解析日志,验证TOML格式 + +**制导系统问题** +- 问题:制导不生效 +- 原因:制导事件未接收或参数错误 +- 解决:检查事件订阅,验证制导参数 + +**性能问题** +- 问题:仿真运行缓慢 +- 原因:实体数量过多或算法复杂度高 +- 解决:优化算法,减少实体数量 + +#### 7.5.2 调试技巧 + +**日志分析** +- 启用详细日志输出 +- 分析错误堆栈信息 +- 跟踪关键方法调用 +- 监控性能指标 + +**状态检查** +- 使用GetStatusInfo方法 +- 检查实体状态信息 +- 验证制导系统状态 +- 监控事件流 + +**性能分析** +- 使用性能分析工具 +- 监控内存使用 +- 分析CPU占用 +- 检查线程安全 diff --git a/docs/examples/Integration/README.md b/docs/examples/Integration/README.md index aa685dd..5650781 100644 --- a/docs/examples/Integration/README.md +++ b/docs/examples/Integration/README.md @@ -1,6 +1,12 @@ # 第三方引擎集成示例 -本目录包含了将仿真系统与第三方引擎集成的示例代码。这些示例展示了如何使用适配器模式将不同的游戏引擎与仿真系统进行集成。 +本目录包含了将ThreatSource仿真系统与第三方引擎集成的示例代码。这些示例展示了如何使用适配器模式将不同的游戏引擎与仿真系统进行集成。 + +## 系统要求 + +- .NET 8.0 或更高版本 +- ThreatSource.dll 库文件 +- 对应的第三方引擎开发环境 ## 示例文件 @@ -8,207 +14,380 @@ 虚幻引擎(Unreal Engine)集成示例,展示了: -- 虚幻引擎与仿真系统的双向通信 -- 实体信息的同步和转换 +- 虚幻引擎与ThreatSource仿真系统的双向通信 +- Actor与仿真实体的映射和同步 - 事件的发布和订阅 -- 数据的适配和转换 +- 坐标系转换和数据适配 -#### 源代码 +#### 核心功能 ```csharp -#if NEVER // 使用编译指令确保此文件永远不会被编译 - -// 第三方系统实现适配器示例代码 -// 以虚幻引擎为例 -// 需要实现的方法: GetEntity, PublishToExternalSimulation, ReceiveFromExternalSimulation - using ThreatSource.Simulation; +using ThreatSource.Data; +using ThreatSource.Missile; -/// -/// 虚幻引擎适配器类,演示如何将第三方系统集成到仿真系统中 -/// -public class UnrealEngineAdapter : ISimulationAdapter +public class UnrealThreatSourceAdapter { - /// - /// 虚幻引擎API接口,定义了与虚幻引擎交互的基本方法 - /// - public interface IUnrealEngine - { - /// - /// 根据ID获取虚幻引擎中的Actor对象 - /// - object? GetActor(string id); + private ISimulationManager _simulationManager; + private ThreatSourceDataManager _dataManager; + private Dictionary _entityActors; - /// - /// 在虚幻引擎中生成导弹实体 - /// - void SpawnMissile(string senderId, string targetId); + public void UpdateSimulation() + { + // 更新仿真 + _simulationManager.UpdateSimulation(); + + // 同步实体状态到虚幻引擎Actor + SyncEntityStates(); } - private readonly IUnrealEngine _unrealEngine; - private readonly ISimulationManager _simulationManager; - - public UnrealEngineAdapter(IUnrealEngine unrealEngine, ISimulationManager simulationManager) + public string CreateMissile(string missileType, Vector3 location, string targetId) { - _unrealEngine = unrealEngine ?? throw new ArgumentNullException(nameof(unrealEngine)); - _simulationManager = simulationManager ?? throw new ArgumentNullException(nameof(simulationManager)); - } - - public object? GetEntity(string id) - { - return _unrealEngine.GetActor(id); - } - - public void PublishToExternalSimulation(T evt) - { - if (evt is MissileFireEvent missileEvt) - { - _unrealEngine.SpawnMissile(missileEvt.SenderId, missileEvt.TargetId); - } - } - - public void ReceiveFromExternalSimulation(T evt) - { - // 处理来自虚幻引擎的事件 + // 从配置创建导弹 + var missileData = _dataManager.GetMissile(missileType); + var missile = new InfraredImagingTerminalGuidanceMissile(missileId, missileData); + + // 在虚幻引擎中创建Actor + var missileActor = _unrealEngine.SpawnActor("BP_Missile", location, rotation); + + // 建立映射关系 + _entityActors[missileId] = missileActor; + + return missileId; } } - -#endif ``` ### [UnityExample.cs](UnityExample.cs) Unity引擎集成示例,展示了: -- Unity引擎与仿真系统的双向通信 -- GameObject与实体的映射和转换 +- Unity引擎与ThreatSource仿真系统的双向通信 +- GameObject与仿真实体的映射和转换 - MonoBehaviour生命周期管理 -- 事件系统的使用 +- 事件系统的使用和视觉效果处理 -#### 源代码 +#### 核心功能 ```csharp -#if NEVER // 使用编译指令确保此文件永远不会被编译 - -// 第三方系统实现适配器示例代码 -// 以Unity引擎为例 -// 需要实现的方法: GetEntity, PublishToExternalSimulation, ReceiveFromExternalSimulation - using ThreatSource.Simulation; -using UnityEngine; // 仅用于示例,实际项目中需要引用真实的Unity命名空间 +using ThreatSource.Data; +using ThreatSource.Missile; +using UnityEngine; -/// -/// Unity引擎适配器类,演示如何将Unity引擎集成到仿真系统中 -/// -public class UnityEngineAdapter : MonoBehaviour, ISimulationAdapter +public class UnityThreatSourceAdapter : MonoBehaviour { - /// - /// Unity引擎API接口,定义了与Unity引擎交互的基本方法 - /// - public interface IUnityEngine - { - /// - /// 根据ID获取Unity场景中的GameObject对象 - /// - GameObject GetGameObject(string id); - - /// - /// 在Unity场景中实例化导弹预制体 - /// - GameObject InstantiateMissile(string prefabPath, Vector3 position, Quaternion rotation); - } - - private readonly IUnityEngine _unityEngine; - private readonly ISimulationManager _simulationManager; - private const string MissilePrefabPath = "Prefabs/Missile"; - - public UnityEngineAdapter(IUnityEngine unityEngine, ISimulationManager simulationManager) - { - _unityEngine = unityEngine ?? throw new ArgumentNullException(nameof(unityEngine)); - _simulationManager = simulationManager ?? throw new ArgumentNullException(nameof(simulationManager)); - } - - public object? GetEntity(string id) - { - return _unityEngine.GetGameObject(id); - } - - public void PublishToExternalSimulation(T evt) - { - if (evt is MissileFireEvent missileEvt) - { - var sender = _unityEngine.GetGameObject(missileEvt.SenderId); - if (sender != null) - { - UnityMainThreadDispatcher.Instance.Enqueue(() => - { - var missile = _unityEngine.InstantiateMissile( - MissilePrefabPath, - sender.transform.position, - sender.transform.rotation - ); - - var missileComponent = missile.GetComponent(); - if (missileComponent != null) - { - missileComponent.SetTarget(missileEvt.TargetId); - } - }); - } - } - } - - public void ReceiveFromExternalSimulation(T evt) - { - if (evt is CollisionEvent collisionEvt) - { - _simulationManager.HandleCollision(collisionEvt); - } - } + private ISimulationManager _simulationManager; + private ThreatSourceDataManager _dataManager; + private Dictionary _entityGameObjects; private void Update() { - SyncSimulationState(); + // 更新仿真 + _simulationManager.UpdateSimulation(); + + // 同步实体状态到Unity GameObject + SyncEntityStates(); } - private void SyncSimulationState() + public void CreateMissile(string missileType, Vector3 position, string targetId) { - // 实现仿真状态同步逻辑 + // 从配置创建导弹 + var missileData = _dataManager.GetMissile(missileType); + var missile = new InfraredImagingTerminalGuidanceMissile(missileId, missileData); + + // 在Unity中创建GameObject + var missileGameObject = Instantiate(missilePrefab, position, Quaternion.identity); + + // 建立映射关系 + _entityGameObjects[missileId] = missileGameObject; } } - -#endif ``` ## 使用说明 -1. 这些文件仅作为参考示例,不参与实际编译(使用 `#if NEVER` 编译指令) -2. 实际项目中需要根据具体需求修改和扩展 -3. 示例中的接口和类名仅供参考,应根据实际项目规范调整 +### 基本集成流程 + +1. **初始化仿真系统** + ```csharp + _simulationManager = new SimulationManager(); + _dataManager = new ThreatSourceDataManager(); + _simulationManager.StartSimulation(timeStep); + ``` + +2. **订阅仿真事件** + ```csharp + _simulationManager.Subscribe(OnMissileFireEvent); + _simulationManager.Subscribe(OnMissileExplodeEvent); + _simulationManager.Subscribe(OnFlightPhaseChangeEvent); + ``` + +3. **创建实体映射** + ```csharp + // 创建仿真实体 + var missile = new InfraredImagingTerminalGuidanceMissile(id, data); + _simulationManager.RegisterEntity(missile); + + // 创建引擎对象(Unity GameObject 或 Unreal Actor) + var visualObject = CreateVisualObject(missile); + + // 建立映射关系 + _entityMappings[id] = visualObject; + ``` + +4. **同步状态** + ```csharp + private void SyncEntityStates() + { + foreach (var kvp in _entityMappings) + { + var entity = _simulationManager.GetEntity(kvp.Key); + var visualObject = kvp.Value; + + // 同步位置和朝向 + SyncTransform(entity, visualObject); + } + } + ``` + +### 坐标系转换 + +#### Unity集成 +```csharp +// ThreatSource -> Unity 坐标转换 +gameObject.transform.position = new Vector3( + entity.KState.Position.X, + entity.KState.Position.Z, // Unity使用Y作为高度 + entity.KState.Position.Y +); +``` + +#### 虚幻引擎集成 +```csharp +// ThreatSource -> Unreal 坐标转换(右手系 -> 左手系) +var location = new Vector3( + entity.KState.Position.X, + -entity.KState.Position.Y, // Y轴翻转 + entity.KState.Position.Z +); +``` + +### 事件处理 + +#### 导弹发射事件 +```csharp +private void OnMissileFireEvent(MissileFireEvent evt) +{ + // 播放发射特效 + var visualObject = GetVisualObject(evt.SenderId); + PlayLaunchEffect(visualObject); +} +``` + +#### 导弹爆炸事件 +```csharp +private void OnMissileExplodeEvent(MissileExplodeEvent evt) +{ + // 播放爆炸特效 + PlayExplosionEffect(evt.Position); + + // 销毁视觉对象 + DestroyVisualObject(evt.SenderId); +} +``` + +#### 飞行阶段变化事件 +```csharp +private void OnFlightPhaseChangeEvent(FlightPhaseChangeEvent evt) +{ + var visualObject = GetVisualObject(evt.SenderId); + + switch (evt.NewPhase) + { + case FlightPhase.Boost: + ShowBoostEffect(visualObject); + break; + case FlightPhase.Terminal: + ShowTerminalEffect(visualObject); + break; + } +} +``` ## 关键概念 ### 适配器模式 -- 实现 `ISimulationAdapter` 接口 -- 转换不同引擎的数据格式 -- 处理事件的发布和订阅 +适配器模式用于连接ThreatSource仿真系统和第三方引擎: + +- **仿真层**:ThreatSource核心仿真逻辑 +- **适配器层**:数据转换和事件映射 +- **引擎层**:Unity/Unreal等第三方引擎 ### 实体映射 -- 在仿真系统和游戏引擎之间建立实体对应关系 -- 同步实体状态和属性 -- 处理实体的创建和销毁 +在仿真系统和游戏引擎之间建立实体对应关系: + +```csharp +// 映射关系管理 +private Dictionary _entityMappings; + +// 创建映射 +public void CreateEntityMapping(string entityId, VisualObject visualObject) +{ + _entityMappings[entityId] = visualObject; +} + +// 同步状态 +public void SyncEntity(string entityId) +{ + var entity = _simulationManager.GetEntity(entityId); + var visualObject = _entityMappings[entityId]; + + // 同步位置、朝向、状态等 + SyncTransform(entity, visualObject); + SyncVisualState(entity, visualObject); +} +``` ### 事件系统 -- 定义统一的事件数据结构 -- 处理事件的双向转换 -- 确保事件的正确分发 +统一的事件处理机制: + +```csharp +// 事件订阅 +_simulationManager.Subscribe(handler); + +// 事件处理 +private void HandleEvent(TEvent evt) +{ + // 转换为引擎特定的操作 + ConvertToEngineOperation(evt); +} +``` + +## 性能优化 + +### 批量更新 +```csharp +// 批量同步实体状态,减少单次调用开销 +private void BatchSyncEntities() +{ + var entities = _simulationManager.GetAllEntities(); + foreach (var entity in entities) + { + if (_entityMappings.TryGetValue(entity.Id, out var visualObject)) + { + SyncEntity(entity, visualObject); + } + } +} +``` + +### 距离剔除 +```csharp +// 只同步视野范围内的实体 +private void SyncVisibleEntities(Vector3 viewerPosition, float maxDistance) +{ + foreach (var kvp in _entityMappings) + { + var entity = _simulationManager.GetEntity(kvp.Key); + var distance = Vector3.Distance(entity.KState.Position, viewerPosition); + + if (distance <= maxDistance) + { + SyncEntity(entity, kvp.Value); + } + } +} +``` + +### 帧率控制 +```csharp +// 控制仿真更新频率 +private float _lastUpdateTime; +private float _updateInterval = 0.02f; // 50Hz + +private void Update() +{ + if (Time.time - _lastUpdateTime >= _updateInterval) + { + _simulationManager.UpdateSimulation(); + SyncEntityStates(); + _lastUpdateTime = Time.time; + } +} +``` ## 注意事项 -1. 需要处理线程安全问题 -2. 注意性能优化,特别是在状态同步时 -3. 合理处理资源的加载和释放 -4. 确保异常处理的完整性 +### 通用注意事项 + +1. **线程安全**:确保仿真更新和引擎渲染在正确的线程中执行 +2. **性能优化**:合理控制同步频率,避免过度更新 +3. **资源管理**:正确处理实体的创建和销毁 +4. **异常处理**:添加完整的异常处理机制 + +### Unity特定注意事项 + +1. **主线程操作**:Unity API必须在主线程中调用 +2. **生命周期管理**:正确处理MonoBehaviour的生命周期 +3. **预制体管理**:合理组织和加载预制体资源 +4. **坐标系转换**:注意Unity的左手坐标系 + +### 虚幻引擎特定注意事项 + +1. **蓝图集成**:考虑与蓝图系统的集成 +2. **Actor生命周期**:正确管理Actor的创建和销毁 +3. **坐标系转换**:处理右手系到左手系的转换 +4. **性能分析**:使用虚幻引擎的性能分析工具 + +## 扩展功能 + +### 多人同步 +```csharp +// 网络同步支持 +public class NetworkedThreatSourceAdapter +{ + public void SyncEntityOverNetwork(string entityId, EntityState state) + { + // 通过网络同步实体状态 + NetworkManager.SendEntityUpdate(entityId, state); + } +} +``` + +### 录制回放 +```csharp +// 仿真录制和回放 +public class SimulationRecorder +{ + public void RecordFrame(float timestamp, List states) + { + // 记录当前帧的所有实体状态 + _recordedFrames.Add(new SimulationFrame(timestamp, states)); + } + + public void PlaybackFrame(int frameIndex) + { + // 回放指定帧的状态 + var frame = _recordedFrames[frameIndex]; + ApplyFrameStates(frame); + } +} +``` + +### 自定义渲染 +```csharp +// 自定义渲染效果 +public class CustomMissileRenderer +{ + public void RenderMissileTrail(Vector3 position, Vector3 velocity) + { + // 根据导弹状态渲染自定义拖尾效果 + var trailLength = velocity.magnitude * 0.1f; + RenderTrail(position, velocity.normalized, trailLength); + } +} +``` diff --git a/docs/examples/Integration/UEExample.cs b/docs/examples/Integration/UEExample.cs index 99bd3fd..fdc9200 100644 --- a/docs/examples/Integration/UEExample.cs +++ b/docs/examples/Integration/UEExample.cs @@ -1,177 +1,375 @@ #if NEVER // 使用编译指令确保此文件永远不会被编译 -// 第三方系统实现适配器示例代码 -// 以虚幻引擎为例 -// 需要实现的方法: GetEntity, PublishToExternalSimulation, ReceiveFromExternalSimulation +// 虚幻引擎集成示例代码 +// 展示如何将虚幻引擎与ThreatSource仿真系统集成 +// 需要实现的核心功能: 实体同步、事件处理、状态管理 using ThreatSource.Simulation; +using ThreatSource.Data; +using ThreatSource.Missile; /// -/// 虚幻引擎适配器类,演示如何将第三方系统集成到仿真系统中 +/// 虚幻引擎适配器类,演示如何将ThreatSource系统集成到虚幻引擎中 /// /// /// 该类提供了以下功能: /// - 虚幻引擎与仿真系统的双向通信 -/// - 实体信息的同步和转换 +/// - Actor与仿真实体的映射和同步 /// - 事件的发布和订阅 /// - 数据的适配和转换 /// 本示例代码仅作为参考,展示了基本的集成方法 /// -public class UnrealEngineAdapter : ISimulationAdapter +public class UnrealThreatSourceAdapter { - /// - /// 虚幻引擎API接口,定义了与虚幻引擎交互的基本方法 - /// - /// - /// 该接口包含: - /// - 获取Actor对象 - /// - 生成导弹实体 - /// 实际项目中需要根据具体需求扩展 - /// - public interface IUnrealEngine - { - /// - /// 根据ID获取虚幻引擎中的Actor对象 - /// - /// Actor的唯一标识符 - /// 对应的Actor对象,如果未找到则返回null - object? GetActor(string id); - - /// - /// 在虚幻引擎中生成导弹实体 - /// - /// 发射者ID - /// 目标ID - void SpawnMissile(string senderId, string targetId); - } - - /// - /// 虚幻引擎实例 - /// - /// - /// 用于与虚幻引擎进行实际交互 - /// 通过依赖注入方式提供 - /// - private readonly IUnrealEngine _unrealEngine; - /// /// 仿真管理器实例 /// - /// - /// 用于管理仿真系统的核心功能 - /// 处理事件分发和状态同步 - /// - private readonly ISimulationManager _simulationManager; + private ISimulationManager _simulationManager; + + /// + /// 数据管理器实例 + /// + private ThreatSourceDataManager _dataManager; + + /// + /// 实体映射字典:仿真实体ID -> 虚幻引擎Actor引用 + /// + private Dictionary _entityActors = new Dictionary(); + + /// + /// 虚幻引擎接口(需要在实际项目中实现) + /// + public interface IUnrealEngineInterface + { + /// + /// 在虚幻引擎中生成Actor + /// + /// Actor类名 + /// 位置 + /// 旋转 + /// 生成的Actor引用 + object SpawnActor(string actorClass, Vector3 location, Vector3 rotation); + + /// + /// 销毁Actor + /// + /// 要销毁的Actor + void DestroyActor(object actor); + + /// + /// 设置Actor位置 + /// + /// Actor引用 + /// 新位置 + void SetActorLocation(object actor, Vector3 location); + + /// + /// 设置Actor旋转 + /// + /// Actor引用 + /// 新旋转 + void SetActorRotation(object actor, Vector3 rotation); + + /// + /// 播放特效 + /// + /// 特效名称 + /// 播放位置 + void PlayEffect(string effectName, Vector3 location); + } + + private readonly IUnrealEngineInterface _unrealEngine; /// /// 初始化虚幻引擎适配器的新实例 /// - /// 虚幻引擎实例 - /// 仿真管理器实例 - /// - /// 构造过程: - /// - 验证参数有效性 - /// - 初始化引擎实例 - /// - 初始化管理器实例 - /// - public UnrealEngineAdapter(IUnrealEngine unrealEngine, ISimulationManager simulationManager) + /// 虚幻引擎接口实现 + public UnrealThreatSourceAdapter(IUnrealEngineInterface unrealEngine) { _unrealEngine = unrealEngine ?? throw new ArgumentNullException(nameof(unrealEngine)); - _simulationManager = simulationManager ?? throw new ArgumentNullException(nameof(simulationManager)); + InitializeSimulation(); } /// - /// 获取指定ID的实体对象 + /// 初始化仿真系统 /// - /// 实体的唯一标识符 - /// 对应的实体对象,如果未找到则返回null - /// - /// 该方法将仿真系统的实体ID转换为虚幻引擎中的实体 - /// - public object? GetEntity(string id) + private void InitializeSimulation() { - return _unrealEngine.GetActor(id); - } - - /// - /// 将事件发布到外部仿真系统(虚幻引擎) - /// - /// 事件类型 - /// 要发布的事件对象 - /// - /// 处理过程: - /// - 识别事件类型 - /// - 转换为虚幻引擎事件 - /// - 调用相应的引擎API - /// - public void PublishToExternalSimulation(T evt) - { - if (evt is MissileFireEvent missileEvt) + try { - _unrealEngine.SpawnMissile(missileEvt.SenderId, missileEvt.TargetId); + // 创建仿真管理器和数据管理器 + _simulationManager = new SimulationManager(); + _dataManager = new ThreatSourceDataManager(); + + // 启动仿真 + _simulationManager.StartSimulation(0.02); // 20ms时间步长 + + // 订阅仿真事件 + _simulationManager.Subscribe(OnMissileFireEvent); + _simulationManager.Subscribe(OnMissileExplodeEvent); + _simulationManager.Subscribe(OnFlightPhaseChangeEvent); + + Console.WriteLine("ThreatSource仿真系统初始化成功"); } - // ... 处理其他事件类型 - } - - /// - /// 接收来自外部仿真系统(虚幻引擎)的事件 - /// - /// 事件类型 - /// 接收到的事件对象 - /// - /// 处理过程: - /// - 接收虚幻引擎事件 - /// - 转换为仿真系统事件 - /// - 分发到相应的处理器 - /// - public void ReceiveFromExternalSimulation(T evt) - { - // 处理来自虚幻引擎的事件 - } - - /// - /// 处理来自虚幻引擎的事件 - /// - /// 事件类型标识符 - /// 事件数据对象 - /// - /// 处理过程: - /// - 解析事件类型 - /// - 转换事件数据 - /// - 调用相应的处理方法 - /// - public void OnUnrealEvent(string eventType, UnrealEventData data) - { - if (eventType == "MissileFired") + catch (Exception ex) { - var evt = new MissileFireEvent - { - SenderId = data.SenderId, - TargetId = data.TargetId + Console.WriteLine($"仿真系统初始化失败: {ex.Message}"); + } + } + + /// + /// 更新仿真(应在虚幻引擎的Tick中调用) + /// + public void UpdateSimulation() + { + if (_simulationManager != null) + { + // 更新仿真 + _simulationManager.UpdateSimulation(); + + // 同步实体状态 + SyncEntityStates(); + } + } + + /// + /// 同步仿真实体状态到虚幻引擎Actor + /// + private void SyncEntityStates() + { + foreach (var kvp in _entityActors) + { + string entityId = kvp.Key; + object actor = kvp.Value; + + // 获取仿真实体 + var entity = _simulationManager.GetEntity(entityId); + if (entity != null && entity.KState != null) + { + // 同步位置(转换坐标系:ThreatSource使用右手坐标系,虚幻引擎使用左手坐标系) + var location = new Vector3( + entity.KState.Position.X, + -entity.KState.Position.Y, // Y轴翻转 + entity.KState.Position.Z + ); + _unrealEngine.SetActorLocation(actor, location); + + // 同步旋转 + var orientation = entity.KState.Orientation; + var rotation = new Vector3( + orientation.Pitch * 180.0f / Math.PI, // 转换为度 + -orientation.Yaw * 180.0f / Math.PI, // Y轴翻转 + orientation.Roll * 180.0f / Math.PI + ); + _unrealEngine.SetActorRotation(actor, rotation); + } + } + } + + /// + /// 创建导弹实体 + /// + /// 导弹类型 + /// 初始位置 + /// 目标ID + /// 导弹ID + public string CreateMissile(string missileType, Vector3 location, string targetId) + { + try + { + // 从配置创建导弹 + var missileData = _dataManager.GetMissile(missileType); + string missileId = $"missile_{Guid.NewGuid():N}"; + + var missile = new InfraredImagingTerminalGuidanceMissile(missileId, missileData) + { + KState = new KinematicState + { + Position = new ThreatSource.Simulation.Vector3(location.X, -location.Y, location.Z), + Velocity = new ThreatSource.Simulation.Vector3(0, 0, 0), + Orientation = new Orientation(0, 0, 0) + } }; - _simulationManager.GetSimulationAdapter()?.ReceiveFromExternalSimulation(evt); + + // 注册到仿真系统 + _simulationManager.RegisterEntity(missile); + + // 在虚幻引擎中创建Actor + var missileActor = _unrealEngine.SpawnActor("BP_Missile", location, new Vector3(0, 0, 0)); + if (missileActor != null) + { + // 建立映射关系 + _entityActors[missileId] = missileActor; + + Console.WriteLine($"创建导弹: {missileId}, 目标: {targetId}"); + return missileId; + } + else + { + Console.WriteLine($"无法在虚幻引擎中创建导弹Actor"); + return null; + } + } + catch (Exception ex) + { + Console.WriteLine($"创建导弹失败: {ex.Message}"); + return null; } } -} - -/// -/// 虚幻引擎事件数据结构 -/// -/// -/// 用于封装虚幻引擎事件的相关数据 -/// 包含事件发送者和目标的标识信息 -/// -public class UnrealEventData -{ - /// - /// 获取或设置事件发送者的ID - /// - public string? SenderId { get; set; } /// - /// 获取或设置事件目标的ID + /// 创建目标实体 /// - public string? TargetId { get; set; } + /// 目标ID + /// 位置 + /// 速度 + /// 是否创建成功 + public bool CreateTarget(string targetId, Vector3 location, Vector3 velocity) + { + try + { + // 创建目标实体 + var target = new BaseEquipment(targetId) + { + KState = new KinematicState + { + Position = new ThreatSource.Simulation.Vector3(location.X, -location.Y, location.Z), + Velocity = new ThreatSource.Simulation.Vector3(velocity.X, -velocity.Y, velocity.Z), + Orientation = new Orientation(0, 0, 0) + } + }; + + // 注册到仿真系统 + _simulationManager.RegisterEntity(target); + + // 在虚幻引擎中创建Actor + var targetActor = _unrealEngine.SpawnActor("BP_Target", location, new Vector3(0, 0, 0)); + if (targetActor != null) + { + // 建立映射关系 + _entityActors[targetId] = targetActor; + + Console.WriteLine($"创建目标: {targetId}"); + return true; + } + else + { + Console.WriteLine($"无法在虚幻引擎中创建目标Actor"); + return false; + } + } + catch (Exception ex) + { + Console.WriteLine($"创建目标失败: {ex.Message}"); + return false; + } + } + + /// + /// 处理导弹发射事件 + /// + private void OnMissileFireEvent(MissileFireEvent evt) + { + Console.WriteLine($"导弹发射事件: {evt.SenderId} -> {evt.TargetId}"); + + // 播放发射特效 + if (_entityActors.TryGetValue(evt.SenderId, out object missileActor)) + { + // 获取导弹位置并播放发射特效 + var entity = _simulationManager.GetEntity(evt.SenderId); + if (entity != null && entity.KState != null) + { + var location = new Vector3( + entity.KState.Position.X, + -entity.KState.Position.Y, + entity.KState.Position.Z + ); + _unrealEngine.PlayEffect("FX_MissileLaunch", location); + } + } + } + + /// + /// 处理导弹爆炸事件 + /// + private void OnMissileExplodeEvent(MissileExplodeEvent evt) + { + Console.WriteLine($"导弹爆炸事件: {evt.SenderId} 在位置 {evt.Position}"); + + if (_entityActors.TryGetValue(evt.SenderId, out object missileActor)) + { + // 播放爆炸特效 + var location = new Vector3( + evt.Position.X, + -evt.Position.Y, + evt.Position.Z + ); + _unrealEngine.PlayEffect("FX_Explosion", location); + + // 销毁导弹Actor + _unrealEngine.DestroyActor(missileActor); + _entityActors.Remove(evt.SenderId); + } + } + + /// + /// 处理飞行阶段变化事件 + /// + private void OnFlightPhaseChangeEvent(FlightPhaseChangeEvent evt) + { + Console.WriteLine($"导弹 {evt.SenderId} 进入 {evt.NewPhase} 阶段"); + + // 可以根据飞行阶段改变导弹的视觉表现 + if (_entityActors.TryGetValue(evt.SenderId, out object missileActor)) + { + switch (evt.NewPhase) + { + case FlightPhase.Boost: + // 助推阶段:播放推进器特效 + _unrealEngine.PlayEffect("FX_BoostTrail", GetActorLocation(missileActor)); + break; + case FlightPhase.Midcourse: + // 中段飞行:调整拖尾特效 + _unrealEngine.PlayEffect("FX_MidcourseTrail", GetActorLocation(missileActor)); + break; + case FlightPhase.Terminal: + // 末段制导:改变特效颜色 + _unrealEngine.PlayEffect("FX_TerminalTrail", GetActorLocation(missileActor)); + break; + } + } + } + + /// + /// 获取Actor位置(示例方法,实际需要通过虚幻引擎API实现) + /// + private Vector3 GetActorLocation(object actor) + { + // 这里应该调用虚幻引擎的API获取Actor位置 + // 示例返回零向量 + return new Vector3(0, 0, 0); + } + + /// + /// 清理仿真系统 + /// + public void Cleanup() + { + if (_simulationManager != null) + { + _simulationManager.StopSimulation(); + _simulationManager = null; + } + + // 清理Actor映射 + foreach (var actor in _entityActors.Values) + { + _unrealEngine.DestroyActor(actor); + } + _entityActors.Clear(); + + Console.WriteLine("ThreatSource仿真系统已清理"); + } } /// @@ -179,63 +377,123 @@ public class UnrealEventData /// /// /// 该类演示了: -/// - 仿真系统的初始化 -/// - 适配器的配置 -/// - 事件的处理流程 +/// - 虚幻引擎仿真系统的初始化 +/// - 适配器的配置和使用 +/// - 事件系统的使用 /// 用于指导实际项目中的集成实现 /// -public class UnrealSimulation +public class UnrealSimulationExample { - /// - /// 仿真管理器实例 - /// - private readonly ISimulationManager _simulationManager; + private UnrealThreatSourceAdapter _adapter; + private UnrealThreatSourceAdapter.IUnrealEngineInterface _unrealEngine; /// - /// 虚幻引擎实例 + /// 初始化示例 /// - private readonly UnrealEngineAdapter.IUnrealEngine _unrealEngine; - - /// - /// 初始化虚幻引擎仿真的新实例 - /// - /// - /// 初始化过程: - /// - 创建仿真管理器 - /// - 创建引擎实例 - /// - 配置适配器 - /// - public UnrealSimulation() + /// 虚幻引擎接口实现 + public void Initialize(UnrealThreatSourceAdapter.IUnrealEngineInterface unrealEngine) { - _simulationManager = new SimulationManager(); - _unrealEngine = new UnrealEngineImplementation(); // 实际项目中需要实现这个类 - _simulationManager.SetSimulationAdapter( - new UnrealEngineAdapter(_unrealEngine, _simulationManager) - ); + _unrealEngine = unrealEngine; + _adapter = new UnrealThreatSourceAdapter(_unrealEngine); + + Console.WriteLine("虚幻引擎ThreatSource集成示例初始化完成"); } /// - /// 处理虚幻引擎事件 + /// 运行示例场景 /// - /// 事件类型标识符 - /// 事件数据对象 - /// - /// 处理过程: - /// - 识别事件类型 - /// - 转换事件数据 - /// - 通过适配器分发事件 - /// - public void OnUnrealEvent(string eventType, UnrealEventData data) + public void RunExampleScene() { - if (eventType == "MissileFired") + try { - var evt = new MissileFireEvent - { - SenderId = data.SenderId, - TargetId = data.TargetId - }; - _simulationManager.GetSimulationAdapter()?.ReceiveFromExternalSimulation(evt); + // 创建目标 + var targetLocation = new Vector3(5000, 0, 1000); // 5km距离,1km高度 + var targetVelocity = new Vector3(-50, 0, 0); // 50m/s向西移动 + _adapter.CreateTarget("target_001", targetLocation, targetVelocity); + + // 创建导弹 + var missileLocation = new Vector3(0, 0, 100); // 起始位置 + string missileId = _adapter.CreateMissile("IR_Missile_Example", missileLocation, "target_001"); + + if (!string.IsNullOrEmpty(missileId)) + { + Console.WriteLine($"示例场景创建成功 - 导弹: {missileId}, 目标: target_001"); + } + else + { + Console.WriteLine("示例场景创建失败"); + } } + catch (Exception ex) + { + Console.WriteLine($"运行示例场景失败: {ex.Message}"); + } + } + + /// + /// 更新仿真(应在虚幻引擎的Tick中调用) + /// + public void Tick() + { + _adapter?.UpdateSimulation(); + } + + /// + /// 清理资源 + /// + public void Cleanup() + { + _adapter?.Cleanup(); + Console.WriteLine("虚幻引擎ThreatSource集成示例已清理"); + } +} + +/// +/// 虚幻引擎接口的示例实现(仅用于演示) +/// +/// +/// 实际项目中需要使用真实的虚幻引擎API实现此接口 +/// +public class MockUnrealEngineInterface : UnrealThreatSourceAdapter.IUnrealEngineInterface +{ + private Dictionary _actorLocations = new Dictionary(); + private Dictionary _actorRotations = new Dictionary(); + + public object SpawnActor(string actorClass, Vector3 location, Vector3 rotation) + { + var actor = new object(); // 模拟Actor对象 + _actorLocations[actor] = location; + _actorRotations[actor] = rotation; + Console.WriteLine($"模拟生成Actor: {actorClass} 在位置 {location}"); + return actor; + } + + public void DestroyActor(object actor) + { + _actorLocations.Remove(actor); + _actorRotations.Remove(actor); + Console.WriteLine("模拟销毁Actor"); + } + + public void SetActorLocation(object actor, Vector3 location) + { + if (_actorLocations.ContainsKey(actor)) + { + _actorLocations[actor] = location; + } + } + + public void SetActorRotation(object actor, Vector3 rotation) + { + if (_actorRotations.ContainsKey(actor)) + { + _actorRotations[actor] = rotation; + } + } + + public void PlayEffect(string effectName, Vector3 location) + { + Console.WriteLine($"模拟播放特效: {effectName} 在位置 {location}"); } } diff --git a/docs/examples/Integration/UnityExample.cs b/docs/examples/Integration/UnityExample.cs index 6dd2e0c..c897174 100644 --- a/docs/examples/Integration/UnityExample.cs +++ b/docs/examples/Integration/UnityExample.cs @@ -1,10 +1,12 @@ #if NEVER // 使用编译指令确保此文件永远不会被编译 -// 第三方系统实现适配器示例代码 -// 以Unity引擎为例 -// 需要实现的方法: GetEntity, PublishToExternalSimulation, ReceiveFromExternalSimulation +// Unity引擎集成示例代码 +// 展示如何将Unity引擎与ThreatSource仿真系统集成 +// 需要实现的核心功能: 实体同步、事件处理、状态管理 using ThreatSource.Simulation; +using ThreatSource.Data; +using ThreatSource.Missile; using UnityEngine; // 仅用于示例,实际项目中需要引用真实的Unity命名空间 /// @@ -13,324 +15,412 @@ using UnityEngine; // 仅用于示例,实际项目中需要引用真实的Uni /// /// 该类提供了以下功能: /// - Unity引擎与仿真系统的双向通信 -/// - GameObject与实体的映射和转换 +/// - GameObject与仿真实体的映射和同步 /// - MonoBehaviour生命周期管理 /// - 事件的发布和订阅 -/// - 数据的适配和转换 /// 本示例代码仅作为参考,展示了基本的集成方法 /// -public class UnityEngineAdapter : MonoBehaviour, ISimulationAdapter +public class UnityThreatSourceAdapter : MonoBehaviour { - /// - /// Unity引擎API接口,定义了与Unity引擎交互的基本方法 - /// - /// - /// 该接口包含: - /// - 获取GameObject对象 - /// - 生成导弹预制体 - /// - 场景管理 - /// 实际项目中需要根据具体需求扩展 - /// - public interface IUnityEngine - { - /// - /// 根据ID获取Unity场景中的GameObject对象 - /// - /// GameObject的唯一标识符 - /// 对应的GameObject对象,如果未找到则返回null - GameObject GetGameObject(string id); - - /// - /// 在Unity场景中实例化导弹预制体 - /// - /// 预制体资源路径 - /// 生成位置 - /// 生成朝向 - /// 生成的导弹GameObject实例 - GameObject InstantiateMissile(string prefabPath, Vector3 position, Quaternion rotation); - } - - /// - /// Unity引擎实例 - /// - /// - /// 用于与Unity引擎进行实际交互 - /// 通过依赖注入方式提供 - /// - private readonly IUnityEngine _unityEngine; - /// /// 仿真管理器实例 /// - /// - /// 用于管理仿真系统的核心功能 - /// 处理事件分发和状态同步 - /// - private readonly ISimulationManager _simulationManager; + private ISimulationManager _simulationManager; + + /// + /// 数据管理器实例 + /// + private ThreatSourceDataManager _dataManager; + + /// + /// 实体映射字典:仿真实体ID -> Unity GameObject + /// + private Dictionary _entityGameObjects = new Dictionary(); /// /// 导弹预制体路径 /// - private const string MissilePrefabPath = "Prefabs/Missile"; + [SerializeField] + private string missilePrefabPath = "Prefabs/Missile"; /// - /// 初始化Unity引擎适配器的新实例 + /// 目标预制体路径 /// - /// Unity引擎实例 - /// 仿真管理器实例 - /// - /// 构造过程: - /// - 验证参数有效性 - /// - 初始化引擎实例 - /// - 初始化管理器实例 - /// - 注册Unity生命周期事件 - /// - public UnityEngineAdapter(IUnityEngine unityEngine, ISimulationManager simulationManager) + [SerializeField] + private string targetPrefabPath = "Prefabs/Target"; + + /// + /// 仿真时间步长 + /// + [SerializeField] + private float simulationTimeStep = 0.02f; + + /// + /// Unity生命周期方法:初始化 + /// + private void Awake() { - _unityEngine = unityEngine ?? throw new ArgumentNullException(nameof(unityEngine)); - _simulationManager = simulationManager ?? throw new ArgumentNullException(nameof(simulationManager)); + InitializeSimulation(); } /// - /// 获取指定ID的实体对象 + /// 初始化仿真系统 /// - /// 实体的唯一标识符 - /// 对应的实体对象,如果未找到则返回null - /// - /// 该方法将仿真系统的实体ID转换为Unity场景中的GameObject - /// - public object? GetEntity(string id) + private void InitializeSimulation() { - return _unityEngine.GetGameObject(id); - } - - /// - /// 将事件发布到外部仿真系统(Unity引擎) - /// - /// 事件类型 - /// 要发布的事件对象 - /// - /// 处理过程: - /// - 识别事件类型 - /// - 转换为Unity事件 - /// - 在Unity主线程中执行相应操作 - /// - public void PublishToExternalSimulation(T evt) - { - if (evt is MissileFireEvent missileEvt) + try { - // 获取发射者位置和朝向 - var sender = _unityEngine.GetGameObject(missileEvt.SenderId); - if (sender != null) - { - // 在Unity主线程中实例化导弹 - UnityMainThreadDispatcher.Instance.Enqueue(() => - { - var missile = _unityEngine.InstantiateMissile( - MissilePrefabPath, - sender.transform.position, - sender.transform.rotation - ); - - // 设置导弹目标 - var missileComponent = missile.GetComponent(); - if (missileComponent != null) - { - missileComponent.SetTarget(missileEvt.TargetId); - } - }); - } + // 创建仿真管理器和数据管理器 + _simulationManager = new SimulationManager(); + _dataManager = new ThreatSourceDataManager(); + + // 启动仿真 + _simulationManager.StartSimulation(simulationTimeStep); + + // 订阅仿真事件 + _simulationManager.Subscribe(OnMissileFireEvent); + _simulationManager.Subscribe(OnMissileExplodeEvent); + _simulationManager.Subscribe(OnFlightPhaseChangeEvent); + + Debug.Log("ThreatSource仿真系统初始化成功"); } - // ... 处理其他事件类型 - } - - /// - /// 接收来自外部仿真系统(Unity引擎)的事件 - /// - /// 事件类型 - /// 接收到的事件对象 - /// - /// 处理过程: - /// - 接收Unity事件 - /// - 转换为仿真系统事件 - /// - 分发到相应的处理器 - /// - public void ReceiveFromExternalSimulation(T evt) - { - // 处理来自Unity引擎的事件 - if (evt is CollisionEvent collisionEvt) + catch (System.Exception ex) { - // 处理碰撞事件 - _simulationManager.HandleCollision(collisionEvt); + Debug.LogError($"仿真系统初始化失败: {ex.Message}"); } } /// /// Unity生命周期方法:更新 /// - /// - /// 在每一帧执行: - /// - 更新实体状态 - /// - 处理输入事件 - /// - 同步仿真数据 - /// private void Update() { - // 在Unity的Update循环中同步状态 - SyncSimulationState(); + if (_simulationManager != null) + { + // 更新仿真 + _simulationManager.UpdateSimulation(); + + // 同步实体状态 + SyncEntityStates(); + } } /// - /// 同步仿真状态 + /// 同步仿真实体状态到Unity GameObject /// - /// - /// 同步过程: - /// - 更新实体位置和朝向 - /// - 同步物理状态 - /// - 更新传感器数据 - /// - private void SyncSimulationState() + private void SyncEntityStates() { - // 实现仿真状态同步逻辑 + foreach (var kvp in _entityGameObjects) + { + string entityId = kvp.Key; + GameObject gameObject = kvp.Value; + + // 获取仿真实体 + var entity = _simulationManager.GetEntity(entityId); + if (entity != null && entity.KState != null) + { + // 同步位置 + gameObject.transform.position = new Vector3( + entity.KState.Position.X, + entity.KState.Position.Z, // Unity使用Y作为高度 + entity.KState.Position.Y + ); + + // 同步旋转 + var orientation = entity.KState.Orientation; + gameObject.transform.rotation = Quaternion.Euler( + orientation.Pitch * Mathf.Rad2Deg, + orientation.Yaw * Mathf.Rad2Deg, + orientation.Roll * Mathf.Rad2Deg + ); + } + } } -} - -/// -/// Unity事件数据基类 -/// -/// -/// 用于封装Unity事件的基本信息 -/// 所有具体的Unity事件类型都应该继承此类 -/// -public abstract class UnityEventData -{ - /// - /// 获取或设置事件发送者的ID - /// - public string? SenderId { get; set; } /// - /// 获取或设置事件发生的时间戳 + /// 创建导弹实体 /// - public float TimeStamp { get; set; } -} - -/// -/// Unity碰撞事件数据 -/// -/// -/// 用于封装Unity物理碰撞事件的相关数据 -/// 包含碰撞的详细信息 -/// -public class CollisionEvent : UnityEventData -{ - /// - /// 获取或设置碰撞对象的ID - /// - public string? ColliderId { get; set; } - - /// - /// 获取或设置碰撞点的位置 - /// - public Vector3 CollisionPoint { get; set; } - - /// - /// 获取或设置碰撞的冲量 - /// - public float ImpulseForce { get; set; } -} - -/// -/// Unity仿真示例类 -/// -/// -/// 该类演示了: -/// - Unity仿真系统的初始化 -/// - MonoBehaviour组件的配置 -/// - 事件系统的使用 -/// 用于指导实际项目中的集成实现 -/// -public class UnitySimulation : MonoBehaviour -{ - /// - /// 仿真管理器实例 - /// - private readonly ISimulationManager _simulationManager; - - /// - /// Unity引擎实例 - /// - private readonly UnityEngineAdapter.IUnityEngine _unityEngine; - - /// - /// Unity引擎适配器实例 - /// - private UnityEngineAdapter _adapter; - - /// - /// Unity生命周期方法:初始化 - /// - /// - /// 初始化过程: - /// - 创建仿真管理器 - /// - 创建引擎实例 - /// - 配置适配器 - /// - 初始化场景 - /// - private void Awake() + /// 导弹类型 + /// 初始位置 + /// 目标ID + public void CreateMissile(string missileType, Vector3 position, string targetId) { - _simulationManager = new SimulationManager(); - _unityEngine = new UnityEngineImplementation(); // 实际项目中需要实现这个类 + try + { + // 从配置创建导弹 + var missileData = _dataManager.GetMissile(missileType); + string missileId = $"missile_{System.Guid.NewGuid():N}"; + + var missile = new InfraredImagingTerminalGuidanceMissile(missileId, missileData) + { + KState = new KinematicState + { + Position = new ThreatSource.Simulation.Vector3(position.x, position.z, position.y), + Velocity = new ThreatSource.Simulation.Vector3(0, 0, 0), + Orientation = new Orientation(0, 0, 0) + } + }; + + // 注册到仿真系统 + _simulationManager.RegisterEntity(missile); + + // 在Unity中创建GameObject + var missilePrefab = Resources.Load(missilePrefabPath); + if (missilePrefab != null) + { + var missileGameObject = Instantiate(missilePrefab, position, Quaternion.identity); + missileGameObject.name = missileId; + + // 添加导弹控制组件 + var missileController = missileGameObject.GetComponent(); + if (missileController == null) + { + missileController = missileGameObject.AddComponent(); + } + missileController.Initialize(missileId, targetId); + + // 建立映射关系 + _entityGameObjects[missileId] = missileGameObject; + + Debug.Log($"创建导弹: {missileId}, 目标: {targetId}"); + } + else + { + Debug.LogError($"无法加载导弹预制体: {missilePrefabPath}"); + } + } + catch (System.Exception ex) + { + Debug.LogError($"创建导弹失败: {ex.Message}"); + } + } + + /// + /// 创建目标实体 + /// + /// 目标ID + /// 位置 + /// 速度 + public void CreateTarget(string targetId, Vector3 position, Vector3 velocity) + { + try + { + // 创建目标实体 + var target = new BaseEquipment(targetId) + { + KState = new KinematicState + { + Position = new ThreatSource.Simulation.Vector3(position.x, position.z, position.y), + Velocity = new ThreatSource.Simulation.Vector3(velocity.x, velocity.z, velocity.y), + Orientation = new Orientation(0, 0, 0) + } + }; + + // 注册到仿真系统 + _simulationManager.RegisterEntity(target); + + // 在Unity中创建GameObject + var targetPrefab = Resources.Load(targetPrefabPath); + if (targetPrefab != null) + { + var targetGameObject = Instantiate(targetPrefab, position, Quaternion.identity); + targetGameObject.name = targetId; + + // 建立映射关系 + _entityGameObjects[targetId] = targetGameObject; + + Debug.Log($"创建目标: {targetId}"); + } + else + { + Debug.LogError($"无法加载目标预制体: {targetPrefabPath}"); + } + } + catch (System.Exception ex) + { + Debug.LogError($"创建目标失败: {ex.Message}"); + } + } + + /// + /// 处理导弹发射事件 + /// + private void OnMissileFireEvent(MissileFireEvent evt) + { + Debug.Log($"导弹发射事件: {evt.SenderId} -> {evt.TargetId}"); - // 创建并配置适配器 - _adapter = gameObject.AddComponent(); - _simulationManager.SetSimulationAdapter(_adapter); - - // 初始化场景 - InitializeScene(); + // 可以在这里添加视觉效果,如发射烟雾、声音等 + var missileGameObject = GetGameObject(evt.SenderId); + if (missileGameObject != null) + { + // 播放发射特效 + var particleSystem = missileGameObject.GetComponentInChildren(); + if (particleSystem != null) + { + particleSystem.Play(); + } + } } /// - /// 初始化Unity场景 + /// 处理导弹爆炸事件 /// - /// - /// 初始化过程: - /// - 加载必要的资源 - /// - 创建初始实体 - /// - 设置场景参数 - /// - private void InitializeScene() + private void OnMissileExplodeEvent(MissileExplodeEvent evt) { - // 实现场景初始化逻辑 + Debug.Log($"导弹爆炸事件: {evt.SenderId} 在位置 {evt.Position}"); + + var missileGameObject = GetGameObject(evt.SenderId); + if (missileGameObject != null) + { + // 播放爆炸特效 + var explosionPrefab = Resources.Load("Prefabs/Explosion"); + if (explosionPrefab != null) + { + Instantiate(explosionPrefab, missileGameObject.transform.position, Quaternion.identity); + } + + // 销毁导弹GameObject + Destroy(missileGameObject); + _entityGameObjects.Remove(evt.SenderId); + } + } + + /// + /// 处理飞行阶段变化事件 + /// + private void OnFlightPhaseChangeEvent(FlightPhaseChangeEvent evt) + { + Debug.Log($"导弹 {evt.SenderId} 进入 {evt.NewPhase} 阶段"); + + // 可以根据飞行阶段改变导弹的视觉表现 + var missileGameObject = GetGameObject(evt.SenderId); + if (missileGameObject != null) + { + var missileController = missileGameObject.GetComponent(); + if (missileController != null) + { + missileController.OnFlightPhaseChanged(evt.NewPhase); + } + } + } + + /// + /// 根据实体ID获取对应的GameObject + /// + private GameObject GetGameObject(string entityId) + { + _entityGameObjects.TryGetValue(entityId, out GameObject gameObject); + return gameObject; } /// /// Unity生命周期方法:销毁 /// - /// - /// 清理过程: - /// - 释放资源 - /// - 清理事件订阅 - /// - 保存必要数据 - /// private void OnDestroy() { - // 清理资源和状态 CleanupSimulation(); } /// /// 清理仿真系统 /// - /// - /// 清理过程: - /// - 停止所有协程 - /// - 移除事件监听 - /// - 销毁动态创建的对象 - /// private void CleanupSimulation() { - // 实现清理逻辑 + if (_simulationManager != null) + { + _simulationManager.StopSimulation(); + _simulationManager = null; + } + + // 清理GameObject映射 + foreach (var gameObject in _entityGameObjects.Values) + { + if (gameObject != null) + { + Destroy(gameObject); + } + } + _entityGameObjects.Clear(); + + Debug.Log("ThreatSource仿真系统已清理"); + } +} + +/// +/// 导弹控制器组件 +/// +public class MissileController : MonoBehaviour +{ + private string _missileId; + private string _targetId; + private TrailRenderer _trailRenderer; + + public void Initialize(string missileId, string targetId) + { + _missileId = missileId; + _targetId = targetId; + + // 获取拖尾渲染器 + _trailRenderer = GetComponent(); + if (_trailRenderer == null) + { + _trailRenderer = gameObject.AddComponent(); + } + } + + public void OnFlightPhaseChanged(FlightPhase newPhase) + { + // 根据飞行阶段调整视觉效果 + switch (newPhase) + { + case FlightPhase.Boost: + // 助推阶段:显示推进器火焰 + break; + case FlightPhase.Midcourse: + // 中段飞行:调整拖尾效果 + if (_trailRenderer != null) + { + _trailRenderer.enabled = true; + } + break; + case FlightPhase.Terminal: + // 末段制导:可能改变颜色或效果 + if (_trailRenderer != null) + { + _trailRenderer.material.color = Color.red; + } + break; + } + } +} + +/// +/// 示例使用脚本 +/// +public class ThreatSourceExample : MonoBehaviour +{ + private UnityThreatSourceAdapter _adapter; + + private void Start() + { + // 获取适配器组件 + _adapter = FindObjectOfType(); + if (_adapter == null) + { + _adapter = gameObject.AddComponent(); + } + + // 延迟创建示例场景 + Invoke(nameof(CreateExampleScene), 1.0f); + } + + private void CreateExampleScene() + { + // 创建目标 + _adapter.CreateTarget("target_001", new Vector3(1000, 0, 100), new Vector3(-50, 0, 0)); + + // 创建导弹 + _adapter.CreateMissile("IR_Missile_Example", Vector3.zero, "target_001"); } } diff --git a/docs/examples/Simulation/IRMissileSimulation.cpp b/docs/examples/Simulation/IRMissileSimulation.cpp index 0b491ae..af147d1 100644 --- a/docs/examples/Simulation/IRMissileSimulation.cpp +++ b/docs/examples/Simulation/IRMissileSimulation.cpp @@ -3,126 +3,160 @@ * 实际项目中需要: * 1. 创建C++/CLI项目 * 2. 引用ThreatSource.dll - * 3. 配置正确的目标框架 + * 3. 配置正确的目标框架(.NET 8.0) */ using namespace System; using namespace ThreatSource::Simulation; -using namespace ThreatSource::Guidance; -using namespace ThreatSource::Sensor; +using namespace ThreatSource::Data; +using namespace ThreatSource::Missile; namespace ThreatSourceWrapper { - // 包装类,用于在C++中使用仿真系统 + /// + /// C++/CLI包装类,用于在C++项目中使用红外成像制导导弹仿真 + /// public ref class IRMissileSimulationWrapper { private: - TestSimulationAdapter^ adapter; - SimulationEntity^ missile; - SimulationEntity^ target; - InfraredImagingGuidanceSystem^ guidanceSystem; + ISimulationManager^ simulationManager; + ThreatSourceDataManager^ dataManager; public: IRMissileSimulationWrapper() { - adapter = gcnew TestSimulationAdapter(); + simulationManager = gcnew SimulationManager(); + dataManager = gcnew ThreatSourceDataManager(); } + /// + /// 运行红外成像制导导弹仿真示例 + /// void RunSimulationExample() { try { - // 步骤1:创建导弹实体 - missile = gcnew SimulationEntity(); - missile->Id = "missile_001"; - missile->Position = Vector3(0, 0, 0); - missile->Velocity = Vector3(0, 0, 0); - missile->Mass = 100.0f; // kg + // 步骤1:初始化仿真管理器 + simulationManager->StartSimulation(0.02); // 20ms时间步长 - // 步骤2:配置红外成像制导系统 - guidanceSystem = gcnew InfraredImagingGuidanceSystem(); - guidanceSystem->FieldOfView = 60.0f; // 视场角(度) - guidanceSystem->TrackingRange = 20000.0f; // 最大跟踪距离(米) - guidanceSystem->UpdateRate = 50; // 制导更新频率(Hz) + // 步骤2:创建目标实体 + auto target = gcnew BaseEquipment("target_001"); + target->KState = gcnew KinematicState(); + target->KState->Position = Vector3(5000, 0, 1000); // 5km距离,1km高度 + target->KState->Velocity = Vector3(-50, 0, 0); // 50m/s向西移动 + target->KState->Orientation = Orientation(0, 0, 0); - missile->GuidanceSystem = guidanceSystem; + // 步骤3:从配置创建红外成像制导导弹 + auto missileData = dataManager->GetMissile("IR_Missile_Example"); + auto missile = gcnew InfraredImagingTerminalGuidanceMissile("missile_001", missileData); + missile->KState = gcnew KinematicState(); + missile->KState->Position = Vector3(0, 0, 100); // 起始位置 + missile->KState->Velocity = Vector3(200, 0, 0); // 初始速度200m/s + missile->KState->Orientation = Orientation(0, 0, 0); // 初始朝向 - // 步骤3:设置目标 - target = gcnew SimulationEntity(); - target->Id = "target_001"; - target->Position = Vector3(10000.0f, 1000.0f, 1000.0f); // 目标在10km外 - target->Velocity = Vector3(-100.0f, 0.0f, 0.0f); // 目标以100m/s速度移动 + // 步骤4:注册实体到仿真管理器 + simulationManager->RegisterEntity(target); + simulationManager->RegisterEntity(missile); - InfraredSignature^ signature = gcnew InfraredSignature(); - signature->Temperature = 400.0f; // 目标温度(开尔文) - signature->EmissivityFactor = 0.8f; - target->Signature = signature; + // 步骤5:订阅仿真事件 + simulationManager->Subscribe( + gcnew Action(this, &IRMissileSimulationWrapper::OnMissileExplode) + ); + simulationManager->Subscribe( + gcnew Action(this, &IRMissileSimulationWrapper::OnFlightPhaseChange) + ); - // 步骤4:配置仿真参数 - SimulationConfig^ config = gcnew SimulationConfig(); - config->TimeStep = 0.02f; // 仿真步长(秒) - config->MaxSimulationTime = 60.0f; // 最大仿真时间(秒) + // 步骤6:运行仿真循环 + double simulationTime = 0; + double maxTime = 60.0; // 最大仿真时间60秒 - EnvironmentConditions^ env = gcnew EnvironmentConditions(); - env->Temperature = 288.15f; // 环境温度(开尔文) - env->Pressure = 101325.0f; // 大气压力(帕) - env->Humidity = 0.5f; // 相对湿度 - config->EnvironmentConditions = env; + Console::WriteLine("开始红外成像制导导弹仿真..."); + Console::WriteLine("目标位置: ({0}, {1}, {2})", + target->KState->Position.X, + target->KState->Position.Y, + target->KState->Position.Z); + Console::WriteLine("导弹初始位置: ({0}, {1}, {2})", + missile->KState->Position.X, + missile->KState->Position.Y, + missile->KState->Position.Z); - // 步骤5:注册事件处理 - adapter->EntityUpdated += gcnew EntityUpdateHandler(this, &IRMissileSimulationWrapper::OnEntityUpdated); - adapter->GuidanceUpdate += gcnew GuidanceUpdateHandler(this, &IRMissileSimulationWrapper::OnGuidanceUpdate); - - // 步骤6:初始化仿真 - adapter->Initialize(config); - adapter->AddEntity(missile); - adapter->AddEntity(target); - - // 步骤7:启动仿真 - adapter->StartSimulation(); - - // 步骤8:等待仿真结束 - while (adapter->IsRunning) + while (simulationTime < maxTime && missile->IsActive) { - System::Threading::Thread::Sleep(100); + // 更新仿真 + simulationManager->UpdateSimulation(); + simulationTime = simulationManager->CurrentTime; + + // 每秒输出一次状态 + if (Math::Abs(simulationTime - Math::Floor(simulationTime)) < 0.02) + { + auto distance = Vector3::Distance(missile->KState->Position, target->KState->Position); + Console::WriteLine("时间: {0:F1}s, 距离目标: {1:F1}m, 导弹阶段: {2}", + simulationTime, distance, missile->FlightPhase); + } + + System::Threading::Thread::Sleep(1); // 避免阻塞 } - // 步骤9:获取仿真结果 - SimulationResults^ results = adapter->GetSimulationResults(); - Console::WriteLine(String::Format("仿真结束,命中精度: {0:F2}米", results->MissDistance)); + // 步骤7:输出仿真结果 + auto finalDistance = Vector3::Distance(missile->KState->Position, target->KState->Position); + Console::WriteLine("仿真结束 - 最终距离: {0:F2}m", finalDistance); + + if (finalDistance < 10.0) + { + Console::WriteLine("导弹成功命中目标!"); + } + else + { + Console::WriteLine("导弹未能命中目标。"); + } } catch (Exception^ e) { - Console::WriteLine(String::Format("仿真过程出错: {0}", e->Message)); + Console::WriteLine("仿真过程出错: {0}", e->Message); + } + finally { + // 清理资源 + simulationManager->StopSimulation(); } } private: - void OnEntityUpdated(SimulationEntity^ entity) + /// + /// 处理导弹爆炸事件 + /// + void OnMissileExplode(MissileExplodeEvent^ evt) { - Console::WriteLine(String::Format("实体 {0} 位置更新: ({1:F2}, {2:F2}, {3:F2})", - entity->Id, - entity->Position.X, - entity->Position.Y, - entity->Position.Z)); + Console::WriteLine("导弹 {0} 在位置 ({1}, {2}, {3}) 爆炸", + evt->SenderId, + evt->Position.X, + evt->Position.Y, + evt->Position.Z); } - void OnGuidanceUpdate(GuidanceInfo^ info) + /// + /// 处理飞行阶段变化事件 + /// + void OnFlightPhaseChange(FlightPhaseChangeEvent^ evt) { - Console::WriteLine(String::Format("制导更新: 距离目标 {0:F2}米", info->DistanceToTarget)); + Console::WriteLine("导弹 {0} 进入 {1} 阶段", evt->SenderId, evt->NewPhase); } }; } -// 示例:如何在原生C++代码中使用包装类 +/// +/// 示例:如何在原生C++代码中使用包装类 +/// int main() { try { auto simulation = gcnew ThreatSourceWrapper::IRMissileSimulationWrapper(); simulation->RunSimulationExample(); + + Console::WriteLine("按任意键退出..."); + Console::ReadKey(); return 0; } catch (Exception^ e) { - Console::WriteLine(String::Format("错误: {0}", e->Message)); + Console::WriteLine("错误: {0}", e->Message); return 1; } } \ No newline at end of file diff --git a/docs/examples/Simulation/IRMissileSimulation.cs b/docs/examples/Simulation/IRMissileSimulation.cs index 5014f7a..06d4840 100644 --- a/docs/examples/Simulation/IRMissileSimulation.cs +++ b/docs/examples/Simulation/IRMissileSimulation.cs @@ -1,8 +1,8 @@ using System; using System.Threading.Tasks; using ThreatSource.Simulation; -using ThreatSource.Guidance; -using ThreatSource.Sensor; +using ThreatSource.Data; +using ThreatSource.Missile; namespace ThreatSource.Examples { @@ -15,97 +15,133 @@ namespace ThreatSource.Examples /// public class IRMissileSimulationExample { - private TestSimulationAdapter _adapter; - private SimulationEntity _missile; - private SimulationEntity _target; - private InfraredImagingGuidanceSystem _guidanceSystem; + private ISimulationManager _simulationManager; + private ThreatSourceDataManager _dataManager; + public IRMissileSimulationExample() + { + _simulationManager = new SimulationManager(); + _dataManager = new ThreatSourceDataManager(); + } + + /// + /// 运行红外成像制导导弹仿真示例 + /// public async Task RunSimulationExample() { try { - // 步骤1:创建导弹实体 - _missile = new SimulationEntity - { - Id = "missile_001", - Position = new Vector3(0, 0, 0), - Velocity = new Vector3(0, 0, 0), - Mass = 100.0f // kg - }; + // 步骤1:初始化仿真管理器 + _simulationManager.StartSimulation(0.02); // 20ms时间步长 - // 步骤2:配置红外成像制导系统 - _guidanceSystem = new InfraredImagingGuidanceSystem + // 步骤2:创建目标实体 + var target = new BaseEquipment("target_001") { - FieldOfView = 60.0f, // 视场角(度) - TrackingRange = 20000.0f, // 最大跟踪距离(米) - UpdateRate = 50 // 制导更新频率(Hz) - }; - - _missile.GuidanceSystem = _guidanceSystem; - - // 步骤3:设置目标 - _target = new SimulationEntity - { - Id = "target_001", - Position = new Vector3(10000.0f, 1000.0f, 1000.0f), // 目标在10km外 - Velocity = new Vector3(-100.0f, 0.0f, 0.0f), // 目标以100m/s速度移动 - Signature = new InfraredSignature + KState = new KinematicState { - Temperature = 400.0f, // 目标温度(开尔文) - EmissivityFactor = 0.8f + Position = new Vector3(5000, 0, 1000), // 5km距离,1km高度 + Velocity = new Vector3(-50, 0, 0), // 50m/s向西移动 + Orientation = new Orientation(0, 0, 0) } }; - // 步骤4:配置仿真参数 - var config = new SimulationConfig + // 步骤3:从配置创建红外成像制导导弹 + var missileData = _dataManager.GetMissile("IR_Missile_Example"); + var missile = new InfraredImagingTerminalGuidanceMissile("missile_001", missileData) { - TimeStep = 0.02f, // 仿真步长(秒) - MaxSimulationTime = 60.0f, // 最大仿真时间(秒) - EnvironmentConditions = new EnvironmentConditions + KState = new KinematicState { - Temperature = 288.15f, // 环境温度(开尔文) - Pressure = 101325.0f, // 大气压力(帕) - Humidity = 0.5f // 相对湿度 + Position = new Vector3(0, 0, 100), // 起始位置 + Velocity = new Vector3(200, 0, 0), // 初始速度200m/s + Orientation = new Orientation(0, 0, 0) // 初始朝向 } }; - // 步骤5:创建仿真适配器并注册事件 - _adapter = new TestSimulationAdapter(); - _adapter.EntityUpdated += OnEntityUpdated; - _adapter.GuidanceUpdate += OnGuidanceUpdate; + // 步骤4:注册实体到仿真管理器 + _simulationManager.RegisterEntity(target); + _simulationManager.RegisterEntity(missile); - // 步骤6:初始化仿真 - await _adapter.Initialize(config); - await _adapter.AddEntity(_missile); - await _adapter.AddEntity(_target); + // 步骤5:订阅仿真事件 + _simulationManager.Subscribe(OnMissileExplode); + _simulationManager.Subscribe(OnFlightPhaseChange); - // 步骤7:启动仿真 - await _adapter.StartSimulation(); + // 步骤6:运行仿真循环 + double simulationTime = 0; + double maxTime = 60.0; // 最大仿真时间60秒 - // 步骤8:等待仿真结束 - while (_adapter.IsRunning) + Console.WriteLine("开始红外成像制导导弹仿真..."); + Console.WriteLine($"目标位置: {target.KState.Position}"); + Console.WriteLine($"导弹初始位置: {missile.KState.Position}"); + + while (simulationTime < maxTime && missile.IsActive) { - await Task.Delay(100); + // 更新仿真 + _simulationManager.UpdateSimulation(); + simulationTime = _simulationManager.CurrentTime; + + // 每秒输出一次状态 + if (simulationTime % 1.0 < 0.02) + { + var distance = Vector3.Distance(missile.KState.Position, target.KState.Position); + Console.WriteLine($"时间: {simulationTime:F1}s, 距离目标: {distance:F1}m, 导弹阶段: {missile.FlightPhase}"); + } + + await Task.Delay(1); // 避免阻塞 } - // 步骤9:获取仿真结果 - var results = await _adapter.GetSimulationResults(); - Trace.TraceInformation($"仿真结束,命中精度: {results.MissDistance:F2}米"); + // 步骤7:输出仿真结果 + var finalDistance = Vector3.Distance(missile.KState.Position, target.KState.Position); + Console.WriteLine($"仿真结束 - 最终距离: {finalDistance:F2}m"); + + if (finalDistance < 10.0) + { + Console.WriteLine("导弹成功命中目标!"); + } + else + { + Console.WriteLine("导弹未能命中目标。"); + } } catch (Exception ex) { - Trace.TraceError($"仿真过程出错: {ex.Message}"); + Console.WriteLine($"仿真过程出错: {ex.Message}"); + } + finally + { + // 清理资源 + _simulationManager.StopSimulation(); } } - private void OnEntityUpdated(SimulationEntity entity) + /// + /// 处理导弹爆炸事件 + /// + private void OnMissileExplode(MissileExplodeEvent evt) { - Trace.TraceInformation($"实体 {entity.Id} 位置更新: ({entity.Position.X:F2}, {entity.Position.Y:F2}, {entity.Position.Z:F2})"); + Console.WriteLine($"导弹 {evt.SenderId} 在位置 {evt.Position} 爆炸"); } - private void OnGuidanceUpdate(GuidanceInfo info) + /// + /// 处理飞行阶段变化事件 + /// + private void OnFlightPhaseChange(FlightPhaseChangeEvent evt) { - Trace.TraceInformation($"制导更新: 距离目标 {info.DistanceToTarget:F2}米"); + Console.WriteLine($"导弹 {evt.SenderId} 进入 {evt.NewPhase} 阶段"); + } + } + + /// + /// 示例程序入口点 + /// + public class Program + { + public static async Task Main(string[] args) + { + var example = new IRMissileSimulationExample(); + await example.RunSimulationExample(); + + Console.WriteLine("按任意键退出..."); + Console.ReadKey(); } } } \ No newline at end of file diff --git a/docs/examples/Simulation/README.md b/docs/examples/Simulation/README.md index 468fcf2..15f55e4 100644 --- a/docs/examples/Simulation/README.md +++ b/docs/examples/Simulation/README.md @@ -1,10 +1,16 @@ # 导弹仿真示例 -本目录包含了使用仿真系统进行导弹仿真的示例代码。这些示例展示了如何配置和运行不同类型的导弹仿真。 +本目录包含了使用ThreatSource仿真系统进行导弹仿真的示例代码。这些示例展示了如何配置和运行不同类型的导弹仿真。 ## 关于本库 -ThreatSource 是一个基于 .NET 8.0 的类库,提供了完整的导弹仿真功能。 +ThreatSource 是一个基于 .NET 8.0 的类库,提供了完整的导弹仿真功能,包括: + +- 多种制导系统(激光、红外、毫米波等) +- 运动学仿真和物理建模 +- 事件驱动的仿真架构 +- 智能数据管理系统 +- 外部系统集成支持 ## 系统要求 @@ -12,13 +18,15 @@ ThreatSource 是一个基于 .NET 8.0 的类库,提供了完整的导弹仿真 - .NET 8.0 或更高版本 - 通过 NuGet 包管理器安装或直接引用 ThreatSource.dll +- Visual Studio 2019+ 或 Visual Studio Code ### C++用户 本库是一个 .NET 类库,C++用户需要通过 C++/CLI 包装层来使用: - Windows 操作系统 -- Visual Studio 2019 或更高版本 +- Visual Studio 2019 或更高版本(支持C++/CLI) +- .NET 8.0 运行时 - 创建 C++/CLI 项目并引用 ThreatSource.dll ## 示例文件 @@ -27,116 +35,65 @@ ThreatSource 是一个基于 .NET 8.0 的类库,提供了完整的导弹仿真 红外成像制导导弹仿真示例,展示了: -- 如何创建和配置导弹实体 -- 如何设置红外成像制导系统 -- 如何配置仿真环境和参数 -- 如何运行仿真并获取结果 +- 如何使用SimulationManager管理仿真 +- 如何从配置文件创建导弹实体 +- 如何设置目标和仿真环境 +- 如何订阅和处理仿真事件 +- 如何运行仿真循环并获取结果 -#### 源代码 +#### 核心代码片段 ```csharp using ThreatSource.Simulation; +using ThreatSource.Data; using ThreatSource.Missile; -using ThreatSource.Sensor; -using ThreatSource.Target; -/// -/// 红外成像制导导弹仿真示例 -/// -public class IRMissileSimulation +public class IRMissileSimulationExample { - private readonly ISimulationManager _simulationManager; - private readonly IMissileFactory _missileFactory; - private readonly ITargetFactory _targetFactory; - private readonly ISensorFactory _sensorFactory; + private ISimulationManager _simulationManager; + private ThreatSourceDataManager _dataManager; - public IRMissileSimulation() + public async Task RunSimulationExample() { + // 1. 初始化仿真管理器 _simulationManager = new SimulationManager(); - _missileFactory = new MissileFactory(); - _targetFactory = new TargetFactory(); - _sensorFactory = new SensorFactory(); - } + _dataManager = new ThreatSourceDataManager(); + _simulationManager.StartSimulation(0.02); // 20ms时间步长 - /// - /// 运行仿真 - /// - public async Task RunSimulation() - { - // 创建目标 - var target = _targetFactory.CreateTarget(new TargetConfig + // 2. 创建目标实体 + var target = new BaseEquipment("target_001") { - Id = "target_001", - Position = new Vector3(1000, 0, 100), - Velocity = new Vector3(-100, 0, 0), - Signature = new IRSignature + KState = new KinematicState { - Temperature = 350, // 开尔文 - EmissivityFactor = 0.8f - } - }); - - // 创建导弹 - var missile = _missileFactory.CreateMissile(new MissileConfig - { - Id = "missile_001", - Position = new Vector3(0, 0, 0), - MaxSpeed = 800, // 米/秒 - MaxAcceleration = 30, // G - MaxTurnRate = 20 // 度/秒 - }); - - // 创建红外成像传感器 - var sensor = _sensorFactory.CreateSensor(new IRSensorConfig - { - Id = "sensor_001", - Resolution = new Vector2(640, 480), - FieldOfView = 60, // 度 - MinTemperature = 270, // 开尔文 - MaxTemperature = 400 // 开尔文 - }); - - // 配置仿真参数 - var config = new SimulationConfig - { - TimeStep = 0.02f, // 仿真步长(秒) - MaxSimulationTime = 60.0f, // 最大仿真时间(秒) - EnvironmentConditions = new EnvironmentConfig - { - Temperature = 288, // 开尔文 - Pressure = 101325, // 帕斯卡 - Humidity = 0.5f // 相对湿度 + Position = new Vector3(5000, 0, 1000), // 5km距离 + Velocity = new Vector3(-50, 0, 0), // 50m/s移动 + Orientation = new Orientation(0, 0, 0) } }; - // 初始化仿真 - await _simulationManager.Initialize(config); - - // 添加实体 - _simulationManager.AddEntity(target); - _simulationManager.AddEntity(missile); - _simulationManager.AddEntity(sensor); - - // 启动仿真 - await _simulationManager.StartSimulation(); - - // 等待仿真完成 - while (_simulationManager.IsRunning) + // 3. 从配置创建导弹 + var missileData = _dataManager.GetMissile("IR_Missile_Example"); + var missile = new InfraredImagingTerminalGuidanceMissile("missile_001", missileData) { - await Task.Delay(100); + KState = new KinematicState + { + Position = new Vector3(0, 0, 100), + Velocity = new Vector3(200, 0, 0), + Orientation = new Orientation(0, 0, 0) + } + }; + + // 4. 注册实体和事件 + _simulationManager.RegisterEntity(target); + _simulationManager.RegisterEntity(missile); + _simulationManager.Subscribe(OnMissileExplode); + + // 5. 运行仿真循环 + while (simulationTime < maxTime && missile.IsActive) + { + _simulationManager.UpdateSimulation(); + // 处理仿真状态... } - - // 获取仿真结果 - var results = _simulationManager.GetSimulationResults(); - ProcessResults(results); - } - - private void ProcessResults(SimulationResults results) - { - // 处理仿真结果 - Trace.TraceInformation($"仿真完成时间: {results.CompletionTime}秒"); - Trace.TraceInformation($"命中精度: {results.HitAccuracy}米"); - Trace.TraceInformation($"导引头跟踪时间: {results.TrackingTime}秒"); } } ``` @@ -146,199 +103,206 @@ public class IRMissileSimulation 这是一个使用C++/CLI的示例代码,展示了如何在C++项目中使用本库: - 如何创建C++/CLI包装层 -- 如何配置导弹实体 +- 如何配置导弹实体和目标 - 如何设置仿真参数 - 如何运行仿真并获取结果 -#### 源代码 +#### 核心代码片段 ```cpp -#include "ThreatSource.h" -using namespace System; using namespace ThreatSource::Simulation; +using namespace ThreatSource::Data; using namespace ThreatSource::Missile; -using namespace ThreatSource::Sensor; -using namespace ThreatSource::Target; -/// -/// C++/CLI包装类,用于在C++项目中使用仿真系统 -/// -public ref class SimulationWrapper +public ref class IRMissileSimulationWrapper { private: - ISimulationManager^ _simulationManager; - IMissileFactory^ _missileFactory; - ITargetFactory^ _targetFactory; - ISensorFactory^ _sensorFactory; + ISimulationManager^ simulationManager; + ThreatSourceDataManager^ dataManager; public: - SimulationWrapper() + void RunSimulationExample() { - _simulationManager = gcnew SimulationManager(); - _missileFactory = gcnew MissileFactory(); - _targetFactory = gcnew TargetFactory(); - _sensorFactory = gcnew SensorFactory(); - } + // 1. 初始化仿真系统 + simulationManager = gcnew SimulationManager(); + dataManager = gcnew ThreatSourceDataManager(); + simulationManager->StartSimulation(0.02); - void RunSimulation() - { - // 创建目标 - auto target = _targetFactory->CreateTarget(gcnew TargetConfig { - Id = "target_001", - Position = Vector3(1000, 0, 100), - Velocity = Vector3(-100, 0, 0), - Signature = gcnew IRSignature { - Temperature = 350, - EmissivityFactor = 0.8f - } - }); + // 2. 创建目标 + auto target = gcnew BaseEquipment("target_001"); + target->KState = gcnew KinematicState(); + target->KState->Position = Vector3(5000, 0, 1000); - // 创建导弹 - auto missile = _missileFactory->CreateMissile(gcnew MissileConfig { - Id = "missile_001", - Position = Vector3(0, 0, 0), - MaxSpeed = 800, - MaxAcceleration = 30, - MaxTurnRate = 20 - }); + // 3. 创建导弹 + auto missileData = dataManager->GetMissile("IR_Missile_Example"); + auto missile = gcnew InfraredImagingTerminalGuidanceMissile("missile_001", missileData); - // 创建传感器 - auto sensor = _sensorFactory->CreateSensor(gcnew IRSensorConfig { - Id = "sensor_001", - Resolution = Vector2(640, 480), - FieldOfView = 60, - MinTemperature = 270, - MaxTemperature = 400 - }); + // 4. 注册实体 + simulationManager->RegisterEntity(target); + simulationManager->RegisterEntity(missile); - // 配置仿真参数 - auto config = gcnew SimulationConfig { - TimeStep = 0.02f, - MaxSimulationTime = 60.0f, - EnvironmentConditions = gcnew EnvironmentConfig { - Temperature = 288, - Pressure = 101325, - Humidity = 0.5f - } - }; - - // 初始化仿真 - _simulationManager->Initialize(config)->Wait(); - - // 添加实体 - _simulationManager->AddEntity(target); - _simulationManager->AddEntity(missile); - _simulationManager->AddEntity(sensor); - - // 启动仿真 - _simulationManager->StartSimulation()->Wait(); - - // 等待仿真完成 - while (_simulationManager->IsRunning) + // 5. 运行仿真 + while (simulationTime < maxTime && missile->IsActive) { - System::Threading::Thread::Sleep(100); + simulationManager->UpdateSimulation(); + // 处理仿真状态... } - - // 获取仿真结果 - auto results = _simulationManager->GetSimulationResults(); - ProcessResults(results); - } - -private: - void ProcessResults(SimulationResults^ results) - { - Console::WriteLine("仿真完成时间: {0}秒", results->CompletionTime); - Console::WriteLine("命中精度: {0}米", results->HitAccuracy); - Console::WriteLine("导引头跟踪时间: {0}秒", results->TrackingTime); } }; - -// 在C++代码中使用 -int main() -{ - auto simulation = gcnew SimulationWrapper(); - simulation->RunSimulation(); - return 0; -} ``` ## 使用说明 -### C#/.NET使用方式 +### 基本仿真流程 -1. 创建仿真适配器 +1. **初始化仿真管理器** + ```csharp + var simulationManager = new SimulationManager(); + var dataManager = new ThreatSourceDataManager(); + simulationManager.StartSimulation(timeStep); + ``` - ```csharp - var adapter = new TestSimulationAdapter(); - ``` +2. **创建仿真实体** + ```csharp + // 从配置创建导弹 + var missileData = dataManager.GetMissile("missile_type"); + var missile = new InfraredImagingTerminalGuidanceMissile("id", missileData); + + // 创建目标 + var target = new BaseEquipment("target_id"); + ``` -2. 配置导弹和目标 +3. **配置实体状态** + ```csharp + missile.KState = new KinematicState + { + Position = new Vector3(x, y, z), + Velocity = new Vector3(vx, vy, vz), + Orientation = new Orientation(yaw, pitch, roll) + }; + ``` - ```csharp - var missile = new SimulationEntity - { - Id = "missile_001", - Position = new Vector3(0, 0, 0), - // ... 其他配置 - }; - ``` +4. **注册实体和事件** + ```csharp + simulationManager.RegisterEntity(missile); + simulationManager.RegisterEntity(target); + simulationManager.Subscribe(OnMissileExplode); + ``` -3. 设置仿真参数 +5. **运行仿真循环** + ```csharp + while (condition) + { + simulationManager.UpdateSimulation(); + // 处理仿真状态和结果 + } + ``` - ```csharp - var simConfig = new SimulationConfig - { - TimeStep = 0.02f, // 仿真步长(秒) - MaxSimulationTime = 60.0f, // 最大仿真时间(秒) - // ... 其他配置 - }; - ``` +### 配置文件要求 -4. 运行仿真 +示例代码需要相应的TOML配置文件: - ```csharp - await adapter.Initialize(simConfig); - await adapter.StartSimulation(); - ``` +```toml +# data/missiles/IR_Missile_Example.toml +Type = "missile" -### C++使用方式 +[Name] +zh = "红外成像制导导弹示例" +en = "IR Imaging Guided Missile Example" -1. 创建C++/CLI项目 - - 在Visual Studio中创建新的C++/CLI项目 - - 添加对 ThreatSource.dll 的引用 +[Properties] +MaxSpeed = 800.0 +MaxAcceleration = 50.0 +MaxFlightTime = 120.0 +MaxFlightDistance = 8000.0 -2. 创建包装类 +[InfraredImagingGuidanceConfig] +MaxDetectionRange = 5000.0 +FieldOfView = 30.0 +TargetRecognitionProbability = 0.9 +``` - ```cpp - public ref class SimulationWrapper - { - private: - TestSimulationAdapter^ adapter; +### C++/CLI项目配置 - public: - SimulationWrapper() - { - adapter = gcnew TestSimulationAdapter(); - } +1. **创建C++/CLI项目** + - 在Visual Studio中选择"CLR空项目" + - 设置目标框架为.NET 8.0 - // ... 其他包装方法 - }; - ``` +2. **添加引用** + ```xml + + path\to\ThreatSource.dll + + ``` -3. 在C++代码中使用 - - ```cpp - auto simulation = gcnew SimulationWrapper(); - simulation->Initialize(); - simulation->StartSimulation(); - ``` +3. **编译设置** + - 启用公共语言运行时支持 (/clr) + - 设置正确的.NET目标框架版本 ## 注意事项 -1. 确保所有参数单位正确(米、秒、开尔文等) -2. 合理设置仿真时间步长,平衡精度和性能 -3. 注意处理异步操作和事件回调 -4. C++/CLI注意事项: - - 仅支持Windows平台 - - 需要正确配置项目的目标框架 - - 注意托管和非托管资源的正确释放 +### 通用注意事项 + +1. **单位系统**:确保所有参数使用正确的单位(米、秒、弧度等) +2. **时间步长**:合理设置仿真时间步长,平衡精度和性能 +3. **资源管理**:正确处理仿真资源的创建和释放 +4. **异常处理**:添加适当的异常处理机制 + +### C#特定注意事项 + +1. 使用async/await处理异步操作 +2. 正确订阅和取消订阅事件 +3. 注意内存管理和垃圾回收 + +### C++/CLI特定注意事项 + +1. **平台限制**:仅支持Windows平台 +2. **内存管理**:注意托管和非托管资源的正确释放 +3. **类型转换**:正确处理托管和原生类型之间的转换 +4. **异常处理**:使用托管异常处理机制 + +## 扩展示例 + +### 添加自定义事件处理 + +```csharp +// 订阅多种事件 +simulationManager.Subscribe(OnFlightPhaseChange); +simulationManager.Subscribe(OnTargetHit); +simulationManager.Subscribe(OnGuidanceActivation); + +private void OnFlightPhaseChange(FlightPhaseChangeEvent evt) +{ + Console.WriteLine($"导弹 {evt.SenderId} 进入 {evt.NewPhase} 阶段"); +} +``` + +### 多导弹仿真 + +```csharp +// 创建多个导弹 +for (int i = 0; i < missileCount; i++) +{ + var missile = new InfraredImagingTerminalGuidanceMissile($"missile_{i:D3}", missileData); + // 设置不同的初始位置和参数 + simulationManager.RegisterEntity(missile); +} +``` + +### 实时状态监控 + +```csharp +// 在仿真循环中监控状态 +while (simulationManager.IsRunning) +{ + simulationManager.UpdateSimulation(); + + // 获取所有导弹状态 + var missiles = simulationManager.GetEntitiesByType(); + foreach (var missile in missiles) + { + var status = missile.GetStatusInfo(); + // 处理状态信息 + } +} +``` diff --git a/docs/index.md b/docs/index.md index c0fd8bc..d622b69 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,17 +4,36 @@ ## 简介 -威胁源仿真库是一个用于模拟和仿真各种威胁源的.NET类库。它提供了以下主要功能: +威胁源仿真库是一个基于 **.NET 8.0** 的高性能仿真类库,用于模拟和仿真各种威胁源。它提供了以下主要功能: -- 导弹仿真(包括各种类型的导弹) -- 目标仿真 -- 传感器仿真 -- 制导系统仿真 +- **导弹仿真**:支持多种制导系统(激光、红外、毫米波等) +- **目标仿真**:各类设备和目标的建模 +- **传感器仿真**:雷达、光电等传感器系统 +- **制导系统仿真**:完整的制导算法实现 +- **事件驱动架构**:高效的仿真事件系统 +- **智能数据管理**:TOML配置文件支持和智能路径解析 +- **外部系统集成**:支持Unity、虚幻引擎等第三方引擎集成 + +## 系统要求 + +### 基本要求 +- **.NET 8.0** 或更高版本 +- Windows、Linux 或 macOS 操作系统 +- Visual Studio 2019+ 或 Visual Studio Code(推荐) + +### C# 开发 +- .NET 8.0 SDK +- 支持 .NET 8.0 的 IDE + +### C++ 开发 +- Windows 操作系统 +- Visual Studio 2019+ (支持C++/CLI) +- .NET 8.0 运行时 ## 支持的开发语言 -- C# (.NET):原生支持,提供完整的API和功能 -- C++:通过C++/CLI包装层支持,可以在C++项目中使用全部功能 +- **C# (.NET)**:原生支持,提供完整的API和功能 +- **C++**:通过C++/CLI包装层支持,可以在C++项目中使用全部功能 ## 快速开始 @@ -24,28 +43,75 @@ 完整的API文档请参阅[API参考](./api/toc.yml)。 -## 集成示例 +## 示例代码 -### 第三方引擎集成 +### 基础仿真示例 + +- [仿真示例说明](examples/Simulation/README.md) - 基础仿真功能的详细说明 +- [C# 红外成像制导导弹仿真](examples/Simulation/IRMissileSimulation.cs) - C# 仿真示例 +- [C++ 红外成像制导导弹仿真](examples/Simulation/IRMissileSimulation.cpp) - C++/CLI 仿真示例 + +### 第三方引擎集成示例 - [集成示例说明](examples/Integration/README.md) - 第三方引擎集成的详细说明 -- [虚幻引擎示例](./examples/Integration/UEExample.cs) - 虚幻引擎集成示例代码 -- [Unity引擎示例](./examples/Integration/UnityExample.cs) - Unity引擎集成示例代码 +- [虚幻引擎集成示例](examples/Integration/UEExample.cs) - 虚幻引擎集成示例代码 +- [Unity引擎集成示例](examples/Integration/UnityExample.cs) - Unity引擎集成示例代码 -## 示例说明 +## 示例功能说明 -这些示例展示了如何将不同的游戏引擎与仿真系统集成: +### 基础仿真示例 -1. 虚幻引擎(UE)示例 - - 虚幻引擎与仿真系统的双向通信 - - 实体信息的同步和转换 - - 事件的发布和订阅 - - 数据的适配和转换 +这些示例展示了如何使用ThreatSource进行基础仿真: -2. Unity引擎示例 - - Unity引擎与仿真系统的双向通信 - - GameObject与实体的映射和转换 +1. **C# 仿真示例** + - 使用SimulationManager管理仿真 + - 从TOML配置文件创建导弹实体 + - 设置目标和仿真环境 + - 订阅和处理仿真事件 + - 运行仿真循环并获取结果 + +2. **C++/CLI 仿真示例** + - C++/CLI包装层的使用方法 + - 托管和非托管代码的交互 + - 事件处理和资源管理 + - 跨语言的仿真集成 + +### 第三方引擎集成示例 + +这些示例展示了如何将ThreatSource与游戏引擎集成: + +1. **虚幻引擎集成示例** + - ThreatSource与虚幻引擎的双向通信 + - Actor与仿真实体的映射和同步 + - 坐标系转换(右手系到左手系) + - 事件驱动的视觉效果处理 + +2. **Unity引擎集成示例** + - ThreatSource与Unity引擎的双向通信 + - GameObject与仿真实体的映射和转换 - MonoBehaviour生命周期管理 - - 事件系统的使用 + - 实时状态同步和视觉效果 + +## 核心特性 + +### 事件驱动架构 +- 类型安全的事件系统 +- 异步事件处理 +- 异常隔离机制 + +### 智能数据管理 +- TOML配置文件支持 +- 智能路径解析 +- 复合制导配置后处理 + +### 高性能仿真 +- 优化的运动学计算 +- 高效的碰撞检测 +- 可配置的仿真精度 + +### 扩展性设计 +- 模块化架构 +- 插件式制导系统 +- 灵活的实体系统 所有示例代码都提供了详细的注释和说明,可以作为实际开发的参考。 diff --git a/docs/toc.yml b/docs/toc.yml index e1927d1..4ca412b 100644 --- a/docs/toc.yml +++ b/docs/toc.yml @@ -8,7 +8,7 @@ metadata: items: - name: 简介 href: index.md -- name: 入门指南 +- name: 使用说明 href: articles/intro.md - name: API 文档 href: api/toc.yml diff --git a/tools/ComprehensiveMissileSimulator.cs b/tools/ComprehensiveMissileSimulator.cs index f19130f..487a020 100644 --- a/tools/ComprehensiveMissileSimulator.cs +++ b/tools/ComprehensiveMissileSimulator.cs @@ -19,7 +19,7 @@ namespace ThreatSource.Tools.MissileSimulation public event EventHandler? SimulationEnded; private ConsoleTraceListener consoleListener; - private EventTypeFilter logLevelFilter; + private readonly EventTypeFilter logLevelFilter; private readonly SimulationManager simulationManager; private readonly ThreatSourceFactory _threatSourceFactory;