雷达数据处理 DLL(data_process_class_dll)
X256 雷达数据处理动态链接库:将雷达输出的原始点迹(TWS/TAS)处理为稳定可靠的目标航迹,并给出 TAS 跟踪波束控制指令。 仓库 simianzhen256-v1.5.5-ms-vscode(目录名沿用旧版本,当前代码版本为 V1.5.9;已由 Qt/qmake 工程迁移为 VS Code + CMake 工程,编译器为 MSVC 2022 / v143,C++17,x64 目标)。
版本号由
parameters.h的MAJOR_VERSION/MINOR_VERSION/PATCH_VERSION(当前 1.5.9)与VERSION_INFO("GENERIC"——机扫/相扫版本已合并为同一份 DLL,无体制后缀)拼装为VERSION_STRING(V1.5.9.GENERIC),实例创建后可从Data_Process_Factory::GetB()返回对象的公开成员version_info(const char*)读取。工作参数来源(参数配置方式改造后):全部雷达工作参数由宿主调用
parameters_reload(配置文件路径)从 TOML 配置文件加载到 DLL 内的全局对象rdp_parameter(struct.h中extern声明、data_process.cpp中定义并零初始化),不再由宿主下发struct RadarPara、也不再由parameters.h编译期宏配置;各处理模块直接访问该全局对象(见 5.1、10)。
目录
1. 项目简介
本仓库是一个 Windows 动态链接库,实现某型雷达(内部代号 X256;机扫、相扫两个版本已合并为同一份 DLL,扫描模式由运行期配置项 [radar_params] scan_mode 选择,构建不再区分体制)的 航迹数据处理 功能,包括:
- 输入点迹预处理与点迹凝聚(滑窗凝聚)
- 边扫描边跟踪(TWS)与边跟踪边扫描(TAS)双通道处理
- 逻辑法航迹起始(3~9 点起批,含屏蔽区、角度/波门约束)
- IMM + 扩展卡尔曼滤波(EKF,含多普勒速度)航迹维持
- 最近邻(NN)点航关联
- 航迹外推、消亡与航迹号管理
- TAS 手动转跟踪与跟踪波束调度输出
技术栈:C++(MSVC 2022 / v143 工具集,C++17)、Eigen 3(随仓库内置,仅用 Eigen/Dense)、spdlog v1.17.0(日志,随仓库内置,以 CMake 静态库目标编译,见 4.1/4.3)、CMake ≥ 3.21。
处理约定:
| 项目 | 约定 |
|---|---|
| 时间戳 | 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 |
| 参数来源 | TOML 配置文件(config/config_tmp.toml 为样例)→ DLL 内全局对象 rdp_parameter(struct RDP_parameter),宿主通过 parameters_reload() 加载;参数对照见 10 |
| 判圈模式 | 由配置项 [radar_params] scan_mode 运行时选择:0 相扫(波位号 ≤ 上一帧判满圈)/ 1 机扫(波位号 == 0 判满圈);机扫/相扫已合并为同一份构建,不再有编译期体制(见 4.2、7.2) |
2. 功能特性
- 双模式处理管线:data_preprocess 按输入类型与扫描圈完成标志返回 0/1/2/3,track_process 据此调度 TWS 凝聚/关联/起始或 TAS 凝聚/关联。判圈条件由配置项
[radar_params] scan_mode运行时选择(0 相扫 / 1 机扫):相扫比较前后两帧方位波位号(当前波位号 ≤ 上一帧波位号即判满圈),机扫以「方位波位号 == 0」判满圈(规避转台反转导致的误判),详见 7.2。 - 两帧滑窗点迹凝聚:TWS 点迹先与上一帧缓存合并凝聚,再进入关联,兼顾跨波位(CPI)相邻点迹的分裂问题;近程模式增加速度维约束。
- 逻辑法航迹起始:每圈按固定顺序推进——① 未关联点迹先与 ≥2 点临时航迹做 EKF 波门 + 折角约束关联(延长临时航迹),② 再与 1 点航迹头做速度法关联(两点卡尔曼初始化出 2 点临时航迹),③ 两步都做完后删除被消费的点迹、剩余点迹转成新航迹头,④ 长度达标的临时航迹经三点卡尔曼初始化转可靠航迹;带起批屏蔽区与重复航迹去重。
- 3 模型 IMM 滤波:三个 Singer 模型(低/中/高过程噪声),量测为「距离-方位-径向速度」三维的 EKF,多普勒残差按盲速折叠,似然用 3×3 新息协方差。
- 最近邻数据关联:三模型统计距离波门
associate_threshold = 4(配置项[track_associate] associate_threshold,等效 d < 4,TWS 另按航迹距离分段收紧模型 3 波门),再叠加高度门限(≤1000 m 150 m / 2000 m 200 m / 3000 m 250 m / 5000 m 300 m,更远不约束)与 TWS 弦距-位移距离门限。ΔT ≤ 0(点迹时间戳不晚于航迹时间)的候选不更新航迹状态、仅消费该点迹(标记已使用),避免其继续起批而生成虚假 TWS 航迹。关联输出的航迹同时给出靠近/远离方向标志:按航迹 IMM 融合速度矢量与「雷达→目标」位置矢量的夹角判定——acos((-x·cos(Direction_Angle) − y·sin(Direction_Angle)) / r) < π/2置 1(靠近),否则 0(远离),等价于「滤波速度的径向分量指向雷达」,不再使用受多普勒模糊影响的实测径向速度vr_point;TWS、TAS 两通道一致(见 9.6)。 - 重点目标与外推上限:
primary_target_add/primary_target_cancel可按批号手动标记/取消重点目标,重点航迹的消亡轮数放宽到track_die_round_pramary(默认 10);未关联航迹的外推圈数受限(TWS ≤extrapolate_max=3,TAS 由extrapolate_max_tas控制,样例配置为相扫 5 / 机扫需配 48),超限后停止外推。输出航迹只包含本圈有更新的航迹(Track_Update_Flag门控),宿主不能再用输出行数推断航迹总数(见 9.9)。 - 航迹质量(V1.5.8):归一化航迹质量(0
1,内部)贯穿起始→关联→外推三阶段——临时航迹每延长一点按「统计距离 + SNR」重算,关联实点后按「统计距离 + SNR + 有效点占比」加权并指数平滑,未关联期间按未更新时长二次衰减;起批需达到按长度分级的最低质量,输出航迹给 0100 的Quality字段;普通 TWS 航迹的消亡改由质量决定(Quality < 0.3),重点航迹与 TAS 航迹仍按外推圈数(见 9.11)。 - 点迹附加信息字段扩展(需同步重编译宿主):
DataRev新增amp_asv/prn_fftn,Track新增amp_asv_point/prn_fftn_point,结构体布局随之变化,宿主必须使用同一版本头文件重新编译对接;输入侧已打通(TWS 输出有效,TAS 输出仍未写回),详见 11.2。 - 高度维独立平滑:按距离分段选择滑动平均窗长,TWS 为
height_smooth_win + {2,3,4,6}、TAS 为height_smooth_win + {6,8,10,12}(样例配置height_smooth_win=6 对应相扫;机扫需配 3),抑制俯仰测量跳变(见 9.7)。 - 参数配置外置(参数配置方式改造):全部工作参数(原
parameters.h宏 +RadarPara字段)改由 TOML 配置文件提供,宿主在GetB()后调用一次parameters_reload(路径)加载(重连/换配置可再次调用);加载器严格校验 11 个配置段、键名/类型/取值范围与屏蔽区数组长度,失败返回 -1 且不改变当前参数(见 10.1)。样例配置config/config_tmp.toml为相扫取值(scan_mode = 0);机扫部署需改用scan_mode = 1并把extrapolate_max_tas、height_smooth_win、track_die_round_tas、tas_track_num_max配为 48 / 3 / 96 / 1(这 4 项在改造前按扫描体制取不同宏值,现在同一份配置对所有体制生效)。判圈逻辑由配置项scan_mode决定(不再是编译期体制),详见 4.2、7.2。 - TAS 波束控制:手动转 TAS 目标入队(队列容量为编译期常量
RDP_TAS_QUEUE_CAPACITY、运行期上限为配置项tas_track_num_max),按最新时间戳外推输出跟踪波束(距离/方位/俯仰/批号)。 - 航迹生命周期管理:外推轮数计数、超时消亡与质量消亡(普通 TWS 航迹)、手动删除、全清空(含各模块 reset,防重连后幽灵航迹)。
- 防御性加固:见 archived_docs/BUG_FIX_REPORT.md——越界防护、时间戳正序校验、方位角 ±π 环绕、asin 定义域钳位、IMM 概率奇异保护等已修复项。
- 日志输出(基于 spdlog):内置 spdlog v1.17.0(
third_party/spdlog,以静态库目标spdlog编译进 DLL),日志始终同时写到标准输出与RDP_LOG_DIR(.\rdp_logs\)下按日期+时间命名的日志文件(rdp_YYYYMMDD_HHMMSS.log,每次GetB()一个文件;同一秒内文件已存在时追加_1~_999后缀,不复用文件):GetB()调用rdp_log::Init()完成初始化、Destroy()调用rdp_log::Shutdown()flush 并关闭。日志行格式为[YYYY-MM-DD HH:MM:SS.mmm] [级别] [文件名:行号] 内容(毫秒时间戳 + spdlog 级别 trace/debug/info/warning/error/critical + 源码位置),所有级别逐条 flush。日志宏为RDP_LOG_TRACE/RDP_LOG_DEBUG/RDP_LOG_INFO/RDP_LOG_WARN/RDP_LOG_ERROR/RDP_LOG_CRITICAL(RDP_LOG_ERR为RDP_LOG_ERROR的别名,支持 fmt 风格格式化,如RDP_LOG_INFO("batch: {}", id)),原RDP_LOG流式宏已删除;日志级别由 CMake 缓存变量RDP_LOG_LEVEL映射SPDLOG_ACTIVE_LEVEL在编译期控制(AUTO 时 Debug=TRACE、其余构建=INFO,OFF 编译期关闭全部日志且不创建日志文件),原RDP_LOG_ENABLE布尔开关已移除(见 4.3、10.4)。 - 版本号输出:
parameters.h的MAJOR_VERSION/MINOR_VERSION/PATCH_VERSION(当前 1.5.9)经两级STRINGIFY宏拼成VERSION_STRING(V1.5.9.GENERIC,机扫/相扫共用同一版本、无 PS/MS 后缀);Data_process_class_dll基类公开成员const char* version_info由Data_Process_Factory::GetB()在创建实例时赋值,宿主可直接读取以核对/上报 DLL 版本(b227ae1)。 - 数据记录调试功能(可选编译、异步批量写入):
rdp_record模块把结构体按「一个记录实体一张表」写入 SQLite(一次运行一个 db 文件、多张表),结构体到表的映射由内置的 ormpp(third_party/ormpp,含 iguana、frozen 与 SQLite 3.49.1 amalgamation)完成;由 CMake 选项RDP_DATA_RECORD(AUTO/ON/OFF)控制,AUTO 时 Debug 构建启用、Release(交付)构建完全不编译——记录模块源码不参与编译、记录宏(6 个异步入队宏与遗留RDP_RECORD/RDP_RECORD_BATCH)展开为((void)0)(实参不求值),DLL 不新增依赖与导出符号、无性能损失。V1.5.8 优化后的运行模型:GetB()建目录、开库(.\rdp_records\rdp_record_YYYYMMDD_HHMMSS.db)并启动独立写线程;12 个记录点只做「帧/圈内收集源结构体 → 一次入队」(收集代码均在#ifdef RDP_RECORD_ENABLE内),实体构造(数组转文本)与 SQLite 批量事务全部在写线程完成;入队队列有界(默认 64 MB / 4096 批,满则整批丢弃并计入stats().dropped_rows,不阻塞处理线程),写线程按 4096 行或等待 50 ms 凑批提交,SQLite 使用 WAL +synchronous=OFF+ 8 MB 缓存,建表后去掉AUTOINCREMENT;Destroy()时停止入队、排空、wal_checkpoint(TRUNCATE)、关库并打印统计,支持Destroy()→GetB()重连重新建库(同秒文件名冲突追加_1/_2后缀)。当前内置 6 个记录实体定义、6 张在用表(输入点迹、TWS/TAS 凝聚后点迹、临时航迹、可靠航迹、点航关联信息),可靠航迹与关联信息两通道均覆盖 TWS 与 TAS(TAS 侧由5cb67cc补齐,关联信息以tas_flag区分来源),临时航迹与可靠航迹表还记录航迹质量(1ffb287:RdpRecTempTrack.quality、RdpRecTrustTrack.Quality及Unupdated_time/Point_sum/Valid_point_sum),并新增point_id/frame_id/circle_id/temp_track_id/track_id等关联标识,可把一次处理的点迹→凝聚→临时航迹→可靠航迹→关联信息串成完整链路;新增记录数据按「加记录实体 + 注册 + 加异步入队接口/宏 + 写线程分支 + 业务侧收集调用」四步进行,详见 docs/data_record_debug.md(见 4.3、10.4、11.3)。
3. 目录结构
.
├── CMakeLists.txt # CMake 构建脚本(构建类型/记录模式/日志编译期级别、内置第三方库、导出宏、输出目录)
├── CHANGELOG.md # 变更日志(Keep a Changelog 格式,按 git 提交记录维护)
├── README.md # 本文件:项目说明(架构、接口、流程、算法、参数)
├── requirements.md # 需求说明:日志组件 rdp_log 改为使用 spdlog(日志同时输出标准输出与日志文件、RDP_LOG_* 级别宏、SPDLOG_ACTIVE_LEVEL 编译期控制)——已按该说明实现
├── config/ # 参数配置文件目录
│ └── config_tmp.toml # 参数配置样例(TOML,11 个配置段,键名与 struct RDP_parameter 成员一致;样例为相扫取值)
├── archived_docs/ # 过期文档留档(仅作历史参考;接口与流程以本 README 与 docs/ 专项说明为准)
│ ├── BUG_REPORT.md # 全量逻辑 BUG 分析报告(P0~P3,37 项)
│ └── BUG_FIX_REPORT.md # BUG 修复报告(修复明细 + 编译验证结果)
├── docs/ # 专项说明文档(按当前源码整理,与 README 互补)
│ ├── data_process_flow_report.md # 数据处理流程与关键逻辑说明(前处理/判圈、凝聚、关联与滤波、起始、外推消亡、TAS 波束、参数脉络)
│ ├── track_init_readme.md # 航迹起始(Track Init)详细逻辑说明(阶段流程、条件汇总、输出字段映射、风险点、代码索引)
│ └── data_record_debug.md # 数据记录调试功能说明(开关与构建、异步运行期行为与队列/批事务参数、表结构约定、新增记录点四步配方、6 张在用记录表清单与字段、查询示例、已知限制与验证参考)
├── design_docs/ # 设计与讨论资料留档(被 .gitignore 忽略、不入库;含设计讨论、产品介绍与 README/流程报告的导出、渲染版本)
├── .vscode/ # VS Code 工程配置
│ ├── settings.json # cmake.generator=NMake、MSVC2022 x64 环境变量、构建目录=build/<构建类型>/<记录模式>、compile_commands
│ ├── cmake-variants.yaml # Release / Debug × REC_AUTO / REC_OFF / REC_ON 变体(机扫/相扫已合并,无体制维度)
│ ├── tasks.json # 仅 5 个任务:清理全部 + 4 种组合的「配置并构建」(原有任务已删除)
│ └── scripts/ # 构建脚本(纯 ASCII,避免 cmd 代码页问题)
│ ├── msvc_env.bat # 共享环境设置:定位 VS2022/cl.exe 并调用 vcvarsall.bat(x64)
│ ├── config_paths.bat # 按「构建类型/记录模式」推导构建目录并校验参数
│ ├── configure.bat # 单配置 CMake 配置(含旧工具集构建树自动清理)
│ ├── build.bat # 单配置 CMake 构建
│ ├── clean.bat # 单配置清理(删除该配置的构建目录)
│ ├── build_config.bat # 单配置「配置 + 构建」(4 个构建任务调用)
│ └── clean_all.bat # 清理全部配置的构建输出(含旧版 X256_PS/X256_MS 目录)
├── backup/
│ └── data_process_class_dll/
│ ├── data_process_class_dll.pro # 迁移前的 Qt/qmake 工程文件(备份)
│ └── data_process_class_dll.pro.user
├── third_party/ # 内置第三方源码(按上游原样保存,来源/版本/升级方式见各目录 UPSTREAM.md 或文件头)
│ ├── ormpp/ # ormpp 0.2.0 + iguana 1.0.5 + frozen + SQLite 3.49.1 amalgamation(Apache-2.0 / 公有领域)
│ ├── spdlog/ # spdlog v1.17.0(MIT,日志库;include/ + src/ + LICENSE,以 CMake 静态库目标 spdlog 编译,来源/校验/升级见 UPSTREAM.md)
│ │ └── UPSTREAM.md # spdlog 来源与版本说明(v1.17.0 上游快照、内置 {fmt} 12.1.0、校验值、复现与升级步骤)
│ └── toml/
│ └── toml.hpp # toml++ v3.4.0 单头文件(MIT,仅参数加载器 rdp_parameter_loader.cpp 使用)
├── data_process_class_dll/ # 源码目录
│ ├── data_process_class_dll.h # 对外接口:DataRev/Track/TrackingBeam/Target_direct_tracking 结构体、抽象基类(公开成员 version_info、虚接口 parameters_reload)、工厂类
│ ├── data_process_class_dll_global.h # DLL 导入导出宏
│ ├── data_process_class_dll.cpp # 工厂实现(GetB/Destroy 单例;GetB 中依次初始化日志与数据记录,Destroy 中先关闭记录再关闭日志)
│ ├── rdp_log.h / .cpp # 日志模块(基于 spdlog):Init() 创建 .\rdp_logs\rdp_YYYYMMDD_HHMMSS.log 并同时输出标准输出+文件、Shutdown() flush 并关闭;RDP_LOG_* 级别宏(fmt 风格;日志级别由 CMake 选项 RDP_LOG_LEVEL 控制)
│ ├── rdp_record.h / .cpp # 数据记录调试模块:结构体→SQLite 表(内置 ormpp)、异步入队接口与宏(RDP_RECORD_POINTS 等 6 个)+ 遗留 RDP_RECORD/RDP_RECORD_BATCH、有界队列、异步写线程、批量事务、Stats 统计、失败降级/熔断(开关由 CMake 选项 RDP_DATA_RECORD 控制;实现以 C++20 独立编译)
│ ├── rdp_record_entity.h # 记录实体(=数据表)定义区:6 张在用表(输入点迹、TWS/TAS 凝聚后点迹、临时航迹、可靠航迹、关联信息)+ RDP_RECORD_DECLARE 声明宏;新增需要记录的数据在此加结构体
│ ├── rdp_parameter_loader.h / .cpp # TOML 参数加载器(内部模块,不属于宿主接口):rdp_parameter_load() 严格校验 11 个配置段并写入全局对象 rdp_parameter,失败返回 -1 且不改变入参
│ ├── data_process.h / .cpp # Data_Process 实现:接口分发、TWS/TAS 主流程、参数加载(parameters_reload);.cpp 中定义全局对象 rdp_parameter;含 point_id/frame_id/circle_id 自增计数(记录用)
│ ├── struct.h # 内部结构体:PointRecv / Trust_Track / Temp_track / Asso_Info / Tracking_Target / RDP_parameter(工作参数,与 TOML 配置一一对应)+ 全局工作参数对象 rdp_parameter 的 extern 声明
│ ├── parameters.h # 编译期常量:PI、版本宏、RDP_LOG_DIR、RDP_RECORD_*、MAX_TRACK_NUM、RDP_TAS_QUEUE_CAPACITY、Round(日志级别改由 CMake 选项 RDP_LOG_LEVEL → SPDLOG_ACTIVE_LEVEL 控制,原 RDP_LOG_ENABLE 开关已删除;不再含雷达工作参数宏;机扫/相扫合并后构建不再定义体制宏,版本串为 V1.5.9.GENERIC)
│ ├── 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 忽略)
│ ├── Debug/ # Debug 构建根目录:REC_AUTO / REC_OFF / REC_ON
│ ├── Release/ # Release 构建根目录:REC_AUTO / REC_OFF / REC_ON
│ └── output/ # 早期打包导出(其中 data_process_class_dll.h 为旧版 32 位时间戳接口,勿作为当前 API 依据)
├── rdp_logs/ # 日志输出目录(GetB() 时自动创建于宿主进程当前工作目录下,存放 rdp_YYYYMMDD_HHMMSS.log,被 .gitignore 忽略)
├── rdp_records/ # 数据记录库输出目录(运行时自动创建于宿主进程当前工作目录下,被 .gitignore 忽略;仅记录功能启用时产生)
└── .gitignore
4. 构建与环境
4.1 环境要求
| 组件 | 要求 |
|---|---|
| 操作系统 | Windows(构建脚本默认按 D:\APP\VisualStudio2022 与 Windows SDK 10.0.26100.0 配置,可用环境变量覆盖) |
| 编译器 | Microsoft Visual C++ 2022(v143 工具集,_MSC_VER 19.44)x64(D:\APP\VisualStudio2022\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64\cl.exe) |
| C++ 标准 | C++17(/std:c++17;由 CMAKE_CXX_STANDARD 17 + CMAKE_CXX_STANDARD_REQUIRED ON 强制) |
| CMake | ≥ 3.21(VS2022 生成器自 3.21 起支持;本工程实际在 CMake 4.x 上验证) |
| 生成器 | NMake Makefiles(VS Code 配置与脚本均使用该生成器) |
| 线性代数 | 无需安装——Eigen 头文件已内置在源码目录 |
| 参数配置 | 无需安装——配置文件为 TOML 格式,解析器 toml++ v3.4.0 已内置在 third_party/toml/toml.hpp(仅头文件);样例见 config/config_tmp.toml(见 10) |
| 数据记录(可选调试功能) | 无需安装——ormpp / iguana / frozen / SQLite amalgamation 已内置在 third_party/ormpp(版本与升级方式见该目录 UPSTREAM.md);启用时记录模块以 C++20 独立编译,所需的 C 编译器由同一 VS 2022 工具集提供 |
| 日志(spdlog,内置) | 无需安装——spdlog v1.17.0 已内置在 third_party/spdlog(含随库内置的 {fmt} 12.1.0),以 CMake 静态库目标 spdlog 编译;来源、校验值、复现与升级步骤见该目录 UPSTREAM.md。日志级别由 CMake 选项 RDP_LOG_LEVEL 控制(见 4.3) |
4.2 扫描模式(运行期配置)
机扫与相扫版本已合并为同一份 DLL:构建不再有扫描体制维度(CMakeLists.txt 不再有 RADAR_SCAN_MODE 缓存变量,也不再定义 PHASE_SCANNING / MECHANICAL_SCANNING 编译宏;parameters.h 的 VERSION_INFO 固定为 "GENERIC",版本串为 V1.5.9.GENERIC)。扫描模式改由运行期配置项 [radar_params] scan_mode 决定(0 相扫 / 1 机扫),随全部工作参数由 TOML 配置文件经 parameters_reload() 载入(见 10);同一份 DLL 加载不同配置即可分别用于相扫 / 机扫部署,TWS 判圈行为随之切换(见 7.2)。
部署一致性提示:DLL 不校验配置项
scan_mode与实际雷达体制 / 波位号序列是否一致(不报错)。机扫部署须把scan_mode配为 1,并把 4 项体制相关参数按机扫取值:extrapolate_max_tas=48、height_smooth_win=3、track_die_round_tas=96、tas_track_num_max=1(样例config/config_tmp.toml为相扫取值,见 10.1)。判圈要求:相扫每圈波位号先增后回到起点、机扫每圈均出现 0。
构建只按「构建类型 × 记录模式」划分目录(见 4.3):
| 维度 | 取值 | 构建目录 |
|---|---|---|
| 构建类型 | Debug / Release | build/<Debug|Release>/… |
| 记录模式 | REC_AUTO / REC_OFF / REC_ON | …/<REC_AUTO|REC_OFF|REC_ON> |
4.3 命令行构建
构建目录由「构建类型 + 记录模式」唯一确定(机扫/相扫已合并为同一版本,无扫描体制维度),构建脚本、VS Code 任务与 CMake Tools 变体使用同一布局:
build/<Debug|Release>/<REC_AUTO|REC_OFF|REC_ON>
:: 单配置操作(参数:<Debug|Release> [AUTO|ON|OFF],记录模式缺省 AUTO)
:: 构建目录自动推导,例如 build/Release/REC_OFF
.vscode\scripts\configure.bat Release OFF
.vscode\scripts\build.bat Release OFF
.vscode\scripts\clean.bat Release OFF
:: 配置并构建单个配置(VS Code 任务「配置并构建(...)」的内部实现)
.vscode\scripts\build_config.bat Release OFF
.vscode\scripts\build_config.bat Release ON
.vscode\scripts\build_config.bat Debug OFF
.vscode\scripts\build_config.bat Debug ON
:: 清理全部配置的构建输出(VS Code 任务「清理全部」的内部实现)
.vscode\scripts\clean_all.bat
脚本内部通过 msvc_env.bat 调用 vcvarsall.bat x64 并校验 cl.exe,无需手工进入 MSVC 环境。configure.bat 会在每个构建目录写入 .msvc_toolset 标记;若该目录是用其它工具集(例如旧的 MSVC 2013 缓存)配置的,脚本会先整体删除该目录再重新配置,避免新旧目标文件混链。用 set VS2022_DIR=...、set MSVC_TOOLSET_VERSION=...、set MSVC_TARGET_ARCH=x86 可覆盖默认的 VS 安装路径、工具集版本与目标架构。
数据记录调试功能由缓存变量 RDP_DATA_RECORD 控制(取值 AUTO/ON/OFF,缺省 AUTO:Debug 启用、Release 关闭)。显式取值时构建目录名随之不同(REC_OFF/REC_ON),因此关闭与开启记录模块的产物可以并存。启用时配置阶段打印 数据记录调试功能:启用(C++20 静态库 rdp_record + 内置 SQLite),并额外构建静态库 rdp_record(记录模块 + SQLite,链接进 DLL);关闭时打印 ...:关闭(不编译记录模块,RDP_RECORD 为空操作),记录模块源码完全不参与编译。开关语义、表结构约定与新增记录点配方见 docs/data_record_debug.md。
记录功能的性能参数集中在 parameters.h 的「数据记录性能参数」段(均以 #ifndef 保护,便于用 /DRDP_RECORD_... 编译选项临时覆盖做压测):入队队列上限 RDP_RECORD_QUEUE_CAP_BYTES(默认 64 MB)与 RDP_RECORD_QUEUE_MAX_BATCHES(默认 4096 批)、写线程批提交 RDP_RECORD_WRITE_BATCH_ROWS(默认 4096 行)/ RDP_RECORD_WRITE_MAX_WAIT_MS(默认 50 ms)、关联信息分块 RDP_RECORD_ASSO_CHUNK_ROWS(默认 131072 行)、SQLite 缓存/忙等待/WAL 开关(RDP_RECORD_SQLITE_CACHE_KB=8192、RDP_RECORD_SQLITE_BUSY_TIMEOUT_MS=2000、RDP_RECORD_SQLITE_WAL=1)、连续错误熔断阈值 RDP_RECORD_MAX_CONSECUTIVE_ERRORS(默认 10)与丢弃日志限频 RDP_RECORD_DROP_LOG_INTERVAL(默认 1024 行);默认值、语义与运行统计(rdp_record::Stats/stats())见 10.4 与 docs/data_record_debug.md 第 3 节。
日志的编译期级别由缓存变量 RDP_LOG_LEVEL 控制(取值 AUTO/TRACE/DEBUG/INFO/WARN/ERROR/CRITICAL/OFF,缺省 AUTO):AUTO 时 Debug 构建映射为 SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE、其余构建映射为 SPDLOG_LEVEL_INFO;显式取值映射到同名 SPDLOG_LEVEL_*;OFF 表示编译期关闭全部日志(低于 SPDLOG_ACTIVE_LEVEL 的 RDP_LOG_* 调用被编译期剔除、实参不求值,且 rdp_log::Init() 不再创建日志文件),等价于原 RDP_LOG_ENABLE 的关闭态。该级别以目标级 PUBLIC 编译定义同时提供给 data_process_class_dll 与 rdp_record 两个目标(两个目标必须保持同一 spdlog 配置)。修改方式为重新配置并构建,例如(在 MSVC 2022 x64 环境下):
cmake -S . -B build/Debug/REC_OFF -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug ^
-DRDP_DATA_RECORD=OFF -DRDP_LOG_LEVEL=WARN
cmake --build build/Debug/REC_OFF
也可在已有构建目录的 CMakeCache.txt 中修改 RDP_LOG_LEVEL 后重新配置;非法取值(不属上述 8 个值的字符串)在 configure 阶段直接报错。该级别不影响构建目录布局(仍按 4.2 的「构建类型 × 记录模式」划分)。
VS Code 任务(.vscode/tasks.json)只保留以下 5 个(原有任务已全部删除),可在「终端 → 运行任务」中选择,或按 Ctrl+Shift+B 运行默认构建任务「配置并构建(Release/REC_OFF)」:
| 任务 | 配置 |
|---|---|
| 清理全部 | 删除 build/Debug、build/Release 下所有配置的构建输出,并删除旧版 build/X256_PS、build/X256_MS 目录(build/output 留档不动) |
| 配置并构建(Release/REC_OFF) | Release + RDP_DATA_RECORD=OFF,单次配置并构建 |
| 配置并构建(Release/REC_ON) | Release + RDP_DATA_RECORD=ON,单次配置并构建 |
| 配置并构建(Debug/REC_OFF) | Debug + RDP_DATA_RECORD=OFF,单次配置并构建 |
| 配置并构建(Debug/REC_ON) | Debug + RDP_DATA_RECORD=ON,单次配置并构建 |
注意:
clean_all.bat/clean.bat会整体删除对应的配置目录(不再只做cmake --build --target clean),因此自行放置到build/<Debug|Release>/<REC_*>/bin/的 rdp_playback.exe、Qt5Core.dll、sqlite3.dll 与回放数据也会被删除,清理后需重新放置——这类手工工具与样例数据建议放在build/output/或仓库之外。settings.json、c_cpp_properties.json的默认compileCommands指向build/Debug/REC_ON/compile_commands.json(便于 IntelliSense 覆盖记录模块代码);未构建该配置时 C/C++ 插件回退到内置includePath/defines。若此前用 CMake Tools 选择过变体(旧版本曾含
scanMode变体、键名为ps/ms/X256_PS/X256_MS),升级后请重新执行一次「CMake: Select Variant」——旧的变体选择会持久化在 workspaceStorage 中,移除扫描体制变体后需要重新选择,构建目录才会落到build/<Debug|Release>/<REC_*>。
4.4 产物
| 产物 | 位置 |
|---|---|
| data_process_class_dll.dll(+ .pdb) | build/<Debug|Release>/<REC_*>/bin/ |
| 导入库 data_process_class_dll.lib | build/<Debug|Release>/<REC_*>/lib/ |
| 安装(cmake --install) | DLL/导入库 → bin、lib,公开头文件 → include |
| compile_commands.json | 各配置的构建目录根(供 VS Code IntelliSense 使用) |
| rdp_record.lib(仅记录功能启用时) | build/<Debug|Release>/<REC_*>/lib/(仅 REC_ON,或 Debug 下的 REC_AUTO 才生成)—— 记录模块静态库(含 SQLite),已链接进 DLL,无需随 DLL 分发 |
产物为 x64(AMD64) 目标。宿主程序必须是 64 位、且使用与本 DLL 同一版本头文件重新编译——MSVC 2013 → MSVC 2022 同时伴随 x86 → x64 的 ABI 变化,旧的 32 位宿主无法加载该 DLL。
本次参数配置改造后的体积/导出变化:Release REC_OFF 的
data_process_class_dll.dll为 331,776 字节(约 324 KB),较改造前约 178 KB 增大——原因是纯头文件的 toml++ 解析器随rdp_parameter_loader.cpp编入 DLL。机扫/相扫合并后的四种构建(0 warning、0 error):Release REC_OFF 331,776 字节、Release REC_ON 1,653,248 字节、Debug REC_OFF 1,718,272 字节、Debug REC_ON 4,694,528 字节。导出表(Release REC_OFF 共 31 个导出)新增parameters_reload(?parameters_reload@Data_process_class_dll@@UEAAHPEBD@Z),track_process_parameters_initial/track_process_parameters_modify与RadarPara相关符号已不存在,Data_Process_Factory::GetB/Destroy等其余接口不变。全局工作参数对象改造后体积略降:Release REC_OFF 331,264、Release REC_ON 1,652,736、Debug REC_OFF 1,715,200、Debug REC_ON 4,691,968 字节;导出表仍 31 项且全局对象rdp_parameter不导出(见 12)。日志组件改为 spdlog 后(工作区,2026-10-28 实测):内置 spdlog v1.17.0(含随库内置的 {fmt})以静态库编入 DLL,体积较上一轮增大——Release REC_OFF 537,088 字节、Release REC_ON 1,855,488 字节、Debug REC_OFF 3,317,760 字节、Debug REC_ON 5,867,520 字节;导出表仍 31 项、无新增第三方 DLL 依赖(spdlog 以静态库编入)。
仓库 build/<Debug|Release>/<REC_*>/bin/ 内原附带 rdp_playback.exe(回放测试工具,依赖 Qt5Core.dll、sqlite3.dll,配置样例 RadarConfigParam.ini,可回放 .db 记录的点迹数据验证 DLL 输出),该工具不在本仓库源码范围内、当前构建目录中亦不存在,需自行放置;由于 DLL 已改为 x64,配套的 rdp_playback.exe 必须是 x64 版本(同时其自带 Qt5Core.dll / sqlite3.dll 也需为 x64),32 位版本无法加载新版 DLL。
4.5 编译警告处理
- 源码文件统一使用 带 BOM 的 UTF-8 编码保存;
CMakeLists.txt对 MSVC 统一追加/utf-8,中文字符串与注释不再受系统代码页影响(消除 C4819),BOM 仅作为编辑器/旧工具的兼容保留。 CMakeLists.txt显式指定/W3:CMake 3.15(策略 CMP0092)起不再把/W3放进CMAKE_CXX_FLAGS,本工程此前一直以/W3构建,故显式恢复以保持警告级别不变。- 修复了
/W3下全部 C4819(源文件字符集)、C4018(signed/unsigned 不匹配)、C4244(类型转换可能丢失数据)警告:循环变量按需改为size_t,窄化转换改为static_cast显式转换,不改变原有计算逻辑。 - MSVC 2022 在
/W3下新增报出的 C4267(size_t→int窄化)共 17 处已按同一约定修复(track_asso.cpp、track_asso_tas.cpp、track_init.cpp、track_init_direct_tracking.cpp、tas_ctrl.cpp中改为static_cast<int>(...)),同样不改变计算逻辑。 - 当前 4 种显式配置(Release / Debug × REC_OFF / REC_ON)均以 0 warning、0 error 通过编译(机扫/相扫已合并为同一份构建,不再有 PS/MS 维度;REC_AUTO 与「Debug=ON / Release=OFF」等价,未重复单独验证)。
- cl.exe 的诊断信息为中文(跟随 VS 安装语言,
VSLANG=1033对 VS2022 的 cl.exe 无效),构建日志中偶见注意: 包含文件:行泄漏,属 CMake 依赖扫描的显示噪声,头文件依赖(CMakeFiles/*.dir/**/*.obj.d)记录完整,不影响增量编译。 - 第三方库告警例外(spdlog 与记录功能第三方依赖):按上游原样内置的第三方源码不在本项目
/W3零告警约定之内,处理方式统一为「第三方源码降级、本项目包含点隔离」——spdlog(third_party/spdlog,始终参与构建)的src/*.cpp以目标级/w编译,本项目源码包含其头文件处(rdp_log.h)用#pragma warning(push, 0)/(pop)包裹;数据记录模块的第三方依赖按上游原样内置在third_party/ormpp(保留上游字节,含换行符,不转 BOM/编码),其中third_party/ormpp/thirdparty/sqlite3/sqlite3.c以源文件级/w单独编译,data_process_class_dll/rdp_record.cpp用#pragma warning(push, 0)/(pop)包裹第三方头;参数加载器使用的 toml++ 单头文件(third_party/toml/toml.hpp)同样在rdp_parameter_loader.cpp中以#pragma warning(push, 0)/(pop)包裹。除此之外本工程源码仍按上一条的/W3零告警标准编译(Release/Debug × REC_OFF/REC_ON 四种配置实测 0 warning、0 error)。
4.6 编译器升级说明(MSVC 2013 → MSVC 2022)
| 项目 | 升级前 | 升级后 |
|---|---|---|
| 编译器 | Microsoft Visual C++ 2013(VS 12.0,_MSC_VER 1800) |
Microsoft Visual C++ 2022(v143,_MSC_VER 1944,cl 19.44.35228) |
| 目标架构 | x86(32 位) | x64(AMD64) |
| C++ 标准 | C++11(编译器默认) | C++17(/std:c++17) |
| CMake 最低版本 | 3.10 | 3.21 |
| 新增/调整编译选项 | — | /utf-8(改为无条件)、/Zc:__cplusplus、/W3(显式恢复) |
/Zc:__cplusplus:MSVC 默认把__cplusplus报为199711L,加该选项后正确报201703L,使依赖__cplusplus判断的第三方库(内置 Eigen 3.3.7)走标准分支。已验证 Eigen 3.3.7 在此组合下编译通过。/Zc:strictStrings仍仅在 Release 启用:原限制(MSVC 2013 Debug 运行库与该选项冲突)已不存在,此处保持与原 qmake 工程一致的行为。- 旧构建目录需清理:MSVC 2013 的 CMake 缓存与目标文件不能跨编译器复用(nmake 会因目标文件时间戳较新而跳过重编译,导致新旧目标文件混链)。
configure.bat已内置自动清理:构建目录中无.msvc_toolset标记或标记与当前工具集不一致时,先删除整个构建目录再配置。 - 源码改动:仅补齐 17 处
static_cast<int>(...)显式窄化转换以消除 MSVC 2022 新增的 C4267 告警,未改动任何计算逻辑、接口与结构体布局;DLL 导出符号与升级前一致(差异仅为 x86 → x64 的名称修饰,如QAE→QEAA、PAV→PEAV)。 - 兼容性风险点已核查:C++17 移除的
std::auto_ptr、std::random_shuffle、std::unary_function/binary_function、std::binder1st/2nd等在本工程源码与内置 Eigen 3.3.7 中均未被使用(Eigen 的相应特化本身带有__cplusplus/EIGEN_COMP_MSVC版本保护)。
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>>
+const char* version_info
+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
+parameters_reload(const char*) 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
-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
全局工作参数对象(全局工作参数对象改造后):工作参数不再是
Data_Process的成员、也不再通过函数形参逐层传递,而是struct.h中extern RDP_parameter rdp_parameter;声明的全局对象,由data_process.cpp定义并零初始化(当前 L14)、Data_Process::parameters_reload()在配置文件完整校验通过后整体赋值(失败不写入、保持原值)。所有处理模块(dot_coh/kalman/track_asso/track_init/track_die/tas_ctrl/track_index_mangement等)直接以rdp_parameter.<field>访问该对象,函数签名不再包含该参数。全局对象为 DLL 内单实例可变状态,处理期间只读;parameters_reload()与处理调用之间非线程安全,宿主应按单线程接口使用、配置重载与处理互斥(与 BUG-03 一致,见 11.2)。
5.2 模块职责
| 类 / 文件 | 职责 |
|---|---|
| Data_Process(data_process.cpp) | 对外接口实现与流程编排:输入缓存、按 model 分发 TWS/TAS 流水线、参数加载(parameters_reload:TOML → 全局对象 rdp_parameter,定义在 data_process.cpp)、航迹清空/删除、手动转/停 TAS、手动标记/取消重点目标(primary_target_add/cancel)、波束控制转发 |
| rdp_parameter_loader(rdp_parameter_loader.h/.cpp) | 参数加载器(内部模块):解析 TOML 并严格校验 11 个配置段/键集合/类型/取值范围/屏蔽区数组长度,全部通过后一次性写入全局对象 rdp_parameter;失败返回 -1 并给出首条原因、不改变入参(见 10.1) |
| Dot_Coh | TWS 点迹凝聚:两帧滑窗合并凝聚(dot_coh_process_buff) |
| Dot_Coh_TAS | TAS 点迹凝聚(单帧,距离/方位/速度三维门限) |
| Track_Asso | TWS 点航关联 + IMM 滤波:模型交互 → 门限筛选(NN)→ 各模型 EKF → 概率更新 → 模型输出(只输出 Track_Update_Flag==1 的航迹);未关联航迹按上限外推;高度平滑;按滤波速度矢量写 Flag_Direction;ΔT≤0(乱序/重复时间戳)的候选取出后不更新滤波、不刷新航迹,仅消费该点迹 |
| Track_Asso_Tas | TAS 航迹关联(只处理指定批号 tas_track_idx,门限与 TWS 略有差异;输出同样受 Track_Update_Flag 门控,外推上限 extrapolate_max_tas 的判定方向与 TWS 相反) |
| Track_Init | 逻辑法航迹起始,每圈顺序固定:点-临时航迹关联(延长 ≥2 点临时航迹)→ 点-航迹头关联(两点起始)→ 剩余点转新航迹头 → 长度达标者起批(三点卡尔曼初始化);另含起批屏蔽区判断与临时航迹消亡 |
| Track_Die / Track_Die_Tas | 可靠航迹消亡:TWS 普通航迹按航迹质量(V1.5.8:Quality < 0.3)、TWS 重点航迹按未关联轮数(10)、TAS 按未关联轮数(相扫 20、机扫 96),或手动删除标志置位时输出消亡批号并删除 |
| TAS_Ctrl | TAS 波束控制:手动目标入队(tas_target_add)、失效目标出队(tas_target_del)、跟踪波束预测输出(tas_beam_output:数据率门控 + 队内选择最早 CPI 目标)、调度时刻记录(last_track_time) |
| Track_Ind_Mangement | 航迹号 1~track_index_max(默认 500)的顺序分配与回绕复用 |
| kalman | 两点/三点滤波初始化、线性卡尔曼预测/滤波、EKF(3 维量测含多普勒)、马氏统计距离 d、盲速 Bind_speed |
| coor_trans | 极坐标 ↔ 直角坐标转换 |
| rdp_log(rdp_log.h/.cpp) | 日志输出(基于内置 spdlog v1.17.0):rdp_log::Init() 创建 RDP_LOG_DIR(.\rdp_logs\)下 rdp_YYYYMMDD_HHMMSS.log(每次 GetB() 一个文件,同秒冲突追加 _1~_999),默认 logger 同时输出到标准输出与文件,行格式 [YYYY-MM-DD HH:MM:SS.mmm] [级别] [文件名:行号] 内容(所有级别逐条 flush);rdp_log::Shutdown() flush 并关闭。由 GetB()/Destroy() 调用;提供 RDP_LOG_TRACE / RDP_LOG_DEBUG / RDP_LOG_INFO / RDP_LOG_WARN / RDP_LOG_ERROR / RDP_LOG_CRITICAL 宏(RDP_LOG_ERR 为 ERROR 别名,fmt 风格格式化),级别由 CMake 选项 RDP_LOG_LEVEL → SPDLOG_ACTIVE_LEVEL 编译期过滤 |
| rdp_record(rdp_record.h/.cpp、rdp_record_entity.h) | 数据记录调试(可选编译):由 CMake 选项 RDP_DATA_RECORD 决定是否参与编译。开启时 GetB() 建库并启动独立写线程,12 个记录点只做「帧/圈内收集源结构体 → 一次入队」;写线程从有界队列(默认 64 MB / 4096 批,满则整批丢弃并计入 stats().dropped_rows,不阻塞处理线程)取批,构造记录实体(数组转文本)并按表以批量事务写入 SQLite(达到 4096 行或等待 50 ms 提交;SQLite 使用 WAL + synchronous=OFF + 8 MB 缓存,建表后去掉 AUTOINCREMENT);写失败每表只提示一次并永久跳过该表、连续 10 次错误熔断;Shutdown() 依次停止入队、排空、wal_checkpoint(TRUNCATE)、关库并打印统计(rdp_record::Stats/stats() 可随时读取,Destroy()→GetB() 可重连重新建库)。当前 6 个实体定义、6 张在用表:RdpRecPoint(输入点迹,TWS/TAS 共用)、RdpRecPointCohesionTWS、RdpRecPointCohesionTAS、RdpRecTempTrack(含 quality)、RdpRecTrustTrack(含 Quality/Unupdated_time/Point_sum/Valid_point_sum,质量字段由 1ffb287 加入)、RdpRecAssoInfo(后两者 TWS 与 TAS 两通道均写入,关联信息以 tas_flag 区分来源),并有数组转字符串辅助 arrayToString()(用于把 X/P 等状态数组存为文本列);关闭(AUTO 的 Release 结果)时记录模块不参与编译、所有记录宏为空操作,旧 RDP_RECORD/RDP_RECORD_BATCH 仅作为遗留同步接口保留(会阻塞调用线程) |
| 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 批号、点迹类型、归一化幅度 amp_asv(dB)、速度维 FFT 点数 prn_fftn、十字星数据 speed_dim[129]/range_dim[8] |
| Track | 输出航迹 | 位置/速度、极坐标量、航迹质量 Quality(0~100,V1.5.8 新增;插在 Amplitude 之后,宿主需同步重编译)、航迹号、更新点数、方向标志 Flag_Direction(仅关联/外推输出路径赋值:按滤波速度矢量判定,1 靠近 / 0 远离,见 9.6;起批输出不写该字段)、实虚点标志 Flag_Point、一步预测、跟踪模式、航向角 Direction_Angle、目标类型、关联点信息、归一化幅度 amp_asv_point / 速度维 FFT 点数 prn_fftn_point、航迹时间(s)/GNSS、SNR/RCS、十字星数据透传 |
| TrackingBeam | TAS 跟踪波束指令 | open_flag、type、Range、Azi、Elev、TAS_track_index |
| Target_direct_tracking | 引导跟踪信息 | 批号、距离/方位/俯仰、开关(接口未启用) |
工作参数结构体
RDP_parameter及全局对象rdp_parameter定义在内部头struct.h(对象本身定义于data_process.cpp),不在公开头中导出:宿主不再构造/下发参数结构体,改为通过parameters_reload(配置文件路径)把 TOML 配置加载进 DLL(参数含义见 10)。
6.2 内部结构体(struct.h)
| 结构体 | 用途 | 关键字段 |
|---|---|---|
| RDP_parameter | 工作参数(唯一来源,全局对象 rdp_parameter) |
按注释分组:雷达工作参数(radar_work_mode/scan_mode/freq_0_GHz/radar_height/radar_system_delay/data_rate_tws/data_rate_tas/data_rate_track_only)、点迹凝聚参数、航迹关联参数(sigma_*/associate_threshold/extrapolate_max(_tas)/height_smooth_win)、航迹起始参数(track_init_*)、航迹消亡参数(track_die_*)、航迹质量参数(track_quality_*)、航迹批号(track_index_max)、波束调度(default_track_beam_type/tas_track_num_max)、singer 模型参数(model_*_Q_*)、两个屏蔽区(各 30 组距离/方位区间);与 TOML 配置段/键一一对应(见 10.2)。struct.h 中另有 extern RDP_parameter rdp_parameter; 全局对象声明(定义在 data_process.cpp,模块直接访问) |
| PointRecv | 内部点迹 | 距离/方位(弧度)/速度/幅度/高度/SNR/RCS/CPI/GNSS 时间、点迹号 point_id / 帧号 frame_id / 圈号 circle_id(记录链路用,c3c7e66 新增)、使用标志、波位/PRF/频点、跟踪模式、点迹区号、归一化幅度 amp_asv_point / 速度维 FFT 点数 prn_fftn_point、十字星数据 |
| Trust_Track | 可靠航迹(IMM 全状态) | 航迹号、标识字段 track_id / point_id / circle_id(b227ae1 新增,起批时取临时航迹末点的 temp_track_id/point_id/circle_id,关联成功时刷新为被关联点迹的 ID)、高度、极坐标量快照 Range / Azimuth / Elevation / Velocity(b227ae1 新增,仅在本圈有输出时回填)、航迹质量相关状态(V1.5.8 新增)Quality(0~1)/ Point_sum(累计点数,含外推)/ Valid_point_sum(累计实点关联次数)/ Unupdated_time(连续未关联实点的累计毫秒)、航迹时间 T_track(CPI 时间)/ GNSS_time、更新标志 Track_Update_Flag(输出门控:仅置 1 的航迹当圈被输出,输出后清零)、外推轮数 Extrapolate_round、实虚点标志、手动删除/手动 TAS/重点目标(primary_target_flag,决定消亡走质量还是 10 圈轮数)标志、关联点数、高度平滑缓冲 Hight_smooth、关联点信息、归一化幅度 amp_asv_point / 速度维 FFT 点数 prn_fftn_point、融合状态 X[6]/P[6][6]、三个子模型 X1/X2/X3、P1/P2/P3、模型概率 u[3] |
| Temp_track | 临时航迹(航迹起始阶段) | 4 维状态 X[4]/P[4][4]、极坐标点信息(r/azi/vr/height/SNR/RCS/amplitude)、航迹质量 quality(0~1,V1.5.8 新增,起批时带给 Trust_Track)、时间戳 CPI_time / GNSS_time、buff_round(已缓存圈数)、标识字段 temp_track_id / point_id / circle_id、区号 temp_track_section_idx、俯仰波位号 pitch_num、关联标志(c3c7e66 起字段统一更名,如原 snr/Amp/T) |
| Asso_Info | 点航关联候选(track_asso.cpp / track_asso_tas.cpp 共用) | point_id / track_id / circle_id、三模型统计距离 d1/d2/d3 与最小值 d_min、点迹/航迹下标、delta_T/delta_h/R/VT、来源标志 tas_flag(1 TAS / 0 TWS,5cb67cc 新增)、门限判定结果 thd_d/thd_h/thd_r、是否被最近邻取中 min_d_flag(b227ae1 提升到 struct.h;TAS 侧 5cb67cc 起改用同一结构) |
| Tracking_Target | TAS 队列元素 | 批号 Index、空标志 empty_flag、最近波束输出时间 last_track_time |
| Direct_Tracking_Target | 引导跟踪目标 | ID、方位/俯仰/距离、空标志 |
说明:Trust_Track 的状态布局为 [x, vx, ax, y, vy, ay],x/y 两轴解耦,每轴为「位置-速度-加速度」。
⚠ 结构体布局变更:
DataRev新增amp_asv/prn_fftn,Track新增amp_asv_point/prn_fftn_point;V1.5.8 起Track又在Amplitude之后插入Quality(之后字段整体后移),内部Trust_Track/Temp_track新增质量相关字段。宿主与 DLL 必须使用同一版本头文件并同步重新编译,否则字段错位。对外结构体中DataRev布局自 1.5.5 起未变化;原对外RadarPara已删除,RDP_parameter仅在内部使用(宿主无需包含其定义)。
7. 外部接口与调用流程
7.1 接口一览
| 接口 | 返回值 | 说明 |
|---|---|---|
| Data_Process_Factory::GetB() | 实例指针 | 获取单例(首次调用时创建,并写入 version_info) |
| Data_Process_Factory::Destroy() | — | 销毁实例并将指针置空 |
| version_info(基类公开成员) | const char* |
DLL 版本字符串,由 GetB() 赋值为 VERSION_STRING(V1.5.9.GENERIC——机扫/相扫已合并,无体制后缀);只读使用,不要释放(b227ae1) |
| parameters_reload(const char* path) | 0 成功 / -1 失败 | 加载全部工作参数:解析 TOML 配置文件并校验,成功后整体写入全局对象 rdp_parameter(零初始化,失败时保持原值)并打印原因。建议 GetB() 后立即调用一次,重连/换配置时再次调用即可热重载;重载应与处理调用互斥(与 BUG-03 线程模型一致,见 10.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 移除) |
| primary_target_add(track_index) | 0 | 手动将指定批号标为重点目标(置 primary_target_flag=1,消亡轮数放宽到 10 圈;批号不存在时不报错、无副作用) |
| primary_target_cancel(track_index) | 0 | 取消指定批号的重点目标标记(置 primary_target_flag=0,恢复普通航迹的消亡判据——V1.5.8 起为 Quality < 0.3) |
| tracking_point(azimuth) | 0 | 手动打跟踪波束——未实现(保留空实现) |
| direct_tracking_process(...) | 0 | 引导跟踪——未实现(保留空实现) |
输出语义(50e0b5c 起):
track_process(model=1/3)只把本圈有更新的航迹写入Trust_Track_Output(关联到实点、外推成功,或 TAS 指定批号被更新),行数由Trust_track_num_Output给出;未更新(含外推超限)的航迹当圈不出现在输出中,宿主不能据输出行数推断航迹总数。输出数组内容由 DLL 覆盖写入指定行,其余行保持宿主原值(DLL 不清零整块数组)。
日志输出为 DLL 内部功能(不对外导出):首次
GetB()创建实例时自动初始化(rdp_log::Init()把日志同时输出到标准输出与.\rdp_logs\下按日期+时间命名的日志文件,见 4.3、10.4),Destroy()销毁实例时 flush 并关闭日志文件;日志无运行期宏开关,级别由 CMake 选项RDP_LOG_LEVEL在编译期控制(OFF 时编译期关闭全部日志且不创建日志文件)。
数据记录同样为 DLL 内部功能(不对外导出):记录功能启用时,
data_preprocess在帧内收集输入点迹(判圈 return 之前入队)、dot_coh/dot_coh_tas收集凝聚后点迹、track_init收集临时航迹、track_asso/track_asso_tas收集可靠航迹与关联信息(关联信息按RDP_RECORD_ASSO_CHUNK_ROWS分块、函数返回前 flush),收集完成后各调用一次异步入队宏;实体构造与写库由记录写线程异步完成,落盘为.\rdp_records\rdp_record_YYYYMMDD_HHMMSS.db的 6 张在用表(表清单与字段见 docs/data_record_debug.md 第 7 节)。处理线程不会被记录 I/O 阻塞,但队列满时记录会整批丢弃(stats().dropped_rows可查),进程异常退出时队列尾部与 WAL 尾部可能丢失。
7.2 data_preprocess 返回值的含义
| 返回值 | 含义 | 触发条件 |
|---|---|---|
| 0 | 无效数据 | point_type 既非 0 也非 1 |
| 1 | TWS 满一圈,执行航迹处理 | point_type==0 且判圈条件成立:scan_mode==0(相扫)时当前帧方位波位号 ≤ 上一帧波位号 last_beam_num;scan_mode==1(机扫)时当前帧方位波位号 == 0 |
| 2 | TWS 未满一圈,继续蓄数据 | point_type==0 且上述判圈条件不成立;调用 track_process(model=2) 做滑窗凝聚 |
| 3 | TAS 处理 | point_type==1;同时记录 TAS_track_idx 与最新时间戳 |
判圈由配置项
scan_mode运行时选择:data_process.cpp不再使用#ifdef PHASE_SCANNING编译期分支,而是按rdp_parameter.scan_mode选择两条判据——scan_mode==0(相扫)走「波位号不变大(当前 ≤ 上一帧)即为新一圈」(last_beam_num参与判断,track_clear_all()复位为 INT_MAX,故相扫首帧即返回 1);scan_mode==1(机扫)走7d5a56f的「方位波位号 == 0」判据(机扫转台反转时波位号会变小但并未扫完一圈,用波位号比较会误判;此时last_beam_num仍被更新但不参与判断)。两种模式下last_beam_num每帧都会更新,仅判满圈时circle_id++并返回 1。因此同一份 DLL 的判圈行为只取决于加载的配置(构建已不区分扫描体制),调用方需保证scan_mode与实际波位号序列/部署体制一致:相扫要求每圈波位号先增后回到起点、机扫要求每圈均出现 0。
7.3 典型调用序列
flowchart TD
A["Data_Process_Factory::GetB()"] --> B["parameters_reload(参数配置文件路径)"]
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["判圈成立(由配置 scan_mode 选择:0 相扫: 波位号 ≤ 上一帧 / 1 机扫: 波位号 == 0)→ 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 供下一圈的关联/起批使用,当前帧未凝聚点作为下一次的缓存——即「凝聚在前、关联在后、缓存一帧」的两帧滑窗结构。
输出环节(track_asso_process() 末尾)只写 Track_Update_Flag==1 的航迹:关联到实点、或外推成功(Extrapolate_round <= extrapolate_max,样例 3)时置 1;外推超限的航迹不再推进位置与航迹时间,当圈也不输出,直到重新关联上实点才恢复(详见 9.9)。
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 目标 + 预测波束输出"]
TAS 输出同样受 Track_Update_Flag 门控:只有 Track_Index == tas_track_idx 且本圈有更新(关联到实点、或外推成功)时才向 Trust_Track_Output 写一行(point_type=1)。TAS 外推上限为配置项 extrapolate_max_tas(样例配置为相扫 5,机扫需配 48),判定方向与 TWS 相反(Extrapolate_round >= 上限 时才外推并输出),详见 9.9 与 11.2。
8.3 航迹起始流程(逻辑法)
flowchart TD
A["本圈未关联点迹(point_recv → point_process)"] --> A1["临时航迹所有点的 buff_round +1"]
A1 --> B["① 点-临时航迹关联(≥2 点临时航迹、末点 buff_round≥2):EKF 统计距离波门 d²≤64、折角<60°、径向速度同号、|Δr|≥5m → 复制原航迹并追加新点"]
B --> C["② 点-航迹头关联(1 点航迹头、buff_round≥2):track_init_velocity_min·ΔT ≤ dis ≤ track_init_velocity_max·ΔT、径向速度同号、dis ≥ |vr_point|·ΔT 且 dis ≥ |v_track_head|·ΔT → 两点卡尔曼初始化(航迹头 + 新点 → 2 点临时航迹)"]
C --> D["③ 删除 Use_Flag==1 的点迹,剩余点全部转为新航迹头 Temp_track(1 点、buff_round=1)"]
D --> E{"④ 长度 ≥ track_init_point_num_min(3~9) 且 ≤10 且不在起批屏蔽区 ?"}
E -- 是 --> F["重复航迹去重(保留末点 d 更小者)→ 三点卡尔曼初始化"]
F --> G["转可靠航迹:分配航迹号 1~track_index_max(默认 500),IMM 三模型同状态初始化 u=1/3"]
G --> H["输出前 track_init_point_num_min 个历史点 Trust_Track_Output[i][0..L-1]"]
E -- 否 --> I["留在临时航迹表,下一圈继续关联"]
H --> J["⑤ 临时航迹消亡:末点 buff_round>2 或 长度≥10"]
I --> J
顺序说明:
track_init_process_logic()中四步的先后顺序固定、不可颠倒——先延长已有临时航迹,再与航迹头配对,两步都走完才生成新航迹头,最后才把长度达标的临时航迹转为可靠航迹(因此当圈新建的 2 点临时航迹不可能当圈起批,长度刚达标的临时航迹则可以当圈起批);临时航迹消亡在第 ⑤ 步、即全部起始动作之后执行。第 ① ② 步互不排斥:两者都只把命中的点迹标记
Use_Flag=1,航迹头关联并不检查临时航迹关联留下的标记,因此同一点迹可能既延长一条临时航迹、又开启一条新的两点临时航迹;两类关联也都不做一对一分配(同一条临时航迹可被本圈多个点延长,同一个航迹头也可与本圈多个点配对)。只有走完两步后才统一删除Use_Flag==1的点迹,其余点迹成为新航迹头。
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_range / sigma_azimuth(默认 10 m / 0.02 rad,见 10.2)。
9.2 点迹凝聚
对同一 CPI(TWS 为相邻两 CPI 合并后)内所有点迹两两比较,门限满足且幅度较小者被标记删除(Use_Flag=1):
| 模式 | 距离门限 | 方位门限(环绕最小角差) | 速度门限 |
|---|---|---|---|
| radar_work_mode==0(近程) | ≤ 80 m(point_cohesion_range) | ≤ 6°(point_cohesion_azimuth) | ≤ 2 m/s(point_cohesion_velocity) |
| radar_work_mode!=0(中/远程) | ≤ 80 m | ≤ 6° | 不约束 |
方位差按环绕角处理:
\Delta\theta = \min\left(|\theta_0-\theta_1|,\ 2\pi-|\theta_0-\theta_1|\right)
凝聚后删除量程外的点(下限/上限由配置项 point_cohesion_range_min / point_cohesion_range_max 给定,默认 100 m / 100000 m)。TWS 的 dot_coh_process_buff 将上一帧缓存点标记区号 1、当前帧点标记区号 2,合并凝聚后:区号 1 的点输出到 point_recv(进入关联),区号 2 的点存入 data_input_buff 供下一帧凝聚——形成两帧滑窗。
9.3 航迹起始(逻辑法)
每圈(model=1)在 track_init_process_logic() 中按固定顺序执行下列四步,顺序不可颠倒:
- 点-临时航迹关联:本圈未关联点迹优先延长已有的 ≥2 点临时航迹(判据见 (1));
- 点-航迹头关联:随后点迹与 1 点航迹头配对,产生新的 2 点临时航迹(判据见 (2));
- 剩余点迹转航迹头:前两步只把命中的点迹标记为已使用(
Use_Flag=1),两步都做完后才统一删除这些点迹,其余点迹逐条转为新航迹头(见 (3)); - 转可靠航迹(起批):长度达标的临时航迹经三点卡尔曼初始化转为可靠航迹(见 (4));起批动作完成后才消亡不满足条件的临时航迹。
两点补充:① 第 1、2 步互不排斥——航迹头关联不检查临时航迹关联留下的
Use_Flag,因此同一点迹可能既延长一条临时航迹、又开启一条新的两点临时航迹;两类关联也都不做一对一分配(同一条临时航迹可被本圈多个点延长,同一个航迹头也可与本圈多个点配对)。② 每圈入口先把所有临时航迹所有点的buff_round加 1 再做关联,新建点(航迹头或被关联上的新点)buff_round = 1,因此当圈新建的 2 点临时航迹要到下一圈末点buff_round变为 2 之后才参与第 1 步。
(1) 点-临时航迹关联(延长 ≥2 点临时航迹)
对 ≥ 2 点的临时航迹(末点 buff_round ≥ 2),用航迹末点状态做 EKF 一步预测,计算三维(距离-方位-径向速度)马氏统计距离 d(见 9.5.3),并要求 |r_point − r_temp| ≥ 5 m,同时满足:
d^2 \le track\_init\_threshold^2 = 64,\qquad
\alpha < track\_init\_angle = 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}
关联成功后复制原临时航迹并追加该点迹,新航迹的 4 维状态用最近两点做两点卡尔曼初始化(见 9.5.2)重新得到。同一处(V1.5.8 起)随即重算该临时航迹的航迹质量:长度恰为 3 时对三点写入同一质量值,长度 >3 时只更新末点(指数平滑),详见 9.11。
(2) 点-航迹头关联(两点起始)
对单点航迹头(buff_round ≥ 2),量测点需同时满足以下四个条件(7d5a56f 起的判据):
V_{min}\Delta T \le d_{12} \le V_{max}\Delta T,\qquad
v_{r,point}\cdot v_{r,head}>0,\qquad
d_{12} \ge \left|v_{r,point}\right|\Delta T,\qquad
d_{12} \ge \left|v_{r,head}\right|\Delta T
其中 d12 为两点间平面距离,ΔT 为时间差(秒),V_min/V_max 取配置项 track_init_velocity_min / track_init_velocity_max(默认 1 / 50 m/s;代码中 vmax 的近程/中远程分支取值相同)。后两条为多普勒-几何一致性约束:切向飞行目标在 ΔT 内的实际位移远小于 |vr|·ΔT,据此被排除,用于限制切向高速点迹起批出的短航迹。
历史行为(已注释停用):原先按扫描体制与距离分段收紧速度门限——近程 r≥1000 用全速、r<1000 用半速;中远程 r≥2000 用全速、r<2000 取下限 1/2·最小速度·ΔT / 上限 1/3·最大速度·ΔT。
关联成功用 两点卡尔曼初始化(见 9.5.2)生成 2 点临时航迹:第 1 点为原航迹头,第 2 点为该点迹。
(3) 剩余点迹转航迹头
第 (1)(2) 步结束后统一删除 Use_Flag==1 的点迹;剩余点迹回写 point_recv(随后被整体清空),并逐条新建 1 点临时航迹(航迹头):位置直接取点迹的直角坐标、速度置 0、buff_round = 1。新航迹头当圈不再参与任何关联,只能从下一圈开始按第 (2) 步配对。
(4) 转可靠航迹(起批)
临时航迹长度 N 满足 track_init_point_num_min ≤ N ≤ 10(起批点数由配置项 track_init_point_num_min 给定,默认 3,加载器校验 3~9)、不在起批屏蔽区内(屏蔽区为距离-方位矩形区域,最多 30 个)且航迹质量达到该长度对应的门限(V1.5.8 新增,见 9.11)时进入起批队列;同源(前三点时间/距离相同)的重复航迹只保留 d 较小者(比较下标 track_init_point_num_min-1 处的 d)。起批时令 L = track_init_point_num_min,用航迹中下标 L-3、L-2、L-1 的三个点做 三点卡尔曼初始化 得到 6 维状态(航迹长度恰为 L 时即最近三点),构造 Trust_Track:
- 三个 IMM 子模型用同一状态/协方差初始化,模型概率 u = [1/3, 1/3, 1/3];
- 质量状态初始化:
Quality= 临时航迹末点质量,Point_sum=Valid_point_sum= L,Unupdated_time= 0; - 分配航迹号(1~500,见 9.8);
- 输出仅写入前 L 个历史点(
Trust_Track_Output[i][0..L-1],Point_Sum = L),每点写入Quality = 该点临时航迹质量 × 100;航迹长度大于 L 时其余点不输出; - 起批输出不写
Flag_Direction、x_Predict/y_Predict/z_Predict、Range_Predict/Azimuth_Predict/Elevation_Predict、Target_Type、prf_point、v_z等字段,且 DLL 不清零输出数组,宿主读到的是自身缓存的旧值(详见 docs/track_init_readme.md 第 14 节)。
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 = model_1_Q_slow(恒定) | 同左 |
| 模型 2(中机动) | v≤5: slow/20;5<v≤30: slow;v>30: fast | v≤5: slow/20;50<v≤100: 10·fast;其余: fast |
| 模型 3(高机动) | v≤5: slow/20;5<v≤20: slow;20<v≤50: fast;50<v≤100: 2·fast;v>100: 10·fast | v≤5: slow/20;50<v≤100: 10·fast;其余: fast |
注意:
model_1_Q_fast配置项当前未参与计算(模型 1 只用 slow);各档系数以源码为准,对应配置文件[singer_model]段(见 10.2)。
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}=9.2+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,波门按航迹距离分段(associate_threshold = 4,配置项 [track_associate] associate_threshold,判据写作 d*d < associate_threshold*associate_threshold,而 d 本身已是马氏距离平方,故下表的等价门限为 d < 4):
| 航迹距离 | 模型 1/2 门限 | 模型 3 门限 |
|---|---|---|
| r_track ≤ 500 m | d_i² < 16 | d_3² < 16/1000(≈关闭) |
| 500 < r_track < 1000 m | d_i² < 16 | d_3² < 16/100(收紧) |
| r_track ≥ 1000 m | d_i² < 16 | d_3² < 16 |
关联判据在 model_filter() 中拆为三个布尔量,三者同时通过才记为候选:thd_d(上表统计距离门限)、thd_h(高度门限)、thd_r(距离门限)。
- 高度门限 thd_h(e0bf227 起生效):以 |h_track − h_point| 与航迹距离分段比较,取值与 TAS 通道一致——≤ 1000 m 时 ≤ 150 m、1000
2000 m 时 ≤ 200 m、20003000 m 时 ≤ 250 m、3000~5000 m 时 ≤ 300 m、> 5000 m 时不约束。该项原为注释停用的代码块(等价于恒通过),现正式参与关联判定,用于压制俯仰测量跳变引起的错误关联; - 俯仰门限 d_p:分距离段 7°/5°/10° 的逻辑仍在源码中注释停用,不参与判定(其作用已由高度门限覆盖);
- 距离门限 thd_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/十字星数据 → 高度平滑。
靠近/远离方向标志 Flag_Direction(fc49707 起、42b598e 调整,TWS/TAS 同步):不再使用实测径向速度(原 Flag_Direction = vr_point > 0 ? 1 : 0,实测多普勒在速度模糊时符号可能取反),改为按航迹 IMM 融合状态的速度矢量与位置矢量判定:
D=\operatorname{atan2}(X[4],X[1])\ \text{(速度方向角)},\qquad
Flag\_Direction=\begin{cases}1,& \arccos\!\left(\dfrac{-x\cos D-y\sin D}{r}\right)<\dfrac{\pi}{2}\\[2mm]0,&\text{否则}\end{cases}
其中 x、y 为经 radar_system_delay 补偿后的航迹位置,r = √(x²+y²),Direction_Angle 输出字段即 D 的度数形式。该判据等价于「目标速度方向与『雷达→目标』位置方向的夹角大于 90°」,即滤波速度矢量的径向分量指向雷达(径向接近)时判为靠近(1),否则远离(0);中间版本曾按合速度归一化并把门限取为 π/4(45° 锥角),42b598e 去掉归一化并放宽到 π/2。外推(虚点)输出同样按该判据写 Flag_Direction。
Δ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_asso_process()在关联结束后会把Use_Flag==1的点迹从point_recv中删除(track_init 入口也会再剔除一次Use_Flag==1的点),因此该点迹不会进入航迹起始、不会再参与起批,避免生成虚假 TWS 航迹。
历史行为:604f158 之前,ΔT ≤ 0 的候选在选取时被直接剔除并
continue,点迹保持未被使用,可能被后续用于航迹起始。该分支原有的RDP_LOG告警日志现已注释停用(注释中的旧宏已按 spdlog 级别改写为RDP_LOG_DEBUG(...)形式);TAS 关联(track_asso_tas.cpp,见下)中同类告警日志仍启用,现为RDP_LOG_WARN(...)。b227ae1起该分支的写法由if (delta_T <= 0) {空} else {...}调整为if (delta_T > 0) {...},判定结果与滤波行为不变;同一提交为每个候选补充了min_d_flag(被最近邻取中时置 1)并配合RdpRecAssoInfo记录全部候选与取中结果(见 5.2 的 rdp_record 行)。
TAS(track_asso_tas.cpp)
只处理 tas_track_idx 指定的航迹,只有统计距离与高度两个门限,两者同时通过(thd_d && thd_h)才记为候选:
thd\_d:\ d_i^2 < associate\_threshold^2 = 16 \qquad\text{且}\qquad thd\_h:\ \text{高度门限通过}
高度门限按航迹距离分段:≤1000 m:|h_t−h_p| ≤ 150 m;10002000 m:≤ 200 m;20003000 m:≤ 250 m;3000~5000 m:≤ 300 m;>5000 m:不约束(与 TWS 通道 9.6 的取值相同)。
输出航迹同样写入方向标志 Flag_Direction,判据与 TWS 通道完全一致(fc49707/42b598e:按 IMM 融合速度矢量与位置矢量的夹角判定,见上文 TWS 小节)。
⚠ 波门语义提示:代码中 d 本身已是马氏距离平方,但门限写作 dd < associate_thresholdassociate_threshold,
associate_threshold = 4时等效于 d < 4(而非 √d < 4)。该行为在 BUG-20 中被识别,有意保留未改;associate_threshold/1000、/100 已改为浮点除法(BUG-21 修复)。TAS 不区分距离段,associate_threshold原值直接作为门限。
9.7 高度平滑
关联实点后,点迹高度入滑窗 Hight_smooth,输出高度取最近 w 个值的平均(不足 w 个则全平均)。
按距离分段取窗长 w,通道与体制不同(窗长基数取配置项 height_smooth_win,样例配置为相扫 6;机扫需配 3。TAS 的偏移段于 6284f3f 由 +2/+3/+4/+6 改为 +6/+8/+10/+12):
| 距离段 | TWS(height_smooth_win + 2/3/4/6) |
TAS(height_smooth_win + 6/8/10/12) |
|---|---|---|
| r ≤ 1000 m | 8 / 5 | 12 / 9 |
| 1000 < r ≤ 2000 m | 9 / 6 | 14 / 11 |
| 2000 < r ≤ 4000 m | 10 / 7 | 16 / 13 |
| r > 4000 m | 12 / 9 | 18 / 15 |
(每格「相扫 / 机扫」;TWS 与 TAS 的实现在 track_asso.cpp / track_asso_tas.cpp 的 track_hight_update() 中,分段边界相同。)
\hat h=\frac{1}{w}\sum_{i=N-w+1}^{N} h_i
已知问题(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)按 TWS 数据率配置项data_rate_tws预测一帧(原实现按radar_work_mode在DATA_RATE_SHORT/MIDDLE/FAR三档中三选一,新结构体统一为单字段data_rate_tws,见 10.3;ΔT≤0 的候选虽被消费但未刷新航迹状态,其point_flag仍为 0,故同样在本环节外推,见 9.6)。预测用各子模型 Singer F/Qj 推进,Extrapolate_round+1,point_flag=0(虚点/补点),航迹时间同步推进,并置Track_Update_Flag=1(本圈输出)。时间差取值(56b5449 → b4aed8a):56b5449 曾把 TWS 外推的 ΔT 改为按最新时间戳实时计算(
(latest_timestamp − T_track)/1000,并对ΔT ≤ 0跳过),b4aed8a 已回调为按work_mode取固定数据率(原因:按最新时间戳推进会在 TAS 工作时同步外推出 TWS 航迹)。因此track_asso_process()与model_filter()虽接收latest_timestamp形参,但当前不参与 ΔT 计算(实时计算的两行代码以注释保留在源码中)。 - TWS 外推上限(50e0b5c):仅当
Extrapolate_round <= extrapolate_max(默认 3)时才做上述预测;超过上限后不再推进位置与航迹时间,只执行Extrapolate_round+1、point_flag=0、Track_Update_Flag=0——该航迹当圈不输出、位置冻结在最后一次预测处,直到重新关联到实点(Extrapolate_round清零)才恢复。目的是避免长时间未关联的航迹被反复外推到远处。 - 质量衰减(V1.5.8):本环节对每条未关联航迹(不论是否已超外推上限)按未更新时长降低
Quality,Unupdated_time同步累加,因此超限后航迹虽不再输出,质量仍在下降,直到触发质量消亡(见下)。因为 ΔT 已移到上限判断之外计算,这一衰减在上限内/外都按work_mode的数据率推进。 - TAS:按
latest_timestamp − T_track预测(ΔT ≤ 0 跳过),航迹时间推进到最新时间戳。上限判定为Extrapolate_round >= extrapolate_max_tas(配置项,样例为相扫 5;机扫需配 48)时才预测并输出,未达该轮数时只累加Extrapolate_round且不输出(位置与航迹时间停在最后一次关联处)。⚠ 判定方向与 TWS 的<=相反,见 11.2。TAS 通道不维护航迹质量(track_asso_tas.cpp未更新Quality),消亡仍按外推圈数。 - 输出门控:
track_asso_process()/track_asso_process_tas()的输出循环只写Track_Update_Flag==1的航迹,写完即清零;因此「本圈未更新」的航迹(外推超限等)不会出现在Trust_Track_Output中。
消亡(track_die.cpp / track_die_tas.cpp)
TWS 普通航迹自 V1.5.8 起改为按航迹质量消亡(Quality < track_die_quality,默认 0.3),其余通道仍按外推圈数(判据 Extrapolate_round > 阈值,50e0b5c 起由 >= 改为 >),满足其一即消亡:
| 通道 | 条件 |
|---|---|
| TWS 普通航迹 | Track_Mode==0 且 primary_target_flag==0 且 Quality < track_die_quality(样例 0.3)(V1.5.8,782bff5) |
| TWS 重点航迹 | Track_Mode==0 且 primary_target_flag==1 且 Extrapolate_round > track_die_round_pramary(样例 10) |
| TAS 航迹 | Track_Mode==1 且 Extrapolate_round > track_die_round_tas(样例配置为相扫 20;机扫需配 96) |
| 任意航迹 | manual_delete_flag==1(手动删除标记,不区分通道) |
消亡批号写入 Track_die_Index_Output 并删除本地航迹。重点航迹实际连续 11 圈无实点关联才消亡(TAS 相扫 21 圈 / 机扫 97 圈,因 Extrapolate_round 每圈未关联只自增 1;相扫 TAS 阈值于 5d105d2 由 10 提高到 20);普通 TWS 航迹的存活时长改为由质量衰减速度决定——未关联时间越长衰减越快,Quality 降到 track_die_quality 以下即消亡,不再有固定圈数上限(track_die_round(原 6 圈)仍可配置但已不被引用,见 10.2)。track_process() 中的调用顺序为 track_asso → track_die → track_init(data_process.cpp),即消亡先于航迹起始执行。
重点目标标记(
primary_target_add/primary_target_cancel)在 TWS 上决定「按质量消亡(普通)」还是「按 10 圈轮数消亡(重点)」,不改变关联、滤波、波束控制等其他环节,也不体现在输出航迹字段中。
9.10 TAS 波束控制(tas_ctrl.cpp)
- 入队条件(仅手动):manual_tracking_flag==1 且 Track_Mode==0 且队列未满(配置项
tas_track_num_max,样例为相扫 4;机扫需配 1,上限RDP_TAS_QUEUE_CAPACITY=30)且不在 TAS 禁止区内。入队即置 Track_Mode=1、以航迹时间初始化 last_track_time,并输出一次航迹更新。 - 出队:队列中目标在航迹表中不存在、或不再处于手动 TAS 状态时清除。(自动转 TAS / 自动退出的 tas_auto_start/tas_auto_end 逻辑全部注释停用——只支持手动。)
- 波束输出:在 TAS 队列内遍历,逐个目标先按数据率门控筛选——仅要求目标距上次波束输出(
last_track_time)的时间delta_T_last_track = (latest_timestamp − last_track_time)/1000大于配置项data_rate_tas秒(单位 s,1521592 起由 Hz 改为 s,加载器校验须 >0),保证 TAS 目标输出间隔不随波束时间(Beam_Ctrl 调用频率)变化;对通过门控的目标再比较航迹时间T_track,取 CPI 时间最早者,选中后按其 CPI 时间与最新时间戳之差外推到 latest_timestamp:
\Delta T=(latest\_timestamp-CPI\_time)/1000,\qquad
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=default_track_beam_type(配置项,样例 1), Range=rp, Azi=θp(°), Elev=asin(h/rp)(°), TAS_track_index};队空、目标不在航迹表或数据率门控未通过时 open_flag=0。输出后更新该目标队列项的 last_track_time;原每次 Beam_Ctrl 末尾的整队循环移位(队列轮转)已停用,改为按数据率门控在队列内轮换目标。
e0bf227修正:数据率门控原先同时要求「距上次波束输出」与「航迹时间 T_track 距最新时间戳」都超过data_rate_tas,第二个条件与「选 CPI 最早目标」的语义冲突(航迹时间越早反倒越容易被抑制),会漏掉本应输出的波束;现已只保留前者。
- tas_ctrl_process 入口强制 *Trust_track_num_Output=0 并在写入前检查容量,防止输出数组越界(BUG-09 修复)。
9.11 航迹质量(V1.5.8,1ae0cf2 / d9a7bd0 / 4b70b24 / 782bff5)
内部质量 Quality 为 0~1 的归一化值(Temp_track::quality、Trust_Track::Quality),输出时乘 track_quality_max(配置项,100)折算为 0~100 写入 Track.Quality。它贯穿「临时航迹 → 起批 → 关联 → 外推 → 消亡」全过程,是普通 TWS 航迹自动消亡的唯一依据。
三个公共分量
| 分量 | 公式 | 说明 |
|---|---|---|
统计距离项 d_tmp |
exp(−d) |
d 为所选点迹的最近邻统计距离(TWS 为三模型 d_min;临时航迹为末点 d) |
SNR 项 snr_tmp |
1/(1+exp(−(SNR−16)/1.2)) |
以 16 为中心、尺度参数 1.2 的 Sigmoid,SNR 越高越接近 1 |
长度项 len_tmp |
sigmoid((Valid_point_sum−4)/1.2)×0.5 + (1 − Valid_point_sum/Point_sum)×0.5 |
仅在关联更新时使用;两项各占 0.5,衡量「已积累实点数」与「实点占比」 |
① 临时航迹阶段(track_init.cpp::point_temp_track_asso()):每成功延长一个点后重算——quality_tmp = (0.5·d_tmp + 0.3·snr_tmp)/(0.5+0.3)(只用距离与 SNR 两项,不含长度项)。
- 长度 L = 3:SNR 取三点平均,
quality_tmp写满三个点; - 长度 L > 3:SNR 只取末点,末点质量 =
前一点质量×0.8 + quality_tmp×0.2(指数平滑,系数为配置项track_quality_iter_coeff,默认 0.8)。
② 关联更新(track_asso.cpp::model_filter()):关联到实点并完成 IMM/EKF 更新后,用 tq = track_quality_d_weight·d_tmp + track_quality_snr_weight·snr_tmp + track_quality_len_weight·len_tmp(权重默认 0.5/0.3/0.2)求即时质量,再 Quality = Quality×track_quality_iter_coeff + tq×(1−track_quality_iter_coeff)(默认 0.8/0.2);随后 Point_sum++、Valid_point_sum++(质量用的是自增前的计数),Unupdated_time 清零。注意 Valid_point_sum/Point_sum 为整数除法(先截断再乘 0.5)。
③ 外推衰减(track_asso.cpp::model_filter() 外推环节):按累计未更新时长做二次衰减。记 t = Unupdated_time/1000(秒),每次先 Quality -= f(t_old)、执行 Unupdated_time += ΔT、再 Quality += f(t_new),净效果为 Quality += [f(t_new) − f(t_old)](即 Quality -= [f(t_old) − f(t_new)]),其中
f(t)=track\_quality\_decrease\_coeff\_o2\,t^2+track\_quality\_decrease\_coeff\_o1\,t,\qquad O_2=-0.0008,\; O_1=-0.0025
因两系数为负,f 单调递减,故每圈质量下降 0.0008\,(t_{new}^2-t_{old}^2)+0.0025\,(t_{new}-t_{old})——未关联越久、衰减越快;结果钳位到 ≥0。该衰减在上限内/外都会执行(见 9.9)。
④ 起批门限(tmp_track_to_trust_track()):除长度 3~10 与屏蔽区判断外,按长度取最低质量:
| 航迹长度 L | 3 | 4 | 5 | 6 | ≥7 |
|---|---|---|---|---|---|
| 最低质量 | 0.7 | 0.6 | 0.5 | 0.4 | 0.3 |
不达标的本圈不起批,临时航迹继续留在表中积累(受 buff_round/长度 10 的临时航迹消亡约束)。
⑤ 消亡(track_die.cpp):普通 TWS 航迹 Quality < track_die_quality(默认 0.3)即消亡;重点航迹与 TAS 航迹仍按外推圈数(见 9.9)。
⑥ 调试入库(1ffb287):记录功能启用时,临时航迹表 RdpRecTempTrack 增加 quality、可靠航迹表 RdpRecTrustTrack 增加 Quality / Unupdated_time / Point_sum / Valid_point_sum,可用 SQL 直接观察质量从起批、关联平滑到未关联衰减的全过程(字段顺序见 docs/data_record_debug.md 第 7 节)。
参数来源:质量相关参数位于配置文件
[track_quality]段(track_quality_max/min、track_quality_d_weight(0.5) /snr_weight(0.3) /len_weight(0.2)、track_quality_iter_coeff(0.8)、track_quality_decrease_coeff_o2/o1),起批质量门限位于[track_init]段(track_init_quality_L3~L7),消亡质量门限位于[track_die]段(track_die_quality(_pramary));全部经parameters_reload()加载(见 10)。已知局限(详见 11.2):TAS 通道不维护质量;
track_quality_min、track_die_quality_pramary、track_die_round当前可配置但未参与计算;起批质量门限按临时航迹长度取值,而实际起批只用末点质量。
10. 参数说明
自「参数配置方式改造」起,工作参数的唯一来源是 TOML 配置文件 →
struct.h::RDP_parameter:parameters.h不再含雷达工作参数宏,公开头中也不再有struct RadarPara。宿主只需在GetB()后调用parameters_reload(配置文件路径)。数值与改造前一致,默认值见config/config_tmp.toml。
10.1 参数加载机制与校验规则
宿主:GetB() → parameters_reload("config/config_tmp.toml") → data_preprocess / track_process / Beam_Ctrl ...
(重连或切换配置时再次 parameters_reload 即可热重载;成功返回 0,失败返回 -1)
DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一次性赋值给全局对象 rdp_parameter
(struct.h 中 extern 声明、data_process.cpp 中定义并零初始化)
全局对象与线程模型:
rdp_parameter是 DLL 内的单实例全局对象(静态存储期零初始化,定义于data_process.cpp:14),所有处理模块直接读取、处理期间只读;parameters_reload()会整体覆盖该对象,因此重载配置必须与处理调用互斥(宿主按单线程接口使用,见 11.2 的 BUG-03 / BUG-13)。
配置段与 RDP_parameter 的注释分组一一对应,键名 = 结构体成员名:
| 配置段 | 内容 |
|---|---|
[radar_params] |
雷达工作参数:工作模式、扫描模式 scan_mode、频点、平台高度、系统延迟、TWS/TAS/纯跟踪数据率 |
[cohesion] |
点迹凝聚参数:距离/速度/方位门限、有效量程上下限 |
[track_associate] |
航迹关联参数:量测误差 sigma_*、关联门限 associate_threshold、外推上限、高度平滑窗长 |
[track_init] |
航迹起始参数:起批波门/折角/点数、起批质量门限 L3~L7、起始速度范围 |
[track_die] |
航迹消亡参数:消亡圈数(普通/重点/TAS)、质量消亡门限 |
[track_quality] |
航迹质量参数:折算上下限、三项权重、平滑与衰减系数 |
[track_index] |
航迹批号管理:track_index_max |
[beam_control] |
波束调度:默认跟踪波束类型、最大同时跟踪 TAS 目标数 |
[singer_model] |
三个 Singer 模型的过程噪声强度(fast/slow) |
[track_init_prohibite_area] |
起批屏蔽区:*_num + 4 个与成员同名的 TOML 数组 |
[tas_prohibite_area] |
禁止 TAS 跟踪区:*_num + 4 个与成员同名的 TOML 数组 |
加载器严格校验规则(rdp_parameter_loader.cpp,任一不满足即失败):
- 11 个配置段全部必填,且必须是 TOML 表;顶层出现未知配置段直接拒绝;
- 所有标量键必填,类型必须匹配(浮点参数接受整数或浮点,整数参数只接受整数),且不得超出 C++
float/int可表示范围; - 每个段内只允许登记过的键,拼错的键按未知参数拒绝(不会静默忽略);
- 取值范围校验:如
radar_work_mode∈[0,2]、scan_mode∈{0,1}、freq_0_GHz>0、data_rate_tws/data_rate_tas>0、sigma_*>0、associate_threshold>0、height_smooth_win≥1、track_init_point_num_min∈[3,9]、track_init_angle∈(0,180]、track_init_quality_L3~L7∈[0,1]、track_init_velocity_max>min≥0、消亡圈数≥0、质量门限∈[0,1]、质量衰减系数≤0、track_index_max∈[1, MAX_TRACK_NUM]、tas_track_num_max∈[0, RDP_TAS_QUEUE_CAPACITY]、Singer 模型 Q>0 等(完整清单以源码为准); - 屏蔽区:
*_num∈[0,30];4 个数组的元素个数必须等于*_num(*_num=0时数组可省略,存在时必须为空数组);并逐区校验距离0≤min<max、方位0≤min<max≤360; - 失败语义:返回 -1,并经可选
std::string* error_msg给出首条可读原因(Data_Process::parameters_reload失败时以RDP_LOG_ERROR打印到日志),当前已加载参数保持不变(加载过程先写入临时对象,全部成功后才整体赋值)。
兼容性提示:改造前
TRACK_DIE_ROUND_TAS、MAX_EXTRAPOLATE_NUM_TAS、H_F_WIN_LEN、TAS_QUEUE_LENGTH/MAX_TAS_NUM按扫描体制取不同宏值;现在同一份配置对所有体制生效。config/config_tmp.toml是相扫取值(scan_mode=0+ 下列 4 项相扫值),机扫部署需配为scan_mode=1、track_die_round_tas=96、extrapolate_max_tas=48、height_smooth_win=3、tas_track_num_max=1(其余参数两体制相同)。判圈逻辑由配置项scan_mode决定(0 相扫 / 1 机扫,见 7.2);机扫/相扫已合并为同一份构建,不再有编译期体制或版本后缀(见 4.2)。
10.2 参数表(RDP_parameter 字段 ↔ TOML 键 ↔ 样例值)
「样例值」为 config/config_tmp.toml 的取值(相扫);数值含义与改造前相同。
| 配置段 | 键(=结构体字段) | 样例值 | 含义 / 影响 |
|---|---|---|---|
| radar_params | radar_work_mode |
0 | 工作模式:0 近程 / 1 中程 / 2 远程(当前影响凝聚是否带速度维约束;TWS 外推已改为固定 data_rate_tws、不再按模式三选一;原 RadarPara.work_mode) |
| radar_params | scan_mode |
0 | 扫描模式:0 相扫 / 1 机扫(加载器校验仅允许 0/1),决定 data_preprocess() 的 TWS 判圈逻辑(见 7.2);构建不区分体制,同一份 DLL 通过该配置切换扫描模式(见 4.2) |
| radar_params | freq_0_GHz |
9.2 | 载波频点(GHz,盲速计算基准;原 FREQ0) |
| radar_params | radar_height |
0 | 雷达平台高度(m,输出 z 叠加;原 Height) |
| radar_params | radar_system_delay |
0 | 系统延迟(s,输出位置按 x + vx·delay 补偿;原 Sys_delay) |
| radar_params | data_rate_tws |
3 | TWS 数据率/外推步长(s;原按 work_mode 在 DATA_RATE_SHORT/MIDDLE/FAR 中三选一) |
| radar_params | data_rate_tas |
1 | TAS 波束输出间隔(s,校验 >0;原 DATA_RATE_TAS,1521592 起单位由 Hz 改为 s) |
| radar_params | data_rate_track_only |
0.2 | 纯跟踪模式数据率(s;当前实现保留未用) |
| cohesion | point_cohesion_range |
80 | 距离凝聚门限(m;原 DOT_COH_RANGE) |
| cohesion | point_cohesion_velocity |
2 | 速度凝聚门限(m/s;原 DOT_COH_V) |
| cohesion | point_cohesion_azimuth |
6 | 方位凝聚门限(°;原 DOT_COH_AZI) |
| cohesion | point_cohesion_range_min |
100 | 有效量程下限(m;原 R_MIN) |
| cohesion | point_cohesion_range_max |
100000 | 有效量程上限(m;原 R_MAX,校验 > 下限) |
| track_associate | sigma_range |
10.0 | 距离量测误差(m;原 SIGMA_R) |
| track_associate | sigma_azimuth |
0.02 | 方位量测误差(rad;原 SIGMA_A) |
| track_associate | sigma_pitch |
0.2 | 俯仰量测误差(rad;原 SIGMA_E) |
| track_associate | sigma_velocity |
2.0 | 速度量测误差(m/s;原 SIGMA_V) |
| track_associate | associate_threshold |
4.0 | 关联波门(原 ASSO_THORD,判据 d*d < 该值²,语义见 9.6) |
| track_associate | extrapolate_max |
3 | TWS 最大外推圈数(原 MAX_EXTRAPOLATE_NUM) |
| track_associate | extrapolate_max_tas |
5 | TAS 外推轮数阈值(原 MAX_EXTRAPOLATE_NUM_TAS;机扫需配 48) |
| track_associate | height_smooth_win |
6 | 高度平滑窗长基数(原 H_F_WIN_LEN;机扫需配 3,见 9.7) |
| track_init | track_init_threshold |
8 | 起批统计距离波门(原 TRACK_START_THRESHOLD;实际生效 d ≤ 8) |
| track_init | track_init_angle |
60 | 起批折角上限(°;原 ALPHA_START) |
| track_init | track_init_point_num_min |
3 | 起批所需点数(3~9;原 RadarPara.track_start_point_num) |
| track_init | track_init_quality_L3~L7 |
0.7 / 0.6 / 0.5 / 0.4 / 0.3 | 按临时航迹长度 3/4/5/6/≥7 的起批最低质量(原 TRACK_START_QUALITY_L3~L7) |
| track_init | track_init_velocity_min |
1 | 航迹头关联速度下限(m/s;原 V_MIN,校验 < 上限) |
| track_init | track_init_velocity_max |
50 | 航迹头关联速度上限(m/s;原 V_MAX) |
| track_die | track_die_round |
6 | 普通 TWS 消亡圈数(V1.5.8 起改按质量消亡,当前未被引用,保留) |
| track_die | track_die_round_pramary |
10 | 重点航迹消亡圈数(原 TRACK_DIE_ROUND_PRIMARY) |
| track_die | track_die_round_tas |
20 | TAS 航迹消亡圈数(原 TRACK_DIE_ROUND_TAS;机扫需配 96) |
| track_die | track_die_quality |
0.3 | TWS 普通航迹质量消亡门限(原 TRACK_DIE_QUALITY) |
| track_die | track_die_quality_pramary |
0.3 | 重点航迹质量门限(保留,当前未参与计算) |
| track_quality | track_quality_max |
100 | 质量折算上限(输出 Track.Quality = 内部质量 × 该值) |
| track_quality | track_quality_min |
0 | 质量下限(保留,当前未使用) |
| track_quality | track_quality_d_weight |
0.5 | 质量三要素权重:统计距离 |
| track_quality | track_quality_snr_weight |
0.3 | 质量三要素权重:SNR |
| track_quality | track_quality_len_weight |
0.2 | 质量三要素权重:有效点占比 |
| track_quality | track_quality_iter_coeff |
0.8 | 质量指数平滑系数(新 = 旧×c + 即时×(1−c)) |
| track_quality | track_quality_decrease_coeff_o2 |
−0.0008 | 质量衰减二次项系数(须 ≤0,见 9.11) |
| track_quality | track_quality_decrease_coeff_o1 |
−0.0025 | 质量衰减一次项系数(须 ≤0) |
| track_index | track_index_max |
500 | 航迹号上限(1~500;原 MAX_TRACK_INDEX,内部航迹号表按该值分配) |
| beam_control | default_track_beam_type |
1 | 跟踪波束 TrackingBeam.type 取值(原硬编码 1) |
| beam_control | tas_track_num_max |
4 | 最大同时跟踪 TAS 目标数(0~30;原 MAX_TAS_NUM,机扫需配 1) |
| singer_model | model_1_Q_fast |
0.000001 | 模型 1 过程噪声(当前未参与计算,模型 1 只用 slow) |
| singer_model | model_1_Q_slow |
0.000001 | 模型 1 过程噪声(恒定,见 9.5.1) |
| singer_model | model_2_Q_fast |
0.01 | 模型 2 过程噪声 fast 档 |
| singer_model | model_2_Q_slow |
0.01 | 模型 2 过程噪声 slow 档 |
| singer_model | model_3_Q_fast |
1.0 | 模型 3 过程噪声 fast 档 |
| singer_model | model_3_Q_slow |
1.0 | 模型 3 过程噪声 slow 档 |
| track_init_prohibite_area | track_init_prohibite_area_num |
0 | 起批屏蔽区数(0~30;原 RadarPara.track_prohibite_area_num) |
| track_init_prohibite_area | track_init_prohibite_area_range_min/max、_azimuth_min/max |
[] |
4 个 TOML 数组,长度必须等于 *_num(距离 m / 方位 °;原 R_min/max_track_prohibited、Azimuth_min/max_track_prohibited) |
| tas_prohibite_area | tas_prohibite_area_num |
0 | 禁止 TAS 跟踪区数(0~30;原 RadarPara.TAS_prohibite_area_num) |
| tas_prohibite_area | tas_prohibite_area_range_min/max、_azimuth_min/max |
[] |
4 个 TOML 数组,长度必须等于 *_num(原 R_min/max_TAS_prohibited、Azimuth_min/max_TAS_prohibited) |
⚠ 结构体成员名
track_die_round_pramary、track_die_quality_pramary沿用源码既有拼写(pramary),配置键必须与之一致,不是笔误修正对象。
10.3 旧参数 → 新字段对照(宿主/调参迁移用)
(a)旧 struct RadarPara 字段
| 旧字段 | 新字段(配置键) | 说明 |
|---|---|---|
work_mode |
radar_work_mode |
工作模式 |
Height |
radar_height |
雷达平台高度 |
Sys_delay |
radar_system_delay |
系统延迟 |
DATA_RATE_SHORT/MIDDLE/FAR |
data_rate_tws |
原按 work_mode 三选一,现为单字段(契约确认的等价改法) |
DATA_RATE_TAS |
data_rate_tas |
TAS 数据率 |
track_start_point_num |
track_init_point_num_min |
起批点数 |
track_start_threshold(原实现未用) |
track_init_threshold |
起批波门 |
track_asso_threshold(原实现未用) |
associate_threshold |
关联波门 |
track_prohibite_area_num |
track_init_prohibite_area_num |
起批屏蔽区数 |
R_max_track_prohibited / R_min_track_prohibited |
track_init_prohibite_area_range_max/min |
起批屏蔽区距离 |
Azimuth_max_track_prohibited / Azimuth_min_track_prohibited |
track_init_prohibite_area_azimuth_max/min |
起批屏蔽区方位 |
TAS_prohibite_area_num |
tas_prohibite_area_num |
TAS 禁止区数 |
R_max_TAS_prohibited / R_min_TAS_prohibited |
tas_prohibite_area_range_max/min |
TAS 禁止区距离 |
Azimuth_max_TAS_prohibited / Azimuth_min_TAS_prohibited |
tas_prohibite_area_azimuth_max/min |
TAS 禁止区方位 |
V_MAX / V_MIN |
track_init_velocity_max/min |
航迹头关联速度范围 |
Model1_Q_fast/slow、Model2_Q_*、Model3_Q_* |
model_1/2/3_Q_fast/slow |
Singer 模型过程噪声 |
R_TAS_max/min、V_TAS_max/min、TAS_Height_1~5、cfar_th、north_angle、Beam_num |
无 | 实现未使用,新结构体已排除(自动 TAS 逻辑保持停用) |
| —(新增配置项,无旧字段对应) | scan_mode |
扫描模式 0 相扫 / 1 机扫,替代原 data_process.cpp 的编译期 PHASE_SCANNING/MECHANICAL_SCANNING 判圈分支(见 7.2) |
(b)旧 parameters.h 宏
| 旧宏 | 新字段(配置键) | 说明 |
|---|---|---|
FREQ0 |
freq_0_GHz |
载波频点 |
SIGMA_R / SIGMA_A / SIGMA_E / SIGMA_V |
sigma_range / sigma_azimuth / sigma_pitch / sigma_velocity |
量测误差 |
DOT_COH_RANGE / DOT_COH_V / DOT_COH_AZI |
point_cohesion_range / point_cohesion_velocity / point_cohesion_azimuth |
凝聚门限 |
R_MIN / R_MAX |
point_cohesion_range_min / point_cohesion_range_max |
有效量程 |
ASSO_THORD |
associate_threshold |
关联波门 |
MAX_EXTRAPOLATE_NUM / MAX_EXTRAPOLATE_NUM_TAS |
extrapolate_max / extrapolate_max_tas |
外推上限 |
H_F_WIN_LEN |
height_smooth_win |
高度平滑窗长基数 |
TRACK_START_THRESHOLD / ALPHA_START |
track_init_threshold / track_init_angle |
起批波门/折角 |
TRACK_START_QUALITY_L3~L7 |
track_init_quality_L3~L7 |
起批最低质量 |
TRACK_DIE_QUALITY / TRACK_DIE_QUALITY_PRAMARY |
track_die_quality / track_die_quality_pramary |
消亡质量门限 |
TRACK_DIE_ROUND / TRACK_DIE_ROUND_PRIMARY / TRACK_DIE_ROUND_TAS |
track_die_round / track_die_round_pramary / track_die_round_tas |
消亡圈数(track_die_round 当前未被引用) |
TRACK_QUALITY_MAX / MIN |
track_quality_max / track_quality_min |
质量折算上下限(min 当前未使用) |
TRACK_QUALITY_D_WEIGHT / SNR_WEIGHT / LEN_WEIGHT |
track_quality_d_weight / snr_weight / len_weight |
质量权重 |
TRACK_QUALITY_ITER_COEFF |
track_quality_iter_coeff |
质量平滑系数 |
TRACK_QUALITY_DECREASE_COEFF_O2 / O1 |
track_quality_decrease_coeff_o2 / o1 |
质量衰减系数 |
MAX_TRACK_INDEX |
track_index_max |
航迹号上限(原定长占用表改为按该值分配的 std::vector) |
MAX_TAS_NUM |
tas_track_num_max |
最大同时跟踪 TAS 目标数 |
TAS_QUEUE_LENGTH |
编译期常量 RDP_TAS_QUEUE_CAPACITY(30,见 10.4) |
队列容量仍为编译期常量,运行期上限用 tas_track_num_max |
硬编码 Tracking_beam->type = 1 |
default_track_beam_type |
跟踪波束类型 |
UNCONF_TARGET |
无(宏已删除) | 未确认目标类型语义常量;起批处 Target_Type 直接写 0,语义不变 |
PI、MAX_TRACK_NUM、版本/日志/记录宏、Round |
保留不变(日志改造后 RDP_LOG_ENABLE 已删除,日志宏改为 RDP_LOG_TRACE~RDP_LOG_CRITICAL 与 RDP_LOG_DIR,级别由 CMake 选项控制,见 10.4) |
见 10.4 |
10.4 编译期常量(parameters.h 保留宏)
parameters.h 已删除全部雷达工作参数宏(改为配置文件,见 10.1~10.3),仅保留接口/内存布局所需的编译期常量、版本/记录宏与日志目录宏(日志级别由 CMake 选项 RDP_LOG_LEVEL 控制,不是源码宏):
| 宏 / 常量 | 取值 | 含义 |
|---|---|---|
MAX_TRACK_NUM |
500 | 输出航迹数组 Track[500][10] 的固定容量(宿主接口维度) |
RDP_TAS_QUEUE_CAPACITY |
30 | TAS 跟踪队列容量上限;运行期配置项 tas_track_num_max 不得超过该值 |
PI |
3.1415926f | 圆周率常量 |
MAJOR_VERSION / MINOR_VERSION / PATCH_VERSION |
1 / 5 / 9 | 版本号(拼装为 VERSION_STRING,见 7.1) |
VERSION_INFO / VERSION_STRING |
"GENERIC"、V1.5.9.GENERIC |
版本后缀(机扫/相扫已合并为同一版本,无体制后缀)与完整版本串(由 GetB() 写入 version_info) |
Round(x) |
宏 | 四舍五入取整(盲速折叠用) |
RDP_LOG_DIR |
.\rdp_logs\ |
日志文件输出目录(相对宿主进程当前工作目录,rdp_log::Init() 时自动创建);文件名 rdp_YYYYMMDD_HHMMSS.log,同一秒内文件已存在时追加 _1~_999 后缀,每次 GetB() 一个文件 |
RDP_LOG_TRACE / RDP_LOG_DEBUG / RDP_LOG_INFO / RDP_LOG_WARN / RDP_LOG_ERROR / RDP_LOG_CRITICAL |
宏(映射为 spdlog 的 SPDLOG_TRACE 等) |
日志级别宏(fmt 风格格式化,如 RDP_LOG_INFO("target: {}", id));RDP_LOG_ERR 为 RDP_LOG_ERROR 的别名;低于 SPDLOG_ACTIVE_LEVEL 的调用在编译期被剔除、实参不求值;原流式 RDP_LOG 宏与 RDP_LOG_ENABLE 开关均已删除 |
RDP_LOG_LEVEL(CMake 缓存变量,非源码宏) |
AUTO(缺省)/ TRACE / DEBUG / INFO / WARN / ERROR / CRITICAL / OFF |
编译期日志级别,由 CMakeLists.txt 映射为 PUBLIC 编译定义 SPDLOG_ACTIVE_LEVEL 同时提供给 data_process_class_dll 与 rdp_record:AUTO 时 Debug=TRACE、其余构建=INFO;OFF 编译期关闭全部日志且 rdp_log::Init() 不创建日志文件。用法见 4.3 |
SPDLOG_ACTIVE_LEVEL(编译定义,由 CMake 传入) |
SPDLOG_LEVEL_TRACE / SPDLOG_LEVEL_DEBUG / SPDLOG_LEVEL_INFO / SPDLOG_LEVEL_WARN / SPDLOG_LEVEL_ERROR / SPDLOG_LEVEL_CRITICAL / SPDLOG_LEVEL_OFF |
spdlog 的编译期日志级别定义,由 RDP_LOG_LEVEL 统一决定(经 spdlog 目标的 PUBLIC 编译定义传给两个使用方),不要手工在源码中定义 |
| RDP_RECORD_ENABLE | 由 CMake 选项 RDP_DATA_RECORD 定义(AUTO 时 Debug 定义) |
数据记录调试开关:不要在 parameters.h 中手工定义(由构建系统传入);定义时记录模块参与编译,未定义时全部记录宏(6 个异步入队宏 + 遗留 RDP_RECORD/RDP_RECORD_BATCH)展开为空操作,见 4.3 与 11.3 |
| RDP_RECORD_DB_DIR | .\rdp_records\ |
数据记录库输出目录(相对宿主进程当前工作目录,目录不存在时自动创建;仅记录功能启用时产生) |
| RDP_RECORD_POINTS / RDP_RECORD_COHESION_TWS / RDP_RECORD_COHESION_TAS / RDP_RECORD_TEMP_TRACKS / RDP_RECORD_TRUST_TRACKS / RDP_RECORD_ASSO_INFOS | 由 RDP_RECORD_ENABLE 条件定义(记录开启时展开为 std::move + 异步入队,关闭时 ((void)0)) |
6 个异步入队记录点宏,参数为对应源结构体的 std::vector(PointRecv / Temp_track / Trust_Track / Asso_Info),宏内部 std::move、调用后 vector 为空;宏与表的对应关系见 docs/data_record_debug.md 第 4、7 节。遗留的 RDP_RECORD/RDP_RECORD_BATCH 为同步接口(会阻塞) |
| RDP_RECORD_QUEUE_CAP_BYTES | 64*1024*1024(64 MB) |
入队队列字节上限;超过该值整批丢弃并计入 stats().dropped_rows,不阻塞处理线程 |
| RDP_RECORD_QUEUE_MAX_BATCHES | 4096 | 入队队列批数上限(与字节上限同时生效) |
| RDP_RECORD_WRITE_BATCH_ROWS | 4096 | 写线程每个事务的目标提交行数(按表累积到该行数即提交) |
| RDP_RECORD_WRITE_MAX_WAIT_MS | 50 | 写线程为凑批等待的最长时间(ms),超时后提交现有数据 |
| RDP_RECORD_ASSO_CHUNK_ROWS | 131072 | 关联信息(⑥)单次入队分块上限,限制处理线程收集 Asso_Info 的内存峰值 |
| RDP_RECORD_SQLITE_CACHE_KB | 8192 | SQLite 页缓存大小(KB,执行 PRAGMA cache_size=-8192,即 8 MB) |
| RDP_RECORD_SQLITE_BUSY_TIMEOUT_MS | 2000 | SQLite 忙等待超时(ms) |
| RDP_RECORD_SQLITE_WAL | 1 | 是否尝试开启 WAL(1=尝试;失败/不支持时回退默认 journal 模式并提示) |
| RDP_RECORD_MAX_CONSECUTIVE_ERRORS | 10 | 异步批量写入连续失败达到该次数后全局熔断(停止记录并丢弃队列) |
| RDP_RECORD_DROP_LOG_INTERVAL | 1024 | 队列丢弃日志限频:每累计丢弃该行数提示一次 |
| rdp_record::Stats / stats()(非宏) | — | 运行统计结构体(定义于 rdp_record.h,任意时刻线程安全读取、Shutdown() 时自动打印):enqueued_rows/dropped_rows/written_rows/transactions/write_errors/queue_peak_bytes/queue_peak_rows |
构建期扫描体制宏已移除(机扫/相扫版本合并):
CMakeLists.txt不再有RADAR_SCAN_MODE缓存变量,也不再定义PHASE_SCANNING/MECHANICAL_SCANNING编译宏;parameters.h的VERSION_INFO为固定字符串"GENERIC"。扫描模式只由运行期配置项[radar_params] scan_mode决定(见 4.2、7.2),同一份 DLL 同时适用于两种体制的部署。
11. 已知问题与限制
详见 archived_docs/BUG_REPORT.md(37 项分析)与 archived_docs/BUG_FIX_REPORT.md(修复明细)。要点:
11.1 已修复(archived_docs/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 关联 Δ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);航向角 atan2(BUG-26);asin 定义域钳位(BUG-27);近程模型 3 门限浮点除法(BUG-21);track_clear_all 全模块 reset(BUG-28);未初始化变量修复(BUG-11/12/14)。
- 后修订(e0bf227,BUG_FIX_REPORT.md 成文之后):TWS 关联高度门限由注释状态改为实际生效(
track_asso.cpp),统计距离/高度/距离三类判据拆为独立布尔量,关联门限associate_threshold由 3 调大至 4;TAS 关联高度门限 2000~3000 m 段放宽至 250 m;修复tas_beam_output()数据率门控误判(详见 CHANGELOG 的 [1.5.8] 与 9.6、9.10)。 - 后修订(50e0b5c、fc49707、42b598e、e8c56f9,BUG_FIX_REPORT.md 成文之后):输出航迹增加
Track_Update_Flag门控(只输出本圈有更新的航迹);未关联航迹外推增加圈数上限;消亡判据改为>,正常/重点航迹分别定为 6 / 10 圈(TAS 相扫 10、机扫 96;其中 TAS 相扫其后于5d105d2调整为 20,且普通 TWS 航迹的 6 圈判据已改为质量消亡,见 10.2 与 11.2);Flag_Direction改用滤波速度矢量判定,修复速度模糊时的向站/背站误判;手动操作接口补break;DataRev/Track新增归一化幅度与速度维 FFT 点数字段(输入侧其后已打通,TAS 输出仍未写回,见 11.2)。
11.2 有意保留 / 未修复(archived_docs/BUG_REPORT.md 标注项 + 后续源码观察)
- BUG-01:基类无虚析构,Destroy() 按基类指针 delete。
- BUG-02:Hight_smooth 只增不减,长时运行内存持续增长。
- BUG-03:工厂 GetB/Destroy 非线程安全,接口线程模型未定义(宿主应单线程调用)。
- BUG-07:禁止区个数在实现内部仍未二次校验,配置过大仍可能越界读;但配置入口已加防护——加载器强制
track_init_prohibite_area_num/tas_prohibite_area_num在 0~30 且 4 个数组长度等于*_num,非法配置在parameters_reload阶段即返回 -1、不会进入处理流程(见 10.1)。 - BUG-08:消亡航迹输出数组容量未传入,仅约定 ≤500。
- BUG-13(参数初始化,已被参数配置方式改造改变):全局对象
rdp_parameter为静态存储期零初始化对象(定义data_process.cpp:14,未加载配置时data_rate_tws/sigma_*等均为 0,属非法值)。宿主必须在首次data_preprocess之前调用parameters_reload()且确认返回 0;加载失败时保留的是上一次成功参数(首次失败则为全 0),DLL 不会自动纠正。该全局对象是 DLL 内单实例可变状态:parameters_reload()与处理调用之间非线程安全,配置重载须与处理互斥(与 BUG-03 的单线程接口约定一致)。 - BUG-18:卡尔曼两点/三点初始化对零/负时间差无保护(起批时间戳必须严格递增)。
- BUG-20:门限对马氏距离平方再次平方(e0bf227 把
associate_threshold调为 4 后等效 d < 4),有意保留。 - BUG-25:TWS 关联/输出未排除 Track_Mode==1 的 TAS 航迹(原
manual_tracking_flag==0过滤代码块已于fc49707删除,未恢复过滤)。 - BUG-29:tracking_stop 后 TAS 队列项延迟到下一次 Beam_Ctrl 才移除。
- BUG-33:起批关联未显式校验 ΔT>0。
- BUG-36:TAS 波束关闭时只清 open_flag,其余字段保留旧值。
- 归一化幅度 / 速度维 FFT 点数(e8c56f9 新增,输入侧已打通):
data_preprocess()现已在 TWS、TAS 两条分支都把DataRev.amp_asv/DataRev.prn_fftn拷入内部PointRecv(data_process.cpp,并随RdpRecPoint落库),因此 TWS 关联路径(track_asso.cpp写航迹、输出时写回Track)取到的是有效数据。TAS 通道仍未打通:track_asso_tas.cpp的关联与输出路径没有涉及这两个字段,TAS 输出航迹中amp_asv_point/prn_fftn_point仍保持宿主原值,宿主暂不应依赖 TAS 侧的这两个字段。 - TAS 外推上限判据方向与 TWS 相反(50e0b5c):TWS 用
Extrapolate_round <= extrapolate_max外推,TAS 用Extrapolate_round >= extrapolate_max_tas,实际效果是 TAS 航迹在未达上限的若干圈内既不外推也不输出(位置与航迹时间停在最后一次关联处),达到上限后才恢复逐帧外推输出;如属笔误,宜与 TWS 侧统一。 - Flag_Direction 判据的 acos 无定义域钳位(fc49707/42b598e):对
(-x·cos D − y·sin D)/r直接取acos(与 BUG-27 同类问题),浮点舍入使参数略微越过 ±1 时返回 NaN,比较为假、按「远离 0」输出;r为 0 时还存在除零。 - 航迹质量仅覆盖 TWS 通道(V1.5.8):
track_asso_tas.cpp既不更新Quality也不在model_output()写Track.Quality,因此 TAS 航迹的Quality停留在起批时的初值(手动转 TAS 后不再变化),TAS 消亡仍按外推圈数。宿主若要按质量过滤,需自行区分Track_Mode。 - 质量相关参数存在未使用项(V1.5.8):配置项
track_quality_min、track_die_quality_pramary可配但未参与任何计算;track_die_round在 TWS 普通航迹改为质量消亡后也不再被引用(保留备用)。调参时不要误以为三者生效。 - 起批质量门限取的是临时航迹「末点」质量:
tmp_track_to_trust_track()用(*Iter)[L-1].quality与按长度取的门限比较,而临时航迹质量只在 L=3 时写过所有点、L>3 时只更新末点,因此门限表实际是针对「最新一点的质量」,不是整条航迹的平均质量。 - 质量长度项含整数除法:
1 − Valid_point_sum/Point_sum中两操作数均为int,先做整数除法截断再乘 0.5,Valid_point_sum/Point_sum的精度损失最大约 1/Point_sum;对点数很多的航迹影响可忽略,但精确复现公式时需注意。 - 数据记录未采用关联信息裁剪与记录策略(P0-a / P2,V1.5.8 优化时明确不做):⑥ 关联信息仍按「每个候选一行」写入(单圈 ≈ 点迹数 × 航迹数),未裁剪为只记录取中候选,也未做按容量/时长切库与旧库清理;因此高航迹密度场景下判圈帧仍有可观记录开销(200 目标/150 点压测 p99 ≈ 13~24 ms),记录库也可能很大(60 圈约 1.06 GB)。属本轮刻意取舍,评价实时性时需区分普通帧(p99 ≈ 0.1 ms)与判圈帧。
scan_mode与实际雷达体制需一致(部署约束):DLL 不校验配置项scan_mode与实际雷达体制/波位号序列是否一致(不报错);机扫部署须把scan_mode配为 1 且 4 项数值按机扫取值(见 4.2)。机扫/相扫已合并为同一份构建,不再有编译期体制可作交叉校验。
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。
- 新结构体
RDP_parameter已排除旧RadarPara中实现未使用的字段(R_TAS_max/min、V_TAS_max/min、TAS_Height_1~5、cfar_th、north_angle、Beam_num;其中前两组用于已停用的 TAS 自动开启/退出逻辑),这些功能仍保持停用(见 10.3)。 - build/output/ 下为早期打包导出物,其 data_process_class_dll.h 时间戳仍为 32 位 int,与当前 64 位接口不一致,勿作为对接依据。
- 数据记录调试功能默认只在 Debug 启用:CMake 选项
RDP_DATA_RECORD的 AUTO 默认值为「Debug 启用、Release 关闭」,交付/Release 构建下记录模块(rdp_record.cpp、sqlite3.c)不参与编译、所有记录宏为空操作(导出符号与依赖均无变化);如需在 Release 构建中临时排查可显式-DRDP_DATA_RECORD=ON,但正式交付应保持 AUTO/OFF(见 docs/data_record_debug.md)。记录点中的字段错误只在启用记录功能的构建中才会被检查(关闭时宏丢弃实参)。 - 记录表的三个观察:① 可靠航迹表
RdpRecTrustTrack在输出分支内写库,而该分支入口已把Track_Update_Flag清零(track_asso.cpp/track_asso_tas.cpp均先置 0 再输出),因此表中的Track_Update_Flag恒为 0,判断「本圈是否更新」应改用该表是否出现对应track_id/circle_id的记录;②Trust_Track的极坐标量快照Range/Azimuth/Elevation/Velocity只在航迹当圈有输出时回填,长期未输出(外推超限)的航迹在表中该项为 0 或旧值;③ TAS 关联信息行中R/VT为占位 0、thd_r恒为 true、track_index存的是 TAS 目标批号(TWS 行才是航迹表下标),跨通道分析时不要按 TWS 语义解读。 - 数据记录为异步写线程 + 有界队列(V1.5.8 优化):处理线程只做收集与入队,写线程在 Windows 下以 BELOW_NORMAL 优先级运行、承担全部实体构造与写库(遗留同步接口经
db_mtx串行化);队列满时整批丢弃(stats().dropped_rows可查,日志默认每 1024 行提示一次),处理线程绝不因记录阻塞。因此:① 进程异常退出(未调用Destroy())时队列尾部与 WAL 尾部可能丢失,采集结束务必Destroy();② 同一份记录的跨表写入顺序不保证,id为 SQLite ROWID 自增、单调但不保证连续;③ WAL 依赖本地盘/共享内存文件系统,网络盘上可能回退为默认 journal;④ 写失败时该表永久跳过、连续 10 次错误全局熔断,均只降级记录功能、不影响雷达处理。
11.4 航迹起始相关的未修复观察(详见 docs/track_init_readme.md 第 15 节)
以下为阅读源码得到的观察,未在本轮文档更新中改动代码;修改前请结合实测数据评估:
- 点-临时航迹关联硬编码
|Δr| ≥ 5 m门限,切向/远距离慢速目标可能漏关联导致起批失败。 - 起批判据对马氏距离平方再次平方(
d*d ≤ track_init_threshold²),track_init_threshold=8时实际门限为d ≤ 8,按字面d² ≤ 64理解会严重放宽;调track_init_threshold时需注意这一层。 - 折角计算
acos无定义域钳位,浮点越界产生 NaN 时条件恒假(静默丢弃该关联)。 - 起批输出数组行号可能越过容量:容量判据用
trust_track->size() < track_index_max,而输出行计数在 track_asso 阶段(track_die 删除航迹之前)已推进,极端场景(当圈消亡 ≥ 2 条且起批占满配额)可写到MAX_TRACK_NUM之外。 - 起批输出有多个字段未赋值(见 9.3(4) 与 docs/track_init_readme.md 第 14 节),宿主不应依赖这些字段。
12. 版本历史
当前代码版本:V1.5.9(parameters.h 的 PATCH_VERSION = 9、VERSION_INFO = "GENERIC",版本串 V1.5.9.GENERIC——机扫/相扫已合并为同一份构建,无体制后缀;对应提交 019af7a,2026-10-27)。版本号自 1.5.6 起可运行时读取(version_info,见 7.1)。中间状态 b4aed8a 曾把版本号置为 7,但未单独发布/记录。1.5.8 之后又有若干未发版的代码改动(构建脚本重构、记录性能优化、TAS 消亡圈数与高度平滑调整、质量入库、参数配置方式改造、机扫/相扫版本合并与构建脚本适配、全局工作参数对象改造、日志组件改为 spdlog),已记入 CHANGELOG 的 [Unreleased],下表前列为其提交/工作区状态。
近期提交(git log --oneline,新→旧;仅列代码改动,纯文档提交略):
| 提交 | 内容 |
|---|---|
| 工作区(日志组件改为 spdlog,未提交) | 日志组件由 std::cout 重定向改为内置 spdlog v1.17.0:新增内置第三方库 third_party/spdlog(include/ + src/ + LICENSE + UPSTREAM.md,MIT,spdlog v1.17.0 上游快照,含随库内置的 {fmt} 12.1.0);根 CMakeLists.txt 新增静态库目标 spdlog(SPDLOG_COMPILED_LIB,第三方源码以 /w 编译)与缓存变量 RDP_LOG_LEVEL(AUTO/TRACE/DEBUG/INFO/WARN/ERROR/CRITICAL/OFF,AUTO 时 Debug=TRACE、其它构建=INFO),映射为 PUBLIC 编译定义 SPDLOG_ACTIVE_LEVEL 同时提供给 data_process_class_dll 与 rdp_record;data_process_class_dll/rdp_log.h/.cpp 重写:不再重定向 std::cout,rdp_log::Init() 创建 RDP_LOG_DIR(.\rdp_logs\)下 rdp_YYYYMMDD_HHMMSS.log(每次 GetB() 一个文件,同秒冲突追加 _1~_999),默认 logger 同时输出到标准输出与文件,行格式 "[%Y-%m-%d %H:%M:%S.%e] [%l] [%s:%#] %v"(毫秒时间戳、级别、文件名:行号、内容),所有级别逐条 flush,文件创建失败时降级为仅标准输出并返回 false;rdp_log::Shutdown() flush 并关闭日志文件;原流式 RDP_LOG 宏改为 RDP_LOG_TRACE / RDP_LOG_DEBUG / RDP_LOG_INFO / RDP_LOG_WARN / RDP_LOG_ERROR / RDP_LOG_CRITICAL(RDP_LOG_ERR 为 ERROR 别名)的 fmt 风格调用;RDP_LOG_ENABLE 宏已删除,日志级别改由 SPDLOG_ACTIVE_LEVEL 在编译期控制(OFF = 编译期关闭且不创建日志文件);Data_Process_Factory::GetB() 中启用 rdp_log::Init()(在 rdp_record::Init() 之前)、Destroy() 中在 rdp_record::Shutdown() 之后调用 rdp_log::Shutdown();调用点迁移(data_process.cpp 参数重载成功 INFO / 失败 ERROR、track_asso_tas.cpp ΔT≤0 告警 WARN、rdp_record.cpp 19 处 info/warn/error 分级;其余注释代码中的旧宏同步改写);parameters.h 删除 RDP_LOG_ENABLE、保留 RDP_LOG_DIR,注释改为说明 spdlog + SPDLOG_ACTIVE_LEVEL。验证(Lead 实测,2026-10-28):4 配置(Release/Debug × REC_OFF/REC_ON)0 warning 0 error;公开接口测试 38 项断言全部通过;运行期实测日志同时写入标准输出与文件、文件名/行格式正确、Destroy()→GetB() 同秒重连生成 _1 后缀新文件(样例:[2026-10-28 10:48:29.697] [info] [rdp_log.cpp:153] rdp_log enabled, log file: .\rdp_logs\rdp_20261028_104829.log)。详见 CHANGELOG [Unreleased] |
| 工作区(全局工作参数对象改造,未提交) | 工作参数改为全局对象:struct.h 在 struct RDP_parameter 之后新增 extern RDP_parameter rdp_parameter;(声明位于 struct.h:285),data_process.cpp 定义并零初始化(L14);Data_Process 删除 RDP_parameter rdp_parameter 成员(data_process.h 保留注释说明);parameters_reload() 改为直接调用 rdp_parameter_load(path, rdp_parameter, &error)(loader 仅在校验全部通过后写入,失败不写入,「失败保持当前参数」语义不变);删除处理模块(kalman 11 个方法、dot_coh/dot_coh_tas、track_asso 系列、track_init 系列、track_die 系列、track_index_mangement、tas_ctrl,共 12 个模块的 24 个 .h/.cpp 文件)全部 const RDP_parameter& rdp_parameter 形参与调用实参,函数体内 rdp_parameter.<field> 一处未改、现直接解析全局对象;接口签名/公式/阈值/数值行为不变;全局对象为 DLL 内单实例、非线程安全(配置重载须与处理互斥,见 BUG-03/BUG-13)。验证(Lead 实测,2026-10-27):4 配置(Release/Debug × REC_OFF/REC_ON)重建成功、0 warning 0 error;DLL 体积 Release REC_OFF 331,264 / Release REC_ON 1,652,736 / Debug REC_OFF 1,715,200 / Debug REC_ON 4,691,968 字节;导出表仍 31 项(parameters_reload 在列、全局 rdp_parameter 不导出);加载器单测 233 项断言、公开接口运行期测试 4 配置 × 38 项断言全部通过;静态检查处理模块已无 const RDP_parameter& 形参(仅 loader 内部 validate_parameter 保留)。详见 CHANGELOG [Unreleased] |
| 工作区(构建脚本适配机扫/相扫合并,未提交) | 构建不再区分 PHASE_SCANNING / MECHANICAL_SCANNING:CMakeLists.txt 删除 RADAR_SCAN_MODE 缓存变量与体制编译宏;构建目录改为 build/<Debug|Release>/<REC_AUTO|REC_OFF|REC_ON>(去掉 PS/MS 维度);config_paths.bat/configure.bat/build.bat/clean.bat 参数改为 <Debug|Release> [AUTO|ON|OFF],新增 build_config.bat(单配置配置+构建,取代 build_all.bat),clean_all.bat 同时清理旧版 build/X256_PS、build/X256_MS;tasks.json 5 个任务改为「清理全部」+ 4 个「配置并构建(...)」;settings.json(buildDirectory 去掉 scanMode 维度)、cmake-variants.yaml(移除 scanMode 变体)、c_cpp_properties.json(合并为单个 X256 配置)、launch.json 同步。验证:5 个任务返回 0,4 种配置(Release/Debug × REC_OFF/REC_ON)0 warning 0 error,编译命令无体制宏,增量重建 0 编译步骤 |
423c200 / 019af7a(参数配置方式改造 + 机扫/相扫版本合并) |
参数配置方式改造:TOML 配置文件 → RDP_parameter。新增 rdp_parameter_loader.h/.cpp(严格校验 11 个配置段、标量键必填、类型/范围校验、未知段/键拒绝、屏蔽区数组长度等于 *_num,失败 -1 且不改变当前参数)与示例 config/config_tmp.toml;内置 toml++ v3.4.0 单头文件 third_party/toml/toml.hpp;公开头删除 struct RadarPara 与 track_process_parameters_initial/modify,新增 virtual int parameters_reload(const char*)(Data_Process 实现为加载成功后整体替换 rdp_parameter;后于本工作区的「全局工作参数对象改造」改为写入全局对象);data_process.h 删除 Work_Parameter,各模块(kalman 11 个方法、dot_coh、dot_coh_tas、track_asso(_tas/_direct_tracking)、track_init(_direct_tracking)、track_die(_tas)、track_index_mangement、tas_ctrl)改为 const RDP_parameter& rdp_parameter(后于本工作区的「全局工作参数对象改造」删除该形参、改为直接访问全局对象),宏与旧字段按映射等价替换;新增配置项 scan_mode(0 相扫 / 1 机扫),data_process.cpp 的 TWS 判圈由编译期 #ifdef PHASE_SCANNING 改为按 scan_mode 运行时选择(行为逐分支等价);019af7a 进一步把机扫/相扫合并为同一份代码与同一份构建(版本号 1.5.9、VERSION_INFO 改为 GENERIC,PHASE_SCANNING/MECHANICAL_SCANNING 不再参与任何功能);parameters.h 仅保留 PI、版本/日志/记录宏、MAX_TRACK_NUM、RDP_TAS_QUEUE_CAPACITY、Round(UNCONF_TARGET 已删除,起批处 Target_Type 直接写 0);track_index_mangement 航迹号表改按 track_index_max 分配,TAS 队列容量用 RDP_TAS_QUEUE_CAPACITY、运行期上限用 tas_track_num_max,波束类型用 default_track_beam_type。验证(Lead 实测,2026-10-27):合并前 8 配置、合并后 4 配置均 0 warning 0 error;Release REC_OFF DLL 331,776 字节、Debug REC_ON 4,694,528 字节、导出表 31 项(新增 parameters_reload,旧参数接口与 RadarPara 符号消失);加载器单测 233 项断言、公开接口运行期测试(含判圈运行时切换)全部通过;RDP_parameter 成员 / 加载器键 / TOML 键均为 63 个,11 个配置段不变。详见 CHANGELOG [Unreleased] |
1ffb287 |
增加航迹质量记录到数据库:RdpRecTempTrack 增 quality,RdpRecTrustTrack 增 Quality/Unupdated_time/Point_sum/Valid_point_sum 并同步注册 |
6284f3f |
修改 TAS 模式高度平滑点数:track_asso_tas.cpp 分段偏移 +2/+3/+4/+6 → +6/+8/+10/+12,相扫 H_F_WIN_LEN 3→6(相扫 TAS 窗口 12/14/16/18、机扫 9/11/13/15;TWS 相扫随之 8/9/10/12) |
5d105d2 |
修改相扫模式下 TAS 航迹消亡圈数:TRACK_DIE_ROUND_TAS 10→20(机扫保持 96),相扫 TAS 实际连续 21 圈无实点才消亡 |
17a3d99 |
数据记录调试功能性能优化:rdp_record.h 新增 Stats/stats() 与 6 个异步入队接口及对应宏(旧 RDP_RECORD/RDP_RECORD_BATCH 保留为遗留同步接口);Init() 启动异步写线程,处理线程只入队、实体构造与批量事务由写线程完成;有界队列(64 MB / 4096 批,满则丢弃并计数);WAL + synchronous=OFF + 8 MB 缓存 + 去除 AUTOINCREMENT;写失败每表提示一次、连续 10 次熔断;Shutdown() 排空后 wal_checkpoint(TRUNCATE);12 个记录点改为「收集 → 一次入队」,记录行数与表列不变;parameters.h 新增 10 个可调宏。验证与完整条目见 CHANGELOG [Unreleased] |
3dee734 |
优化配置构建脚本:构建目录改为按完整配置隔离 build/<X256_PS|X256_MS>/<Debug|Release>/<REC_AUTO|REC_OFF|REC_ON>;新增 config_paths.bat(目录推导与参数校验)、build_all.bat(两种扫描体制依次配置+构建)、clean_all.bat(清理全部配置);configure.bat/build.bat/clean.bat 参数改为「扫描体制 + 构建类型 + 记录模式」并自动推导目录;tasks.json 原有 15 个任务全部删除,仅保留 5 个任务(清理全部 + Release/Debug × REC_OFF/REC_ON 的「配置并构建全部」);settings.json/cmake-variants.yaml/c_cpp_properties.json/launch.json 同步;验证:5 个任务实际执行均返回 0,8 种配置(PS/MS × Release/Debug × REC_OFF/REC_ON)0 warning、0 error,产物位于各配置目录的 bin/、lib/(该 PS/MS 双构建布局已由工作区的「构建脚本适配机扫/相扫合并」取代) |
| 3088ce4(V1.5.8 版本号来源) | 更新版本号至 V1.5.8(PATCH_VERSION 7→8) |
782bff5 |
调整航迹质量下降逻辑(改为按未更新时长的二次函数衰减,系数 −0.0008 / −0.0025);普通 TWS 航迹消亡条件改为由航迹质量确定(Quality < TRACK_DIE_QUALITY = 0.3),重点航迹与 TAS 仍按外推圈数 |
4b70b24 |
航迹质量下降策略改为按点迹未更新时间计算:Trust_Track 新增 Unupdated_time,外推 ΔT 计算移到外推上限判断之外,超限后质量继续下降 |
d9a7bd0 |
优化临时航迹质量评估(L=3 时取三点平均 SNR 并写满三点,L>3 只对末点指数平滑);航迹起始增加按长度分级的质量门限(L3~L7:0.7/0.6/0.5/0.4/0.3) |
1ae0cf2 |
增加航迹质量:Track 新增 Quality(×100 输出 0~100)、Trust_Track 新增 Quality/Point_sum/Valid_point_sum、Temp_track 新增 quality;起批时初始化质量,关联实点时按「距离+SNR+有效点占比」加权更新 |
3e6763c |
扫描一圈完成判据按体制区分:相扫比较前后两帧方位波位号(Beam_index_aiz <= last_beam_num 判满圈、last_beam_num 重新参与判断),机扫保持「方位波位号 == 0」(避免转台反转误判) |
b4aed8a |
回调 TWS 外推时间差计算方法:ΔT 由「按最新时间戳实时计算」恢复为按 work_mode 取 DATA_RATE_SHORT/MIDDLE/FAR 固定值,避免 TAS 工作时同步外推出 TWS 航迹;同时把版本号置为 1.5.7(未单独发布);实时计算代码与 latest_timestamp 形参保留但不再参与计算 |
e982804 |
调整临时航迹记录时机:RdpRecTempTrack 的写入由 track_init_process_logic() 末尾移到转为可靠航迹之前,避免本圈起批的临时航迹转走后在记录中丢失当前帧数据 |
56b5449 |
(已被 b4aed8a 回调)TWS 外推 ΔT 改为按最新时间戳计算:track_asso_process()/model_filter() 新增 latest_timestamp 形参,ΔT 取 (latest_timestamp − T_track)/1000 且 ΔT ≤ 0 时跳过 |
5cb67cc |
增加 TAS 航迹信息与 TAS 关联信息记录:track_asso_tas.cpp 的输出环节记录 RdpRecTrustTrack、关联环节改用全局 Asso_Info 并记录 RdpRecAssoInfo;Asso_Info/RdpRecAssoInfo 新增 tas_flag 区分 TWS/TAS 来源 |
| b227ae1(V1.5.6 版本号来源) | 数据处理增加版本号输出:parameters.h 新增版本宏(MAJOR_VERSION/MINOR_VERSION/PATCH_VERSION = 1.5.6、体制后缀 VERSION_INFO、拼装宏 VERSION_STRING),基类新增公开成员 const char* version_info 并由 GetB() 赋值;Debug 下记录可靠航迹与关联信息:struct.h 新增全局 Asso_Info(含 min_d_flag 与门限量)、Trust_Track 新增 track_id/point_id/circle_id 与极坐标量快照 Range/Azimuth/Elevation/Velocity,新增 RdpRecTrustTrack/RdpRecAssoInfo 两张表并在 track_asso.cpp 输出循环与关联三处埋点,移除 data_process.cpp 中按输出数组批量记录的旧示例(RdpRecTrackOut 实体注释停用);track_asso.cpp 的 ΔT 分支改写为 if (delta_T > 0)(行为等价) |
c3c7e66 |
增加临时航迹录入数据库(新增 RdpRecTempTrack 表与 track_init.cpp 记录点)、输入点迹增加圈 ID(PointRecv::circle_id、Data_Process::circle_id 在满圈/TAS 帧末自增);Temp_track 字段更名(snr→SNR、Amp→amplitude、T→CPI_time、Temp_track_section_idx→temp_track_section_idx)并新增 temp_track_id/point_id/circle_id/pitch_num;临时航迹起批时把 ID 透传给 Trust_Track |
a4f32e4 |
新增数据记录功能:把过程数据录入数据库(凝聚后点迹 RdpRecPointCohesionTWS/TAS,输入点迹改为 RdpRecPoint)、data_process.h 新增 point_id/frame_id/circle_id 计数、dot_coh/dot_coh_tas 埋记录点;(该提交同时把上一轮的 CMake/工具链与记录框架改动一并提交,内容见下方「工作区(未提交…)」两条) |
| 工作区(已随本次发布归档,数据记录调试功能) | 新增可选编译的数据记录调试功能:CMake 缓存变量 RDP_DATA_RECORD(AUTO/ON/OFF,AUTO = Debug 启用 / Release 关闭)与独立静态库 rdp_record(以 C++20 编译,雷达代码保持 C++17);内置第三方源码 third_party/ormpp(ormpp 0.2.0 + iguana 1.0.5 + frozen + SQLite 3.49.1 amalgamation,附 UPSTREAM.md);新增 rdp_record.h(Init/Shutdown/db_path + RDP_RECORD/RDP_RECORD_BATCH 宏,关闭时展开为空操作)、rdp_record_entity.h(记录实体定义区)与 rdp_record.cpp(实体注册区、按实体自动建表、单条/批量写入、失败降级);Data_Process_Factory::GetB()/Destroy() 调用 rdp_record::Init()/Shutdown();parameters.h 新增 RDP_RECORD_DB_DIR(.\rdp_records\);configure.bat 新增第 4 个参数(AUTO/ON/OFF);.gitignore 增加 rdp_records/;新增 docs/data_record_debug.md。验证:Release(PS/MS)导出表与依赖表与改动前逐行一致、DLL 体积不变(178,688 / 178,176 字节)、构建树无记录模块目标文件;Debug(PS/MS,AUTO→启用)0 warning 0 error;运行时校验(临时程序 + Python sqlite3)确认建库、一实体一表、批量事务写入、id 自增、取值一致、integrity_check = ok,且记录目录不可创建时接口照常返回、仅提示一次 |
| 工作区(已随本次发布归档) | 编译器由 MSVC 2013(Visual Studio 12,x86)升级为 MSVC 2022(v143,x64)、C++ 标准提升至 C++17:CMakeLists.txt 重写(CMAKE_CXX_STANDARD 17、_MSC_VER >= 1930 强校验、/utf-8 /Zc:__cplusplus /W3)、.vscode/scripts/ 全部构建脚本改为 MSVC 2022(新增共享的 msvc_env.bat,configure.bat 自动清理旧工具集构建树)、VS Code 配置同步(settings / c_cpp_properties / cmake-variants / tasks 改为 MSVC2022 x64 + C++17)、修复 MSVC 2022 新增的 17 处 C4267 窄化告警;X256_PS/X256_MS × Release/Debug 四种配置均 0 warning 0 error 通过,产物为 x64 DLL(导出符号与升级前一致,仅名称修饰随架构变化) |
e8c56f9 |
输入/输出结构适配「归一化幅度」与「速度维 FFT 点数」:DataRev 新增 amp_asv/prn_fftn,Track 新增 amp_asv_point/prn_fftn_point,内部 PointRecv/Trust_Track 同步新增字段;track_asso.cpp 关联实点时写入航迹、TWS 输出时写回输出结构(TAS 侧未打通,见 11.2) |
42b598e |
调整「向站/背站」判断条件:判据由 acos((-x·vx − y·vy)/r/Range_V) < π/4 改为 acos((-x·cos(Direction_Angle) − y·sin(Direction_Angle))/r) < π/2(去掉按合速度归一化,锥角门限由 45° 放宽到 90°),TWS/TAS 同步 |
fc49707 |
「向站/背站」判断改用滤波速度矢量:Flag_Direction 不再取 vr_point > 0(实测径向速度受多普勒模糊影响、符号可能取反),改按航迹 IMM 速度方向与位置矢量的夹角判定(TWS/TAS 同步);primary_target_add/cancel、tracking_start/stop 命中目标后 break;删除 TWS 输出循环中的注释残留代码块 |
50e0b5c |
新增手动重点目标接口(primary_target_add/primary_target_cancel + Trust_Track::primary_target_flag)与重点航迹消亡圈数 TRACK_DIE_ROUND_PRIMARY(10);输出航迹改为只输出 Track_Update_Flag==1 的本圈更新航迹;未关联航迹外推限制在 MAX_EXTRAPOLATE_NUM(3)圈内,TAS 侧新增 MAX_EXTRAPOLATE_NUM_TAS(相扫 5 / 机扫 48);TRACK_DIE_ROUND 由 4 调整为 6、TRACK_DIE_ROUND_TAS 相扫由 5 调整为 10,消亡判据改为 >;同步更新 README/CHANGELOG/docs |
e0bf227 |
关联判定重构并加强:TWS track_asso.cpp 新增按航迹距离分段的高度门限(原高度门限代码块为注释状态)、统计距离/高度/距离三类判据拆为 thd_d/thd_h/thd_r 布尔量;parameters.h 的 ASSO_THORD 由 3 调大至 4(等效门限 d < 4,提高机动目标关联概率);TAS track_asso_tas.cpp 高度门限 2000~3000 m 段由 200 m 放宽至 250 m;修复 tas_beam_output() 的数据率门控条件(去掉与「取最早 CPI 目标」冲突的 T_track 判据);删除 docs/data_process_flow_report.html;.gitignore 增加 design_docs/;同步更新 README/CHANGELOG/docs |
f249fdc |
输出航迹新增「靠近/远离」方向标志:track_asso.cpp(TWS)与 track_asso_tas.cpp(TAS)在写入 vr_point 后补 Flag_Direction = vr_point > 0 ? 1 : 0;新增 docs/data_process_flow_report.md、docs/data_process_flow_report.html、docs/track_init_readme.md 三份流程与专项文档(其中 HTML 版已于 e0bf227 删除) |
7d5a56f |
满圈判据由「波位号变小」改为「方位波位号 == 0」(避免机扫转台反转误判,data_process.cpp);点-航迹头关联改为统一速度区间 V_MIN·ΔT ≤ dis ≤ V_MAX·ΔT 并新增 `dis ≥ |
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 的问题(该日志实现——std::cout 重定向 + 流式 RDP_LOG 宏——已于「工作区(日志组件改为 spdlog,未提交)」改为 spdlog);更新 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.md,README 补充相应说明 |
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 提交记录维护) |
| docs/data_process_flow_report.md | 数据处理流程与关键逻辑说明(按当前源码整理:前处理与判圈、凝聚、TWS/TAS 关联与滤波、航迹起始、外推消亡、TAS 波束控制、参数脉络;参数来源已同步为 TOML → RDP_parameter;含与本文档的历史差异提示)——原同内容 HTML 渲染版(data_process_flow_report.html)已于 e0bf227 删除,HTML 版本在 git 忽略的 design_docs/ 内留档 |
| docs/track_init_readme.md | 航迹起始(Track Init)专项说明:分阶段流程、起始条件汇总、调参直觉、输出字段映射(含未赋值字段)、已知风险与代码索引 |
| docs/data_record_debug.md | 数据记录调试功能说明:开关与构建(RDP_DATA_RECORD、C++20 隔离与 C 编译器要求、关闭时零代码依据)、运行期行为(异步写线程、有界队列与丢弃、批事务参数、WAL/PRAGMA、去 AUTOINCREMENT、失败降级与熔断、Shutdown 排空与统计、Destroy→GetB 重连)、记录实体(表)约定、新增记录点四步配方(实体→异步入队接口/宏→写线程分支→业务侧收集调用)、当前 6 张在用记录表与记录点清单(含新宏与 file:line)、查询示例、已知限制与验收参考 |
| third_party/ormpp/UPSTREAM.md | 内置第三方源码的来源说明:ormpp / iguana / frozen / SQLite 版本、许可证、复现与升级步骤(含 blob 校验值) |
| third_party/spdlog/UPSTREAM.md | 内置第三方日志库来源说明:spdlog v1.17.0(commit 79524dd,MIT)与随库内置的 {fmt} 12.1.0 的版本/校验值、复现与升级步骤、静态库编译方式、SPDLOG_ACTIVE_LEVEL 编译期级别与告警隔离约束 |
| archived_docs/BUG_REPORT.md | 全量逻辑 BUG 分析(P0~P3 共 37 项,含位置、说明、建议、处置结论)——过期留档,仅作历史参考 |
| archived_docs/BUG_FIX_REPORT.md | 修复明细、修复状态汇总表与 MSVC 2013 x86 编译验证记录——过期留档(对应 01d28e0 时期) |
| requirements.md | 修改需求说明:日志组件 rdp_log 改为使用 spdlog(日志同时输出到标准输出与日志文件、路径与文件名规则沿用 .\rdp_logs\ + 日期+时间、每次启动一个文件;RDP_LOG 宏按 spdlog 级别改为 RDP_LOG_TRACE / RDP_LOG_DEBUG / RDP_LOG_INFO / RDP_LOG_WARN / RDP_LOG_ERROR / RDP_LOG_CRITICAL;原 RDP_LOG_ENABLE 改为用 SPDLOG_ACTIVE_LEVEL 在编译期控制日志级别)——已按该说明实现(见 4.3、5.2、10.4);此前 requirements.md 中的雷达参数配置方式改造需求、以及更早的数据记录调试功能需求亦已实现,分别见 10 与 docs/data_record_debug.md(旧的日志文件输出需求已由本次 spdlog 改造取代,见 12 的 1521592 行) |
| config/config_tmp.toml | 参数配置样例(TOML,11 个配置段、63 个键与 RDP_parameter 成员一一对应,样例为相扫取值(scan_mode=0);机扫差异项见 10.1 兼容性提示)——参数表见 10.2 |
| third_party/toml/toml.hpp | 内置 toml++ v3.4.0 单头文件(MIT,上游原样保存);仅参数加载器 rdp_parameter_loader.cpp 以 #pragma warning(push, 0) 包裹使用,来源与许可证信息见文件头 |
| backup/data_process_class_dll/data_process_class_dll.pro | 迁移前的 Qt/qmake 工程文件(源文件清单参考) |
| .vscode/tasks.json、.vscode/cmake-variants.yaml、.vscode/scripts/*.bat | VS Code 任务、构建变体与构建脚本(构建目录布局见 4.3) |
| build/<Debug|Release>/<REC_*>/bin/RadarConfigParam.ini | 回放测试工具(rdp_playback.exe)配置样例(需自行放置) |