ThreatSourceLibaray/ThreatSource/src/Guidance/BaseGuidanceSystem.cs

374 lines
14 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.Utils;
using ThreatSource.Simulation;
using ThreatSource.Jammable;
using System.Diagnostics;
using ThreatSource.Jammer;
using ThreatSource.Missile;
namespace ThreatSource.Guidance
{
/// <summary>
/// 基础制导系统类,实现了制导系统的基本功能框架
/// </summary>
/// <remarks>
/// 该类提供了制导系统的通用实现:
/// - 制导状态管理
/// - 运动参数记录
/// - 加速度限制
/// - 比例导引系数
/// - 干扰处理
/// - 事件发布
/// 是其他具体制导系统的基类
/// </remarks>
public abstract class BaseGuidanceSystem : SimulationElement, IGuidanceSystem, IJammable
{
/// <summary>
/// 干扰处理组件
/// </summary>
protected readonly JammableComponent _jammingComponent;
/// <summary>
/// 获取设备支持的干扰类型
/// </summary>
public abstract IEnumerable<JammingType> SupportedJammingTypes { get; }
/// <summary>
/// 获取设备支持的阻塞干扰类型
/// </summary>
public abstract IEnumerable<JammingType> SupportedBlockingJammingTypes { get; }
/// <summary>
/// 获取设备当前是否处于被干扰状态
/// </summary>
public bool IsJammed => _jammingComponent.IsJammed;
/// <summary>
/// 获取设备当前是否正受到有效的阻塞式干扰
/// </summary>
public bool IsBlockingJammed => _jammingComponent.IsBlockingJammed;
/// <summary>
/// 获取或设置父实体ID
/// </summary>
/// <remarks>
/// 记录所属导弹的ID
/// 用于事件发布和状态关联
/// </remarks>
public string MissileId { get; set; }
/// <summary>
/// 获取或设置是否有有效的制导信息
/// </summary>
/// <remarks>
/// true表示当前有可用的制导信息
/// false表示无法获得有效制导
/// 用于判断制导系统的工作状态
/// </remarks>
public bool HasGuidance { get; protected set; }
/// <summary>
/// 获取或设置最大加速度,单位:米/平方秒
/// </summary>
/// <remarks>
/// 定义了制导加速度的上限
/// 用于限制导弹的机动能力
/// 考虑结构和动力限制
/// </remarks>
public double MaxAcceleration { get; set; }
/// <summary>
/// 获取或设置比例导引系数
/// </summary>
/// <remarks>
/// 定义了制导指令的增益
/// 影响制导系统的响应特性
/// 通常取值3~5
/// </remarks>
public double ProportionalNavigationCoefficient { get; set; }
/// <summary>
/// 获取或设置制导加速度,单位:米/平方秒
/// </summary>
/// <remarks>
/// 存储计算得到的制导指令
/// 用于控制导弹的运动轨迹
/// </remarks>
protected Vector3D GuidanceAcceleration { get; set; }
/// <summary>
/// 初始化基础制导系统的新实例
/// </summary>
/// <param name="id">制导系统ID</param>
/// <param name="missileId">导弹ID</param>
/// <param name="maxAcceleration">最大加速度,单位:米/平方秒</param>
/// <param name="proportionalNavigationCoefficient">比例导引系数</param>
/// <param name="simulationManager">仿真管理器实例</param>
/// <remarks>
/// 构造过程:
/// - 初始化基类参数
/// - 初始化制导状态
/// - 设置运动参数
/// - 配置制导参数
/// - 初始化干扰处理
/// </remarks>
public BaseGuidanceSystem(string id, string missileId, double maxAcceleration, double proportionalNavigationCoefficient, ISimulationManager simulationManager)
: base(id, new KinematicState(), simulationManager)
{
MissileId = missileId;
if (SimulationManager.GetEntityById(MissileId) is BaseMissile missile)
{
KState = missile.KState;
}
HasGuidance = false;
GuidanceAcceleration = Vector3D.Zero;
MaxAcceleration = maxAcceleration;
ProportionalNavigationCoefficient = proportionalNavigationCoefficient;
// 初始化干扰处理组件
_jammingComponent = new JammableComponent(
positionProvider: () => base.KState.Position
);
// Subscribe to the events instead
_jammingComponent.JammingApplied += HandleJammingApplied;
_jammingComponent.JammingCleared += HandleJammingCleared;
// 子类需要在构造函数中设置支持的干扰类型和阈值
}
/// <summary>
/// 激活制导系统 (基类处理干扰事件订阅)
/// </summary>
public override void Activate()
{
if (!IsActive)
{
IsActive = true;
// 统一订阅 JammingEvent
SimulationManager.SubscribeToEvent<JammingEvent>(HandleJammingEvent);
SimulationManager.SubscribeToEvent<JammingStoppedEvent>(HandleJammingStoppedEvent);
// 子类应在此方法中调用 base.Activate() 并订阅其他需要的事件
}
// 调用 SimulationElement 的基类 Activate (如果存在)
// base.Activate(); // SimulationElement 似乎没有公开的 Activate
}
/// <summary>
/// 停用制导系统 (基类处理干扰事件取消订阅)
/// </summary>
public override void Deactivate()
{
if (IsActive)
{
IsActive = false;
// 统一取消订阅 JammingEvent和JammingStoppedEvent
SimulationManager.UnsubscribeFromEvent<JammingEvent>(HandleJammingEvent);
SimulationManager.UnsubscribeFromEvent<JammingStoppedEvent>(HandleJammingStoppedEvent);
// 子类应在此方法中调用 base.Deactivate() 并取消订阅其他事件
}
HasGuidance = false; // 停用时失去制导
GuidanceAcceleration = Vector3D.Zero;
base.Deactivate();
}
/// <summary>
/// 更新制导系统状态
/// </summary>
/// <param name="deltaTime">时间步长,单位:秒</param>
/// <remarks>
/// 实现 SimulationElement 的抽象方法
/// </remarks>
public override void Update(double deltaTime)
{
if (SimulationManager.GetEntityById(MissileId) is BaseMissile missile)
{
KState = missile.KState;
}
// 更新干扰状态
_jammingComponent.UpdateJammingStatus(deltaTime);
}
/// <summary>
/// 获取制导加速度指令
/// </summary>
/// <returns>三维制导加速度向量,单位:米/平方秒</returns>
/// <remarks>
/// 返回数据:
/// - X分量横向制导加速度
/// - Y分量垂直制导加速度
/// - Z分量纵向制导加速度
/// 用于导弹的轨迹控制
/// </remarks>
public Vector3D GetGuidanceAcceleration()
{
return GuidanceAcceleration;
}
/// <summary>
/// 获取制导系统的详细状态信息
/// </summary>
/// <returns>包含制导系统状态的信息对象</returns>
public override ElementStatusInfo GetStatusInfo()
{
// 获取基类状态信息
var statusInfo = base.GetStatusInfo();
// 添加制导系统特有属性
statusInfo.ExtendedProperties["HasGuidance"] = HasGuidance;
statusInfo.ExtendedProperties["IsJammed"] = IsJammed;
statusInfo.ExtendedProperties["IsBlockingJammed"] = IsBlockingJammed;
statusInfo.ExtendedProperties["GuidanceAcceleration"] = GuidanceAcceleration;
statusInfo.ExtendedProperties["MaxAcceleration"] = MaxAcceleration;
statusInfo.ExtendedProperties["ProportionalNavigationCoefficient"] = ProportionalNavigationCoefficient;
// 如果有父实体添加父实体ID
if (!string.IsNullOrEmpty(MissileId))
{
statusInfo.ExtendedProperties["ParentId"] = MissileId;
}
return statusInfo;
}
/// <summary>
/// 处理干扰事件
/// </summary>
/// <param name="evt">干扰事件</param>
protected virtual void HandleJammingEvent(JammingEvent evt)
{
if (evt != null)
{
// 在应用干扰前检查是否应该处理此干扰
if (ShouldHandleJamming(evt.Parameters))
{
ApplyJamming(evt.Parameters);
}
}
}
/// <summary>
/// 处理干扰事件
/// </summary>
/// <param name="evt">干扰事件</param>
protected virtual void HandleJammingStoppedEvent(JammingStoppedEvent evt)
{
if (evt != null)
{
ClearJamming(evt.Parameters);
}
}
/// <summary>
/// 判断是否应该处理传入的干扰参数(可被子类重写以添加特定检查)
/// </summary>
/// <param name="parameters">干扰参数</param>
/// <returns>如果应该处理则返回 true否则返回 false</returns>
protected virtual bool ShouldHandleJamming(JammingParameters parameters)
{
// 基类默认处理所有受支持类型的干扰
// 子类可以重写此方法添加额外检查,如波长/编码匹配
bool supported = SupportedJammingTypes.Contains(parameters.Type);
// if(!supported) Debug.WriteLine($"[BaseGuidanceSystem] {Id} 不支持干扰类型: {parameters.Type}");
return supported;
}
/// <summary>
/// 设置干扰阈值
/// </summary>
/// <param name="type">干扰类型</param>
/// <param name="threshold">阈值值(单位:瓦特)</param>
protected void SetJammingThreshold(JammingType type, double threshold)
{
_jammingComponent.SetJammingThreshold(type, threshold);
}
/// <summary>
/// 添加支持的干扰类型
/// </summary>
/// <param name="type">干扰类型</param>
protected void AddSupportedJammingType(JammingType type)
{
_jammingComponent.AddSupportedJammingType(type);
}
/// <summary>
/// 添加支持的阻塞干扰类型
/// </summary>
/// <param name="type">干扰类型</param>
/// <param name="threshold">干扰阈值(单位:瓦特)</param>
protected void AddSupportedBlockingJammingType(JammingType type, double threshold)
{
_jammingComponent.AddSupportedBlockingJammingType(type, threshold);
}
/// <summary>
/// 应用干扰
/// </summary>
/// <param name="parameters">干扰参数</param>
public virtual void ApplyJamming(JammingParameters parameters)
{
_jammingComponent.ApplyJamming(parameters);
}
/// <summary>
/// 清除干扰
/// </summary>
/// <param name="parameters">干扰参数</param>
public virtual void ClearJamming(JammingParameters parameters)
{
_jammingComponent.ClearJamming(parameters);
}
/// <summary>
/// 处理制导系统被干扰的事件
/// </summary>
/// <param name="parameters">干扰参数</param>
protected virtual void HandleJammingApplied(JammingParameters parameters)
{
// 子类可以重写此方法以实现特定的干扰响应
// 阻塞干扰是硬干扰
if (parameters.Mode == JammingMode.Blocking)
{
HasGuidance = false; // 硬干扰立即停止制导
Trace.TraceInformation($"[{this.GetType().Name}] 硬干扰已应用: {parameters.Type}");
}
}
/// <summary>
/// 处理制导系统干扰被清除的事件
/// </summary>
/// <param name="parameters">干扰参数</param>
protected virtual void HandleJammingCleared(JammingParameters parameters)
{
// 检查整体干扰状态
if (!_jammingComponent.IsJammed)
{
HasGuidance = true;
Trace.TraceInformation($"[{GetType().Name}] 所有干扰已清除。");
}
}
/// <summary>
/// 初始化干扰阈值和支持的干扰类型
/// </summary>
/// <param name="jammingResistanceThreshold">干扰抗性阈值,单位:瓦特</param>
/// <param name="supportedTypes">支持的干扰类型</param>
/// <param name="supportedBlockingTypes">支持的阻塞干扰类型</param>
/// <remarks>
/// 使用此方法初始化指示器的干扰处理参数:
/// - 设置干扰抗性阈值
/// - 配置支持的干扰类型
/// 子类应在构造函数中调用此方法
/// </remarks>
protected void InitializeJamming(double jammingResistanceThreshold, IEnumerable<JammingType> supportedTypes, IEnumerable<JammingType> supportedBlockingTypes)
{
_jammingComponent.LoadJammingConfigFromThreshold(jammingResistanceThreshold, supportedBlockingTypes);
foreach (var type in supportedTypes)
{
_jammingComponent.AddSupportedJammingType(type);
}
}
}
}