From 27834ddf99d07918e2c343f52a97345f34aecc17 Mon Sep 17 00:00:00 2001 From: Tian jianyong <11429339@qq.com> Date: Sat, 3 May 2025 23:07:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9C=AB=E6=95=8F=E5=BC=B9?= =?UTF-8?q?=E7=BA=A2=E5=A4=96=E6=8E=A2=E6=B5=8B=E5=99=A8=E7=83=9F=E5=B9=95?= =?UTF-8?q?=E5=B9=B2=E6=89=B0=E5=A4=84=E7=90=86=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AF=BC=E5=BC=95=E5=A4=B4=E5=AF=B9=E5=AF=BC=E5=BC=B9ID?= =?UTF-8?q?=E7=9A=84=E7=9B=B4=E6=8E=A5=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 9 +- .../LaserSemiActiveGuidanceSystemCodeTests.cs | 3 +- .../InfraredImagingGuidanceJammingTests.cs | 95 +++++++++------- .../LaserBeamRiderGuidanceJammingTests.cs | 104 +++++++++++------- .../src/Jamming/LaserDecoyTests.cs | 67 ++++++++--- .../LaserSemiActiveGuidanceJammingTests.cs | 89 ++++++++++++--- .../MillimeterWaveGuidanceJammingTests.cs | 88 ++++++++++++--- .../src/Guidance/BaseGuidanceSystem.cs | 49 ++++++--- ThreatSource/src/Guidance/IGuidanceSystem.cs | 2 +- .../Guidance/InfraredCommandGuidanceSystem.cs | 11 +- .../Guidance/InfraredImagingGuidanceSystem.cs | 39 ++++--- .../Guidance/LaserBeamRiderGuidanceSystem.cs | 12 +- .../Guidance/LaserSemiActiveGuidanceSystem.cs | 12 +- .../Guidance/MillimeterWaveGuidanceSystem.cs | 16 +-- ThreatSource/src/Indicator/InfraredTracker.cs | 5 +- ThreatSource/src/Indicator/LaserBeamRider.cs | 3 +- ThreatSource/src/Indicator/LaserDesignator.cs | 3 +- .../MIssile/InfraredCommandGuidedMissile.cs | 4 +- .../InfraredImagingTerminalGuidedMissile.cs | 7 +- .../src/MIssile/LaserBeamRiderMissile.cs | 3 +- .../MIssile/LaserSemiActiveGuidedMissile.cs | 5 +- .../MillimeterWaveTerminalGuidedMissile.cs | 3 +- ThreatSource/src/Sensor/InfraredDetector.cs | 42 +++++-- ThreatSource/src/Sensor/LaserRangefinder.cs | 5 - .../src/Sensor/MillimeterWaveAltimeter.cs | 8 +- .../src/Sensor/MillimeterWaveRadiometer.cs | 10 +- ThreatSource/src/Utils/Common.cs | 2 +- ThreatSource/src/Utils/MotionAlgorithm.cs | 32 ++++++ VERSION | 2 +- tools/ComprehensiveMissileSimulator.cs | 8 +- 30 files changed, 495 insertions(+), 243 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b93adf6..bcbdeed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,10 +15,13 @@ - 毫米波跟踪和锁定阶段采用脉冲多普勒制导、目标 RCS 特征矩阵 - 多种发射弹道模式:低平弹道、高抛弹道、俯冲弹道 - 双模、多模制导 -- 各组件返回当前状态信息 - Orientation 坐标系的调整(前向方向从 X 轴改为 Z 轴) -- 将 getRunningState 提取到 SimulationElement 基类中 -- 末敏弹各探测组件的干扰处理 +- 末敏弹各探测组件的干扰处理,增加毫米波补偿干扰 + + + +## [0.2.14] - 2025-05-03 +- 用ElementStatusInfo类,统一实现运行态信息返回(getStatusInfo方法),同时修改GetStatus方法 ## [0.2.13] - 2025-04-23 - 增加了烟幕弹对激光目标指示器、激光驾束仪、红外测角仪的干扰处理 diff --git a/ThreatSource.Tests/src/Guidance/LaserSemiActiveGuidanceSystemCodeTests.cs b/ThreatSource.Tests/src/Guidance/LaserSemiActiveGuidanceSystemCodeTests.cs index b8fb6b5..619673f 100644 --- a/ThreatSource.Tests/src/Guidance/LaserSemiActiveGuidanceSystemCodeTests.cs +++ b/ThreatSource.Tests/src/Guidance/LaserSemiActiveGuidanceSystemCodeTests.cs @@ -23,13 +23,14 @@ namespace ThreatSource.Tests.Guidance _guidanceSystem = new LaserSemiActiveGuidanceSystem( "guidance1", + "missile1", 50, // maxAcceleration 3, // guidanceCoefficient laserCodeConfig, guidanceConfig, _simulationManager ); - _guidanceSystem.ParentId = "missile1"; + _guidanceSystem.MissileId = "missile1"; _simulationManager.RegisterEntity("guidance1", _guidanceSystem); } diff --git a/ThreatSource.Tests/src/Jamming/InfraredImagingGuidanceJammingTests.cs b/ThreatSource.Tests/src/Jamming/InfraredImagingGuidanceJammingTests.cs index 8e777cc..23d5af6 100644 --- a/ThreatSource.Tests/src/Jamming/InfraredImagingGuidanceJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/InfraredImagingGuidanceJammingTests.cs @@ -5,6 +5,7 @@ using ThreatSource.Simulation; using ThreatSource.Tests.Simulation; using ThreatSource.Utils; using ThreatSource.Equipment; +using ThreatSource.Missile; namespace ThreatSource.Tests.Jamming { @@ -15,6 +16,7 @@ namespace ThreatSource.Tests.Jamming private TestSimulationAdapter? _testAdapter; private InfraredImagingGuidanceSystem? _guidanceSystem; private Tank? _target; + private InfraredImagingTerminalGuidedMissile? _missile; [TestInitialize] public void TestInitialize() @@ -59,9 +61,44 @@ namespace ThreatSource.Tests.Jamming _simulationManager.RegisterEntity("target1", _target); _testAdapter.AddTestEntity("target1", _target); + // 创建导弹对象 + var initialPosition = new Vector3D(500, 0, 0); + var initialVelocity = new Vector3D(100, 0, 0); + var missileMotion = new MotionParameters + { + Position = initialPosition, + InitialSpeed = initialVelocity.Magnitude() + }; + missileMotion.Orientation = new Orientation(0, 0, 0); + + var missileProperties = new MissileProperties + { + MaxSpeed = 1000, + MaxAcceleration = 100, + MaxEngineBurnTime = 1.0, + ProportionalNavigationCoefficient = 3.0, + MaxFlightTime = 60, + MaxFlightDistance = 10000, + ExplosionRadius = 10, + Mass = 50, + Type = MissileType.InfraredImagingTerminalGuidance + }; + + _missile = new InfraredImagingTerminalGuidedMissile( + "missile1", + EquipmentType.Tank, + missileProperties, + missileMotion, + config, + _simulationManager + ); + _simulationManager.RegisterEntity("missile1", _missile); + _testAdapter.AddTestEntity("missile1", _missile); + // 创建红外引导系统 _guidanceSystem = new InfraredImagingGuidanceSystem( "infraredGuidance1", + "missile1", config, EquipmentType.Tank, 100, // 最大加速度 @@ -75,11 +112,14 @@ namespace ThreatSource.Tests.Jamming // 激活引导系统 _guidanceSystem.Activate(); + _missile.Activate(); + _missile.Fire(); } public void Dispose() { _guidanceSystem?.Deactivate(); + _missile?.Deactivate(); } [TestMethod] @@ -88,15 +128,12 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); - - System.Diagnostics.Debug.WriteLine($"测试开始 - 初始位置: {initialPosition}, 初始速度: {initialVelocity}"); + System.Diagnostics.Debug.WriteLine($"测试开始 - 初始位置: {_missile.Position}, 初始速度: {_missile.Velocity}"); // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建干扰事件 var jammingEvent = new JammingEvent @@ -117,7 +154,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert System.Diagnostics.Debug.WriteLine($"测试结果 - IsJammed: {_guidanceSystem.IsJammed}, HasGuidance: {_guidanceSystem.HasGuidance}"); @@ -132,12 +169,8 @@ namespace ThreatSource.Tests.Jamming Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); - // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建角度范围外的干扰事件 var jammingEvent = new JammingEvent @@ -155,7 +188,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert Assert.IsFalse(_guidanceSystem.IsJammed, "引导系统不应该被干扰,因为干扰源不在角度范围内"); @@ -168,12 +201,8 @@ namespace ThreatSource.Tests.Jamming Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); - // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建低功率干扰事件 var jammingEvent = new JammingEvent @@ -191,7 +220,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert Assert.IsFalse(_guidanceSystem.IsJammed, "引导系统不应该被干扰,因为干扰功率低于阈值"); @@ -204,12 +233,8 @@ namespace ThreatSource.Tests.Jamming Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); - // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建有限时间的干扰事件 var jammingEvent = new JammingEvent @@ -228,7 +253,7 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认已被干扰 Assert.IsTrue(_guidanceSystem.IsJammed, "红外引导系统应该处于被干扰状态"); @@ -237,7 +262,7 @@ namespace ThreatSource.Tests.Jamming // 通过多次更新引导系统,让JammingHandler处理时间 for (int i = 0; i < 10; i++) { - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); // 总共更新1秒,超过干扰持续时间 + _guidanceSystem.Update(0.1); // 总共更新1秒,超过干扰持续时间 } // Assert - 确认干扰已清除 @@ -251,12 +276,8 @@ namespace ThreatSource.Tests.Jamming Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); - // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建持续干扰事件 var jammingEvent = new JammingEvent @@ -275,14 +296,14 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认已被干扰 Assert.IsTrue(_guidanceSystem.IsJammed, "红外引导系统应该处于被干扰状态"); // Act - 手动清除干扰 _guidanceSystem.ClearJamming(jammingEvent.Parameters); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认干扰已清除 Assert.IsFalse(_guidanceSystem.IsJammed, "手动清除后,引导系统应该恢复正常"); @@ -295,12 +316,8 @@ namespace ThreatSource.Tests.Jamming Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); - // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建干扰事件 var jammingEvent = new JammingEvent @@ -319,7 +336,7 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认系统切换到搜索模式 Assert.IsTrue(_guidanceSystem.IsJammed, "红外引导系统应该处于被干扰状态"); diff --git a/ThreatSource.Tests/src/Jamming/LaserBeamRiderGuidanceJammingTests.cs b/ThreatSource.Tests/src/Jamming/LaserBeamRiderGuidanceJammingTests.cs index 6addbfe..b60b4cd 100644 --- a/ThreatSource.Tests/src/Jamming/LaserBeamRiderGuidanceJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/LaserBeamRiderGuidanceJammingTests.cs @@ -5,6 +5,7 @@ using ThreatSource.Simulation; using ThreatSource.Tests.Simulation; using ThreatSource.Utils; using ThreatSource.Equipment; +using ThreatSource.Missile; namespace ThreatSource.Tests.Jamming { @@ -15,6 +16,7 @@ namespace ThreatSource.Tests.Jamming private TestSimulationAdapter? _testAdapter; private LaserBeamRiderGuidanceSystem? _guidanceSystem; private Tank? _target; + private LaserBeamRiderMissile? _missile; [TestInitialize] public void TestInitialize() @@ -71,9 +73,48 @@ namespace ThreatSource.Tests.Jamming _simulationManager.RegisterEntity("target1", _target); _testAdapter.AddTestEntity("target1", _target); + // 创建导弹对象 + var initialPosition = new Vector3D(500, 0, 0); + var initialVelocity = new Vector3D(100, 0, 0); + var missileMotion = new MotionParameters + { + Position = initialPosition, + InitialSpeed = initialVelocity.Magnitude() + }; + missileMotion.Orientation = new Orientation(0, 0, 0); + + var missileProperties = new MissileProperties + { + MaxSpeed = 1000, + MaxAcceleration = 100, + MaxEngineBurnTime = 1.0, + ProportionalNavigationCoefficient = 3.0, + MaxFlightTime = 60, + MaxFlightDistance = 10000, + ExplosionRadius = 10, + Mass = 50, + SelfDestructHeight = -10, + HitProbability = 0.9, + LaunchAcceleration = 100, + Type = MissileType.LaserBeamRiderGuidance, + LaserCodeConfig = laserCodeConfig + }; + + _missile = new LaserBeamRiderMissile( + "missile1", + missileProperties, + missileMotion, + laserCodeConfig, + config, + _simulationManager + ); + _simulationManager.RegisterEntity("missile1", _missile); + _testAdapter.AddTestEntity("missile1", _missile); + // 创建激光驾束引导系统 _guidanceSystem = new LaserBeamRiderGuidanceSystem( "laserBeamRider1", + "missile1", 100, // 最大加速度 3.0, // 比例导引系数 laserCodeConfig, @@ -87,11 +128,14 @@ namespace ThreatSource.Tests.Jamming // 激活引导系统 _guidanceSystem.Activate(); + _missile.Activate(); + _missile.Fire(); } public void Dispose() { _guidanceSystem?.Deactivate(); + _missile?.Deactivate(); } [TestMethod] @@ -100,12 +144,9 @@ namespace ThreatSource.Tests.Jamming // 断言测试所需的组件已正确初始化 Assert.IsNotNull(_simulationManager, "模拟管理器不应为空"); Assert.IsNotNull(_guidanceSystem, "激光驾束引导系统不应为空"); + Assert.IsNotNull(_missile, "导弹不应为空"); - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); - - System.Diagnostics.Debug.WriteLine($"测试开始 - 初始位置: {initialPosition}, 初始速度: {initialVelocity}"); + System.Diagnostics.Debug.WriteLine($"测试开始 - 初始位置: {_missile.Position}, 初始速度: {_missile.Velocity}"); // 更新激光波束参数 _guidanceSystem.UpdateLaserBeamRider( @@ -115,7 +156,7 @@ namespace ThreatSource.Tests.Jamming ); // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建干扰事件 var jammingEvent = new JammingEvent @@ -137,7 +178,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert System.Diagnostics.Debug.WriteLine($"测试结果 - IsJammed: {_guidanceSystem.IsJammed}, HasGuidance: {_guidanceSystem.HasGuidance}"); @@ -151,10 +192,7 @@ namespace ThreatSource.Tests.Jamming // 断言测试所需的组件已正确初始化 Assert.IsNotNull(_simulationManager, "模拟管理器不应为空"); Assert.IsNotNull(_guidanceSystem, "激光驾束引导系统不应为空"); - - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); + Assert.IsNotNull(_missile, "导弹不应为空"); // 更新激光波束参数 _guidanceSystem.UpdateLaserBeamRider( @@ -164,7 +202,7 @@ namespace ThreatSource.Tests.Jamming ); // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建角度范围外的干扰事件 var jammingEvent = new JammingEvent @@ -182,7 +220,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert Assert.IsFalse(_guidanceSystem.IsJammed, "引导系统不应该被干扰,因为干扰源不在角度范围内"); @@ -194,10 +232,7 @@ namespace ThreatSource.Tests.Jamming // 断言测试所需的组件已正确初始化 Assert.IsNotNull(_simulationManager, "模拟管理器不应为空"); Assert.IsNotNull(_guidanceSystem, "激光驾束引导系统不应为空"); - - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); + Assert.IsNotNull(_missile, "导弹不应为空"); // 更新激光波束参数 _guidanceSystem.UpdateLaserBeamRider( @@ -207,7 +242,7 @@ namespace ThreatSource.Tests.Jamming ); // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建低功率干扰事件 var jammingEvent = new JammingEvent @@ -225,7 +260,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert Assert.IsFalse(_guidanceSystem.IsJammed, "引导系统不应该被干扰,因为干扰功率低于阈值"); @@ -237,10 +272,7 @@ namespace ThreatSource.Tests.Jamming // 断言测试所需的组件已正确初始化 Assert.IsNotNull(_simulationManager, "模拟管理器不应为空"); Assert.IsNotNull(_guidanceSystem, "激光驾束引导系统不应为空"); - - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); + Assert.IsNotNull(_missile, "导弹不应为空"); // 更新激光波束参数 _guidanceSystem.UpdateLaserBeamRider( @@ -250,7 +282,7 @@ namespace ThreatSource.Tests.Jamming ); // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建有限时间的干扰事件 var jammingEvent = new JammingEvent @@ -270,7 +302,7 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认已被干扰 Assert.IsTrue(_guidanceSystem.IsJammed, "激光驾束引导系统应该处于被干扰状态"); @@ -279,7 +311,7 @@ namespace ThreatSource.Tests.Jamming // 通过多次更新引导系统,让JammingHandler处理时间 for (int i = 0; i < 10; i++) { - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); // 总共更新1秒,超过干扰持续时间 + _guidanceSystem.Update(0.1); // 总共更新1秒,超过干扰持续时间 } // Assert - 确认干扰已清除 @@ -292,10 +324,7 @@ namespace ThreatSource.Tests.Jamming // 断言测试所需的组件已正确初始化 Assert.IsNotNull(_simulationManager, "模拟管理器不应为空"); Assert.IsNotNull(_guidanceSystem, "激光驾束引导系统不应为空"); - - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); + Assert.IsNotNull(_missile, "导弹不应为空"); // 更新激光波束参数 _guidanceSystem.UpdateLaserBeamRider( @@ -305,7 +334,7 @@ namespace ThreatSource.Tests.Jamming ); // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建持续干扰事件 var jammingEvent = new JammingEvent @@ -325,14 +354,14 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认已被干扰 Assert.IsTrue(_guidanceSystem.IsJammed, "激光驾束引导系统应该处于被干扰状态"); // Act - 手动清除干扰 _guidanceSystem.ClearJamming(jammingEvent.Parameters); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认干扰已清除 Assert.IsFalse(_guidanceSystem.IsJammed, "手动清除后,引导系统应该恢复正常"); @@ -344,10 +373,7 @@ namespace ThreatSource.Tests.Jamming // 断言测试所需的组件已正确初始化 Assert.IsNotNull(_simulationManager, "模拟管理器不应为空"); Assert.IsNotNull(_guidanceSystem, "激光驾束引导系统不应为空"); - - // Arrange - var initialPosition = new Vector3D(500, 0, 0); - var initialVelocity = new Vector3D(100, 0, 0); + Assert.IsNotNull(_missile, "导弹不应为空"); // 更新激光波束参数 _guidanceSystem.UpdateLaserBeamRider( @@ -357,7 +383,7 @@ namespace ThreatSource.Tests.Jamming ); // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建干扰事件 var jammingEvent = new JammingEvent @@ -377,7 +403,7 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认系统切换到搜索模式 Assert.IsTrue(_guidanceSystem.IsJammed, "激光驾束引导系统应该处于被干扰状态"); diff --git a/ThreatSource.Tests/src/Jamming/LaserDecoyTests.cs b/ThreatSource.Tests/src/Jamming/LaserDecoyTests.cs index 028cec6..bde7a3e 100644 --- a/ThreatSource.Tests/src/Jamming/LaserDecoyTests.cs +++ b/ThreatSource.Tests/src/Jamming/LaserDecoyTests.cs @@ -7,6 +7,7 @@ using ThreatSource.Equipment; using ThreatSource.Indicator; using System.Diagnostics; using ThreatSource.Jammer; +using ThreatSource.Missile; namespace ThreatSource.Tests.Jamming { @@ -18,6 +19,7 @@ namespace ThreatSource.Tests.Jamming private LaserSemiActiveGuidanceSystem? _guidanceSystem; private Tank? _target; private Tank? _decoySource; + private LaserSemiActiveGuidedMissile? _missile; // 默认的激光诱偏配置参数 private const double DefaultDecoyLaserDivergenceAngle = 0.001; @@ -109,9 +111,39 @@ namespace ThreatSource.Tests.Jamming } } + // 创建导弹对象 + var missileInitialMotion = new MotionParameters + { + Position = new Vector3D(10, 0, 0), + Orientation = new Orientation(0, 0, 0), + InitialSpeed = 50 + }; + + var missileProperties = new MissileProperties + { + Type = MissileType.LaserSemiActiveGuidance, + MaxAcceleration = 100, + MaxSpeed = 300, + Mass = 50, + ProportionalNavigationCoefficient = 3.0 + }; + + _missile = new LaserSemiActiveGuidedMissile( + "missile1", + missileProperties, + missileInitialMotion, + laserCodeConfig, + config, + _simulationManager + ); + + _simulationManager.RegisterEntity("missile1", _missile); + _testAdapter.AddTestEntity("missile1", _missile); + // 创建激光半主动制导系统 _guidanceSystem = new LaserSemiActiveGuidanceSystem( "laserGuidance1", + "missile1", 100, // 最大加速度 3.0, // 比例导引系数 laserCodeConfig, @@ -121,10 +153,6 @@ namespace ThreatSource.Tests.Jamming if (_guidanceSystem != null) { - // 设置导弹的初始位置和速度 - 更靠近激光源和目标 - _guidanceSystem.Position = new Vector3D(10, 0, 0); - _guidanceSystem.Velocity = new Vector3D(50, 0, 0); - // 注册制导系统 _simulationManager.RegisterEntity("laserGuidance1", _guidanceSystem); if (_testAdapter != null) @@ -132,8 +160,10 @@ namespace ThreatSource.Tests.Jamming _testAdapter.AddTestEntity("laserGuidance1", _guidanceSystem); } - // 激活制导系统 + // 激活制导系统和导弹 _guidanceSystem.Activate(); + _missile.Activate(); + _missile.Fire(); // 通过反射设置CurrentTargetId字段为target1,确保制导系统能正确识别目标 var targetIdField = typeof(LaserSemiActiveGuidanceSystem).GetField("CurrentTargetId", @@ -149,6 +179,7 @@ namespace ThreatSource.Tests.Jamming public void Dispose() { _guidanceSystem?.Deactivate(); + _missile?.Deactivate(); } /// @@ -282,7 +313,7 @@ namespace ThreatSource.Tests.Jamming _simulationManager?.Update(0.1); designator?.Update(0.1); _target?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 检查是否锁定真实目标 - 由于测试环境限制,跳过初始锁定检查 @@ -311,7 +342,7 @@ namespace ThreatSource.Tests.Jamming designator?.Update(0.1); _target?.Update(0.1); _decoySource?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 记录受诱偏影响后的制导加速度 @@ -418,7 +449,7 @@ namespace ThreatSource.Tests.Jamming _simulationManager?.Update(0.1); designator?.Update(0.1); _target?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 记录初始目标位置 @@ -442,7 +473,7 @@ namespace ThreatSource.Tests.Jamming designator?.Update(0.1); _target?.Update(0.1); _decoySource?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 记录诱偏后的制导加速度 @@ -543,7 +574,7 @@ namespace ThreatSource.Tests.Jamming _simulationManager?.Update(0.1); designator?.Update(0.1); _target?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 确保锁定成功 - 由于测试环境限制,跳过初始锁定检查 @@ -572,7 +603,7 @@ namespace ThreatSource.Tests.Jamming designator?.Update(0.1); _target?.Update(0.1); _decoySource?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 记录诱偏后的制导加速度 @@ -588,7 +619,7 @@ namespace ThreatSource.Tests.Jamming if (i % 5 == 0) // 每隔0.5秒更新一次制导系统,减少计算量 { - _guidanceSystem?.Update(0.5, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.5); } } @@ -598,7 +629,7 @@ namespace ThreatSource.Tests.Jamming _simulationManager?.Update(0.1); designator?.Update(0.1); _target?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 记录诱偏消失后的制导加速度 @@ -703,7 +734,7 @@ namespace ThreatSource.Tests.Jamming _simulationManager?.Update(0.1); designator?.Update(0.1); _target?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 记录初始状态下的目标位置 @@ -730,7 +761,7 @@ namespace ThreatSource.Tests.Jamming designator?.Update(0.1); _target?.Update(0.1); _decoySource?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 获取诱偏目标位置 @@ -976,7 +1007,7 @@ namespace ThreatSource.Tests.Jamming _simulationManager?.Update(0.1); designator?.Update(0.1); _target?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 记录初始状态下的目标位置 @@ -1017,7 +1048,7 @@ namespace ThreatSource.Tests.Jamming designator?.Update(0.1); _target?.Update(0.1); _decoySource?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 手动调用UpdateLaserSources方法 @@ -1045,7 +1076,7 @@ namespace ThreatSource.Tests.Jamming designator?.Update(0.1); _target?.Update(0.1); _decoySource?.Update(0.1); - _guidanceSystem?.Update(0.1, _guidanceSystem?.Position ?? Vector3D.Zero, _guidanceSystem?.Velocity ?? Vector3D.Zero); + _guidanceSystem?.Update(0.1); } // 获取诱偏目标位置 diff --git a/ThreatSource.Tests/src/Jamming/LaserSemiActiveGuidanceJammingTests.cs b/ThreatSource.Tests/src/Jamming/LaserSemiActiveGuidanceJammingTests.cs index 8aa76b3..a93f24d 100644 --- a/ThreatSource.Tests/src/Jamming/LaserSemiActiveGuidanceJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/LaserSemiActiveGuidanceJammingTests.cs @@ -5,6 +5,7 @@ using ThreatSource.Simulation; using ThreatSource.Tests.Simulation; using ThreatSource.Utils; using ThreatSource.Equipment; +using ThreatSource.Missile; namespace ThreatSource.Tests.Jamming { @@ -15,6 +16,7 @@ namespace ThreatSource.Tests.Jamming private TestSimulationAdapter? _testAdapter; private LaserSemiActiveGuidanceSystem? _guidanceSystem; private Tank? _target; + private LaserSemiActiveGuidedMissile? _missile; [TestInitialize] public void TestInitialize() @@ -68,9 +70,38 @@ namespace ThreatSource.Tests.Jamming _simulationManager.RegisterEntity("target1", _target); _testAdapter.AddTestEntity("target1", _target); + // 创建并注册导弹实体 + var missileInitialMotion = new MotionParameters + { + Position = new Vector3D(500, 0, 0), + Orientation = new Orientation(0, 0, 0), + InitialSpeed = 100 + }; + + var missileProperties = new MissileProperties + { + Type = MissileType.LaserSemiActiveGuidance, + MaxAcceleration = 100, + MaxSpeed = 300, + Mass = 50 + }; + + _missile = new LaserSemiActiveGuidedMissile( + "missile1", + missileProperties, + missileInitialMotion, + laserCodeConfig, + config, + _simulationManager + ); + + _simulationManager.RegisterEntity("missile1", _missile); + _testAdapter.AddTestEntity("missile1", _missile); + // 创建激光半主动制导系统 _guidanceSystem = new LaserSemiActiveGuidanceSystem( "laserGuidance1", + "missile1", 100, // 最大加速度 3.0, // 比例导引系数 laserCodeConfig, @@ -97,6 +128,7 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); @@ -104,8 +136,12 @@ namespace ThreatSource.Tests.Jamming System.Diagnostics.Debug.WriteLine($"测试开始 - 初始位置: {initialPosition}, 初始速度: {initialVelocity}"); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建干扰事件 var jammingEvent = new JammingEvent @@ -127,7 +163,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert System.Diagnostics.Debug.WriteLine($"测试结果 - IsJammed: {_guidanceSystem.IsJammed}, HasGuidance: {_guidanceSystem.HasGuidance}"); @@ -141,13 +177,18 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); var initialVelocity = new Vector3D(100, 0, 0); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建角度范围外的干扰事件 var jammingEvent = new JammingEvent @@ -167,7 +208,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert Assert.IsFalse(_guidanceSystem.IsJammed, "制导系统不应该被干扰,因为干扰源不在角度范围内"); @@ -179,13 +220,18 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); var initialVelocity = new Vector3D(100, 0, 0); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建低功率干扰事件 var jammingEvent = new JammingEvent @@ -205,7 +251,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert Assert.IsFalse(_guidanceSystem.IsJammed, "制导系统不应该被干扰,因为干扰功率低于阈值"); @@ -217,13 +263,18 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); var initialVelocity = new Vector3D(100, 0, 0); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建有限时间的干扰事件 var jammingEvent = new JammingEvent @@ -243,7 +294,7 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认已被干扰 Assert.IsTrue(_guidanceSystem.IsJammed, "激光半主动制导系统应该处于被干扰状态"); @@ -252,7 +303,7 @@ namespace ThreatSource.Tests.Jamming // 通过多次更新制导系统,让JammingHandler处理时间 for (int i = 0; i < 10; i++) { - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); // 总共更新1秒,超过干扰持续时间 + _guidanceSystem.Update(0.1); // 总共更新1秒,超过干扰持续时间 } // Assert - 确认干扰已清除 @@ -265,13 +316,18 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); var initialVelocity = new Vector3D(100, 0, 0); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建持续干扰事件 var jammingEvent = new JammingEvent @@ -291,14 +347,14 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认已被干扰 Assert.IsTrue(_guidanceSystem.IsJammed, "激光半主动制导系统应该处于被干扰状态"); // Act - 手动清除干扰 _guidanceSystem.ClearJamming(jammingEvent.Parameters); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认干扰已清除 Assert.IsFalse(_guidanceSystem.IsJammed, "手动清除后,制导系统应该恢复正常"); @@ -310,13 +366,18 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); var initialVelocity = new Vector3D(100, 0, 0); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建干扰事件 var jammingEvent = new JammingEvent @@ -336,7 +397,7 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认系统切换到搜索模式 Assert.IsTrue(_guidanceSystem.IsJammed, "激光半主动制导系统应该处于被干扰状态"); diff --git a/ThreatSource.Tests/src/Jamming/MillimeterWaveGuidanceJammingTests.cs b/ThreatSource.Tests/src/Jamming/MillimeterWaveGuidanceJammingTests.cs index f3f65fa..97faa4c 100644 --- a/ThreatSource.Tests/src/Jamming/MillimeterWaveGuidanceJammingTests.cs +++ b/ThreatSource.Tests/src/Jamming/MillimeterWaveGuidanceJammingTests.cs @@ -5,6 +5,7 @@ using ThreatSource.Simulation; using ThreatSource.Tests.Simulation; using ThreatSource.Utils; using ThreatSource.Equipment; +using ThreatSource.Missile; namespace ThreatSource.Tests.Jamming { @@ -15,6 +16,7 @@ namespace ThreatSource.Tests.Jamming private TestSimulationAdapter? _testAdapter; private MillimeterWaveGuidanceSystem? _guidanceSystem; private Tank? _target; + private MillimeterWaveTerminalGuidedMissile? _missile; [TestInitialize] public void TestInitialize() @@ -66,9 +68,37 @@ namespace ThreatSource.Tests.Jamming _simulationManager.RegisterEntity("target1", _target); _testAdapter.AddTestEntity("target1", _target); + // 创建并注册导弹实体 + var missileInitialMotion = new MotionParameters + { + Position = new Vector3D(500, 0, 0), + Orientation = new Orientation(0, 0, 0), + InitialSpeed = 100 + }; + + var missileProperties = new MissileProperties + { + Type = MissileType.MillimeterWaveTerminalGuidance, + MaxAcceleration = 100, + MaxSpeed = 300, + Mass = 50 + }; + + _missile = new MillimeterWaveTerminalGuidedMissile( + "missile1", + missileProperties, + missileInitialMotion, + config, + _simulationManager + ); + + _simulationManager.RegisterEntity("missile1", _missile); + _testAdapter.AddTestEntity("missile1", _missile); + // 创建毫米波制导系统 _guidanceSystem = new MillimeterWaveGuidanceSystem( "millimeterWaveGuidance1", + "missile1", 100, // 最大加速度 3.0, // 比例导引系数 config, @@ -94,6 +124,7 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); @@ -101,8 +132,12 @@ namespace ThreatSource.Tests.Jamming System.Diagnostics.Debug.WriteLine($"测试开始 - 初始位置: {initialPosition}, 初始速度: {initialVelocity}"); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建干扰事件 var jammingEvent = new JammingEvent @@ -124,7 +159,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert System.Diagnostics.Debug.WriteLine($"测试结果 - IsJammed: {_guidanceSystem.IsJammed}, HasGuidance: {_guidanceSystem.HasGuidance}"); @@ -138,13 +173,18 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); var initialVelocity = new Vector3D(100, 0, 0); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建角度范围外的干扰事件 var jammingEvent = new JammingEvent @@ -163,7 +203,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert Assert.IsFalse(_guidanceSystem.IsJammed, "制导系统不应该被干扰,因为干扰源不在角度范围内"); @@ -175,13 +215,18 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); var initialVelocity = new Vector3D(100, 0, 0); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建低功率干扰事件 var jammingEvent = new JammingEvent @@ -198,7 +243,7 @@ namespace ThreatSource.Tests.Jamming // Act _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert Assert.IsFalse(_guidanceSystem.IsJammed, "制导系统不应该被干扰,因为干扰功率低于阈值"); @@ -210,13 +255,18 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); var initialVelocity = new Vector3D(100, 0, 0); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建有限时间的干扰事件 var jammingEvent = new JammingEvent @@ -236,7 +286,7 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认已被干扰 Assert.IsTrue(_guidanceSystem.IsJammed, "毫米波制导系统应该处于被干扰状态"); @@ -245,7 +295,7 @@ namespace ThreatSource.Tests.Jamming // 通过多次更新制导系统,让JammingHandler处理时间 for (int i = 0; i < 10; i++) { - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); // 总共更新1秒,超过干扰持续时间 + _guidanceSystem.Update(0.1); // 总共更新1秒,超过干扰持续时间 } // Assert - 确认干扰已清除 @@ -258,13 +308,18 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); var initialVelocity = new Vector3D(100, 0, 0); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建持续干扰事件 var jammingEvent = new JammingEvent @@ -284,14 +339,14 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认已被干扰 Assert.IsTrue(_guidanceSystem.IsJammed, "毫米波制导系统应该处于被干扰状态"); // Act - 手动清除干扰 _guidanceSystem.ClearJamming(jammingEvent.Parameters); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认干扰已清除 Assert.IsFalse(_guidanceSystem.IsJammed, "手动清除后,制导系统应该恢复正常"); @@ -303,13 +358,18 @@ namespace ThreatSource.Tests.Jamming // 确保组件不为空 Assert.IsNotNull(_simulationManager); Assert.IsNotNull(_guidanceSystem); + Assert.IsNotNull(_missile); // Arrange var initialPosition = new Vector3D(500, 0, 0); var initialVelocity = new Vector3D(100, 0, 0); + // 更新导弹位置和速度 + _missile.Position = initialPosition; + _missile.Velocity = initialVelocity; + // 更新一次系统,使其跟踪目标 - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // 创建干扰事件 var jammingEvent = new JammingEvent @@ -329,7 +389,7 @@ namespace ThreatSource.Tests.Jamming // Act - 应用干扰 _simulationManager.PublishEvent(jammingEvent); - _guidanceSystem.Update(0.1, initialPosition, initialVelocity); + _guidanceSystem.Update(0.1); // Assert - 确认系统切换到搜索模式 Assert.IsTrue(_guidanceSystem.IsJammed, "毫米波制导系统应该处于被干扰状态"); diff --git a/ThreatSource/src/Guidance/BaseGuidanceSystem.cs b/ThreatSource/src/Guidance/BaseGuidanceSystem.cs index 8b1ad47..3d5f9d1 100644 --- a/ThreatSource/src/Guidance/BaseGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/BaseGuidanceSystem.cs @@ -1,9 +1,10 @@ -using System; using ThreatSource.Utils; using ThreatSource.Simulation; using ThreatSource.Jammable; using System.Diagnostics; using ThreatSource.Jammer; +using ThreatSource.Missile; + namespace ThreatSource.Guidance { /// @@ -53,7 +54,7 @@ namespace ThreatSource.Guidance /// 记录所属导弹的ID /// 用于事件发布和状态关联 /// - public string? ParentId { get; set; } + public string MissileId { get; set; } /// /// 获取或设置是否有有效的制导信息 @@ -98,6 +99,7 @@ namespace ThreatSource.Guidance /// 初始化基础制导系统的新实例 /// /// 制导系统ID + /// 导弹ID /// 最大加速度,单位:米/平方秒 /// 比例导引系数 /// 仿真管理器实例 @@ -109,9 +111,17 @@ namespace ThreatSource.Guidance /// - 配置制导参数 /// - 初始化干扰处理 /// - public BaseGuidanceSystem(string id, double maxAcceleration, double proportionalNavigationCoefficient, ISimulationManager simulationManager) + public BaseGuidanceSystem(string id, string missileId, double maxAcceleration, double proportionalNavigationCoefficient, ISimulationManager simulationManager) : base(id, new MotionParameters(), simulationManager) { + MissileId = missileId; + if (SimulationManager.GetEntityById(MissileId) is BaseMissile missile) + { + Position = missile.Position; + Orientation = missile.Orientation; + Velocity = missile.Velocity; + } + HasGuidance = false; GuidanceAcceleration = Vector3D.Zero; MaxAcceleration = maxAcceleration; @@ -161,8 +171,7 @@ namespace ThreatSource.Guidance } HasGuidance = false; // 停用时失去制导 GuidanceAcceleration = Vector3D.Zero; - // 调用 SimulationElement 的基类 Deactivate (如果存在) - // base.Deactivate(); // SimulationElement 似乎没有公开的 Deactivate + base.Deactivate(); } /// @@ -178,14 +187,14 @@ namespace ThreatSource.Guidance /// - 更新干扰状态 /// - 准备制导计算 /// - public virtual void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity) - { - Position = missilePosition; - Velocity = missileVelocity; + // public virtual void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity) + // { + // Position = missilePosition; + // Velocity = missileVelocity; - // 更新干扰状态 - _jammingComponent.UpdateJammingStatus(deltaTime); - } + // // 更新干扰状态 + // _jammingComponent.UpdateJammingStatus(deltaTime); + // } /// /// 更新制导系统状态 @@ -193,13 +202,17 @@ namespace ThreatSource.Guidance /// 时间步长,单位:秒 /// /// 实现 SimulationElement 的抽象方法 - /// 在此方法中不执行实际操作,制导系统通过 Update(deltaTime, position, velocity) 更新 /// public override void Update(double deltaTime) { - // 警告:制导系统不应直接由仿真系统调用 - Trace.WriteLine("警告:BasicGuidanceSystem的Update(deltaTime)方法被直接调用,这可能是一个错误。"); - // 制导系统应通过Update(deltaTime, position, velocity)方法更新 + if (SimulationManager.GetEntityById(MissileId) is BaseMissile missile) + { + Position = missile.Position; + Orientation = missile.Orientation; + Velocity = missile.Velocity; + } + // 更新干扰状态 + _jammingComponent.UpdateJammingStatus(deltaTime); } /// @@ -236,9 +249,9 @@ namespace ThreatSource.Guidance statusInfo.ExtendedProperties["ProportionalNavigationCoefficient"] = ProportionalNavigationCoefficient; // 如果有父实体,添加父实体ID - if (!string.IsNullOrEmpty(ParentId)) + if (!string.IsNullOrEmpty(MissileId)) { - statusInfo.ExtendedProperties["ParentId"] = ParentId; + statusInfo.ExtendedProperties["ParentId"] = MissileId; } return statusInfo; diff --git a/ThreatSource/src/Guidance/IGuidanceSystem.cs b/ThreatSource/src/Guidance/IGuidanceSystem.cs index 711c79b..4859822 100644 --- a/ThreatSource/src/Guidance/IGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/IGuidanceSystem.cs @@ -37,7 +37,7 @@ namespace ThreatSource.Guidance /// - 更新制导状态 /// - 生成制导指令 /// - void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity); + //void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity); /// /// 获取制导加速度指令 diff --git a/ThreatSource/src/Guidance/InfraredCommandGuidanceSystem.cs b/ThreatSource/src/Guidance/InfraredCommandGuidanceSystem.cs index 4c73f86..bdf2642 100644 --- a/ThreatSource/src/Guidance/InfraredCommandGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/InfraredCommandGuidanceSystem.cs @@ -87,6 +87,7 @@ namespace ThreatSource.Guidance /// 初始化红外指令导引系统的新实例 /// /// 系统标识 + /// 导弹ID /// 红外指令导引系统配置 /// 最大加速度,单位:米/平方秒 /// 制导系数 @@ -97,8 +98,8 @@ namespace ThreatSource.Guidance /// - 初始化向量记录 /// - 清零转向速率 /// - public InfraredCommandGuidanceSystem(string id, InfraredCommandGuidanceConfig guidanceConfig, double maxAcceleration, double guidanceCoefficient, ISimulationManager simulationManager) - : base(id, maxAcceleration, guidanceCoefficient, simulationManager) + public InfraredCommandGuidanceSystem(string id, string missileId, InfraredCommandGuidanceConfig guidanceConfig, double maxAcceleration, double guidanceCoefficient, ISimulationManager simulationManager) + : base(id, missileId, maxAcceleration, guidanceCoefficient, simulationManager) { turnRate = 0; InitializeJamming(guidanceConfig.JammingResistanceThreshold, SupportedJammingTypes, SupportedBlockingJammingTypes); @@ -108,16 +109,14 @@ namespace ThreatSource.Guidance /// 更新制导系统的状态和计算结果 /// /// 自上次更新以来的时间间隔,单位:秒 - /// 导弹当前位置,单位:米 - /// 导弹当前速度,单位:米/秒 /// /// 更新过程: /// - 更新基类状态 /// - 计算制导加速度 /// - public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity) + public override void Update(double deltaTime) { - base.Update(deltaTime, missilePosition, missileVelocity); + base.Update(deltaTime); if (!IsHardJammed) { if (HasGuidance) diff --git a/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs b/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs index a533e8b..1107039 100644 --- a/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs @@ -112,6 +112,7 @@ namespace ThreatSource.Guidance /// 初始化红外成像制导系统的新实例 /// /// 系统标识 + /// 导弹ID /// 红外成像制导系统配置 /// 要攻击的目标类型 /// 最大加速度,单位:米/平方秒 @@ -126,13 +127,14 @@ namespace ThreatSource.Guidance /// public InfraredImagingGuidanceSystem( string id, + string missileId, InfraredImagingGuidanceConfig guidanceConfig, EquipmentType targetType, double maxAcceleration, double proportionalNavigationCoefficient, ISimulationManager simulationManager ) - : base(id, maxAcceleration, proportionalNavigationCoefficient, simulationManager) + : base(id, missileId, maxAcceleration, proportionalNavigationCoefficient, simulationManager) { this.targetType = targetType; config = guidanceConfig; @@ -174,25 +176,24 @@ namespace ThreatSource.Guidance { if (SimulationManager.GetEntityById(parameters.JammerId) is SmokeGrenade smokeGrenade) { - // TODO:这里需要根据目标位置计算烟幕衰减,没有发现目标时,要根据当前方向,用一个假定目标位置来计算烟幕衰减 if (lastTargetPosition != null) { // 计算烟幕衰减 (这里存储衰减系数,1.0表示无衰减) SmokeAttenuation = smokeGrenade.GetSmokeTransmittanceOnLine(Position, lastTargetPosition, config.Wavelength); - Console.WriteLine($"[烟幕干扰应用 IR] 视线透过率/衰减系数: {SmokeAttenuation:F3}"); + Console.WriteLine($"[烟幕干扰IR] 视线透过率: {SmokeAttenuation:F3}"); } else { - // 目标尚未有效跟踪,无法计算特定视线衰减,假定一个默认值 - SmokeAttenuation = 0.4; - Console.WriteLine("[烟幕干扰应用 IR] 没有发现目标位置,暂不计算烟幕衰减。"); + // 目标尚未有效跟踪,计算视线方向衰减 + var intersection = MotionAlgorithm.CalculateIntersectionWithGround(Position, Orientation.ToVector(), 0); + Console.WriteLine($"[###烟幕干扰IR] 计算视线方向衰减,交点: {intersection}"); + if (intersection != null) + { + SmokeAttenuation = smokeGrenade.GetSmokeTransmittanceOnLine(Position, intersection, config.Wavelength); + Console.WriteLine($"[烟幕干扰IR] 没有发现目标位置,只计算视线透过率: {SmokeAttenuation:F3}"); + } } } - else - { - // 未找到烟幕弹,假定无衰减 - SmokeAttenuation = 1.0; - } } } @@ -211,8 +212,8 @@ namespace ThreatSource.Guidance } else if (parameters.Type == JammingType.SmokeGrenade) { - SmokeAttenuation = 1.0; // Reset smoke attenuation - Debug.WriteLine("[烟幕干扰清除 IR]"); + SmokeAttenuation = 1.0; + Debug.WriteLine("[烟幕干扰清除 IR]"); } } @@ -243,8 +244,6 @@ namespace ThreatSource.Guidance /// 更新引导系统的状态和计算结果 /// /// 自上次更新以来的时间间隔,单位:秒 - /// 导弹当前位置,单位:米 - /// 导弹当前速度,单位:米/秒 /// /// 更新过程: /// - 探测目标位置 @@ -252,12 +251,12 @@ namespace ThreatSource.Guidance /// - 生成制导指令 /// - 限制最大加速度 /// - public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity) + public override void Update(double deltaTime) { - base.Update(deltaTime, missilePosition, missileVelocity); + base.Update(deltaTime); if (!IsHardJammed) { - if (TryDetectAndIdentifyTarget(missilePosition, missileVelocity, deltaTime, out Vector3D currentTargetPosition)) + if (TryDetectAndIdentifyTarget(Position, Velocity, deltaTime, out Vector3D currentTargetPosition)) { targetLostTimer = 0; // 重置丢失计时器 Vector3D? currentTargetVelocity = null; // Initialize as nullable @@ -274,8 +273,8 @@ namespace ThreatSource.Guidance // Use proportional navigation, provide default if velocity is null GuidanceAcceleration = MotionAlgorithm.CalculateProportionalNavigation( ProportionalNavigationCoefficient, - missilePosition, - missileVelocity, + Position, + Velocity, currentTargetPosition, // Non-nullable from out parameter currentTargetVelocity ?? Vector3D.Zero // Provide default if null ); diff --git a/ThreatSource/src/Guidance/LaserBeamRiderGuidanceSystem.cs b/ThreatSource/src/Guidance/LaserBeamRiderGuidanceSystem.cs index 2ecacae..ec8859f 100644 --- a/ThreatSource/src/Guidance/LaserBeamRiderGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/LaserBeamRiderGuidanceSystem.cs @@ -134,6 +134,7 @@ namespace ThreatSource.Guidance /// 初始化激光驾束制导系统的新实例 /// /// 制导系统ID + /// 导弹ID /// 最大加速度,单位:米/平方秒 /// 制导系数 /// 激光编码配置,可选 @@ -147,12 +148,13 @@ namespace ThreatSource.Guidance /// public LaserBeamRiderGuidanceSystem( string id, + string missileId, double maxAcceleration, double guidanceCoefficient, LaserCodeConfig? laserCodeConfig, LaserBeamRiderGuidanceSystemConfig guidanceConfig, ISimulationManager simulationManager) - : base(id, maxAcceleration, guidanceCoefficient, simulationManager) + : base(id, missileId, maxAcceleration, guidanceCoefficient, simulationManager) { config = guidanceConfig; LaserPower = 0; @@ -284,7 +286,7 @@ namespace ThreatSource.Guidance { var mismatchEvent = new LaserCodeMismatchEvent { - MissileId = ParentId, + MissileId = MissileId, DesignatorId = designatorId, ExpectedCodeConfig = InternalLaserCodeConfig, ReceivedCodeConfig = receivedCodeConfig @@ -337,8 +339,6 @@ namespace ThreatSource.Guidance /// 更新制导系统的状态和计算结果 /// /// 时间步长,单位:秒 - /// 导弹位置,单位:米 - /// 导弹速度,单位:米/秒 /// /// 更新过程: /// - 检查激光照射状态 @@ -346,9 +346,9 @@ namespace ThreatSource.Guidance /// - 计算制导指令 /// - 更新输出参数 /// - public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity) + public override void Update(double deltaTime) { - base.Update(deltaTime, missilePosition, missileVelocity); + base.Update(deltaTime); if (!IsJammed) { if (LaserIlluminationOn) diff --git a/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs b/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs index 42adafd..c5d2fc7 100644 --- a/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/LaserSemiActiveGuidanceSystem.cs @@ -137,6 +137,7 @@ namespace ThreatSource.Guidance /// 初始化激光半主动制导系统的新实例 /// /// 制导系统ID + /// 导弹ID /// 最大加速度,单位:米/平方秒 /// 制导系数 /// 激光编码配置 @@ -152,12 +153,13 @@ namespace ThreatSource.Guidance /// public LaserSemiActiveGuidanceSystem( string id, + string missileId, double maxAcceleration, double guidanceCoefficient, LaserCodeConfig laserCodeConfig, LaserSemiActiveGuidanceConfig guidanceConfig, ISimulationManager simulationManager) - : base(id, maxAcceleration, guidanceCoefficient, simulationManager) + : base(id, missileId, maxAcceleration, guidanceCoefficient, simulationManager) { config = guidanceConfig; @@ -386,11 +388,9 @@ namespace ThreatSource.Guidance /// 更新制导系统的状态和计算结果 /// /// 时间步长,单位:秒 - /// 导弹位置,单位:米 - /// 导弹速度,单位:米/秒 - public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity) + public override void Update(double deltaTime) { - base.Update(deltaTime, missilePosition, missileVelocity); + base.Update(deltaTime); // 处理接收到的所有激光信号 ProcessLaserTargets(); @@ -842,7 +842,7 @@ namespace ThreatSource.Guidance { var mismatchEvent = new LaserCodeMismatchEvent { - MissileId = ParentId, + MissileId = MissileId, DesignatorId = designatorId, ExpectedCodeConfig = InternalLaserCodeConfig, ReceivedCodeConfig = receivedCodeConfig diff --git a/ThreatSource/src/Guidance/MillimeterWaveGuidanceSystem.cs b/ThreatSource/src/Guidance/MillimeterWaveGuidanceSystem.cs index 00b7479..657b31a 100644 --- a/ThreatSource/src/Guidance/MillimeterWaveGuidanceSystem.cs +++ b/ThreatSource/src/Guidance/MillimeterWaveGuidanceSystem.cs @@ -135,6 +135,7 @@ namespace ThreatSource.Guidance /// 初始化毫米波制导系统的新实例 /// /// 制导系统ID + /// 导弹ID /// 最大加速度,单位:米/平方秒 /// 制导系数 /// 仿真管理器实例 @@ -149,11 +150,12 @@ namespace ThreatSource.Guidance /// public MillimeterWaveGuidanceSystem( string id, + string missileId, double maxAcceleration, double guidanceCoefficient, MillimeterWaveGuidanceConfig config, ISimulationManager simulationManager) - : base(id, maxAcceleration, guidanceCoefficient, simulationManager) + : base(id, missileId, maxAcceleration, guidanceCoefficient, simulationManager) { this.config = config; InitializeJamming(config.JammingResistanceThreshold, SupportedJammingTypes, SupportedBlockingJammingTypes); @@ -448,8 +450,6 @@ namespace ThreatSource.Guidance /// 更新制导系统的状态 /// /// 自上次更新以来的时间间隔,单位:秒 - /// 导弹当前位置,单位:米 - /// 导弹当前速度,单位:米/秒 /// /// 更新过程: /// - 探测目标位置 @@ -457,9 +457,9 @@ namespace ThreatSource.Guidance /// - 生成制导指令 /// - 限制最大加速度 /// - public override void Update(double deltaTime, Vector3D missilePosition, Vector3D missileVelocity) + public override void Update(double deltaTime) { - base.Update(deltaTime, missilePosition, missileVelocity); // 更新基类状态和干扰状态 + base.Update(deltaTime); // 更新基类状态和干扰状态 // 在执行核心逻辑前检查干扰状态 if (IsJammed) // 使用基类的 IsJammed 状态 @@ -478,7 +478,7 @@ namespace ThreatSource.Guidance // 更新扫描参数 UpdateConicalScan(deltaTime); - if (TryDetectAndTrackTarget(missilePosition, missileVelocity, deltaTime, out Vector3D currentTargetPosition)) + if (TryDetectAndTrackTarget(Position, Velocity, deltaTime, out Vector3D currentTargetPosition)) { targetLostTimer = 0; Vector3D? currentTargetVelocity = null; @@ -492,8 +492,8 @@ namespace ThreatSource.Guidance GuidanceAcceleration = MotionAlgorithm.CalculateProportionalNavigation( ProportionalNavigationCoefficient, - missilePosition, - missileVelocity, + Position, + Velocity, currentTargetPosition, currentTargetVelocity ?? Vector3D.Zero ); diff --git a/ThreatSource/src/Indicator/InfraredTracker.cs b/ThreatSource/src/Indicator/InfraredTracker.cs index c8307a1..a85aebc 100644 --- a/ThreatSource/src/Indicator/InfraredTracker.cs +++ b/ThreatSource/src/Indicator/InfraredTracker.cs @@ -27,11 +27,12 @@ namespace ThreatSource.Indicator /// /// 红外测角仪支持的干扰类型: /// - 红外干扰 + /// - 烟雾干扰 /// public override IEnumerable SupportedJammingTypes => [JammingType.Infrared, JammingType.SmokeGrenade]; /// - /// 获取设备支持的阻塞干扰类型 + /// 定义设备支持的阻塞干扰类型 /// public override IEnumerable SupportedBlockingJammingTypes => [JammingType.Infrared]; @@ -365,7 +366,7 @@ namespace ThreatSource.Indicator // 添加子类特定响应:如果是红外干扰,停止跟踪 if (parameters.Type == JammingType.Infrared) { - Debug.WriteLine($"[InfraredTracker] {Id} 受到红外干扰,停止跟踪。", "Jamming"); + Debug.WriteLine($"[InfraredTracker] {Id} 受到红外干扰,停止跟踪。", "Jamming"); StopTracking(); } } diff --git a/ThreatSource/src/Indicator/LaserBeamRider.cs b/ThreatSource/src/Indicator/LaserBeamRider.cs index f36bd55..27bfacf 100644 --- a/ThreatSource/src/Indicator/LaserBeamRider.cs +++ b/ThreatSource/src/Indicator/LaserBeamRider.cs @@ -24,11 +24,12 @@ namespace ThreatSource.Indicator /// /// 激光驾束仪支持的干扰类型: /// - 激光干扰 + /// - 烟雾干扰 /// public override IEnumerable SupportedJammingTypes => [JammingType.Laser, JammingType.SmokeGrenade]; /// - /// 获取设备支持的阻塞干扰类型 + /// 定义设备支持的阻塞干扰类型 /// public override IEnumerable SupportedBlockingJammingTypes => [JammingType.Laser]; diff --git a/ThreatSource/src/Indicator/LaserDesignator.cs b/ThreatSource/src/Indicator/LaserDesignator.cs index ae4d913..5418cac 100644 --- a/ThreatSource/src/Indicator/LaserDesignator.cs +++ b/ThreatSource/src/Indicator/LaserDesignator.cs @@ -24,11 +24,12 @@ namespace ThreatSource.Indicator /// /// 激光目标指示器支持的干扰类型: /// - 激光干扰 + /// - 烟雾干扰 /// public override IEnumerable SupportedJammingTypes => [JammingType.Laser, JammingType.SmokeGrenade]; /// - /// 获取设备支持的阻塞干扰类型 + /// 定义设备支持的阻塞干扰类型 /// public override IEnumerable SupportedBlockingJammingTypes => [JammingType.Laser]; diff --git a/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs b/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs index 3252983..d5d33b8 100644 --- a/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs +++ b/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs @@ -99,6 +99,7 @@ namespace ThreatSource.Missile guidanceSystem = new InfraredCommandGuidanceSystem( missileId + "_guidance", + missileId, guidanceConfig, properties.MaxAcceleration, properties.ProportionalNavigationCoefficient, @@ -166,7 +167,7 @@ namespace ThreatSource.Missile /// private void UpdateCruiseStage(double deltaTime) { - guidanceSystem.Update(deltaTime, Position, Velocity); + guidanceSystem.Update(deltaTime); GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration(); IsGuidance = guidanceSystem.HasGuidance; } @@ -279,6 +280,7 @@ namespace ThreatSource.Missile /// /// 返回信息包括: /// - 基本状态信息 + /// public override ElementStatusInfo GetStatusInfo() { var statusInfo = base.GetStatusInfo(); diff --git a/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs b/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs index e3d7b6c..e29cd3e 100644 --- a/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs +++ b/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs @@ -100,6 +100,7 @@ namespace ThreatSource.Missile { guidanceSystem = new InfraredImagingGuidanceSystem( missileId + "_guidance", + missileId, guidanceConfig, targetType, properties.MaxAcceleration, @@ -196,7 +197,7 @@ namespace ThreatSource.Missile /// private void UpdateTerminalSearchStage(double deltaTime) { - guidanceSystem.Update(deltaTime, Position, Velocity); + guidanceSystem.Update(deltaTime); GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration(); IsGuidance = guidanceSystem.HasGuidance; @@ -220,7 +221,7 @@ namespace ThreatSource.Missile /// private void UpdateTerminalTrackStage(double deltaTime) { - guidanceSystem.Update(deltaTime, Position, Velocity); + guidanceSystem.Update(deltaTime); GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration(); IsGuidance = guidanceSystem.HasGuidance; @@ -248,7 +249,7 @@ namespace ThreatSource.Missile /// private void UpdateTerminalLockStage(double deltaTime) { - guidanceSystem.Update(deltaTime, Position, Velocity); + guidanceSystem.Update(deltaTime); GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration(); IsGuidance = guidanceSystem.HasGuidance; if (!guidanceSystem.HasTarget) diff --git a/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs b/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs index 854503b..fd8935f 100644 --- a/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs +++ b/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs @@ -79,6 +79,7 @@ namespace ThreatSource.Missile { guidanceSystem = new LaserBeamRiderGuidanceSystem( missileId + "_guidance", + missileId, properties.MaxAcceleration, properties.ProportionalNavigationCoefficient, laserCodeConfig, @@ -182,7 +183,7 @@ namespace ThreatSource.Missile private void UpdateCruiseStage(double deltaTime) { // 巡航阶段 - guidanceSystem.Update(deltaTime, Position, Velocity); + guidanceSystem.Update(deltaTime); GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration(); IsGuidance = guidanceSystem.HasGuidance; } diff --git a/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs b/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs index 2692163..a8ffe53 100644 --- a/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs +++ b/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs @@ -97,14 +97,13 @@ namespace ThreatSource.Missile { guidanceSystem = new LaserSemiActiveGuidanceSystem( missileId + "_guidance", + missileId, properties.MaxAcceleration, properties.ProportionalNavigationCoefficient, laserCodeConfig, guidanceConfig, manager); - // 设置制导系统的ParentId属性 - guidanceSystem.ParentId = missileId; LaserCodeConfig = laserCodeConfig; } @@ -212,7 +211,7 @@ namespace ThreatSource.Missile private void UpdateCruiseStage(double deltaTime) { // 更新制导系统 - guidanceSystem.Update(deltaTime, Position, Velocity); + guidanceSystem.Update(deltaTime); // 获取制导加速度 GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration(); // 设置制导状态 diff --git a/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs b/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs index 79a11ca..b11e541 100644 --- a/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs +++ b/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs @@ -93,6 +93,7 @@ namespace ThreatSource.Missile { guidanceSystem = new MillimeterWaveGuidanceSystem( missileId + "_guidance", + missileId, properties.MaxAcceleration, properties.ProportionalNavigationCoefficient, guidanceConfig, @@ -179,7 +180,7 @@ namespace ThreatSource.Missile /// private void UpdateTerminalStage(double deltaTime) { - guidanceSystem.Update(deltaTime, Position, Velocity); + guidanceSystem.Update(deltaTime); GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration(); IsGuidance = guidanceSystem.HasGuidance; } diff --git a/ThreatSource/src/Sensor/InfraredDetector.cs b/ThreatSource/src/Sensor/InfraredDetector.cs index 8e67ea5..ba20a9a 100644 --- a/ThreatSource/src/Sensor/InfraredDetector.cs +++ b/ThreatSource/src/Sensor/InfraredDetector.cs @@ -30,11 +30,12 @@ namespace ThreatSource.Sensor /// /// 红外探测器支持的干扰类型: /// - 红外干扰 + /// - 烟雾干扰 /// - public override IEnumerable SupportedJammingTypes => [JammingType.Infrared]; + public override IEnumerable SupportedJammingTypes => [JammingType.Infrared, JammingType.SmokeGrenade]; /// - /// 获取设备支持的阻塞干扰类型 + /// 定义设备支持的阻塞干扰类型 /// public override IEnumerable SupportedBlockingJammingTypes => [JammingType.Infrared]; @@ -64,7 +65,12 @@ namespace ThreatSource.Sensor /// 存储探测器的测量结果 /// 包含温度和目标探测状态 /// - private InfraredSensorData sensorData; + private readonly InfraredSensorData sensorData; + + /// + /// 烟幕衰减系数 + /// + private double SmokeAttenuation = 1.0; /// /// 初始化红外探测器的新实例 @@ -140,7 +146,7 @@ namespace ThreatSource.Sensor if (result.Angle != null && result.Target != null) { sensorData.TargetAngle = result.Angle; - return result.Target.Properties.InfraredRadiationIntensity; + return SmokeAttenuation * result.Target.Properties.InfraredRadiationIntensity; } sensorData.TargetAngle = null; return 0; @@ -211,14 +217,25 @@ namespace ThreatSource.Sensor protected override void HandleJammingApplied(JammingParameters parameters) { base.HandleJammingApplied(parameters); - // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 - // 这里只处理探测器特定的响应 - if (parameters.Type == JammingType.Infrared) + if (parameters.Type == JammingType.Infrared) { - // 不需要再次检查波长,因为 ShouldHandleJamming 已经做过 Debug.WriteLine($"[InfraredDetector] 红外探测器受到有效干扰,功率:{parameters.Power}瓦特", "Jamming"); sensorData.IsValid = false; - // IsTargetDetected 会在下一次 UpdateSensor 时根据干扰状态决定,这里不直接修改 + sensorData.IsTargetDetected = false; + } + else if (parameters.Type == JammingType.SmokeGrenade) + { + if (SimulationManager.GetEntityById(parameters.JammerId) is SmokeGrenade smokeGrenade) + { + var intersection = MotionAlgorithm.CalculateIntersectionWithGround(Position, Orientation.ToVector(), 0); + if (intersection != null) + { + // 计算烟幕衰减 (这里存储衰减系数,1.0表示无衰减) + var wavelength = config.Band == InfraredBand.Long ? 10 : 4; + SmokeAttenuation = smokeGrenade.GetSmokeTransmittanceOnLine(Position, intersection, wavelength); + Console.WriteLine($"[InfraredDetector] 烟幕影响,视线透过率: {SmokeAttenuation:F3}"); + } + } } } @@ -228,8 +245,6 @@ namespace ThreatSource.Sensor protected override void HandleJammingCleared(JammingParameters parameters) { base.HandleJammingCleared(parameters); - // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 - // 这里只处理探测器特定的响应 if (parameters.Type == JammingType.Infrared) { Debug.WriteLine("[InfraredDetector] 红外探测器干扰已清除", "Jamming"); @@ -243,6 +258,11 @@ namespace ThreatSource.Sensor sensorData.IsValid = false; // 如果仍被干扰,保持无效 } } + else if (parameters.Type == JammingType.SmokeGrenade) + { + SmokeAttenuation = 1.0; + Debug.WriteLine("[InfraredDetector] 烟幕干扰清除"); + } } } } \ No newline at end of file diff --git a/ThreatSource/src/Sensor/LaserRangefinder.cs b/ThreatSource/src/Sensor/LaserRangefinder.cs index d4c7d18..30d516e 100644 --- a/ThreatSource/src/Sensor/LaserRangefinder.cs +++ b/ThreatSource/src/Sensor/LaserRangefinder.cs @@ -170,11 +170,8 @@ namespace ThreatSource.Sensor protected override void HandleJammingApplied(JammingParameters parameters) { base.HandleJammingApplied(parameters); - // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 - // 这里只处理测距仪特定的响应 if (parameters.Type == JammingType.Laser) { - // 不需要再次检查波长,因为 ShouldHandleJamming 已经做过 Debug.WriteLine($"[LaserRangefinder] 激光测距仪受到有效干扰,功率:{parameters.Power}瓦特", "Jamming"); sensorData.IsValid = false; sensorData.Distance = 0; // 在干扰状态下将距离设置为0 @@ -187,8 +184,6 @@ namespace ThreatSource.Sensor protected override void HandleJammingCleared(JammingParameters parameters) { base.HandleJammingCleared(parameters); - // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 - // 这里只处理测距仪特定的响应 if (parameters.Type == JammingType.Laser) { Debug.WriteLine("[LaserRangefinder] 激光测距仪干扰已清除", "Jamming"); diff --git a/ThreatSource/src/Sensor/MillimeterWaveAltimeter.cs b/ThreatSource/src/Sensor/MillimeterWaveAltimeter.cs index 2a46846..bdcb773 100644 --- a/ThreatSource/src/Sensor/MillimeterWaveAltimeter.cs +++ b/ThreatSource/src/Sensor/MillimeterWaveAltimeter.cs @@ -34,7 +34,7 @@ namespace ThreatSource.Sensor public override IEnumerable SupportedJammingTypes => [JammingType.MillimeterWave]; /// - /// 获取设备支持的阻塞干扰类型 + /// 定义设备支持的阻塞干扰类型 /// public override IEnumerable SupportedBlockingJammingTypes => [JammingType.MillimeterWave]; @@ -181,11 +181,8 @@ namespace ThreatSource.Sensor protected override void HandleJammingApplied(JammingParameters parameters) { base.HandleJammingApplied(parameters); - // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 - // 这里只处理测高雷达特定的响应 if (parameters.Type == JammingType.MillimeterWave) { - // 不需要再次检查波长,因为 ShouldHandleJamming 已经做过 Debug.WriteLine($"[MillimeterWaveAltimeter] 毫米波测高雷达受到有效干扰,功率:{parameters.Power}瓦特", "Jamming"); sensorData.IsValid = false; sensorData.Altitude = 0; // 被干扰时将高度值设为0 @@ -198,8 +195,6 @@ namespace ThreatSource.Sensor protected override void HandleJammingCleared(JammingParameters parameters) { base.HandleJammingCleared(parameters); - // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 - // 这里只处理测高雷达特定的响应 if (parameters.Type == JammingType.MillimeterWave) { Debug.WriteLine("[MillimeterWaveAltimeter] 毫米波测高雷达干扰已清除", "Jamming"); @@ -211,7 +206,6 @@ namespace ThreatSource.Sensor } else { - // 如果仍有其他干扰(理论上不可能,因为只支持MMW),保持无效 sensorData.IsValid = false; } } diff --git a/ThreatSource/src/Sensor/MillimeterWaveRadiometer.cs b/ThreatSource/src/Sensor/MillimeterWaveRadiometer.cs index cafb8fc..a3d7ff5 100644 --- a/ThreatSource/src/Sensor/MillimeterWaveRadiometer.cs +++ b/ThreatSource/src/Sensor/MillimeterWaveRadiometer.cs @@ -34,7 +34,7 @@ namespace ThreatSource.Sensor public override IEnumerable SupportedJammingTypes => [JammingType.MillimeterWave]; /// - /// 获取设备支持的阻塞干扰类型 + /// 定义设备支持的阻塞干扰类型 /// public override IEnumerable SupportedBlockingJammingTypes => [JammingType.MillimeterWave]; @@ -246,11 +246,8 @@ namespace ThreatSource.Sensor protected override void HandleJammingApplied(JammingParameters parameters) { base.HandleJammingApplied(parameters); - // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 - // 这里只处理辐射计特定的响应 if (parameters.Type == JammingType.MillimeterWave) { - // 不需要再次检查波长,因为 ShouldHandleJamming 已经做过 Debug.WriteLine($"[MillimeterWaveRadiometer] 毫米波辐射计受到有效干扰,功率:{parameters.Power}瓦特", "Jamming"); sensorData.IsValid = false; sensorData.IsTargetDetected = false; // 干扰时无法探测目标 @@ -263,16 +260,13 @@ namespace ThreatSource.Sensor protected override void HandleJammingCleared(JammingParameters parameters) { base.HandleJammingCleared(parameters); - // 基类 JammableComponent 和 Sensor 已经处理了 IsJammed 状态 - // 这里只处理辐射计特定的响应 - if (parameters.Type == JammingType.MillimeterWave) + if (parameters.Type == JammingType.MillimeterWave) { Debug.WriteLine("[MillimeterWaveRadiometer] 毫米波辐射计干扰已清除", "Jamming"); // 只有在整体未被干扰时才恢复有效状态 if (!IsJammed) { sensorData.IsValid = true; - // 不需要重置 IsTargetDetected,UpdateSensor 会处理 } else { diff --git a/ThreatSource/src/Utils/Common.cs b/ThreatSource/src/Utils/Common.cs index 35bcb09..9db13f6 100644 --- a/ThreatSource/src/Utils/Common.cs +++ b/ThreatSource/src/Utils/Common.cs @@ -491,7 +491,7 @@ namespace ThreatSource.Utils public enum InfraredBand { /// - /// 远红外波段,6-15um + /// 远红外波段,8-12um /// Long, /// diff --git a/ThreatSource/src/Utils/MotionAlgorithm.cs b/ThreatSource/src/Utils/MotionAlgorithm.cs index d1f3423..5c5d35f 100644 --- a/ThreatSource/src/Utils/MotionAlgorithm.cs +++ b/ThreatSource/src/Utils/MotionAlgorithm.cs @@ -308,5 +308,37 @@ namespace ThreatSource.Utils return new Vector3D(windX, 0, windZ); } + + /// + /// 计算空中的观察者向下视线方向与地面相交点 + /// + /// 观察者位置 + /// 目标方向 + /// 地面高度 + /// 观察者视线方向与地面相交点,如果视线不与地面相交则返回null + public static Vector3D? CalculateIntersectionWithGround(Vector3D observerPosition, Vector3D targetDirection, double groundLevel) + { + // 检查观察者是否在空中 + if (observerPosition.Y <= groundLevel) + { + return null; // 观察者不在空中,无法计算交点 + } + + // 视线方向单位向量 + Vector3D direction = targetDirection.Normalize(); + + // 检查视线是否向下 + if (direction.Y >= 0) + { + return null; // 视线不向下,不会与地面相交 + } + + // 计算视线方向与地面相交点的参数t + double t = (groundLevel - observerPosition.Y) / direction.Y; + + // 由于direction.Y < 0且observerPosition.Y > groundLevel,t应该为正值 + // 计算并返回相交点坐标 + return observerPosition + direction * t; + } } } diff --git a/VERSION b/VERSION index f21e5a1..645604f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.13 \ No newline at end of file +0.2.14 \ No newline at end of file diff --git a/tools/ComprehensiveMissileSimulator.cs b/tools/ComprehensiveMissileSimulator.cs index 88a7cd6..96bebfc 100644 --- a/tools/ComprehensiveMissileSimulator.cs +++ b/tools/ComprehensiveMissileSimulator.cs @@ -189,9 +189,9 @@ namespace ThreatSource.Tools.MissileSimulation { var motionParameters = new MotionParameters { - Position = new Vector3D(0, 1.2, 20), + Position = new Vector3D(0, 1.2, 0), Orientation = new Orientation(Math.PI/2, 0.0, 0.0), - InitialSpeed = 1.0 + InitialSpeed = 0.0 }; string targetId = "Tank_1"; var target = _threatSourceFactory.CreateTarget(targetId, "mbt_001", motionParameters); @@ -348,8 +348,8 @@ namespace ThreatSource.Tools.MissileSimulation { var motionParameters = new MotionParameters { - Position = new Vector3D(2000, 1, 30), - Orientation = new Orientation(Math.PI, 0.02, 0), + Position = new Vector3D(2000, 10, 0), + Orientation = new Orientation(Math.PI, -0.001, 0), InitialSpeed = 300 }; string missileId = "ITGM_1";