- 修改了版本号格式(0.2.18 -> 1.1.18)

- 修改了日志输出格式
- 飞行全程增加重力加速度
- 完善发射段的推力加速度计算
- 修改各导弹配置文件的初始发射速度、发动机燃烧时间
- 修改集成测试中导弹的发射距离、发射高度、发射角度
This commit is contained in:
Tian jianyong 2025-05-14 20:23:57 +08:00
parent e1d2ea4eac
commit bece0866b3
15 changed files with 193 additions and 35 deletions

View File

@ -16,6 +16,13 @@
- 多种发射弹道模式:低平弹道、高抛弹道、俯冲弹道
- 双模、多模制导
## [1.1.18] - 2025-05-14
- 修改了版本号格式0.2.18 -> 1.1.18
- 修改了日志输出格式
- 飞行全程增加重力加速度
- 完善发射段的推力加速度计算
- 修改各导弹配置文件的初始发射速度、发动机燃烧时间
- 修改集成测试中导弹的发射距离、发射高度、发射角度
## [0.2.17] - 2025-05-11
- Orientation 坐标系的调整前向方向从X轴改为Z轴

View File

@ -4,10 +4,10 @@
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Version>1.0.0</Version>
<Version>1.1.0</Version>
<Product>ThreatSource Library</Product>
<Description>A comprehensive library for missile simulation and threat source modeling.</Description>
<Copyright>Copyright © 2024</Copyright>
<Copyright>Copyright © 2025</Copyright>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

View File

@ -11,9 +11,9 @@ MaxSpeed = 300.0 # 最大速度 (米/秒)
MaxFlightTime = 60.0 # 最大飞行时间 (秒)
MaxFlightDistance = 5000.0 # 最大飞行距离 (米)
MaxAcceleration = 100.0 # 最大加速度 (米/秒^2)
ProportionalNavigationCoefficient = 3.0 # 比例导引系数
ProportionalNavigationCoefficient = 4.0 # 比例导引系数
LaunchAcceleration = 100.0 # 发射加速度 (米/秒^2)
MaxEngineBurnTime = 0.1 # 最大发动机燃烧时间 (秒)
MaxEngineBurnTime = 3.0 # 最大发动机燃烧时间 (秒)
CruiseTime = 5.0 # 巡航时间 (秒)
Mass = 23.5 # 质量 (千克)
ExplosionRadius = 5.0 # 爆炸半径 (米)

View File

@ -13,7 +13,7 @@ MaxFlightDistance = 5000.0
MaxAcceleration = 100.0
ProportionalNavigationCoefficient = 3.0
LaunchAcceleration = 100.0
MaxEngineBurnTime = 0.1
MaxEngineBurnTime = 2.5
CruiseTime = 5.0
Mass = 25.0
ExplosionRadius = 5.5

View File

@ -13,7 +13,7 @@ MaxFlightDistance = 5000.0 # 最大飞行距离 (米)
MaxAcceleration = 100.0 # 最大加速度 (米/秒^2)
ProportionalNavigationCoefficient = 3.0 # 比例导引系数
LaunchAcceleration = 100.0 # 发射加速度 (米/秒^2)
MaxEngineBurnTime = 0.1 # 最大发动机燃烧时间 (秒)
MaxEngineBurnTime = 3.0 # 最大发动机燃烧时间 (秒)
CruiseTime = 5.0 # 巡航时间 (秒)
Mass = 24.5 # 质量 (千克)
ExplosionRadius = 5.0 # 爆炸半径 (米)
@ -33,8 +33,8 @@ DetectorDiameter = 0.03 # 探测器直径 (米)
ControlFieldDiameter = 20.0 # 控制视场直径 (米, 通常指在某一距离上的光斑直径)
ProportionalGain = 30.0 # 比例增益
IntegralGain = 0.05 # 积分增益
DerivativeGain = 5.0 # 微分增益
NonlinearGain = 0.5 # 非线性增益
DerivativeGain = 10.0 # 微分增益
NonlinearGain = 0.3 # 非线性增益
MaxGuidanceAcceleration = 50.0 # 最大制导加速度 (米/秒^2)
LowPassFilterCoefficient = 0.2 # 低通滤波器系数
Wavelength = 1.06 # 工作波长 (微米)

