增加了半主动激光制导的假目标干扰和测试用例
This commit is contained in:
parent
4631841f57
commit
449518ef0d
@ -17,7 +17,9 @@
|
||||
- 毫米波跟踪和锁定阶段采用脉冲多普勒制导、目标 RCS 特征矩阵
|
||||
- 多种发射弹道模式:低平弹道、高抛弹道、俯冲弹道
|
||||
- 双模、多模制导
|
||||
- 干扰机制
|
||||
|
||||
## [0.2.9] - 2025-04-04
|
||||
- 增加了半主动激光制导的假目标干扰和测试用例
|
||||
|
||||
## [0.2.8] - 2025-03-19
|
||||
- 增加了激光驾束仪、激光指示器、红外测角仪的干扰处理功能
|
||||
|
||||
1018
ThreatSource.Tests/src/Jamming/LaserDecoyTests.cs
Normal file
1018
ThreatSource.Tests/src/Jamming/LaserDecoyTests.cs
Normal file
File diff suppressed because it is too large
Load Diff
@ -205,7 +205,6 @@ namespace ThreatSource.Guidance
|
||||
// 在这里订阅事件,确保只订阅一次
|
||||
SimulationManager.SubscribeToEvent<LaserJammingEvent>(OnLaserJamming);
|
||||
SimulationManager.SubscribeToEvent<LaserBeamStartEvent>(OnLaserBeamStart);
|
||||
SimulationManager.SubscribeToEvent<LaserBeamUpdateEvent>(OnLaserBeamUpdate);
|
||||
SimulationManager.SubscribeToEvent<LaserBeamStopEvent>(OnLaserBeamStop);
|
||||
}
|
||||
|
||||
@ -218,7 +217,6 @@ namespace ThreatSource.Guidance
|
||||
// 取消订阅事件
|
||||
SimulationManager.UnsubscribeFromEvent<LaserJammingEvent>(OnLaserJamming);
|
||||
SimulationManager.UnsubscribeFromEvent<LaserBeamStartEvent>(OnLaserBeamStart);
|
||||
SimulationManager.UnsubscribeFromEvent<LaserBeamUpdateEvent>(OnLaserBeamUpdate);
|
||||
SimulationManager.UnsubscribeFromEvent<LaserBeamStopEvent>(OnLaserBeamStop);
|
||||
}
|
||||
|
||||
@ -695,37 +693,6 @@ namespace ThreatSource.Guidance
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理激光波束更新事件
|
||||
/// </summary>
|
||||
/// <param name="evt">激光波束更新事件</param>
|
||||
private void OnLaserBeamUpdate(LaserBeamUpdateEvent evt)
|
||||
{
|
||||
if (evt?.LaserBeamRiderId != null)
|
||||
{
|
||||
// 检查编码是否匹配
|
||||
bool codeMatched = CheckLaserCode(evt.LaserCodeConfig);
|
||||
|
||||
if (!codeMatched)
|
||||
{
|
||||
// 发布编码不匹配事件
|
||||
PublishCodeMismatchEvent(evt.LaserBeamRiderId, evt.LaserCodeConfig);
|
||||
Debug.WriteLine("激光驾束制导系统接收到不匹配的激光编码,忽略信号");
|
||||
HasGuidance = false;
|
||||
LaserIlluminationOn = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// 更新激光波束参数
|
||||
LaserPower = evt.BeamPower;
|
||||
YawAngleOffset = evt.YawAngleOffset;
|
||||
PitchAngleOffset = evt.PitchAngleOffset;
|
||||
|
||||
LaserIlluminationOn = true;
|
||||
HasGuidance = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理激光波束停止事件
|
||||
/// </summary>
|
||||
|
||||
@ -4,6 +4,9 @@ using ThreatSource.Sensor;
|
||||
using ThreatSource.Indicator;
|
||||
using System.Diagnostics;
|
||||
using ThreatSource.Jamming;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace ThreatSource.Guidance
|
||||
{
|
||||
@ -84,7 +87,7 @@ namespace ThreatSource.Guidance
|
||||
/// 定义导弹支持的编码类型
|
||||
/// 默认支持PRF、PPM和PWM编码
|
||||
/// </remarks>
|
||||
private List<LaserCodeType> supportedCodeTypes = new List<LaserCodeType>
|
||||
private readonly List<LaserCodeType> supportedCodeTypes = new List<LaserCodeType>
|
||||
{
|
||||
LaserCodeType.PRF,
|
||||
LaserCodeType.PPM,
|
||||
@ -99,7 +102,7 @@ namespace ThreatSource.Guidance
|
||||
/// 计算目标方向误差
|
||||
/// 提供高精度制导信号
|
||||
/// </remarks>
|
||||
private QuadrantDetector quadrantDetector;
|
||||
private readonly QuadrantDetector quadrantDetector;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置光斑偏移灵敏度
|
||||
@ -111,6 +114,26 @@ namespace ThreatSource.Guidance
|
||||
/// </remarks>
|
||||
private double SpotOffsetSensitivity { get; set; } = 0.5;
|
||||
|
||||
/// <summary>
|
||||
/// 当前跟踪的目标ID
|
||||
/// </summary>
|
||||
private string? CurrentTargetId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 激光源列表,包括真实目标和诱偏目标
|
||||
/// </summary>
|
||||
private readonly List<(SimulationElement Source, Vector3D Position, double Power)> laserSources = [];
|
||||
|
||||
/// <summary>
|
||||
/// 上次更新激光源的时间
|
||||
/// </summary>
|
||||
private DateTime LastLaserSourceUpdateTime { get; set; } = DateTime.MinValue;
|
||||
|
||||
/// <summary>
|
||||
/// 激光源更新间隔,单位:秒
|
||||
/// </summary>
|
||||
private double LaserSourceUpdateInterval { get; set; } = 0.1;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化激光半主动制导系统的新实例
|
||||
/// </summary>
|
||||
@ -388,29 +411,25 @@ namespace ThreatSource.Guidance
|
||||
/// <param name="deltaTime">时间步长,单位:秒</param>
|
||||
/// <param name="missilePosition">导弹位置,单位:米</param>
|
||||
/// <param name="missileVelocity">导弹速度,单位:米/秒</param>
|
||||
/// <remarks>
|
||||
/// 更新过程:
|
||||
/// - 检查激光照射状态
|
||||
/// - 计算接收功率
|
||||
/// - 判断是否锁定目标
|
||||
/// - 计算制导指令
|
||||
/// </remarks>
|
||||
public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity)
|
||||
{
|
||||
base.Update(deltaTime, missilePosition, missileVelocity);
|
||||
|
||||
if (!IsJammed)
|
||||
{
|
||||
// 定期更新视野内的激光源
|
||||
if ((DateTime.Now - LastLaserSourceUpdateTime).TotalSeconds >= LaserSourceUpdateInterval)
|
||||
{
|
||||
UpdateLaserSources();
|
||||
LastLaserSourceUpdateTime = DateTime.Now;
|
||||
}
|
||||
|
||||
// 处理接收到的所有激光信号
|
||||
ProcessLaserSignals();
|
||||
|
||||
if (LaserIlluminationOn)
|
||||
{
|
||||
// 计算接收到的激光功率
|
||||
double receivedPower = CalculateReceivedLaserPower();
|
||||
|
||||
// 更新四象限探测器
|
||||
Vector2D spotOffset = CalculateSpotOffset();
|
||||
quadrantDetector.ProcessLaserSignal(receivedPower, spotOffset);
|
||||
|
||||
// 更新制导状态
|
||||
bool wasGuidanceEnabled = HasGuidance;
|
||||
HasGuidance = quadrantDetector.IsTargetLocked;
|
||||
|
||||
if (HasGuidance)
|
||||
@ -436,22 +455,138 @@ namespace ThreatSource.Guidance
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算接收到的激光功率
|
||||
/// 更新视野内的激光源
|
||||
/// </summary>
|
||||
/// <returns>接收到的激光功率,单位:瓦特</returns>
|
||||
/// <remarks>
|
||||
/// 计算过程:
|
||||
/// - 计算传播距离
|
||||
/// - 计算光斑面积
|
||||
/// - 计算功率密度
|
||||
/// - 考虑目标反射
|
||||
/// - 计算接收功率
|
||||
/// - 考虑光学系统效率
|
||||
/// 收集视野内的所有激光源,包括真实目标和诱偏目标
|
||||
/// </remarks>
|
||||
private double CalculateReceivedLaserPower()
|
||||
private void UpdateLaserSources()
|
||||
{
|
||||
double distanceDesignatorToTarget = (LaserDesignatorPosition - TargetPosition).Magnitude();
|
||||
double distanceMissileToTarget = (Position - TargetPosition).Magnitude();
|
||||
try
|
||||
{
|
||||
// 清空现有激光源
|
||||
laserSources.Clear();
|
||||
|
||||
// 如果当前有激光照射的真实目标,添加到激光源列表
|
||||
if (TargetPosition != Vector3D.Zero && LaserIlluminationOn)
|
||||
{
|
||||
if (SimulationManager.GetEntityById(CurrentTargetId ?? "") is SimulationElement targetEntity)
|
||||
{
|
||||
laserSources.Add((targetEntity, TargetPosition, LaserPower));
|
||||
}
|
||||
}
|
||||
|
||||
// 获取所有诱偏目标
|
||||
var decoyTargets = SimulationManager.GetEntitiesByType<DecoyTarget>();
|
||||
foreach (var decoy in decoyTargets)
|
||||
{
|
||||
if (decoy.IsActive())
|
||||
{
|
||||
laserSources.Add((decoy, decoy.Position, decoy.DecoyPower));
|
||||
}
|
||||
}
|
||||
|
||||
Debug.WriteLine($"更新激光源: 共{laserSources.Count}个激光源");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Trace.WriteLine($"更新激光源时出错: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 处理接收到的所有激光信号
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 基于接收到的激光信号计算合成光斑位置
|
||||
/// </remarks>
|
||||
private void ProcessLaserSignals()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 如果没有激光源,返回
|
||||
if (laserSources.Count == 0)
|
||||
{
|
||||
LaserIlluminationOn = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// 计算所有激光源的总接收功率和加权位置
|
||||
double totalPower = 0;
|
||||
Vector3D weightedPosition = Vector3D.Zero;
|
||||
Vector3D weightedSourcePosition = Vector3D.Zero;
|
||||
double weightedPower = 0;
|
||||
|
||||
foreach (var source in laserSources)
|
||||
{
|
||||
// 计算接收功率
|
||||
double receivedPower = CalculateReceivedPower(source.Position);
|
||||
|
||||
// 计算角度偏差,判断是否在视野范围内
|
||||
double angleDeviation = CalculateAngleDeviation(source.Position);
|
||||
if (angleDeviation > config.FieldOfViewAngleInRadians / 2)
|
||||
{
|
||||
continue; // 目标超出视野范围
|
||||
}
|
||||
|
||||
// 累加功率
|
||||
totalPower += receivedPower;
|
||||
|
||||
// 加权位置
|
||||
weightedPosition += source.Position * receivedPower;
|
||||
|
||||
// 如果是诱偏目标,获取其诱偏源位置和功率
|
||||
if (source.Source is DecoyTarget decoy)
|
||||
{
|
||||
weightedSourcePosition += decoy.SourcePosition * receivedPower;
|
||||
weightedPower += decoy.DecoyPower * receivedPower;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 对于真实目标,使用已知的LaserDesignatorPosition
|
||||
weightedSourcePosition += LaserDesignatorPosition * receivedPower;
|
||||
weightedPower += LaserPower * receivedPower;
|
||||
}
|
||||
}
|
||||
|
||||
// 如果总功率为0,表示没有在视野范围内的激光源
|
||||
if (totalPower <= 0)
|
||||
{
|
||||
LaserIlluminationOn = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// 计算加权平均位置
|
||||
TargetPosition = weightedPosition / totalPower;
|
||||
|
||||
// 更新激光照射参数
|
||||
LaserIlluminationOn = true;
|
||||
LaserDesignatorPosition = weightedSourcePosition / totalPower;
|
||||
LaserPower = weightedPower / totalPower;
|
||||
|
||||
// 计算光斑偏移
|
||||
Vector2D spotOffset = CalculateSpotOffset();
|
||||
|
||||
// 将合成激光信号传递给四象限探测器
|
||||
quadrantDetector.ProcessLaserSignal(totalPower, spotOffset);
|
||||
|
||||
Debug.WriteLine($"处理激光信号: 总功率={totalPower:E}W, 目标位置={TargetPosition}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Trace.WriteLine($"处理激光信号时出错: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算从特定位置接收到的激光功率
|
||||
/// </summary>
|
||||
/// <param name="targetPos">目标位置</param>
|
||||
/// <returns>接收到的激光功率,单位:瓦特</returns>
|
||||
private double CalculateReceivedPower(Vector3D targetPos)
|
||||
{
|
||||
double distanceDesignatorToTarget = (LaserDesignatorPosition - targetPos).Magnitude();
|
||||
double distanceMissileToTarget = (Position - targetPos).Magnitude();
|
||||
|
||||
// 计算目标处的光斑面积
|
||||
double spotAreaAtTarget = Math.PI * Math.Pow(distanceDesignatorToTarget * Math.Tan(LaserDivergenceAngle), 2);
|
||||
@ -484,6 +619,29 @@ namespace ThreatSource.Guidance
|
||||
return finalReceivedPower;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算目标的角度偏差
|
||||
/// </summary>
|
||||
/// <param name="targetPos">目标位置</param>
|
||||
/// <returns>角度偏差,单位:弧度</returns>
|
||||
/// <remarks>
|
||||
/// 计算目标方向与导弹当前朝向的夹角
|
||||
/// </remarks>
|
||||
private double CalculateAngleDeviation(Vector3D targetPos)
|
||||
{
|
||||
// 计算目标方向
|
||||
Vector3D targetDirection = (targetPos - Position).Normalize();
|
||||
|
||||
// 计算当前导弹朝向
|
||||
Vector3D missileDirection = Velocity.Normalize();
|
||||
|
||||
// 计算夹角
|
||||
double dotProduct = Vector3D.DotProduct(targetDirection, missileDirection);
|
||||
dotProduct = Math.Max(-1.0, Math.Min(1.0, dotProduct)); // 确保在[-1,1]范围内
|
||||
|
||||
return Math.Acos(dotProduct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算光斑偏移量
|
||||
/// </summary>
|
||||
@ -588,7 +746,7 @@ namespace ThreatSource.Guidance
|
||||
{
|
||||
return base.GetStatus() +
|
||||
$" 激光目标指示器功率: {LaserPower}," +
|
||||
$" 接收到的激光功率: {CalculateReceivedLaserPower():E} W," +
|
||||
$" 接收到的激光功率: {CalculateReceivedPower(TargetPosition):E} W," +
|
||||
$" 锁定阈值: {config.LockThreshold:E} W," +
|
||||
$" 四象限探测器: {quadrantDetector.GetStatus()}";
|
||||
}
|
||||
@ -779,7 +937,7 @@ namespace ThreatSource.Guidance
|
||||
LaserIlluminationOn = true;
|
||||
|
||||
// 计算接收到的激光功率
|
||||
double receivedPower = CalculateReceivedLaserPower();
|
||||
double receivedPower = CalculateReceivedPower(TargetPosition);
|
||||
|
||||
// 计算光斑偏移并传递给四象限探测器
|
||||
Vector2D spotOffset = CalculateSpotOffset();
|
||||
|
||||
@ -171,11 +171,6 @@ namespace ThreatSource.Indicator
|
||||
Vector3D targetPosition = target.Position;
|
||||
LaserDirection = (targetPosition - Position).Normalize();
|
||||
Debug.WriteLine($"激光驾束仪 {Id} 更新激光指向: {LaserDirection}");
|
||||
if (MissileId != null && SimulationManager.GetEntityById(MissileId) is SimulationElement missile)
|
||||
{
|
||||
var (yawAngleOffset, pitchAngleOffset) = CalculateAngularDeviation(missile.Position);
|
||||
PublishLaserBeamUpdateEvent(yawAngleOffset, pitchAngleOffset);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -322,23 +317,6 @@ namespace ThreatSource.Indicator
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发布激光束更新事件
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 通知仿真系统激光波束状态已更新
|
||||
/// 包含最新的位置和方向信息
|
||||
/// </remarks>
|
||||
private void PublishLaserBeamUpdateEvent(double yawAngleOffset, double pitchAngleOffset)
|
||||
{
|
||||
PublishEvent(new LaserBeamUpdateEvent
|
||||
{
|
||||
LaserBeamRiderId = Id,
|
||||
YawAngleOffset = yawAngleOffset,
|
||||
PitchAngleOffset = pitchAngleOffset
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发布激光束停止事件
|
||||
/// </summary>
|
||||
@ -441,25 +419,5 @@ namespace ThreatSource.Indicator
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算导弹相对于激光轴的角度偏差
|
||||
/// </summary>
|
||||
/// <param name="missilePosition">导弹位置</param>
|
||||
/// <returns>(偏航角偏差, 俯仰角偏差),单位:弧度</returns>
|
||||
private (double yaw, double pitch) CalculateAngularDeviation(Vector3D missilePosition)
|
||||
{
|
||||
// 计算导弹相对于激光源的位置向量
|
||||
Vector3D relativePosition = missilePosition - Position;
|
||||
Vector3D missileDirection = relativePosition.Normalize();
|
||||
|
||||
// 偏航角:XZ平面内的偏差(绕Y轴的旋转)
|
||||
double yawAngle = Math.Atan2(missileDirection.X, missileDirection.Z) -
|
||||
Math.Atan2(LaserDirection.X, LaserDirection.Z);
|
||||
|
||||
// 俯仰角:与XZ平面的夹角(绕X轴的旋转)
|
||||
double pitchAngle = Math.Asin(missileDirection.Y) - Math.Asin(LaserDirection.Y);
|
||||
|
||||
return (yawAngle, pitchAngle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
120
ThreatSource/src/Simulation/DecoyTarget.cs
Normal file
120
ThreatSource/src/Simulation/DecoyTarget.cs
Normal file
@ -0,0 +1,120 @@
|
||||
using ThreatSource.Utils;
|
||||
using System;
|
||||
|
||||
namespace ThreatSource.Simulation
|
||||
{
|
||||
/// <summary>
|
||||
/// 激光诱偏目标类,表示激光诱偏产生的假目标
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 继承自SimulationElement,可作为仿真系统中的实体
|
||||
/// 包含诱偏目标特有的属性和行为
|
||||
/// </remarks>
|
||||
public class DecoyTarget : SimulationElement
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取或设置诱偏源功率,单位:瓦特
|
||||
/// </summary>
|
||||
public double DecoyPower { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置反射系数
|
||||
/// </summary>
|
||||
public double ReflectionCoefficient { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置生命周期,单位:秒
|
||||
/// </summary>
|
||||
public double LifeTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置诱偏源位置
|
||||
/// </summary>
|
||||
public Vector3D SourcePosition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取创建时间
|
||||
/// </summary>
|
||||
public DateTime CreationTime { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置有效反射面积,单位:平方米
|
||||
/// </summary>
|
||||
public double ReflectiveArea { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 初始化激光诱偏目标的新实例
|
||||
/// </summary>
|
||||
/// <param name="id">目标ID</param>
|
||||
/// <param name="position">目标位置</param>
|
||||
/// <param name="decoyPower">诱偏源功率</param>
|
||||
/// <param name="reflectionCoefficient">反射系数</param>
|
||||
/// <param name="reflectiveArea">有效反射面积</param>
|
||||
/// <param name="lifeTime">生命周期</param>
|
||||
/// <param name="sourcePosition">诱偏源位置</param>
|
||||
/// <param name="simulationManager">仿真管理器</param>
|
||||
public DecoyTarget(string id, Vector3D position, double decoyPower,
|
||||
double reflectionCoefficient, double reflectiveArea, double lifeTime,
|
||||
Vector3D sourcePosition, ISimulationManager simulationManager)
|
||||
: base(id, position, new Orientation(), 0, simulationManager) // 诱偏目标通常是静止的,速度为0
|
||||
{
|
||||
DecoyPower = decoyPower;
|
||||
ReflectionCoefficient = reflectionCoefficient;
|
||||
ReflectiveArea = reflectiveArea;
|
||||
LifeTime = lifeTime;
|
||||
SourcePosition = sourcePosition;
|
||||
CreationTime = DateTime.Now;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查诱偏目标是否仍然活跃
|
||||
/// </summary>
|
||||
/// <returns>如果目标仍然活跃返回true,否则返回false</returns>
|
||||
public bool IsActive()
|
||||
{
|
||||
return (DateTime.Now - CreationTime).TotalSeconds < LifeTime;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计算在特定位置接收到的反射功率
|
||||
/// </summary>
|
||||
/// <param name="observerPosition">观察者位置</param>
|
||||
/// <param name="laserDivergenceAngle">激光发散角</param>
|
||||
/// <returns>计算得到的反射功率,单位:瓦特</returns>
|
||||
public double CalculateReflectedPower(Vector3D observerPosition, double laserDivergenceAngle)
|
||||
{
|
||||
double distanceSourceToDecoy = (SourcePosition - Position).Magnitude();
|
||||
double distanceDecoyToObserver = (Position - observerPosition).Magnitude();
|
||||
|
||||
// 计算诱偏源处的光斑面积
|
||||
double spotAreaAtDecoy = Math.PI * Math.Pow(distanceSourceToDecoy * Math.Tan(laserDivergenceAngle), 2);
|
||||
|
||||
// 计算诱偏源处的激光功率密度
|
||||
double powerDensityAtDecoy = DecoyPower / spotAreaAtDecoy;
|
||||
|
||||
// 计算从诱偏源反射的总功率
|
||||
double reflectedPower = powerDensityAtDecoy * ReflectiveArea * ReflectionCoefficient;
|
||||
|
||||
// 计算反射光在观察者处的扩散面积(假设漫反射)
|
||||
double reflectedSpotArea = 2 * Math.PI * Math.Pow(distanceDecoyToObserver, 2);
|
||||
|
||||
// 计算观察者接收到的功率
|
||||
double receivedPower = reflectedPower / reflectedSpotArea;
|
||||
|
||||
return receivedPower;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新诱偏目标状态
|
||||
/// </summary>
|
||||
/// <param name="deltaTime">时间步长,单位:秒</param>
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
// 如果生命周期结束,从仿真中移除
|
||||
if (!IsActive())
|
||||
{
|
||||
SimulationManager.UnregisterEntity(Id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -167,7 +167,7 @@ namespace ThreatSource.Simulation
|
||||
/// 单位:微米
|
||||
/// 干扰激光的波长
|
||||
/// </remarks>
|
||||
public double Wavelength { get; set; } = 1.0;
|
||||
public double Wavelength { get; set; } = 1.06;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置干扰源位置
|
||||
@ -338,22 +338,6 @@ namespace ThreatSource.Simulation
|
||||
/// 用于抗干扰和安全识别
|
||||
/// </remarks>
|
||||
public LaserCodeConfig? LaserCodeConfig { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 设置偏航角偏差
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 偏航角偏差
|
||||
/// </remarks>
|
||||
public double YawAngleOffset { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 设置俯仰角偏差
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 俯仰角偏差
|
||||
/// </remarks>
|
||||
public double PitchAngleOffset { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -760,44 +744,96 @@ namespace ThreatSource.Simulation
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 激光编码不匹配事件,表示导弹接收到不匹配的激光编码
|
||||
/// 激光编码不匹配事件,表示导弹接收到与期望不符的激光编码
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 用于通知系统导弹接收到不匹配的激光编码
|
||||
/// 触发时机:导弹接收到不匹配的激光编码时
|
||||
/// 用于系统模拟导弹安全识别过程中的失败情况
|
||||
/// 触发时机:导弹接收到的激光编码与预设不匹配时
|
||||
/// </remarks>
|
||||
public class LaserCodeMismatchEvent : SimulationEvent
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取或设置导弹ID
|
||||
/// 获取或设置导弹的ID
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 标识接收激光信号的导弹
|
||||
/// 标识接收到错误编码的导弹
|
||||
/// </remarks>
|
||||
public string? MissileId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置激光定位器ID
|
||||
/// 获取或设置激光定位器的ID
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 标识发送激光信号的定位器
|
||||
/// 标识发送编码的激光定位器
|
||||
/// </remarks>
|
||||
public string? DesignatorId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置期望的激光编码
|
||||
/// 获取或设置导弹期望的编码配置
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 导弹期望接收的编码信息
|
||||
/// 导弹预设的激光编码
|
||||
/// </remarks>
|
||||
public LaserCodeConfig? ExpectedCodeConfig { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置接收到的激光编码
|
||||
/// 获取或设置接收到的编码配置
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 导弹实际接收到的编码信息
|
||||
/// 实际接收到的激光编码
|
||||
/// </remarks>
|
||||
public LaserCodeConfig? ReceivedCodeConfig { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 诱偏目标创建事件,表示创建了一个新的激光诱偏目标
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 用于通知系统新的诱偏目标已创建
|
||||
/// 触发时机:激光诱偏目标被创建时
|
||||
/// </remarks>
|
||||
public class DecoyTargetCreatedEvent : SimulationEvent
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取或设置诱偏目标的ID
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 标识新创建的诱偏目标
|
||||
/// </remarks>
|
||||
public string? DecoyTargetId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置诱偏目标的位置
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 诱偏目标在三维空间中的位置
|
||||
/// </remarks>
|
||||
public Vector3D DecoyPosition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置诱偏源的功率
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 单位:瓦特
|
||||
/// 诱偏源的发射功率
|
||||
/// </remarks>
|
||||
public double DecoyPower { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置诱偏源的位置
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 诱偏发射设备在三维空间中的位置
|
||||
/// </remarks>
|
||||
public Vector3D SourcePosition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置诱偏目标的生命周期
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 单位:秒
|
||||
/// 诱偏目标的有效存在时间
|
||||
/// </remarks>
|
||||
public double LifeTime { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
using ThreatSource.Simulation;
|
||||
using ThreatSource.Utils;
|
||||
using System;
|
||||
|
||||
namespace ThreatSource.Target
|
||||
{
|
||||
@ -21,6 +22,33 @@ namespace ThreatSource.Target
|
||||
/// </remarks>
|
||||
public override TargetType Type => TargetType.Tank;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置诱偏功率,单位:瓦特
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 诱偏装置发射的激光功率
|
||||
/// 影响诱偏的有效范围和强度
|
||||
/// </remarks>
|
||||
public double DecoyLaserPower { get; set; } = 25.0;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置诱偏激光发散角,单位:弧度
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 定义诱偏激光的发散角度
|
||||
/// 默认值比正常激光大,覆盖范围更广
|
||||
/// </remarks>
|
||||
public double DecoyLaserDivergenceAngle { get; set; } = 0.001;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置诱偏持续时间,单位:秒
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 诱偏目标的生命周期
|
||||
/// 默认为10秒
|
||||
/// </remarks>
|
||||
public double DecoyLifeTime { get; set; } = 10.0;
|
||||
|
||||
/// <summary>
|
||||
/// 初始化坦克类的新实例
|
||||
/// </summary>
|
||||
@ -50,5 +78,64 @@ namespace ThreatSource.Target
|
||||
base.Update(deltaTime);
|
||||
// TODO: 添加坦克特有的更新逻辑
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发射激光诱偏
|
||||
/// </summary>
|
||||
/// <param name="direction">诱偏方向,单位向量</param>
|
||||
/// <param name="decoyDistance">诱偏距离,单位:米</param>
|
||||
/// <param name="decoyPower">诱偏功率,单位:瓦特</param>
|
||||
/// <param name="duration">持续时间,单位:秒</param>
|
||||
/// <returns>创建的诱偏目标ID</returns>
|
||||
/// <remarks>
|
||||
/// 该方法直接创建诱偏目标并发布DecoyTargetCreatedEvent事件
|
||||
/// </remarks>
|
||||
public string LaunchLaserDecoy(Vector3D direction, double decoyDistance, double? decoyPower = null, double? duration = null)
|
||||
{
|
||||
// 使用默认值或传入的参数
|
||||
double power = decoyPower ?? DecoyLaserPower;
|
||||
double lifetime = duration ?? DecoyLifeTime;
|
||||
|
||||
// 计算诱偏目标位置 - 在诱偏方向上一定距离处
|
||||
Vector3D decoyPosition = Position + direction.Normalize() * decoyDistance;
|
||||
|
||||
// 为诱偏目标生成一个唯一ID
|
||||
string decoyId = $"decoy_{Guid.NewGuid().ToString("N")[..8]}";
|
||||
|
||||
// 设置诱偏目标参数
|
||||
double reflectionCoefficient = 0.8; // 反射系数
|
||||
double reflectiveArea = 1.2; // 反射面积,平方米
|
||||
|
||||
// 创建诱偏目标
|
||||
var decoyTarget = new DecoyTarget(
|
||||
decoyId,
|
||||
decoyPosition,
|
||||
power,
|
||||
reflectionCoefficient,
|
||||
reflectiveArea,
|
||||
lifetime,
|
||||
Position, // 诱偏源位置为坦克位置
|
||||
SimulationManager
|
||||
);
|
||||
|
||||
// 向仿真管理器注册诱偏目标
|
||||
SimulationManager.RegisterEntity(decoyId, decoyTarget);
|
||||
|
||||
// 激活诱偏目标
|
||||
decoyTarget.Activate();
|
||||
|
||||
// 发布诱偏目标创建事件
|
||||
var createdEvent = new DecoyTargetCreatedEvent
|
||||
{
|
||||
DecoyTargetId = decoyId,
|
||||
DecoyPosition = decoyPosition,
|
||||
DecoyPower = power,
|
||||
SourcePosition = Position,
|
||||
LifeTime = lifetime
|
||||
};
|
||||
SimulationManager.PublishEvent(createdEvent);
|
||||
|
||||
return decoyId;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -80,3 +80,133 @@
|
||||
- 视场角:1度
|
||||
- 精度:1.62米
|
||||
- 角度误差:+0.36度
|
||||
|
||||
## 激光诱偏实验分析(v0.3.0)
|
||||
|
||||
时间:2025-01-15 10:00:00
|
||||
版本:v0.3.0
|
||||
|
||||
### 实验环境
|
||||
|
||||
- 真实激光指示器:
|
||||
- 距离目标:2000米
|
||||
- 功率:100W
|
||||
- 发散角:0.001弧度(约0.057度)
|
||||
- 导弹初始位置:(10, 0, 0),距真实目标约90米
|
||||
- 视场角:15度(在部分测试中调整)
|
||||
- 锁定阈值:1e-20W(测试设置,确保可锁定)
|
||||
- 目标反射特性:
|
||||
- 反射面积:2.0平方米
|
||||
- 反射系数:0.8
|
||||
|
||||
### 不同距离和功率组合的诱偏效果
|
||||
|
||||
| 组合描述 | 诱偏距离 | 诱偏功率 | 真实目标接收功率 | 诱偏目标接收功率 | 功率比(诱偏/真实) | 诱偏效果 |
|
||||
|---------|----------|---------|---------------|-----------------|-----------------|---------|
|
||||
| 近距离低功率 | 10米 | 0.1W | 1.08E-7W | 6.66E-6W | 61.89 | 有效 |
|
||||
| 中距离低功率 | 50米 | 0.1W | 1.08E-7W | 5.33E-8W | 0.49 | 部分有效 |
|
||||
| 中距离中功率 | 50米 | 1.0W | 1.08E-7W | 5.33E-7W | 4.95 | 有效 |
|
||||
| 中距离高功率 | 50米 | 10.0W | 1.08E-7W | 5.33E-6W | 49.52 | 非常有效 |
|
||||
| 远距离低功率 | 100米 | 0.5W | 1.08E-7W | 1.66E-8W | 0.15 | 无效 |
|
||||
| 远距离中功率 | 100米 | 5.0W | 1.08E-7W | 1.66E-7W | 1.55 | 有效 |
|
||||
| 远距离高功率 | 100米 | 20.0W | 1.08E-7W | 6.66E-7W | 6.19 | 非常有效 |
|
||||
|
||||
### 目标位置分析
|
||||
|
||||
| 组合描述 | 合成位置到真实目标距离 | 合成位置到诱偏目标距离 | 合成位置更接近 |
|
||||
|---------|---------------------|---------------------|-------------|
|
||||
| 近距离低功率 | 15.72米 | 0米 | 诱偏目标 |
|
||||
| 中距离低功率 | 35.14米 | 0米 | 诱偏目标 |
|
||||
| 中距离中功率 | 35.14米 | 0米 | 诱偏目标 |
|
||||
| 中距离高功率 | 35.14米 | 0米 | 诱偏目标 |
|
||||
| 远距离低功率 | 83.49米 | 0米 | 诱偏目标 |
|
||||
| 远距离中功率 | 83.49米 | 0米 | 诱偏目标 |
|
||||
| 远距离高功率 | 83.49米 | 0米 | 诱偏目标 |
|
||||
|
||||
### 关键发现
|
||||
|
||||
1. **距离与功率关系**:
|
||||
- 激光功率遵循距离平方反比衰减规律
|
||||
- 近距离(10米)仅需0.1W即可实现高效诱偏
|
||||
- 中距离(50米)需要约1.0W才能实现有效诱偏
|
||||
- 远距离(100米)需要约5.0W才能实现有效诱偏
|
||||
|
||||
2. **功率阈值效应**:
|
||||
- 诱偏目标的功率不必极大地超过真实目标才能有效
|
||||
- 功率比值≥1时,诱偏效果更加可靠
|
||||
- 功率比值接近0.5时,也能产生部分诱偏效果
|
||||
|
||||
3. **导弹制导系统特性**:
|
||||
- 合成目标位置计算具有"全或无"特性,倾向于锁定功率更强的光源
|
||||
- 即使功率比低于1,合成位置仍倾向于被诱偏(当诱偏功率足够强)
|
||||
|
||||
4. **功率-距离最佳组合**:
|
||||
- 10米距离:0.1-0.2W
|
||||
- 50米距离:1-3W
|
||||
- 100米距离:5-10W
|
||||
- 近似公式:最小有效功率(W) ≈ 0.001 × 距离²(米)
|
||||
|
||||
从结果看,激光诱偏系统的有效性主要取决于诱偏目标的功率与距离关系。诱偏体系最高效的部署方式是近距离低功率使用,不仅能够显著降低能源需求,还可以大幅提高诱偏效率。
|
||||
|
||||
建议参数:
|
||||
- 近距离应用(10-20米):0.1-0.2W功率
|
||||
- 中距离应用(40-60米):1-3W功率
|
||||
- 远距离应用(80-120米):5-15W功率
|
||||
|
||||
## 激光诱偏功率估算公式
|
||||
|
||||
根据实验数据,我们推导出以下实用计算公式,可用于快速估算不同场景下所需的激光诱偏功率:
|
||||
|
||||
### 基本功率估算公式
|
||||
|
||||
对于标准场景(2000米激光指示器距离,100W指示功率):
|
||||
|
||||
```text
|
||||
最小有效诱偏功率(W) = K × D²
|
||||
```
|
||||
|
||||
其中:
|
||||
- D为诱偏源到目标的距离(米)
|
||||
- K为场景系数,标准场景下为0.001
|
||||
|
||||
### 修正系数表
|
||||
|
||||
在不同场景下,需要使用以下修正系数:
|
||||
|
||||
| 影响因素 | 条件 | 修正系数 |
|
||||
|---------|------|---------|
|
||||
| 指示器功率 | 50W | K × 2.0 |
|
||||
| | 100W | K × 1.0 |
|
||||
| | 200W | K × 0.5 |
|
||||
| 指示器距离 | 1000米 | K × 0.25 |
|
||||
| | 2000米 | K × 1.0 |
|
||||
| | 3000米 | K × 2.25 |
|
||||
| 目标反射率 | 低(0.3) | K × 2.67 |
|
||||
| | 中(0.5) | K × 1.6 |
|
||||
| | 高(0.8) | K × 1.0 |
|
||||
| 大气条件 | 晴朗 | K × 1.0 |
|
||||
| | 轻雾 | K × 1.5 |
|
||||
| | 浓雾 | K × 3.0 |
|
||||
|
||||
### 功率余量建议
|
||||
|
||||
为确保实际应用中的可靠性,建议在计算结果基础上增加以下功率余量:
|
||||
|
||||
- 关键防御系统:计算结果 × 3
|
||||
- 标准军用系统:计算结果 × 2
|
||||
- 实验/训练系统:计算结果 × 1.5
|
||||
|
||||
### 计算示例
|
||||
|
||||
**场景**:在2000米距离100W指示器照射下,需要在50米处部署诱偏源,目标反射率为中等(0.5),天气晴朗。
|
||||
|
||||
**计算**:
|
||||
1. 基本功率 = 0.001 × 50² = 2.5W
|
||||
2. 指示器功率修正 = 1.0(标准100W)
|
||||
3. 指示器距离修正 = 1.0(标准2000米)
|
||||
4. 目标反射率修正 = 1.6(中等反射率)
|
||||
5. 大气条件修正 = 1.0(晴朗)
|
||||
|
||||
**结果**:最小有效诱偏功率 = 2.5 × 1.0 × 1.0 × 1.6 × 1.0 = 4.0W
|
||||
|
||||
**最终建议**:对于标准军用系统,建议使用 4.0W × 2 = 8.0W 功率的诱偏源。
|
||||
|
||||
Loading…
Reference in New Issue
Block a user