更新:1、增加手动设置重点目标的功能;

2、调整航迹关联时外推圈数限制,不过多外推;
3、调整航迹消批条件,重点航迹消批圈数提高;
4、更新文档;

Signed-off-by: waiwaylee <waiwaylee@foxmail.com>
This commit is contained in:
2026-09-23 09:35:13 +08:00
parent e0bf227be3
commit 50e0b5cb74
12 changed files with 247 additions and 118 deletions
+33 -18
View File
@@ -165,7 +165,7 @@ flowchart TD
A["全部可靠航迹"] --> A1["IMM 交互(mix)"]
A1 --> B["滤波前先统一置 point_flag=0(本圈默认未关联实点)"]
B --> C["逐航迹 × 逐点:算 ΔT、三个模型马氏距离 d1/d2/d3"]
C --> D{"波门判定<br/>距离分段 + 距离门限 d_r + 俯仰门限 d_p"}
C --> D{"波门判定<br/>统计距离波门 thd_d + 高度门限 thd_h + 距离门限 thd_r"}
D -- 通过 --> E["记入候选表(含 d_min = min(d1,d2,d3))"]
D -- 不通过 --> F["丢弃该候选对"]
E --> G["最近邻:反复取全表 d_min 最小者"]
@@ -180,19 +180,31 @@ flowchart TD
M --> N["输出全部航迹(更新行 + 补点行)"]
```
### 4.2 波门(三步都通过才算候选)
### 4.2 波门(统计距离、高度、距离三类都通过才算候选)
**(1)统计距离波门**——按航迹距离分段收紧高机动模型:
**(1)统计距离波门 thd_d**——按航迹距离分段收紧高机动模型(`ASSO_THORD = 4`):
| 航迹距离 r_track | 模型 1 / 2 | 模型 3 |
|---|---|---|
| ≤ 500 m | d² < 9 | d² < 9/1000(≈ 关闭,抑制近程高机动模型的乱关联) |
| 500 ~ 1000 m | d² < 9 | d² < 9/100(收紧) |
| ≥ 1000 m | d² < 9 | d² < 9 |
| ≤ 500 m | d² < 16 | d² < 16/1000(≈ 关闭,抑制近程高机动模型的乱关联) |
| 500 ~ 1000 m | d² < 16 | d² < 16/100(收紧) |
| ≥ 1000 m | d² < 16 | d² < 16 |
> ⚠ **门限语义**:代码里 d 已经是马氏距离平方,判据又写作 `d*d < 9`,等效于 **d < 3**(约对应 3 自由度卡方分布 95% 分位的量级)。调整 ASSO_THORD 时务必记住这一层"二次方"。
> ⚠ **门限语义**:代码里 d 已经是马氏距离平方,判据又写作 `d*d < ASSO_THORD*ASSO_THORD`,`ASSO_THORD = 4` 时等效于 **d < 4**(而非 √d < 4)。调整 ASSO_THORD 时务必记住这一层"二次方"(该行为在 BUG-20 中被识别,有意保留)。
**(2)距离门限 d_r**——抑制远距离突跳。用航迹-点迹弦距 R 与航迹位移 VT = v_track·ΔT 判断:
**(2)高度门限 thd_h**(e0bf227 起在 TWS 侧生效)——|h_track − h_point| 按航迹距离分段:
| 航迹距离 r_track | 高度差门限 |
|---|---|
| ≤ 1000 m | 150 m |
| 1000 ~ 2000 m | 200 m |
| 2000 ~ 3000 m | 250 m |
| 3000 ~ 5000 m | 300 m |
| > 5000 m | 不约束 |
> 该门限此前在 `track_asso.cpp` 中整块被注释、`d_h` 恒为 1(等于不生效),现改为独立布尔量 `thd_h` 参与判定,取值与 TAS 通道一致,用于压制俯仰测量跳变引起的错误关联。
**(3)距离门限 thd_r**——抑制远距离突跳。用航迹-点迹弦距 R 与航迹位移 VT = v_track·ΔT 判断:
```
VT < 100 且 R > 300 → 拒绝(慢速目标不允许 300 m 以上的跳变)
@@ -200,7 +212,9 @@ VT < 100 且 R > 300 → 拒绝(慢速目标不允许 300 m 以上的跳
VT > 300 且 R > 1200 → 拒绝(高速目标给固定 1200 m 上限)
```
**(3)俯仰门限 d_p**:分距离段 7°/5°/10° 的逻辑当前被注释停用,**恒为通过**。
**(4)俯仰门限 d_p**:分距离段 7°/5°/10° 的逻辑仍被注释停用,不参与判定(其作用已由高度门限覆盖)。
> 实现要点:三类判据分别算成 `thd_d` / `thd_h` / `thd_r` 三个布尔量,最后以 `thd_d && thd_h && thd_r` 决定是否记入候选表(e0bf227 起;此前三者混写在一个长 `if` 条件里)。
### 4.3 最近邻(NN)选取规则
@@ -395,7 +409,7 @@ flowchart TD
|---|---|---|
| 凝聚 | 相邻两帧滑窗,近程多速度维约束 | 单帧,恒有速度维约束 |
| 处理对象 | 全部可靠航迹 × 全部点 | **仅指定批号**的这一条航迹 × 全部点 |
| 俯仰/高度门限 | 俯仰门限当前恒通过 | **高度门限生效**(按距离分段) |
| 俯仰/高度门限 | 俯仰门限已注释停用;**高度门限生效**(按距离分段,e0bf227 起) | **高度门限生效**(按距离分段,取值与 TWS 相同) |
| ΔT ≤ 0 | 参与选取但只消费点迹、不更新 | **直接跳过该点**(并记告警日志) |
| 外推时间 | 按 work_mode 数据率固定步长 | 按 `最新时间戳 − 航迹时间` |
| 输出 | 全部航迹 | 仅该批号航迹 |
@@ -409,7 +423,7 @@ flowchart TD
B -- 是 --> C["IMM 交互;航迹 point_flag 置 0"]
C --> D["逐点:ΔT ≤ 0 → 记告警并跳过"]
D --> E["逐点:三模型统计距离 d1/d2/d3 + 高度门限"]
E --> F{"d² < 9(任一模型)且高度门限通过?"}
E --> F{"d² < 16(任一模型)且高度门限通过?"}
F -- 是 --> G["记入候选表"]
F -- 否 --> H["丢弃"]
G --> I["取 d_min 最小的一点"]
@@ -426,7 +440,7 @@ flowchart TD
|---|---|
| ≤ 1000 m | 150 m |
| 1000 ~ 2000 m | 200 m |
| 2000 ~ 3000 m | 200 m |
| 2000 ~ 3000 m | 250 m |
| 3000 ~ 5000 m | 300 m |
| > 5000 m | 不约束 |
@@ -465,10 +479,10 @@ flowchart TD
```mermaid
flowchart TD
A["遍历 TAS 队列"] --> B["按批号在航迹表中找到该航迹"]
B --> C{"距上次波束输出 > DATA_RATE_TAS 秒<br/>且 最新时间戳 − 航迹时间 > DATA_RATE_TAS 秒?"}
B --> C{"距上次波束输出 > DATA_RATE_TAS 秒<br/>且 CPI 时间早于已选中的最早 CPI?"}
C -- 否 --> A
C -- 是 --> D["在合格目标中选 CPI 时间最早者"]
D --> E["位置外推:x + vx·ΔT, y + vy·ΔT"]
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 = 最新时间戳"]
C -.->|"无任何合格目标"| H["open_flag = 0(其余字段保持旧值)"]
@@ -476,8 +490,9 @@ flowchart TD
**要点**
- 门控用**两个条件**:距上次输出的时间、航迹时间与最新时间戳之差都要大于 `DATA_RATE_TAS` 秒(单位是秒,由宿主经参数初始化传入,须为 > 0 的有效值)→ 保证 TAS 目标的数据率**不随 Beam_Ctrl 的调用频率变化**;
- 多目标时选**队列中 CPI 时间最早**的目标,等价于"按最久未更新者优先"的轮转;
- 门控只用一个条件(e0bf227 修正):目标「距上次波束输出的时间」(`latest_timestamp − last_track_time`)要大于 `DATA_RATE_TAS` 秒(单位是秒,由宿主经参数初始化传入,须为 > 0 的有效值)→ 保证 TAS 目标的数据率**不随 Beam_Ctrl 的调用频率变化**;修正前还要求「航迹时间与最新时间戳之差」也大于该门限,与"取最早 CPI 目标"的语义冲突,会漏掉本应输出的波束;
- 多目标时选**队列中 CPI 时间最早**的目标(同时要求其 CPI 时间早于当前已选者),等价于"按最久未更新者优先"的轮转;
- 选中后才按该目标的 CPI 时间算外推步长 `ΔT = (最新时间戳 − CPI 时间)/1000`;
- 原来的"每次调用整队循环移位"已停用;
- 俯仰用航迹高度直接算(叠加雷达平台高度的处理只影响对外输出的 z,不参与波束俯仰)。
@@ -494,7 +509,7 @@ flowchart TD
| `R_MIN / R_MAX` | 100 / 100000 | 同左 | 有效量程(凝聚后过滤) |
| `TRACK_START_THRESHOLD` | 8 | 同左 | 起始统计距离波门(d ≤ 8) |
| `ALPHA_START` | 60 | 同左 | 起始折角上限(°) |
| `ASSO_THORD` | 3 | 同左 | 关联波门(d² < 9,等效 d < 3) |
| `ASSO_THORD` | 4 | 同左 | 关联波门(判据 d*d < ASSO_THORD²,d 已是马氏距离平方,等效 d < 4) |
| `TRACK_DIE_ROUND` | 4 | 4 | TWS 消亡外推轮数 |
| `TRACK_DIE_ROUND_TAS` | 5 | 96 | TAS 消亡外推轮数 |
| `MAX_TRACK_NUM / MAX_TRACK_INDEX` | 500 / 500 | 同左 | 航迹数上限 / 航迹号上限 |