实现了毫米波末制导的制导系统功能(毫米波主动雷达、搜索阶段圆锥扫描)

This commit is contained in:
Tian jianyong 2025-03-13 10:31:35 +08:00
parent e103e8ae6e
commit ea54c35d42
9 changed files with 657 additions and 107 deletions

View File

@ -0,0 +1,10 @@
---
description: 坐标系相关定义
globs:
alwaysApply: false
---
# 坐标系约定
- 采用右手坐标系
- Y 轴为垂直轴

View File

@ -14,7 +14,14 @@
- 处理不同时间步长的协调
- 增加风向风速的影响
- 增加大气透过率影响
- 毫米波和红外图像制导的传感器和引导律
- 毫米波跟踪和锁定阶段采用脉冲多普勒制导、目标 RCS 特征矩阵
- 多种发射弹道模式:低平弹道、高抛弹道、俯冲弹道
- 双模、多模制导
- 干扰机制
## [0.2.7] - 2025-03-13
- 实现了红外成像末制导的制导系统功能(红外图像生成、图像识别和分类、目标红外特征矩阵)
- 实现了毫米波末制导的制导系统功能(毫米波主动雷达、搜索阶段圆锥扫描)
## [0.2.6] - 2025-03-07

View File

@ -12,9 +12,9 @@
"proportionalNavigationCoefficient": 3.0,
"launchAcceleration": 100.0,
"maxEngineBurnTime": 0.1,
"cruiseTime": 5.0,
"cruiseTime": 4.0,
"mass": 28.0,
"explosionRadius": 6.0,
"explosionRadius": 5.0,
"hitProbability": 0.9,
"selfDestructHeight": 0.0
},
@ -24,6 +24,28 @@
"targetRecognitionProbability": 0.95,
"waveFrequency": 94e9,
"pulseDuration": 1e-6,
"recognitionSNRThreshold": 6.0
"searchBeamWidth": 4.0,
"trackBeamWidth": 2.0,
"lockBeamWidth": 1.0,
"scanAngularSpeedDeg": 360.0,
"scanRadiusGrowthRateDeg": 22.5,
"recognitionSNRThreshold": -25.0,
"lockSNRThreshold": -10.0,
"targetLostTolerance": 0.2,
"lockConfirmationTime": 0.3,
"pulseRepetitionFrequency": 1e-4,
"transmitPower": 0.3,
"dopplerVelocityResolution": 1.0,
"maxMeasurableVelocity": 1000.0,
"antennaGainDB": 23.0,
"noiseFigureDB": 7.0,
"systemLossDB": 6.0
}
}

View File

