增加了半主动激光制导的假目标干扰和测试用例

This commit is contained in:
Tian jianyong 2025-04-05 13:09:08 +08:00
parent 4631841f57
commit 449518ef0d
10 changed files with 1612 additions and 136 deletions

View File

@ -17,7 +17,9 @@
- 毫米波跟踪和锁定阶段采用脉冲多普勒制导、目标 RCS 特征矩阵
- 多种发射弹道模式:低平弹道、高抛弹道、俯冲弹道
- 双模、多模制导
- 干扰机制
## [0.2.9] - 2025-04-04
- 增加了半主动激光制导的假目标干扰和测试用例
## [0.2.8] - 2025-03-19
- 增加了激光驾束仪、激光指示器、红外测角仪的干扰处理功能

File diff suppressed because it is too large Load Diff

View File

@ -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>

View File

@ -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();

View File

@ -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);
}
}
}

View 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);
}
}
}
}

View File

@ -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; }
}
}

View File

@ -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;
}
}
}

View File

@ -1 +1 @@
0.2.8
0.2.9

View File

@ -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为诱偏源到目标的距离
- 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 功率的诱偏源。