@@ -42,13 +42,13 @@ flowchart TD
A3 --> OUT1["输出更新航迹 + 起批航迹历史点 + 消亡批号"]
M3 --> B1["TAS 凝聚(单帧)"]
B1 --> B2["仅对指定批号航迹 做关联/EKF 或外推"]
B1 --> B2["按航迹指纹定位航迹,仅对它 做关联/EKF 或外推"]
B2 --> B3["TAS 超时消亡"]
B3 --> OUT2["输出该批号 航迹"]
B3 --> OUT2["输出该航迹"]
OUT1 --> BC["Beam_Ctrl 波束控制"]
OUT2 --> BC
BC --> OUT3["TrackingBeam:距离/方位/俯仰/批号 "]
BC --> OUT3["TrackingBeam:距离/方位/俯仰/航迹指纹 "]
```
---
@@ -77,7 +77,7 @@ flowchart TD
C --> D{"判圈条件成立(由配置 scan_mode 选择)?<br/>scan_mode=0 相扫: Beam_index_aiz <= last_beam_num<br/>scan_mode=1 机扫: Beam_index_aiz == 0"}
D -->|"是"| E["return 1:满一圈,执行 TWS 航迹处理"]
D -->|"否"| F["return 2:未满圈,仅做滑窗凝聚"]
B -->|"1 = TAS"| G["写入 TAS 缓存<br/>记录 TAS 批号 与本帧时间戳"]
B -->|"1 = TAS"| G["写入 TAS 缓存<br/>记录 TAS 航迹指纹 与本帧时间戳"]
G --> H["return 3: TAS 处理"]
B -->|"其它"| I["return 0:无效数据,丢弃"]
```
@@ -90,6 +90,7 @@ flowchart TD
- 两种模式下 `last_beam_num` 每帧都会更新,仅判满圈时 `circle_id++` 并返回 1;判圈行为不再由构建期区分(机扫/相扫已合并为同一份构建),仅由配置项 `scan_mode` 决定(见 README 4.2)。
- 机扫下波位号 0 是每圈的起始波位,因此**每圈恰好触发一次 model=1**。
- TAS 数据不参与判圈,**每来一帧就处理一次**(TAS 是调度的跟踪波位,本身就是单目标 CPI)。
- TAS 帧携带的是**航迹指纹**( `DataRev::TAS_track_index` ,字段名沿用,V1.5.9 起语义为指纹),`track_process(model=3)` 先用它在航迹表中定位航迹,再进入 TAS 关联(见 7.1、7.2 与 README 9.12)。
### 2.3 调度:model 与动作的对应
@@ -434,20 +435,21 @@ flowchart TD
| 项 | TWS | TAS |
|---|---|---|
| 凝聚 | 相邻两帧滑窗,近程多速度维约束 | 单帧,恒有速度维约束 |
| 处理对象 | 全部可靠航迹 × 全部点 | **仅指定批号**的这一条航迹 × 全部点 |
| 处理对象 | 全部可靠航迹 × 全部点 | **仅由指纹定位到的那一条航迹 ** × 全部点(旧版按批号指定) |
| 俯仰/高度门限 | 俯仰门限已注释停用;**高度门限生效**(按距离分段,e0bf227 起) | **高度门限生效 ** (按距离分段,取值与 TWS 相同) |
| ΔT ≤ 0 | 参与选取但只消费点迹、不更新 | **直接跳过该点 ** (并以 `RDP_LOG_WARN` 记告警日志) |
| 外推时间 | 按 work_mode 数据率固定步长 | 按 `最新时间戳 − 航迹时间` |
| 外推触发轮数 | `Extrapolate_round <= extrapolate_max` (配置项 3)才预测 | `Extrapolate_round >= extrapolate_max_tas` (配置项,样例相扫 5 / 机扫需配 48)才预测(方向与 TWS 相反) |
| 输出 | 本圈有更新的航迹(关联到实点或成功外推,输出后清 `Track_Update_Flag` ) | 该批号 航迹且本圈有更新 |
| 输出 | 本圈有更新的航迹(关联到实点或成功外推,输出后清 `Track_Update_Flag` ) | 该航迹且本圈有更新;TAS 波束对外下发**航迹指纹**( `Track_fingerprint` ),不再下发批号 |
### 7.2 TAS 关联与更新
``` mermaid
flowchart TD
A["TAS 本帧点迹 + 指定批号 航迹"] --> B{"该批号航迹存在 ?"}
A["TAS 本帧点迹 + 航迹指纹 "] --> B{"按指纹找到航迹 ?"}
B -- 否 --> Z["直接返回(不做任何处理)"]
B -- 是 --> C["IMM 交互;航迹 point_flag 置 0 "]
B -- 是 --> B1["置 manual_tracking_flag=1、Track_Mode=1 "]
B1 --> C["IMM 交互;航迹 point_flag 置 0"]
C --> D["逐点:ΔT ≤ 0 → 记告警并跳过"]
D --> E["逐点:三模型统计距离 d1/d2/d3 + 高度门限"]
E --> F{"d² < 16(任一模型)且高度门限通过?"}
@@ -455,7 +457,7 @@ flowchart TD
F -- 否 --> H["丢弃"]
G --> I["取 d_min 最小的一点"]
I --> J["三模型 EKF 更新 → 概率更新 → 融合<br/>刷新时间/点信息/高度平滑"]
J --> K["输出该批号 航迹(Track_Update_Flag==1 才输出,输出后清零)"]
J --> K["输出该航迹(Track_Update_Flag==1 才输出,输出后清零)"]
E --> L{"候选表为空?"}
L -- 是 --> L1{"Extrapolate_round ≥ extrapolate_max_tas ?"}
L1 -- 是 --> M["按 ΔT = 最新时间戳 − 航迹时间 外推一帧<br/>(ΔT ≤ 0 则跳过),Track_Update_Flag=1"]
@@ -500,23 +502,25 @@ flowchart TD
- 队列未满(相扫最多 4 个 / 机扫最多 1 个);
- 不在 TAS 禁止区(距离-方位矩形)。
入队动作:写批号、标记非空、`last_track_time = T_track` 、**航迹 Track_Mode 置 1**,并**立即输出一次该航迹更新**(通知宿主跟踪状态变化)。
入队动作:写 `Track_Index` (队列内部键,仍是 批号) 、标记非空、`last_track_time = T_track` 、**航迹 Track_Mode 置 1**,并**立即输出一次该航迹更新**(通知宿主跟踪状态变化;V1.5.9 起该行按常规关联输出的完整字段填充,见 README 9.10 与 CHANGELOG `[1.5.9]` 的 eb9f30c )。
**出队条件 ** :队列中的批号在航迹表中已不存在,或不再处于"手动 + TAS"状态 → 清空该队列项。
> 自动开启/退出 TAS 的逻辑(按距离/速度/高度阈值)已全部注释停用,**只支持手动**。
>
> **指纹与批号的分工(V1.5.9)**:队列、内部关联与出队仍以 `Track_Index` 为键;只有跨 DLL 边界的 `DataRev.TAS_track_index`(输入)与 `TrackingBeam.TAS_track_index`(输出)改用 **16 bit 航迹指纹** `Track_fingerprint`(起批时按末点特征生成,见 README 9.12)。
### 8.2 波束输出调度(关键)
``` mermaid
flowchart TD
A["遍历 TAS 队列"] --> B["按批号 在航迹表中找到该航迹"]
A["遍历 TAS 队列"] --> B["按队列项 Index( Track_Index,内部键) 在航迹表中找到该航迹"]
B --> C{"距上次波束输出 > data_rate_tas 秒<br/>且 CPI 时间早于已选中的最早 CPI?"}
C -- 否 --> A
C -- 是 --> D["选中该目标(CPI 时间最早者)"]
D --> E["位置外推:ΔT = (最新时间戳 − CPI 时间)/1000<br/>x + vx·ΔT, y + vy·ΔT"]
E --> F["Range = √(xp²+yp²), Azi = atan2(yp,xp)<br/>Elev = asin(Height / Range)"]
F --> G["open_flag=1, type=1, 批号=真实航迹号 <br/>更新该目标 last_track_time = 最新时间戳"]
F --> G["open_flag=1, type=default_track_beam_type, TAS_track_index=航迹指纹 <br/>更新该目标 last_track_time = 最新时间戳"]
C -.->|"无任何合格目标"| H["open_flag = 0(其余字段保持旧值)"]
```
@@ -619,6 +623,12 @@ flowchart TD
- **归一化幅度 / 速度维 FFT 点数(e8c56f9 新增,输入侧已打通)**:`DataRev` 新增 `amp_asv` (归一化幅度 dB)、`prn_fftn` (速度维 FFT 点数),`Track` /内部 `PointRecv` /`Trust_Track` 也新增同名成对字段;`data_preprocess()` 现已在 TWS 与 TAS 两条分支都把这两个字段搬入 `PointRecv` (并随 `RdpRecPoint` 落库),因此 `track_asso.cpp` 写入航迹并在 TWS 输出行写回的 `amp_asv_point` / `prn_fftn_point` 有有效数据来源;**TAS 的关联与输出路径(`track_asso_tas.cpp` )仍未涉及这两个字段**,TAS 输出行中它们保持宿主原值。
- **版本号与记录标识(b227ae1 / c3c7e66 / 5cb67cc) **: `parameters.h` 新增版本宏并拼装为 `VERSION_STRING` (机扫/相扫合并后为 `V1.5.9.GENERIC` ;历史上 b227ae1 时为 `V1.5.8.PS` / `V1.5.8.MS` ),实例创建后可由基类公开成员 `version_info` 读取;`Data_Process` 新增 `point_id` / `frame_id` / `circle_id` 自增计数(`circle_id` 在 TWS 每判满一圈、TAS 每帧末自增),`PointRecv` /`Temp_track` /`Trust_Track` 新增对应的标识字段,记录功能据此把「输入点迹 → 凝聚点迹 → 临时航迹 → 可靠航迹 → 关联信息」串成同一条链路;可靠航迹与关联信息的记录点为 TWS/TAS 双通道(关联信息以 `Asso_Info::tas_flag` 区分来源)。
**航迹指纹(V1.5.9, 0f3da99) **
- 起批时对**末点**计算 `Track_fingerprint` ( 16 bit):`r` /`azi` /`vr` /`RCS` /`CPI_time` 分别量化到 0.01 m / 0.001° / 0.01 m·s⁻¹ / 0.1 dBsm / 1 ms,经 splitmix64 逐个混合后折叠为 16 bit(`track_init.cpp::computeFingerprint()` );
- TAS 输入帧的 `DataRev::TAS_track_index` 与 TAS 波束输出的 `TrackingBeam::TAS_track_index` 均改为**指纹**(字段名未变);`track_process(model=3)` 按指纹定位航迹,队列与内部关联仍用 `Track_Index` ;
- 16 bit 指纹存在碰撞可能,且同一目标消亡后重新起批通常得到不同指纹;记录实体 `RdpRecTrustTrack` 尚未包含该字段(详见 README 9.12、11.2)。
**未启用 **
- 引导跟踪(direct tracking)、手动打跟踪波束接口为空实现;