雷达数据处理 DLLdata_process_class_dll

X256 雷达数据处理动态链接库:将雷达输出的原始点迹(TWS/TAS)处理为稳定可靠的目标航迹,并给出 TAS 跟踪波束控制指令。 仓库 simianzhen256-v1.5.5-ms-vscode(上游 simianzhen256v1.5.5;已由 Qt/qmake 工程迁移为 VS Code + CMake 工程)。


目录

  1. 项目简介
  2. 功能特性
  3. 目录结构
  4. 构建与环境
  5. 总体架构
  6. 关键数据结构
  7. 外部接口与调用流程
  8. 处理流程总览
  9. 算法实现详解
  10. 参数说明
  11. 已知问题与限制
  12. 版本历史
  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 附加按距离分段的高度门限。
  • 高度维独立平滑:按距离分段选择滑动平均窗长(5/6/7/9 点),抑制俯仰测量跳变。
  • TAS 波束控制:手动转 TAS 目标入队(队列长度与容量随扫描体制切换),按最新时间戳外推输出跟踪波束(距离/方位/俯仰/批号)。
  • 航迹生命周期管理:外推轮数计数、超时消亡、手动删除、全清空(含各模块 reset,防重连后幽灵航迹)。
  • 防御性加固:见 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. 目录结构

.
├── CMakeLists.txt                       # CMake 构建脚本(扫描模式切换、导出宏、输出目录)
├── BUG_REPORT.md                        # 全量逻辑 BUG 分析报告(P0~P337 项)
├── BUG_FIX_REPORT.md                    # BUG 修复报告(修复明细 + 编译验证结果)
├── CHANGELOG.md                         # 变更日志(Keep a Changelog 格式,按 git 提交记录维护)
├── 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 12x86(与原 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 命令行构建

:: 需在 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):

.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()。
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 → 概率更新 → 模型输出;未关联航迹外推;高度平滑
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 工作参数 参数说明

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 典型调用序列

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

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

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 航迹起始流程(逻辑法)

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(起批点数由参数给定,典型 34,接口层校验 39)且不在起批屏蔽区内(屏蔽区为距离-方位矩形区域,最多 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(乱序/重复时间戳)的候选被剔除且不占用点迹、不刷新航迹状态(BUG-15 修复)。

TAStrack_asso_tas.cpp

只处理 tas_track_idx 指定的航迹,门限:


d_i^2 < ASSO\_THORD^2 = 9\ \ \text{且高度门限}\ d_h=1

高度门限按航迹距离分段:≤1000 m|h_th_p| ≤ 150 m10002000 m:≤ 200 m20003000 m:≤ 200 m3000~5000 m:≤ 300 m>5000 m:不约束。

波门语义提示:代码中 d 本身已是马氏距离平方,但门限写作 dd < ASSO_THORDASSO_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 预测一帧;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. 已知问题与限制

详见 BUG_REPORT.md37 项分析)与 BUG_FIX_REPORT.md(修复明细)。要点:

11.1 已修复(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/TAS 关联 ΔT≤0 拒绝(BUG-15/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 有意保留 / 未修复(标注于 BUG_REPORT

  • BUG-01:基类无虚析构,Destroy() 按基类指针 delete。
  • BUG-02Hight_smooth 只增不减,长时运行内存持续增长。
  • BUG-03:工厂 GetB/Destroy 非线程安全,接口线程模型未定义(宿主应单线程调用)。
  • BUG-07:禁止区个数未限制在 30 内,配置过大越界读。
  • BUG-08:消亡航迹输出数组容量未传入,仅约定 ≤500。
  • BUG-13Work_Parameter 等成员构造后未初始化,必须先调 track_process_parameters_initial 再处理。
  • BUG-18:卡尔曼两点/三点初始化对零/负时间差无保护(起批时间戳必须严格递增)。
  • BUG-20:门限对马氏距离平方再次平方(等效 d<3),有意保留。
  • BUG-25TWS 关联/输出未排除 Track_Mode==1 的 TAS 航迹(原过滤逻辑被注释)。
  • BUG-29tracking_stop 后 TAS 队列项延迟到下一次 Beam_Ctrl 才移除。
  • BUG-33:起批关联未显式校验 ΔT>0。
  • BUG-36TAS 波束关闭时只清 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,新→旧):

提交 内容
1521592 新增日志模块(rdp_log.h/.cppCMake 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(见 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 提交记录维护)
BUG_REPORT.md 全量逻辑 BUG 分析(P0~P3 共 37 项,含位置、说明、建议、处置结论)
BUG_FIX_REPORT.md 本次修复明细、修复状态汇总表与 MSVC 2013 x86 编译验证记录
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)配置样例
S
Description
雷达数据处理项目
Readme
3.1 MiB
Languages
C++ 98.2%
C 1.7%
CMake 0.1%