diff --git a/ThreatSource/data/missiles/terminal_sensitive/tsm_001.toml b/ThreatSource/data/missiles/terminal_sensitive/tsm_001.toml index 68c3b29..3569b81 100644 --- a/ThreatSource/data/missiles/terminal_sensitive/tsm_001.toml +++ b/ThreatSource/data/missiles/terminal_sensitive/tsm_001.toml @@ -22,10 +22,10 @@ SelfDestructHeight = 0.0 # 自毁高度 (米) [SubmunitionProperties] # 子弹药属性 Type = "TerminalSensitiveSubmunition" # 属性中的类型 -MaxSpeed = 2000.0 # 最大速度 (米/秒) +MaxSpeed = 3000.0 # 最大速度 (米/秒) MaxFlightTime = 60.0 # 最大飞行时间 (秒) MaxFlightDistance = 2000.0 # 最大飞行距离 (米) -MaxAcceleration = 500.0 # 最大加速度 (米/秒^2) +MaxAcceleration = 2000.0 # 最大加速度 (米/秒^2) ProportionalNavigationCoefficient = 4.0 # 比例导引系数 LaunchAcceleration = 0.0 # 发射加速度 (米/秒^2) MaxEngineBurnTime = 0.0 # 最大发动机燃烧时间 (秒) @@ -35,20 +35,21 @@ HitProbability = 0.9 # 命中概率 SelfDestructHeight = 20.0 # 自毁高度 (米) [SubmunitionConfig] # 子弹药配置 -SeparationSpeed = 600.0 # 分离速度 (米/秒) +SeparationSpeed = 750.0 # 分离速度 (米/秒) SeparationHeight = 1000.0 # 分离高度 (米) SeparationDistance = 1000.0 # 分离距离 (米) SubmunitionSeparationAngle = 35.0 # 子弹药分离角度 (度) SeparationRange = 10.0 # 分离散布范围 (米) -DecelerationAcceleration = 150.0 # 减速加速度 (米/秒^2) -DecelerationEndSpeed = 200.0 # 减速结束速度 (米/秒) -ParachuteDeploymentHeight = 400.0 # 开伞高度 (米) -ParachuteDeceleration = 110.0 # 降落伞减速度 (米/秒^2) -StableScanHeight = 200.0 # 稳定扫描高度 (米) +DecelerationHeight = 400.0 # 减速高度 (米) +DecelerationAcceleration = 1500.0 # 减速加速度 (米/秒^2) +DecelerationEndSpeed = 50.0 # 减速结束速度 (米/秒) +ParachuteDeploymentHeight = 200.0 # 开伞高度 (米) +ParachuteDeceleration = 40.0 # 降落伞减速度 (米/秒^2) +StableScanHeight = 173.2 # 稳定扫描高度 (米),斜距 200 米 VerticalDeclineSpeed = 10.0 # 垂直下降速度 (米/秒) SpiralRotationSpeed = 1440.0 # 螺旋旋转速度 (度/秒) ScanAngle = 30.0 # 扫描角度 (度) -TargetDetectionDistance = 150.0 # 目标探测距离 (米) +TargetDetectionDistance = 130.0 # 目标探测距离 (米),斜距 150 米 SelfDestructHeight = 20.0 # (子弹药)自毁高度 (米) AttackSpeed = 1000.0 # 攻击速度 (米/秒) TotalProcessingTime = 15.0 # 整体处理时间 (秒),用于目标位置预测 @@ -56,14 +57,14 @@ TotalProcessingTime = 15.0 # 整体处理时间 (秒),用于目 [SubmunitionConfig.InfraredDetectorConfig] # 子弹药红外探测器配置 MaxDetectionRange = 1000.0 # 最大探测距离 (米) Band = "Medium" # 工作波段 (例如: "Short", "Medium", "Long") -FieldOfView = 2.0 # 视场角 (度) +FieldOfView = 3.0 # 视场角 (度) DetectionRadiationIntensityThreshold = 50.0 # 探测辐射强度阈值 (瓦特/球面度) JammingResistanceThreshold = 1.0e-4 # 干扰抗性阈值 (瓦特) [SubmunitionConfig.RadiometerConfig] # 子弹药辐射计配置 MaxDetectionRange = 1000.0 # 最大探测距离 (米) Band = "Band8" # 工作波段 (例如: "Band3", "Band8", "Band35", "Band94") -ScanFieldOfView = 2.0 # 扫描视场角 (度) +ScanFieldOfView = 3.0 # 扫描视场角 (度) JammingResistanceThreshold = 1.0e-4 # 干扰抗性阈值 (瓦特) [SubmunitionConfig.AltimeterConfig] # 子弹药高度计配置 diff --git a/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs b/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs index f240ec0..8108a8f 100644 --- a/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs +++ b/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs @@ -202,15 +202,6 @@ namespace ThreatSource.Missile /// private void PerformSeparation() { - // 获取母弹当前的方向向量 - Vector3D currentDirection = KState.Orientation.ToVector(); - - // 计算水平方向(保持母弹的水平方向分量) - Vector3D horizontalDirection = new Vector3D(currentDirection.X, 0, currentDirection.Z).Normalize(); - - // 计算分离角度(弧度) - double separationAngleRad = submunitionConfig.SubmunitionSeparationAngle * Math.PI / 180.0; - // 获取风速 Vector3D windVec = Vector3D.Zero; var weather = SimulationManager.CurrentWeather; diff --git a/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs b/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs index 53a35be..71211a5 100644 --- a/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs +++ b/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs @@ -279,15 +279,27 @@ namespace ThreatSource.Missile /// 时间步长,单位:秒 /// /// 分离阶段处理: - /// - 只表示分离动作,不进行任何物理计算 - /// - 分离阶段结束,进入减速阶段 + /// - 激活毫米波测高雷达 + /// - 检查高度计数据有效,且高度是否小于等于减速高度 + /// - 如果是,则进入减速阶段 + /// - 否则,继续惯性飞行 /// private void UpdateSeparationStage(double deltaTime) { - // 分离阶段只表示分离行为,不进行任何物理计算 + if(!altimeter.IsActive) + { + // 激活毫米波测高雷达 + altimeter.Activate(); + altimeter.Update(deltaTime); + } - // 分离阶段结束,进入减速阶段 - currentSubmunitionStage = SubmunitionStage.Deceleration; + // 检查高度计数据有效,且高度是否小于等于减速高度 + AltimeterSensorData altimeterData = (AltimeterSensorData)altimeter.GetSensorData(); + if(altimeterData.IsValid && altimeterData.Altitude <= config.DecelerationHeight) + { + // 如果是,则进入减速阶段 + currentSubmunitionStage = SubmunitionStage.Deceleration; + } } /// @@ -304,13 +316,6 @@ namespace ThreatSource.Missile /// private void UpdateDecelerationStage(double deltaTime) { - if(!altimeter.IsActive) - { - // 激活毫米波测高雷达 - altimeter.Activate(); - altimeter.Update(deltaTime); - } - if (KState.Speed > config.DecelerationEndSpeed) { // 减速减旋,速度减小 @@ -324,7 +329,7 @@ namespace ThreatSource.Missile { // 如果是,则进入降落伞打开阶段 currentSubmunitionStage = SubmunitionStage.ParachuteDeployment; - } + } } /// @@ -342,12 +347,17 @@ namespace ThreatSource.Missile /// private void UpdateParachuteDeploymentStage(double deltaTime) { - // 如果速度大于降落伞减速速度,则降落伞减速 - if (KState.Speed > config.VerticalDeclineSpeed) + // 如果垂直速度分量大于垂直下降速度,则降落伞减速 + if (Math.Abs(KState.Velocity.Y) > config.VerticalDeclineSpeed) { Vector3D deceleration = -KState.Velocity.Normalize() * config.ParachuteDeceleration; KState.Velocity += deceleration * deltaTime; } + else + { + // 如果垂直速度分量小于等于垂直下降速度,则改为匀速垂直下降 + KState.Velocity = new Vector3D(0, -config.VerticalDeclineSpeed, 0); + } AltimeterSensorData altimeterData = (AltimeterSensorData)altimeter.GetSensorData(); // 检查高度计数据有效,且高度是否小于等于稳定扫描高度 diff --git a/ThreatSource/src/Simulation/SimulationConfig.cs b/ThreatSource/src/Simulation/SimulationConfig.cs index 3106573..0b5e400 100644 --- a/ThreatSource/src/Simulation/SimulationConfig.cs +++ b/ThreatSource/src/Simulation/SimulationConfig.cs @@ -830,6 +830,16 @@ namespace ThreatSource.Simulation #endregion #region 减速阶段参数 + + /// + /// 减速阶段减速高度,单位:米 + /// + /// + /// 定义了减速阶段的减速高度 + /// 默认值为400米 + /// + public double DecelerationHeight { get; set; } = 400.0; + /// /// 减速阶段的减速加速度,单位:米/秒² /// diff --git a/docs/project/theory.md b/docs/project/theory.md index b665d21..7616654 100644 --- a/docs/project/theory.md +++ b/docs/project/theory.md @@ -323,7 +323,7 @@ iii. coeff_c = DeltaPos.MagnitudeSquared() -## 坦克、装甲车和直升机的RCS统计模型选择与其运动特性、结构复杂度及雷达观测条件密切相关,以下是具体分析: +# 坦克、装甲车和直升机的RCS统计模型选择与其运动特性、结构复杂度及雷达观测条件密切相关,以下是具体分析: 一、坦克与装甲车 适用模型:Swerling I/III型或对数正态分布 运动特性 @@ -361,3 +361,22 @@ Swerling II/IV、混合分布 坦克的倾斜装甲可能引发极化敏感性,需结合交叉极化模型修正。直升机旋翼的谐振效应在低频段(L波段)可能增强RCS起伏幅度。 通过结合目标运动特性与散射机理,可更精准地选择RCS统计模型,为雷达探测算法设计提供理论支撑。 +# 末敏弹子弹各阶段切换参数 +子弹运动状态随机:10%,因为伞的影响 + +1. 分离阶段 + 分离速度=母弹速度(1000m/s) +2. 减速阶段 + 减速高度:400 米 + 减速时间: + 末端速度:30~50m/s +3. 伞降阶段 + 起始高度: + 减速时间:1秒 + 末端速度:10m/s +4. 稳态扫描 + 起始高度:30 度角斜距 200 米 + 下降速度:10m/s +5. 攻击阶段 + 起始高度:30 度角斜距 120 米 + 攻击速度:2000~3000m/s \ No newline at end of file diff --git a/tools/ComprehensiveMissileSimulator.cs b/tools/ComprehensiveMissileSimulator.cs index 926e3a7..64a1584 100644 --- a/tools/ComprehensiveMissileSimulator.cs +++ b/tools/ComprehensiveMissileSimulator.cs @@ -342,7 +342,7 @@ namespace ThreatSource.Tools.MissileSimulation { Position = new Vector3D(3000, 1, 20), Orientation = new Orientation(Math.PI/2, 0.0, 0.0), - Speed = 700 + Speed = 950 }; string missileId = "TSM_1"; @@ -490,156 +490,6 @@ namespace ThreatSource.Tools.MissileSimulation Console.WriteLine($"注册红外测角仪 {infraredTrackerId}"); } - /// - /// 添加各类型干扰器 - /// - private void AddJammers() - { - // 添加激光干扰器 - 指向指示器 - var laserJammerParams = new KinematicState - { - Position = new Vector3D(0, 0, 0), - Orientation = CalculateOrientationToEntity(indicators["LD_1"]), // 朝向激光指示器 - Speed = 0.0 - }; - string laserJammerId = "LaserJammer_Designator"; - var laserJammer = _threatSourceFactory.CreateJammer(laserJammerId, "laser_blocking", laserJammerParams, "Tank_1"); - if (laserJammer is BaseJammer jammer4) - { - simulationManager.RegisterEntity(laserJammerId, laserJammer); - jammers[laserJammerId] = jammer4; - Console.WriteLine($"注册激光干扰器(指向指示器) {laserJammerId}"); - } - - // 添加激光干扰器 - 指向导弹 - laserJammerParams = new KinematicState - { - Position = new Vector3D(0, 0, 0), - Orientation = CalculateOrientationToEntity(missiles["LSGM_1"]), // 朝向激光半主动导弹 - Speed = 0.0 - }; - laserJammerId = "LaserJammer_Missile"; - laserJammer = _threatSourceFactory.CreateJammer(laserJammerId, "laser_blocking", laserJammerParams, "Tank_1"); - if (laserJammer is BaseJammer jammer5) - { - simulationManager.RegisterEntity(laserJammerId, laserJammer); - jammers[laserJammerId] = jammer5; - Console.WriteLine($"注册激光干扰器(指向导弹) {laserJammerId}"); - } - - // 添加红外干扰器 - 指向指示器 - var irJammerParams = new KinematicState - { - Position = new Vector3D(0, 0, 0), - Orientation = CalculateOrientationToEntity(indicators["IT_1"]), // 朝向红外指示器 - Speed = 0.0 - }; - string irJammerId = "InfraredJammer_Designator"; - var irJammer = _threatSourceFactory.CreateJammer(irJammerId, "infrared_blocking", irJammerParams, "Tank_1"); - if (irJammer is BaseJammer jammer6) - { - simulationManager.RegisterEntity(irJammerId, irJammer); - jammers[irJammerId] = jammer6; - Console.WriteLine($"注册红外干扰器(指向指示器) {irJammerId}"); - } - - // 添加红外干扰器 - 指向导弹 - irJammerParams = new KinematicState - { - Position = new Vector3D(0, 0, 0), - Orientation = CalculateOrientationToEntity(missiles["ITGM_1"]), // 朝向红外成像导弹 - Speed = 0.0 - }; - irJammerId = "InfraredJammer_Missile"; - irJammer = _threatSourceFactory.CreateJammer(irJammerId, "infrared_blocking", irJammerParams, "Tank_1"); - if (irJammer is BaseJammer jammer7) - { - simulationManager.RegisterEntity(irJammerId, irJammer); - jammers[irJammerId] = jammer7; - Console.WriteLine($"注册红外干扰器(指向导弹) {irJammerId}"); - } - - // 添加毫米波干扰器 - 指向导弹 - var mmwJammerParams = new KinematicState - { - Position = new Vector3D(0, 0, 0), - Orientation = CalculateOrientationToEntity(missiles["MMWG_1"]), // 朝向毫米波导弹 - Speed = 0.0 - }; - string mmwJammerId = "MillimeterWaveJammer_Missile"; - var mmwJammer = _threatSourceFactory.CreateJammer(mmwJammerId, "mmw_blocking", mmwJammerParams, "Tank_1"); - if (mmwJammer is BaseJammer jammer8) - { - simulationManager.RegisterEntity(mmwJammerId, mmwJammer); - jammers[mmwJammerId] = jammer8; - Console.WriteLine($"注册毫米波干扰器(指向导弹) {mmwJammerId}"); - } - - // 添加激光干扰器 - 指向子弹药 - laserJammerParams = new KinematicState - { - Position = new Vector3D(0, 0, 0), - Orientation = new Orientation(0, Math.PI/2, 0), // 朝向垂直向上 - Speed = 0.0 - }; - laserJammerId = "LaserJammer_Submunition"; - laserJammer = _threatSourceFactory.CreateJammer(laserJammerId, "laser_top_blocking", laserJammerParams, "Tank_1"); - if (laserJammer is BaseJammer jammer9) - { - simulationManager.RegisterEntity(laserJammerId, laserJammer); - jammers[laserJammerId] = jammer9; - Console.WriteLine($"注册激光干扰器(垂直向上) {laserJammerId}"); - } - - // 添加红外干扰器 - 指向子弹药 - irJammerParams = new KinematicState - { - Position = new Vector3D(0, 0, 0), - Orientation = new Orientation(0, Math.PI/2, 0), // 朝向垂直向上 - Speed = 0.0 - }; - irJammerId = "InfraredJammer_Submunition"; - irJammer = _threatSourceFactory.CreateJammer(irJammerId, "infrared_top_blocking", irJammerParams, "Tank_1"); - if (irJammer is BaseJammer jammer10) - { - simulationManager.RegisterEntity(irJammerId, irJammer); - jammers[irJammerId] = jammer10; - Console.WriteLine($"注册红外干扰器(垂直向上) {irJammerId}"); - } - - // 添加毫米波干扰器 - 指向子弹药 - mmwJammerParams = new KinematicState - { - Position = new Vector3D(0, 0, 0), - Orientation = new Orientation(0, Math.PI/2, 0), // 朝向垂直向上 - Speed = 0.0 - }; - mmwJammerId = "MillimeterWaveJammer_Submunition"; - mmwJammer = _threatSourceFactory.CreateJammer(mmwJammerId, "mmw_top_blocking", mmwJammerParams, "Tank_1"); - if (mmwJammer is BaseJammer jammer11) - { - simulationManager.RegisterEntity(mmwJammerId, mmwJammer); - jammers[mmwJammerId] = jammer11; - Console.WriteLine($"注册毫米波干扰器(垂直向上) {mmwJammerId}"); - } - - // 添加毫米波补偿干扰器 - 指向导弹 - mmwJammerParams = new KinematicState - { - Position = new Vector3D(0, 0, 0), - Orientation = new Orientation(0, Math.PI/2, 0), // 朝向垂直向上 - Speed = 0.0 - }; - string mmwCompensationJammerId = "MillimeterWaveCompensationJammer_Submunition"; - var mmwCompensationJammer = _threatSourceFactory.CreateJammer(mmwCompensationJammerId, "mmw_compensation", mmwJammerParams, "Tank_1"); - if (mmwCompensationJammer is BaseJammer jammer12) - { - simulationManager.RegisterEntity(mmwCompensationJammerId, mmwCompensationJammer); - jammers[mmwCompensationJammerId] = jammer12; - Console.WriteLine($"注册毫米波补偿干扰器(垂直向上) {mmwCompensationJammerId}"); - } - } - /// /// 计算朝向实体的方向 ///