Planner no longer writes local physics formulas. All kinematics/geometry/damage go through shared utility classes (Kinematics/RouteGeometry/CloudExpansionModel/DamageAssessment). Core: RouteGeometry (route geometry), PlannerConfig + planner_config.json (config externalization). Planner route-aware layout (offset along tangent), cloud overlap 20pct. DroneEntity arc-length driven. Fixes: PathInSphere cloud-frame correction (root cause), GaussianPuffDispersion hardcoded Sunny, ComputeEffectiveRadius cloud age, planner wind offset, remove drone wind bias. Tests 167 to 191, 41s. Windy scenarios pass.
169 lines
8.8 KiB
Markdown
169 lines
8.8 KiB
Markdown
# Changelog
|
||
|
||
---
|
||
|
||
## [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 × ChannelsPerGun,ChannelInterval 物理间隔,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)
|
||
- 所有静默 fallback(null 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)
|
||
- 仿真引擎基础框架
|