374 lines
14 KiB
C#
374 lines
14 KiB
C#
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);
|
||
}
|
||
}
|
||
}
|
||
}
|