@ -17,6 +17,16 @@ namespace ThreatSource.Guidance
/// </remarks>
public class MillimeterWaveGuidanceSystem : BasicGuidanceSystem
{
/// <summary>
/// 工作模式枚举
/// </summary>
private enum WorkMode
{
Search, // 搜索模式
Track, // 跟踪模式
Lock // 锁定模式
}
/// <summary>
/// 毫米波导引系统配置
/// </summary>
@ -44,6 +54,38 @@ namespace ThreatSource.Guidance
/// </remarks>
private Vector3D lastTargetPosition;
/// <summary>
/// 上一次探测到的目标速度
/// </summary>
/// <remarks>
/// 记录目标的历史速度
/// 用于计算目标速度
/// </remarks>
private Vector3D lastTargetVelocity;
/// <summary>
/// 目标丢失计时器
/// </summary>
/// <remarks>
/// 记录目标丢失的时间
/// 用于切换到搜索模式
/// </remarks>
private double targetLostTimer = 0;
/// <summary>
/// 锁定确认计时器
/// </summary>
/// <remarks>
/// 记录锁定确认的时间
/// 用于切换到锁定模式
/// </remarks>
private double lockConfirmationTimer = 0;
/// <summary>
/// 当前工作模式
/// </summary>
private WorkMode currentMode = WorkMode.Search;
/// <summary>
/// 是否受到干扰
/// </summary>
@ -62,6 +104,51 @@ namespace ThreatSource.Guidance
/// </remarks>
private double jammingPower = 0;
/// <summary>
/// 是否有目标
/// </summary>
public bool HasTarget { get; private set; }
/// <summary>
/// 是否在锁定模式
/// </summary>
public bool IsInLockMode => currentMode == WorkMode.Lock;
/// <summary>
/// 当前扫描角度,单位:弧度
/// </summary>
private double currentScanAngle = 0;
/// <summary>
/// 当前扫描半径,单位:弧度
/// </summary>
private double currentScanRadius = 0;
/// <summary>
/// 最大扫描半径,单位:弧度
/// </summary>
private double maxScanRadius => config.FieldOfViewAngle * Math.PI / 180.0 / 2;
/// <summary>
/// 激活制导系统
/// </summary>
public override void Activate()
{
base.Activate();
SwitchToSearchMode();
}
/// <summary>
/// 停用制导系统
/// </summary>
public override void Deactivate()
{
base.Deactivate();
HasTarget = false;
HasGuidance = false;
GuidanceAcceleration = Vector3D.Zero;
}
/// <summary>
/// 初始化毫米波制导系统的新实例
/// </summary>
@ -87,9 +174,48 @@ namespace ThreatSource.Guidance
{
this.config = config;
lastTargetPosition = Vector3D.Zero;
lastTargetVelocity = Vector3D.Zero;
// 订阅干扰事件
simulationManager.SubscribeToEvent<MillimeterWaveJammingEvent>(HandleJammingEvent);
SwitchToSearchMode(); // 初始化为搜索模式
}
/// <summary>
/// 切换到搜索模式
/// </summary>
public void SwitchToSearchMode()
{
currentMode = WorkMode.Search;
HasTarget = false;
HasGuidance = false;
targetLostTimer = 0;
lockConfirmationTimer = 0;
currentScanAngle = 0;
currentScanRadius = config.SearchBeamWidth * Math.PI / 720.0; // 从半个波束宽度的一半开始
Trace.WriteLine($"切换到搜索模式,波束宽度: {config.SearchBeamWidth}度");
}
/// <summary>
/// 切换到跟踪模式
/// </summary>
private void SwitchToTrackMode()
{
currentMode = WorkMode.Track;
lockConfirmationTimer = 0;
HasGuidance = true;
Trace.WriteLine($"切换到跟踪模式,波束宽度: {config.TrackBeamWidth}度");
}
/// <summary>
/// 切换到锁定模式
/// </summary>
private void SwitchToLockMode()
{
currentMode = WorkMode.Lock;
HasGuidance = true;
Trace.WriteLine("切换到锁定模式 - 目标锁定成功");
}
/// <summary>
@ -108,7 +234,106 @@ namespace ThreatSource.Guidance
}
/// <summary>
/// 更新制导系统的状态和计算结果
/// 更新圆锥扫描参数
/// </summary>
private void UpdateConicalScan(double deltaTime)
{
if (currentMode == WorkMode.Search)
{
// 使用配置参数
currentScanAngle += config.ScanAngularSpeedDeg * Math.PI / 180.0 * deltaTime;
currentScanRadius += config.ScanRadiusGrowthRateDeg * Math.PI / 180.0 * deltaTime;
currentScanRadius = Math.Min(currentScanRadius, maxScanRadius);
if (currentScanAngle >= 2 * Math.PI)
{
currentScanAngle -= 2 * Math.PI;
}
Console.WriteLine($"扫描参数 - 半径: {currentScanRadius * 180/Math.PI:F2}度, 角度: {currentScanAngle * 180/Math.PI:F2}度");
}
else
{
currentScanAngle = 0;
// 非搜索模式时重置扫描参数
currentScanRadius = config.SearchBeamWidth * Math.PI / 720.0;
}
}
/// <summary>
/// 计算目标是否在当前扫描波束内
/// </summary>
private bool IsTargetInBeam(Vector3D missileVelocity, Vector3D toTarget)
{
// 使用导弹速度方向作为X轴前进方向
Vector3D baseDirection = missileVelocity.Normalize();
// 根据当前模式选择波束宽度
double currentBeamWidth = currentMode switch
{
WorkMode.Search => config.SearchBeamWidth * Math.PI / 180.0,
WorkMode.Track => config.TrackBeamWidth * Math.PI / 180.0,
WorkMode.Lock => config.LockBeamWidth * Math.PI / 180.0,
_ => config.SearchBeamWidth * Math.PI / 180.0
};
if (currentMode == WorkMode.Search)
{
// 建立以前进方向为X轴的右手坐标系
Vector3D xAxis = baseDirection;
Vector3D yAxis;
Vector3D referenceAxis = Vector3D.UnitY; // 优先使用垂直轴作为参考
// 处理近乎垂直飞行的情况
if (Math.Abs(xAxis.Y) > 0.9)
{
referenceAxis = Vector3D.UnitZ; // 改用Z轴作为参考
}
// 构建正交坐标系
yAxis = Vector3D.CrossProduct(Vector3D.CrossProduct(xAxis, referenceAxis), xAxis).Normalize();
Vector3D zAxis = Vector3D.CrossProduct(xAxis, yAxis).Normalize();
// 计算圆锥扫描方向
double offsetAngle = currentScanRadius;
// X轴为主轴的圆锥扫描参数
double x = Math.Cos(offsetAngle); // 主轴分量
double y = Math.Sin(offsetAngle) * Math.Sin(currentScanAngle); // 垂直分量
double z = Math.Sin(offsetAngle) * Math.Cos(currentScanAngle); // 水平分量
// 合成扫描方向向量
Vector3D scanDirection = (
xAxis * x +
yAxis * y +
zAxis * z
).Normalize();
// 调试输出
Console.WriteLine($"导弹前进方向: {baseDirection}");
Console.WriteLine($"目标方向: {toTarget.Normalize()}");
Console.WriteLine($"扫描方向: {scanDirection}");
// 计算目标夹角
double angle = Vector3D.AngleBetween(scanDirection, toTarget.Normalize());
Console.WriteLine($"目标夹角: {angle * 180/Math.PI:F2}度");
Console.WriteLine($"波束宽度: {currentBeamWidth * 180/Math.PI:F2}度SNR阈值: {config.RecognitionSNRThreshold}dB");
return angle <= currentBeamWidth;
}
else
{
// 跟踪和锁定模式:直接使用基准方向
double angle = Math.Acos(Vector3D.DotProduct(baseDirection, toTarget.Normalize()));
string mode = currentMode == WorkMode.Track ? "跟踪" : "锁定";
Console.WriteLine($"{mode}模式 - 目标夹角: {angle * 180.0 / Math.PI:F2}度, 波束宽度: {currentBeamWidth * 180.0 / Math.PI:F2}度");
return angle <= currentBeamWidth;
}
}
/// <summary>
/// 更新制导系统的状态
/// </summary>
/// <param name="deltaTime">自上次更新以来的时间间隔,单位:秒</param>
/// <param name="missilePosition">导弹当前位置,单位:米</param>
@ -122,16 +347,25 @@ namespace ThreatSource.Guidance
/// </remarks>
public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity)
{
// 更新扫描参数
UpdateConicalScan(deltaTime);
base.Update(deltaTime, missilePosition, missileVelocity);
if (TryDetectTarget(missilePosition, missileVelocity, out Vector3D tankPosition))
if (TryDetectAndTrackTarget(missilePosition, missileVelocity, deltaTime, out Vector3D targetPosition))
{
//根据目标当前位置和上一次位置计算目标速度
Vector3D targetVelocity = (tankPosition - lastTargetPosition) / deltaTime;
lastTargetPosition = tankPosition;
targetLostTimer = 0;
Vector3D targetVelocity = (targetPosition - lastTargetPosition) / deltaTime;
lastTargetPosition = targetPosition;
lastTargetVelocity = targetVelocity;
// 使用基类的比例控制算法
GuidanceAcceleration = MotionAlgorithm.CalculateProportionalNavigation(ProportionalNavigationCoefficient, missilePosition, missileVelocity, tankPosition, targetVelocity);
// 使用比例导引控制算法
GuidanceAcceleration = MotionAlgorithm.CalculateProportionalNavigation(
ProportionalNavigationCoefficient,
missilePosition,
missileVelocity,
targetPosition,
targetVelocity);
if (GuidanceAcceleration.Magnitude() > MaxAcceleration)
{
@ -142,15 +376,30 @@ namespace ThreatSource.Guidance
}
else
{
HasGuidance = false;
if (currentMode != WorkMode.Search)
{
targetLostTimer += deltaTime;
// 如果目标丢失时间达到阈值,切换回搜索模式
if (targetLostTimer >= config.TargetLostTolerance)
{
HasGuidance = false;
Trace.WriteLine($"目标丢失 {targetLostTimer:F3}秒,切换回搜索模式");
SwitchToSearchMode();
}
}
else
{
HasGuidance = false;
}
}
}
/// <summary>
/// 尝试探测目标
/// 尝试探测和跟踪目标
/// </summary>
/// <param name="missilePosition">导弹当前位置,单位:米</param>
/// <param name="missileVelocity">导弹当前速度,单位:米/秒</param>
/// <param name="deltaTime">自上次更新以来的时间间隔,单位:秒</param>
/// <param name="targetPosition">输出探测到的目标位置,单位:米</param>
/// <returns>是否成功探测到目标</returns>
/// <remarks>
@ -161,43 +410,115 @@ namespace ThreatSource.Guidance
/// - 计算信噪比
/// - 判断目标有效性
/// </remarks>
private bool TryDetectTarget(Vector3D missilePosition, Vector3D missileVelocity, out Vector3D targetPosition)
private bool TryDetectAndTrackTarget(Vector3D missilePosition, Vector3D missileVelocity, double deltaTime, out Vector3D targetPosition)
{
targetPosition = Vector3D.Zero;
double minDistance = double.MaxValue;
bool foundTarget = false;
double currentSNR = double.MinValue;
// 如果被干扰直接返回false
if (isJammed)
{
Trace.WriteLine($"毫米波导引头受到干扰,干扰功率: {jammingPower:F2}W");
HasGuidance = false;
return false;
}
foreach (var element in SimulationManager.GetEntitiesByType<SimulationElement>())
{
if (element is ITarget target)
if (element is ITarget target)
{
Vector3D toTarget = target.Position - missilePosition;
double distance = toTarget.Magnitude();
if (distance <= config.MaxDetectionRange)
{
double angle = Math.Acos(Vector3D.DotProduct(toTarget.Normalize(), missileVelocity.Normalize()));
if (angle <= config.FieldOfViewAngleInRadians / 2)
{
// 模拟毫米波探测
double snr = CalculateSNR(distance, target.RadarCrossSection);
// 计算信噪比
double snr = CalculateSNR(distance, target.RadarCrossSection);
Console.WriteLine($"信噪比: {snr:F2}dB");
if(snr > config.RecognitionSNRThreshold && random.NextDouble() < config.TargetRecognitionProbability)
if (currentMode == WorkMode.Search)
{
// 在搜索模式下进行波束判断
if (IsTargetInBeam(missileVelocity, toTarget) && snr >= config.RecognitionSNRThreshold)
{
targetPosition = target.Position;
return true;
minDistance = distance;
foundTarget = true;
currentSNR = snr;
}
}
else if (currentMode == WorkMode.Track || currentMode == WorkMode.Lock)
{
// 在跟踪和锁定模式下直接使用搜索阶段的目标位置
if (Vector3D.Distance(target.Position, lastTargetPosition) < 100.0) // 目标识别容差
{
targetPosition = target.Position;
foundTarget = true;
currentSNR = snr;
break;
}
}
}
}
}
return false;
// 根据当前模式和探测结果更新系统状态
UpdateSystemState(foundTarget, currentSNR, deltaTime);
HasTarget = foundTarget;
return foundTarget;
}
/// <summary>
/// 更新系统状态
/// </summary>
private void UpdateSystemState(bool hasTarget, double snr, double deltaTime)
{
if (!hasTarget)
{
targetLostTimer += deltaTime;
if (targetLostTimer >= config.TargetLostTolerance)
{
SwitchToSearchMode();
}
return;
}
targetLostTimer = 0;
switch (currentMode)
{
case WorkMode.Search:
if (snr >= config.RecognitionSNRThreshold)
{
SwitchToTrackMode();
}
break;
case WorkMode.Track:
if (snr >= config.LockSNRThreshold)
{
lockConfirmationTimer += deltaTime;
if (lockConfirmationTimer >= config.LockConfirmationTime)
{
SwitchToLockMode();
}
}
else
{
lockConfirmationTimer = 0;
}
break;
case WorkMode.Lock:
if (snr < config.LockSNRThreshold)
{
SwitchToTrackMode();
}
break;
}
}
/// <summary>
@ -212,7 +533,11 @@ namespace ThreatSource.Guidance
/// </remarks>
public override string GetStatus()
{
return base.GetStatus() + $", Target Position: {lastTargetPosition}";
return base.GetStatus() +
$"\n当前模式: {currentMode}" +
$"\n目标位置: {lastTargetPosition}" +
$"\n目标速度: {lastTargetVelocity}" +
$"\n是否有目标: {HasTarget}";
}
/// <summary>
@ -232,19 +557,23 @@ namespace ThreatSource.Guidance
private double CalculateSNR(double distance, double radarCrossSection)
{
// 雷达参数
double transmitPower = 100; // 发射功率(W)
double antennaGain = Math.Pow(10, 30/10); // 天线增益(线性值从dB转换)
double wavelength = 3e8 / config.WaveFrequency; // 波长(m)
double bandwidth = 1e6; // 接收机带宽(Hz)假设为1MHz
double noiseFigure = Math.Pow(10, 3/10); // 噪声系数(线性值假设为3dB)
double transmitPower = config.TransmitPower; // 发射功率(W)典型值0.3W
double antennaGain = Math.Pow(10, config.AntennaGainDB/10); // 天线增益(线性值)
double wavelength = 3e8 / config.WaveFrequency; // 波长(m)94GHz -> 3.19mm
double bandwidth = 1.0 / config.PulseDuration; // 带宽(Hz),由脉冲持续时间决定
double noiseFigure = Math.Pow(10, config.NoiseFigureDB/10); // 噪声系数(线性值)
// 系统损耗单位dB
double atmosphericLoss = 0.4 * distance / 1000.0; // 大气衰减0.4dB/km
double totalLoss = Math.Pow(10, (atmosphericLoss + config.SystemLossDB) / 10); // 转换为线性值
// 常量
double k = 1.38e-23; // 玻尔兹曼常数
double T0 = 290; // 标准噪声温度(K)
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));
/ (Math.Pow(4 * Math.PI, 3) * Math.Pow(distance, 4) * totalLoss);
// 计算噪声功率
double noisePower = k * T0 * bandwidth * noiseFigure;
@ -257,3 +586,4 @@ namespace ThreatSource.Guidance
}
}
}

