290 lines
9.3 KiB
C#
290 lines
9.3 KiB
C#
using ThreatSource.Simulation;
|
||
using ThreatSource.Utils;
|
||
using ThreatSource.Guidance;
|
||
using ThreatSource.Indicator;
|
||
|
||
namespace ThreatSource.Missile
|
||
{
|
||
/// <summary>
|
||
/// 红外指令制导导弹类,实现了红外指令制导的导弹功能
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 该类提供了红外指令制导导弹的核心功能:
|
||
/// - 红外热源管理(点亮和熄灭)
|
||
/// - 指令制导控制
|
||
/// - 飞行阶段管理
|
||
/// - 状态监控和事件处理
|
||
/// 通过红外测角仪和指令制导系统实现对导弹的制导控制
|
||
/// </remarks>
|
||
public class InfraredCommandGuidedMissile : BaseMissile
|
||
{
|
||
/// <summary>
|
||
/// 红外指令制导导弹阶段枚举
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 定义了导弹飞行的四个主要阶段:
|
||
/// - Launch:发射阶段,初始加速
|
||
/// - Cruise:巡航阶段,执行制导
|
||
/// - Explode:爆炸阶段,命中目标
|
||
/// - SelfDestruct:自毁阶段,触发自毁
|
||
/// </remarks>
|
||
private enum ICGM_Stage
|
||
{
|
||
Launch, // 发射阶段
|
||
Cruise // 巡航阶段
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取或设置当前飞行阶段
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 用于控制导弹在不同阶段的行为
|
||
/// 影响导弹的运动和制导方式
|
||
/// </remarks>
|
||
private ICGM_Stage currentStage;
|
||
|
||
/// <summary>
|
||
/// 获取或设置红外热源辐射功率
|
||
/// </summary>
|
||
/// <value>辐射功率,单位:瓦特</value>
|
||
/// <remarks>
|
||
/// 影响导弹的红外信号强度
|
||
/// 用于红外测角仪的跟踪和制导
|
||
/// </remarks>
|
||
public double RadiationPower { get; set; }
|
||
|
||
/// <summary>
|
||
/// 红外指令导引系统实例
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 负责处理制导指令和计算制导律
|
||
/// 包含自适应PID参数控制
|
||
/// </remarks>
|
||
private readonly InfraredCommandGuidanceSystem guidanceSystem;
|
||
|
||
/// <summary>
|
||
/// 红外测角仪实例
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 用于跟踪导弹的红外信号
|
||
/// 提供角度测量数据给制导系统
|
||
/// </remarks>
|
||
private InfraredTracker infraredTracker;
|
||
|
||
/// <summary>
|
||
/// 初始化红外指令制导导弹的新实例
|
||
/// </summary>
|
||
/// <param name="missileId">导弹ID</param>
|
||
/// <param name="properties">导弹属性配置</param>
|
||
/// <param name="launchParams">发射参数</param>
|
||
/// <param name="guidanceConfig">红外指令导引系统配置</param>
|
||
/// <param name="manager">仿真管理器实例</param>
|
||
/// <remarks>
|
||
/// 构造过程:
|
||
/// - 初始化基本属性
|
||
/// - 设置红外辐射功率
|
||
/// - 创建指令导引系统
|
||
/// - 配置PID参数
|
||
/// </remarks>
|
||
public InfraredCommandGuidedMissile(
|
||
string missileId,
|
||
MissileProperties properties,
|
||
MotionParameters launchParams,
|
||
InfraredCommandGuidanceConfig guidanceConfig,
|
||
ISimulationManager manager)
|
||
: base(missileId, properties, launchParams, manager)
|
||
{
|
||
infraredTracker = null!;
|
||
RadiationPower = 1000;
|
||
|
||
guidanceSystem = new InfraredCommandGuidanceSystem(
|
||
missileId + "_guidance",
|
||
guidanceConfig,
|
||
properties.MaxAcceleration,
|
||
properties.ProportionalNavigationCoefficient,
|
||
manager
|
||
);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新导弹运动状态
|
||
/// </summary>
|
||
/// <param name="deltaTime">时间步长,单位:秒</param>
|
||
/// <remarks>
|
||
/// 更新过程:
|
||
/// - 点亮红外热源
|
||
/// - 根据当前阶段更新状态
|
||
/// - 调用基类的运动更新
|
||
/// </remarks>
|
||
public override void Update(double deltaTime)
|
||
{
|
||
// 点亮红外热源
|
||
LightInfraredSource();
|
||
|
||
switch (currentStage)
|
||
{
|
||
case ICGM_Stage.Launch:
|
||
UpdateLaunchStage(deltaTime);
|
||
break;
|
||
case ICGM_Stage.Cruise:
|
||
UpdateCruiseStage(deltaTime);
|
||
break;
|
||
}
|
||
|
||
base.Update(deltaTime);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新发射阶段状态
|
||
/// </summary>
|
||
/// <param name="deltaTime">时间步长,单位:秒</param>
|
||
/// <remarks>
|
||
/// 发射阶段处理:
|
||
/// - 清除制导加速度
|
||
/// - 检查发射时间
|
||
/// - 转换到巡航阶段
|
||
/// </remarks>
|
||
private void UpdateLaunchStage(double deltaTime)
|
||
{
|
||
// 发射阶段
|
||
GuidanceAcceleration = Vector3D.Zero;
|
||
if (FlightTime >= Properties.MaxEngineBurnTime)
|
||
{
|
||
currentStage = ICGM_Stage.Cruise;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新巡航阶段状态
|
||
/// </summary>
|
||
/// <param name="deltaTime">时间步长,单位:秒</param>
|
||
/// <remarks>
|
||
/// 巡航阶段处理:
|
||
/// - 启用制导控制
|
||
/// - 更新制导系统
|
||
/// - 计算制导加速度
|
||
/// </remarks>
|
||
private void UpdateCruiseStage(double deltaTime)
|
||
{
|
||
guidanceSystem.Update(deltaTime, Position, Velocity);
|
||
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
|
||
IsGuidance = guidanceSystem.HasGuidance;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 处理制导指令事件
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 处理过程:
|
||
/// - 验证指令目标
|
||
/// - 获取红外测角仪
|
||
/// - 更新制导指令
|
||
/// </remarks>
|
||
private void HandleGuidanceCommand(InfraredGuidanceCommandEvent evt)
|
||
{
|
||
if (evt.TargetMissileId == Id)
|
||
{
|
||
if (infraredTracker == null && evt.SenderId != null)
|
||
{
|
||
if (SimulationManager.GetEntityById(evt.SenderId) is InfraredTracker tracker)
|
||
{
|
||
infraredTracker = tracker;
|
||
}
|
||
}
|
||
|
||
guidanceSystem.ReceiveGuidanceCommand(evt.TrackerToMissileVector, evt.TrackerToTargetVector);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 点亮红外热源
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 发布红外热源点亮事件
|
||
/// 包含当前辐射功率信息
|
||
/// </remarks>
|
||
public void LightInfraredSource()
|
||
{
|
||
SimulationManager.PublishEvent(new InfraredGuidanceMissileLightEvent { RadiationPower = this.RadiationPower, SenderId = this.Id });
|
||
}
|
||
|
||
/// <summary>
|
||
/// 发射导弹
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 发射过程:
|
||
/// - 调用基类发射方法
|
||
/// - 设置当前阶段为发射阶段
|
||
/// </remarks>
|
||
public override void Fire()
|
||
{
|
||
base.Fire();
|
||
currentStage = ICGM_Stage.Launch;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 熄灭红外热源
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 发布红外热源熄灭事件
|
||
/// 停止红外信号发射
|
||
/// </remarks>
|
||
public void LightOffInfraredSource()
|
||
{
|
||
SimulationManager.PublishEvent(new InfraredGuidanceMissileLightOffEvent { SenderId = this.Id });
|
||
}
|
||
|
||
/// <summary>
|
||
/// 激活导弹
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 激活过程:
|
||
/// - 调用基类激活方法
|
||
/// - 订阅制导指令事件
|
||
/// - 准备接收制导指令
|
||
/// </remarks>
|
||
public override void Activate()
|
||
{
|
||
base.Activate();
|
||
guidanceSystem.Activate();
|
||
// 点亮红外热源
|
||
LightInfraredSource();
|
||
// 订阅红外指令制导事件
|
||
SimulationManager.SubscribeToEvent<InfraredGuidanceCommandEvent>(HandleGuidanceCommand);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 停用导弹
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 停用过程:
|
||
/// - 调用基类停用方法
|
||
/// - 熄灭红外热源
|
||
/// - 取消订阅制导事件
|
||
/// </remarks>
|
||
public override void Deactivate()
|
||
{
|
||
base.Deactivate();
|
||
guidanceSystem.Deactivate();
|
||
// 熄灭红外热源
|
||
LightOffInfraredSource();
|
||
// 取消订阅红外指令制导事件
|
||
SimulationManager.UnsubscribeFromEvent<InfraredGuidanceCommandEvent>(HandleGuidanceCommand);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取导弹状态信息
|
||
/// </summary>
|
||
/// <returns>包含导弹状态的详细描述</returns>
|
||
/// <remarks>
|
||
/// 返回信息包括:
|
||
/// - 基本状态信息
|
||
public override ElementStatusInfo GetStatusInfo()
|
||
{
|
||
var statusInfo = base.GetStatusInfo();
|
||
statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
|
||
return statusInfo;
|
||
}
|
||
}
|
||
}
|