181 lines
15 KiB
Markdown
181 lines
15 KiB
Markdown
# Swerling RCS 模型设计文档
|
||
|
||
## 1. 引言
|
||
|
||
本文档详细描述了项目中 `SwerlingRcsModel.cs` 类的设计与实现,该类用于模拟雷达散射截面(RCS)的Swerling统计起伏模型。Swerling模型是雷达系统分析和目标探测性能评估中的重要工具,它描述了不同类型目标由于姿态微小变化或内部结构复杂性导致的RCS值随机波动特性。
|
||
|
||
关于Swerling模型的更详细理论背景,请参考项目文档:[RCS统计模型理论](./theory.md#坦克装甲车和直升机的rcs统计模型选择与其运动特性结构复杂度及雷达观测条件密切相关以下是具体分析)。
|
||
|
||
`SwerlingRcsModel` 类的具体实现位于以下路径:
|
||
`ThreatSource/src/Utils/SwerlingRcsModel.cs`
|
||
|
||
## 2. 设计目标
|
||
|
||
`SwerlingRcsModel` 类的设计旨在满足以下目标:
|
||
|
||
* **模拟RCS统计起伏**:提供一种机制来模拟目标RCS值的统计性波动,而不是使用固定的RCS值。
|
||
* **支持标准Swerling模型**:实现对Swerling I、II、III、IV四种经典模型的支持。
|
||
* **区分起伏速率**:能够区分慢起伏(slow fluctuation, Swerling I/III)和快起伏(fast fluctuation, Swerling II/IV)目标。
|
||
* **可配置平均RCS**:允许用户为目标指定一个平均RCS值,作为所选统计分布的基准参数。
|
||
* **支持可复现性**:通过可选的随机数生成器种子,确保在需要时能够获得可复现的RCS序列。
|
||
* **自动化模型选择**:提供基于目标装备类型(`EquipmentType`)和运动状态(`MotionStateType`)自动选择合适Swerling模型的内部逻辑。
|
||
|
||
## 3. 类详细设计: `SwerlingRcsModel`
|
||
|
||
### 3.1 命名空间
|
||
|
||
`ThreatSource.Utils`
|
||
|
||
### 3.2 枚举 (Enums)
|
||
|
||
#### `TargetSwerlingModelType`
|
||
此枚举定义了支持的Swerling模型类型:
|
||
* `Swerling_I`: 慢起伏模型,RCS值服从指数分布(卡方分布,2个自由度)。RCS值在一个扫描周期内保持不变,但在不同扫描周期之间独立变化。
|
||
* `Swerling_II`: 快起伏模型,RCS值服从指数分布(卡方分布,2个自由度)。RCS值在每个雷达脉冲之间都独立变化。
|
||
* `Swerling_III`: 慢起伏模型,RCS值服从卡方分布,4个自由度(等价于形状参数k=2的伽马分布)。RCS值在一个扫描周期内保持不变,但在不同扫描周期之间独立变化。
|
||
* `Swerling_IV`: 快起伏模型,RCS值服从卡方分布,4个自由度(等价于形状参数k=2的伽马分布)。RCS值在每个雷达脉冲之间都独立变化。
|
||
|
||
#### `MotionStateType`
|
||
此枚举定义了目标可能的运动状态,用于辅助 `DecideSwerlingModel` 方法选择合适的Swerling模型:
|
||
* `Static`: 目标静止。
|
||
* `ConstantVelocity`: 目标进行匀速运动。
|
||
* `Maneuvering`: 目标进行机动飞行/行驶。
|
||
* `Other`: 其他未明确定义的运动状态。
|
||
|
||
### 3.3 主要字段 (Fields)
|
||
|
||
* `private readonly Random _randomGenerator;`
|
||
* 一个 `System.Random` 类的实例,用于生成模拟所需的随机数。其种子可以在构造函数中指定,以实现可复现的仿真结果。
|
||
* `private readonly Dictionary<string, double> _slowFluctuationRcsCache;`
|
||
* 一个字典,用于缓存慢起伏模型(Swerling I 和 III)在当前扫描周期内的RCS值。
|
||
* 键(`string`): 目标的唯一ID (`targetId`)。
|
||
* 值(`double`): 该目标在当前扫描周期缓存的RCS值(单位:平方米)。
|
||
|
||
### 3.4 构造函数 (Constructor)
|
||
|
||
* `public SwerlingRcsModel(int? seed = null)`
|
||
* 初始化 `_randomGenerator` 实例。如果提供了 `seed` 参数,则使用该种子;否则,使用默认的、基于时间的种子。
|
||
* 初始化 `_slowFluctuationRcsCache` 为一个新的空字典。
|
||
|
||
### 3.5 核心公共方法 (Core Public Method)
|
||
|
||
* `public double GetRealtimeRcs(string targetId, EquipmentType equipmentType, MotionStateType motionState, double averageRcsValue, bool isNewScanPeriod)`
|
||
* **参数**:
|
||
* `targetId (string)`: 目标的唯一标识符。对于慢起伏模型,此ID用于在同一扫描周期内缓存和复用RCS值。
|
||
* `equipmentType (EquipmentType)`: 目标类型(如Tank, Helicopter等),用于内部模型选择。
|
||
* `motionState (MotionStateType)`: 目标的运动状态,用于内部模型选择。
|
||
* `averageRcsValue (double)`: 目标的平均RCS值(单位:平方米),作为所选统计分布的参数。
|
||
* `isNewScanPeriod (bool)`: 指示当前调用是否代表一个新的扫描周期的开始。此参数仅对慢起伏模型有意义,用于决定是否应重新采样RCS值。
|
||
* **内部逻辑**:
|
||
1. 调用 `DecideSwerlingModel(equipmentType, motionState)` 确定要使用的 `TargetSwerlingModelType`。
|
||
2. 参数验证:
|
||
* 如果选择的是慢起伏模型(Swerling I 或 III)但 `targetId` 为空或null,则抛出 `ArgumentNullException`。
|
||
* 如果 `averageRcsValue` 小于或等于0,则直接返回0.0,不进行采样。
|
||
3. 根据确定的 `TargetSwerlingModelType` 执行相应的采样逻辑:
|
||
* **`Swerling_I` (慢起伏, 指数分布)**:
|
||
* 如果 `isNewScanPeriod` 为 `true` 或者 `_slowFluctuationRcsCache` 中不存在 `targetId` 对应的项,则调用 `SampleExponentialDistribution(averageRcsValue)` 生成新的RCS值,并将其存储(或更新)到缓存中(以 `targetId` 为键)。
|
||
* 否则,直接从缓存中读取并返回之前存储的RCS值。
|
||
* **`Swerling_II` (快起伏, 指数分布)**:
|
||
* 每次调用都直接执行 `SampleExponentialDistribution(averageRcsValue)` 并返回新的RCS值,不使用缓存。
|
||
* **`Swerling_III` (慢起伏, 卡方4自由度/Gamma k=2)**:
|
||
* 与Swerling I类似,但调用 `SampleGammaDistributionK2(averageRcsValue)` 进行采样。同样处理缓存逻辑。
|
||
* **`Swerling_IV` (快起伏, 卡方4自由度/Gamma k=2)**:
|
||
* 每次调用都直接执行 `SampleGammaDistributionK2(averageRcsValue)` 并返回新的RCS值,不使用缓存。
|
||
* 如果内部确定的模型类型不被支持(理论上不应发生),则抛出 `ArgumentOutOfRangeException`。
|
||
* **返回值**:
|
||
* 模拟计算得到的瞬时RCS值(单位:平方米)。
|
||
|
||
### 3.6 内部辅助方法 (Private Helper Methods)
|
||
|
||
* `private double SampleExponentialDistribution(double sigmaAverage)`
|
||
* **用途**: 为Swerling I型和II型模型从指数分布中采样RCS值。
|
||
* **参数**: `sigmaAverage` (目标的平均RCS值,即指数分布的尺度参数)。
|
||
* **返回**: 一个根据指数分布采样得到的RCS值。如果 `sigmaAverage` 非正,则返回0.0。
|
||
* **实现**: 使用逆变换采样法 `(-sigmaAverage * Math.Log(1.0 - u))`,其中 `u` 是 `_randomGenerator.NextDouble()` 产生的 (0,1) 均匀分布随机数。
|
||
|
||
* `private double SampleGammaDistributionK2(double sigmaAverage)`
|
||
* **用途**: 为Swerling III型和IV型模型从形状参数k=2的伽马分布中采样RCS值。
|
||
* **参数**: `sigmaAverage` (目标的平均RCS值)。
|
||
* **返回**: 一个根据伽马分布(k=2)采样得到的RCS值。如果 `sigmaAverage` 非正,则返回0.0。
|
||
* **实现**: 通过对两个独立的、尺度参数为 `sigmaAverage / 2.0` 的指数分布随机变量求和来实现。这两个指数分布的采样通过调用 `SampleExponentialDistribution` 完成。
|
||
|
||
* `private static TargetSwerlingModelType DecideSwerlingModel(EquipmentType equipmentType, MotionStateType motionState)`
|
||
* **用途**: 根据目标类型和运动状态,决定应采用的Swerling模型类型。
|
||
* **输入**:
|
||
* `equipmentType (EquipmentType)`: 目标装备类型。
|
||
* `motionState (MotionStateType)`: 目标运动状态。
|
||
* **输出**: `TargetSwerlingModelType`。
|
||
* **决策规则**:
|
||
* `EquipmentType.Tank` 或 `EquipmentType.APC`:
|
||
* 若 `motionState` 为 `Maneuvering`,则返回 `TargetSwerlingModelType.Swerling_III`。
|
||
* 否则,返回 `TargetSwerlingModelType.Swerling_I`。
|
||
* `EquipmentType.Helicopter`:
|
||
* 若 `motionState` 为 `Maneuvering`,则返回 `TargetSwerlingModelType.Swerling_IV`。
|
||
* 否则,返回 `TargetSwerlingModelType.Swerling_II`。
|
||
* 对于 `EquipmentType.Unknown` 或其他未明确处理的 `equipmentType`:
|
||
* 返回 `TargetSwerlingModelType.Swerling_I` 并通过 `Trace.TraceWarning` 记录一条警告信息。
|
||
|
||
### 3.7 缓存管理方法 (Cache Management Methods)
|
||
|
||
* `public void ClearCachedRcs(string targetId)`
|
||
* **功能**: 从慢起伏模型的RCS缓存 (`_slowFluctuationRcsCache`) 中移除指定 `targetId` 的条目。
|
||
* 主要用于当一个慢起伏目标不再被跟踪或其状态需要重置时。
|
||
|
||
* `public void ClearAllCachedRcs()`
|
||
* **功能**: 清除慢起伏模型RCS缓存中的所有条目。
|
||
* 用于在仿真重置、扫描周期结束或需要完全刷新所有慢起伏目标状态时调用。
|
||
|
||
## 4. 集成与使用场景 (以 `MillimeterWaveGuidanceSystem` 为例)
|
||
|
||
`SwerlingRcsModel` 类主要被 `MillimeterWaveGuidanceSystem` 用于在目标探测过程中为每个潜在目标计算一个动态的RCS值。
|
||
|
||
### 4.1 实例化
|
||
|
||
在 `MillimeterWaveGuidanceSystem` 的构造函数中,会创建一个 `SwerlingRcsModel` 的实例:
|
||
```csharp
|
||
swerlingRcsModel = new SwerlingRcsModel();
|
||
```
|
||
这里使用了无参构造函数,因此随机数生成器会使用默认种子。
|
||
|
||
### 4.2 `GetRealtimeRcs` 调用
|
||
|
||
在 `MillimeterWaveGuidanceSystem` 的 `TryDetectAndTrackTarget` 方法内部,当计算每个目标的SNR之前,会调用 `GetRealtimeRcs` 来获取其波动后的RCS值:
|
||
```csharp
|
||
// 假设 rcsLinear 是从目标 RcsPattern 或默认值获取的平均RCS
|
||
rcsLinear = swerlingRcsModel.GetRealtimeRcs(
|
||
target.Id, // 目标唯一ID
|
||
target.Properties.Type, // 目标装备类型
|
||
motionState, // 运动状态 (根据目标速度判断为 Static 或 ConstantVelocity)
|
||
rcsLinear, // 平均RCS值
|
||
false // <<-- 注意:isNewScanPeriod 当前硬编码为 false
|
||
);
|
||
```
|
||
**关键点**:
|
||
* **`motionState` 参数**: 在 `MillimeterWaveGuidanceSystem` 的当前实现中,`motionState` 参数在调用 `GetRealtimeRcs` 前被确定。它首先被初始化为 `MotionStateType.Static`。如果检测到目标 `target.KState.Speed` 大于 `0.1`,则 `motionState` 被更新为 `MotionStateType.ConstantVelocity`。这意味着 `SwerlingRcsModel` 内部的 `DecideSwerlingModel` 方法会根据这一(有限的)动态信息选择Swerling模型(例如,坦克/APC 会在 `Static` 和 `ConstantVelocity` 两种情况下都选用Swerling I,直升机则都选用Swerling II,因为 `DecideSwerlingModel` 中 `ConstantVelocity` 未被特殊处理以触发Swerling III/IV)。
|
||
* **`averageRcsValue` 参数**: 使用的是从目标自身 `RcsPattern` (如果存在且有效) 计算得到的、或一个默认的RCS值(线性单位,平方米)作为输入。Swerling模型在此基础上施加统计波动。
|
||
* **`isNewScanPeriod` 参数**: 此参数在 `MillimeterWaveGuidanceSystem` 的调用中硬编码为 `false`。
|
||
|
||
### 4.3 慢起伏缓存管理与扫描周期
|
||
|
||
尽管 `isNewScanPeriod` 在单次 `GetRealtimeRcs` 调用时被硬编码为 `false`,但慢起伏模型的RCS值并不会永久不变。`MillimeterWaveGuidanceSystem` 通过其自身的扫描逻辑间接管理RCS的刷新:
|
||
* 在 `UpdateConicalScan` 方法中,有一个 `scanCycleTimer` 用于跟踪当前扫描的持续时间。
|
||
* 当 `scanCycleTimer` 达到一个完整扫描周期所需的时间 (由 `360 / config.ScanAngularSpeedDeg` 计算得到) 时,会调用 `swerlingRcsModel.ClearAllCachedRcs()`。
|
||
* 这个调用会清空所有慢起伏目标的缓存RCS值。因此,在下一个扫描周期开始后,当这些目标再次被 `GetRealtimeRcs` 处理时,由于缓存中已无它们的数据(即使 `isNewScanPeriod` 仍为 `false`),`SwerlingRcsModel` 内部的逻辑 (`!_slowFluctuationRcsCache.TryGetValue(...)`) 会触发一次新的采样。
|
||
|
||
这种机制有效地为所有慢起伏目标实现了基于扫描周期的RCS刷新。
|
||
|
||
### 4.4 对SNR计算的影响
|
||
|
||
由 `SwerlingRcsModel` 生成的波动RCS值(`rcsLinear`)随后被用于 `MillimeterWaveGuidanceSystem.CalculateSNR` 方法中。RCS值的波动会直接导致计算出的信噪比(SNR)产生相应的波动,这进一步影响了目标的探测概率、进入跟踪模式的条件以及最终的锁定稳定性,使得仿真更接近实际雷达系统面临的情况。
|
||
|
||
## 5. 当前实现的假设与限制
|
||
|
||
* **运动状态硬编码**: 如前所述,`MillimeterWaveGuidanceSystem` 在调用 `GetRealtimeRcs` 时,将 `motionState` 参数硬编码为 `MotionStateType.Static`。这限制了 `SwerlingRcsModel` 根据目标实际运动状态动态选择Swerling I/III或II/IV模型的能力。当前,选择主要基于 `equipmentType`,且总是对应于非机动情况(Swerling I 或 II)。
|
||
* **运动状态判断的局限性**: `MillimeterWaveGuidanceSystem` 目前根据目标速度是否大于一个阈值 (`0.1`) 来区分 `MotionStateType.Static` 和 `MotionStateType.ConstantVelocity`。它尚未实现对 `MotionStateType.Maneuvering` (机动)状态的判断。因此,`SwerlingRcsModel` 的 `DecideSwerlingModel` 方法目前无法根据目标是否在进行机动来选择Swerling III 或 IV 模型;对于非机动(包括Static和ConstantVelocity),它将为坦克/APC选择Swerling I,为直升机选择Swerling II。
|
||
* **`isNewScanPeriod` 硬编码**: `isNewScanPeriod` 参数在调用时硬编码为 `false`。慢起伏模型的RCS刷新完全依赖于 `MillimeterWaveGuidanceSystem` 内部周期性地调用 `ClearAllCachedRcs()`。
|
||
* **基于平均RCS的波动**: Swerling模型是在一个外部提供的 `averageRcsValue` 基础上引入统计波动。该 `averageRcsValue` 本身可能是一个静态值或基于目标朝向的确定性计算结果,Swerling模型则在此确定性平均值周围产生随机起伏。
|
||
|
||
## 6. 未来可能的改进 (可选)
|
||
|
||
* **增强运动状态判断**: 当前 `motionState` 主要区分静止和(广义的)非机动匀速。未来可以考虑引入更复杂的逻辑来判断目标的 `MotionStateType.Maneuvering` (机动)状态,例如基于目标加速度或角速度的变化。这将使得 `SwerlingRcsModel` 能够更精确地为机动目标选择Swerling III/IV模型。
|
||
* **细化 `isNewScanPeriod` 控制**: 如果未来需要更精细或针对特定目标的RCS刷新控制(例如,某些目标可能比其他目标更快地改变其统计特性),可以考虑更灵活地使用 `isNewScanPeriod` 参数,而不是仅依赖全局的 `ClearAllCachedRcs()`。 |