ThreatSourceLibaray/docs/examples/Simulation
..
IRMissileSimulation.cpp
IRMissileSimulation.cs
README.md

导弹仿真示例

本目录包含了使用ThreatSource仿真系统进行导弹仿真的示例代码。这些示例展示了如何配置和运行不同类型的导弹仿真。

关于本库

ThreatSource 是一个基于 .NET 8.0 的类库,提供了完整的导弹仿真功能,包括:

  • 多种制导系统(激光、红外、毫米波等)
  • 运动学仿真和物理建模
  • 事件驱动的仿真架构
  • 智能数据管理系统
  • 外部系统集成支持

系统要求

C#/.NET 用户

  • .NET 8.0 或更高版本
  • 通过 NuGet 包管理器安装或直接引用 ThreatSource.dll
  • Visual Studio 2019+ 或 Visual Studio Code

C++用户

本库是一个 .NET 类库C++用户需要通过 C++/CLI 包装层来使用:

  • Windows 操作系统
  • Visual Studio 2019 或更高版本支持C++/CLI
  • .NET 8.0 运行时
  • 创建 C++/CLI 项目并引用 ThreatSource.dll

示例文件

C#示例 (IRMissileSimulation.cs)

红外成像制导导弹仿真示例,展示了:

  • 如何使用SimulationManager管理仿真
  • 如何从配置文件创建导弹实体
  • 如何设置目标和仿真环境
  • 如何订阅和处理仿真事件
  • 如何运行仿真循环并获取结果

核心代码片段

using ThreatSource.Simulation;
using ThreatSource.Data;
using ThreatSource.Missile;

public class IRMissileSimulationExample
{
    private ISimulationManager _simulationManager;
    private ThreatSourceDataManager _dataManager;

    public async Task RunSimulationExample()
    {
        // 1. 初始化仿真管理器
        _simulationManager = new SimulationManager();
        _dataManager = new ThreatSourceDataManager();
        _simulationManager.StartSimulation(0.02); // 20ms时间步长

        // 2. 创建目标实体
        var target = new BaseEquipment("target_001")
        {
            KState = new KinematicState
            {
                Position = new Vector3(5000, 0, 1000), // 5km距离
                Velocity = new Vector3(-50, 0, 0),     // 50m/s移动
                Orientation = new Orientation(0, 0, 0)
            }
        };

        // 3. 从配置创建导弹
        var missileData = _dataManager.GetMissile("IR_Missile_Example");
        var missile = new InfraredImagingTerminalGuidanceMissile("missile_001", missileData)
        {
            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<MissileExplodeEvent>(OnMissileExplode);

        // 5. 运行仿真循环
        while (simulationTime < maxTime && missile.IsActive)
        {
            _simulationManager.UpdateSimulation();
            // 处理仿真状态...
        }
    }
}

C++示例 (IRMissileSimulation.cpp)

这是一个使用C++/CLI的示例代码展示了如何在C++项目中使用本库:

  • 如何创建C++/CLI包装层
  • 如何配置导弹实体和目标
  • 如何设置仿真参数
  • 如何运行仿真并获取结果

核心代码片段

using namespace ThreatSource::Simulation;
using namespace ThreatSource::Data;
using namespace ThreatSource::Missile;

public ref class IRMissileSimulationWrapper
{
private:
    ISimulationManager^ simulationManager;
    ThreatSourceDataManager^ dataManager;

public:
    void RunSimulationExample()
    {
        // 1. 初始化仿真系统
        simulationManager = gcnew SimulationManager();
        dataManager = gcnew ThreatSourceDataManager();
        simulationManager->StartSimulation(0.02);

        // 2. 创建目标
        auto target = gcnew BaseEquipment("target_001");
        target->KState = gcnew KinematicState();
        target->KState->Position = Vector3(5000, 0, 1000);

        // 3. 创建导弹
        auto missileData = dataManager->GetMissile("IR_Missile_Example");
        auto missile = gcnew InfraredImagingTerminalGuidanceMissile("missile_001", missileData);

        // 4. 注册实体
        simulationManager->RegisterEntity(target);
        simulationManager->RegisterEntity(missile);

        // 5. 运行仿真
        while (simulationTime < maxTime && missile->IsActive)
        {
            simulationManager->UpdateSimulation();
            // 处理仿真状态...
        }
    }
};

使用说明

基本仿真流程

