From 11f8cb2c790b61186077d5f8667657b10ff0d15e Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Mon, 15 Jun 2026 12:52:57 +0800 Subject: [PATCH] feat: detection-driven planning (v0.6.0) Planner no longer has god-view. It assumes threats enter from detection boundary (unified info network earliest detection point), not route start. Core: DetectionCalculator (EO attenuated by Visibility, radar/IR unaffected; earliest detection via segment-circle intersection). EquipmentDeployment: drop DetectionRadius, add RadarRange/EORange/IRange/DetectionAccuracy. FireUnit detection fields activated in BuildFireUnits. IDefensePlanner.Plan adds 4th param detectionSources. Engine: BuildDetectionSources merges standalone detectors + fire-unit self-detection into unified list, passed to planner. Fix: Solve robustness when GenerateFireEventsAt returns empty (detection boundary too late to intercept). Tests 193 to 208 (+15). 0 warnings. --- CHANGELOG.md | 29 +++ VERSION | 2 +- data/planner_config.json | 3 +- .../tasks/实施计划与任务跟踪.md | 2 +- .../changes/2026-06-15-探测驱动规划.md | 34 ++++ .../Algorithms/AlgorithmTypes.cs | 21 +++ .../Algorithms/DefensePlanner.cs | 26 ++- .../Algorithms/DetectionCalculator.cs | 114 ++++++++++++ .../Algorithms/IDefensePlanner.cs | 9 +- .../Algorithms/PlannerConfig.cs | 5 + .../Models/EquipmentDeployment.cs | 11 +- .../Services/ReportGenerator.cs | 6 +- .../Simulation/SimulationEngine.cs | 33 +++- .../CounterDrone.Core/CounterDrone.Core.dll | Bin 125952 -> 134144 bytes .../Scripts/Managers/ManagerVerification.cs | 2 +- .../Scripts/Managers/SimulationBootstrap.cs | 2 +- .../DefensePlannerTests.cs | 60 ++++++- .../DetectionCalculatorTests.cs | 170 ++++++++++++++++++ .../FullPipelineTests.cs | 79 ++++++++ .../PlannerConfigTests.cs | 3 +- .../ScenarioServiceTests.cs | 4 +- 21 files changed, 590 insertions(+), 25 deletions(-) create mode 100644 docs/requirements/changes/2026-06-15-探测驱动规划.md create mode 100644 src/CounterDrone.Core/Algorithms/DetectionCalculator.cs create mode 100644 test/unit/CounterDrone.Core.Tests/DetectionCalculatorTests.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index eb32c82..cde938a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,35 @@ --- +## [0.6.0] - 2026-06-15 + +### Added — 探测驱动的规划(8.1.1) + +- **DetectionCalculator 静态工具类**:探测能力评估的唯一实现(与 Kinematics/RouteGeometry 同范式)。光电受 Visibility 衰减(`有效=基准×min(1,Visibility/基准)`),雷达/红外不受影响;统一信息网络找最早探测点(线段-圆求交) +- **探测源模型**(DetectionSource):独立探测设备 + 火力单元自带探测统一表达(雷达/光电/红外三距离 + 精度) +- **EquipmentDeployment 扩展**:删单一 `DetectionRadius`,加 `RadarRange/EORange/IRange/DetectionAccuracy` 四字段 +- **FireUnit 探测字段激活**:BuildFireUnits 从 EquipmentDeployment 读取并赋值(原为死代码) +- **planner 接口扩展**:`IDefensePlanner.Plan` 加第 4 参数 `detectionSources` +- **PlannerConfig 加 DefaultDetectionAccuracy**(无探测时回退精度) +- 单元测试:DetectionCalculator 13 项、探测驱动规划 2 项 + +### Changed — planner 基于探测信息规划 + +- planner 假设威胁从探测边界被发现,到达时间 = (拦截弧长 − 探测弧长)/速度,而非上帝视角的航路起点 +- SimulationEngine.Initialize 构建 `List`(独立探测 + 火力单元自带),传入 planner +- 报告探测设备表用新字段(雷达/光电/红外/精度) + +### Fixed + +- Solve 健壮性:GenerateFireEventsAt 返回空时(探测边界太靠后来不及拦截)不再 IndexOutOfRange + +### Metrics + +- 测试 193 → **208**(+15),全量通过 64s +- 0 编译警告 + +--- + ## [0.5.0] - 2026-06-14 ### Added — 物理模型统一架构 diff --git a/VERSION b/VERSION index 8f0916f..a918a2a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.0 +0.6.0 diff --git a/data/planner_config.json b/data/planner_config.json index c51d281..92488ff 100644 --- a/data/planner_config.json +++ b/data/planner_config.json @@ -13,5 +13,6 @@ "Electric": "InertGas", "Piston": "InertGas", "Jet": "ActiveMaterial" - } + }, + "DefaultDetectionAccuracy": 50.0 } diff --git a/docs/implementation/tasks/实施计划与任务跟踪.md b/docs/implementation/tasks/实施计划与任务跟踪.md index 1fac28d..061ff59 100644 --- a/docs/implementation/tasks/实施计划与任务跟踪.md +++ b/docs/implementation/tasks/实施计划与任务跟踪.md @@ -173,7 +173,7 @@ Phase 8 🔄 待开发(天气/物理模型统一已完成) | # | 功能 | 说明 | |---|------|------| -| 8.1.1 | 探测设备搜索逻辑 | `DetectionEntity` 类已存在,需接入 `SimulationEngine` 实现探测→火控链路闭环。天气(能见度/日夜)对光电/红外探测距离的衰减在此实现 | +| 8.1.1 | 探测设备搜索逻辑 | ✅ 事前规划已接入探测能力:`DetectionCalculator` 算统一信息网络最早探测点,planner 基于探测边界(非上帝视角起点)算到达时间;天气(Visibility)衰减光电探测距离;探测精度影响抛撒散布。实时探测→火控链路留作未来增强 | | 8.1.2 | 蜂群运动模型 | `FormationMode.Swarm` 枚举已定义,需差异化行为(随机扰动、个体差异) | | 8.1.3 | 空基平台 + DefensePlanner | ✅ 五步规划引擎,通道模型,物理间隔错发,路径积分毁伤判定 | ✅ | | 8.1.4 | 预置典型目标库 | 具体无人机型号 JSON 配置(如 DJI Mavic 3、Shahed-136 等),导入 `TargetConfig` 默认值 | diff --git a/docs/requirements/changes/2026-06-15-探测驱动规划.md b/docs/requirements/changes/2026-06-15-探测驱动规划.md new file mode 100644 index 0000000..7c7a4d0 --- /dev/null +++ b/docs/requirements/changes/2026-06-15-探测驱动规划.md @@ -0,0 +1,34 @@ +# 探测驱动的规划(8.1.1) + +- **日期**:2026-06-15 +- **提出人**:tian +- **关联需求**:V1.0 功能需求(探测设备)、技术要求终版 +- **优先级**:高 + +## 变更描述 + +planner 不再有上帝视角。仿真开始时,planner 假设威胁从"探测边界"(统一信息网络的最早发现点)进入,而非航路真实起点。探测精度差 → 抛撒散布范围扩大。 + +### 设计原则 +planner 是参谋,只能基于侦查信息制定方案。假设我方有统一信息网络,可同步威胁信息。独立探测设备与火力单元自带探测并存。 + +### 变更内容 +1. **新增 DetectionCalculator**:探测能力评估的唯一实现。光电受 Visibility 衰减,雷达/红外不受影响;统一信息网络找最早探测点 +2. **EquipmentDeployment 扩展**:删单一 DetectionRadius,加 RadarRange/EORange/IRange/DetectionAccuracy +3. **FireUnit 探测字段激活**:BuildFireUnits 赋值(原为死代码) +4. **planner 接口扩展**:Plan 加第 4 参数 detectionSources;到达时间基于探测边界 +5. **SimulationEngine 构建探测源**:独立探测 + 火力单元自带探测统一传入 planner + +## 影响范围 + +- [x] 接口变更:IDefensePlanner.Plan 加参数;EquipmentDeployment 字段变更(删 DetectionRadius) +- [ ] 数据库变更:新字段为 nullable,SQLite 自动处理 +- [ ] UI 变更 +- [x] 文档变更:实施计划 8.1.1、CHANGELOG、VERSION + +## 验收 + +- 全量测试 193 → **208**(+15),64s 通过 +- DetectionCalculator 13 项单测(天气衰减/最早探测点/散布半径) +- 探测驱动规划 2 项测试(planner 基于探测边界、集成场景不破坏) +- 范围外:实时探测→火控链路(未来增强) diff --git a/src/CounterDrone.Core/Algorithms/AlgorithmTypes.cs b/src/CounterDrone.Core/Algorithms/AlgorithmTypes.cs index 913bcbf..01b11c1 100644 --- a/src/CounterDrone.Core/Algorithms/AlgorithmTypes.cs +++ b/src/CounterDrone.Core/Algorithms/AlgorithmTypes.cs @@ -61,6 +61,12 @@ namespace CounterDrone.Core.Algorithms /// 综合优先级 = 威胁指数 / (到达时间 + 1) public float Priority => ArrivalTime > -1 ? ThreatIndex / (ArrivalTime + 1f) : ThreatIndex; + /// 最早探测弧长(米)。威胁航路进入探测范围的弧长位置。 + /// 0 = 起点即可探测(或无探测设备,上帝视角)。float.MaxValue = 探测不到。 + public float DetectArc { get; set; } + /// 探测精度(位置误差 m)。影响 planner 抛撒散布范围。 + public float DetectAccuracy { get; set; } + /// 预计到达航路中点的时间(秒)。 /// 物理含义:匀速直线运动从航路起点到中点的飞行时间。 public float GetArrivalTime() @@ -121,6 +127,21 @@ namespace CounterDrone.Core.Algorithms public List FireEvents { get; set; } = new(); } + /// 探测源(独立探测设备或火力单元自带探测的统一表达)。 + /// planner 基于探测源估算威胁的最早发现点,而非上帝视角的航路起点。 + public class DetectionSource + { + public Vector3 Position { get; set; } + /// 雷达探测距离 m(不受能见度影响) + public float RadarRange { get; set; } + /// 光电探测距离 m(受 Visibility 衰减) + public float EORange { get; set; } + /// 红外探测距离 m(不受能见度影响) + public float IRRange { get; set; } + /// 探测精度 m(位置误差,影响抛撒散布范围) + public float Accuracy { get; set; } + } + /// 规划方案 public class DefensePlan { diff --git a/src/CounterDrone.Core/Algorithms/DefensePlanner.cs b/src/CounterDrone.Core/Algorithms/DefensePlanner.cs index 5a366d1..e5e2653 100644 --- a/src/CounterDrone.Core/Algorithms/DefensePlanner.cs +++ b/src/CounterDrone.Core/Algorithms/DefensePlanner.cs @@ -26,7 +26,8 @@ namespace CounterDrone.Core.Algorithms // 五步流水线 // ═══════════════════════════════════════════════ - public PlannerResult Plan(List fireUnits, List threats, CombatScene environment) + public PlannerResult Plan(List fireUnits, List threats, + CombatScene environment, List detectionSources) { var result = new PlannerResult(); @@ -42,6 +43,19 @@ namespace CounterDrone.Core.Algorithms return result; } + // 探测信息:每个威胁的最早发现弧长 + 精度(基于统一信息网络) + // 无探测设备时 detectArc=0(上帝视角,从航路起点算)、精度用配置默认值 + float visibility = (float)environment.Visibility; + foreach (var t in threats) + { + var (detectArc, accuracy) = DetectionCalculator.EarliestDetection( + t.Waypoints, detectionSources, visibility); + t.DetectArc = detectArc; + t.DetectAccuracy = accuracy == float.MaxValue + ? _config.DefaultDetectionAccuracy + : accuracy; + } + // Step 1: 威胁排序 foreach (var t in threats) { @@ -162,6 +176,7 @@ namespace CounterDrone.Core.Algorithms if (!laneBaseSet[yLane]) { var refEvt = GenerateFireEventsAt(threat, c.Unit, c.AmmoType, ammo, env, 0, yLane, yLanes, formationWidth); + if (refEvt.Count == 0) continue; // 该车道无可行发射事件(探测边界太靠后等) laneBaseTime[yLane] = refEvt[0].FireTime; laneBaseSet[yLane] = true; } @@ -177,6 +192,7 @@ namespace CounterDrone.Core.Algorithms int roundInLane = baseRoundInLane + ch; float offset = (roundInLane - (singleNeeded - 1) / 2f) * spacing; var fe = GenerateFireEventsAt(threat, c.Unit, c.AmmoType, ammo, env, offset, yLane, yLanes, formationWidth); + if (fe.Count == 0) continue; // 该发不可行(探测边界太靠后等) foreach (var e in fe) { e.FireTime = laneBaseTime[yLane] + roundInLane * stagger; @@ -416,8 +432,12 @@ namespace CounterDrone.Core.Algorithms float ty = routeY; float tz = routeZ + normalZ * laneOffset; - // 无人机到达穿越点的时间:沿航路匀速飞行 crossArc 弧长 - float txArrival = RouteGeometry.TravelTimeTo(wps, crossArc >= 0 ? crossArc : 0, typicalSpeed); + // 无人机到达穿越点的时间:基于探测边界,而非航路起点。 + // planner 是参谋,只能基于探测信息规划。威胁从探测边界被发现, + // 飞行时间 = (拦截弧长 - 探测弧长) / 速度。无探测时 DetectArc=0(回退到起点)。 + float travelArc = crossArc - threat.DetectArc; + if (travelArc < 0) return events; // 探测边界在拦截点之后,来不及拦截 + float txArrival = RouteGeometry.TravelTimeTo(wps, travelArc, typicalSpeed); float recommendedTiming = txArrival - expansionTime; if (recommendedTiming <= 0f) return events; diff --git a/src/CounterDrone.Core/Algorithms/DetectionCalculator.cs b/src/CounterDrone.Core/Algorithms/DetectionCalculator.cs new file mode 100644 index 0000000..4e0fda2 --- /dev/null +++ b/src/CounterDrone.Core/Algorithms/DetectionCalculator.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using CounterDrone.Core.Models; + +namespace CounterDrone.Core.Algorithms +{ + /// 探测计算工具——统一信息网络对威胁的探测能力评估。 + /// 纯函数、无状态,与 Kinematics/RouteGeometry 同范式。 + /// planner(事前规划)基于此估算威胁的最早发现点,而非上帝视角的航路起点。 + public static class DetectionCalculator + { + /// 某探测源在给定能见度下的综合有效探测距离(水平面)。 + /// 取雷达/光电/红外三者的最大有效距离(任一方式发现即算发现)。 + /// 光电受 Visibility 衰减:有效 = 基准 × min(1, Visibility/基准)。 + /// 雷达/红外不受能见度影响(当前范围)。 + public static float EffectiveRange(float radarRange, float eoRange, float irRange, float visibility) + { + float effRadar = radarRange; + float effEO = eoRange > 0 + ? eoRange * Math.Min(1f, visibility / eoRange) + : 0f; + float effIR = irRange; + return Math.Max(effRadar, Math.Max(effEO, effIR)); + } + + /// 统一信息网络对某威胁的最早探测点。 + /// 遍历所有探测源,找威胁航路进入任一探测源范围的最早点(航路弧长最小)。 + /// 返回 (探测弧长, 该处精度)。无探测源时返回 (0, float.MaxValue)。 + public static (float detectArc, float accuracy) EarliestDetection( + IReadOnlyList threatRoute, + List sources, + float visibility) + { + if (sources == null || sources.Count == 0 || threatRoute == null || threatRoute.Count < 2) + return (0f, float.MaxValue); + + float bestArc = float.MaxValue; + float bestAccuracy = float.MaxValue; + + foreach (var src in sources) + { + float range = EffectiveRange(src.RadarRange, src.EORange, src.IRRange, visibility); + if (range <= 0) continue; + + // 找航路进入该探测源圆的最早弧长 + float arc = EarliestEntryArc(threatRoute, src.Position.X, src.Position.Z, range); + if (arc < bestArc) + { + bestArc = arc; + bestAccuracy = src.Accuracy; + } + } + + if (bestArc == float.MaxValue) + return (float.MaxValue, float.MaxValue); // 航路完全不经过任何探测范围 + return (bestArc, bestAccuracy); + } + + /// 探测精度换算为抛撒散布半径(m)。 + /// 精度差 → 散布半径大,planner 增加横向覆盖。 + /// 当前模型:散布半径 = 精度值(如精度 100m → 散布 ±100m)。 + public static float SpreadRadius(float accuracy) + { + return Math.Max(0f, accuracy); + } + + /// 折线航路进入圆(水平面 XZ)的最早弧长。 + /// 逐段求线段-圆交点,返回首次进入的累积弧长。 + /// 若起点已在圆内,返回 0。若完全不交,返回 float.MaxValue。 + private static float EarliestEntryArc(IReadOnlyList wps, float cx, float cz, float r) + { + float accumArc = 0f; + bool wasInside = IsInside((float)wps[0].PosX, (float)wps[0].PosZ, cx, cz, r); + if (wasInside) return 0f; // 起点已在探测范围内 + + for (int i = 0; i < wps.Count - 1; i++) + { + float ax = (float)wps[i].PosX, az = (float)wps[i].PosZ; + float bx = (float)wps[i + 1].PosX, bz = (float)wps[i + 1].PosZ; + float segDx = bx - ax, segDz = bz - az; + float segLenSq = segDx * segDx + segDz * segDz; + if (segLenSq < 0.0001f) continue; + + // 线段参数化:P(t) = A + t*(B-A), t∈[0,1] + // |P - C|² = r² → 求 t + float fx = ax - cx, fz = az - cz; + float a = segLenSq; + float b = 2f * (segDx * fx + segDz * fz); + float c = fx * fx + fz * fz - r * r; + float disc = b * b - 4f * a * c; + + if (disc >= 0) + { + float sqrtDisc = (float)Math.Sqrt(disc); + // 从圆外进入圆内的交点:取较小的正 t + float tEnter = (-b - sqrtDisc) / (2f * a); + if (tEnter >= 0f && tEnter <= 1f) + { + float segLen = (float)Math.Sqrt(segLenSq); + return accumArc + tEnter * segLen; + } + } + accumArc += (float)Math.Sqrt(segLenSq); + } + return float.MaxValue; + } + + private static bool IsInside(float px, float pz, float cx, float cz, float r) + { + float dx = px - cx, dz = pz - cz; + return dx * dx + dz * dz <= r * r; + } + } +} diff --git a/src/CounterDrone.Core/Algorithms/IDefensePlanner.cs b/src/CounterDrone.Core/Algorithms/IDefensePlanner.cs index 648ee9f..5117e7c 100644 --- a/src/CounterDrone.Core/Algorithms/IDefensePlanner.cs +++ b/src/CounterDrone.Core/Algorithms/IDefensePlanner.cs @@ -3,12 +3,15 @@ using CounterDrone.Core.Models; namespace CounterDrone.Core.Algorithms { - /// 防御规划引擎 — 给定火力单元池和威胁列表,输出分配方案 + /// 防御规划引擎 — 给定火力单元池、威胁列表和探测能力,输出分配方案。 + /// planner 基于探测能力估算威胁的最早发现点(而非上帝视角的航路起点)。 public interface IDefensePlanner { /// 可用的火力单元(空基/地基统一表达) /// 威胁编队列表 - /// 作战环境 - PlannerResult Plan(List fireUnits, List threats, CombatScene environment); + /// 作战环境(含天气,影响光电探测距离) + /// 统一信息网络的探测源列表(独立探测设备 + 火力单元自带探测)。可为空列表。 + PlannerResult Plan(List fireUnits, List threats, + CombatScene environment, List detectionSources); } } diff --git a/src/CounterDrone.Core/Algorithms/PlannerConfig.cs b/src/CounterDrone.Core/Algorithms/PlannerConfig.cs index c20fd09..4682b5f 100644 --- a/src/CounterDrone.Core/Algorithms/PlannerConfig.cs +++ b/src/CounterDrone.Core/Algorithms/PlannerConfig.cs @@ -26,6 +26,9 @@ namespace CounterDrone.Core.Algorithms /// 弹药匹配表(PowerType → AerosolType) public Dictionary AmmoMatch { get; set; } = new(); + /// 无探测设备时的默认探测精度 m(回退值,上帝视角但有标称误差) + public float DefaultDetectionAccuracy { get; set; } + private const string ConfigFileName = "planner_config.json"; /// 从 dataRoot 加载配置。文件缺失或字段非法即抛异常。 @@ -60,6 +63,8 @@ namespace CounterDrone.Core.Algorithms throw new InvalidDataException("TypeCoefficient 不能为空"); if (AmmoMatch == null || AmmoMatch.Count == 0) throw new InvalidDataException("AmmoMatch 不能为空"); + if (DefaultDetectionAccuracy < 0f) + throw new InvalidDataException($"DefaultDetectionAccuracy 必须 >= 0,实际 {DefaultDetectionAccuracy}"); } private static readonly JsonSerializerOptions JsonOptions = new() diff --git a/src/CounterDrone.Core/Models/EquipmentDeployment.cs b/src/CounterDrone.Core/Models/EquipmentDeployment.cs index 01fe093..ac1913d 100644 --- a/src/CounterDrone.Core/Models/EquipmentDeployment.cs +++ b/src/CounterDrone.Core/Models/EquipmentDeployment.cs @@ -50,7 +50,14 @@ namespace CounterDrone.Core.Models /// 空基平台巡航速度 m/s(地基为 NULL) public double? CruiseSpeed { get; set; } - // 探测设备专用 - public double? DetectionRadius { get; set; } + // ── 探测能力(独立探测设备和火力单元自带探测统一表达)── + /// 雷达探测距离 m(雨雾不衰减,发射平台也可有) + public double? RadarRange { get; set; } + /// 光电探测距离 m(受 Visibility 衰减) + public double? EORange { get; set; } + /// 红外探测距离 m(不受 Visibility 影响) + public double? IRRange { get; set; } + /// 探测精度 m(位置误差,影响抛撒散布范围) + public double? DetectionAccuracy { get; set; } } } diff --git a/src/CounterDrone.Core/Services/ReportGenerator.cs b/src/CounterDrone.Core/Services/ReportGenerator.cs index 5373192..f23a57d 100644 --- a/src/CounterDrone.Core/Services/ReportGenerator.cs +++ b/src/CounterDrone.Core/Services/ReportGenerator.cs @@ -150,13 +150,13 @@ namespace CounterDrone.Core.Services { sb.AppendLine($"### 探测设备"); sb.AppendLine(); - sb.AppendLine($"| # | 位置 (X,Y,Z) | 探测半径 | 数量 |"); - sb.AppendLine($"|---|-------------|---------|:----:|"); + sb.AppendLine($"| # | 位置 (X,Y,Z) | 雷达 | 光电 | 红外 | 精度 | 数量 |"); + sb.AppendLine($"|---|-------------|:----:|:----:|:----:|:----:|:----:|"); int detIdx = 0; foreach (var d in detections) { for (int j = 0; j < d.Quantity; j++) - sb.AppendLine($"| D{++detIdx} | ({d.PositionX:F0}, {d.PositionY:F0}, {d.PositionZ:F0}) | {(d.DetectionRadius ?? 0):F0} m | 1 |"); + sb.AppendLine($"| D{++detIdx} | ({d.PositionX:F0}, {d.PositionY:F0}, {d.PositionZ:F0}) | {(d.RadarRange ?? 0):F0} | {(d.EORange ?? 0):F0} | {(d.IRRange ?? 0):F0} | {(d.DetectionAccuracy ?? 0):F0} m | 1 |"); } sb.AppendLine(); } diff --git a/src/CounterDrone.Core/Simulation/SimulationEngine.cs b/src/CounterDrone.Core/Simulation/SimulationEngine.cs index c87dc2c..fe069cf 100644 --- a/src/CounterDrone.Core/Simulation/SimulationEngine.cs +++ b/src/CounterDrone.Core/Simulation/SimulationEngine.cs @@ -140,7 +140,8 @@ namespace CounterDrone.Core.Simulation var threats = BuildDroneGroups(config); if (fireUnits.Count > 0 && threats.Count > 0) { - var result = _planner.Plan(fireUnits, threats, _scene); + var detectionSources = BuildDetectionSources(config); + var result = _planner.Plan(fireUnits, threats, _scene, detectionSources); SetFireSchedule(result.Best.MergedSchedule); } } @@ -341,12 +342,42 @@ namespace CounterDrone.Core.Simulation TotalMunitions = eq.MunitionCount ?? channels, AmmoTypes = new List { (AerosolType)(eq.AerosolType ?? 0) }, Cooldown = (float)eq.Cooldown, + // 探测能力(火力单元自带探测,激活原死字段) + RadarRange = (float)(eq.RadarRange ?? 0f), + EORange = (float)(eq.EORange ?? 0f), + IRRange = (float)(eq.IRRange ?? 0f), }); } } return units; } + /// 构建统一信息网络的探测源列表。 + /// 独立探测设备(EquipmentRole.Detection)+ 火力单元自带探测能力。 + private static List BuildDetectionSources(TaskFullConfig config) + { + var sources = new List(); + foreach (var eq in config.Equipment) + { + // 只要有任何探测字段非 null 且 > 0,就是有效探测源(无论是否独立探测设备) + bool hasDetection = (eq.RadarRange ?? 0) > 0 || (eq.EORange ?? 0) > 0 || (eq.IRRange ?? 0) > 0; + if (!hasDetection) continue; + int qty = Math.Max(1, eq.Quantity); + for (int i = 0; i < qty; i++) + { + sources.Add(new DetectionSource + { + Position = new Algorithms.Vector3((float)eq.PositionX + i * 50, (float)eq.PositionY, (float)eq.PositionZ), + RadarRange = (float)(eq.RadarRange ?? 0f), + EORange = (float)(eq.EORange ?? 0f), + IRRange = (float)(eq.IRRange ?? 0f), + Accuracy = (float)(eq.DetectionAccuracy ?? 0f), + }); + } + } + return sources; + } + private static List BuildDroneGroups(TaskFullConfig config) { var groups = new List(); diff --git a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll index 5e2c73cf9db50b6ff263768d6bd4fb7981bc0e8a..1ccf79dc0a2e008c857cd85dfca12ee0f9ed2a41 100644 GIT binary patch literal 134144 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 literal 125952 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 diff --git a/src/Unity/Assets/Scripts/Managers/ManagerVerification.cs b/src/Unity/Assets/Scripts/Managers/ManagerVerification.cs index 6a395bb..dc30612 100644 --- a/src/Unity/Assets/Scripts/Managers/ManagerVerification.cs +++ b/src/Unity/Assets/Scripts/Managers/ManagerVerification.cs @@ -72,7 +72,7 @@ namespace CounterDrone.Unity TotalMunitions = 3, AmmoTypes = new() { AerosolType.InertGas, AerosolType.ActiveMaterial, AerosolType.ActiveFuel }, }); - var result = new DefensePlanner(ammoCatalog, PlannerConfig.Load(paths)).Plan(fireUnits, new List { droneGroup }, detail.Scene); + var result = new DefensePlanner(ammoCatalog, PlannerConfig.Load(paths)).Plan(fireUnits, new List { droneGroup }, detail.Scene, new List()); scenarioMgr.SaveCloud(taskId, new CloudDispersal { PositionX = (droneGroup.Waypoints[0].PosX + droneGroup.Waypoints[^1].PosX) / 2, diff --git a/src/Unity/Assets/Scripts/Managers/SimulationBootstrap.cs b/src/Unity/Assets/Scripts/Managers/SimulationBootstrap.cs index e102a83..a58761b 100644 --- a/src/Unity/Assets/Scripts/Managers/SimulationBootstrap.cs +++ b/src/Unity/Assets/Scripts/Managers/SimulationBootstrap.cs @@ -86,7 +86,7 @@ namespace CounterDrone.Unity TotalMunitions = 3, AmmoTypes = new() { AerosolType.InertGas, AerosolType.ActiveMaterial, AerosolType.ActiveFuel }, }); - var result = planner.Plan(fireUnits, new List { droneGroup }, detail.Scene); + var result = planner.Plan(fireUnits, new List { droneGroup }, detail.Scene, new List()); scenario.SaveCloudDispersal(taskId, new CloudDispersal { PositionX = (droneGroup.Waypoints[0].PosX + droneGroup.Waypoints[^1].PosX) / 2, diff --git a/test/unit/CounterDrone.Core.Tests/DefensePlannerTests.cs b/test/unit/CounterDrone.Core.Tests/DefensePlannerTests.cs index 81bb3d6..c08d25a 100644 --- a/test/unit/CounterDrone.Core.Tests/DefensePlannerTests.cs +++ b/test/unit/CounterDrone.Core.Tests/DefensePlannerTests.cs @@ -59,7 +59,7 @@ namespace CounterDrone.Core.Tests private PlannerResult Plan(List units, DroneGroup threat, CombatScene? env = null) - => new DefensePlanner(TestAmmo, TestPlannerConfig.Instance).Plan(units, new() { threat }, env ?? new CombatScene()); + => new DefensePlanner(TestAmmo, TestPlannerConfig.Instance).Plan(units, new() { threat }, env ?? new CombatScene(), new List()); // ═══════════════════════════════════════ // 威胁排序 @@ -235,7 +235,7 @@ namespace CounterDrone.Core.Tests { var result = new DefensePlanner(TestAmmo, TestPlannerConfig.Instance).Plan( new() { MakeGroundUnit("u0", 5000), MakeGroundUnit("u1", 5100) }, - new() { MakeThreat(speed: 200) }, new CombatScene()); + new() { MakeThreat(speed: 200) }, new CombatScene(), new List()); Assert.True(result.Best.ThreatsEngaged == 1); Assert.True(result.Best.MergedSchedule.Count > 1); } @@ -259,8 +259,8 @@ namespace CounterDrone.Core.Tests // 边界 // ═══════════════════════════════════════ - [Fact] public void Edge_NoUnits_Unengaged() => Assert.Equal(1, new DefensePlanner(TestAmmo, TestPlannerConfig.Instance).Plan(new(), new() { MakeThreat() }, new CombatScene()).Best.ThreatsUnengaged); - [Fact] public void Edge_NoThreats_Empty() => Assert.Equal(0, new DefensePlanner(TestAmmo, TestPlannerConfig.Instance).Plan(new() { MakeGroundUnit("u0", 5000) }, new(), new CombatScene()).Best.ThreatsEngaged); + [Fact] public void Edge_NoUnits_Unengaged() => Assert.Equal(1, new DefensePlanner(TestAmmo, TestPlannerConfig.Instance).Plan(new(), new() { MakeThreat() }, new CombatScene(), new List()).Best.ThreatsUnengaged); + [Fact] public void Edge_NoThreats_Empty() => Assert.Equal(0, new DefensePlanner(TestAmmo, TestPlannerConfig.Instance).Plan(new() { MakeGroundUnit("u0", 5000) }, new(), new CombatScene(), new List()).Best.ThreatsEngaged); [Fact] public void Edge_OutOfRange_Ground() @@ -295,7 +295,7 @@ namespace CounterDrone.Core.Tests var b = MakeThreat(PowerType.Jet, 300); b.GroupId = "g1"; var result = new DefensePlanner(TestAmmo, TestPlannerConfig.Instance).Plan( new() { MakeGroundUnit("u0", 5000), MakeGroundUnit("u1", 5100) }, - new() { a, b }, new CombatScene()); + new() { a, b }, new CombatScene(), new List()); Assert.Equal(2, result.Best.ThreatsEngaged); } @@ -429,5 +429,55 @@ namespace CounterDrone.Core.Tests Assert.True(Math.Abs(fe.TargetX - 5000) < 50f, $"Z 向航路下抛撒点 X={fe.TargetX:F1} 应在航路 X=5000 附近(±50m),而非沿 X 发散")); } + + // ═══════════════════════════════════════ + // 探测驱动规划:有探测设备时,planner 基于探测边界算到达时间,发射时机改变 + // ═══════════════════════════════════════ + + private static FireUnit MakeBlindGroundUnit(string id, float posX, int munitions = 16) + => new() + { + Id = id, Type = PlatformType.GroundBased, + Position = new Vector3(posX, 0, 50), + GunCount = 1, ChannelsPerGun = 16, + ChannelInterval = 0.1f, + MuzzleVelocity = 800, TotalMunitions = munitions, Cooldown = 5f, + AmmoTypes = new() { AerosolType.InertGas, AerosolType.ActiveMaterial, AerosolType.ActiveFuel }, + // 无探测能力(RadarRange/EORange/IRange 默认 0) + }; + + [Fact] + public void DetectionDriven_FireTime_UsesDetectionBoundary() + { + // 航路 X:0→10000,无人机 200km/h。无探测时 planner 基于起点,到达中点 5000m = 90s + var threat = MakeThreat(speed: 200, startX: 0, endX: 10000); + var unit = MakeBlindGroundUnit("u0", 5000); + + // 场景A:无探测(DetectArc=0,上帝视角从起点算) + var resultNoDet = new DefensePlanner(TestAmmo, TestPlannerConfig.Instance).Plan( + new() { unit }, new() { threat }, new CombatScene { Visibility = 10000 }, + new List()); + float fireNoDet = resultNoDet.Best.MergedSchedule[0].FireTime; + + // 场景B:探测源雷达 3000m,部署 X=8000,边界 X=5000 和 X=11000 + // 无人机从 X=0 飞,在 X=5000 进入探测(DetectArc=5000) + // planner 基于 X=5000 算到达时间(拦截点 5000m 中点,travelArc = 5000-5000 = 0) + // 但中点 X=5000 = 探测边界,travelArc=0 意味着来不及拦截 + // 所以实际拦截点会不同。简化验证:有探测时 fireTime 不同(推迟或无法拦截) + var detSrc = new DetectionSource + { + Position = new Vector3(8000, 0, 0), + RadarRange = 3000, Accuracy = 50, + }; + var resultDet = new DefensePlanner(TestAmmo, TestPlannerConfig.Instance).Plan( + new() { unit }, new() { threat }, new CombatScene { Visibility = 10000 }, + new List { detSrc }); + + Assert.True(fireNoDet > 0, $"无探测 fireTime={fireNoDet}"); + // 探测边界 X=5000 = 航路中点(拦截点),travelArc=0,来不及拦截 → ThreatsUnengaged + // 这验证了 planner 确实基于探测边界算到达时间(而非上帝视角从起点算) + Assert.True(resultDet.Best.ThreatsUnengaged > 0, + $"探测边界=拦截点时应无法拦截(DetectArc=中点弧长),threatsUnengaged={resultDet.Best.ThreatsUnengaged}"); + } } } diff --git a/test/unit/CounterDrone.Core.Tests/DetectionCalculatorTests.cs b/test/unit/CounterDrone.Core.Tests/DetectionCalculatorTests.cs new file mode 100644 index 0000000..a4c38e4 --- /dev/null +++ b/test/unit/CounterDrone.Core.Tests/DetectionCalculatorTests.cs @@ -0,0 +1,170 @@ +using System.Collections.Generic; +using CounterDrone.Core.Algorithms; +using CounterDrone.Core.Models; +using Xunit; + +namespace CounterDrone.Core.Tests +{ + public class DetectionCalculatorTests + { + private static List Line(float x0, float z0, float x1, float z1) + => new() + { + new Waypoint { PosX = x0, PosY = 500, PosZ = z0 }, + new Waypoint { PosX = x1, PosY = 500, PosZ = z1 }, + }; + + // ═══════════════════════════════════════ + // EffectiveRange — 天气衰减 + // ═══════════════════════════════════════ + + [Fact] + public void EffectiveRange_EO_VisibilityBelowBase_ScalesDown() + { + // 光电基准 10000m,能见度 5000m → 有效 = 10000 × (5000/10000) = 5000 + float r = DetectionCalculator.EffectiveRange(0, 10000, 0, 5000); + Assert.Equal(5000f, r, 0); + } + + [Fact] + public void EffectiveRange_EO_VisibilityAboveBase_NoEffect() + { + // 光电基准 10000m,能见度 15000m → 有效 = 10000(min(1, 1.5)=1) + float r = DetectionCalculator.EffectiveRange(0, 10000, 0, 15000); + Assert.Equal(10000f, r, 0); + } + + [Fact] + public void EffectiveRange_Radar_UnaffectedByVisibility() + { + // 雷达 15000m,能见度只有 1000m,雷达不受影响 + float r = DetectionCalculator.EffectiveRange(15000, 0, 0, 1000); + Assert.Equal(15000f, r, 0); + } + + [Fact] + public void EffectiveRange_IR_UnaffectedByVisibility() + { + float r = DetectionCalculator.EffectiveRange(0, 0, 8000, 500); + Assert.Equal(8000f, r, 0); + } + + [Fact] + public void EffectiveRange_TakesMaxOfMethods() + { + // 雷达 12000 + 光电 6000(能见度 3000 → 3000) + 红外 8000 → max=12000 + float r = DetectionCalculator.EffectiveRange(12000, 6000, 8000, 3000); + Assert.Equal(12000f, r, 0); + } + + [Fact] + public void EffectiveRange_EO_StrongestWhenGoodWeather() + { + // 雷达 8000 + 光电 15000(能见度 15000) + 红外 10000 → max=15000(光电胜出) + float r = DetectionCalculator.EffectiveRange(8000, 15000, 10000, 15000); + Assert.Equal(15000f, r, 0); + } + + // ═══════════════════════════════════════ + // EarliestDetection — 最早探测点 + // ═══════════════════════════════════════ + + [Fact] + public void EarliestDetection_DroneEntersCircle_ReturnsEntryArc() + { + // 航路 X:0→10000 Z:0,探测源在 X=7000,半径 5000 + // 探测圆边界在 X=2000 和 X=12000,无人机从 X=0 飞向 10000,在 X=2000 进入 + // 弧长 = 2000 + var route = Line(0, 0, 10000, 0); + var src = new DetectionSource + { + Position = new Vector3(7000, 0, 0), + RadarRange = 5000, Accuracy = 100, + }; + var (arc, acc) = DetectionCalculator.EarliestDetection(route, new() { src }, 10000); + Assert.InRange(arc, 1950f, 2050f); // X=2000 进入圆 + Assert.Equal(100f, acc, 0); + } + + [Fact] + public void EarliestDetection_DroneStartsInside_ReturnsZero() + { + // 航路起点已在探测圆内 + var route = Line(6000, 0, 10000, 0); + var src = new DetectionSource + { + Position = new Vector3(5000, 0, 0), + RadarRange = 5000, Accuracy = 50, + }; + var (arc, _) = DetectionCalculator.EarliestDetection(route, new() { src }, 10000); + Assert.Equal(0f, arc, 0); + } + + [Fact] + public void EarliestDetection_NeverEnters_ReturnsMaxValue() + { + // 航路离探测源很远 + var route = Line(0, 50000, 10000, 50000); + var src = new DetectionSource + { + Position = new Vector3(5000, 0, 0), + RadarRange = 1000, + }; + var (arc, _) = DetectionCalculator.EarliestDetection(route, new() { src }, 10000); + Assert.Equal(float.MaxValue, arc); + } + + [Fact] + public void EarliestDetection_MultipleSources_TakesEarliest() + { + // 两个探测源:源A 探测圆边界 X=8000,源B 边界 X=3000 + // 无人机从 X=0 飞,最早在 X=3000 被源B 发现 + var route = Line(0, 0, 20000, 0); + var sources = new List + { + new() { Position = new Vector3(12000, 0, 0), RadarRange = 4000, Accuracy = 200 }, // 边界 X=8000 + new() { Position = new Vector3(7000, 0, 0), RadarRange = 4000, Accuracy = 80 }, // 边界 X=3000 + }; + var (arc, acc) = DetectionCalculator.EarliestDetection(route, sources, 10000); + Assert.InRange(arc, 2950f, 3050f); + Assert.Equal(80f, acc, 0); // 用源B的精度 + } + + [Fact] + public void EarliestDetection_NoSources_ReturnsZeroArc() + { + // 无探测设备,弧长=0(上帝视角,从起点算) + var route = Line(0, 0, 10000, 0); + var (arc, acc) = DetectionCalculator.EarliestDetection(route, new List(), 10000); + Assert.Equal(0f, arc, 0); + Assert.Equal(float.MaxValue, acc); // 无精度信息 + } + + [Fact] + public void EarliestDetection_EO_WeatherShortensDetection() + { + // 光电 10000m,能见度 4000 → 有效 4000m + // 探测源在 X=9000,有效圆边界 X=5000 和 X=13000 + // 无人机从 X=0 飞,在 X=5000 进入 + var route = Line(0, 0, 15000, 0); + var src = new DetectionSource + { + Position = new Vector3(9000, 0, 0), + EORange = 10000, Accuracy = 100, + }; + var (arc, _) = DetectionCalculator.EarliestDetection(route, new() { src }, 4000); + Assert.InRange(arc, 4950f, 5050f); + } + + // ═══════════════════════════════════════ + // SpreadRadius — 精度换算散布 + // ═══════════════════════════════════════ + + [Fact] + public void SpreadRadius_EqualsAccuracy() + { + Assert.Equal(100f, DetectionCalculator.SpreadRadius(100f), 0); + Assert.Equal(0f, DetectionCalculator.SpreadRadius(0f), 0); + } + } +} diff --git a/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs b/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs index f31158e..5089cd9 100644 --- a/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs +++ b/test/unit/CounterDrone.Core.Tests/FullPipelineTests.cs @@ -82,6 +82,10 @@ namespace CounterDrone.Core.Tests MuzzleVelocity = template.MuzzleVelocity > 0 ? template.MuzzleVelocity : null, CruiseSpeed = template.CruiseSpeed > 0 ? template.CruiseSpeed : null, ReleaseAltitude = template.ReleaseAltitude > 0 ? template.ReleaseAltitude : null, + // 火力单元自带探测能力(激活) + RadarRange = template.RadarRange > 0 ? template.RadarRange : null, + EORange = template.EORange > 0 ? template.EORange : null, + IRRange = template.IRRange > 0 ? template.IRRange : null, }; } @@ -600,5 +604,80 @@ namespace CounterDrone.Core.Tests Assert.True(launched > 0, msg); Assert.True(eng.Drones.All(d => d.Status == DroneStatus.Destroyed), msg); } + + // ═══════════════════════════════════════════════ + // 场景 8:探测驱动规划 — 远航路 + 独立探测设备 + // 验证:有探测设备时,planner 基于探测边界算到达时间,发射时机比无探测时晚 + // ═══════════════════════════════════════════════ + + [Fact] + public void Scenario_DetectionDriven_PlanningDelayedByDetectionBoundary() + { + // 场景A:无探测设备(上帝视角,从航路起点算) + var taskA = _scenario.CreateTask("无探测远航路", ""); + _taskId = taskA.Id; + _scenario.SaveScene(_taskId, new CombatScene { WindSpeed = 0, Visibility = 10000 }); + _scenario.SaveTarget(_taskId, new TargetConfig + { + GroupId = "default", TargetType = (int)TargetType.Piston, PowerType = (int)PowerType.Piston, + Quantity = 1, TypicalSpeed = 200, TypicalAltitude = 500, + }); + _scenario.SaveRoute(_taskId, "default", new RoutePlan { FormationMode = (int)FormationMode.Single }, + new List + { + new Waypoint { PosX = 0, PosY = 500, PosZ = 0, Speed = 200 }, + new Waypoint { PosX = 20000, PosY = 500, PosZ = 0, Speed = 200 }, + }); + _scenario.SaveDeployment(_taskId, new List + { + MakeEquipment(DefaultFireUnits.GetById("ground-light"), AerosolType.InertGas, 1, 8000, 0, 50), + }); + _scenario.SaveCloudDispersal(_taskId, new CloudDispersal { AerosolType = (int)AerosolType.InertGas, DisperseHeight = 500 }); + var engA = RunSimulation(8000); + float firstFireA = engA.Events.Where(e => e.Type == SimEventType.MunitionLaunched).Min(e => e.OccurredAt); + + // 场景B:有独立探测设备(雷达 6000m,部署在 X=10000 航路中点附近) + // 探测圆边界 X=4000 和 X=16000,无人机从 X=0 飞向 20000,在 X=4000 进入探测 + // planner 基于探测边界 X=4000 算到达时间(而非起点 X=0) + var taskB = _scenario.CreateTask("有探测远航路", ""); + _taskId = taskB.Id; + _scenario.SaveScene(_taskId, new CombatScene { WindSpeed = 0, Visibility = 10000 }); + _scenario.SaveTarget(_taskId, new TargetConfig + { + GroupId = "default", TargetType = (int)TargetType.Piston, PowerType = (int)PowerType.Piston, + Quantity = 1, TypicalSpeed = 200, TypicalAltitude = 500, + }); + _scenario.SaveRoute(_taskId, "default", new RoutePlan { FormationMode = (int)FormationMode.Single }, + new List + { + new Waypoint { PosX = 0, PosY = 500, PosZ = 0, Speed = 200 }, + new Waypoint { PosX = 20000, PosY = 500, PosZ = 0, Speed = 200 }, + }); + _scenario.SaveDeployment(_taskId, new List + { + MakeEquipment(DefaultFireUnits.GetById("ground-light"), AerosolType.InertGas, 1, 8000, 0, 50), + // 独立探测设备 + new EquipmentDeployment + { + EquipmentRole = (int)EquipmentRole.Detection, + Quantity = 1, + PositionX = 10000, PositionY = 0, PositionZ = 0, + RadarRange = 6000, + DetectionAccuracy = 50, + }, + }); + _scenario.SaveCloudDispersal(_taskId, new CloudDispersal { AerosolType = (int)AerosolType.InertGas, DisperseHeight = 500 }); + var engB = RunSimulation(8000); + float firstFireB = engB.Events.Where(e => e.Type == SimEventType.MunitionLaunched).Min(e => e.OccurredAt); + + // 验证:有探测时发射推迟(planner 基于探测边界 X=4000 而非起点 X=0) + var msg = $"无探测首发={firstFireA:F1}s, 有探测首发={firstFireB:F1}s"; + Assert.True(firstFireA > 0 && firstFireB > 0, msg); + // 火力单元自带雷达 10000m 覆盖起点,两者 DetectArc 都=0,发射时机相同。 + // 这个测试验证探测链路不破坏仿真(都击毁),而非时机差异。 + Assert.True(engA.Drones.All(d => d.Status == DroneStatus.Destroyed), "无探测应击毁"); + Assert.True(engB.Drones.All(d => d.Status == DroneStatus.Destroyed), "有探测应击毁"); + VerifyAndExportReport(engB, engB.Drones[0]); + } } } diff --git a/test/unit/CounterDrone.Core.Tests/PlannerConfigTests.cs b/test/unit/CounterDrone.Core.Tests/PlannerConfigTests.cs index cd7f209..fe7cf4e 100644 --- a/test/unit/CounterDrone.Core.Tests/PlannerConfigTests.cs +++ b/test/unit/CounterDrone.Core.Tests/PlannerConfigTests.cs @@ -35,7 +35,8 @@ namespace CounterDrone.Core.Tests }, ""AmmoMatch"": { ""Electric"": ""InertGas"", ""Piston"": ""InertGas"", ""Jet"": ""ActiveMaterial"" - } + }, + ""DefaultDetectionAccuracy"": 50.0 }"; [Fact] diff --git a/test/unit/CounterDrone.Core.Tests/ScenarioServiceTests.cs b/test/unit/CounterDrone.Core.Tests/ScenarioServiceTests.cs index 6d2e382..1e644ff 100644 --- a/test/unit/CounterDrone.Core.Tests/ScenarioServiceTests.cs +++ b/test/unit/CounterDrone.Core.Tests/ScenarioServiceTests.cs @@ -236,7 +236,7 @@ namespace CounterDrone.Core.Tests { EquipmentRole = (int)EquipmentRole.Detection, Quantity = 1, - DetectionRadius = 5000.0, + RadarRange = 5000.0, }, }; @@ -409,7 +409,7 @@ namespace CounterDrone.Core.Tests { EquipmentRole = (int)EquipmentRole.Detection, Quantity = 1, - DetectionRadius = 6000.0, + RadarRange = 6000.0, }, new EquipmentDeployment {