CounterDroneBackend/CHANGELOG.md
tian dabf367b21 VERSION 0.11.0 — LaunchPlatformSpec 分离 + 代码审查 + 250 测试
- LaunchPlatformSpec:纯发射参数,SensorSpec 统一探测
- 代码审查:拆分 DefaultData/AlgorithmTypes/SpecRepositories
- GetEnums 中英文对照 / ModelId 3D 引用
- DataServiceTests +12 / 死代码清除
- 250/250 全过
2026-06-19 21:50:10 +08:00

395 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Changelog
---
## [0.11.0] - 2026-06-18
### Breaking — 发射平台与探测设备分离
- **LaunchPlatformSpec**新增纯发射平台规格GunCount/ChannelsPerGun/MuzzleVelocity/CruiseSpeed 等,无探测字段)
- **ScenarioUnit.FireUnitSpecId → LaunchPlatformSpecId**:发射平台部署通过新 FK 引用
- **SensorSpec 统一探测来源**:发射平台自带探测 + 独立探测设备,统一通过 SensorSpecId 引用
- **BuildDetectionSources 简化**:只查 SensorSpec不分 Launch/Detection 两条路径
- **FireUnitSpec 保留不用**:旧类型保留代码但不参与运行时
- **defaults.json +launchPlatforms**:新数据区
### Added — 代码审查 + 测试覆盖
- **DataServiceTests**12 个,覆盖 7 类基础数据 CRUD
- **死代码清除**MunitionEntity._hasExceededReleaseAltitude
- **Spec 类独立文件**DroneSpec/FireUnitSpec/SensorSpec 等从 DefaultData.cs 拆出,命名空间 → Models
- **PagedResult/EnumMetadata 独立文件**
- **GetEnums 返回中英文对照**EnumItem{Name,ChineseName,Value}
- **FormationTemplate 补 PrimaryKey**
### Added — 3D 模型引用
- **DroneSpec/FireUnitSpec/SensorSpec +ModelId**FK → ModelInfo
- **EntitySnapshot +ModelId**:每帧推送给 Unity
- **ModelInfo.ModelType→EntityType(枚举) +Description**
### Metrics
- 测试 **250**+12全部通过 12s
---
## [0.10.0] - 2026-06-18
### Breaking — 平台物理统一 + 模型重命名
- **空基/地基物理统一**:去除 DefensePlanner 所有平台类型分支,统一用 `InterceptCalculator.Compute`(删 `ComputeHorizontal`),统一用 `MuzzleVelocity`(删 `CruiseSpeed` 分支)
- **抛物线选解策略**:两解逐一计算距离匹配 + `fireTime>0` 可行性,选最早拦截的解(非简单选高角/低角)
- **`TargetType` → `DroneType`**:删 `Electric`/`Piston`,重编号 `HighSpeed=2``TargetConfig.DroneType` 属性同步改名
- **`TargetConfig` → `ScenarioDrone`**:核心模型重命名
- **`SimTask` → `Scenario`**:想定主表重命名,`ScenarioNumber` 取代 `TaskNumber`
- **`TaskFullConfig` → `ScenarioConfig`**:聚合配置重命名,`Task` 属性 → `Info`
- **`TaskId` → `ScenarioId`**:所有 FK 重命名
- **`ScenarioService` 方法**`CreateTask`→`CreateScenario`、`DeleteTask`→`DeleteScenario`、`SearchTasks`→`SearchScenarios`、`GetTaskDetail`→`GetScenarioDetail`
### Added — 模型业务属性
- **`ScenarioDrone` / `DroneSpec`**+`Model`(型号)、+`Description`(描述/用途)
- **`Scenario`**+`Description`(想定描述)
- **`ScenarioUnit` / `FireUnitSpec`**+`Description`
- **`ReportManager.Export(reportId, outputDir)`**:支持指定导出路径
### Changed — 数据库迁移
- `CreateMainTables` 删旧表 `SimTask`、`TargetConfig`、`SimulationReport`(自动重建)
- `scenariosVersion` 3→4 触发 demo 想定重建
### Docs
- 对接文档 V1.6:去历史命名对照,只写现状
- 架构设计 V15同步模型表结构 + 枚举值
### Metrics
- 测试 **238**,全量通过 11s
---
## [0.9.0] - 2026-06-17
### Breaking — 运动学前向计算 + 基础数据 CRUD
- **Kinematics 前向计算**:新增 `ComputeParabolicRange(v₀, θ, Δy)``ParabolicApex(v₀, θ)`,正问题直接由角度算射程和时间
- **Math.Max 回退全部移除**`CalculateLaunchAngle`/`ParabolicShellTime`/`ParabolicTimeOfFlight` 不再静默钳位或 45° 回退,非法输入直接抛异常
- **GaussianPuffDispersion / CloudExpansionModel / DetectionCalculator**BurstChargeKg≤0 抛异常,不再用 `Math.Max(0.01, ...)` 掩护Phase3 `x≤0` 显式跳过
### Changed — 空基固定阵位发射
- **空基不再「飞向投放点」**:改为固定阵位水平发射(θ=0°`ComputeParabolicRange` 前向计算飞行时间
- **DefensePlanner 空基**`ComputeHorizontal` 使用 `platform.PosY`(非 `ReleaseAltitude`);云团位置 = 炮弹实际到达位置
- **MunitionEntity 下落修正**`_arrivesDescending` 区分上升/下落到达;`Math.Max(0.01, ...)` 除零回退移除
- **死代码删除**`CommandFlyTo`/`FlyingToTarget`/`ReadyToRelease` 状态 + SimulationEngine "1b. 到达投放点" 块
### Added — 实体属性全面暴露
- **EntitySnapshot +VelX/Y/Z**:所有实体帧快照带瞬时速度
- **引擎 Platforms 列表公开**`SimulationEngine.Platforms`
- **CloudEntity**Pos/Radius/Density/Phase/Elapsed 便捷属性(不再穿透 Dispersion
- **MunitionEntity**LaunchAngle/Azimuth/MuzzleVelocity/FlightDuration/Start/LaunchTime/ElapsedTime/Velocity 全部 public
- **DroneEntity**TraveledArc/TotalArc/Progress
- **PlatformEntity**Target/FlightDistance/FlownDistance
- **DetectionEntity**PosX/Y/Z
### Added — 基础数据 CRUDDataService
- **7 类规格入库**FireUnitSpec / DroneSpec / SensorSpec / EnvironmentSpec / FormationTemplate / RouteTemplate / AmmunitionSpec
- **类名规范化**TargetPreset→DroneSpec, DetectionPreset→SensorSpec, WeatherPreset→EnvironmentSpec, FireUnitTemplate→FireUnitSpec, RoutePreset→RouteTemplate
- **IDataService + DataService**:全 CRUDGetAll/Save/Delete
- **Unity Manager 接入**ScenarioManager.DataService + SimulationRunner.DataService
### Added — FrameDataStore LiveFrames 内存回放
- **Flush 后保留 LiveFrames 副本**:仿真刚结束可内存回放,零磁盘 IO
- **ReplayController 双路径**`LoadReplay(scenarioId, frameStore)` 优先内存,回退 SQLite
- **LiveFrames 生命周期**BeginRecording/Discard 清除
### Changed — 3机空基编队测试启用
- `Seed3DronesAirBased` 参数对齐单机(风速/航速),平台沿 X 轴间隔 300m
- `Scenario_3DronesAirBased_AllDestroyed` 移除 Skip全部通过
- `Scenario_DetectionDriven_PlanningDelayedByDetectionBoundary` 移除 Skip
### Metrics
- 测试 **243**+12跳过 0全量通过 11s
---
## [0.8.0] - 2026-06-16
### Added — 探测实时链路Phase 10
- **3D 球冠探测**`DetectionCalculator.IsInCoverage`(水平距离 + 俯仰角 + 高度门限planner 与运行时共用
- **EarliestDetection 采样法**:线段-圆求交改为沿航路采样步长≤50m`IsInCoverage`
- **DetectionEntity**:运行时探测实体 + per-drone 状态机Undetected ⇄ DetectedTick 第5步扫描
- **实时探测事件**`OnTargetDetected` / `SimEventType.TargetDetected` / `PlanningFailed`
- **ScenarioUnit + DetectionSource**+4 个 3D 球冠字段MinElevation/MaxElevation/MinDetectAlt/MaxDetectAlt
- **默认数据全部加入 3D 球冠参数**(地基 -5°~85°、空基 -80°~30°
### Added — Planner 诊断 + 拦截点计算
- **InterceptCalculator**:抛物线与直线联立方程求解拦截点(地基可变角度 + 空基固定水平 θ=0°
- **HasInterceptWindow**:拦截窗口可行性检查(从探测边界算有效飞行时间)
- **TryGenerateFireEvents**:每个 `return events` 带拒绝原因
- **Planner Summary**:含失败原因 + 建议值(探测范围/弧长/反应时间)
- **PlannerConfig**+`ReactionTime`5s/ `ExpansionFactor`0.9/ `TimingSafetyMargin`1s
### Changed — 消除硬编码
- **速度从 waypoint.Speed 读取**`DroneEntity.CruiseSpeed` / `GetDroneSpeedKph` 不再用 `ScenarioDrone.TypicalSpeed`
- **`AmmunitionSpec` +`Phase2Duration`**30s`CloudExpansionModel` 不再写死 `30f`
- **`GetArrivalTime` 基于 DetectArc**:从探测点到中点算到达时间(而非航路起点)
- **TestData 改为从 seeded 数据库读取**(不再内嵌 JSON 重复 defaults.json
### Changed — 默认想定参数
- 巡航导弹速度 300→200 km/h
- 空基航路 10km→20km平台位置 1500→6000巡航速度 55→80 m/s
- 地基火力单元放航路终点,探测范围按 80% 规则
### Metrics
- 测试 204 → **231**+27全量通过 7s
---
## [0.7.0] - 2026-06-15
### Breaking — 概念升级:编组拆分 + Group 表移除
- **Group 表移除**:原 `Group`DroneFleet / EquipmentGroup不再创建。向后兼容保留旧库中的 Group 表,但不再主动读写
- **GroupType 枚举删除**:不再区分 DroneFleet / EquipmentGroup
- **GroupService / IGroupService / GroupRepository 删除**:不再需要编组管理服务
- **Unity GroupManager 删除**:不再需要编组管理桥接
### Changed — 数据模型重命名
- **`GroupId` → `WaveId`**ScenarioDrone 四表的编组外键重命名为批次外键
- **RoutePlan 索引重命名**`(ScenarioId, GroupId)` → `(ScenarioId, WaveId)`
- **RoutePlanRepository / WaypointRepository**`GetByScenarioAndGroup` → `GetByScenarioAndWave`
- **IScenarioService.SaveRoute**`groupId` 参数 → `waveId`
### Changed — 算法类型重命名
- **`DroneGroup` → `DroneWave`**AlgorithmTypes、IDefensePlanner、DefensePlanner、SimulationEngine 全部使用新类型名
- **`DroneGroupId` → `DroneWaveId`**UnitAssignment 中的编队引用 → 批次引用
- **`BuildDroneGroups()` → `BuildDroneWaves()`**SimulationEngine 构建方法重命名
### Changed — 文档同步
- 总体架构设计:编组概念升级说明
- DefensePlanner 技术方案DroneGroup → DroneWave
- 实施计划GroupService 移除、多编队 → 多批次
- Unity 前端对接文档DefaultDefenseAdvisor → DefensePlannerSaveRoute 签名更新
- 仿真器实体事件映射BuildDroneGroups → BuildDroneWaves
### Removed
- 7 个文件Group.cs / GroupRepository.cs / IGroupService.cs / GroupService.cs / GroupManager.cs / GroupServiceTests.cs / GroupRepositoryTests.cs
### Metrics
- 测试 208 → **204**4删除 Group 相关测试),全量通过 63s
- 0 编译错误0 编译警告
---
## [0.6.0] - 2026-06-15
### Added — 探测驱动的规划8.1.1
- **DetectionCalculator 静态工具类**:探测能力评估的唯一实现(与 Kinematics/RouteGeometry 同范式)。光电受 Visibility 衰减(`有效=基准×min(1,Visibility/基准)`),雷达/红外不受影响;统一信息网络找最早探测点(线段-圆求交)
- **探测源模型**DetectionSource独立探测设备 + 火力单元自带探测统一表达(雷达/光电/红外三距离 + 精度)
- **ScenarioUnit 扩展**:删单一 `DetectionRadius`,加 `RadarRange/EORange/IRange/DetectionAccuracy` 四字段
- **FireUnit 探测字段激活**BuildFireUnits 从 ScenarioUnit 读取并赋值(原为死代码)
- **planner 接口扩展**`IDefensePlanner.Plan` 加第 4 参数 `detectionSources`
- **PlannerConfig 加 DefaultDetectionAccuracy**(无探测时回退精度)
- 单元测试DetectionCalculator 13 项、探测驱动规划 2 项
### Changed — planner 基于探测信息规划
- planner 假设威胁从探测边界被发现,到达时间 = (拦截弧长 探测弧长)/速度,而非上帝视角的航路起点
- SimulationEngine.Initialize 构建 `List<DetectionSource>`(独立探测 + 火力单元自带),传入 planner
- 报告探测设备表用新字段(雷达/光电/红外/精度)
### Fixed
- Solve 健壮性GenerateFireEventsAt 返回空时(探测边界太靠后来不及拦截)不再 IndexOutOfRange
### Metrics
- 测试 193 → **208**+15全量通过 64s
- 0 编译警告
---
## [0.5.0] - 2026-06-14
### Added — 物理模型统一架构
- **RouteGeometry 静态工具类**:航路几何唯一实现(总弧长/弧长→位置/点→最近弧长/切向量/到达时间。planner预测和 DroneEntity执行共用消除本地折线插值
- **PlannerConfig + planner_config.json**planner 策略参数全部外置(重叠系数、威胁类型系数、弹药匹配表、临界/上限概率阈值)。代码零默认值,文件缺失即抛异常
- 单元测试RouteGeometry 16 项、PlannerConfig 6 项、DroneEntity L 形多 waypoint 1 项、Z 向航路感知 1 项
### Changed — planner 不再写本地物理公式
- **DefaultDefensePlanner 航路感知布局**:云团 offset 沿航路切向(`RouteGeometry.TangentAt`),不再写死 X 轴;穿越点用 `RouteGeometry.PositionAt`,到达时间用 `RouteGeometry.TravelTimeTo`——支持任意方向/折线航路
- **云团重叠**:间距从 `2R`(相切)改为 `2R×(1重叠系数)`,重叠 20% 由配置驱动,消除相切处的密度空洞
- **DroneEntity 弧长驱动**:运动改为 `_traveledArc += speed×dt` + `RouteGeometry.PositionAt`,删除 `CurrentWaypointIndex` 逐段插值、`dist<1.0` 阈值、`step>=dist` snap 丢位移等本地逻辑
- **CloudExpansionModel.RoundsNeeded** 签名:`effectiveRadius` 参数改为 `spacing`间距由调用方planner按重叠系数传入公式仍在共享模块
- **策略参数从配置读**威胁类型系数、弹药匹配表、临界概率0.5、拦截概率上限0.95)全部从 `PlannerConfig`planner 内零硬编码
### Fixed — planner 与引擎物理一致性
- **PathInSphere 云团参考系修正**:毁伤判定改在云团参考系计算(`drone.Pos cloud.Center`),修正云团在 tick 内移动导致的每 tick ~2m 系统误差
- **ComputeEffectiveRadius 云龄 bug**:从 `ArrivalTime×2`(无人机飞行时间,概念错误)改为 `expansionTime`(云团自身膨胀时长)
### Removed
- SimulationEngine 所有硬编码桌面路径的诊断写入(`planner_targets.csv`/`cloud_actual.csv`/`path_in_cloud.txt`/`_hitLog`/`_totalPathInCloud`——这些造成集成测试并行时文件竞争flaky 失败根因)
- DefaultDefensePlanner 的硬编码 `MatchTable`/`TypeCoefficient` 字典(移入配置)
### Metrics
- 测试 167 → **191**+24全量通过 41s
- 关键验证:活塞+西风、空基+东风有风场景击毁成功Z 向航路云团沿航路分布L 形折线多 waypoint 运动正确
---
## [0.4.1] - 2026-06-14
### Added
- 天气纳入 Planner 规划:抛撒点风偏预补偿。云团生成后会在 `expansionTime` 内被风吹偏 `windVec × expansionTime`Planner 逆风预置抛撒点 `cloudGen = 穿越点 windVec × expansionTime`,使云团漂移后中心正好回到无人机航路上
- 单元测试:`DispersionModelTests` Phase3 天气差异 2 项(雾 vs 晴、夜 vs 晴);`DefensePlannerTests` 风偏补偿 4 项(无风/东风/西风/北风方向性)
### Fixed
- `GaussianPuffDispersion.Tick` Phase3 写死 `WeatherType.Sunny` 的 bug原代码 `GetStabilityClass((WeatherType)0, windSpeed)` 导致任何天气下扩散行为都相同,预估(`CloudExpansionModel` 已正确读 env与运行时模型不一致。改为存储 `env` 字段,使用真实 `env.WeatherType`
### Changed
- `DefaultDefensePlanner.GenerateFireEventsAt` 区分无人机穿越点 `tx,tz`(用于 `txArrival` 计算)与云团生成点 `cloudGenX,Z`(弹药瞄准目标 + FireEvent 输出)
- 移除 `Solve``e.TargetX = mid.X + offset` 的覆盖(会抹掉风偏补偿;多发散布偏移已由 `targetOffset` 参数处理)
---
## [0.4.0] - 2026-06-13
### Added
- 路径积分毁伤判定:`DamageAssessment.PathInSphere` 替代离散 `ContainsPoint`,无人机穿云暴露精确计算
- 损伤模型暴露所需暴露时间:`IDamageModel.RequiredExposureSeconds`Planner 从损伤模型读取所需覆盖时长
- 云团膨胀独立模块:`CloudExpansionModel`,封装 `RadiusAt`/`DensityAt`/`TimeToReach`/`TimeToDensity`/`RoundsNeeded`
- 单元测试:`DamageAssessment` 5 项 (穿心/相邻/间隙/9 链/跨云)、`Kinematics` 抛物线 4 项 (45°标准公式验证)
- 密度阈值统一:引擎处 `cloudDensity >= ammo.EffectiveConcentration` 统一检查,三个损伤模型去掉各自硬编码阈值
### Changed
- Planner `CalcRoundsNeeded` 从硬编码 `2:6s` 改为 `_damageModel.RequiredExposureSeconds`
- `CloudExpansionModel.RoundsNeeded` 间距 `= 2R`(消除 `1.5f` 魔法数字)
- `FireUnit` = 物理单元不拆通道Planner 一辆车发一条线
- `MunitionEntity.HasArrived` 上升段触发(不再要求下行),附带精确插值
- 空基平台投放逻辑:飞向云位、距目标 `driftDist` 释放、位置插值保留
- 仿真场景缩短Piston 5km/150km/h、Jet 5km/200km/h、AirBased 10km/150km/h全量 22s
### Fixed
- 抛物线弹道精确求解:`CalculateLaunchAngle`/`ParabolicShellTime` 解 tan(θ) 二次方程取平射解
- 空基 `PlatformEntity` 投放时不再传送到终点
- 缺失 `else` 导致空基走地基分支
- `Event.OccurredAt` 使用精确 `FireEvent.FireTime`/`m.ArrivalTime`
- `_frameDb.Commit` 批量 50 帧
- 报告火力单元计数(`_entityCounter` 重置)
### Removed
- `ComputeEffectiveRadius` 公式转移到 `CloudExpansionModel`
- 损伤模型内部浓度阈值(`TriggerThreshold`/`EffectiveThreshold`
- `CalcRoundsNeeded` `/2` 魔法加 1
### Added
- DefensePlanner 防御规划引擎:五步流水线(威胁排序 → 弹药匹配 → 候选生成 → 贪心分配 → 时序生成)
- 空基平台飞行与投弹状态机Idle → FlyingToTarget → ReadyToRelease载机速度继承弹药抛物线下落
- 火力单元通道模型GunCount × ChannelsPerGunChannelInterval 物理间隔Cooldown 冷却
- 默认火力单元配置4 种模板(轻型/标准/重地基 + 标准空基 8 通道)
- 推荐算法统一处理空基/地基平台类型
- 物理间隔错开发射:发射间隔 = 云团直径 / 无人机速度
- 每发弹按目标点位置独立计算到达时间
- 报告显示 per-unit 发射数 + 事件标注火力单元
### Changed
- IDefenseAdvisor → IDefensePlanner统一输入 `List<FireUnit>` + `List<DroneGroup>`
- FireUnit 重构:统一表达空基/地基平台Type/Position/GunCount/ChannelsPerGun
- SimulationEngine 内部调用 Planner 自动生成发射计划
- MunitionEntity 空投使用 Kinematics.AirDropPosition继承载机速度 + 重力)
- PlatformEntity 加入 CurrentVelocity 属性
### Fixed
- 同平台多弹 FireTime 相同导致冷却跳过FireTime += i × Cooldown
- 同平台弹药飞行时间按目标位置变化被吃掉:统一用中心点飞行时间
- recommendedTiming 按每发目标点独立计算(非中点)
- 空基 FireEvent.MuzzleVelocity 错误写 800
- SQLite domain reload 崩溃SqliteConnectionTracker + AssemblyReloadEvents.beforeAssemblyReload
### Removed
- IDefenseAdvisor / DefaultDefenseAdvisor / RecommendMultiGroup
- SimulationRunner.BuildFireSchedule fallback
- 所有硬编码默认值55f/800f/1000f/+500f/0.1f clamp
- 所有静默 fallbacknull return/empty events
- Models.SimEvent 死代码
---
## [0.2.0] - 2026-06-12
### Added
- 三阶段气溶胶扩散模型(爆轰膨胀 → 湍流扩散 → 高斯扩散)
- 防御推荐算法:根据弹药规格自动计算齐射数、间距、拦截概率
- 仿真引擎事件驱动OnMunitionLaunched / OnCloudGenerated / OnDroneDestroyed 等 6 个事件
- FireSchedule 发射计划:推荐方案直接生成,引擎执行
- 多编队多批次支持RoutePlan 多航路、RecommendMultiGroup 火力分配
- 仿真报告:七章结构(结果/环境/目标/推荐/部署/时序/时间线),自动导出 Markdown
- 数据库种子:首次建表自动从 JSON 导入弹药规格
- 帧数据 TTL 清理6 个月过期自动删除)
- 仿真加速TimeScale 支持
- Unity Manager 桥接层ModelManager / ScenarioManager / SimulationRunner / ReportManager / ReplayController / GroupManager
- Unity 全流程验证:一键菜单验证 7 个模块
- 边界测试:空部署 / 强风 / 超长航路 / 空基弹药
### Changed
- 仿真引擎重构为纯执行器,不包含决策逻辑
- RoutePlan 主键改为 Id支持多编队
- 弹药参数改为 JSON 文件配置
- 报告结构重组,结果前置
### Fixed
- 弹药飞行时间用真实弹道计算
- 云团生成位置使用目标坐标
- 编队偏移应用到初始位置
- Edit 模式下 AddComponent 不触发 Awake
---
## [0.1.0] - 2026-06-11
### Added
- 项目初始化:.NET Standard 2.1 类库 + xUnit 测试框架
- 数据模型11 张业务表 + 2 张运行时表)
- SQLite 持久化 + 任务分库架构
- 想定管理5 步配置 CRUD
- 仿真引擎基础框架