View File

@ -10,7 +10,7 @@ En = "Laser Semi-Active Guidance Missile-001"
Type = "LaserSemiActiveGuidance" # properties内部的类型标识符
MaxSpeed = 800.0 # 最大速度 (m/s)
MaxFlightTime = 60.0 # 最大飞行时间 (秒)
MaxFlightDistance = 4000.0 # 最大飞行距离 (米)
MaxFlightDistance = 20000.0 # 最大飞行距离 (米)
MaxAcceleration = 50.0 # 最大横向加速度 (m/s^2)
ProportionalNavigationCoefficient = 2.0 # 比例导引系数
LaunchAcceleration = 100.0 # 初始发射加速度 (m/s^2)

View File

@ -13,7 +13,7 @@ MaxFlightDistance = 8000.0 # 最大飞行距离 (米)
MaxAcceleration = 100.0 # 最大加速度 (米/秒^2)
ProportionalNavigationCoefficient = 3.0 # 比例导引系数
LaunchAcceleration = 100.0 # 发射加速度 (米/秒^2)
MaxEngineBurnTime = 0.1 # 最大发动机燃烧时间 (秒)
MaxEngineBurnTime = 2.5 # 最大发动机燃烧时间 (秒)
CruiseTime = 4.0 # 巡航时间 (秒)
Mass = 28.0 # 质量 (千克)
ExplosionRadius = 5.0 # 爆炸半径 (米)

View File

@ -14,7 +14,7 @@
"armorThickness": 800.0,
"radarCrossSection": 15.0,
"infraredRadiationIntensity": 250.0,
"ultravioletRadiationIntensity": 15.0,
"ultravioletRadiationIntensity": 15.0,
"millimeterWaveRadiationIntensity": 10.0,
"millimeterWaveRadiationTemperature": 150.0,
"laserReflectivity": 0.3,

View File

@ -158,6 +158,7 @@ namespace ThreatSource.Indicator
return;
}
currentTargetPosition = targetElement.KState.Position;
_lastKnownTargetPosition = currentTargetPosition; // 记录最后已知的目标位置
}
IsTracking = true;

View File

@ -139,6 +139,7 @@ namespace ThreatSource.Indicator
{
LaserDirection = newDirection;
Debug.WriteLine($"激光驾束仪 {Id} 更新激光指向: {LaserDirection}");
_lastKnownTargetPosition = targetPosition; // 记录最后已知的目标位置
PublishLaserBeamEvent();
}
}

View File

