ThreatSourceLibaray/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs

290 lines
9.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
}
}