ActiveProtect/Models/MillimeterWaveGuidanceSystem.cs

137 lines
5.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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