459 lines
16 KiB
C#
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";
|
|
}
|
|
}
|
|
}
|