实施计划与任务跟踪
项目:反无人机仿真系统后端
文档版本:V1.5
更新日期:2026-06-16
一、阶段总览
Phase 1 ✅ 核心基础
Phase 2 ✅ 想定管理
Phase 3 ✅ 算法层
Phase 4 ✅ 仿真引擎
Phase 5 ✅ 报告生成
Phase 6 ✅ Unity 集成(桥接层 + 示例项目)
Phase 7 ✅ 打磨收尾
Phase 8 ✅ 天气/物理模型统一
Phase 9 ✅ 性能优化 + 架构文档校准
Phase 10 ✅ 探测实时链路(已完成)
Phase 11 ✅ 运动学重构 + 实体暴露 + 基础数据 CRUD
Phase 12 ✅ 空基/地基统一规划 + 编队轴 + LaneDivider
────────────────────────
已完成 P1-P12
二、各阶段详情
Phase 1:核心基础 ✅
目标:搭建项目骨架,数据层可读写,单元测试全绿。
测试:27 个
| # |
任务 |
状态 |
| 1.1-1.12 |
项目骨架、枚举、数据模型、Repository、ModelService、单元测试 |
✅ |
Phase 2:想定管理 ✅
目标:仿真任务的完整 CRUD + 5 步配置保存/加载 + 搜索分页。
测试:20 个
| # |
任务 |
状态 |
| 2.1-2.14 |
8 个 Repository、ScenarioService、搜索分页、输入校验、单元测试 |
✅ |
Phase 3:算法层 ✅
目标:高斯烟团扩散模型、三种毁伤模型、防御推荐算法全部实现。
测试:26 个
| # |
任务 |
状态 |
| 3.1-3.12 |
GaussianPuffDispersion、InertGas/ActiveMaterial/ActiveFuel 毁伤模型、DefaultDefenseAdvisor、AlgorithmFactory |
✅ |
关键设计变更:
- 推荐算法由弹药规格驱动,查库选型
- 计算多轮次云团(CloudSalvo)确保覆盖率
- 输入校验:无目标/无航路/弹药缺失时返回失败原因
- Kinematics 工具类:抛物线弹道、风矢量、多边形判定
Phase 4:仿真引擎 ✅
目标:完整仿真引擎 + 集成测试。
测试:11 个
| # |
任务 |
状态 |
| 4.1-4.16 |
6 个实体类、FireSchedule 发射计划、FrameDataStore 分库、Pause/Resume/Stop、集成测试 |
✅ |
关键设计变更:
- 引擎重构为纯执行器:
SetFireSchedule() 接收计划,不包含任何决策
TimeScale 属性支持加速仿真(集成测试 4 倍速)
- 弹道飞行时间用
Kinematics 真实计算
- 集成测试:4 个端到端场景全通过(NoDefense/ZoneIntrusion/Piston/Jet)
Phase 5:报告生成 ✅
目标:仿真结束后自动生成 Markdown 报告并导出文件。
测试:7 个
| # |
任务 |
状态 |
| 5.1-5.8 |
ReportGenerator、ReportService、ExportToFile、搜索分页、单元测试 |
✅ |
注:PDF/Word 导出暂以 Markdown 替代,后续可扩展。
Phase 6:Unity 集成 ✅
目标:将 Core.dll 集成到 Unity,实现完整运行链路。
前置条件:安装 Unity Hub + Editor 22.3.62
位置:src/Unity/(完整 Unity 项目)
| # |
任务 |
预估 |
状态 |
说明 |
| 6.1 |
创建 Unity 项目,导入 Core.dll |
1h |
✅ |
src/Unity/ 项目,16 个 DLL → Assets/Plugins/ |
| 6.2 |
实现 UnityPathProvider |
1h |
✅ |
Application.persistentDataPath 桥接 |
| 6.3 |
实现 ModelManager |
3h |
✅ |
导入/删除/查询,含 Verify |
| 6.4 |
实现 ScenarioManager(5 步配置) |
4h |
✅ |
完整 CRUD + 搜索分页 + 多批次 Route |
| 6.5 |
实现 SimulationRunner(Update 驱动) |
3h |
✅ |
Tick 驱动 + 事件订阅 + 实体位置同步 + 炮弹轨迹可视化 |
| 6.6 |
实现 ReplayController(帧加载) |
3h |
✅ |
从分库加载帧数据,TotalFrames/GetFrame |
| 6.7 |
实现 ReportManager |
2h |
✅ |
生成 + Markdown 导出 |
| 6.8 |
3D 实体可视化 |
4h |
✅ |
Drone/Cube、Cloud/Sphere、Munition/Cylinder,逐帧位置同步 |
| 6.9 |
粒子系统参数传递 |
3h |
✅ |
云团半径缩放 + 颜色/透明度动态更新 |
| 6.10 |
端到端联调 + 一键验证 |
6h |
✅ |
ManagerVerification 7 模块全过,SimulationBootstrap 一键 Demo |
额外交付物:
SimulationBootstrap.cs:一键创建想定 → 推荐方案 → 启动仿真(Scene 直接运行)
simple_simulation.unity:预配置场景文件
ManagerVerification:Inspector 右键 Run Full Verification → Console 7 行 OK
Phase 7:打磨收尾 ✅
| # |
任务 |
状态 |
| 7.1 |
性能优化 |
✅ Tick 热路径优化,Unity 满载帧率 <20→200+ FPS(详见总体架构设计第十三章) |
| 7.2 |
TTL 清理(FrameDataStore.CleanupExpired + 测试) |
✅ |
| 7.3 |
边界测试(空部署/强风/超长航路/空基弹药) |
✅ |
| 7.4 |
错误处理加固 |
⬜(基本校验已有) |
| 7.5 |
测试覆盖率 |
✅ 95.4% 行 / 80.5% 分支 |
| 7.6 |
README + API XML 文档 |
✅ |
| — |
死代码清理(DetectionEntity, EventQueue) |
✅ |
| — |
代码格式化(.editorconfig + dotnet format) |
✅ |
三、最终指标
| 指标 |
值 |
| 测试总数 |
237(全部通过,1 跳过-Jet高弹道) |
| 行覆盖率 |
95%+ |
| 分支覆盖率 |
80%+ |
| 执行时间 |
~11 秒 |
| Core 程序集 |
CounterDrone.Core.dll (.NET Standard 2.1) |
| 共享物理工具类 |
Kinematics / RouteGeometry / CloudExpansionModel / DamageAssessment |
| 全局配置 |
data/planner_config.json(planner 策略参数,代码零默认值) |
| Unity 项目 |
src/Unity/(Unity 2022.3.62) |
| Unity Manager |
8 个 MonoBehaviour 桥接 + Bootstrap + SqliteConnectionTracker |
| 零 Unity 依赖 |
✅ Core 可脱离 Unity 独立运行和测试 |
四、Phase 8:天气/物理统一与功能增强
8.0(天气/物理统一)已完成;8.1/8.2/8.3 为后续增强功能,部分待开发。
UI/视觉/动画属于前端同事范畴,以下仅列后端 Core 的功能。
8.0 天气与物理模型统一(✅ 已完成)
| # |
功能 |
说明 |
| 8.0.1 |
天气纳入扩散模型 |
✅ 修复 GaussianPuffDispersion 写死 Sunny 的 bug,Phase3 用真实 env.WeatherType 推导 Pasquill 稳定度 |
| 8.0.2 |
Planner 风偏补偿 |
✅ 抛撒点逆风预置(cloudGen = 穿越点 − windVec×expansionTime),云团漂移后回到航路 |
| 8.0.3 |
去除无人机风偏叠加 |
✅ DroneEntity 不再叠加风位移(真实无人机有飞控修正),planner 与引擎速度模型一致 |
| 8.0.4 |
PathInSphere 云团参考系修正 |
✅ 毁伤判定改在云团参考系(drone.Pos − cloud.Center),修正移动球导致的每 tick ~2m 系统误差 |
| 8.0.5 |
ComputeEffectiveRadius 云龄 bug |
✅ 从 ArrivalTime×2(无人机飞行时间,概念错误)改为 expansionTime(云团自身膨胀时长) |
| 8.0.6 |
物理模型统一架构 |
✅ 新增 RouteGeometry 静态工具类,planner 与引擎共用航路几何;planner 删除所有本地物理公式 |
| 8.0.7 |
配置外置 |
✅ 新增 PlannerConfig + planner_config.json,策略参数(重叠系数、类型系数、弹药匹配、概率阈值)全部从配置读,代码零默认值 |
| 8.0.8 |
云团重叠布局 |
✅ 间距 2R×(1−重叠比例),默认重叠 20%,消除相切处密度空洞;offset 沿航路切向,支持任意方向/折线航路 |
8.1 仿真增强
| # |
功能 |
说明 |
| 8.1.1 |
探测设备搜索逻辑 |
✅ 事前规划:DetectionCalculator 算统一信息网络最早探测点,planner 基于探测边界算到达时间;天气衰减光电;精度影响散布。实时探测设计完成(总体架构设计第十四章),待 Phase 10 开发 |
| 8.1.2 |
蜂群运动模型 |
⬜ FormationMode.Swarm 枚举已定义,需差异化行为(随机扰动、个体差异) |
| 8.1.3 |
空基平台 + DefensePlanner |
✅ 五步规划引擎,通道模型,物理间隔错发,路径积分毁伤判定 |
| 8.1.4 |
预置典型目标库 |
⬜ 具体无人机型号 JSON 配置(如 DJI Mavic 3、Shahed-136 等),导入 ScenarioDrone 默认值 |
| 8.1.5 |
毁伤曲线参数校准 |
✅ RequiredExposureSeconds 替代硬编码,密度阈值统一在引擎检查 |
| 8.1.6 |
Fallback/default 清理 |
✅ 删除所有硬编码默认值和静默 fallback,参数缺失即报错 |
8.2 报告与导出
| # |
功能 |
说明 |
| 8.2.1 |
PDF 导出 |
⬜ QuestPDF 或其他 .NET Standard 2.1 方案调研,IReportService.ExportReport() 实现 |
| 8.2.2 |
Word 导出 |
⬜ 调研可行方案 |
8.3 第三方对接
| # |
功能 |
说明 |
| 8.3.1 |
第三方 DLL 接口规范 |
⬜ 与供应商对齐 ICloudDispersionModel P/Invoke 签名和调用约定 |
| 8.3.2 |
扩散模型替换验证 |
⬜ 通过 AlgorithmFactory.Register 切换到第三方实现后的集成测试 |
五、Phase 9:性能优化 + 架构文档校准 ✅
目标:Tick 热路径性能优化(Unity 满载 <20→200+ FPS)+ 总体架构设计文档与实现对齐。
9.1 性能优化(✅ 已完成)
| # |
任务 |
状态 |
说明 |
| 9.1.1 |
DroneEntity 航路几何缓存 |
✅ |
构造时预算 _totalArc/_segLen[]/_cumArc[],Update 内 O(1) 定位段,消除每帧重复几何运算 |
| 9.1.2 |
仿真期零字符串分配 |
✅ |
EntitySnapshot 强类型字段流转,JSON 推迟到 Flush;Unity 端移除 JsonDocument.Parse(最大收益项) |
| 9.1.3 |
ControlZoneEntity 顶点 2D 缓存 |
✅ |
构造时缓存 _vertices2D,ContainsPoint 零分配 |
| 9.1.4 |
帧数据内存缓存+批量落库 |
✅ |
List<FrameRecord> struct 缓冲,Flush 单事务 InsertAll |
| 9.1.5 |
毁伤判定快速排斥 |
✅ |
浓度阈值 + 2R 距离两层裁剪 |
详见《总体架构设计》第十三章。优化前后实测:Unity 满载渲染帧率 <20 FPS(卡顿)→ 200+ FPS。
9.2 架构文档校准(✅ 已完成)
| # |
任务 |
状态 |
说明 |
| 9.2.1 |
修正文档与实现不符 |
✅ |
AlgorithmFactory(Func 工厂)、IDefensePlanner.Plan(4参数)、IDamageModel(RequiredExposureSeconds)、FrameDataStore(类非接口)、删除 IRecordService、DroneEntity 弧长运动、Tick 流程顺序、StateData 双轨 |
| 9.2.2 |
新增性能设计章节 |
✅ |
总体架构设计 第十三章 |
| 9.2.3 |
探测设备行为设计 |
✅ |
总体架构设计 第十四章(双链路 + 3D 球冠 + 5 项决策 + 数据模型清单) |
六、Phase 10:探测实时链路开发 ✅(已完成)
目标:实现仿真运行时实时探测(链路 B),产生 TargetDetected 事件 + 可视化数据;并将 planner 探测判定升级到 3D 球冠。
前置设计:《总体架构设计》第十四章(V13),5 项行为决策已确认(见 14.6)。
关键约束:
- 实时探测是纯只读观测层(决策 3/4),不影响 FireSchedule、不驱动拦截;
- planner 与实时探测必须共用 3D 球冠判定(
IsInCoverage)——正确性硬要求,否则会出现"未探测却拦截"的物理错误(详见 T3)。
任务依赖关系见 10.5。建议按 T1→T2→T3→T4 顺序,T5/T6 可并行。
10.1 数据层(T1)
| # |
任务 |
预估 |
状态 |
说明 |
| T1.1 |
ScenarioUnit 加 4 列 |
0.5h |
✅ |
MinElevation/MaxElevation/MinDetectAlt/MaxDetectAlt,均 NULLABLE |
| T1.2 |
DetectionSource 类扩展 |
0.5h |
✅ |
同步加 4 个三维几何属性(float.MaxValue=无限制,退化 2D) |
| T1.3 |
BuildDetectionSources 读取新字段 |
0.5h |
✅ |
缺失时退化球冠(float.MaxValue),保证存量数据平滑过渡 |
10.2 算法层(T2)
| # |
任务 |
预估 |
状态 |
说明 |
| T2.1 |
DetectionCalculator.IsInCoverage |
1h |
✅ |
3D 球冠判定:水平距离 + 俯仰角 ∈ [Min,Max]Elevation + 高度 ∈ [Min,Max]DetectAlt。float.MaxValue=无限制(退化 2D) |
| T2.2 |
IsInCoverage 单元测试 |
0.5h |
✅ |
7 个边界用例:球冠内/外、正顶、俯仰越界、高度越界、无限制等价 2D |
10.3 planner 3D 适配(T3)🔒 正确性硬要求
| # |
任务 |
预估 |
状态 |
说明 |
| T3.1 |
EarliestDetection 改采样法 |
2h |
✅ |
从"线段-圆解析求交"改为"沿航路采样点(步长≤50m)调 IsInCoverage"。删除旧 EarliestEntryArc/IsInside |
| T3.2 |
DefensePlannerTests 回归验证 |
1h |
✅ |
30 个测试全通过,无回归 |
🔒 T3 不可砍、不可降级为 2D。这是正确性硬约束,不是精度优化:
- 仿真是按 planner 规划执行的,planner 的探测判定 = 仿真的事实依据。
- 若 planner 保留 2D 圆判定,会出现"目标高度超出探测设备真实 3D 球冠范围(探测不到),但 planner 按 2D 判定能发现并规划拦截、仿真照此摧毁"的物理错误结局——防空系统不可能拦截它没发现的目标。
- 因此 planner 必须与实时探测共用
IsInCoverage(详见总体架构设计 14.2.1)。
关于采样误差(已澄清,可放心):采样法 vs 解析法的弧长误差 ≤ 一个步长(50m),换算到推荐抛撒时机 ≤ ~1.5s(120km/h),远小于云团膨胀窗口(~30s)和云团重叠冗余,不影响火力计划结果。所以 T3 的重点是用 3D 几何保证"该探测的能探测、不该探测的探测不到",而非追求采样精度。
10.4 引擎层(T4)
| # |
任务 |
预估 |
状态 |
说明 |
| T4.1 |
DetectionEntity 运行时实体 |
1h |
✅ |
持有 DetectionSource + 每无人机探测状态机(Undetected ⇄ Detected)。UpdateState 返回首次进入/离开信号 |
| T4.2 |
SimulationEngine 加 _detectionEntities |
0.5h |
✅ |
Initialize 时从 BuildDetectionSources 构建,Tick 第 5 步遍历 |
| T4.3 |
Tick 第 5 步实时扫描 |
2h |
✅ |
决策 1(离开回退)= Undetected;决策 2(融合取最早/同刻取精度高);触发 TargetDetected(含 OnTargetDetected 事件) |
| T4.4 |
SimulationEngineTests 验证 |
1h |
✅ |
4 个测试:进入探测范围触发事件、多设备融合取最早、无探测设备无事件、离开后再次进入重新触发 |
10.5 前端 / 报告(T5,可并行)
| # |
任务 |
预估 |
状态 |
说明 |
| T5.1 |
Unity 探测范围可视化 |
— |
⬜ |
前端范畴:3D 球冠 wireframe / 发现标记(决策 4 仅可视化) |
| T5.2 |
时序图/报告纳入 TargetDetected |
0.5h |
✅ |
ReportGenerator 时序表增加发现事件(👁️ 目标发现);统计增加目标发现计数 |
10.6 任务依赖与顺序
T1(数据层)→ T2(算法层 IsInCoverage)
↓
T3(planner 3D 适配 ⚠️耦合点)→ T4(引擎实时扫描)
↓
T5(前端/报告,可并行)
总预估:约 11h(T1 1.5h + T2 1.5h + T3 3h + T4 4.5h + T5.2 0.5h;前端 T5.1 不计入后端)。
六、Phase 11:运动学重构 + 实体暴露 + 基础数据 CRUD ✅
目标:抛物线前向计算、空基固定阵位发射、全部实体属性公开、DataService 全 CRUD、LiveFrames 内存回放。
11.1 运动学重构
| # |
任务 |
说明 |
| 11.1.1 |
ComputeParabolicRange / ParabolicApex |
正问题:给定 v₀+θ → (射程, 飞行时间) + 顶点参数 |
| 11.1.2 |
Math.Max 回退全部移除 |
CalculateLaunchAngle/ParabolicShellTime/ParabolicTimeOfFlight 非法输入抛异常;GaussianPuffDispersion/CloudExpansionModel Pow 输入验证 |
| 11.1.3 |
MunitionEntity 前向到达 |
launchAngle 必须由方案提供;_arrivesDescending 区分上升/下落;Math.Max 除零移除 |
11.2 空基固定阵位
| # |
任务 |
说明 |
| 11.2.1 |
DefensePlanner 空基 |
ComputeHorizontal 用 platform.PosY;ComputeParabolicRange 前向算时间;云团=到达位置 |
| 11.2.2 |
死代码清理 |
CommandFlyTo/FlyingToTarget/ReadyToRelease + "到达投放点" 块删除 |
11.3 实体属性暴露
| # |
任务 |
说明 |
| 11.3.1 |
EntitySnapshot + 速度 |
所有实体帧快照带 VelX/Y/Z;CollectSnapshots 覆盖全部 5 类实体 |
| 11.3.2 |
CloudEntity |
Pos/Radius/Density/Phase/Elapsed 直接属性 |
| 11.3.3 |
MunitionEntity |
LaunchAngle/Azimuth/MuzzleVelocity/FlightDuration/Start/LaunchTime/ElapsedTime/Velocity 全部 public |
| 11.3.4 |
DroneEntity/PlatformEntity/DetectionEntity |
TraveledArc/Progress; Target/FlightDistance; PosX/Y/Z |
11.4 基础数据 CRUD
| # |
任务 |
说明 |
| 11.4.1 |
类名规范化 |
7 类模板统一命名(*Spec/*Template);SQLite Table+PrimaryKey |
| 11.4.2 |
6 个 Repository |
SpecRepositories.cs |
| 11.4.3 |
IDataService + DataService |
全 CRUD,构造注入 |
| 11.4.4 |
DatabaseManager 建表+种子 |
自动建表 + InsertOrReplace 种子 |
| 11.4.5 |
Unity 接入 |
ScenarioManager.DataService + SimulationRunner.DataService |
11.5 回放(LiveFrames)
| # |
任务 |
说明 |
| 11.5.1 |
FrameDataStore.LiveFrames |
Flush 后保留副本;BeginRecording/Discard 清除 |
| 11.5.2 |
ReplayController 双路径 |
LoadReplay(scenarioId, frameStore) 优先内存,回退 SQLite |
11.6 测试启用
| # |
任务 |
说明 |
| 11.6.1 |
Scenario_3DronesAirBased |
参数对齐,平台间隔 300m,移除 Skip |
| 11.6.2 |
Scenario_DetectionDriven |
移除 Skip |
十二、Phase 12:空基/地基统一规划 + 编队轴 + LaneDivider ✅
目标:碰撞点后统一流程,编队支持 XYZ 任意轴展开,lane 划分策略可替换。
12.1 运动学修复
| # |
任务 |
说明 |
| 12.1.1 |
ComputeParabolicRange 重写 |
从 tanθ 二次改为垂直运动直接算时间,消除与 CalculateLaunchAngle 的不互逆 |
| 12.1.2 |
风偏纳入角度 |
cloudGen 先于 launchAngle 计算,消除风偏导致的 range≠targetDist |
| 12.1.3 |
弹道可达验证 |
每发 PlanUnitLane 验证 ComputeParabolicRange 不抛异常 |
12.2 空基/地基统一
| # |
任务 |
说明 |
| 12.2.1 |
碰撞点后无分支 |
cloudGen/deliveryTime/fireTime 统一公式,mv 和 launchAngle 按类型取不同值 |
| 12.2.2 |
每发独立角度 |
launchAngle 对每个目标点重新计算,不共用 InterceptCalculator 的统一值 |
| 12.2.3 |
3机空基全灭 |
修复后三机编队全部击毁 |
12.3 编队轴 + LaneDivider
| # |
任务 |
说明 |
| 12.3.1 |
LateralAxis/LongitudinalAxis |
RoutePlan + FormationTemplate + DroneEntity 支持 0=X/1=Y/2=Z |
| 12.3.2 |
ILaneDivider 接口 |
车道划分策略抽象 |
| 12.3.3 |
DefaultLaneDivider |
宽+深双维度判断,任一超云团半径则拆分 |
| 12.3.4 |
PlanUnitLane 读轴 |
按 LateralAxis 决定 X/Y/Z 偏移方向 |
12.4 探测门控
| # |
任务 |
说明 |
| 12.4.1 |
_anyThreatDetected |
引擎等首次探测后才执行发射 |
| 12.4.2 |
_detectionTime |
发射时间 = fe.FireTime(偏移) + 探测时刻 |
12.5 测试
| # |
任务 |
说明 |
| 12.5.1 |
Kinematics 俯射往返 |
CalculateLaunchAngle→ComputeParabolicRange 往返一致 |
| 12.5.2 |
3机空基 |
平台 X 轴分布、无人机 Z 轴分布,交叉维度全覆盖 |
七、里程碑
| 里程碑 |
状态 |
| M1 — 数据层就绪 |
✅ |
| M2 — 想定可配置 |
✅ |
| M3 — 算法可计算 |
✅ |
| M4 — 仿真可运行 |
✅ |
| M5 — 报告可生成 |
✅ |
| M6 — Unity 可演示 |
✅ |
| M7 — 交付就绪 |
✅ |
| M8 — 天气/物理模型统一 |
✅ |
| M9 — 性能优化 + 文档校准 |
✅ |
| M10 — 探测实时链路 |
✅ |
| M11 — 运动学重构 + 实体暴露 + 基础数据 CRUD |
✅ |
| M12 — 空基/地基统一规划 + 编队轴 + LaneDivider |
✅ |
九、待解决问题
| # |
问题 |
说明 |
状态 |
| 1 |
高弹道支持 |
当前只支持低弹道。喷气式(ground-standard, 18000m 航线)需要高弹道才能命中。低弹道取上升段时间 t1,弹在 6.5s/5199m 就触发了到达判定,实际应 15.5s/12318m 在下行段命中。需要修改 MunitionEntity 的到达判定逻辑 |
🔴 待解决 |
八、状态图例
| 符号 |
含义 |
| ⬜ |
未开始 |
| 🔄 |
进行中 |
| ✅ |
已完成 |
| ⏸️ |
阻塞 |
| ❌ |
放弃 |