137 lines
5.2 KiB
C#
137 lines
5.2 KiB
C#
using System;
|
||
using ActiveProtect.SimulationEnvironment;
|
||
|
||
namespace ActiveProtect.Models
|
||
{
|
||
/// <summary>
|
||
/// 毫米波导引头系统
|
||
/// </summary>
|
||
public class MillimeterWaveGuidanceSystem : BasicGuidanceSystem
|
||
{
|
||
private const double MAX_DETECTION_RANGE = 5000; // 最大探测范围(米)
|
||
private const double FIELD_OF_VIEW = Math.PI / 4; // 视场角(弧度), 45度
|
||
private const double TARGET_RECOGNITION_PROBABILITY = 0.95; // 目标识别概率
|
||
private const double WAVE_FREQUENCY = 94e9; // 毫米波频率(Hz), 94GHz
|
||
private const double PULSE_DURATION = 1e-6; // 脉冲持续时间(秒)
|
||
private const double RECOGNITION_SNR_THRESHOLD = 6; // 识别目标信噪比阈值, 单位dB
|
||
|
||
private readonly Random random = new();
|
||
private Vector3D lastTargetPosition;
|
||
|
||
public ISimulationManager SimulationManager { get; set; }
|
||
|
||
/// <summary>
|
||
/// 毫米波导引头系统构造函数
|
||
/// </summary>
|
||
public MillimeterWaveGuidanceSystem(double maxAcceleration, double guidanceCoefficient, ISimulationManager simulationManager) : base(maxAcceleration, guidanceCoefficient)
|
||
{
|
||
SimulationManager = simulationManager;
|
||
lastTargetPosition = Vector3D.Zero;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新引导系统
|
||
/// </summary>
|
||
public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity)
|
||
{
|
||
base.Update(deltaTime, missilePosition, missileVelocity);
|
||
|
||
if (TryDetectTank(missilePosition, missileVelocity, out Vector3D tankPosition))
|
||
{
|
||
//根据目标当前位置和上一次位置计算目标速度
|
||
Vector3D targetVelocity = (tankPosition - lastTargetPosition) / deltaTime;
|
||
lastTargetPosition = tankPosition;
|
||
|
||
// 使用基类的比例控制算法
|
||
GuidanceAcceleration = CalculateProportionalNavigation(ProportionalNavigationCoefficient, missilePosition, missileVelocity, tankPosition, targetVelocity);
|
||
|
||
if (GuidanceAcceleration.Magnitude() > MaxAcceleration)
|
||
{
|
||
GuidanceAcceleration = GuidanceAcceleration.Normalize() * MaxAcceleration;
|
||
}
|
||
|
||
HasGuidance = true;
|
||
}
|
||
else
|
||
{
|
||
HasGuidance = false;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 尝试探测目标
|
||
/// </summary>
|
||
private bool TryDetectTank(Vector3D missilePosition, Vector3D missileVelocity, out Vector3D targetPosition)
|
||
{
|
||
targetPosition = Vector3D.Zero;
|
||
|
||
foreach (var element in SimulationManager.GetElements())
|
||
{
|
||
if (element is Tank tank)
|
||
{
|
||
Vector3D toTarget = tank.Position - missilePosition;
|
||
double distance = toTarget.Magnitude();
|
||
|
||
if (distance <= MAX_DETECTION_RANGE)
|
||
{
|
||
double angle = Math.Acos(Vector3D.DotProduct(toTarget.Normalize(), missileVelocity.Normalize()));
|
||
|
||
if (angle <= FIELD_OF_VIEW / 2)
|
||
{
|
||
// 模拟毫米波探测
|
||
double snr = CalculateSNR(distance, tank.RadarCrossSection);
|
||
Console.WriteLine($" 80信噪比 {snr}");
|
||
|
||
if(snr > RECOGNITION_SNR_THRESHOLD && random.NextDouble() < TARGET_RECOGNITION_PROBABILITY)
|
||
{
|
||
targetPosition = tank.Position;
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取导弹状态
|
||
/// </summary>
|
||
public override string GetStatus()
|
||
{
|
||
return base.GetStatus() + $", Target Position: {lastTargetPosition}";
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算信噪比
|
||
/// </summary>
|
||
private static double CalculateSNR(double distance, double radarCrossSection)
|
||
{
|
||
// 雷达参数
|
||
double transmitPower = 100; // 发射功率(W)
|
||
double antennaGain = Math.Pow(10, 30/10); // 天线增益(线性值,从dB转换)
|
||
double wavelength = 3e8 / WAVE_FREQUENCY; // 波长(m)
|
||
double bandwidth = 1e6; // 接收机带宽(Hz),假设为1MHz
|
||
double noiseFigure = Math.Pow(10, 3/10); // 噪声系数(线性值,假设为3dB)
|
||
|
||
// 常量
|
||
double k = 1.38e-23; // 玻尔兹曼常数
|
||
double T0 = 290; // 标准噪声温度(K)
|
||
|
||
// 计算接收信号功率
|
||
double signalPower = (transmitPower * Math.Pow(antennaGain, 2) * Math.Pow(wavelength, 2) * radarCrossSection)
|
||
/ (Math.Pow(4 * Math.PI, 3) * Math.Pow(distance, 4));
|
||
|
||
// 计算噪声功率
|
||
double noisePower = k * T0 * bandwidth * noiseFigure;
|
||
|
||
// 计算信噪比
|
||
double snr = signalPower / noisePower;
|
||
|
||
// 转换为dB
|
||
return 10 * Math.Log10(snr);
|
||
}
|
||
}
|
||
}
|