CounterDroneBackend/CHANGELOG.md
tian ff6db2786e VERSION 0.10.0 — 模型重命名、属性完善、文档同步
- VERSION: 0.9.0 → 0.10.0
- CHANGELOG: 新增 0.10.0 条目
- 架构设计 V15: DroneType 枚举清理、表结构加 Model/Description
- 对接文档 V1.6: 去历史对照,只写现状核心模型表
- 数据库迁移: 删旧表 SimTask/TargetConfig/SimulationReport
- 238 测试全过
2026-06-18 15:24:14 +08:00

19 KiB
Raw Blame History

Changelog


[0.10.0] - 2026-06-18

Breaking — 平台物理统一 + 模型重命名

  • 空基/地基物理统一:去除 DefensePlanner 所有平台类型分支,统一用 InterceptCalculator.Compute(删 ComputeHorizontal),统一用 MuzzleVelocity(删 CruiseSpeed 分支)
  • 抛物线选解策略:两解逐一计算距离匹配 + fireTime>0 可行性,选最早拦截的解(非简单选高角/低角)
  • TargetTypeDroneType:删 Electric/Piston,重编号 HighSpeed=2TargetConfig.DroneType 属性同步改名
  • TargetConfigDroneProfile:核心模型重命名
  • SimTaskScenario:想定主表重命名,ScenarioNumber 取代 TaskNumber
  • TaskFullConfigScenarioConfig:聚合配置重命名,Task 属性 → Info
  • TaskIdScenarioId:所有 FK 重命名
  • ScenarioService 方法CreateTaskCreateScenarioDeleteTaskDeleteScenarioSearchTasksSearchScenariosGetTaskDetailGetScenarioDetail

Added — 模型业务属性

  • DroneProfile / DroneSpec+Model(型号)、+Description(描述/用途)
  • Scenario+Description(想定描述)
  • EquipmentDeployment / FireUnitSpec+Description
  • ReportManager.Export(reportId, outputDir):支持指定导出路径

Changed — 数据库迁移

  • CreateMainTables 删旧表 SimTaskTargetConfigSimulationReport(自动重建)
  • 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 / DetectionCalculatorBurstChargeKg≤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
  • CloudEntityPos/Radius/Density/Phase/Elapsed 便捷属性(不再穿透 Dispersion
  • MunitionEntityLaunchAngle/Azimuth/MuzzleVelocity/FlightDuration/Start/LaunchTime/ElapsedTime/Velocity 全部 public
  • DroneEntityTraveledArc/TotalArc/Progress
  • PlatformEntityTarget/FlightDistance/FlownDistance
  • DetectionEntityPosX/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 采样法:线段-圆求交改为沿航路采样步长≤50mIsInCoverage
  • DetectionEntity:运行时探测实体 + per-drone 状态机Undetected ⇄ DetectedTick 第5步扫描
  • 实时探测事件OnTargetDetected / SimEventType.TargetDetected / PlanningFailed
  • EquipmentDeployment + DetectionSource+4 个 3D 球冠字段MinElevation/MaxElevation/MinDetectAlt/MaxDetectAlt
  • 默认数据全部加入 3D 球冠参数(地基 -5°~85°、空基 -80°~30°

Added — Planner 诊断 + 拦截点计算

  • InterceptCalculator:抛物线与直线联立方程求解拦截点(地基可变角度 + 空基固定水平 θ=0°
  • HasInterceptWindow:拦截窗口可行性检查(从探测边界算有效飞行时间)
  • TryGenerateFireEvents:每个 return events 带拒绝原因
  • Planner Summary:含失败原因 + 建议值(探测范围/弧长/反应时间)
  • PlannerConfig+ReactionTime5s/ ExpansionFactor0.9/ TimingSafetyMargin1s

Changed — 消除硬编码

  • 速度从 waypoint.Speed 读取DroneEntity.CruiseSpeed / GetDroneSpeedKph 不再用 DroneProfile.TypicalSpeed
  • AmmunitionSpec +Phase2Duration30sCloudExpansionModel 不再写死 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 表移除:原 GroupDroneFleet / EquipmentGroup不再创建。向后兼容保留旧库中的 Group 表,但不再主动读写
  • GroupType 枚举删除:不再区分 DroneFleet / EquipmentGroup
  • GroupService / IGroupService / GroupRepository 删除:不再需要编组管理服务
  • Unity GroupManager 删除:不再需要编组管理桥接

Changed — 数据模型重命名

  • **GroupIdWaveId**DroneProfile 四表的编组外键重命名为批次外键
  • RoutePlan 索引重命名(ScenarioId, GroupId)(ScenarioId, WaveId)
  • RoutePlanRepository / WaypointRepositoryGetByScenarioAndGroupGetByScenarioAndWave
  • IScenarioService.SaveRoutegroupId 参数 → waveId

Changed — 算法类型重命名

  • DroneGroupDroneWaveAlgorithmTypes、IDefensePlanner、DefensePlanner、SimulationEngine 全部使用新类型名
  • DroneGroupIdDroneWaveIdUnitAssignment 中的编队引用 → 批次引用
  • 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 → 2044删除 Group 相关测试),全量通过 63s
  • 0 编译错误0 编译警告

[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<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.jsonplanner 策略参数全部外置(重叠系数、威胁类型系数、弹药匹配表、临界/上限概率阈值)。代码零默认值,文件缺失即抛异常
  • 单元测试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)全部从 PlannerConfigplanner 内零硬编码

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 × expansionTimePlanner 逆风预置抛撒点 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 输出)
  • 移除 Solvee.TargetX = mid.X + offset 的覆盖(会抹掉风偏补偿;多发散布偏移已由 targetOffset 参数处理)

[0.4.0] - 2026-06-13

Added

  • 路径积分毁伤判定:DamageAssessment.PathInSphere 替代离散 ContainsPoint,无人机穿云暴露精确计算
  • 损伤模型暴露所需暴露时间:IDamageModel.RequiredExposureSecondsPlanner 从损伤模型读取所需覆盖时长
  • 云团膨胀独立模块: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
  • 仿真引擎基础框架