ThreatSourceLibaray/ThreatSource/src/Indicator/LaserDesignator.cs

459 lines
16 KiB
C#

using ThreatSource.Simulation;
using System;
using ThreatSource.Utils;
using System.Diagnostics;
using ThreatSource.Jamming;
using System.Collections.Generic;
namespace ThreatSource.Indicator
{
/// <summary>
/// 激光指示器类,实现了对目标的激光照射和制导功能
/// </summary>
/// <remarks>
/// 该类提供了激光指示器的核心功能:
/// - 激光目标照射
/// - 抗干扰处理
/// - 事件管理
/// - 状态监控
/// 通过激光照射目标实现半主动激光制导
/// </remarks>
public class LaserDesignator : IndicatorBase
{
/// <summary>
/// 获取设备支持的干扰类型
/// </summary>
/// <remarks>
/// 定义激光指示器可以被哪些类型的干扰影响
/// </remarks>
public override IEnumerable<JammingType> SupportedJammingTypes => new[]
{
JammingType.Laser,
JammingType.RadioFrequency
};
/// <summary>
/// 初始化干扰处理器
/// </summary>
/// <remarks>
/// 创建适用于激光指示器的干扰处理器
/// </remarks>
protected override void InitializeJammingHandler()
{
JammingHandler = new LaserDesignatorJammingHandler(this);
}
/// <summary>
/// 获取或设置干扰阈值,单位:分贝
/// </summary>
/// <remarks>
/// 定义了激光指示器的抗干扰能力
/// 当干扰信号强度超过此阈值时触发干扰效果
/// </remarks>
public double JammingThreshold { get; private set; } = 0.0;
/// <summary>
/// 获取或设置是否正在照射状态
/// </summary>
/// <remarks>
/// true表示正在执行激光照射
/// false表示未在照射状态
/// 控制激光发射状态
/// </remarks>
public bool IsIlluminationOn { get; private set; } = false;
/// <summary>
/// 获取或设置激光功率,单位:瓦特
/// </summary>
/// <remarks>
/// 定义了激光照射的能量强度
/// 默认功率为20瓦特
/// 影响照射距离和制导效果
/// </remarks>
public double LaserPower { get; set; } = 20;
/// <summary>
/// 获取或设置激光发散角,单位:弧度
/// </summary>
/// <remarks>
/// 定义了激光束的扩展角度
/// 默认发散角为0.5毫弧度
/// 影响照射面积和能量密度
/// </remarks>
public double LaserDivergenceAngle { get; private set; } = 0.5e-3;
/// <summary>
/// 获取或设置激光编码配置
/// </summary>
/// <remarks>
/// 包含激光信号的编码信息
/// 用于抗干扰和安全识别
/// </remarks>
public LaserCodeConfig LaserCodeConfig { get; set; }
/// <summary>
/// 初始化激光指示器的新实例
/// </summary>
/// <param name="id">激光指示器ID</param>
/// <param name="targetId">目标ID</param>
/// <param name="missileId">导弹ID</param>
/// <param name="config">配置参数</param>
/// <param name="initialMotionParameters">初始运动参数</param>
/// <param name="simulationManager">仿真管理器实例</param>
/// <remarks>
/// 构造过程:
/// - 初始化基本属性
/// - 设置目标和导弹关联
/// - 配置激光参数
/// - 设置初始状态
/// </remarks>
public LaserDesignator(string id, string targetId, string missileId, LaserDesignatorConfig config, InitialMotionParameters initialMotionParameters, ISimulationManager simulationManager)
: base(id, initialMotionParameters.Position, initialMotionParameters.Orientation, initialMotionParameters.InitialSpeed, simulationManager)
{
TargetId = targetId;
MissileId = missileId;
IsActive = false;
IsIlluminationOn = false;
LaserPower = config.LaserPower;
LaserDivergenceAngle = config.LaserDivergenceAngle;
LaserCodeConfig = config.LaserCodeConfig;
}
/// <summary>
/// 根据目标计算指示器朝向
/// </summary>
/// <param name="position">位置</param>
/// <param name="targetId">目标ID</param>
/// <param name="simulationManager">仿真管理器</param>
/// <returns>初始朝向</returns>
private static Orientation CalculateInitialOrientation(Vector3D position, string targetId, ISimulationManager simulationManager)
{
var target = simulationManager.GetEntityById(targetId) as SimulationElement;
if (target != null)
{
Vector3D direction = (target.Position - position).Normalize();
double yaw = Math.PI + Math.Atan2(direction.Z, direction.X);
double pitch = -Math.Asin(direction.Y);
return new Orientation(yaw, pitch, 0);
}
return new Orientation(Math.PI, 0, 0); // 默认朝向后方
}
/// <summary>
/// 更新激光指示器状态
/// </summary>
/// <param name="deltaTime">时间步长,单位:秒</param>
/// <remarks>
/// 更新过程:
/// - 检查激活状态
/// - 检查干扰状态
/// - 更新照射状态
/// - 发布状态事件
/// </remarks>
public override void Update(double deltaTime)
{
if (IsActive && !IsJammed)
{
UpdateOrientation();
if (IsIlluminationOn)
{
PublishIlluminationUpdateEvent();
}
}
}
private void UpdateOrientation()
{
if (TargetId != null)
{
var target = SimulationManager.GetEntityById(TargetId) as SimulationElement;
if (target != null)
{
Vector3D direction = (target.Position - Position).Normalize();
double yaw = Math.PI + Math.Atan2(direction.Z, direction.X);
double pitch = -Math.Asin(direction.Y);
Orientation = new Orientation(yaw, pitch, 0);
}
}
}
/// <summary>
/// 开始激光照射
/// </summary>
/// <remarks>
/// 启动过程:
/// - 设置照射状态
/// - 记录开始时间
/// - 发布开始事件
/// - 输出状态信息
/// </remarks>
private void StartLaserIllumination()
{
if (!IsIlluminationOn)
{
IsIlluminationOn = true;
PublishIlluminationStartEvent();
}
}
/// <summary>
/// 停止激光照射
/// </summary>
/// <remarks>
/// 停止过程:
/// - 清除照射状态
/// - 记录停止时间
/// - 发布停止事件
/// - 输出状态信息
/// </remarks>
private void StopLaserIllumination()
{
if (IsIlluminationOn)
{
IsIlluminationOn = false;
PublishIlluminationStopEvent();
}
}
/// <summary>
/// 处理激光干扰事件
/// </summary>
/// <param name="evt">激光干扰事件数据</param>
/// <remarks>
/// 处理过程:
/// - 验证目标ID
/// - 计算干扰效果
/// - 更新干扰状态
/// - 处理工作模式
/// </remarks>
private void OnLaserJamming(LaserJammingEvent evt)
{
if (evt.TargetId == TargetId && TargetId != null && SimulationManager.GetEntityById(TargetId) is Target.Tank tank)
{
double distanceToTarget = Vector3D.Distance(Position, tank.Position);
double jammingEffectiveness = 20 * Math.Log10(evt.JammingPower) - 20 * Math.Log10(distanceToTarget) - 20 * Math.Log10(4 * Math.PI);
Debug.WriteLine($"激光目标指示器 {Id} 收到干扰事件,干扰功率: {evt.JammingPower:F2}, 距离: {distanceToTarget:F2}, 干扰效果: {jammingEffectiveness:F2} dB, 阈值: {JammingThreshold:F2} dB");
if (jammingEffectiveness > JammingThreshold)
{
if (!IsJammed)
{
Debug.WriteLine($"激光目标指示器 {Id} 被干扰,停止工作");
// 应用干扰
var parameters = new JammingParameters
{
Type = JammingType.Laser,
Power = evt.JammingPower,
Direction = new Vector3D(1, 0, 0) // 简化处理
};
ApplyJamming(parameters);
StopLaserIllumination();
}
}
else
{
if (IsJammed)
{
Debug.WriteLine($"激光目标指示器 {Id} 干扰解除,恢复工作");
// 清除干扰
ClearJamming(JammingType.Laser);
}
}
}
}
/// <summary>
/// 激活激光指示器
/// </summary>
/// <remarks>
/// 激活过程:
/// - 设置激活状态
/// - 清除干扰状态
/// - 开始激光照射
/// - 订阅相关事件
/// - 调用基类激活
/// </remarks>
public override void Activate()
{
if (!IsActive)
{
IsActive = true;
// 先订阅事件
SimulationManager.SubscribeToEvent<LaserJammingEvent>(OnLaserJamming);
// 再开始照射
StartLaserIllumination();
}
base.Activate();
}
/// <summary>
/// 停用激光指示器
/// </summary>
/// <remarks>
/// 停用过程:
/// - 清除激活状态
/// - 停止激光照射
/// - 取消事件订阅
/// - 清理工作状态
/// - 调用基类停用
/// </remarks>
public override void Deactivate()
{
if (IsActive)
{
IsActive = false;
StopLaserIllumination();
SimulationManager.UnsubscribeFromEvent<LaserJammingEvent>(OnLaserJamming);
}
base.Deactivate();
}
/// <summary>
/// 添加编码参数
/// </summary>
/// <param name="key">参数名称</param>
/// <param name="value">参数值</param>
/// <remarks>
/// 添加特定编码类型的额外参数
/// 如PPM编码的脉冲位置模式、PWM编码的脉冲宽度等
/// </remarks>
public void AddCodeParameter(string key, object value)
{
if (LaserCodeConfig != null)
{
LaserCodeConfig.Code.Parameters[key] = value;
}
}
/// <summary>
/// 发布激光照射开始事件
/// </summary>
/// <remarks>
/// 发布过程:
/// - 创建事件对象
/// - 设置事件属性
/// - 添加编码信息
/// - 发布到事件系统
/// </remarks>
private void PublishIlluminationStartEvent()
{
Debug.WriteLine($"激光照射开始事件: {Id}, TargetId: {TargetId}");
var illuminationEvent = new LaserIlluminationStartEvent
{
LaserDesignatorId = Id,
TargetId = TargetId
};
// 添加编码信息
if (LaserCodeConfig != null)
{
illuminationEvent.LaserCodeConfig = LaserCodeConfig;
}
// 发布事件
PublishEvent(illuminationEvent);
}
/// <summary>
/// 发布激光照射更新事件
/// </summary>
/// <remarks>
/// 发布过程:
/// - 创建事件对象
/// - 设置事件属性
/// - 添加编码信息
/// - 发布到事件系统
/// </remarks>
private void PublishIlluminationUpdateEvent()
{
Debug.WriteLine($"激光照射更新事件: {Id}, TargetId: {TargetId}");
var illuminationEvent = new LaserIlluminationUpdateEvent
{
LaserDesignatorId = Id,
TargetId = TargetId
};
// 添加编码信息
if (LaserCodeConfig != null)
{
illuminationEvent.LaserCodeConfig = LaserCodeConfig;
}
PublishEvent(illuminationEvent);
}
/// <summary>
/// 发布激光照射停止事件
/// </summary>
/// <remarks>
/// 发布过程:
/// - 创建停止事件
/// - 设置结束参数
/// - 发布到事件系统
/// - 记录停止日志
/// </remarks>
private void PublishIlluminationStopEvent()
{
var evt = new LaserIlluminationStopEvent { LaserDesignatorId = Id, TargetId = TargetId };
PublishEvent(evt);
}
/// <summary>
/// 获取指示器运行状态
/// </summary>
/// <returns>包含指示器完整状态信息的结构体</returns>
/// <remarks>
/// 返回信息包括:
/// - 目标和导弹关联状态
/// - 工作类型和状态
/// - 位置和姿态信息
/// - 激活状态
/// - 干扰状态
/// </remarks>
public override IndicatorRunningState GetRunningState()
{
return new IndicatorRunningState
{
TargetId = TargetId ?? "",
MissileId = MissileId ?? "",
Type = IndicatorType.LaserDisintegrator,
State = IsIlluminationOn ? IndicatorState.Indicating : IndicatorState.Idle,
Position = Position,
Orientation = Orientation,
IsActive = IsActive,
JammingState = IsJammed ? JammingState.Jammed : JammingState.Normal
};
}
/// <summary>
/// 获取激光指示器状态信息
/// </summary>
/// <returns>包含指示器状态的详细描述</returns>
/// <remarks>
/// 返回信息包括:
/// - 基本标识信息
/// - 位置信息
/// - 目标关联状态
/// - 工作状态
/// - 干扰状态
/// - 激光参数
/// </remarks>
public override string GetStatus()
{
return $"激光目标指示器 {Id}:\n" +
$" 位置: {Position}\n" +
$" 目标: {TargetId}\n" +
$" 导弹: {MissileId}\n" +
$" 朝向: {Orientation}\n" +
$" 激活状态: {(IsActive ? "" : "")}\n" +
$" 照射状态: {(IsIlluminationOn ? "" : "")}\n" +
$" 干扰状态: {(IsJammed ? "" : "")}\n" +
$" 编码状态: {(LaserCodeConfig != null ? "" : "")}\n" +
$" 激光功率: {LaserPower:E} W";
}
}
}