# 雷达数据处理 DLL(data_process_class_dll) > X256 雷达数据处理动态链接库:将雷达输出的原始点迹(TWS/TAS)处理为稳定可靠的目标航迹,并给出 TAS 跟踪波束控制指令。 > 仓库 simianzhen256-v1.5.5-ms-vscode(上游 simianzhen256,v1.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 为 TWS,point_type = 1 为 TAS | | 跟踪模式 | Track_Mode = 0 为 TWS,Track_Mode = 1 为 TAS | --- ## 2. 功能特性 - **双模式处理管线**:data_preprocess 按输入类型与扫描圈完成标志返回 0/1/2/3,track_process 据此调度 TWS 凝聚/关联/起始或 TAS 凝聚/关联。 - **两帧滑窗点迹凝聚**:TWS 点迹先与上一帧缓存合并凝聚,再进入关联,兼顾跨波位(CPI)相邻点迹的分裂问题;近程模式增加速度维约束。 - **逻辑法航迹起始**:航迹头(单点)→ 点-头速度法关联(两点)→ 点-临时航迹 EKF 波门 + 折角约束关联(三点及以上)→ 三点卡尔曼初始化转可靠航迹;带起批屏蔽区与重复航迹去重。 - **3 模型 IMM 滤波**:三个 Singer 模型(低/中/高过程噪声),量测为「距离-方位-径向速度」三维的 EKF,多普勒残差按盲速折叠,似然用 3×3 新息协方差。 - **最近邻数据关联**:TWS 按航迹距离分段收紧模型 3 波门并附加距离门限;TAS 附加按距离分段的高度门限。 - **高度维独立平滑**:按距离分段选择滑动平均窗长(5/6/7/9 点),抑制俯仰测量跳变。 - **TAS 波束控制**:手动转 TAS 目标入队(队列长度与容量随扫描体制切换),按最新时间戳外推输出跟踪波束(距离/方位/俯仰/批号)。 - **航迹生命周期管理**:外推轮数计数、超时消亡、手动删除、全清空(含各模块 reset,防重连后幽灵航迹)。 - **防御性加固**:见 BUG_FIX_REPORT.md——越界防护、时间戳正序校验、方位角 ±π 环绕、asin 定义域钳位、IMM 概率奇异保护等已修复项。 --- ## 3. 目录结构 ```text . ├── CMakeLists.txt # CMake 构建脚本(扫描模式切换、导出宏、输出目录) ├── BUG_REPORT.md # 全量逻辑 BUG 分析报告(P0~P3,37 项) ├── BUG_FIX_REPORT.md # BUG 修复报告(修复明细 + 编译验证结果) ├── .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 单例) │ ├── 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 依据) └── .gitignore ``` --- ## 4. 构建与环境 ### 4.1 环境要求 | 组件 | 要求 | |---|---| | 操作系统 | Windows(构建脚本按 D:\APP\VisualStudio2013 与 Windows Kits 8.1 路径配置) | | 编译器 | Microsoft Visual C++ 2013(Visual Studio 12)**x86**(与原 Qt 工程保持一致) | | CMake | ≥ 3.10 | | 生成器 | NMake Makefiles(VS 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//bin/ | | 导入库 data_process_class_dll.lib | build//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 输出),不在本仓库源码范围内。 --- ## 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 { <> +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_Process(data_process.cpp) | 对外接口实现与流程编排:输入缓存、按 model 分发 TWS/TAS 流水线、参数管理、航迹清空/删除、手动转/停 TAS、波束控制转发 | | Dot_Coh | TWS 点迹凝聚:两帧滑窗合并凝聚(dot_coh_process_buff) | | Dot_Coh_TAS | TAS 点迹凝聚(单帧,距离/方位/速度三维门限) | | Track_Asso | TWS 点航关联 + IMM 滤波:模型交互 → 门限筛选(NN)→ 各模型 EKF → 概率更新 → 模型输出;未关联航迹外推;高度平滑 | | 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)、队列轮转 | | Track_Ind_Mangement | 航迹号 1~500 的顺序分配与回绕复用 | | kalman | 两点/三点滤波初始化、线性卡尔曼预测/滤波、EKF(3 维量测含多普勒)、马氏统计距离 d、盲速 Bind_speed | | coor_trans | 极坐标 ↔ 直角坐标转换 | | 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 | 引导跟踪——**未实现(保留空实现)** | ### 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,因此必然返回 1;track_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: 队列轮转 + 预测波束输出"] ``` ### 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 m(DOT_COH_RANGE) | ≤ 6°(DOT_COH_AZI) | ≤ 2 m/s(DOT_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/20;530: fast | v≤5: slow/20;50100: 10·fast | v≤5: slow/20;50 注意: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_init(CV 模型 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}=16.8+0.02\cdot f_{ind} $$ (PRI ≤ 0 或 f ≤ 0 时返回安全值 1.0,接口约定 PRI 不允许为 0。) 关联判定与模型似然共用 d = νᵀS⁻¹ν,滤波后输出完整 3×3 新息协方差 S 供似然归一化使用(BUG-24 已修复)。 ### 9.6 点航关联(最近邻) #### TWS(track_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(乱序/重复时间戳)的候选被剔除且不占用点迹、不刷新航迹状态(BUG-15 修复)。 #### TAS(track_asso_tas.cpp) 只处理 tas_track_idx 指定的航迹,门限: $$ d_i^2 < ASSO\_THORD^2 = 9\ \ \text{且高度门限}\ d_h=1 $$ 高度门限按航迹距离分段:≤1000 m:|h_t−h_p| ≤ 150 m;1000~2000 m:≤ 200 m;2000~3000 m:≤ 200 m;3000~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,&10004000\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 预测一帧;TAS 通道按 latest_timestamp − T_track 预测(ΔT ≤ 0 跳过);预测用各子模型 Singer F/Qj 推进,Extrapolate_round+1,point_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 并输出一次航迹更新。 - **出队**:队列中目标在航迹表中不存在、或不再处于手动 TAS 状态时清除。(自动转 TAS / 自动退出的 tas_auto_start/tas_auto_end 逻辑全部注释停用——只支持手动。) - **波束输出**:取队首目标,用其状态外推到 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。每次 Beam_Ctrl 末尾做队列轮转(实现 TAS_QUEUE_LENGTH 深度的循环跟踪)。 - tas_ctrl_process 入口强制 *Trust_track_num_Output=0 并在写入前检查容量,防止输出数组越界(BUG-09 修复)。 --- ## 10. 参数说明 ### 10.1 编译期宏(parameters.h,随扫描体制切换) | 宏 | 相扫 PHASE_SCANNING | 机扫 MECHANICAL_SCANNING | 含义 | |---|---|---|---| | DATA_RATE_TAS | 0.3 | 0.0625 | TAS 数据率(s) | | 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~FREQ20 | 16.8 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 外推步长 | | 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. 已知问题与限制 详见 BUG_REPORT.md(37 项分析)与 BUG_FIX_REPORT.md(修复明细)。要点: ### 11.1 已修复(BUG_FIX_REPORT.md) - **越界/防御**:TAS Point_Sum 限幅 150(BUG-04);size()-1 下溢(BUG-05);起批点数校验(BUG-06);航迹号下标校验(BUG-10);Beam_Ctrl 输出计数清零+容量检查(BUG-09);消亡空向量保护(BUG-34);航迹号 500 可复用(BUG-35);局部结构体值初始化(BUG-37)。 - **时间戳/时序**:TWS/TAS 关联 ΔT≤0 拒绝(BUG-15/16);TAS 外推负时间差跳过(BUG-17);Bind_speed 除零保护(BUG-19)。 - **数值稳定性**:方位残差 ±π 环绕(BUG-22);IMM 概率零分母/奇异保护(BUG-23);EKF 似然 3×3 新息协方差(BUG-24);航向角 atan2(BUG-26);asin 定义域钳位(BUG-27);近程模型 3 门限浮点除法(BUG-21);track_clear_all 全模块 reset(BUG-28);未初始化变量修复(BUG-11/12/14)。 ### 11.2 有意保留 / 未修复(标注于 BUG_REPORT) - **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,新→旧): | 提交 | 内容 | |---|---| | 3500652 | 去掉 1 km 以内航迹起批的 20 dB 信噪比门限 | | 01d28e0 | 改用 VS Code + CMake 重新编译(编译器不变);修复若干逻辑 BUG(见 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. 参考文档 | 文档 | 内容 | |---|---| | BUG_REPORT.md | 全量逻辑 BUG 分析(P0~P3 共 37 项,含位置、说明、建议、处置结论) | | BUG_FIX_REPORT.md | 本次修复明细、修复状态汇总表与 MSVC 2013 x86 编译验证记录 | | 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)配置样例 |