  1. 初始化仿真管理器

    var simulationManager = new SimulationManager();
    var dataManager = new ThreatSourceDataManager();
    simulationManager.StartSimulation(timeStep);
    
  2. 创建仿真实体

    // 从配置创建导弹
    var missileData = dataManager.GetMissile("missile_type");
    var missile = new InfraredImagingTerminalGuidanceMissile("id", missileData);
    
    // 创建目标
    var target = new BaseEquipment("target_id");
    
  3. 配置实体状态

    missile.KState = new KinematicState
    {
        Position = new Vector3(x, y, z),
        Velocity = new Vector3(vx, vy, vz),
        Orientation = new Orientation(yaw, pitch, roll)
    };
    
  4. 注册实体和事件

    simulationManager.RegisterEntity(missile);
    simulationManager.RegisterEntity(target);
    simulationManager.Subscribe<MissileExplodeEvent>(OnMissileExplode);
    
  5. 运行仿真循环

    while (condition)
    {
        simulationManager.UpdateSimulation();
        // 处理仿真状态和结果
    }
    

配置文件要求

示例代码需要相应的TOML配置文件

# data/missiles/IR_Missile_Example.toml
Type = "missile"

[Name]
zh = "红外成像制导导弹示例"
en = "IR Imaging Guided Missile Example"

[Properties]
MaxSpeed = 800.0
MaxAcceleration = 50.0
MaxFlightTime = 120.0
MaxFlightDistance = 8000.0

[InfraredImagingGuidanceConfig]
MaxDetectionRange = 5000.0
FieldOfView = 30.0
TargetRecognitionProbability = 0.9

C++/CLI项目配置

  1. 创建C++/CLI项目

    • 在Visual Studio中选择"CLR空项目"
    • 设置目标框架为.NET 8.0
  2. 添加引用

    <Reference Include="ThreatSource">
      <HintPath>path\to\ThreatSource.dll</HintPath>
    </Reference>
    
  3. 编译设置

    • 启用公共语言运行时支持 (/clr)
    • 设置正确的.NET目标框架版本

注意事项

通用注意事项

  1. 单位系统:确保所有参数使用正确的单位(米、秒、弧度等)
  2. 时间步长:合理设置仿真时间步长,平衡精度和性能
  3. 资源管理:正确处理仿真资源的创建和释放
  4. 异常处理:添加适当的异常处理机制

C#特定注意事项

  1. 使用async/await处理异步操作
  2. 正确订阅和取消订阅事件
  3. 注意内存管理和垃圾回收

C++/CLI特定注意事项

  1. 平台限制仅支持Windows平台
  2. 内存管理:注意托管和非托管资源的正确释放
  3. 类型转换:正确处理托管和原生类型之间的转换
  4. 异常处理:使用托管异常处理机制

扩展示例

添加自定义事件处理

// 订阅多种事件
simulationManager.Subscribe<FlightPhaseChangeEvent>(OnFlightPhaseChange);
simulationManager.Subscribe<TargetHitEvent>(OnTargetHit);
simulationManager.Subscribe<GuidanceActivationEvent>(OnGuidanceActivation);

private void OnFlightPhaseChange(FlightPhaseChangeEvent evt)
{
    Console.WriteLine($"导弹 {evt.SenderId} 进入 {evt.NewPhase} 阶段");
}

多导弹仿真

// 创建多个导弹
for (int i = 0; i < missileCount; i++)
{
    var missile = new InfraredImagingTerminalGuidanceMissile($"missile_{i:D3}", missileData);
    // 设置不同的初始位置和参数
    simulationManager.RegisterEntity(missile);
}

实时状态监控

// 在仿真循环中监控状态
while (simulationManager.IsRunning)
{
    simulationManager.UpdateSimulation();
    
    // 获取所有导弹状态
    var missiles = simulationManager.GetEntitiesByType<BaseMissile>();
    foreach (var missile in missiles)
    {
        var status = missile.GetStatusInfo();
        // 处理状态信息
    }
}