Files

887 lines
50 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 雷达数据处理 DLLdata_process_class_dll
> X256 雷达数据处理动态链接库:将雷达输出的原始点迹(TWS/TAS)处理为稳定可靠的目标航迹,并给出 TAS 跟踪波束控制指令。
> 仓库 simianzhen256-v1.5.5-ms-vscode(上游 simianzhen256v1.5.5;已由 Qt/qmake 工程迁移为 VS Code + CMake 工程)。
---
## 目录
1. [项目简介](#1-项目简介)
2. [功能特性](#2-功能特性)
3. [目录结构](#3-目录结构)
4. [构建与环境](#4-构建与环境)
5. [总体架构](#5-总体架构)
6. [关键数据结构](#6-关键数据结构)
7. [外部接口与调用流程](#7-外部接口与调用流程)
8. [处理流程总览](#8-处理流程总览)
9. [算法实现详解](#9-算法实现详解)
10. [参数说明](#10-参数说明)
11. [已知问题与限制](#11-已知问题与限制)
12. [版本历史](#12-版本历史)
13. [参考文档](#13-参考文档)
---
## 1. 项目简介
本仓库是一个 **Windows 动态链接库**,实现某型雷达(内部代号 X256,按扫描体制分为 **相扫 X256_PS****机扫 X256_MS** 两种构建)的 **航迹数据处理** 功能,包括:
- 输入点迹预处理与点迹凝聚(滑窗凝聚)
- 边扫描边跟踪(TWS)与边跟踪边扫描(TAS)双通道处理
- 逻辑法航迹起始(3~9 点起批,含屏蔽区、角度/波门约束)
- IMM + 扩展卡尔曼滤波(EKF,含多普勒速度)航迹维持
- 最近邻(NN)点航关联
- 航迹外推、消亡与航迹号管理
- TAS 手动转跟踪与跟踪波束调度输出
**技术栈**C++MSVC 2013 兼容,C++11 特性)、Eigen 3(随仓库内置,仅用 Eigen/Dense)、CMake ≥ 3.10。
**处理约定**
| 项目 | 约定 |
|---|---|
| 时间戳 | CPI 时间 / GNSS 时间均为 long long 毫秒(64 位);航迹时间 T_track 同样为毫秒,参与运算时除以 1000 转秒 |
| 角度 | 外部接口用度(°),内部统一弧度;输出航向角/方位/俯仰为度 |
| 坐标 | 直角坐标系 x/y 为水平面投影,z = 目标高度 + 雷达平台高度 |
| 点迹类型 | point_type = 0 为 TWSpoint_type = 1 为 TAS |
| 跟踪模式 | Track_Mode = 0 为 TWSTrack_Mode = 1 为 TAS |
---
## 2. 功能特性
- **双模式处理管线**data_preprocess 按输入类型与扫描圈完成标志返回 0/1/2/3track_process 据此调度 TWS 凝聚/关联/起始或 TAS 凝聚/关联。
- **两帧滑窗点迹凝聚**:TWS 点迹先与上一帧缓存合并凝聚,再进入关联,兼顾跨波位(CPI)相邻点迹的分裂问题;近程模式增加速度维约束。
- **逻辑法航迹起始**:航迹头(单点)→ 点-头速度法关联(两点)→ 点-临时航迹 EKF 波门 + 折角约束关联(三点及以上)→ 三点卡尔曼初始化转可靠航迹;带起批屏蔽区与重复航迹去重。
- **3 模型 IMM 滤波**:三个 Singer 模型(低/中/高过程噪声),量测为「距离-方位-径向速度」三维的 EKF,多普勒残差按盲速折叠,似然用 3×3 新息协方差。
- **最近邻数据关联**:TWS 按航迹距离分段收紧模型 3 波门并附加距离门限;TAS 附加按距离分段的高度门限。ΔT ≤ 0(点迹时间戳不晚于航迹时间)的候选不更新航迹状态、仅消费该点迹(标记已使用),避免其继续起批而生成虚假 TWS 航迹。
- **高度维独立平滑**:按距离分段选择滑动平均窗长(5/6/7/9 点),抑制俯仰测量跳变。
- **TAS 波束控制**:手动转 TAS 目标入队(队列长度与容量随扫描体制切换),按最新时间戳外推输出跟踪波束(距离/方位/俯仰/批号)。
- **航迹生命周期管理**:外推轮数计数、超时消亡、手动删除、全清空(含各模块 reset,防重连后幽灵航迹)。
- **防御性加固**:见 archived_docs/BUG_FIX_REPORT.md——越界防护、时间戳正序校验、方位角 ±π 环绕、asin 定义域钳位、IMM 概率奇异保护等已修复项。
- **日志文件输出**`RDP_LOG_ENABLE` 开启时(默认),首次 `Data_Process_Factory::GetB()` 自动用 `rdbuf()``std::cout` 重定向到 `RDP_LOG_DIR``.\rdp_logs\`)下按日期+时间命名的日志文件,`Destroy()` 时恢复控制台并关闭文件;`RDP_LOG` 日志宏在每条日志前附加 `[时间戳][文件:行号]`,开关注释关闭时不重定向、日志仍输出到控制台。
---
## 3. 目录结构
```text
.
├── CMakeLists.txt # CMake 构建脚本(扫描模式切换、导出宏、输出目录)
├── CHANGELOG.md # 变更日志(Keep a Changelog 格式,按 git 提交记录维护)
├── README.md # 本文件:项目说明(架构、接口、流程、算法、参数)
├── archived_docs/ # 过期文档留档(仅作历史参考;接口与流程以本 README 为准)
│ ├── BUG_REPORT.md # 全量逻辑 BUG 分析报告(P0~P3,37 项)
│ ├── BUG_FIX_REPORT.md # BUG 修复报告(修复明细 + 编译验证结果)
│ └── requirements.md # 需求说明:日志文件输出功能修改要求(含 rdbuf() 重定向参考示例)
├── .vscode/ # VS Code 工程配置
│ ├── settings.json # cmake.generator=NMake、MSVC2013 x86 环境变量、compile_commands
│ ├── cmake-variants.yaml # X256_PS / X256_MS × Release / Debug 变体
│ ├── tasks.json # 配置/构建/清理任务
│ └── scripts/{configure,build,clean}.bat
├── backup/
│ └── data_process_class_dll/
│ ├── data_process_class_dll.pro # 迁移前的 Qt/qmake 工程文件(备份)
│ └── data_process_class_dll.pro.user
├── data_process_class_dll/ # 源码目录
│ ├── data_process_class_dll.h # 对外接口:DataRev/Track/TrackingBeam/RadarPara 结构体、抽象基类、工厂类
│ ├── data_process_class_dll_global.h # DLL 导入导出宏
│ ├── data_process_class_dll.cpp # 工厂实现(GetB/Destroy 单例)
│ ├── rdp_log.h / .cpp # 日志输出模块:rdbuf() 重定向 std::cout、RDP_LOG 宏(开关宏在 parameters.h
│ ├── data_process.h / .cpp # Data_Process 实现:接口分发、TWS/TAS 主流程、参数管理、清空/删除/转跟踪
│ ├── struct.h # 内部结构体:PointRecv / Trust_Track / Temp_track / Tracking_Target
│ ├── parameters.h # 编译期宏参数(按 MECHANICAL_SCANNING / PHASE_SCANNING 分两组)
│ ├── dot_coh.h / .cpp # TWS 点迹凝聚(含两帧滑窗缓冲)
│ ├── dot_coh_tas.h / .cpp # TAS 点迹凝聚
│ ├── coor_trans.h / .cpp # 极坐标 ↔ 直角坐标转换
│ ├── kalman.h / .cpp # 卡尔曼滤波:两点/三点初始化、线性 KF、EKF(含多普勒)、统计距离、盲速计算
│ ├── track_asso.h / .cpp # TWS 航迹关联:IMM 交互 → 滤波 → 输出、距离/俯仰门限、高度平滑
│ ├── track_asso_tas.h / .cpp # TAS 航迹关联(独立实现,量测门限与数据率不同)
│ ├── track_init.h / .cpp # 逻辑法航迹起始:点-临时航迹关联、点-航迹头关联、转可靠航迹、屏蔽区
│ ├── track_init_direct_tracking.h/.cpp# 引导跟踪航迹起始(当前入口为空实现,未启用)
│ ├── track_asso_direct_tracking.h/.cpp# 引导跟踪航迹关联(未加入 CMake 构建)
│ ├── track_die.h / .cpp # TWS 航迹消亡
│ ├── track_die_tas.h / .cpp # TAS 航迹消亡
│ ├── tas_ctrl.h / .cpp # TAS 波束控制:目标队列增删、波束输出、禁止区判断
│ ├── track_index_mangement.h / .cpp # 航迹号 1~500 分配/复用
│ └── Eigen/ # 内置 Eigen 3 头文件库(仅用 Eigen/Dense
├── build/ # 构建产物(被 .gitignore 忽略)
│ ├── X256_PS/ # 相扫构建目录(含 bin/data_process_class_dll.dll、rdp_playback.exe 等)
│ ├── X256_MS/ # 机扫构建目录
│ └── output/ # 早期打包导出(其中 data_process_class_dll.h 为旧版 32 位时间戳接口,勿作为当前 API 依据)
├── rdp_logs/ # 日志输出目录(运行时自动创建于宿主进程当前工作目录下,被 .gitignore 忽略)
└── .gitignore
```
---
## 4. 构建与环境
### 4.1 环境要求
| 组件 | 要求 |
|---|---|
| 操作系统 | Windows(构建脚本按 D:\APP\VisualStudio2013 与 Windows Kits 8.1 路径配置) |
| 编译器 | Microsoft Visual C++ 2013Visual Studio 12**x86**(与原 Qt 工程保持一致) |
| CMake | ≥ 3.10 |
| 生成器 | NMake MakefilesVS Code 配置与脚本均使用该生成器) |
| 线性代数 | 无需安装——Eigen 头文件已内置在源码目录 |
### 4.2 扫描体制
通过 CMake 缓存变量 RADAR_SCAN_MODE 切换,对应 parameters.h 中的两组宏:
| 变量值 | 对应宏 | 构建目录 |
|---|---|---|
| PHASE_SCANNING | 相扫(X256_PS,默认) | build/X256_PS |
| MECHANICAL_SCANNING | 机扫(X256_MS | build/X256_MS |
### 4.3 命令行构建
```bat
:: 需在 MSVC 2013 x86 环境中执行(先运行 vcvarsall.bat x86
cmake -S . -B build/X256_PS -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DRADAR_SCAN_MODE=PHASE_SCANNING
cmake --build build/X256_PS
```
或直接使用仓库提供的脚本(内部已调用 vcvarsall.bat):
```bat
.vscode\scripts\configure.bat build/X256_PS PHASE_SCANNING Release
.vscode\scripts\build.bat build/X256_PS
.vscode\scripts\clean.bat build/X256_PS
```
在 VS Code 中可直接运行任务(tasks.json):「CMake: 配置并构建 X256_PS (Release)」等,默认任务为 X256_PS Release。
### 4.4 产物
| 产物 | 位置 |
|---|---|
| data_process_class_dll.dll+ .pdb | build/<X256_XX>/bin/ |
| 导入库 data_process_class_dll.lib | build/<X256_XX>/lib/ |
| 安装(cmake --install | DLL/导入库 → bin、lib,公开头文件 → include |
| compile_commands.json | 构建根目录(供 VS Code IntelliSense 使用) |
仓库 build/X256_PS/bin/ 内还带有 **rdp_playback.exe**(回放测试工具,依赖 Qt5Core.dll、sqlite3.dll,配置样例 RadarConfigParam.ini,可回放 .db 记录的点迹数据验证 DLL 输出),不在本仓库源码范围内。
### 4.5 编译警告处理
- 源码文件统一使用 **带 BOM 的 UTF-8** 编码保存,兼容 MSVC 2013(该版本不支持 `/utf-8`),消除 C4819。
- `CMakeLists.txt` 对 MSVC 19.0 及以上版本自动追加 `/utf-8` 编译选项;使用 MSVC 2013 构建时请保持源码为 UTF-8 with BOM。
- 修复了 `/W3` 下全部 C4018signed/unsigned 不匹配)与 C4244(类型转换可能丢失数据)警告:循环变量按需改为 `size_t`,窄化转换改为 `static_cast` 显式转换,不改变原有计算逻辑。
---
## 5. 总体架构
### 5.1 设计模式
- **接口 + 工厂(单例)**Data_process_class_dll(抽象基类,声明全部虚接口)→ Data_Process(具体实现)。宿主仅通过 Data_Process_Factory::GetB() / Destroy() 获取与销毁唯一实例。
- **模块化流水线**Data_Process 按职责组合 Dot_Coh、Dot_Coh_TAS、Track_Asso、Track_Asso_Tas、Track_Init、Track_Die、Track_Die_Tas、TAS_Ctrl、Track_Ind_Mangement 等模块,各模块持有自身处理缓存并支持 reset()。
```mermaid
classDiagram
class Data_process_class_dll {
<<abstract, exported API>>
+data_preprocess(DataRev[150]) int
+track_process(Track[][10], int*, int[], int*, int) int
+Beam_Ctrl(TrackingBeam*, Track[][10], int*)
+direct_tracking_process(...) int
+track_clear_all() int
+track_delete(int, int[]) int
+tracking_start(int) int
+tracking_stop(int) int
+tracking_point(float) int
+track_process_parameters_initial(RadarPara) int
+track_process_parameters_modify(RadarPara) int
}
class Data_Process {
-Data_buffer / Data_buffer_tas : vector PointRecv
-point_recv / point_recv_tas : vector PointRecv
-trust_track : vector Trust_Track
-temp_track : vector Temp_track
-Work_Parameter : RadarPara
-dot_coh / dot_coh_tas / track_asso / track_asso_tas
-track_init / track_die / track_die_tas / tas_ctrl
}
class Data_Process_Factory {
-static p : Data_process_class_dll*
+static GetB() Data_process_class_dll*
+static Destroy()
}
class Dot_Coh
class Dot_Coh_TAS
class Track_Asso
class Track_Asso_Tas
class Track_Init
class Track_Die
class Track_Die_Tas
class TAS_Ctrl
class Track_Ind_Mangement
class kalman
class coor_trans
Data_process_class_dll <|-- Data_Process
Data_Process_Factory ..> Data_Process : creates
Data_Process *-- Dot_Coh
Data_Process *-- Dot_Coh_TAS
Data_Process *-- Track_Asso
Data_Process *-- Track_Asso_Tas
Data_Process *-- Track_Init
Data_Process *-- Track_Die
Data_Process *-- Track_Die_Tas
Data_Process *-- TAS_Ctrl
Track_Init *-- Track_Ind_Mangement
Track_Asso ..> kalman
Track_Asso_Tas ..> kalman
Track_Init ..> kalman
kalman ..> coor_trans
```
### 5.2 模块职责
| 类 / 文件 | 职责 |
|---|---|
| Data_Processdata_process.cpp | 对外接口实现与流程编排:输入缓存、按 model 分发 TWS/TAS 流水线、参数管理、航迹清空/删除、手动转/停 TAS、波束控制转发 |
| Dot_Coh | TWS 点迹凝聚:两帧滑窗合并凝聚(dot_coh_process_buff |
| Dot_Coh_TAS | TAS 点迹凝聚(单帧,距离/方位/速度三维门限) |
| Track_Asso | TWS 点航关联 + IMM 滤波:模型交互 → 门限筛选(NN)→ 各模型 EKF → 概率更新 → 模型输出;未关联航迹外推;高度平滑;ΔT≤0(乱序/重复时间戳)的候选取出后不更新滤波、不刷新航迹,仅消费该点迹 |
| Track_Asso_Tas | TAS 航迹关联(只处理指定批号 tas_track_idx,门限与 TWS 略有差异) |
| Track_Init | 逻辑法航迹起始:航迹头维护、点-头关联(两点)、点-临时航迹关联(三点及以上)、起批(三点卡尔曼初始化)、屏蔽区判断、临时航迹消亡 |
| Track_Die / Track_Die_Tas | 可靠航迹消亡:外推轮数超限或手动删除标志置位时输出消亡批号并删除 |
| TAS_Ctrl | TAS 波束控制:手动目标入队(tas_target_add)、失效目标出队(tas_target_del)、跟踪波束预测输出(tas_beam_output:数据率门控 + 队内选择最早 CPI 目标)、调度时刻记录(last_track_time |
| Track_Ind_Mangement | 航迹号 1~500 的顺序分配与回绕复用 |
| kalman | 两点/三点滤波初始化、线性卡尔曼预测/滤波、EKF(3 维量测含多普勒)、马氏统计距离 d、盲速 Bind_speed |
| coor_trans | 极坐标 ↔ 直角坐标转换 |
| rdp_logrdp_log.h/.cpp | 日志输出:按 parameters.h 的 `RDP_LOG_ENABLE` 开关,在 `Init()` 中用 `rdbuf()``std::cout` 重定向到日期+时间命名的日志文件、`Shutdown()` 恢复控制台并关闭;提供 `RDP_LOG` 宏自动附加 `[时间戳][文件:行号]` 前缀 |
| Track_Init_Direct_Tracking / Track_Asso_Direct_Tracking | 引导跟踪(direct tracking)专用起批/关联。**当前入口为空实现、未启用**track_asso_direct_tracking.cpp 未加入 CMake 源列表 |
---
## 6. 关键数据结构
### 6.1 对外结构体(data_process_class_dll.h
| 结构体 | 用途 | 要点 |
|---|---|---|
| DataRev | 输入点迹 | 距离(m)、方位/俯仰(°)、速度(m/s)、幅度/门限/SNR/RCS、码盘值、CPI/GNSS 时间(ms, long long)、方位波位(0-24)/俯仰波位(0-13)、PRI(µs**不允许为 0**)、频点号、点数、点迹号、使用标记、TAS 批号、点迹类型、十字星数据 speed_dim[129]/range_dim[8] |
| Track | 输出航迹 | 位置/速度、极坐标量、航迹号、更新点数、方向/实虚点标志、一步预测、跟踪模式、航向角、目标类型、关联点信息、航迹时间(s)/GNSS、SNR/RCS、十字星数据透传 |
| TrackingBeam | TAS 跟踪波束指令 | open_flag、type、Range、Azi、Elev、TAS_track_index |
| Target_direct_tracking | 引导跟踪信息 | 批号、距离/方位/俯仰、开关(接口未启用) |
| RadarPara | 工作参数 | 见 [参数说明](#10-参数说明) |
### 6.2 内部结构体(struct.h
| 结构体 | 用途 | 关键字段 |
|---|---|---|
| PointRecv | 内部点迹 | 距离/方位(弧度)/速度/幅度/高度/SNR/RCS/CPI/GNSS 时间、点迹号、使用标志、波位/PRF/频点、跟踪模式、点迹区号、十字星数据 |
| Trust_Track | 可靠航迹(IMM 全状态) | 航迹号、高度、航迹时间、更新标志、外推轮数 Extrapolate_round、实虚点标志、手动删除/手动 TAS 标志、关联点数、高度平滑缓冲 Hight_smooth、关联点信息、融合状态 X[6]/P[6][6]、三个子模型 X1/X2/X3、P1/P2/P3、模型概率 u[3] |
| Temp_track | 临时航迹(航迹起始阶段) | 4 维状态 X[4]/P[4][4]、极坐标点信息、时间戳、buff_round(已缓存圈数)、区号、关联标志 |
| Tracking_Target | TAS 队列元素 | 批号 Index、空标志 empty_flag |
| Direct_Tracking_Target | 引导跟踪目标 | ID、方位/俯仰/距离、空标志 |
> 说明:Trust_Track 的状态布局为 [x, vx, ax, y, vy, ay]x/y 两轴解耦,每轴为「位置-速度-加速度」。
---
## 7. 外部接口与调用流程
### 7.1 接口一览
| 接口 | 返回值 | 说明 |
|---|---|---|
| Data_Process_Factory::GetB() | 实例指针 | 获取单例(首次调用时创建) |
| Data_Process_Factory::Destroy() | — | 销毁实例并将指针置空 |
| track_process_parameters_initial(RadarPara) | 0 成功 / -1 失败 | 初始化工作参数;校验 3 ≤ track_start_point_num ≤ 9 |
| track_process_parameters_modify(RadarPara) | 0 / -1 | 运行时修改参数(校验同上) |
| data_preprocess(DataRev[150]) | 0/1/2/3 | 输入一帧点迹并缓存,返回处理模式(见下表) |
| track_process(Track[][10], &num, dieIdx[], &dieNum, model) | 1 | 按 data_preprocess 的返回值执行 TWS/TAS 处理 |
| Beam_Ctrl(TrackingBeam*, Track[][10], &num) | — | TAS 波束控制(内部清零并重填航迹输出计数) |
| track_clear_all() | 0 | 清空全部航迹/缓存并复位各模块状态 |
| track_delete(n, idx[]) | 0 | 按批号标记手动删除(下一轮消亡输出) |
| tracking_start(track_index) | 0 | 手动转 TAS 跟踪(置 manual_tracking_flag,由 Beam_Ctrl 入队) |
| tracking_stop(track_index) | 0 | 手动取消 TAS(清标志并 Track_Mode=0;队列项延至下一次 Beam_Ctrl 移除) |
| tracking_point(azimuth) | 0 | 手动打跟踪波束——**未实现(保留空实现)** |
| direct_tracking_process(...) | 0 | 引导跟踪——**未实现(保留空实现)** |
> 日志输出为 DLL 内部功能(不对外导出,接口见 10.1 的宏开关):首次 `GetB()` 创建实例时自动初始化(`RDP_LOG_ENABLE` 开启则将 `std::cout` 重定向到 `.\rdp_logs\` 下按日期+时间命名的日志文件),`Destroy()` 销毁实例时恢复 `std::cout` 并关闭日志文件。
### 7.2 data_preprocess 返回值的含义
| 返回值 | 含义 | 触发条件 |
|---|---|---|
| 0 | 无效数据 | point_type 既非 0 也非 1 |
| 1 | **TWS 满一圈,执行航迹处理** | point_type==0 且当前方位波位号 < 上一帧波位号(波位号由大变小判为扫描一圈完成) |
| 2 | **TWS 未满一圈,继续蓄数据** | point_type==0 且波位号未变小;调用 track_process(model=2) 做滑窗凝聚 |
| 3 | **TAS 处理** | point_type==1;同时记录 TAS_track_idx 与最新时间戳 |
> 首次调用时 last_beam_num 为 INT_MAX,因此必然返回 1track_clear_all() 后同样复位为 INT_MAX。
### 7.3 典型调用序列
```mermaid
flowchart TD
A["Data_Process_Factory::GetB()"] --> B["track_process_parameters_initial(RadarPara)"]
B --> C{"接收一帧点迹"}
C --> D["model = data_preprocess(DataRev[150])"]
D --> E{"model ?"}
E -- "2 (TWS 蓄数据)" --> F["track_process(model=2) 滑窗凝聚"]
E -- "1 (TWS 一圈)" --> G["track_process(model=1) 关联/起批/消亡"]
E -- "3 (TAS)" --> H["track_process(model=3) TAS 关联/消亡"]
E -- "0" --> C
F --> C
G --> I["Beam_Ctrl() 输出跟踪波束"]
H --> I
I --> J{"手动操作?"}
J -- 是 --> K["tracking_start / tracking_stop / track_delete"]
K --> C
J -- 否 --> C
C -. "结束/重连" .-> L["track_clear_all() / Factory::Destroy()"]
```
---
## 8. 处理流程总览
### 8.1 TWS 流程(model=1
```mermaid
flowchart TD
A["data_preprocess: 点迹入 Data_buffer(度→弧度、高度=Range·sin(Elev)、时间戳缓存)"] --> B["波位号变小(一圈完成)→ model=1"]
B --> C["track_process(1)"]
C --> D["dot_coh 两帧滑窗凝聚 → point_recv"]
D --> E["track_asso: IMM 交互 → 点航波门筛选(NN)→ EKF 滤波 → 模型输出"]
E --> F["track_die: 外推超限/手动删除 → 输出消亡批号"]
F --> G["track_init: 点-临时航迹关联 → 点-航迹头关联 → 起批转可靠航迹"]
G --> H["输出 Trust_Track_Output(含起批历史点)"]
H --> I["Beam_Ctrl: 手动 TAS 目标入队 / 波束输出"]
```
其中 model=2(未满一圈)只执行滑窗凝聚 dot_coh_process_buff,把上一帧凝聚完成的点输出到 point_recv 供下一圈的关联/起批使用,当前帧未凝聚点作为下一次的缓存——即「凝聚在前、关联在后、缓存一帧」的两帧滑窗结构。
### 8.2 TAS 流程(model=3
```mermaid
flowchart TD
A["data_preprocess: 点迹入 Data_buffer_tas,记录 TAS_track_idx/latest_timestamp → model=3"] --> B["track_process(3)"]
B --> C["dot_coh_tas 单帧凝聚 → point_recv_tas"]
C --> D["track_asso_tas: 仅对 tas_track_idx 批号做 IMM+EKF 关联(含高度门限)"]
D --> E["未关联 → 按 latest_timestamp 外推(ΔT≤0 跳过)"]
E --> F["track_die_tas: TAS 超时/手动删除 → 消亡输出"]
F --> G["输出该批号航迹(point_type=1"]
G --> H["Beam_Ctrl: 数据率门控 + 队内最早 CPI 目标 + 预测波束输出"]
```
### 8.3 航迹起始流程(逻辑法)
```mermaid
flowchart TD
A["未关联点迹"] --> B["转航迹头 Temp_track(1点) buff_round=1"]
B --> C{"下一帧点迹"}
C --> D["点-航迹头关联:速度区间门限 + 径向速度同号 → 两点卡尔曼初始化(航迹头→2 点临时航迹)"]
D --> E{"后续点迹"}
E --> F["点-临时航迹关联:EKF 统计距离波门 d²≤64、折角<60°、径向速度同号、|Δr|≥5m"]
F --> G{"长度 ≥ track_start_point_num(3~9) 且 ≤10"}
G -- 是 --> H["屏蔽区判断 → 重复航迹去重(保留末点 d 更小者)→ 三点卡尔曼初始化"]
H --> I["转可靠航迹:分配航迹号 1~500,IMM 三模型同状态初始化 u=1/3"]
I --> J["按历史点数输出 Trust_Track_Output[i][0..L-1]"]
G -- 否 --> K{"buff_round>2 或 长度≥10 ?"}
K -- 是 --> L["临时航迹消亡"]
K -- 否 --> E
```
---
## 9. 算法实现详解
### 9.1 坐标与量测转换
极坐标(距离 r、方位 θ,弧度)与直角坐标互转(coor_trans.cpp):
$$
x=r\cos\theta,\qquad y=r\sin\theta
\qquad\qquad
r=\sqrt{x^2+y^2},\qquad \theta=\operatorname{atan2}(y,x)\ \bmod 2\pi
$$
输入点高度由量测俯仰直接折算:h = R·sin(ε)data_preprocess 中完成)。输出时航迹高度加雷达平台高度:z = h + H_radar。
**转换量测协方差**(用于以直角坐标为量测的线性滤波,kalman.cpp 中多处使用)。设 λθ = exp(-σa²/2)、λθ' = exp(-2σa²),则在量测 (r,θ) 处转换后的直角坐标量测噪声协方差为:
$$
R_{xx}=\left(\lambda_\theta^{-2}-2\right)r^2\cos^2\theta+\tfrac12\left(r^2+\sigma_r^2\right)\left(1+\lambda'_\theta\cos 2\theta\right)
$$
$$
R_{yy}=\left(\lambda_\theta^{-2}-2\right)r^2\sin^2\theta+\tfrac12\left(r^2+\sigma_r^2\right)\left(1-\lambda'_\theta\cos 2\theta\right)
$$
$$
R_{xy}=\left(\lambda_\theta^{-2}-2\right)r^2\sin\theta\cos\theta+\tfrac12\left(r^2+\sigma_r^2\right)\lambda'_\theta\sin 2\theta
$$
其中 σr、σa 由 SIGMA_R / SIGMA_A 宏给定(10 m / 0.02 rad)。
### 9.2 点迹凝聚
对同一 CPI(TWS 为相邻两 CPI 合并后)内所有点迹两两比较,门限满足且幅度较小者被标记删除(Use_Flag=1):
| 模式 | 距离门限 | 方位门限(环绕最小角差) | 速度门限 |
|---|---|---|---|
| work_mode==0(近程) | ≤ 80 mDOT_COH_RANGE | ≤ 6°(DOT_COH_AZI | ≤ 2 m/sDOT_COH_V |
| work_mode!=0(中/远程) | ≤ 80 m | ≤ 6° | 不约束 |
方位差按环绕角处理:
$$
\Delta\theta = \min\left(|\theta_0-\theta_1|,\ 2\pi-|\theta_0-\theta_1|\right)
$$
凝聚后删除 r<100 m 或 r>100000 m 的量程外点。TWS 的 dot_coh_process_buff 将上一帧缓存点标记区号 1、当前帧点标记区号 2,合并凝聚后:区号 1 的点输出到 point_recv(进入关联),区号 2 的点存入 data_input_buff 供下一帧凝聚——形成两帧滑窗。
### 9.3 航迹起始(逻辑法)
#### (1) 点-航迹头关联(两点起始)
对单点航迹头(buff_round ≥ 2),量测点需同时满足**速度区间门限**与**径向速度同号**:
- 近程(work_mode==0):
$$
r_p \ge 1000:\ V_{min}\Delta T \le d_{12} \le V_{max}\Delta T;\qquad
r_p < 1000:\ \tfrac12 V_{min}\Delta T \le d_{12} \le \tfrac12 V_{max}\Delta T
$$
- 中/远程(work_mode!=0):
$$
r_p \ge 2000:\ V_{min}\Delta T \le d_{12} \le V_{max}\Delta T;\qquad
r_p < 2000:\ \tfrac12 V_{min}\Delta T \le d_{12} \le \tfrac13 V_{max}\Delta T
$$
其中 d12 为两点间平面距离,ΔT 为时间差(秒),并需 vr_point · vr_head > 0。关联成功用 **两点卡尔曼初始化**(见 9.5.2)。
#### (2) 点-临时航迹关联(三点及以上)
对 ≥ 2 点的临时航迹,用航迹末点状态做 EKF 一步预测,计算三维(距离-方位-径向速度)马氏统计距离 d(见 9.5.3),并要求 |r_point r_head| ≥ 5 m,同时满足:
$$
d^2 \le TRACK\_START\_THRESHOLD^2 = 64,\qquad
\alpha < ALPHA\_START = 60°,\qquad
v_{r,point}\cdot v_{r,track}>0
$$
折角 α 为最近三点连线夹角(度):
$$
\alpha=\arccos\left(\frac{\vec{D_{12}}\cdot\vec{D_{23}}}{\|\vec{D_{12}}\|\,\|\vec{D_{23}}\|}\right)\cdot\frac{180}{\pi}
$$
#### (3) 转可靠航迹(起批)
临时航迹长度 L 满足 track_start_point_num ≤ L ≤ 10(起批点数由参数给定,典型 3~4,接口层校验 3~9)且不在起批屏蔽区内(屏蔽区为距离-方位矩形区域,最多 30 个)时进入起批队列;同源(共享前三点)的重复航迹只保留末点 d 最小者。起批时用 **最近三点卡尔曼初始化** 得到 6 维状态,构造 Trust_Track
- 三个 IMM 子模型用同一状态/协方差初始化,模型概率 u = [1/3, 1/3, 1/3]
- 分配航迹号(1~500,见 9.8);
- 将临时航迹的全部 L 个点写入 Trust_Track_Output(每条航迹最多 10 个历史点)。
### 9.4 IMM 框架(3 个 Singer 模型)
TWS/TAS 关联共用同一套 IMM 结构(代码各自实现一份)。状态 [x, vx, ax, y, vy, ay]x/y 两轴解耦,机动相关时间常数固定 α = 0.2。
**模型转移概率矩阵**
$$
P_t=\begin{bmatrix}0.8&0.15&0.05\\0.3&0.4&0.3\\0.05&0.15&0.8\end{bmatrix}
$$
**交互(mix**:归一化常数与混合概率
$$
\bar c_j=\sum_{i}p_{ij}\,\mu_i,\qquad
\mu_{i|j}=\frac{p_{ij}\,\mu_i}{\bar c_j}
$$
混合状态 X0j = Σ μ(i|j) Xi,混合协方差 P0j = Σ μ(i|j) [Pi + (Xi X0j)(Xi X0j)ᵀ](实现中对 c̄j 做了 ≥ 1e-12 钳位防除零)。
**子模型滤波**:每个模型以各自的 F、Qj 做 EKF 预测/更新(9.5)。
**模型概率更新**:以新息协方差行列式归一化的高斯似然
$$
\Lambda_j=\frac{1}{\sqrt{(2\pi)^3\det S_j}}\exp\left(-\tfrac12 d_j\right),\qquad
\mu_j'=\frac{\Lambda_j\,\bar c_j}{\sum_k \Lambda_k\,\bar c_k}
$$
其中 dj 为该模型的马氏距离平方。实现中 det Sj ≤ 1e-12 时 Λj = 0,分母 ≤ 1e-12 时保持上一拍概率。
**输出融合**
$$
\hat X=\sum_j\mu_j'\hat X_j,\qquad
P=\sum_j\mu_j'\left[P_j+\left(\hat X_j-\hat X\right)\left(\hat X_j-\hat X\right)^T\right]
$$
### 9.5 卡尔曼滤波
#### 9.5.1 Singer 模型状态转移与过程噪声
每轴状态转移矩阵(α = 0.2,T = ΔT 为时间差,秒):
$$
F_{axis}=\begin{bmatrix}
1 & T & \dfrac{\alpha T-1+e^{-\alpha T}}{\alpha^2}\\[2mm]
0 & 1 & \dfrac{1-e^{-\alpha T}}{\alpha}\\[2mm]
0 & 0 & e^{-\alpha T}
\end{bmatrix}
,\qquad
F=\begin{bmatrix}F_{axis}&0\\0&F_{axis}\end{bmatrix}
$$
过程噪声 Qj = qj · Q̄,Q̄ 每轴为对称矩阵,元素为 Singer 模型离散化的标准结果:
$$
\bar q_{11}=\frac{1}{2\alpha^5}\left[1-e^{-2\alpha T}+2\alpha T+\frac{2\alpha^3T^3}{3}-2\alpha^2T^2-4\alpha T e^{-\alpha T}\right]
$$
$$
\bar q_{12}=\frac{1}{2\alpha^4}\left[e^{-2\alpha T}+1-2e^{-\alpha T}+2\alpha T e^{-\alpha T}-2\alpha T+\alpha^2T^2\right]
$$
$$
\bar q_{13}=\frac{1}{2\alpha^3}\left[1-e^{-2\alpha T}-2\alpha T e^{-\alpha T}\right]
$$
$$
\bar q_{22}=\frac{1}{2\alpha^3}\left[4e^{-\alpha T}-3-e^{-2\alpha T}+2\alpha T\right]
$$
$$
\bar q_{23}=\frac{1}{2\alpha^2}\left[e^{-2\alpha T}+1-2e^{-\alpha T}\right],
\qquad
\bar q_{33}=\frac{1}{2\alpha}\left[1-e^{-2\alpha T}\right]
$$
过程噪声强度 qj 按航迹速度分档(对应三个机动等级):
| 模型 | TWS 版(track_asso.cpp | TAS 版(track_asso_tas.cpp |
|---|---|---|
| 模型 1(低机动) | q1 = Model1_Q_slow(恒定) | 同左 |
| 模型 2(中机动) | v≤5: slow/205<v≤30: slowv>30: fast | v≤5: slow/2050<v≤100: 10·fast;其余: fast |
| 模型 3(高机动) | v≤5: slow/205<v≤20: slow20<v≤50: fast50<v≤100: 2·fastv>100: 10·fast | v≤5: slow/2050<v≤100: 10·fast;其余: fast |
> 注意:Model1_Q_fast 字段当前未参与计算(模型 1 只用 slow);各档系数以源码为准。
#### 9.5.2 两点初始化(临时航迹,4 维)
两直角量测 Z0=(x0,y0)、Z1=(x1,y1),时间差 T
$$
X=[x_1,\ (x_1-x_0)/T,\ y_1,\ (y_1-y_0)/T]^T,\qquad
P_{axis}=\begin{bmatrix}R&R/T\\R/T&2R/T^2\end{bmatrix}
$$
其中 R 为 Z1 处的转换量测协方差(9.1)。x/y 轴独立填充 P[4][4]。
#### 9.5.3 三点初始化(可靠航迹,6 维)
三点 Z0, Z1, Z2,时间差 T1, T2,取末点与差分近似速度/加速度:
$$
X=\left[x_2,\ \frac{x_2-x_1}{T_2},\ \frac{(x_2-x_1)/T_2-(x_1-x_0)/T_1}{(T_2+T_1)/2},\
y_2,\ \frac{y_2-y_1}{T_2},\ \frac{(y_2-y_1)/T_2-(y_1-y_0)/T_1}{(T_2+T_1)/2}\right]^T
$$
协方差按误差传播由 R0, R1, R2(各点转换量测协方差)构造,x 轴块 P11 形式为:
$$
P_{11}=\begin{bmatrix}
R_2^{xx} & R_2^{xx}/T_2 & \dfrac{R_2^{xx}/T_2}{(T_2+T_1)/2}\\[1mm]
R_2^{xx}/T_2 & \dfrac{R_2^{xx}+R_1^{xx}}{T_2^2} & \dfrac{(R_2^{xx}+R_1^{xx})/T_2^2+R_1^{xx}/(T_1T_2)}{(T_1+T_2)/2}\\[1mm]
\dfrac{R_2^{xx}/T_2}{(T_2+T_1)/2} & \dfrac{(R_2^{xx}+R_1^{xx})/T_2^2+R_1^{xx}/(T_1T_2)}{(T_1+T_2)/2} & \dfrac{4\left[(R_2^{xx}+R_1^{xx})/T_2^2+(R_1^{xx}+R_0^{xx})/T_1^2+2R_1^{xx}/(T_1T_2)\right]}{(T_1+T_2)^2}
\end{bmatrix}
$$
P12(x-y 交叉块)、P22(y 轴块)同构,把 Rxx 换成 Rxy、Ryy。
> ⚠ 当前实现未对 T=0 的重复时间戳做除零保护(BUG-18,暂不修复),调用方需保证点迹时间严格递增。
#### 9.5.4 线性卡尔曼滤波(二维直角量测)
标准预测/更新:
$$
\hat X_{k|k-1}=F\hat X_{k-1},\qquad
P_{k|k-1}=FP_{k-1}F^T+Q
$$
$$
S=HP_{k|k-1}H^T+R,\qquad
K=P_{k|k-1}H^TS^{-1}
$$
$$
\hat X_k=\hat X_{k|k-1}+K\left(Z-H\hat X_{k|k-1}\right),\qquad
P_k=\left(I-KH\right)P_{k|k-1}
$$
H 为位置选择矩阵(6 维状态取 x/y)。统计距离(马氏距离平方):
$$
d=\nu^T S^{-1}\nu,\qquad \nu=Z-H\hat X_{k|k-1}
$$
此形式用于两点临时航迹的门限 d_cal_track_initCV 模型 FCV、Q=(0.03)²I)。
#### 9.5.5 扩展卡尔曼滤波(距离-方位-径向速度量测)
量测向量 Z = [r, θ, vr],非线性量测函数(由预测状态计算):
$$
h(\hat X)=\begin{bmatrix}r\\\theta\\v_r\end{bmatrix}=
\begin{bmatrix}\sqrt{x^2+y^2}\\ \operatorname{atan2}(y,x)\bmod 2\pi\\ -\dfrac{x\,v_x+y\,v_y}{\sqrt{x^2+y^2}}\end{bmatrix}
$$
雅可比(在预测点处线性化):
$$
H=\frac{\partial h}{\partial X}=
\begin{bmatrix}
\dfrac{x}{r}&0&0&\dfrac{y}{r}&0&0\\[2mm]
-\dfrac{y}{r^2}&0&0&\dfrac{x}{r^2}&0&0\\[2mm]
-\dfrac{y(v_xy-v_yx)}{r^3}&-\dfrac{x}{r}&0&-\dfrac{x(v_yx-v_xy)}{r^3}&-\dfrac{y}{r}&0
\end{bmatrix}
$$
量测噪声 R = diag(σr², σa², σv²)。新息与增益/更新同 9.5.4,并做两项残差修正:
- **方位环绕**:νθ = wrapToPi(θ_mea θ_pred),归一到 [-π, π)
- **多普勒盲速折叠**:νv = νv Round(νv / v_bind)·v_bind,其中盲速
$$
v_{bind}=\frac{150000}{f_{GHz}\cdot PRI_{µs}}\quad(\mathrm{m/s}),\qquad
f_{GHz}=9.2+0.02\cdot f_{ind}
$$
(PRI ≤ 0 或 f ≤ 0 时返回安全值 1.0,接口约定 PRI 不允许为 0。)
关联判定与模型似然共用 d = νᵀS⁻¹ν,滤波后输出完整 3×3 新息协方差 S 供似然归一化使用(BUG-24 已修复)。
### 9.6 点航关联(最近邻)
#### TWStrack_asso.cpp
对每条航迹 × 每个点计算三模型 d1, d2, d3,波门按航迹距离分段:
| 航迹距离 | 模型 1/2 门限 | 模型 3 门限 |
|---|---|---|
| r_track ≤ 500 m | d_i² < 9 | d_3² < 9/1000(≈关闭) |
| 500 < r_track < 1000 m | d_i² < 9 | d_3² < 9/100(收紧) |
| r_track ≥ 1000 m | d_i² < 9 | d_3² < 9 |
同时满足两个附加门限:
- **俯仰门限 d_p**:当前恒为 true(分距离段 7°/5°/10° 的逻辑在源码中被注释停用);
- **距离门限 d_r**:以航迹-点迹弦距 R = √(r_t² + r_p² 2·r_t·r_p·cos Δθ)(Δθ 为环绕方位差)与航迹速度位移 VT = v_track·ΔT 判断:
$$
VT<100\ \text{且}\ R>300\ \Rightarrow 拒绝;\qquad
100\le VT\le300\ \text{且}\ R/VT>3\ \Rightarrow 拒绝;\qquad
VT>300\ \text{且}\ R>1200\ \Rightarrow 拒绝
$$
候选对按 d_min = min(d1,d2,d3) 全局排序,**最近邻**原则逐个取点:每条航迹每圈最多关联一个点、每个点只属于一条航迹。关联成功后:三模型分别 EKF 更新 → 模型概率更新 → 更新航迹时间/幅度/SNR/RCS/十字星数据 → 高度平滑。
**ΔT ≤ 0 的候选(604f158 起的行为)**:ΔT = (点迹 CPI 时间 航迹 T_track)/1000,ΔT ≤ 0 表示该点迹时间戳不晚于航迹时间(典型场景:航迹已按 TAS 点迹更新过,本圈 TWS 点迹的时间戳更早,或存在重复时间戳)。这种候选**不再被剔除**,仍参与最近邻最小 d 的比较与选取,但选中后:
- 不执行 IMM/EKF 更新,不写回 X1/X2/X3、P1/P2/P3 与模型概率;
- 不刷新航迹时间 T_track / GNSS_time 与点迹信息;
- 不置实点标志:`Extrapolate_round``point_flag``associate_point_number` 均保持原值,因此该航迹仍按「未关联航迹」在后续外推环节推进一帧(见 9.9);
- 该候选对连同该航迹本圈的其余候选对被一并移出候选表,因此该航迹本圈不会再关联其他点迹;由于时间戳更早的候选仍参与最小 d 比较,它可能先于有效候选(ΔT>0)被取中;
- 该点迹的 `Use_Flag` 被置 1 消费掉——点迹使用标记是航迹起始的输入过滤条件(track_init 跳过 Use_Flag==1 的点),因此该点迹不会再参与起批,避免生成虚假 TWS 航迹。
> 历史行为:604f158 之前,ΔT ≤ 0 的候选在选取时被直接剔除并 `continue`,点迹保持未被使用,可能被后续用于航迹起始。该分支原有的 `RDP_LOG` 告警日志现已注释停用;TAS 关联(track_asso_tas.cpp,见下)中同类告警日志仍启用。
#### TAStrack_asso_tas.cpp
只处理 tas_track_idx 指定的航迹,门限:
$$
d_i^2 < ASSO\_THORD^2 = 9\ \ \text{且高度门限}\ d_h=1
$$
高度门限按航迹距离分段:≤1000 m|h_th_p| ≤ 150 m1000~2000 m:≤ 200 m2000~3000 m:≤ 200 m3000~5000 m:≤ 300 m>5000 m:不约束。
> ⚠ **波门语义提示**:代码中 d 本身已是马氏距离平方,但门限写作 d*d < ASSO_THORD*ASSO_THORD,等效于 d < 3(而非 √d < 3)。该行为在 BUG-20 中被识别,**有意保留未改**ASSO_THORD/1000、/100 已改为浮点除法(BUG-21 修复)。
### 9.7 高度平滑
关联实点后,点迹高度入滑窗 Hight_smooth,输出高度取最近 w 个值的平均(不足 w 个则全平均):
$$
\hat h=\frac{1}{w}\sum_{i=N-w+1}^{N} h_i,\qquad
w=\begin{cases}5,&r\le1000\\6,&1000<r\le2000\\7,&2000<r\le4000\\9,&r>4000\end{cases}
$$
> 已知问题(BUG-02):缓存只增不减,航迹存活越久内存占用越大,当前有意保留。
### 9.8 航迹号管理(track_index_mangement.cpp
- 空航迹表时从 1 开始;否则从 lastest_index+1 向上找第一个未占用号(含 500,BUG-35 已修复),找不到则从 1 回绕;全满(500 条)返回 0(不起批)。
- 写占用表前校验 1 ≤ Track_Index ≤ 500,防御异常批号越界(BUG-10 修复)。
### 9.9 航迹外推与消亡
**外推**:未关联到实点的 TWS 航迹(manual_tracking_flag==0)按工作模式数据率 DATA_RATE_SHORT/MIDDLE/FAR 预测一帧(ΔT≤0 的候选虽被消费但未刷新航迹状态,其 `point_flag` 仍为 0,故同样在本环节外推,见 9.6);TAS 通道按 latest_timestamp T_track 预测(ΔT ≤ 0 跳过);预测用各子模型 Singer F/Qj 推进,Extrapolate_round+1point_flag=0(虚点/补点),航迹时间同步推进。
**消亡**
| 通道 | 条件 |
|---|---|
| TWS | Track_Mode==0 且 Extrapolate_round ≥ TRACK_DIE_ROUND=4),或 manual_delete_flag==1 |
| TAS | Track_Mode==1 且 Extrapolate_round ≥ TRACK_DIE_ROUND_TAS(相扫 5 / 机扫 96),或 manual_delete_flag==1 |
消亡批号写入 Track_die_Index_Output 并删除本地航迹。
### 9.10 TAS 波束控制(tas_ctrl.cpp
- **入队条件**(仅手动):manual_tracking_flag==1 且 Track_Mode==0 且队列未满(MAX_TAS_NUM,相扫 4 / 机扫 1)且不在 TAS 禁止区内。入队即置 Track_Mode=1、以航迹时间初始化 last_track_time,并输出一次航迹更新。
- **出队**:队列中目标在航迹表中不存在、或不再处于手动 TAS 状态时清除。(自动转 TAS / 自动退出的 tas_auto_start/tas_auto_end 逻辑全部注释停用——只支持手动。)
- **波束输出**:在 TAS 队列内遍历,选择满足**数据率门控**的目标——目标距上次波束输出(`last_track_time`)的时间、以及航迹时间 T_track 与最新时间戳 latest_timestamp 的差值,均须大于运行时参数 `Work_Parameter.DATA_RATE_TAS` 秒(单位 s1521592 起由 Hz 改为 s,需为 >0 的有效值),保证 TAS 目标输出间隔不随波束时间(Beam_Ctrl 调用频率)变化;多个候选中取 CPI 时间最早者,用其状态外推到 latest_timestamp
$$
x_p=x+v_x\Delta T,\quad y_p=y+v_y\Delta T,\quad
r_p=\sqrt{x_p^2+y_p^2},\quad \theta_p=\operatorname{atan2}(y_p,x_p)
$$
输出 TrackingBeam{open_flag=1, type=1, Range=rp, Azi=θp(°), Elev=asin(h/rp)(°), TAS_track_index};队空、目标不在航迹表或数据率门控未通过时 open_flag=0。输出后更新该目标队列项的 last_track_time;原每次 Beam_Ctrl 末尾的整队循环移位(队列轮转)已停用,改为按数据率门控在队列内轮换目标。
- tas_ctrl_process 入口强制 *Trust_track_num_Output=0 并在写入前检查容量,防止输出数组越界(BUG-09 修复)。
---
## 10. 参数说明
### 10.1 编译期宏(parameters.h,随扫描体制切换)
| 宏 | 相扫 PHASE_SCANNING | 机扫 MECHANICAL_SCANNING | 含义 |
|---|---|---|---|
| RDP_LOG_ENABLE | 定义(默认开启) | 同左 | 日志文件输出开关:定义时将 `std::cout` 重定向到日志文件;注释掉则不重定向(日志仍输出到标准输出/控制台) |
| RDP_LOG_DIR | `.\rdp_logs\` | 同左 | 日志文件输出目录(相对宿主进程当前工作目录,目录不存在时自动创建) |
| DATA_RATE_TAS | 已停用(原 0.3 | 已停用(原 0.0625) | 编译期宏已注释停用;TAS 数据率统一由运行时参数 RadarPara.DATA_RATE_TAS 提供(见 10.2 |
| SIGMA_R / SIGMA_A / SIGMA_E / SIGMA_V | 10.0 / 0.02 / 0.2 / 2.0(两体制相同) | 同左 | 量测误差:距离 m / 方位 rad / 俯仰 rad / 速度 m/s |
| DOT_COH_RANGE / DOT_COH_V / DOT_COH_AZI | 80 / 2 / 6 | 同左 | 凝聚门限:距离 m / 速度 m/s / 方位 ° |
| MAX_BEAM_NUM | 100 | 同左 | 最大波位数 |
| MAX_TRACK_NUM / MAX_TRACK_INDEX | 500 / 500 | 同左 | 航迹数上限 / 航迹号上限 |
| R_MIN / R_MAX | 100 / 100000 | 同左 | 有效量程(m |
| TRACK_START_THRESHOLD | 8 | 同左 | 起批波门(d² 门限 64;越大越容易起批) |
| ALPHA_START | 60 | 同左 | 起批折角(°) |
| TRACK_DIE_ROUND | 4 | 4 | TWS 航迹消亡外推轮数 |
| TRACK_DIE_ROUND_TAS | 5 | 96 | TAS 航迹消亡外推轮数 |
| ASSO_THORD | 3 | 同左 | 关联波门 |
| H_F_WIN_LEN | 3 | 同左 | 高度平滑窗长基数(实际 +2/+3/+4/+6 |
| TAS_QUEUE_LENGTH / MAX_TAS_NUM | 4 / 4 | 1 / 1 | TAS 队列长度 / 最大 TAS 目标数 |
| FREQ0 | 9.2 GHz | 同左 | 载波频点(原 FREQ0~FREQ20 一组宏已精简为单个 FREQ0e729c5b 起由 16.8 GHz 改为 9.2 GHz |
### 10.2 运行时参数(RadarPara
| 字段 | 含义 | 备注 |
|---|---|---|
| Beam_num | 波位数 | |
| Height | 雷达平台高度(m | 输出 z 叠加 |
| Sys_delay | 系统延迟(s | 输出航迹位置做 x + vx·Sys_delay 补偿 |
| R_TAS_max/min、V_TAS_max/min、TAS_Height_1~5 | TAS 自动开启/退出条件 | 自动逻辑已停用,字段保留 |
| track_prohibite_area_num + 4×30 数组 | 起批屏蔽区(最多 30 个) | 数量未做上限校验(BUG-07) |
| TAS_prohibite_area_num + 4×30 数组 | TAS 禁止区(最多 30 个) | 同上 |
| cfar_th | CFAR 门限 | 当前未参与处理 |
| work_mode | 0 近程 / 1 中程 / 2 远程 | 决定数据率与门限分支 |
| north_angle | 北偏角 | 保留 |
| V_MAX / V_MIN | 目标速度上下限(m/s) | 航迹头关联速度区间门限 |
| DATA_RATE_SHORT / MIDDLE / FAR | 三模式数据率(s | TWS 外推步长 |
| DATA_RATE_TAS | TAS 波束输出间隔(s | 由调用者经 track_process_parameters_initial 输入(须为 >0 的有效值);`tas_beam_output()` 门控阈值为 DATA_RATE_TAS 秒(1521592 起单位由 Hz 改为 s),引导跟踪外推同样使用该运行时参数 |
| track_start_point_num | 起批点数 | 校验范围 3~9 |
| track_start_threshold / track_asso_threshold / track_asso_threshold_tas | 起批/关联波门 | **⚠ 声明但当前实现未使用**,实际门限为宏 TRACK_START_THRESHOLD / ASSO_THORD |
| Model1/2/3_Q_fast/slow | 三个 Singer 模型过程噪声强度 | Model1_Q_fast 未使用;分档规则见 9.5.1 |
---
## 11. 已知问题与限制
详见 archived_docs/BUG_REPORT.md37 项分析)与 archived_docs/BUG_FIX_REPORT.md(修复明细)。要点:
### 11.1 已修复(archived_docs/BUG_FIX_REPORT.md
- **越界/防御**TAS Point_Sum 限幅 150BUG-04);size()-1 下溢(BUG-05);起批点数校验(BUG-06);航迹号下标校验(BUG-10);Beam_Ctrl 输出计数清零+容量检查(BUG-09);消亡空向量保护(BUG-34);航迹号 500 可复用(BUG-35);局部结构体值初始化(BUG-37)。
- **时间戳/时序**:TWS 关联 ΔT≤0 的候选不参与滤波更新、不刷新航迹状态并消费该点迹(604f158 起由「剔除候选、点迹保持未使用」改为当前行为,仍属 BUG-15 处置范围);TAS 关联 ΔT≤0 拒绝(BUG-16);TAS 外推负时间差跳过(BUG-17);Bind_speed 除零保护(BUG-19)。
- **数值稳定性**:方位残差 ±π 环绕(BUG-22);IMM 概率零分母/奇异保护(BUG-23);EKF 似然 3×3 新息协方差(BUG-24);航向角 atan2BUG-26);asin 定义域钳位(BUG-27);近程模型 3 门限浮点除法(BUG-21);track_clear_all 全模块 resetBUG-28);未初始化变量修复(BUG-11/12/14)。
### 11.2 有意保留 / 未修复(标注于 archived_docs/BUG_REPORT.md
- **BUG-01**:基类无虚析构,Destroy() 按基类指针 delete。
- **BUG-02**Hight_smooth 只增不减,长时运行内存持续增长。
- **BUG-03**:工厂 GetB/Destroy 非线程安全,接口线程模型未定义(宿主应单线程调用)。
- **BUG-07**:禁止区个数未限制在 30 内,配置过大越界读。
- **BUG-08**:消亡航迹输出数组容量未传入,仅约定 ≤500。
- **BUG-13**Work_Parameter 等成员构造后未初始化,必须先调 track_process_parameters_initial 再处理。
- **BUG-18**:卡尔曼两点/三点初始化对零/负时间差无保护(起批时间戳必须严格递增)。
- **BUG-20**:门限对马氏距离平方再次平方(等效 d<3),有意保留。
- **BUG-25**TWS 关联/输出未排除 Track_Mode==1 的 TAS 航迹(原过滤逻辑被注释)。
- **BUG-29**tracking_stop 后 TAS 队列项延迟到下一次 Beam_Ctrl 才移除。
- **BUG-33**:起批关联未显式校验 ΔT>0。
- **BUG-36**TAS 波束关闭时只清 open_flag,其余字段保留旧值。
### 11.3 未启用功能
- direct_tracking_process(引导跟踪)、tracking_point(手动打波束)为**空实现**Track_Init_Direct_Tracking::track_init_process_logic 同样为空。
- track_asso_direct_tracking.cpp **未加入 CMake 源列表**(与旧 .pro 一致)。
- TAS **自动**开启/退出逻辑(tas_auto_start/tas_auto_end)注释停用,仅支持手动 tracking_start/tracking_stop。
- RadarPara 中的起批/关联波门字段未被实现读取(见 10.2)。
- build/output/ 下为早期打包导出物,其 data_process_class_dll.h 时间戳仍为 32 位 int,与当前 64 位接口不一致,勿作为对接依据。
---
## 12. 版本历史
近期提交(git log --oneline,新→旧):
| 提交 | 内容 |
|---|---|
| 604f158 | TWS 关联中 ΔT≤0(点迹时间戳不晚于航迹时间)的候选不再剔除:仍参与最近邻选取但不更新 IMM/EKF、不刷新航迹时间与新鲜度,并标记该点迹已使用(`Use_Flag=1`)消费掉,避免其继续参与航迹起始生成虚假 TWS 航迹;`track_asso.cpp` 的 ΔT≤0 告警日志注释停用;过期文档(BUG_REPORT.md、BUG_FIX_REPORT.md、requirements.md)移入 archived_docs/ 留档 |
| d6cdbc0 | 删除 `data_process.cpp``dot_coh.cpp` 中已注释停用的调试输出与早期 1 km SNR 过滤代码残留(不改变运行逻辑);同步更新 README/CHANGELOG |
| 1521592 | 新增日志模块(`rdp_log.h/.cpp`CMake SOURCES 注册、.gitignore 忽略 `rdp_logs/`):`RDP_LOG_ENABLE` / `RDP_LOG_DIR` 宏(parameters.h)、std::cout 经 `rdbuf()` 重定向到 `.\rdp_logs\` 下日期+时间命名日志、`RDP_LOG` 前缀宏、ΔT≤0 告警日志;`RadarPara.DATA_RATE_TAS` 单位由 Hz 改为 s;修复 `tas_beam_output()` 将向量下标误赋给 `Tracking_beam->TAS_track_index` 的问题;更新 README/CHANGELOG |
| 5f82098 | 修复 MSVC `/W3` 下全部 C4819 / C4018 / C4244 警告(UTF-8 with BOM、size_t / static_cast 等);更新项目文档 |
| f438ac5 | 优化 TAS 调度:波束输出改为在队列内选择满足数据率门控且 CPI 时间最早的目标,停用整队循环移位;DATA_RATE_TAS 编译期宏停用、统一使用运行时参数;#pragma message 提示扫描体制 |
| e729c5b | 频点宏精简为 FREQ0 = 9.2 GHz(原 FREQ0~FREQ20 均为 16.8 GHz |
| b3e2f52 | TAS 波束控制改为按固定数据率调度,RadarPara 新增 DATA_RATE_TAS 运行时参数;新增 CHANGELOG.md、requirements.mdREADME 补充相应说明 |
| 93d3924 | 新增 README.md(本文档);移除 requirements.md;调整 .gitignore |
| 3500652 | 去掉 1 km 以内航迹起批的 20 dB 信噪比门限 |
| 01d28e0 | 改用 VS Code + CMake 重新编译(编译器不变);修复若干逻辑 BUG(见 archived_docs/BUG_FIX_REPORT.md |
| 0cb31b4 | 删除不必要文件;输入点迹/输出航迹的 CPI 与 GNSS 时间改为 64 位整型;修复 TAS 外推时间差可能无效的问题 |
| d101fe9 | 增加航迹清空功能(解决重连乱窜);TAS 外推时间间隔按波束时间计算;增加 1 km 内 SNR<20 dB 不起批限制(后于 3500652 移除) |
| 8636179 | 机扫/相扫程序合并,宏定义配置切换 |
| 06d45f5 | 机扫跟踪增加高度门限判断 |
| 8b1896d | 适配四面阵机扫跟踪模式 |
| ae3ef84 | 扫描一圈完成判断改为「波位号变小」 |
| e9b8a32 | 修复 R 矩阵赋值、波位号判断、点数上限、空容器、雅可比取值、起批负索引、容器 push_back 后修改失效、机扫参数等 8 项 |
| 28fcf06 | 统一代码缩进格式 |
| 7c10ae9 / 958ff6b | TWS 关联增加俯仰门限 / 点航距离门限(限制远距离突跳关联) |
| 2b1293a / 167fa79 | 去掉自动转 TAS,只保留手动转 TAS;起批时手动转跟踪标志清零 |
| 6008959 | 添加「航迹点迹区分区说明.vsdx」(后随 0cb31b4 删除不必要文件而移除) |
| d6e43d6 / 199ae34 | 点迹凝聚角度约束调整;凝聚条件按模式区分(近程:距离/速度/方位;中远程:距离/方位) |
| 06938b2 | 航迹起始增加屏蔽区域 |
---
## 13. 参考文档
| 文档 | 内容 |
|---|---|
| CHANGELOG.md | 变更日志(Keep a Changelog 格式,按 git 提交记录维护) |
| archived_docs/BUG_REPORT.md | 全量逻辑 BUG 分析(P0~P3 共 37 项,含位置、说明、建议、处置结论)——过期留档,仅作历史参考 |
| archived_docs/BUG_FIX_REPORT.md | 修复明细、修复状态汇总表与 MSVC 2013 x86 编译验证记录——过期留档(对应 01d28e0 时期) |
| archived_docs/requirements.md | 修改需求说明:日志文件输出功能(rdbuf() 重定向、parameters.h 日志开关宏、日期+时间命名日志、前缀日志宏,附参考示例)——已实现,留档 |
| backup/data_process_class_dll/data_process_class_dll.pro | 迁移前的 Qt/qmake 工程文件(源文件清单参考) |
| .vscode/tasks.json、.vscode/cmake-variants.yaml | VS Code 构建任务与变体定义 |
| build/X256_PS/bin/RadarConfigParam.ini | 回放测试工具(rdp_playback.exe)配置样例 |