View File

@ -27,20 +27,16 @@ namespace ThreatSource.Missile
/// 毫米波末制导导弹的飞行阶段枚举
/// </summary>
/// <remarks>
/// 定义了导弹的个工作阶段:
/// 定义了导弹的个工作阶段:
/// - Launch: 发射阶段,初始加速
/// - Cruise: 巡航阶段,中程飞行
/// - TerminalGuidance: 末制导阶段,毫米波制导
/// - Explode: 爆炸阶段,执行毁伤
/// - SelfDestruct: 自毁阶段,紧急处置
/// - Terminal: 末制导阶段,毫米波制导
/// </remarks>
private enum MWTG_Stage
{
Launch, // 发射阶段
Cruise, // 巡航阶段
Search, // 搜索阶段
Track, // 跟踪阶段
Lock // 锁定阶段
Cruise, // 巡航阶段
Terminal // 末制导阶段
}
/// <summary>
@ -124,14 +120,8 @@ namespace ThreatSource.Missile
case MWTG_Stage.Cruise:
UpdateCruiseStage(deltaTime);
break;
case MWTG_Stage.Search:
UpdateSearchStage(deltaTime);
break;
case MWTG_Stage.Track:
UpdateTrackStage(deltaTime);
break;
case MWTG_Stage.Lock:
UpdateLockStage(deltaTime);
case MWTG_Stage.Terminal:
UpdateTerminalStage(deltaTime);
break;
}
base.Update(deltaTime);
@ -172,60 +162,22 @@ namespace ThreatSource.Missile
{
if (FlightTime > Properties.CruiseTime)
{
currentStage = MWTG_Stage.Search;
currentStage = MWTG_Stage.Terminal;
guidanceSystem.Activate(); // 激活制导系统
currentStage = MWTG_Stage.Search;
}
}
/// <summary>
/// 更新搜索阶段的状态
/// 更新末制导阶段的状态
/// </summary>
/// <param name="deltaTime">时间步长,单位:秒</param>
/// <remarks>
/// 搜索阶段特点:
/// - 开启毫米波制导
/// - 计算制导加速度
/// - 精确跟踪目标
/// 末制导阶段特点:
/// - 完全依赖导航系统的工作模式
/// - 根据导航系统状态更新制导
/// - 持续到命中目标
/// </remarks>
private void UpdateSearchStage(double deltaTime)
{
IsGuidance = true;
guidanceSystem.Update(deltaTime, Position, Velocity);
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
}
/// <summary>
/// 更新跟踪阶段的状态
/// </summary>
/// <param name="deltaTime">时间步长,单位:秒</param>
/// <remarks>
/// 跟踪阶段特点:
/// - 开启毫米波制导
/// - 计算制导加速度
/// - 精确跟踪目标
/// - 持续到命中目标
/// </remarks>
private void UpdateTrackStage(double deltaTime)
{
IsGuidance = true;
guidanceSystem.Update(deltaTime, Position, Velocity);
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
}
/// <summary>
/// 更新锁定阶段的状态
/// </summary>
/// <param name="deltaTime">时间步长,单位:秒</param>
/// <remarks>
/// 锁定阶段特点:
/// - 开启毫米波制导
/// - 计算制导加速度
/// - 精确跟踪目标
/// - 持续到命中目标
/// </remarks>
private void UpdateLockStage(double deltaTime)
private void UpdateTerminalStage(double deltaTime)
{
IsGuidance = true;
guidanceSystem.Update(deltaTime, Position, Velocity);

View File

@ -1143,7 +1143,7 @@ namespace ThreatSource.Simulation
/// <remarks>
/// 定义了毫米波雷达的最大作用距离
/// 超出此范围的目标无法有效探测
/// 典型值为5000米
/// 典型值为3000米
/// </remarks>
public double MaxDetectionRange { get; set; } = 5000.0;
@ -1157,14 +1157,6 @@ namespace ThreatSource.Simulation
/// </remarks>
public double FieldOfViewAngle { get; set; } = 45.0;
/// <summary>
/// 视场角,单位:弧度
/// </summary>
/// <remarks>
/// 将度数转换为弧度供内部计算使用
/// </remarks>
public double FieldOfViewAngleInRadians => FieldOfViewAngle * Math.PI / 180.0;
/// <summary>
/// 目标识别概率
/// </summary>
@ -1195,6 +1187,56 @@ namespace ThreatSource.Simulation
/// </remarks>
public double PulseDuration { get; set; } = 1e-6;
/// <summary>
/// 搜索波束宽度,单位:度
/// </summary>
/// <remarks>
/// 搜索模式下的波束宽度
/// 较宽的波束用于快速搜索
/// 典型值为4度
/// </remarks>
public double SearchBeamWidth { get; set; } = 4.0;
/// <summary>
/// 跟踪波束宽度,单位:度
/// </summary>
/// <remarks>
/// 跟踪模式下的波束宽度
/// 中等波束用于稳定跟踪
/// 典型值为2度
/// </remarks>
public double TrackBeamWidth { get; set; } = 2.0;
/// <summary>
/// 锁定波束宽度,单位:度
/// </summary>
/// <remarks>
/// 锁定模式下的波束宽度
/// 窄波束用于精确跟踪
/// 典型值为1度
/// </remarks>
public double LockBeamWidth { get; set; } = 1.0;
/// <summary>
/// 扫描角速度,单位:度/秒
/// </summary>
/// <remarks>
/// 定义了波束在水平面内的旋转速度
/// 影响搜索扫描的时间和可靠性
/// 典型值为360度/秒(一秒转一圈)
/// </remarks>
public double ScanAngularSpeedDeg { get; set; } = 360.0;
/// <summary>
/// 扫描半径增长率,单位:度/秒
/// </summary>
/// <remarks>
/// 定义了波束与导弹前进方向夹角的增长速度
/// 影响螺旋扫描的空间覆盖率
/// 典型值为22.5度/秒1秒达到最大视场角45度的一半
/// </remarks>
public double ScanRadiusGrowthRateDeg { get; set; } = 22.5;
/// <summary>
/// 识别目标的信噪比阈值,单位:分贝
/// </summary>
@ -1203,19 +1245,133 @@ namespace ThreatSource.Simulation
/// 大于此值时认为目标有效
/// 典型值为6dB
/// </remarks>
public double RecognitionSNRThreshold { get; set; } = 6.0;
public double RecognitionSNRThreshold { get; set; } = -10.0;
/// <summary>
/// 锁定阶段信噪比阈值,单位:分贝
/// </summary>
/// <remarks>
/// 锁定模式下的最小信噪比要求
/// 较高阈值用于精确跟踪
/// 典型值为3dB
/// </remarks>
public double LockSNRThreshold { get; set; } = 3.0;
/// <summary>
/// 目标丢失容忍时间,单位:秒
/// </summary>
/// <remarks>
/// 允许目标暂时丢失的最长时间
/// 超过此时间将切换回搜索模式
/// 典型值为0.2秒
/// </remarks>
public double TargetLostTolerance { get; set; } = 0.2;
/// <summary>
/// 锁定确认时间,单位:秒
/// </summary>
/// <remarks>
/// 确认目标锁定所需的时间
/// 用于防止误锁定
/// 典型值为0.5秒
/// </remarks>
public double LockConfirmationTime { get; set; } = 0.5;
/// <summary>
/// 脉冲重复频率,单位:赫兹
/// </summary>
/// <remarks>
/// 雷达发射脉冲的频率
/// 影响速度测量和距离模糊
/// 典型值为10kHz
/// </remarks>
public double PulseRepetitionFrequency { get; set; } = 1e4;
/// <summary>
/// 发射功率,单位:瓦特
/// </summary>
/// <remarks>
/// 雷达发射机的输出功率
/// 参考硫磺石导弹的设计参数
/// 典型值为0.3瓦特
/// </remarks>
public double TransmitPower { get; set; } = 0.3;
/// <summary>
/// 多普勒速度分辨率,单位:米/秒
/// </summary>
/// <remarks>
/// 速度测量的最小分辨单位
/// 影响速度测量精度
/// 典型值为1米/秒
/// </remarks>
public double DopplerVelocityResolution { get; set; } = 1.0;
/// <summary>
/// 最大可测速度,单位:米/秒
/// </summary>
/// <remarks>
/// 能够测量的最大目标速度
/// 由脉冲重复频率决定
/// 典型值为1000米/秒
/// </remarks>
public double MaxMeasurableVelocity { get; set; } = 1000.0;
/// <summary>
/// 天线增益,单位:分贝(dB)
/// </summary>
/// <remarks>
/// 定义了天线的方向性增益能力
/// 影响系统的探测能力
/// 典型值为23dB
/// </remarks>
public double AntennaGainDB { get; set; } = 23.0;
/// <summary>
/// 噪声系数,单位:分贝(dB)
/// </summary>
/// <remarks>
/// 定义了接收机的噪声特性
/// 影响系统的最小可探测信号
/// 典型值为7dB
/// </remarks>
public double NoiseFigureDB { get; set; } = 7.0;
/// <summary>
/// 系统损耗,单位:分贝(dB)
/// </summary>
/// <remarks>
/// 包括接收机损耗、波导损耗等
/// 影响系统的整体性能
/// 典型值为6dB
/// </remarks>
public double SystemLossDB { get; set; } = 6.0;
/// <summary>
/// 初始化毫米波末制导导引系统配置的新实例
/// </summary>
/// <remarks>
/// 使用属性初始化器设置的默认值:
/// - 最大探测范围5000米
/// - 最大探测范围:3000米
/// - 视场角45度
/// - 目标识别概率0.95
/// - 工作频率94GHz
/// - 脉冲持续时间1微秒
/// - 信噪比阈值6dB
/// - 搜索波束宽度4度
/// - 跟踪波束宽度2度
/// - 锁定波束宽度1度
/// - 扫描角速度360度/秒
/// - 扫描半径增长率22.5度/秒
/// - 识别目标SNR阈值-30dB
/// - 锁定目标SNR阈值3dB
/// - 时间参数0.2s/0.5s
/// - 脉冲重复频率10kHz
/// - 发射功率0.3W
/// - 多普勒参数速度分辨率1米/秒最大可测速度1000米/秒
/// - 天线增益23dB
/// - 噪声系数7dB
/// - 系统损耗6dB
/// </remarks>
public MillimeterWaveGuidanceConfig()
{

View File

@ -1 +1 @@
0.2.6
0.2.7

73
docs/project/theory.md Normal file
View File

@ -0,0 +1,73 @@
# 毫米波导引头扫描原理
## 1. 扫描方式
### 1.1 螺旋扫描
毫米波导引头采用螺旋扫描方式,通过同时控制扫描角度和扫描半径实现对整个视场角范围的搜索。
### 1.2 扫描参数
- 扫描角速度(ω):波束在水平面内的旋转速度
- 扫描半径增长率r'):波束与导弹前进方向夹角的增长速度
- 波束宽度(θ):雷达波束的张角
- 视场角FOV导引头最大探测角度范围
## 2. 参数计算
### 2.1 基本参数关系
- 最大扫描半径 = 视场角/2
- 单步角度变化 = 扫描角速度 × 仿真步长
- 单步半径变化 = 扫描半径增长率 × 仿真步长
### 2.2 参数选择准则
为避免扫描跳跃(漏掉目标),需满足:
1. 单步角度变化 < 波束宽度
2. 单步半径变化 < 波束宽度
### 2.3 典型参数值
假设条件:
- 仿真步长0.01秒
- 搜索波束宽度5度
- 视场角45度
- 期望扫描时间1秒
推荐参数值:
- 扫描角速度360度/秒2π弧度/秒)
- 单步角度变化3.6度 < 5度波束宽度
- 扫描半径增长率22.5度/秒0.393弧度/秒)
- 单步半径变化0.225度 < 5度波束宽度
## 3. 扫描效果分析
### 3.1 时间特性
- 完整扫描周期1秒
- 角度覆盖360度完整一圈
- 半径覆盖0-22.5度(视场角的一半)
### 3.2 空间覆盖
- 形成螺旋形扫描路径
- 相邻扫描线间距小于波束宽度
- 无盲区,保证搜索可靠性
### 3.3 注意事项
1. 实际工程中,常采用:
- 锥形扫描Conical Scan3-7Hz旋转频率
- 棱锥扫描Monopulse现代导弹更常用
2. 扫描参数应根据具体应用场景和系统要求进行优化
3. 现代趋势倾向于使用电子扫描替代机械扫描
## 4. 坐标系定义
扫描计算采用右手坐标系:
- X轴导弹前进方向
- Y轴垂直向上
- Z轴右手定则确定
波束方向矢量计算:
```math
\begin{aligned}
x &= \cos(\alpha) \\
y &= \sin(\alpha)\sin(\beta) \\
z &= \sin(\alpha)\cos(\beta)
\end{aligned}
```
其中:
- α:扫描半径角(与前向轴夹角)
- β:扫描方位角(旋转角度)

View File

@ -185,7 +185,7 @@ namespace ThreatSource.Tools.MissileSimulation
{
var launchParams = new InitialMotionParameters
{
Position = new Vector3D(2000, 20, 100),
Position = new Vector3D(3000, 20, 100),
Orientation = new Orientation(Math.PI, 0.0, 0),
InitialSpeed = 300
};