diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..f6a37a2 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,40 @@ +# 变更日志 + +所有重要的变更都会记录在这个文件中。 + +格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/)。 +版本规范基于 [Semantic Versioning](https://semver.org/lang/zh-CN/)。 + +## [0.2.1] - 2025-01-10 + +### 功能优化 + +- 传感器参数优化分析功能 +- 视场角影响分析 +- 径向误差分析 + +### 参数调整 + +- 调整传感器视场角为2.5°(折中选择) +- 记录不同视场角下的探测性能数据 + +### 问题发现 + +- 视场角对首次探测高度的影响(10°: 124.01m vs 1°: 93.89m) +- 第二圈扫描时的固定径向误差问题 + +## [0.2.0] - 2024-12-20 + +### 传感器功能 + +- 多传感器融合系统 +- 螺旋扫描搜索功能 +- 目标探测和识别功能 + +## [0.1.0] - 2024-11-30 + +### 基础功能 + +- 基础导弹运动学模型 +- 飞行阶段控制 +- 基本制导功能 diff --git a/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs b/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs index 7e9eff3..192f2e6 100644 --- a/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs +++ b/ThreatSource/src/MIssile/TerminalSensitiveSubmunition.cs @@ -252,8 +252,8 @@ namespace ThreatSource.Missile scanDirection = new Vector3D(0, 0, 1).Normalize(); // 初始化传感器 - infraredDetector = new InfraredDetector(this, 500, InfraredBand.Short, 2.5); // 红外探测器,探测距离 500 米,近红外,视场角1度 - radiometer = new MillimeterWaveRadiometer(this, 500, MillimeterWaveBand.Band3, 2.5); // 毫米波辐射计,探测距离500米,工作波段3mm,扫描视场角1度 + infraredDetector = new InfraredDetector(this, 500, InfraredBand.Short, 1); // 红外探测器,探测距离 500 米,近红外,视场角20度 + radiometer = new MillimeterWaveRadiometer(this, 500, MillimeterWaveBand.Band3, 1); // 毫米波辐射计,探测距离500米,工作波段3mm,扫描视场角20度 altimeter = new MillimeterWaveAltimeter(this, 1000, MillimeterWaveBand.Band8, 0.5, 25); // 毫米波测高仪,测量精度0.5米 rangefinder = new LaserRangefinder(this, 500, 1.06, 100, 0.5); // 激光测距仪,测量距离500米,波长1.06µm,测量频率100Hz,测量精度0.5米 } @@ -792,12 +792,15 @@ namespace ThreatSource.Missile /// public override string GetStatus() { + // 获取目标对象并计算距离 + SimulationElement target = SimulationManager.GetEntityById(TargetId) as SimulationElement ?? throw new Exception("目标不存在"); + double distanceToTarget = (target.Position - Position).Magnitude(); + var status = $"{base.GetStatus()}\n" + $"运行状态: {currentStage}\n" + $"扫描角度: {spiralAngle * 180 / Math.PI:F2}°, 弧度值: {spiralAngle:F6}\n" + - $"目标检测: {lastDetectionTime != null}"; - - //var status = $""; + $"目标检测: {lastDetectionTime != null}\n" + + $"目标距离: {distanceToTarget:F2}米"; return status; } diff --git a/ThreatSource/src/Simulation/SimulationConfig.cs b/ThreatSource/src/Simulation/SimulationConfig.cs index 70e587e..248919a 100644 --- a/ThreatSource/src/Simulation/SimulationConfig.cs +++ b/ThreatSource/src/Simulation/SimulationConfig.cs @@ -71,30 +71,30 @@ namespace ThreatSource.Simulation } /// - /// 激光波束制导仪配置类,用于设置激光波束制导系统的参数 + /// 激光驾束仪配置类,用于设置激光驾束仪的参数 /// /// - /// 该类定义了波束制导系统的关键参数: + /// 该类定义了激光驾束仪的关键参数: /// - 设备标识 /// - 发射位置 /// - 激光功率 /// - 控制场尺寸 /// - 最大制导距离 - /// 这些参数决定了波束制导系统的性能和工作范围 + /// 这些参数决定了激光驾束仪的性能和工作范围 /// public class LaserBeamRiderConfig { /// - /// 获取或设置激光波束制导仪的唯一标识符 + /// 获取或设置激光驾束仪的唯一标识符 /// /// /// 在仿真系统中必须唯一 - /// 用于标识和查找特定的波束制导仪 + /// 用于标识和查找特定的驾束仪 /// public string Id { get; set; } /// - /// 获取或设置波束制导仪的初始位置 + /// 获取或设置驾束仪的初始位置 /// /// /// 使用三维向量表示空间位置 @@ -125,12 +125,12 @@ namespace ThreatSource.Simulation /// /// /// 单位:米 - /// 定义了波束制导系统的最大有效工作距离 + /// 定义了驾束仪的最大有效工作距离 /// public double MaxGuidanceDistance { get; set; } /// - /// 初始化激光波束制导仪配置的新实例 + /// 初始化激光驾束仪配置的新实例 /// /// /// 设置默认值: diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..5a78111 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.2.1 \ No newline at end of file diff --git a/docs/articles/threat-source-spec.md b/docs/articles/threat-source-spec.md index 937fd46..0850714 100644 --- a/docs/articles/threat-source-spec.md +++ b/docs/articles/threat-source-spec.md @@ -370,7 +370,7 @@ graph TB - 维护照射状态(IsIlluminationOn) - 发布照射状态事件 - 干扰处理: - - 计算干扰效果:20*log10(干扰功率) - 20*log10(距离) - 20*log10(4π) + - 计算干扰效果:20 * log10(干扰功率) - 20 * log10(距离) - 20 * log10(4π) - 判断是否超过干扰阈值 - 超过阈值时停止照射 - 事件管理: @@ -385,19 +385,19 @@ graph TB - 目标到导弹距离:目标位置到导弹位置的欧氏距离 2. 计算光斑面积 - - 光斑面积计算公式:π *(传播距离* tan(发散角))² + - 光斑面积计算公式:π * (传播距离* tan(发散角))² - 发散角:0.3毫弧度(0.3mrad) 3. 计算目标反射 - 目标处功率密度:入射激光功率/光斑面积 - - 目标反射功率:功率密度 *有效反射面积* 反射系数 + - 目标反射功率:功率密度 * 有效反射面积 * 反射系数 4. 计算接收功率 - 反射光扩散面积:2π * 目标到导弹距离的平方 - 导弹接收初始功率:反射功率/扩散面积 - 探测器面积:π * (0.1/2)² 平方米 - 功率接收比:min(1, 探测器面积/照射面积) - - 最终接收功率:初始功率 *功率接收比* 聚焦增益 + - 最终接收功率:初始功率 * 功率接收比 * 聚焦增益 3. 导弹制导控制算法 - 比例导引控制: @@ -668,7 +668,7 @@ graph TB 2. 导弹制导控制算法 - 计算瞬时转向速率 - - 应用速率平滑:turnRate = turnRate *(1-0.5) + instantTurnRate* 0.5 + - 应用速率平滑:turnRate = turnRate * (1-0.5) + instantTurnRate* 0.5 - 计算带提前量的期望方向 - 生成并限制制导加速度 @@ -1026,7 +1026,7 @@ graph TB - 二次检测确认(0.9个扫描周期) - 攻击阶段控制: - 目标跟踪 - - 速度控制(500米/秒) + - 速度控制(2000米/秒) - 撞击点计算 3. 传感器融合算法 @@ -1091,7 +1091,7 @@ graph TB 2. 非制导状态下的运动 - 使用标准运动学方程更新位置和速度: - - 位置更新:p = p0 + v0*t + 0.5*a*t^2 + - 位置更新:p = p0 + v0 * t + 0.5 * a * t^2 - 速度更新:v = v0 + a*t - 考虑重力加速度(9.81 m/s²) - 保持最后已知速度方向 @@ -1149,7 +1149,7 @@ graph TB - 计算相对位置:r = predictedTargetPosition - missilePosition - 计算相对速度:v = targetVelocity - missileVelocity - 计算视线角速率:LOSRate = (v - (LOS * DotProduct(v, LOS))) / r.Magnitude() - - 计算制导加速度:CrossProduct(CrossProduct(LOS, LOSRate), missileVelocity.Normalize()) *coefficient* missileVelocity.Magnitude() + - 计算制导加速度:CrossProduct(CrossProduct(LOS, LOSRate), missileVelocity.Normalize()) * coefficient * missileVelocity.Magnitude() - 输出结果: - 制导加速度向量 - 是否获得有效制导 @@ -1186,7 +1186,7 @@ graph TB 2. 控制算法 - 计算期望飞行方向 - - 平滑处理转向速率:turnRate = turnRate *(1-0.5) + instantTurnRate* 0.5 + - 平滑处理转向速率:turnRate = turnRate * (1-0.5) + instantTurnRate * 0.5 - 计算带提前量的期望方向 - 生成制导加速度 @@ -1404,80 +1404,6 @@ graph TB - 外部实体获取验证 - 实体ID验证 -### 5.2 未实现的验证功能 - -#### 5.2.1 性能指标验证 - -1. 探测性能验证 - - 最大探测距离测试 - - 视场角范围测试 - - 角度测量精度验证 - - 信噪比计算验证 - -2. 制导性能验证 - - 静态目标制导精度测试 - - 运动目标制导精度测试 - - 机动目标制导精度测试 - - 响应时间测试 - - 超调量测试 - - 稳定性测试 - -3. 抗干扰性能验证 - - 电磁干扰抗性测试 - - 光学干扰抗性测试 - - 红外干扰抗性测试 - -#### 5.2.2 轨迹验证 - -1. 轨迹记录与分析 - - 轨迹数据采集 - - 轨迹平滑性分析 - - 机动特性分析 - - 能量特性分析 - -2. 制导特性分析 - - 视线角变化率分析 - - 制导指令特性分析 - - 末段机动特性分析 - -3. 打击效果分析 - - 脱靶量统计 - - 命中精度评估 - - 毁伤效果评估 - -#### 5.2.3 复杂环境验证 - -1. 大气环境影响验证 - - 标准大气条件测试 - - 极端温度条件测试 - - 复杂气象条件测试 - -2. 电磁环境验证 - - 电磁干扰环境测试 - - 多重反射环境测试 - - 杂波环境测试 - -3. 光学环境验证 - - 能见度条件测试 - - 背景辐射条件测试 - - 大气透过率测试 - -#### 5.2.4 分析工具 - -1. 数据处理工具 - - 数据预处理功能 - - 数据过滤功能 - - 数据融合功能 - -2. 可视化工具 - - 轨迹显示功能 - - 性能指标显示功能 - - 统计分析显示功能 - -3. 报告生成工具 - - 测试报告生成功能 - - 性能分析报告功能 - - 问题追踪报告功能 ## 6. 仿真接口 @@ -1592,7 +1518,7 @@ graph TB - 分离距离:1000米 - 分离范围:50米 - 初始速度:200米/秒 - - 攻击速度:500米/秒 + - 攻击速度:2000米/秒 - 螺旋扫描速度:8π弧度/秒 - 垂直下降速度:10米/秒 - 扫描锥角:30度 diff --git a/docs/project/develop_log.md b/docs/project/develop_log.md new file mode 100644 index 0000000..8da70ce --- /dev/null +++ b/docs/project/develop_log.md @@ -0,0 +1,54 @@ +# 开发日志 + +本文档以时间顺序, 记录了开发过程中的重要事件和分析、测试、DEBUG等过程。 +日志格式: + +- 日期 +- 事件描述 +- 分析处理 + +## 2024-01-09 视场角对目标探测高度的影响分析 + +在测试末敏子弹的目标探测功能时,发现视场角大小对首次探测高度有显著影响: + +1. 视场角为 10° 时: + - 首次探测高度:124.01米 + - 扫描角度:224.64° + +2. 视场角为 1° 时: + - 首次探测高度:93.89米 + - 扫描角度:224.64° + +分析结论: + +- 视场角越大,探测范围越大,可以在更高的高度发现目标 +- 视场角越小,探测范围越小,需要更接近目标才能发现 +- 两种情况下扫描角度相同(224.64°),说明目标的相对方位是一致的 +- 高度差约30米,这个差异完全符合视场角的物理特性 + +这个发现对于系统设计有重要启示: + +1. 视场角的选择需要权衡探测距离和精度 +2. 在仿真中需要考虑视场角对探测时机的影响 +3. 视场角属于固有误差,无法简单通过算法消除 + +## 2024-01-09 第二圈发射的径向误差分析 + +在分析末敏弹的打击精度时,发现当末敏弹进行第二圈螺旋扫描时会产生固定的径向误差: + +1. 误差特征: + - 表现为固定的径向偏差 + - 与目标的相对方位无关 + - 在不同仿真条件下保持稳定 + +2. 误差原因分析: + - 末敏弹在第一圈扫描时记录首次探测角度 + - 第二圈扫描到相同角度时触发攻击 + - 由于末敏弹持续下降,第二圈时的高度低于第一圈 + - 高度差导致了固定的径向误差 + - 下降速度 10m/s, 扫描周期 0.25s, 高度差 2.5m,产生的径向误差是 1.44m + +3. 与视场角的关系: + - 视场角影响首次探测高度 + - 探测高度越高,两圈之间的高度差越大 + - 因此视场角间接影响了径向误差的大小 diff --git a/docs/articles/tunning.md b/docs/project/tunning.md similarity index 61% rename from docs/articles/tunning.md rename to docs/project/tunning.md index 53ca1e1..ac2d712 100644 --- a/docs/articles/tunning.md +++ b/docs/project/tunning.md @@ -1,6 +1,38 @@ -# 导弹弹参数调整 +# 导弹参数调整 -## 末敏弹参数调整 +## 末敏弹运行记录(v0.2.1) + +时间:2025-01-10 10:00:00 +版本:v0.2.1 + +| 精度 | 角度误差 | 仿真步长 | 视场角 | +| ------ | -------- | -------- | ------ | +| 2.25米 | -1.08 度 | 0.0005秒 | 0.5度 | +| 2.20米 | -0.36 度 | 0.001秒 | 1度 | +| 3.10米 | +1.8 度 | 0.0025秒 | 1度 | +| 2.20米 | -0.36 度 | 0.001秒 | 2度 | +| 3.10米 | +1.8 度 | 0.0025秒 | 2度 | +| 9.24米 | -0.36 度 | 0.001秒 | 5度 | +| 9.65米 | -1.8 度 | 0.005秒 | 5度 | +| 11.14米 | +5.4 度 | 0.01秒 | 5度 | +| 15.04米 | -0.36 度 | 0.001秒 | 10度 | +| 15.07米 | -2.8 度 | 0.005秒 | 10度 | +| 15.62米 | +5.4 度 | 0.01秒 | 10度 | +| 15.04米 | +0.36 度 | 0.001秒 | 15度 | + +从结果看,仿真步长越小,精度越高,角度误差越小,视场角越大,精度越差。 + +比较合理的参数是: + +- 仿真步长:0.001秒 +- 视场角:2度 +- 精度:2.2米 +- 角度误差:-0.36度 + +## 末敏弹运行记录(v0.2.0) + +时间:2025-01-09 10:00:00 +版本:v0.2.0 调整参数后的运行记录 diff --git a/src/tools/MissileSimulator.cs b/src/tools/MissileSimulator.cs deleted file mode 100644 index b5c1d68..0000000 --- a/src/tools/MissileSimulator.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Numerics; - -public class MissileSimulator -{ - private List missiles = new List(); - private SimulationManager simulationManager; - private double InitialHeight; - - public void LaunchMissile(Vector3 target) - { - var missile = new TerminalSensitiveSubmunition - { - Position = new Vector3(target.X, target.Y, InitialHeight), - Velocity = new Vector3(0, 0, 0), - Target = target - }; - - missiles.Add(missile); - simulationManager.AddElement(missile); - } -} \ No newline at end of file diff --git a/src/tools/Program.cs b/src/tools/Program.cs deleted file mode 100644 index 45ff55b..0000000 --- a/src/tools/Program.cs +++ /dev/null @@ -1,75 +0,0 @@ -using ThreatSource.Utils; -using ThreatSource.Jamming; - -namespace ThreatSource.Tools -{ - class Program - { - static void Main(string[] args) - { - Console.WriteLine("末敏子弹模拟程序启动..."); - var simulator = new MissileSimulator(); - - // 添加目标 - var targetId = simulator.AddTarget(new Vector3D(100, 0, 100)); - - // 发射导弹 - simulator.LaunchMissile(targetId, new Vector3D(100, 400, 100)); - - // 启动模拟线程 - var simulationThread = new Thread(simulator.Start); - simulationThread.Start(); - - // 等待用户输入命令 - while (true) - { - Console.WriteLine("\n请输入命令(help查看帮助):"); - var command = Console.ReadLine()?.ToLower(); - - switch (command) - { - case "help": - ShowHelp(); - break; - case "ir": - simulator.ApplyJamming(JammingType.Infrared, 100, 5, new Vector3D(0, 0, 0)); - break; - case "mw": - simulator.ApplyJamming(JammingType.MillimeterWave, 200, 5, new Vector3D(0, 0, 0)); - break; - case "laser": - simulator.ApplyJamming(JammingType.Laser, 150, 5, new Vector3D(0, 0, 0)); - break; - case "clear ir": - simulator.ClearJamming(JammingType.Infrared); - break; - case "clear mw": - simulator.ClearJamming(JammingType.MillimeterWave); - break; - case "clear laser": - simulator.ClearJamming(JammingType.Laser); - break; - case "exit": - simulator.Stop(); - return; - default: - Console.WriteLine("未知命令,请输入help查看帮助"); - break; - } - } - } - - static void ShowHelp() - { - Console.WriteLine("可用命令:"); - Console.WriteLine(" help - 显示帮助信息"); - Console.WriteLine(" ir - 应用红外干扰"); - Console.WriteLine(" mw - 应用毫米波干扰"); - Console.WriteLine(" laser - 应用激光干扰"); - Console.WriteLine(" clear ir - 清除红外干扰"); - Console.WriteLine(" clear mw - 清除毫米波干扰"); - Console.WriteLine(" clear laser - 清除激光干扰"); - Console.WriteLine(" exit - 退出程序"); - } - } -} \ No newline at end of file diff --git a/tools/MissileSimulator.cs b/tools/MissileSimulator.cs index c2e03cb..ff7adb9 100644 --- a/tools/MissileSimulator.cs +++ b/tools/MissileSimulator.cs @@ -15,7 +15,7 @@ namespace ThreatSource.Tools private readonly List missiles; private readonly List targets; private bool isRunning; - private readonly double timeStep = 0.001; // 时间步长,单位:秒 + private readonly double timeStep = 0.0025; // 时间步长,单位:秒 /// /// 初始化导弹模拟器