diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1685e51..3a06429 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,10 @@
- 毫米波跟踪和锁定阶段采用脉冲多普勒制导
- 命中概率和系统随机噪声
+## [1.1.21] - 2025-05-24
+- 增加了升力加速度的计算
+- 将发射、巡航、制导三个阶段汇聚到导弹基类中
+
## [1.1.20] - 2025-05-19
- 增加了SwerlingRCS回波模型
- 在毫米波制导中使用SwerlingRCS回波模型获取目标RCS
diff --git a/ThreatSource/data/missiles/composite/cg_001.toml b/ThreatSource/data/missiles/composite/cg_001.toml
index 5ef26e7..5ad1c49 100644
--- a/ThreatSource/data/missiles/composite/cg_001.toml
+++ b/ThreatSource/data/missiles/composite/cg_001.toml
@@ -14,7 +14,7 @@ MaxAcceleration = 100.0
ProportionalNavigationCoefficient = 4.0
LaunchAcceleration = 100.0
MaxEngineBurnTime = 2.5
-CruiseTime = 4.0
+CruiseTime = 3.5
Mass = 25.0
ExplosionRadius = 5.0
HitProbability = 0.9
@@ -34,7 +34,7 @@ ActivationTrigger = "OnLaunch" # 激活触发器:OnLaunch, AfterFligh
ActivationValue = 0.0 # 触发器关联值 (例如:飞行时间秒数,距离米数)
Priority = 0 # 优先级 (例如:0为最高)
MaxTimeToAcquireGuidanceSeconds = 5.0 # 获取制导的最大时间
-MinTimeWithGuidanceBeforeSwitchSeconds = 0.2 # 稳定跟踪0.2秒后切换(因为毫米波跟踪不稳定)
+MinTimeWithGuidanceBeforeSwitchSeconds = 0.0 # 稳定跟踪0.1秒后切换(因为毫米波跟踪不稳定)
ContinueChainOnFailure = true # 失败后继续尝试下一个
# 第二个制导阶段:红外成像末制导
@@ -65,7 +65,7 @@ Wavelength = 3.0 # 波长 (微米)
[MillimeterWaveGuidanceConfig]
MaxDetectionRange = 5000.0 # 最大探测距离 (米)
-FieldOfViewAngle = 45.0 # 视场角 (度)
+FieldOfViewAngle = 15.0 # 视场角 (度)
TargetRecognitionProbability = 0.95 # 目标识别概率
WaveFrequency = 9.4e10 # 波频率 (赫兹)
PulseDuration = 1.0e-6 # 脉冲持续时间 (秒)
diff --git a/ThreatSource/data/missiles/composite/cg_002.toml b/ThreatSource/data/missiles/composite/cg_002.toml
index 88ca6d7..e8f33ef 100644
--- a/ThreatSource/data/missiles/composite/cg_002.toml
+++ b/ThreatSource/data/missiles/composite/cg_002.toml
@@ -14,7 +14,7 @@ MaxAcceleration = 100.0
ProportionalNavigationCoefficient = 4.0
LaunchAcceleration = 100.0
MaxEngineBurnTime = 2.5
-CruiseTime = 4.0
+CruiseTime = 3.5
Mass = 25.0
ExplosionRadius = 5.0
HitProbability = 0.9
@@ -34,7 +34,7 @@ ActivationTrigger = "OnLaunch" # 激活触发器:OnLaunch, AfterFligh
ActivationValue = 0.0 # 触发器关联值 (例如:飞行时间秒数,距离米数)
Priority = 0 # 优先级 (例如:0为最高)
MaxTimeToAcquireGuidanceSeconds = 5.0 # 获取制导的最大时间
-MinTimeWithGuidanceBeforeSwitchSeconds = 0.2 # 稳定跟踪0.2秒后切换(因为毫米波跟踪不稳定)
+MinTimeWithGuidanceBeforeSwitchSeconds = 0.3 # 稳定跟踪0.3秒后切换
ContinueChainOnFailure = true # 失败后继续尝试下一个
# 第二个制导阶段:红外成像末制导
diff --git a/ThreatSource/data/missiles/ir_command/irc_001.toml b/ThreatSource/data/missiles/ir_command/irc_001.toml
index 0cd0ea8..ab048c9 100644
--- a/ThreatSource/data/missiles/ir_command/irc_001.toml
+++ b/ThreatSource/data/missiles/ir_command/irc_001.toml
@@ -12,9 +12,9 @@ MaxFlightTime = 60.0 # 最大飞行时间 (秒)
MaxFlightDistance = 5000.0 # 最大飞行距离 (米)
MaxAcceleration = 100.0 # 最大加速度 (米/秒^2)
ProportionalNavigationCoefficient = 4.0 # 比例导引系数
-LaunchAcceleration = 100.0 # 发射加速度 (米/秒^2)
-MaxEngineBurnTime = 3.0 # 最大发动机燃烧时间 (秒)
-CruiseTime = 5.0 # 巡航时间 (秒)
+LaunchAcceleration = 150.0 # 发射加速度 (米/秒^2)
+MaxEngineBurnTime = 2.0 # 最大发动机燃烧时间 (秒)
+CruiseTime = 2.0 # 巡航时间 (秒)
Mass = 23.5 # 质量 (千克)
ExplosionRadius = 5.0 # 爆炸半径 (米)
HitProbability = 0.9 # 命中概率
diff --git a/ThreatSource/data/missiles/ir_imaging/itg_001.toml b/ThreatSource/data/missiles/ir_imaging/itg_001.toml
index 009cc69..9d4c861 100644
--- a/ThreatSource/data/missiles/ir_imaging/itg_001.toml
+++ b/ThreatSource/data/missiles/ir_imaging/itg_001.toml
@@ -14,7 +14,7 @@ MaxAcceleration = 100.0
ProportionalNavigationCoefficient = 4.0
LaunchAcceleration = 100.0
MaxEngineBurnTime = 2.5
-CruiseTime = 4.0
+CruiseTime = 3.0
Mass = 25.0
ExplosionRadius = 5.0
HitProbability = 0.9
diff --git a/ThreatSource/data/missiles/laser_beam_rider/hj10.toml b/ThreatSource/data/missiles/laser_beam_rider/hj10.toml
index fa5c728..5384760 100644
--- a/ThreatSource/data/missiles/laser_beam_rider/hj10.toml
+++ b/ThreatSource/data/missiles/laser_beam_rider/hj10.toml
@@ -14,7 +14,7 @@ MaxAcceleration = 100.0 # 最大加速度 (米/秒^2)
ProportionalNavigationCoefficient = 3.0 # 比例导引系数
LaunchAcceleration = 100.0 # 发射加速度 (米/秒^2)
MaxEngineBurnTime = 3.0 # 最大发动机燃烧时间 (秒)
-CruiseTime = 5.0 # 巡航时间 (秒)
+CruiseTime = 0.0 # 巡航时间 (秒)
Mass = 24.5 # 质量 (千克)
ExplosionRadius = 5.0 # 爆炸半径 (米)
HitProbability = 0.9 # 命中概率
diff --git a/ThreatSource/data/missiles/laser_semi_active/lsgm_001.toml b/ThreatSource/data/missiles/laser_semi_active/lsgm_001.toml
index d45a8d9..c3df2f0 100644
--- a/ThreatSource/data/missiles/laser_semi_active/lsgm_001.toml
+++ b/ThreatSource/data/missiles/laser_semi_active/lsgm_001.toml
@@ -12,10 +12,10 @@ MaxSpeed = 800.0 # 最大速度 (m/s)
MaxFlightTime = 60.0 # 最大飞行时间 (秒)
MaxFlightDistance = 20000.0 # 最大飞行距离 (米)
MaxAcceleration = 50.0 # 最大横向加速度 (m/s^2)
-ProportionalNavigationCoefficient = 2.0 # 比例导引系数
-LaunchAcceleration = 100.0 # 初始发射加速度 (m/s^2)
-MaxEngineBurnTime = 0.1 # 发动机最大燃烧时间 (秒)
-CruiseTime = 5.0 #巡航阶段时长 (秒)
+ProportionalNavigationCoefficient = 3.0 # 比例导引系数
+LaunchAcceleration = 0.0 # 初始发射加速度 (m/s^2)
+MaxEngineBurnTime = 0.0 # 发动机最大燃烧时间 (秒)
+CruiseTime = 10.0 #巡航阶段时长 (秒)
Mass = 22.0 # 导弹质量 (kg)
ExplosionRadius = 5.0 # 爆炸半径 (米)
HitProbability = 0.9 # 固有命中概率 (0.0 到 1.0)
diff --git a/ThreatSource/data/missiles/mmw/mmw_001.toml b/ThreatSource/data/missiles/mmw/mmw_001.toml
index f2352f3..1e33ff5 100644
--- a/ThreatSource/data/missiles/mmw/mmw_001.toml
+++ b/ThreatSource/data/missiles/mmw/mmw_001.toml
@@ -11,10 +11,10 @@ MaxSpeed = 250.0 # 最大速度 (米/秒)
MaxFlightTime = 60.0 # 最大飞行时间 (秒)
MaxFlightDistance = 8000.0 # 最大飞行距离 (米)
MaxAcceleration = 100.0 # 最大加速度 (米/秒^2)
-ProportionalNavigationCoefficient = 4.0 # 比例导引系数
+ProportionalNavigationCoefficient = 4.0 # 比例导引系数
LaunchAcceleration = 100.0 # 发射加速度 (米/秒^2)
MaxEngineBurnTime = 2.5 # 最大发动机燃烧时间 (秒)
-CruiseTime = 4.0 # 巡航时间 (秒)
+CruiseTime = 3.5 # 巡航时间 (秒)
Mass = 28.0 # 质量 (千克)
ExplosionRadius = 5.0 # 爆炸半径 (米)
HitProbability = 0.9 # 命中概率
@@ -24,7 +24,7 @@ UltravioletRadiationIntensity = 100.0 # 紫外辐射强度 (瓦特/球面度)
[MillimeterWaveGuidanceConfig]
MaxDetectionRange = 5000.0 # 最大探测距离 (米)
-FieldOfViewAngle = 45.0 # 视场角 (度)
+FieldOfViewAngle = 15.0 # 视场角 (度)
TargetRecognitionProbability = 0.95 # 目标识别概率
WaveFrequency = 9.4e10 # 波频率 (赫兹, JSON中为94e9)
PulseDuration = 1.0e-6 # 脉冲持续时间 (秒)
diff --git a/ThreatSource/data/missiles/terminal_sensitive/tsm_001.toml b/ThreatSource/data/missiles/terminal_sensitive/tsm_001.toml
index 6d6fd1c..8cfb1e6 100644
--- a/ThreatSource/data/missiles/terminal_sensitive/tsm_001.toml
+++ b/ThreatSource/data/missiles/terminal_sensitive/tsm_001.toml
@@ -13,8 +13,8 @@ MaxFlightTime = 100.0 # 最大飞行时间 (秒)
MaxFlightDistance = 20000.0 # 最大飞行距离 (米)
MaxAcceleration = 200.0 # 最大加速度 (米/秒^2)
ProportionalNavigationCoefficient = 3.0 # 比例导引系数
-LaunchAcceleration = 100.0 # 发射加速度 (米/秒^2)
-MaxEngineBurnTime = 0.1 # 最大发动机燃烧时间 (秒)
+LaunchAcceleration = 0.0 # 发射加速度 (米/秒^2)
+MaxEngineBurnTime = 0.0 # 最大发动机燃烧时间 (秒)
CruiseTime = 5.0 # 巡航时间 (秒)
Mass = 50.0 # 质量 (千克)
ExplosionRadius = 5.0 # 爆炸半径 (米)
@@ -26,8 +26,8 @@ MaxFlightTime = 60.0 # 最大飞行时间 (秒)
MaxFlightDistance = 2000.0 # 最大飞行距离 (米)
MaxAcceleration = 500.0 # 最大加速度 (米/秒^2)
ProportionalNavigationCoefficient = 4.0 # 比例导引系数
-LaunchAcceleration = 10.0 # 发射加速度 (米/秒^2)
-MaxEngineBurnTime = 0.1 # 最大发动机燃烧时间 (秒)
+LaunchAcceleration = 0.0 # 发射加速度 (米/秒^2)
+MaxEngineBurnTime = 0.0 # 最大发动机燃烧时间 (秒)
Mass = 10.0 # 质量 (千克)
ExplosionRadius = 8.0 # 爆炸半径 (米)
HitProbability = 0.9 # 命中概率
@@ -38,11 +38,11 @@ SeparationSpeed = 600.0 # 分离速度 (米/秒)
SeparationHeight = 1000.0 # 分离高度 (米)
SeparationDistance = 1000.0 # 分离距离 (米)
SubmunitionSeparationAngle = 35.0 # 子弹药分离角度 (度)
-SeparationRange = 25.0 # 分离散布范围 (米)
-DecelerationAcceleration = 155.0 # 减速加速度 (米/秒^2)
+SeparationRange = 10.0 # 分离散布范围 (米)
+DecelerationAcceleration = 150.0 # 减速加速度 (米/秒^2)
DecelerationEndSpeed = 200.0 # 减速结束速度 (米/秒)
ParachuteDeploymentHeight = 400.0 # 开伞高度 (米)
-ParachuteDeceleration = 100.0 # 降落伞减速度 (米/秒^2)
+ParachuteDeceleration = 95.0 # 降落伞减速度 (米/秒^2)
StableScanHeight = 200.0 # 稳定扫描高度 (米)
VerticalDeclineSpeed = 10.0 # 垂直下降速度 (米/秒)
SpiralRotationSpeed = 25.13 # 螺旋旋转速度 (弧度/秒)
diff --git a/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs b/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs
index c0b57cc..7f0af82 100644
--- a/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs
+++ b/ThreatSource/src/Guidance/InfraredImagingGuidanceSystem.cs
@@ -115,7 +115,7 @@ namespace ThreatSource.Guidance
///
/// 识别成功率阈值 (搜索切换和跟踪稳定性判断共用, 例如80%)
///
- private const double COMMON_RECOGNITION_SUCCESS_RATE_THRESHOLD = 0.8;
+ private const double COMMON_RECOGNITION_SUCCESS_RATE_THRESHOLD = 0.7;
///
/// 锁定模式下目标丢失计时器
diff --git a/ThreatSource/src/MIssile/BaseMissile.cs b/ThreatSource/src/MIssile/BaseMissile.cs
index dc308de..3c689e9 100644
--- a/ThreatSource/src/MIssile/BaseMissile.cs
+++ b/ThreatSource/src/MIssile/BaseMissile.cs
@@ -100,10 +100,20 @@ namespace ThreatSource.Missile
///
protected Vector3D ThrustAcceleration { get; set; }
+ ///
+ /// 获取或设置导弹的升力加速度
+ ///
+ /// 三维加速度向量,单位:米/秒²
+ ///
+ /// 由升力产生的加速度
+ /// 影响导弹的垂直运动
+ ///
+ protected Vector3D LiftAcceleration { get; set; }
+
///
/// 重力加速度(北京标准值)
///
- private static readonly Vector3D GravityAcceleration = new(0, -MotionAlgorithm.Gravity, 0);
+ private static readonly Vector3D GravityAcceleration = new(0, -PhysicalConstants.BeijingGravity, 0);
///
/// 获取导弹的固定配置参数
@@ -115,6 +125,30 @@ namespace ThreatSource.Missile
///
public readonly MissileProperties Properties;
+ ///
+ /// 标准导弹三段式飞行阶段
+ ///
+ public enum MissileFlightStage
+ {
+ ///
+ /// 发射阶段
+ ///
+ Launch,
+ ///
+ /// 巡航阶段
+ ///
+ Cruise,
+ ///
+ /// 制导阶段
+ ///
+ Guidance
+ }
+
+ ///
+ /// 当前飞行阶段
+ ///
+ protected MissileFlightStage currentStage = MissileFlightStage.Launch;
+
///
/// 初始化导弹基类的新实例
///
@@ -146,12 +180,26 @@ namespace ThreatSource.Missile
IsActive = false;
IsGuidance = false;
GuidanceAcceleration = Vector3D.Zero;
+ LiftAcceleration = Vector3D.Zero;
// 计算初始推力加速度
Vector3D launchDirection = kinematicState.Orientation.ToVector().Normalize();
ThrustAcceleration = launchDirection * properties.LaunchAcceleration;
}
+ ///
+ /// 判断是否为末敏弹类型
+ ///
+ protected bool IsTerminalSensitiveType()
+ {
+ return Properties.Type == MissileType.TerminalSensitiveSubmunition;
+ }
+
+ ///
+ /// 供末敏弹等特殊导弹重写的自定义阶段更新方法
+ ///
+ protected virtual void UpdateCustomStages(double deltaTime) { }
+
///
/// 更新导弹的状态
///
@@ -164,17 +212,82 @@ namespace ThreatSource.Missile
///
public override void Update(double deltaTime)
{
- if (IsActive)
- {
- // 更新导弹运动状态
- UpdateMotionState(deltaTime);
+ if (!IsActive) return;
- // 检查是否应该自毁
- if (ShouldSelfDestruct())
+ // 末敏弹等特殊类型走自定义流程
+ if (!IsTerminalSensitiveType())
+ {
+ // 标准三段式流程
+ switch (currentStage)
{
- SelfDestruct();
+ case MissileFlightStage.Launch:
+ OnLaunchStage(deltaTime);
+ break;
+ case MissileFlightStage.Cruise:
+ OnCruiseStage(deltaTime);
+ break;
+ case MissileFlightStage.Guidance:
+ OnGuidanceStage(deltaTime);
+ break;
}
}
+
+ // 公共运动学与生命周期管理
+ UpdateMotionState(deltaTime);
+ if (ShouldSelfDestruct())
+ {
+ SelfDestruct();
+ }
+ }
+
+ ///
+ /// 发射阶段默认实现
+ ///
+ protected virtual void OnLaunchStage(double deltaTime)
+ {
+ // 发射阶段不使用制导
+ GuidanceAcceleration = Vector3D.Zero;
+
+ // 计算升力加速度。在发射阶段,升力加速度和攻角相关
+ LiftAcceleration = LiftModel.CalculateLiftAcceleration(KState.Orientation.Pitch * 180 / Math.PI);
+
+ // 发射阶段结束,进入巡航阶段
+ if (FlightTime >= Properties.MaxEngineBurnTime)
+ {
+ currentStage = MissileFlightStage.Cruise;
+ }
+ }
+
+ ///
+ /// 巡航阶段默认实现
+ ///
+ protected virtual void OnCruiseStage(double deltaTime)
+ {
+ // 巡航阶段不使用制导
+ GuidanceAcceleration = Vector3D.Zero;
+
+ if(KState.Orientation.Pitch > 0)
+ {
+ KState.Orientation = new Orientation(KState.Orientation.Yaw, -0.01, KState.Orientation.Roll);
+ }
+
+ // 计算升力加速度。在巡航阶段,升力加速度与重力加速度抵消
+ LiftAcceleration = new Vector3D(0, PhysicalConstants.BeijingGravity, 0);
+
+ // 巡航阶段结束,进入制导阶段
+ if (FlightTime >= Properties.MaxEngineBurnTime + Properties.CruiseTime)
+ {
+ currentStage = MissileFlightStage.Guidance;
+ }
+ }
+
+ ///
+ /// 制导阶段默认实现
+ ///
+ protected virtual void OnGuidanceStage(double deltaTime)
+ {
+ // 计算升力加速度。在制导阶段,升力加速度和攻角相关;
+ LiftAcceleration = LiftModel.CalculateLiftAcceleration(KState.Orientation.Pitch * 180 / Math.PI);
}
///
@@ -218,6 +331,8 @@ namespace ThreatSource.Missile
(KState.Position, KState.Velocity) = MotionAlgorithm.CalculateBallisticMotion(KState.Position, KState.Velocity, acceleration, deltaTime);
}
+ KState.Orientation = Orientation.FromVector(KState.Velocity);
+
// 限制速度不超过最大速度
if (KState.Speed > Properties.MaxSpeed)
{
@@ -250,13 +365,13 @@ namespace ThreatSource.Missile
Vector3D windVector = GetWindVectorFromWeather();
// 计算空气阻力加速度(考虑风的影响)
- Vector3D dragAcceleration = MotionAlgorithm.CalculateDragAcceleration(velocity, windVector, Properties.Mass);;
+ Vector3D dragAcceleration = MotionAlgorithm.CalculateDragAcceleration(velocity, windVector, Properties.Mass);
- // 合成总加速度(制导加速度 + 推力加速度 + 空气阻力加速度 + 重力加速度)
- Vector3D totalAcceleration = GuidanceAcceleration + ThrustAcceleration + dragAcceleration + GravityAcceleration;
+ // 合成总加速度(制导加速度 + 推力加速度 + 空气阻力加速度 + 升力加速度 + 重力加速度)
+ Vector3D totalAcceleration = GuidanceAcceleration + ThrustAcceleration + dragAcceleration + LiftAcceleration + GravityAcceleration;
Debug.WriteLine($"导弹 {Id} 的加速度: {totalAcceleration}, 制导: {GuidanceAcceleration}, " +
- $"推力: {ThrustAcceleration}, 空阻(含风): {dragAcceleration}, 重力: {GravityAcceleration}");
+ $"推力: {ThrustAcceleration}, 空阻(含风): {dragAcceleration}, 升力: {LiftAcceleration}, 重力: {GravityAcceleration}");
if (totalAcceleration.Magnitude() > Properties.MaxAcceleration)
{
@@ -480,6 +595,7 @@ namespace ThreatSource.Missile
statusInfo.ExtendedProperties["FlightTime"] = FlightTime;
statusInfo.ExtendedProperties["FlightDistance"] = FlightDistance;
statusInfo.ExtendedProperties["EngineBurnTime"] = EngineBurnTime;
+ statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
statusInfo.ExtendedProperties["IsGuidance"] = IsGuidance;
statusInfo.ExtendedProperties["LostGuidanceTime"] = LostGuidanceTime;
statusInfo.ExtendedProperties["GuidanceAcceleration"] = GuidanceAcceleration;
diff --git a/ThreatSource/src/MIssile/CompositeGuidedMissile.cs b/ThreatSource/src/MIssile/CompositeGuidedMissile.cs
index 4d469a9..daa8bbf 100644
--- a/ThreatSource/src/MIssile/CompositeGuidedMissile.cs
+++ b/ThreatSource/src/MIssile/CompositeGuidedMissile.cs
@@ -7,13 +7,6 @@ using ThreatSource.Jammable;
namespace ThreatSource.Missile
{
- internal enum CompositeFlightStage
- {
- Launch, // 发射阶段
- Cruise, // 巡航阶段
- Terminal // 末制导阶段
- }
-
///
/// 复合制导导弹类,继承自 BaseMissile
///
@@ -42,10 +35,6 @@ namespace ThreatSource.Missile
/// 目标类型
///
private readonly EquipmentType targetType;
- ///
- /// 当前飞行阶段
- ///
- private CompositeFlightStage currentFlightStage;
///
/// 经过优先级排序的制导组件配置列表。
@@ -357,37 +346,22 @@ namespace ThreatSource.Missile
///
public override void Update(double deltaTime)
{
- if (!IsActive) return;
-
- switch (currentFlightStage)
- {
- case CompositeFlightStage.Launch:
- UpdateLaunchStage(deltaTime);
- break;
- case CompositeFlightStage.Cruise:
- UpdateCruiseStage(deltaTime);
- break;
- case CompositeFlightStage.Terminal:
- UpdateTerminalStage(deltaTime); // UpdateTerminalStage 内部可以决定是否调用 UpdateGuidanceLogic
- break;
- }
-
// 具体的制导模式切换和活动制导系统更新由 UpdateGuidanceLogic 处理
// 只在特定条件下(例如,串行模式且处于末制导)调用 UpdateGuidanceLogic
- if (Properties.CompositeWorkMode == CompositeWorkType.Serial && currentFlightStage == CompositeFlightStage.Terminal)
+ if (Properties.CompositeWorkMode == CompositeWorkType.Serial && currentStage == MissileFlightStage.Guidance)
{
UpdateGuidanceLogic(deltaTime);
}
if (currentActiveGuidance != null && currentActiveGuidance.HasGuidance)
{
- this.IsGuidance = true;
- this.GuidanceAcceleration = currentActiveGuidance.GetGuidanceAcceleration();
+ IsGuidance = true;
+ GuidanceAcceleration = currentActiveGuidance.GetGuidanceAcceleration();
}
else
{
- this.IsGuidance = false;
- this.GuidanceAcceleration = Vector3D.Zero;
+ IsGuidance = false;
+ GuidanceAcceleration = Vector3D.Zero;
}
base.Update(deltaTime); // 调用基类更新,处理运动学等
@@ -399,44 +373,27 @@ namespace ThreatSource.Missile
public override void Fire()
{
base.Fire();
- currentFlightStage = CompositeFlightStage.Launch;
// 重置制导链状态
InitializeGuidanceSuite();
currentPhaseActivationTime = -1.0;
currentPhaseStableGuidanceTime = -1.0;
-
- Debug.WriteLine($"[CompositeGuidedMissile.Fire] 导弹 {Id} 发射. 初始阶段: {currentFlightStage}. 制导链已重置.");
}
///
- /// 更新发射阶段,基于MaxEngineBurnTime转换到巡航阶段。
+ /// 更新制导阶段状态
///
- protected virtual void UpdateLaunchStage(double deltaTime)
+ protected override void OnGuidanceStage(double deltaTime)
{
- if (FlightTime >= Properties.MaxEngineBurnTime)
+ if(currentActiveGuidance == null)
{
- currentFlightStage = CompositeFlightStage.Cruise;
+ KState.Orientation = new Orientation(KState.Orientation.Yaw, -0.02, KState.Orientation.Roll);
+ KState.Velocity = KState.Orientation.ToVector() * KState.Speed;
}
- }
- ///
- /// 更新巡航阶段,基于CruiseTime转换到末制导阶段。
- ///
- protected virtual void UpdateCruiseStage(double deltaTime)
- {
- if (FlightTime >= Properties.CruiseTime + Properties.MaxEngineBurnTime)
- {
- currentFlightStage = CompositeFlightStage.Terminal;
- }
- }
-
- ///
- /// 更新末制导阶段,调用UpdateGuidanceMode处理制导逻辑。
- ///
- protected virtual void UpdateTerminalStage(double deltaTime)
- {
UpdateGuidanceLogic(deltaTime);
+
+ base.OnGuidanceStage(deltaTime);
}
///
@@ -465,9 +422,8 @@ namespace ThreatSource.Missile
public override ElementStatusInfo GetStatusInfo()
{
var statusInfo = base.GetStatusInfo();
- statusInfo.ExtendedProperties["CurrentFlightStage"] = currentFlightStage; // 已有
- statusInfo.ExtendedProperties["CompositeWorkMode"] = Properties.CompositeWorkMode?.ToString() ?? "None"; // 已有
- statusInfo.ExtendedProperties["ActiveGuidanceSystem"] = currentActiveGuidance?.GetType().Name ?? "None"; // 已有
+ statusInfo.ExtendedProperties["CompositeWorkMode"] = Properties.CompositeWorkMode?.ToString() ?? "None";
+ statusInfo.ExtendedProperties["ActiveGuidanceSystem"] = currentActiveGuidance?.GetType().Name ?? "None";
statusInfo.ExtendedProperties["ActiveGuidanceConfig"] = currentActiveConfig?.ComponentName ?? "None";
statusInfo.ExtendedProperties["CurrentGuidancePhaseIndex"] = currentGuidancePhaseIndex;
statusInfo.ExtendedProperties["GuidanceChainHaltedOrCompleted"] = guidanceChainHaltedOrCompleted.ToString();
diff --git a/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs b/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs
index 723bbe6..a864376 100644
--- a/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs
+++ b/ThreatSource/src/MIssile/InfraredCommandGuidedMissile.cs
@@ -18,31 +18,6 @@ namespace ThreatSource.Missile
///
public class InfraredCommandGuidedMissile : BaseMissile
{
- ///
- /// 红外指令制导导弹阶段枚举
- ///
- ///
- /// 定义了导弹飞行的四个主要阶段:
- /// - Launch:发射阶段,初始加速
- /// - Cruise:巡航阶段,执行制导
- /// - Explode:爆炸阶段,命中目标
- /// - SelfDestruct:自毁阶段,触发自毁
- ///
- private enum ICGM_Stage
- {
- Launch, // 发射阶段
- Cruise // 巡航阶段
- }
-
- ///
- /// 获取或设置当前飞行阶段
- ///
- ///
- /// 用于控制导弹在不同阶段的行为
- /// 影响导弹的运动和制导方式
- ///
- private ICGM_Stage currentStage;
-
///
/// 获取或设置红外热源辐射功率
///
@@ -108,65 +83,20 @@ namespace ThreatSource.Missile
}
///
- /// 更新导弹运动状态
+ /// 更新制导阶段状态
///
/// 时间步长,单位:秒
///
- /// 更新过程:
- /// - 点亮红外热源
- /// - 根据当前阶段更新状态
- /// - 调用基类的运动更新
- ///
- public override void Update(double deltaTime)
- {
- // 点亮红外热源
- LightInfraredSource();
-
- switch (currentStage)
- {
- case ICGM_Stage.Launch:
- UpdateLaunchStage(deltaTime);
- break;
- case ICGM_Stage.Cruise:
- UpdateCruiseStage(deltaTime);
- break;
- }
-
- base.Update(deltaTime);
- }
-
- ///
- /// 更新发射阶段状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 发射阶段处理:
- /// - 清除制导加速度
- /// - 检查发射时间
- /// - 转换到巡航阶段
- ///
- private void UpdateLaunchStage(double deltaTime)
- {
- // 发射阶段
- GuidanceAcceleration = Vector3D.Zero;
- if (FlightTime >= Properties.MaxEngineBurnTime)
- {
- currentStage = ICGM_Stage.Cruise;
- }
- }
-
- ///
- /// 更新巡航阶段状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 巡航阶段处理:
+ /// 制导阶段处理:
/// - 启用制导控制
/// - 更新制导系统
/// - 计算制导加速度
///
- private void UpdateCruiseStage(double deltaTime)
+ protected override void OnGuidanceStage(double deltaTime)
{
+ // 点亮红外热源
+ LightInfraredSource();
+ // 更新制导系统
guidanceSystem.Update(deltaTime);
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
IsGuidance = guidanceSystem.HasGuidance;
@@ -209,20 +139,6 @@ namespace ThreatSource.Missile
SimulationManager.PublishEvent(new InfraredGuidanceMissileLightEvent { RadiationPower = RadiationPower, SenderId = Id });
}
- ///
- /// 发射导弹
- ///
- ///
- /// 发射过程:
- /// - 调用基类发射方法
- /// - 设置当前阶段为发射阶段
- ///
- public override void Fire()
- {
- base.Fire();
- currentStage = ICGM_Stage.Launch;
- }
-
///
/// 熄灭红外热源
///
@@ -284,7 +200,6 @@ namespace ThreatSource.Missile
public override ElementStatusInfo GetStatusInfo()
{
var statusInfo = base.GetStatusInfo();
- statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
statusInfo.ExtendedProperties["GuidanceSystem"] = guidanceSystem.GetStatusInfo();
return statusInfo;
}
diff --git a/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs b/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs
index 85e8be2..6784b24 100644
--- a/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs
+++ b/ThreatSource/src/MIssile/InfraredImagingTerminalGuidedMissile.cs
@@ -24,33 +24,6 @@ namespace ThreatSource.Missile
///
public class InfraredImagingTerminalGuidedMissile : BaseMissile
{
- ///
- /// 红外成像末制导导弹的飞行阶段枚举
- ///
- ///
- /// 定义了导弹的工作阶段:
- /// - Launch: 发射阶段,初始加速
- /// - Cruise: 巡航阶段,中程飞行
- /// - TerminalSearch: 末制导搜索阶段,大视场角搜索目标
- /// - TerminalTrack: 末制导跟踪阶段,小视场角精确跟踪
- /// - TerminalLock: 末制导锁定阶段,目标确认后的精确跟踪
- ///
- private enum IRTG_Stage
- {
- Launch, // 发射阶段
- Cruise, // 巡航阶段
- Terminal // 末制导
- }
-
- ///
- /// 导弹当前的飞行阶段
- ///
- ///
- /// 用于控制导弹的行为状态
- /// 在不同阶段执行不同的更新逻辑
- ///
- private IRTG_Stage currentStage;
-
///
/// 红外成像制导系统实例
///
@@ -108,102 +81,31 @@ namespace ThreatSource.Missile
}
///
- /// 更新导弹的状态
+ /// 更新制导阶段的状态
///
/// 时间步长,单位:秒
///
- /// 更新过程:
- /// 1. 调用基类的更新方法
- /// 2. 根据当前阶段选择更新方法
- /// 3. 执行相应阶段的更新逻辑
- /// 4. 检查是否需要自毁
- ///
- public override void Update(double deltaTime)
- {
- switch (currentStage)
- {
- case IRTG_Stage.Launch:
- UpdateLaunchStage(deltaTime);
- break;
- case IRTG_Stage.Cruise:
- UpdateCruiseStage(deltaTime);
- break;
- case IRTG_Stage.Terminal:
- UpdateTerminalStage(deltaTime);
- break;
- }
- base.Update(deltaTime);
- }
-
- ///
- /// 更新发射阶段的状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 发射阶段特点:
- /// - 不使用制导加速度
- /// - 仅依靠发动机推力
- /// - 持续时间为1秒
- /// - 结束后进入巡航阶段
- ///
- private void UpdateLaunchStage(double deltaTime)
- {
- GuidanceAcceleration = Vector3D.Zero;
- if (FlightTime > Properties.MaxEngineBurnTime)
- {
- currentStage = IRTG_Stage.Cruise;
- }
- }
-
- ///
- /// 更新巡航阶段的状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 巡航阶段特点:
- /// - 保持稳定飞行
- /// - 不使用制导系统
- /// - 达到巡航时间后进入末制导搜索阶段
- ///
- private void UpdateCruiseStage(double deltaTime)
- {
- // 如果巡航时间达到,切换到末制导搜索阶段
- if (FlightTime > Properties.CruiseTime + Properties.MaxEngineBurnTime)
- {
- currentStage = IRTG_Stage.Terminal;
- guidanceSystem.Activate();
- }
- }
-
- ///
- /// 更新末制导搜索阶段的状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 末制导阶段特点:
+ /// 制导阶段特点:
/// - 完全依赖导航系统的工作模式
/// - 根据导航系统状态更新制导
/// - 持续到命中目标
///
- private void UpdateTerminalStage(double deltaTime)
+ protected override void OnGuidanceStage(double deltaTime)
{
+ // 激活制导系统
+ if(!guidanceSystem.IsActive)
+ {
+ guidanceSystem.Activate();
+ KState.Orientation = new Orientation(KState.Orientation.Yaw, -0.1, KState.Orientation.Roll);
+ KState.Velocity = KState.Orientation.ToVector() * KState.Speed;
+ }
+
+ // 更新制导系统
guidanceSystem.Update(deltaTime);
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
IsGuidance = guidanceSystem.HasGuidance;
- }
- ///
- /// 发射导弹
- ///
- ///
- /// 发射过程:
- /// - 调用基类发射方法
- /// - 设置当前阶段为发射阶段
- ///
- public override void Fire()
- {
- base.Fire();
- currentStage = IRTG_Stage.Launch;
+ base.OnGuidanceStage(deltaTime);
}
///
@@ -217,7 +119,6 @@ namespace ThreatSource.Missile
public override void Activate()
{
base.Activate();
- guidanceSystem.Activate();
}
///
@@ -246,7 +147,6 @@ namespace ThreatSource.Missile
public override ElementStatusInfo GetStatusInfo()
{
var statusInfo = base.GetStatusInfo();
- statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
statusInfo.ExtendedProperties["GuidanceSystem"] = guidanceSystem.GetStatusInfo();
return statusInfo;
}
diff --git a/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs b/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs
index fec38ce..82d8298 100644
--- a/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs
+++ b/ThreatSource/src/MIssile/LaserBeamRiderMissile.cs
@@ -18,31 +18,6 @@ namespace ThreatSource.Missile
///
public class LaserBeamRiderMissile : BaseMissile
{
- ///
- /// 激光驾束制导导弹阶段枚举
- ///
- ///
- /// 定义了导弹飞行的四个主要阶段:
- /// - Launch:发射阶段,初始加速
- /// - Cruise:巡航阶段,跟踪波束
- /// - Explode:爆炸阶段,命中目标
- /// - SelfDestruct:自毁阶段,触发自毁
- ///
- private enum LBRM_Stage
- {
- Launch, // 发射阶段
- Cruise // 巡航阶段
- }
-
- ///
- /// 获取或设置当前飞行阶段
- ///
- ///
- /// 用于控制导弹在不同阶段的行为
- /// 影响导弹的运动和制导方式
- ///
- private LBRM_Stage currentStage;
-
///
/// 激光波束制导系统实例
///
@@ -65,7 +40,6 @@ namespace ThreatSource.Missile
/// - 初始化基本属性
/// - 创建制导系统
/// - 配置制导参数
- /// - 设置初始飞行阶段
///
public LaserBeamRiderMissile(
string missileId,
@@ -85,81 +59,23 @@ namespace ThreatSource.Missile
}
///
- /// 更新导弹状态
- ///
+ /// 制导阶段默认实现
/// 时间步长,单位:秒
///
- /// 更新过程:
- /// - 根据当前阶段更新状态
- /// - 处理阶段转换
- /// - 调用基类更新
- ///
- public override void Update(double deltaTime)
- {
- switch (currentStage)
- {
- case LBRM_Stage.Launch:
- UpdateLaunchStage(deltaTime);
- break;
- case LBRM_Stage.Cruise:
- UpdateCruiseStage(deltaTime);
- break;
- }
-
- base.Update(deltaTime);
- }
-
- ///
- /// 更新发射阶段状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 发射阶段处理:
- /// - 清除制导加速度
- /// - 检查发射时间
- /// - 转换到巡航阶段
- ///
- private void UpdateLaunchStage(double deltaTime)
- {
- // 发射阶段
- GuidanceAcceleration = Vector3D.Zero;
- if (FlightTime >= Properties.MaxEngineBurnTime)
- {
- currentStage = LBRM_Stage.Cruise;
- }
- }
-
- ///
- /// 更新巡航阶段状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 巡航阶段处理:
- /// - 启用波束跟踪
+ /// 制导阶段处理:
/// - 更新制导系统
- /// - 计算制导加速度
- /// - 检查自毁条件
+ /// - 获取制导加速度
+ /// - 设置制导状态
///
- private void UpdateCruiseStage(double deltaTime)
- {
- // 巡航阶段
- guidanceSystem.Update(deltaTime);
- GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
- IsGuidance = guidanceSystem.HasGuidance;
- }
-
- ///
- /// 发射导弹
///
- ///
- /// 发射过程:
- /// - 调用基类发射方法
- /// - 设置当前阶段为发射阶段
- ///
- public override void Fire()
+ protected override void OnGuidanceStage(double deltaTime)
{
- base.Fire();
- currentStage = LBRM_Stage.Launch;
+ // 更新制导系统
+ guidanceSystem.Update(deltaTime);
+ // 获取制导加速度
+ GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
+ // 设置制导状态
+ IsGuidance = guidanceSystem.HasGuidance;
}
///
@@ -201,12 +117,10 @@ namespace ThreatSource.Missile
///
/// 返回信息包括:
/// - 基本状态信息
- /// - 当前飞行阶段
///
public override ElementStatusInfo GetStatusInfo()
{
var statusInfo = base.GetStatusInfo();
- statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
statusInfo.ExtendedProperties["GuidanceSystem"] = guidanceSystem.GetStatusInfo();
return statusInfo;
}
diff --git a/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs b/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs
index af705db..0c5dff3 100644
--- a/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs
+++ b/ThreatSource/src/MIssile/LaserSemiActiveGuidedMissile.cs
@@ -17,31 +17,6 @@ namespace ThreatSource.Missile
///
public class LaserSemiActiveGuidedMissile : BaseMissile
{
- ///
- /// 激光半主动制导导弹阶段枚举
- ///
- ///
- /// 定义了导弹飞行的四个主要阶段:
- /// - Launch:发射阶段,初始加速
- /// - Cruise:巡航阶段,执行制导
- /// - Explode:爆炸阶段,命中目标
- /// - SelfDestruct:自毁阶段,触发自毁
- ///
- private enum LSAGM_Stage
- {
- Launch, // 发射阶段
- Cruise // 巡航阶段
- }
-
- ///
- /// 获取或设置当前飞行阶段
- ///
- ///
- /// 用于控制导弹在不同阶段的行为
- /// 影响导弹的运动和制导方式
- ///
- private LSAGM_Stage currentStage;
-
///
/// 激光半主动制导系统实例
///
@@ -93,20 +68,6 @@ namespace ThreatSource.Missile
manager);
}
- ///
- /// 发射导弹
- ///
- ///
- /// 发射过程:
- /// - 调用基类发射方法
- /// - 设置当前阶段为发射阶段
- ///
- public override void Fire()
- {
- base.Fire();
- currentStage = LSAGM_Stage.Launch;
- }
-
///
/// 激活导弹
///
@@ -117,8 +78,7 @@ namespace ThreatSource.Missile
public override void Activate()
{
base.Activate();
- // 激活制导系统
- guidanceSystem.Activate();
+
// 将制导系统注册到仿真管理器
SimulationManager.RegisterEntity(guidanceSystem.Id, guidanceSystem);
}
@@ -139,50 +99,6 @@ namespace ThreatSource.Missile
SimulationManager.UnregisterEntity(guidanceSystem.Id);
}
- ///
- /// 更新导弹状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 更新过程:
- /// - 根据当前阶段更新状态
- /// - 处理阶段转换
- /// - 调用基类更新
- ///
- public override void Update(double deltaTime)
- {
- switch (currentStage)
- {
- case LSAGM_Stage.Launch:
- UpdateLaunchStage(deltaTime);
- break;
- case LSAGM_Stage.Cruise:
- UpdateCruiseStage(deltaTime);
- break;
- }
- base.Update(deltaTime);
- }
-
- ///
- /// 更新发射阶段状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 发射阶段处理:
- /// - 清除制导加速度
- /// - 检查发射时间
- /// - 转换到巡航阶段
- ///
- private void UpdateLaunchStage(double deltaTime)
- {
- // 发射阶段
- GuidanceAcceleration = Vector3D.Zero;
- if (FlightTime >= Properties.MaxEngineBurnTime)
- {
- currentStage = LSAGM_Stage.Cruise;
- }
- }
-
///
/// 更新巡航阶段状态
///
@@ -194,13 +110,35 @@ namespace ThreatSource.Missile
/// - 计算制导加速度
/// - 检查自毁条件
///
- private void UpdateCruiseStage(double deltaTime)
+ protected override void OnCruiseStage(double deltaTime)
{
+ base.OnCruiseStage(deltaTime);
+
+ LiftAcceleration = Vector3D.Zero;
+ }
+
+ ///
+ /// 更新制导阶段状态
+ ///
+ /// 时间步长,单位:秒
+ ///
+ /// 制导阶段处理:
+ /// - 启用制导控制
+ /// - 更新制导系统
+ /// - 计算制导加速度
+ /// - 检查自毁条件
+ ///
+ protected override void OnGuidanceStage(double deltaTime)
+ {
+ // 激活制导系统
+ if(!guidanceSystem.IsActive)
+ {
+ guidanceSystem.Activate();
+ }
+
// 更新制导系统
guidanceSystem.Update(deltaTime);
- // 获取制导加速度
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
- // 设置制导状态
IsGuidance = guidanceSystem.HasGuidance;
}
diff --git a/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs b/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs
index a1177b4..df9bb14 100644
--- a/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs
+++ b/ThreatSource/src/MIssile/MillimeterWaveTerminalGuidedMissile.cs
@@ -23,31 +23,6 @@ namespace ThreatSource.Missile
///
public class MillimeterWaveTerminalGuidedMissile : BaseMissile
{
- ///
- /// 毫米波末制导导弹的飞行阶段枚举
- ///
- ///
- /// 定义了导弹的三个工作阶段:
- /// - Launch: 发射阶段,初始加速
- /// - Cruise: 巡航阶段,中程飞行
- /// - Terminal: 末制导阶段,毫米波制导
- ///
- private enum MWTG_Stage
- {
- Launch, // 发射阶段
- Cruise, // 巡航阶段
- Terminal // 末制导阶段
- }
-
- ///
- /// 导弹当前的飞行阶段
- ///
- ///
- /// 用于控制导弹的行为状态
- /// 在不同阶段执行不同的更新逻辑
- ///
- private MWTG_Stage currentStage;
-
///
/// 毫米波制导系统实例
///
@@ -101,102 +76,31 @@ namespace ThreatSource.Missile
}
///
- /// 更新导弹的状态
+ /// 更新制导阶段的状态
///
/// 时间步长,单位:秒
///
- /// 更新过程:
- /// 1. 调用基类的更新方法
- /// 2. 根据当前阶段选择更新方法
- /// 3. 执行相应阶段的更新逻辑
- /// 4. 检查是否需要自毁
- ///
- public override void Update(double deltaTime)
- {
- switch (currentStage)
- {
- case MWTG_Stage.Launch:
- UpdateLaunchStage(deltaTime);
- break;
- case MWTG_Stage.Cruise:
- UpdateCruiseStage(deltaTime);
- break;
- case MWTG_Stage.Terminal:
- UpdateTerminalStage(deltaTime);
- break;
- }
- base.Update(deltaTime);
- }
-
- ///
- /// 更新发射阶段的状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 发射阶段特点:
- /// - 不使用制导加速度
- /// - 仅依靠发动机推力
- /// - 持续时间为0.1秒
- /// - 结束后进入巡航阶段
- ///
- private void UpdateLaunchStage(double deltaTime)
- {
- GuidanceAcceleration = Vector3D.Zero;
- if (FlightTime > Properties.MaxEngineBurnTime)
- {
- currentStage = MWTG_Stage.Cruise;
- }
- }
-
- ///
- /// 更新巡航阶段的状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 巡航阶段特点:
- /// - 保持稳定飞行
- /// - 不使用制导系统
- /// - 持续时间为3秒
- /// - 结束后进入末制导阶段
- ///
- private void UpdateCruiseStage(double deltaTime)
- {
- if (FlightTime > Properties.CruiseTime + Properties.MaxEngineBurnTime)
- {
- currentStage = MWTG_Stage.Terminal;
- guidanceSystem.Activate(); // 激活制导系统
- }
- }
-
- ///
- /// 更新末制导阶段的状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 末制导阶段特点:
+ /// 制导阶段特点:
/// - 完全依赖导航系统的工作模式
/// - 根据导航系统状态更新制导
/// - 持续到命中目标
///
- private void UpdateTerminalStage(double deltaTime)
+ protected override void OnGuidanceStage(double deltaTime)
{
+ // 激活制导系统
+ if(!guidanceSystem.IsActive)
+ {
+ guidanceSystem.Activate();
+ KState.Orientation = new Orientation(KState.Orientation.Yaw, -0.02, KState.Orientation.Roll);
+ KState.Velocity = KState.Orientation.ToVector() * KState.Speed;
+ }
+
+ // 更新制导系统
guidanceSystem.Update(deltaTime);
GuidanceAcceleration = guidanceSystem.GetGuidanceAcceleration();
IsGuidance = guidanceSystem.HasGuidance;
- }
- ///
- /// 发射导弹
- ///
- ///
- /// 发射过程:
- /// - 调用基类发射方法
- /// - 设置当前阶段为发射阶段
- ///
- public override void Fire()
- {
- base.Fire();
- currentStage = MWTG_Stage.Launch;
+ base.OnGuidanceStage(deltaTime);
}
///
@@ -210,7 +114,6 @@ namespace ThreatSource.Missile
public override void Activate()
{
base.Activate();
- guidanceSystem.Activate();
}
///
diff --git a/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs b/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs
index 06c0bab..f240ec0 100644
--- a/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs
+++ b/ThreatSource/src/MIssile/TerminalSensitiveMissile.cs
@@ -31,29 +31,6 @@ namespace ThreatSource.Missile
///
private readonly TerminalSensitiveSubmunitionConfig submunitionConfig;
- ///
- /// 末敏弹的飞行阶段
- ///
- ///
- /// 枚举定义了末敏弹的飞行阶段
- /// 包括发射阶段、巡航阶段和分离阶段
- ///
- private enum TSGM_Stage
- {
- Launch, // 发射阶段
- Cruise, // 巡航阶段
- Separation // 分离阶段
- }
-
- ///
- /// 导弹当前的飞行阶段
- ///
- ///
- /// 用于控制导弹的行为状态
- /// 在不同阶段执行不同的更新逻辑
- ///
- private TSGM_Stage currentStage;
-
///
/// 子弹的属性
///
@@ -175,75 +152,6 @@ namespace ThreatSource.Missile
}
}
- ///
- /// 发射导弹
- ///
- ///
- /// 发射过程:
- /// - 调用基类发射方法
- /// - 设置当前阶段为发射阶段
- ///
- public override void Fire()
- {
- base.Fire();
- currentStage = TSGM_Stage.Launch;
- }
-
- ///
- /// 更新导弹的状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 更新过程:
- /// 1. 检查导弹是否处于活动状态
- /// 2. 验证自毁条件(时间、距离、高度)
- /// 3. 更新基本运动状态
- /// 4. 计算与分离点的距离
- /// 5. 记录状态信息
- /// 6. 必要时触发分离动作
- ///
- /// 自毁条件:
- /// - 超出最大飞行时间
- /// - 超出最大飞行距离
- /// - 高度低于地面
- ///
- public override void Update(double deltaTime)
- {
- switch (currentStage)
- {
- case TSGM_Stage.Launch:
- UpdateLaunchStage(deltaTime);
- break;
- case TSGM_Stage.Cruise:
- UpdateCruiseStage(deltaTime);
- break;
- case TSGM_Stage.Separation:
- UpdateSeparationStage(deltaTime);
- break;
- }
- base.Update(deltaTime);
- }
-
- ///
- /// 更新发射阶段的状态
- ///
- /// 时间步长,单位:秒
- ///
- /// 发射阶段特点:
- /// - 不使用制导加速度
- /// - 仅依靠发动机推力
- /// - 持续时间为0.1秒
- /// - 结束后进入巡航阶段
- ///
- private void UpdateLaunchStage(double deltaTime)
- {
- GuidanceAcceleration = Vector3D.Zero;
- if (FlightTime > Properties.MaxEngineBurnTime)
- {
- currentStage = TSGM_Stage.Cruise;
- }
- }
-
///
/// 更新巡航阶段的状态
///
@@ -254,13 +162,15 @@ namespace ThreatSource.Missile
/// - 不使用制导系统
/// - 结束后进入分离阶段
///
- private void UpdateCruiseStage(double deltaTime)
+ protected override void OnCruiseStage(double deltaTime)
{
+ LiftAcceleration = Vector3D.Zero;
+
double distanceToSeparationPoint = (separationPoint - KState.Position).Magnitude();
//距离分离点距离小于配置的分离范围,则分离
if (distanceToSeparationPoint <= submunitionConfig.SeparationRange)
{
- currentStage = TSGM_Stage.Separation;
+ currentStage = MissileFlightStage.Guidance;
}
}
@@ -272,7 +182,7 @@ namespace ThreatSource.Missile
/// 分离阶段特点:
/// - 分离子弹药
///
- private void UpdateSeparationStage(double deltaTime)
+ protected override void OnGuidanceStage(double deltaTime)
{
PerformSeparation();
}
diff --git a/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs b/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs
index aff1cd6..d17bbc6 100644
--- a/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs
+++ b/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs
@@ -71,7 +71,7 @@ namespace ThreatSource.Missile
/// 用于控制子弹在不同阶段的行为
/// 影响传感器工作模式和制导方式
///
- private SubmunitionStage currentStage;
+ private SubmunitionStage currentSubmunitionStage;
///
/// 子弹配置参数
@@ -214,7 +214,7 @@ namespace ThreatSource.Missile
public override void Fire()
{
base.Fire();
- currentStage = SubmunitionStage.Separation;
+ currentSubmunitionStage = SubmunitionStage.Separation;
}
///
@@ -236,7 +236,7 @@ namespace ThreatSource.Missile
altimeter.Update(deltaTime);
rangefinder.Update(deltaTime);
- switch (currentStage)
+ switch (currentSubmunitionStage)
{
case SubmunitionStage.Separation:
UpdateSeparationStage(deltaTime);
@@ -274,7 +274,7 @@ namespace ThreatSource.Missile
// 分离阶段只表示分离行为,不进行任何物理计算
// 分离阶段结束,进入减速阶段
- currentStage = SubmunitionStage.Deceleration;
+ currentSubmunitionStage = SubmunitionStage.Deceleration;
}
///
@@ -310,7 +310,7 @@ namespace ThreatSource.Missile
if(altimeterData.IsValid && altimeterData.Altitude <= config.ParachuteDeploymentHeight)
{
// 如果是,则进入降落伞打开阶段
- currentStage = SubmunitionStage.ParachuteDeployment;
+ currentSubmunitionStage = SubmunitionStage.ParachuteDeployment;
}
}
@@ -341,11 +341,11 @@ namespace ThreatSource.Missile
if(altimeterData.IsValid && altimeterData.Altitude <= config.StableScanHeight)
{
// 如果是,则进入稳定扫描阶段
- currentStage = SubmunitionStage.StableScan;
+ currentSubmunitionStage = SubmunitionStage.StableScan;
// 维持稳定的垂直下降速度
KState.Velocity = new Vector3D(0, -config.VerticalDeclineSpeed, 0);
// 制导加速度抵消重力加速度,匀速下降
- GuidanceAcceleration = new Vector3D(0, MotionAlgorithm.Gravity, 0);
+ GuidanceAcceleration = new Vector3D(0, PhysicalConstants.BeijingGravity, 0);
}
}
@@ -387,7 +387,7 @@ namespace ThreatSource.Missile
RangefinderSensorData rangefinderData = (RangefinderSensorData)rangefinder.GetSensorData();
if (rangefinderData.IsValid && rangefinderData.Distance <= config.TargetDetectionDistance)
{
- currentStage = SubmunitionStage.Detection;
+ currentSubmunitionStage = SubmunitionStage.Detection;
}
}
@@ -488,7 +488,7 @@ namespace ThreatSource.Missile
// 二次确认成功,进入攻击阶段
Debug.WriteLine($"二次确认成功,进入攻击阶段,当前角度: {spiralAngle * 180 / Math.PI:F2}°");
IsGuidance = true;
- currentStage = SubmunitionStage.Attack;
+ currentSubmunitionStage = SubmunitionStage.Attack;
return;
}
else
@@ -642,7 +642,7 @@ namespace ThreatSource.Missile
SimulationElement target = SimulationManager.GetEntityById(TargetId) as SimulationElement ?? throw new Exception("目标不存在");
double distanceToTarget = (target.KState.Position - KState.Position).Magnitude();
- statusInfo.ExtendedProperties["CurrentStage"] = currentStage.ToString();
+ statusInfo.ExtendedProperties["CurrentStage"] = currentSubmunitionStage.ToString();
statusInfo.ExtendedProperties["SpiralAngle"] = spiralAngle * 180 / Math.PI;
statusInfo.ExtendedProperties["LastDetectionTime"] = lastDetectionTime?.ToString() ?? "null";
statusInfo.ExtendedProperties["FirstDetectionAngle"] = firstDetectionAngle?.ToString() ?? "null";
@@ -690,7 +690,7 @@ namespace ThreatSource.Missile
private bool IsSensorsJammed()
{
// 根据当前阶段检查相应传感器的干扰状态
- switch (currentStage)
+ switch (currentSubmunitionStage)
{
case SubmunitionStage.Deceleration:
// 减速阶段需要测高仪
diff --git a/ThreatSource/src/Utils/Common.cs b/ThreatSource/src/Utils/Common.cs
index eec5423..ebe4c0c 100644
--- a/ThreatSource/src/Utils/Common.cs
+++ b/ThreatSource/src/Utils/Common.cs
@@ -34,4 +34,22 @@ namespace ThreatSource.Utils
///
Band8
}
+
+ ///
+ /// 存储通用的物理常量。
+ ///
+ public static class PhysicalConstants
+ {
+ ///
+ /// 重力加速度值(北京标准值)。
+ /// 单位:m/s²
+ ///
+ public static readonly double BeijingGravity = 9.8015;
+
+ ///
+ /// 重力加速度(标准值)。
+ /// 单位:m/s²
+ ///
+ public static readonly double StandardGravity = 9.80665;
+ }
}
\ No newline at end of file
diff --git a/ThreatSource/src/Utils/LiftModel.cs b/ThreatSource/src/Utils/LiftModel.cs
new file mode 100644
index 0000000..d939eb3
--- /dev/null
+++ b/ThreatSource/src/Utils/LiftModel.cs
@@ -0,0 +1,35 @@
+namespace ThreatSource.Utils
+{
+ ///
+ /// 提供计算导弹升力相关参数的静态方法。
+ ///
+ public static class LiftModel
+ {
+ private const double MinEffectivePitchDegrees = -5.0; // 模型有效的最小俯仰角 (度)
+ private const double MaxEffectivePitchDegrees = 15.0; // 模型有效的最大俯仰角 (度)
+ private const double PitchOffsetDegrees = 5.0; // 升力和重力平衡点的俯仰角(攻角) (度)
+ private const double LiftCoefficientPerDegree = 1.0; // 每度俯仰角的升力系数 (m/s^2 / 度)
+
+ ///
+ /// 根据给定的俯仰角(攻角)计算升力产生的垂直加速度。
+ /// 此计算基于一个模型,该模型首先定义了一个"已合并重力效应"的加速度 (combined_vertical_acceleration),
+ /// 然后通过 lift_acceleration = combined_vertical_acceleration + g 来得到纯升力加速度。
+ /// 当俯仰角(攻角)超出预定有效范围时,此模型贡献的升力加速度为0。
+ ///
+ /// 当前俯仰角(单位:度)。在此模型中作为攻角的代理。
+ /// 升力产生的加速度矢量(单位:m/s²)。如果在有效俯仰角范围之外,则返回0。
+ public static Vector3D CalculateLiftAcceleration(double pitchDegrees)
+ {
+ if (pitchDegrees < MinEffectivePitchDegrees || pitchDegrees > MaxEffectivePitchDegrees)
+ {
+ return Vector3D.Zero;
+ }
+
+ double combinedVerticalAcceleration = (pitchDegrees - PitchOffsetDegrees) * LiftCoefficientPerDegree;
+
+ double liftAcceleration = combinedVerticalAcceleration + PhysicalConstants.BeijingGravity;
+
+ return new Vector3D(0, liftAcceleration, 0);
+ }
+ }
+}
\ No newline at end of file
diff --git a/ThreatSource/src/Utils/MotionAlgorithm.cs b/ThreatSource/src/Utils/MotionAlgorithm.cs
index 0f000d1..416ac54 100644
--- a/ThreatSource/src/Utils/MotionAlgorithm.cs
+++ b/ThreatSource/src/Utils/MotionAlgorithm.cs
@@ -15,11 +15,6 @@ namespace ThreatSource.Utils
///
public static class MotionAlgorithm
{
- ///
- /// 重力值(北京标准值)
- ///
- public static readonly double Gravity = 9.8015;
-
///
/// 计算抛物线弹道最佳发射方向(选择较小的仰角)
///
@@ -78,7 +73,7 @@ namespace ThreatSource.Utils
double v0_2 = v0 * v0;
double v0_4 = v0_2 * v0_2;
- double discriminant = v0_4 - Gravity * (Gravity * x * x + 2 * y * v0_2);
+ double discriminant = v0_4 - PhysicalConstants.BeijingGravity * (PhysicalConstants.BeijingGravity * x * x + 2 * y * v0_2);
if (discriminant < 0)
{
@@ -86,8 +81,8 @@ namespace ThreatSource.Utils
return null;
}
- double angle1 = Math.Atan((v0_2 + Math.Sqrt(discriminant)) / (Gravity * x));
- double angle2 = Math.Atan((v0_2 - Math.Sqrt(discriminant)) / (Gravity * x));
+ double angle1 = Math.Atan((v0_2 + Math.Sqrt(discriminant)) / (PhysicalConstants.BeijingGravity * x));
+ double angle2 = Math.Atan((v0_2 - Math.Sqrt(discriminant)) / (PhysicalConstants.BeijingGravity * x));
Debug.WriteLine($"计算得到的两个角度: {angle1 * 180 / Math.PI:F2}° 和 {angle2 * 180 / Math.PI:F2}°");
@@ -405,7 +400,7 @@ namespace ThreatSource.Utils
// 使用阻力调整后的初始速度计算发射角度
// (这是一个简化模型,实际情况更复杂,可能需要迭代求解)
Vector3D deltaPos = targetPos - startPos;
- Vector3D gravityVector = new(0, -Gravity, 0);
+ Vector3D gravityVector = new(0, -PhysicalConstants.BeijingGravity, 0);
Vector3D effectiveTotalAcceleration = gravityVector + dragAcceleration;
double coeff_a = 0.25 * effectiveTotalAcceleration.MagnitudeSquared();
diff --git a/ThreatSource/src/Utils/ObscurationUtils.cs b/ThreatSource/src/Utils/ObscurationUtils.cs
index 92917b7..38f0ddc 100644
--- a/ThreatSource/src/Utils/ObscurationUtils.cs
+++ b/ThreatSource/src/Utils/ObscurationUtils.cs
@@ -13,9 +13,9 @@ namespace ThreatSource.Utils
{
public double MinU, MinV, MaxU, MaxV;
public double AverageDepth; // 新增:投影物体顶点的平均深度
- public double Width => MaxU - MinU;
- public double Height => MaxV - MinV;
- public bool IsValid => Width >= 0 && Height >= 0;
+ public readonly double Width => MaxU - MinU;
+ public readonly double Height => MaxV - MinV;
+ public readonly bool IsValid => Width >= 0 && Height >= 0;
}
///
diff --git a/VERSION b/VERSION
index 0ee9c5d..a2a8e42 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.1.20
\ No newline at end of file
+1.1.21
\ No newline at end of file
diff --git a/docs/project/develop_log.md b/docs/project/develop_log.md
index 121c437..86aa264 100644
--- a/docs/project/develop_log.md
+++ b/docs/project/develop_log.md
@@ -7,6 +7,11 @@
- 事件描述
- 分析处理
+## 2025-05-24 增加了升力的影响
+- 增加了升力加速度的计算
+- 将发射、巡航、制导三个阶段汇聚到导弹基类中
+- 毫米波搜索稳定性很差,原来是 FOV 太大,使搜索速度变慢。从 45 度改为 15 度,稳定了。
+
## 2025-05-19 增加了SwerlingRCS回波模型
- 增加了SwerlingRCS回波模型
- 在毫米波制导中,用RCS特征矩阵取值
diff --git a/docs/project/tunning.md b/docs/project/tunning.md
index cd50b55..157e4c2 100644
--- a/docs/project/tunning.md
+++ b/docs/project/tunning.md
@@ -488,3 +488,56 @@
- 使用SwerlingRCS回波模型获取到的目标RCS,起伏比较大,有一定概率出现几倍的误差。实际观察,从 60%到 200% 都有。
- 因为扫描周期较长(360度每秒),所以偏离较大的RCS,对跟踪和锁定有一定影响。
+
+## 增加了升力加速度计算之后的实验记录
+
+时间:2025-05-24 10:00:00
+版本:v1.1.21
+
+### 实验结果
+1. 末敏弹
+ - 爆炸半径:5 米
+ - 分离散布范围:10米
+ - 减速加速度:150 m/s²
+ - 降落伞减速度:95 m/s²
+
+ - 发射加速度:0 m/s²
+ - 发动机最大燃烧时间:0 秒
+2. 激光驾束
+ - 发射加速度:100 m/s²
+ - 发动机最大燃烧时间:3.0 秒
+ - 巡航时间:0 秒
+3. 红外指令
+ - 发射加速度:150 m/s²
+ - 发动机最大燃烧时间:2.0 秒
+ - 巡航时间:2 秒
+4. 红外热成像
+ - 发射加速度:100 m/s²
+ - 发动机最大燃烧时间:2.5 秒
+ - 巡航时间:3.0 秒
+
+ - 发射角度:0.12 弧度(此时巡航高度 150 米,制导阶段起始角度-0.01弧度)
+5. 毫米波末制导
+ - 发射加速度:100 m/s²
+ - 发动机最大燃烧时间:2.5 秒
+ - 巡航时间:3.0 秒
+
+ - 发射角度:0.05 弧度(此时巡航高度 15 米,制导阶段起始角度-0.02弧度,搜索视场角 15 度)
+
+6. 激光半主动
+ - 比例引导系数:3
+ - 发射加速度:0.0 m/s²
+ - 发动机最大燃烧时间:0.0 秒
+ - 巡航时间:10.0 秒
+
+ - 发射距离:10000 m
+ - 发射速度:700 m/s
+ - 发射角度:Math.PI/20(大约 3 度)
+7. 复合制导
+ - 发射加速度:100 m/s²
+ - 发动机最大燃烧时间:2.5 秒
+ - 巡航时间:3.0 秒
+
+ - 发射角度:0.05 弧度(此时巡航高度 15 米,制导阶段起始角度-0.02弧度,毫米波搜索视场角 15 度)
+
+
diff --git a/missile_lift_model.md b/missile_lift_model.md
new file mode 100644
index 0000000..22aa878
--- /dev/null
+++ b/missile_lift_model.md
@@ -0,0 +1,76 @@
+# 上下文
+文件名:[missile_lift_model.md]
+创建于:[2024-05-23T10:00:00Z]
+创建者:[AI]
+
+# 任务描述
+用户请求设计并实现导弹的升力加速度模型。
+升力加速度az =(功角a - 5 度)* 1 米每秒的平方。
+功角 a 的范围是大于等于负 5 度且小于等于 15 度。在其他情况下,az=0。
+功角 a 定义为导弹速度矢量与XY平面(水平面)的夹角。
+升力加速度作用在导弹的垂直方向(垂直于速度矢量,并在由速度矢量和世界Y轴定义的平面内)。
+
+# 项目概述
+项目为一个导弹仿真系统,需要修改导弹基类及其运动算法来集成新的升力模型。
+
+---
+*以下部分由 AI 在协议执行过程中维护*
+---
+
+# 分析 (由 RESEARCH 模式填充)
+- 升力计算的核心位置在 `BaseMissile.cs` 的 `CalculateAcceleration` 方法。
+- 攻角 (alpha) 用户定义为速度矢量与水平面 (XZ平面,假设Y为垂直轴) 的夹角。
+- 升力方向垂直于速度矢量,并位于由速度矢量和世界Y轴(`Vector3D.UnitY`)定义的平面内。
+- `MotionAlgorithm.cs` 是存放运动相关计算的工具类。
+
+# 提议的解决方案 (由 INNOVATE 模式填充)
+方案:在 `MotionAlgorithm.cs` 中增加计算攻角和升力矢量的方法。在 `BaseMissile.cs` 中调用这些方法并将升力加入总加速度。
+
+# 实施计划 (由 PLAN 模式生成)
+见下方实施检查清单。
+
+实施检查清单:
+1. **在 `ThreatSource/src/Utils/MotionAlgorithm.cs` 中**:
+ 1. 创建 `public static double CalculateAngleOfAttackFromHorizontal(Vector3D velocity)` 方法。
+ * 输入: `Vector3D velocity`。
+ * 计算水平速度大小 `horizontalMagnitude = Math.Sqrt(velocity.X * velocity.X + velocity.Z * velocity.Z)`。
+ * 处理 `horizontalMagnitude < 1e-6` 的情况:
+ * If `velocity.Y > 0`, return `Math.PI / 2`.
+ * If `velocity.Y < 0`, return `-Math.PI / 2`.
+ * Else, return `0.0`.
+ * 否则,计算 `alpha_rad = Math.Atan2(velocity.Y, horizontalMagnitude)`。
+ * Return `alpha_rad`.
+2. **在 `ThreatSource/src/Utils/MotionAlgorithm.cs` 中**:
+ 1. 创建 `public static Vector3D CalculateLiftAccelerationVector(Vector3D velocity, double angleOfAttackDegrees)` 方法。
+ * 输入: `Vector3D velocity`, `double angleOfAttackDegrees`.
+ * 定义常量: `MIN_AOA_DEG = -5.0`, `MAX_AOA_DEG = 15.0`, `AOA_OFFSET_DEG = 5.0`.
+ * 计算 `az_magnitude`:
+ * If `angleOfAttackDegrees >= MIN_AOA_DEG && angleOfAttackDegrees <= MAX_AOA_DEG`:
+ * `az_magnitude = (angleOfAttackDegrees - AOA_OFFSET_DEG) * 1.0`.
+ * Else:
+ * `az_magnitude = 0.0`.
+ * If `Math.Abs(az_magnitude) < 1e-6 || velocity.MagnitudeSquared() < 1e-9`, return `Vector3D.Zero`.
+ * 定义 `WorldUp = Vector3D.UnitY`.
+ * `velocityNormalized = velocity.Normalize()`.
+ * `RightVec = Vector3D.CrossProduct(velocityNormalized, WorldUp)`.
+ * If `RightVec.MagnitudeSquared() < 1e-9`, return `Vector3D.Zero` (处理垂直飞行情况).
+ * `LiftDir = Vector3D.CrossProduct(RightVec, velocityNormalized).Normalize()`.
+ * `liftAcceleration = LiftDir * az_magnitude`.
+ * Return `liftAcceleration`.
+3. **在 `ThreatSource/src/Missile/BaseMissile.cs` 的 `CalculateAcceleration(Vector3D velocity)` 方法中**:
+ 1. 在计算 `totalAcceleration` 之前,获取当前速度 `currentMissileVelocity = velocity` (或直接用 `velocity` 参数)。
+ 2. 计算攻角(度): `double currentAoARad = MotionAlgorithm.CalculateAngleOfAttackFromHorizontal(currentMissileVelocity);`
+ 3. `double currentAoADegrees = currentAoARad * 180.0 / Math.PI;`
+ 4. 计算升力加速度矢量: `Vector3D liftAcceleration = MotionAlgorithm.CalculateLiftAccelerationVector(currentMissileVelocity, currentAoADegrees);`
+ 5. 修改 `totalAcceleration` 的计算公式,加入 `liftAcceleration`:
+ `Vector3D totalAcceleration = GuidanceAcceleration + ThrustAcceleration + dragAcceleration + GravityAcceleration + liftAcceleration;`
+ 6. 更新 `Debug.WriteLine` 语句,包含 `liftAcceleration` 的值。例如,在原有的基础上追加 `$", 升力: {liftAcceleration}"`。
+
+# 当前执行步骤 (由 EXECUTE 模式在开始执行某步骤时更新)
+> 正在执行: "1. 在 `ThreatSource/src/Utils/MotionAlgorithm.cs` 中:1. 创建 `public static double CalculateAngleOfAttackFromHorizontal(Vector3D velocity)` 方法。"
+
+# 任务进度 (由 EXECUTE 模式在每步完成后追加)
+* [待填写]
+
+# 最终审查 (由 REVIEW 模式填充)
+[待填写]
\ No newline at end of file
diff --git a/tools/ComprehensiveMissileSimulator.cs b/tools/ComprehensiveMissileSimulator.cs
index 62aeef5..33db8e4 100644
--- a/tools/ComprehensiveMissileSimulator.cs
+++ b/tools/ComprehensiveMissileSimulator.cs
@@ -119,62 +119,63 @@ namespace ThreatSource.Tools.MissileSimulation
///
private void InitializeMissileJammingMap()
{
- missileJammingMap = new Dictionary>();
-
- // 激光驾束导弹
- missileJammingMap["LBRM_1"] =
+ missileJammingMap = new Dictionary>
+ {
+ // 激光驾束导弹
+ ["LBRM_1"] =
[
(JammingType.Laser, "激光干扰", "LaserJammer_Designator", "阻塞", "驾束仪"),
(JammingType.SmokeGrenade, "烟幕弹", "SG_1", "遮蔽", "驾束仪")
- ];
-
- // 激光半主动制导导弹
- missileJammingMap["LSGM_1"] =
+ ],
+
+ // 激光半主动制导导弹
+ ["LSGM_1"] =
[
(JammingType.Laser, "激光干扰(指示器)", "LaserJammer_Designator", "阻塞", "指示器"),
(JammingType.Laser, "激光干扰(导弹)", "LaserJammer_Missile", "阻塞", "导弹"),
(JammingType.LaserDecoy, "激光诱偏目标", "LDY_1", "欺骗", "导弹"),
(JammingType.SmokeGrenade, "烟幕弹", "SG_1", "遮蔽", "两者")
- ];
-
- // 红外指令制导导弹
- missileJammingMap["ICGM_1"] =
+ ],
+
+ // 红外指令制导导弹
+ ["ICGM_1"] =
[
(JammingType.Infrared, "红外干扰", "InfraredJammer_Designator", "阻塞", "指示器"),
(JammingType.SmokeGrenade, "烟幕弹", "SG_2", "遮蔽", "指示器")
- ];
-
- // 红外成像末制导导弹
- missileJammingMap["ITGM_1"] =
+ ],
+
+ // 红外成像末制导导弹
+ ["ITGM_1"] =
[
(JammingType.Infrared, "红外干扰", "InfraredJammer_Missile", "阻塞", "导弹"),
(JammingType.SmokeGrenade, "红外烟幕弹", "SG_2", "遮蔽", "导弹")
- ];
-
- // 毫米波末制导导弹
- missileJammingMap["MMWG_1"] =
+ ],
+
+ // 毫米波末制导导弹
+ ["MMWG_1"] =
[
(JammingType.MillimeterWave, "毫米波干扰", "MillimeterWaveJammer_Missile", "阻塞", "导弹"),
(JammingType.SmokeGrenade, "烟幕弹", "SG_3", "遮蔽", "导弹")
- ];
-
- // 末敏子弹药
- missileJammingMap["TSM_1"] =
+ ],
+
+ // 末敏子弹药
+ ["TSM_1"] =
[
(JammingType.Laser, "激光干扰", "LaserJammer_Submunition", "阻塞", "子弹药"),
(JammingType.Infrared, "红外干扰", "InfraredJammer_Submunition", "阻塞", "子弹药"),
(JammingType.MillimeterWave, "毫米波干扰", "MillimeterWaveJammer_Submunition", "阻塞", "子弹药"),
(JammingType.MillimeterWave, "毫米波假信号", "MillimeterWaveCompensationJammer_Submunition", "欺骗", "子弹药"),
(JammingType.SmokeGrenade, "烟幕弹", "SG_4", "遮蔽", "子弹药")
- ];
+ ],
- // 复合制导导弹
- missileJammingMap["CGGM_1"] =
+ // 复合制导导弹
+ ["CGGM_1"] =
[
(JammingType.MillimeterWave, "毫米波干扰", "MillimeterWaveJammer_Missile", "阻塞", "导弹"),
(JammingType.Infrared, "红外干扰", "InfraredJammer_Missile", "阻塞", "导弹"),
(JammingType.SmokeGrenade, "烟幕弹", "SG_1", "遮蔽", "导弹")
- ];
+ ]
+ };
}
///
@@ -233,7 +234,7 @@ namespace ThreatSource.Tools.MissileSimulation
{
Position = new Vector3D(0, 1.2, 0),
Orientation = new Orientation(0.0, 0.0, 0.0),
- Speed = 1.0
+ Speed = 2.0
};
string targetId = "Tank_1";
var target = _threatSourceFactory.CreateEquipment(targetId, "mbt_001", motionParameters);
@@ -323,8 +324,8 @@ namespace ThreatSource.Tools.MissileSimulation
{
var motionParameters = new KinematicState
{
- Position = new Vector3D(10000, 10, 10),
- Orientation = new Orientation(Math.PI/2, Math.PI/18, 0),
+ Position = new Vector3D(10000, 1, 10),
+ Orientation = new Orientation(Math.PI/2, Math.PI/20, 0),
Speed = 700
};
string missileId = "LSGM_1";
@@ -342,7 +343,7 @@ namespace ThreatSource.Tools.MissileSimulation
var motionParameters = new KinematicState
{
Position = new Vector3D(2000, 1, 10),
- Orientation = new Orientation(Math.PI/2, 0.1, 0.0),
+ Orientation = new Orientation(Math.PI/2, 0.04, 0.0),
Speed = 10
};
string missileId = "LBRM_1";
@@ -359,7 +360,7 @@ namespace ThreatSource.Tools.MissileSimulation
{
var motionParameters = new KinematicState
{
- Position = new Vector3D(3000, 0, 20),
+ Position = new Vector3D(3000, 1, 20),
Orientation = new Orientation(Math.PI/2, 0.0, 0.0),
Speed = 700
};
@@ -380,7 +381,7 @@ namespace ThreatSource.Tools.MissileSimulation
var motionParameters = new KinematicState
{
Position = new Vector3D(2000, 1, 20),
- Orientation = new Orientation(Math.PI/2, 0.15, 0),
+ Orientation = new Orientation(Math.PI/2, 0.05, 0),
Speed = 10
};
@@ -399,7 +400,7 @@ namespace ThreatSource.Tools.MissileSimulation
var motionParameters = new KinematicState
{
Position = new Vector3D(2000, 1, 0),
- Orientation = new Orientation(Math.PI/2, 0.2, 0),
+ Orientation = new Orientation(Math.PI/2, 0.12, 0),
Speed = 10
};
string missileId = "ITGM_1";
@@ -417,7 +418,7 @@ namespace ThreatSource.Tools.MissileSimulation
var motionParameters = new KinematicState
{
Position = new Vector3D(2000, 1, 20),
- Orientation = new Orientation(Math.PI/2, 0.2, 0),
+ Orientation = new Orientation(Math.PI/2, 0.05, 0),
Speed = 10
};
string missileId = "MMWG_1";
@@ -435,7 +436,7 @@ namespace ThreatSource.Tools.MissileSimulation
var motionParameters = new KinematicState
{
Position = new Vector3D(2000, 1, 20),
- Orientation = new Orientation(Math.PI/2, 0.2, 0),
+ Orientation = new Orientation(Math.PI/2, 0.05, 0),
Speed = 10
};
string missileId = "CGGM_1";
@@ -484,7 +485,7 @@ namespace ThreatSource.Tools.MissileSimulation
Orientation = new Orientation(Math.PI/2, 0, 0),
Speed = 0
};
- var infraredTracker = _threatSourceFactory.CreateIndicator(infraredTrackerId, "ir_001", "Tank_1", "ITGM_1", infraredTrackerLaunchParams);
+ var infraredTracker = _threatSourceFactory.CreateIndicator(infraredTrackerId, "ir_001", "Tank_1", "ICGM_1", infraredTrackerLaunchParams);
indicators[infraredTrackerId] = (SimulationElement)infraredTracker;
simulationManager.RegisterEntity(infraredTrackerId, infraredTracker);
Console.WriteLine($"注册红外测角仪 {infraredTrackerId}");
@@ -1313,7 +1314,7 @@ namespace ThreatSource.Tools.MissileSimulation
Console.WriteLine($"未知组件 ({entity.GetType().Name})");
}
}
- Console.WriteLine($"总计: {allEntities.Count()} 个组件");
+ Console.WriteLine($"总计: {allEntities.Count} 个组件");
}
///