@ -99,6 +99,11 @@ namespace ThreatSource.Missile
/// </remarks>
protected Vector3D ThrustAcceleration { get; set; }
/// <summary>
/// 重力加速度(北京标准值)
/// </summary>
private static readonly Vector3D GravityAcceleration = new Vector3D(0, -9.8015, 0);
/// <summary>
/// 获取导弹的固定配置参数
/// </summary>
@ -134,12 +139,16 @@ namespace ThreatSource.Missile
Properties = properties;
// 初始化状态
EngineBurnTime = 0;
FlightTime = 0;
FlightDistance = 0;
IsActive = false;
IsGuidance = false;
GuidanceAcceleration = Vector3D.Zero;
ThrustAcceleration = Vector3D.Zero;
// 计算初始推力加速度
Vector3D launchDirection = kinematicState.Orientation.ToVector().Normalize();
ThrustAcceleration = launchDirection * properties.LaunchAcceleration;
}
/// <summary>
@ -179,6 +188,21 @@ namespace ThreatSource.Missile
/// </remarks>
protected virtual void UpdateMotionState(double deltaTime)
{
// 检查发动机是否仍在提供推力
if (ThrustAcceleration != Vector3D.Zero)
{
EngineBurnTime += deltaTime; // 累加燃烧时间
if (EngineBurnTime >= Properties.MaxEngineBurnTime || KState.Speed >= Properties.MaxSpeed)
{
string reason = EngineBurnTime >= Properties.MaxEngineBurnTime ?
$"达到最大燃烧时间({Properties.MaxEngineBurnTime}s)" :
$"达到最大速度({KState.Speed:F2}m/s >= {Properties.MaxSpeed}m/s)";
Debug.WriteLine($"导弹 {Id}: 发动机推力已于飞行时间 {FlightTime:F2}s 关闭。原因: {reason}");
ThrustAcceleration = Vector3D.Zero; // 关闭推力
}
}
// 计算包含风影响的合加速度
Vector3D acceleration = CalculateAcceleration(KState.Velocity);
@ -216,7 +240,7 @@ namespace ThreatSource.Missile
/// 计算过程:
/// - 获取当前风速向量
/// - 计算空气阻力加速度(已考虑风)
/// - 合成总加速度(制导加速度 + 推力加速度 + 空气阻力加速度
/// - 合成总加速度(制导加速度 + 推力加速度 + 空气阻力加速度 + 重力加速度
/// - 限制合加速度不超过最大值
/// </remarks>
private Vector3D CalculateAcceleration(Vector3D velocity)
@ -227,11 +251,11 @@ namespace ThreatSource.Missile
// 计算空气阻力加速度(考虑风的影响)
Vector3D dragAcceleration = CalculateDragAcceleration(velocity, windVector);
// 合成总加速度(制导加速度 + 推力加速度 + 空气阻力加速度
Vector3D totalAcceleration = GuidanceAcceleration + ThrustAcceleration + dragAcceleration;
// 合成总加速度(制导加速度 + 推力加速度 + 空气阻力加速度 + 重力加速度
Vector3D totalAcceleration = GuidanceAcceleration + ThrustAcceleration + dragAcceleration + GravityAcceleration;
Debug.WriteLine($"导弹 {Id} 的加速度: {totalAcceleration}, 制导加速度: {GuidanceAcceleration}, " +
$"推力加速度: {ThrustAcceleration}, 空力加速度(含风影响): {dragAcceleration}");
Debug.WriteLine($"导弹 {Id} 的加速度: {totalAcceleration}, 制导: {GuidanceAcceleration}, " +
$"推力: {ThrustAcceleration}, 空阻(含风): {dragAcceleration}, 重力: {GravityAcceleration}");
if (totalAcceleration.Magnitude() > Properties.MaxAcceleration)
{

View File

@ -1 +1 @@
0.2.17
1.1.18

View File

@ -331,4 +331,87 @@
2. 坦克速度 0.5米/秒,仿真运行 29.7 秒,命中
3. 坦克速度 1米/秒,仿真运行 38 秒,自毁
## 激光驾束导弹实验记录v1.1.18
时间2025-05-14 10:00:00
版本v1.1.18
### 运行过程
导弹最大制导加速度, 50 时出现失控,将其增加到 100击中目标最大制导加速度为 77
### 实验结论
1. 导弹最大制导加速度50 不够,需要将其增加到 100
## 激光半主动导弹实验记录v1.1.18
时间2025-05-14 10:00:00
版本v1.1.18
### 运行过程
调整发射角度,使其模仿真实环境的发射角度
距离 10000米发射角度 30度导弹速度 500米/秒,导弹无法锁定,飞出范围。
距离 10000米发射角度 15度导弹速度 500米/秒,导弹锁定目标,击中目标。
距离 10000米发射角度 10度导弹速度 500米/秒,导弹锁定目标,击中目标。
距离 10000米发射角度 10度导弹速度 600米/秒,导弹锁定目标,击中目标。
上述锁定距离在 2300 米左右。
### 实验结论
1. 导弹在无制导阶段,做抛物线运动,需要调整发射距离、速度和角度,使得导弹在制导阶段锁定目标。
2. 如果要调整锁定距离,可以调整导弹导引头锁定阈值,实验是 1e-7。
## 红外指令制导导弹实验记录v1.1.18
时间2025-05-14 10:00:00
版本v1.1.18
### 运行过程
发射高度 1米发射角度 0.01,导弹很快落地(因为加了重力)
修改引导系数从 3 到 4发射角度改到 0.2,导弹最低高度大于 0
修改最大发动机助推时间从 0.1 到 3发射角度改为 0.15,最大高度 30 米,最低高度大于 0击中目标
### 实验结论
1. 因为重力影响,原有的发射速度
## 激光驾束导弹实验记录v1.1.18
时间2025-05-14 10:00:00
版本v1.1.18
### 发射参数
- 发射高度1米
- 发射角度0.1
- 导弹初速度10米/秒
- 加速时间3秒
- 导弹最大制导加速度100 m/s²
### 原有的参数,效果不佳,最低高度在 0 以下。
- 比例系数(Kp)30用于控制系统对误差的敏感度和响应速度
- 积分系数(Ki)0.05,用于消除长期误差
- 微分系数(Kd)5用于减少超调量提高系统稳定性
- 非线性增益系数(Kc)0.5,用于控制偏移量修正
- 最大加速度限制50 m/s²
- 低通滤波系数(alpha)0.2
### 调整后的参数,最低高度在 0.6 米以上
- 微分系数(Kd)10用于减少超调量提高系统稳定性
- 非线性增益系数(Kc)0.3,用于控制偏移量修正
## 红外制导导弹和毫米波制导导弹实验记录v1.1.18
时间2025-05-14 10:00:00
版本v1.1.18
### 导弹合理发射参数
- 发射高度1米
- 发射角度0.2
- 导弹初速度10米/秒
- 加速时间2.5秒
- 导弹最大制导加速度100 m/s²

View File

@ -34,7 +34,7 @@ namespace ThreatSource.Tools.MissileSimulation
private readonly Dictionary<string, SimulationElement> indicators;
private readonly Dictionary<string, BaseJammer> jammers;
private readonly Dictionary<string, bool> missileActiveStatus;
private readonly double timeStep = 0.005; // 时间步长,单位:秒
public double TimeStep { get; set; } = 0.02; // 时间步长,单位:秒,默认为低精度
// 导弹-干扰映射表
private Dictionary<string, List<(JammingType Type, string DisplayName, string JammerId, string Mode, string Target)>> missileJammingMap;
@ -318,9 +318,9 @@ namespace ThreatSource.Tools.MissileSimulation
{
var motionParameters = new KinematicState
{
Position = new Vector3D(2000, 10, 10),
Orientation = new Orientation(Math.PI/2, -0.01, 0),
Speed = 700
Position = new Vector3D(10000, 10, 10),
Orientation = new Orientation(Math.PI/2, Math.PI/12, 0),
Speed = 500
};
string missileId = "LSGM_1";
var missile = _threatSourceFactory.CreateMissile(missileId, "lsgm_001", "Tank_1", motionParameters);
@ -336,9 +336,9 @@ namespace ThreatSource.Tools.MissileSimulation
{
var motionParameters = new KinematicState
{
Position = new Vector3D(2000, 10, 10),
Orientation = new Orientation(Math.PI/2, -0.01, 0.0),
Speed = 300
Position = new Vector3D(2000, 1, 10),
Orientation = new Orientation(Math.PI/2, 0.1, 0.0),
Speed = 10
};
string missileId = "LBRM_1";
var missile = _threatSourceFactory.CreateMissile(missileId, "hj10", "Tank_1", motionParameters);
@ -375,8 +375,8 @@ namespace ThreatSource.Tools.MissileSimulation
var motionParameters = new KinematicState
{
Position = new Vector3D(2000, 1, 20),
Orientation = new Orientation(Math.PI/2, 0.01, 0),
Speed = 300
Orientation = new Orientation(Math.PI/2, 0.15, 0),
Speed = 10
};
string missileId = "ICGM_1";
@ -393,9 +393,9 @@ namespace ThreatSource.Tools.MissileSimulation
{
var motionParameters = new KinematicState
{
Position = new Vector3D(2000, 10, 0),
Orientation = new Orientation(Math.PI/2, -0.001, 0),
Speed = 300
Position = new Vector3D(2000, 1, 0),
Orientation = new Orientation(Math.PI/2, 0.2, 0),
Speed = 10
};
string missileId = "ITGM_1";
var missile = _threatSourceFactory.CreateMissile(missileId, "itg_001", "Tank_1", motionParameters);
@ -412,8 +412,8 @@ namespace ThreatSource.Tools.MissileSimulation
var motionParameters = new KinematicState
{
Position = new Vector3D(2000, 1, 20),
Orientation = new Orientation(Math.PI/2, 0.01, 0),
Speed = 300
Orientation = new Orientation(Math.PI/2, 0.2, 0),
Speed = 10
};
string missileId = "MMWG_1";
var missile = _threatSourceFactory.CreateMissile(missileId, "mmw_001", "Tank_1", motionParameters);
@ -1047,12 +1047,12 @@ namespace ThreatSource.Tools.MissileSimulation
PrintSimulationRegisteredComponents();
// 启动仿真系统
simulationManager.StartSimulation(timeStep);
simulationManager.StartSimulation(this.TimeStep);
while (simulationManager.State == SimulationState.Running)
{
// 让仿真管理器统一处理所有实体的更新
simulationManager.Update(timeStep);
simulationManager.Update(this.TimeStep);
// 检查是否还有活跃的导弹
var activeMissiles = simulationManager.GetEntitiesByType<BaseMissile>()
@ -1069,7 +1069,7 @@ namespace ThreatSource.Tools.MissileSimulation
// 打印状态
PrintSimulationStatus();
Thread.Sleep((int)(timeStep * 1000));
Thread.Sleep((int)(TimeStep * 1000));
}
}

View File

@ -51,6 +51,7 @@ namespace ThreatSource.Tools.MissileSimulation
Console.WriteLine($"3. 配置干扰 {simulator.GetActiveJammingDescription()} {(string.IsNullOrEmpty(simulator.SelectedMissileId) ? "()" : "")}");
Console.WriteLine($"4. 设置日志级别 (当前级别: {simulator.CurrentLogLevel})");
Console.WriteLine($"5. 开始仿真 {(string.IsNullOrEmpty(simulator.SelectedMissileId) ? "()" : "")}");
Console.WriteLine($"6. 设置仿真步长 (当前: {simulator.TimeStep}s)");
Console.WriteLine("0. 退出程序");
Console.Write("\n请选择: ");
string choice = Console.ReadLine()?.ToLower() ?? string.Empty;
@ -85,6 +86,9 @@ namespace ThreatSource.Tools.MissileSimulation
Console.WriteLine("请先选择导弹并完成基本配置 (选择导弹是启动仿真的最低要求)。");
}
break;
case "6":
ConfigureTimeStep(simulator);
break;
case "0":
exitProgram = true;
break;
@ -349,5 +353,43 @@ namespace ThreatSource.Tools.MissileSimulation
}
}
}
static void ConfigureTimeStep(ComprehensiveMissileSimulator simulator)
{
bool backToMainMenu = false;
while (!backToMainMenu)
{
Console.WriteLine("\n--- 设置仿真步长 ---");
Console.WriteLine($"当前步长: {simulator.TimeStep}s");
Console.WriteLine("1. 低精度 (0.02s)");
Console.WriteLine("2. 中精度 (0.01s)");
Console.WriteLine("3. 高精度 (0.005s)");
Console.WriteLine("0. 返回主菜单");
Console.Write("请选择步长: ");
string input = Console.ReadLine()?.ToLower() ?? string.Empty;
switch (input)
{
case "1":
simulator.TimeStep = 0.02;
Console.WriteLine($"仿真步长已设置为: {simulator.TimeStep}s (低精度)");
return; // 设置后返回主菜单
case "2":
simulator.TimeStep = 0.01;
Console.WriteLine($"仿真步长已设置为: {simulator.TimeStep}s (中精度)");
return; // 设置后返回主菜单
case "3":
simulator.TimeStep = 0.005;
Console.WriteLine($"仿真步长已设置为: {simulator.TimeStep}s (高精度)");
return; // 设置后返回主菜单
case "0":
backToMainMenu = true;
break;
default:
Console.WriteLine("无效选择,请重试。");
break;
}
}
}
}
}