diff --git a/CHANGELOG.md b/CHANGELOG.md index 6151a09..2ef9efc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,10 +29,12 @@ ### Changed +- **工作参数改为全局对象(全局工作参数对象改造,工作区未提交)**:`struct.h` 在 `struct RDP_parameter` 之后新增 `extern RDP_parameter rdp_parameter;`(附注释:所有处理模块直接访问、定义在 `data_process.cpp`、由 `parameters_reload()` 在配置完整校验通过后整体赋值、处理期间只读、配置重载应与处理互斥);`data_process.cpp` 定义并零初始化 `RDP_parameter rdp_parameter{};`(当前 L14);`Data_Process` 删除 `RDP_parameter rdp_parameter` 成员(`data_process.h`,保留注释说明工作参数为全局对象);`parameters_reload()` 改为直接调用 `rdp_parameter_load(parameter_file_path, rdp_parameter, &error)`——loader 仅在全部校验通过后写入目标对象,失败不写入,故「失败保持当前参数」语义不变。删除各处理模块(`kalman` 11 个方法、`dot_coh`/`dot_coh_tas`、`track_asso`/`track_asso_tas`/`track_asso_direct_tracking`、`track_init`/`track_init_direct_tracking`、`track_die`/`track_die_tas`、`track_index_mangement`、`tas_ctrl`,共 12 个模块的 24 个 .h/.cpp 文件)全部 `const RDP_parameter& rdp_parameter` 形参及调用实参,函数体内 `rdp_parameter.` 表达式一处未改、现直接解析到全局对象;公开接口签名、公式、阈值与数值行为均不变。**注意**:全局对象是 DLL 内单实例可变状态,`parameters_reload()` 与处理调用之间非线程安全(与 BUG-03 的线程模型约定一致,宿主应按单线程接口使用、重载配置时不得并发处理)。 +- **本次全局工作参数对象改造的验证(Lead 实测,2026-10-27)**:① 构建:4 个配置(Release/Debug × REC_OFF/REC_ON;机扫/相扫已合并为单一构建)全部成功、退出码 0、**0 warning / 0 error**。② DLL 体积:Release REC_OFF 331,264 B(较改造前 331,776 B 略减 512 B)、Release REC_ON 1,652,736 B、Debug REC_OFF 1,715,200 B、Debug REC_ON 4,691,968 B。③ 导出表(Release REC_OFF,共 31 项):`parameters_reload` 仍在列(`?parameters_reload@Data_process_class_dll@@UEAAHPEBD@Z`);全局对象 `rdp_parameter` 未导出(DLL 内部符号),宿主接口不变。④ 加载器单元测试 233 项断言全部通过(加载器接口未变)。⑤ 公开接口运行期测试:4 配置逐一编译链接运行,各 38 项断言全部通过(TWS/TAS 主流程冒烟、`parameters_reload` 成功/失败、`scan_mode` 判圈运行时切换、`Destroy()`→`GetB()` 重连等)。⑥ 静态检查:处理模块已无 `const RDP_parameter&` 形参(仅 `rdp_parameter_loader.cpp` 的 `validate_parameter(const RDP_parameter&, ...)` 校验辅助函数保留);全局对象声明在 `struct.h:285`、定义在 `data_process.cpp:14`;所有模块内 `rdp_parameter` 仅以 `.field` 表达式出现;`data_process.cpp` 仅有的传参是 `parameters_reload()` 中的 `rdp_parameter_load(..., rdp_parameter, ...)`。⑦ 记录点当前行号:TWS `RDP_RECORD_POINTS` 在 `data_process.cpp:75`、TAS 分支在 `data_process.cpp:153`。验证程序与日志位于 git 忽略的构建目录中,未入库。 - **TWS 判圈改由配置项 `scan_mode` 运行时选择(参数配置方式改造)**:`data_process.cpp::data_preprocess()` 原用 `#ifdef PHASE_SCANNING / #else / #endif` 在编译期隔离两套判圈代码,现改为按 `rdp_parameter.scan_mode` 运行时选择——`scan_mode==0`(相扫)判 `Beam_index_aiz <= last_beam_num`,`scan_mode==1`(机扫)判 `Beam_index_aiz == 0`;两种情况都会更新 `last_beam_num`、仅判满圈时 `circle_id++` 并返回 1。行为与旧两套编译期分支**逐分支等价**(相扫首帧因 `last_beam_num` 初值 INT_MAX 仍判满圈;机扫仍以波位号 0 判满圈)。`PHASE_SCANNING` / `MECHANICAL_SCANNING` 宏与 `RADAR_SCAN_MODE` 缓存变量随后在「机扫/相扫版本合并」中一并移除(见 Removed),构建不再区分体制;判圈只由配置项 `scan_mode` 决定。 -- **本次 `scan_mode` 改动的验证(Lead 实测,2026-10-27,机扫/相扫合并前)**:① 构建:8 个配置(X256_PS/X256_MS × Release/Debug × REC_OFF/REC_ON)全部重建成功、退出码 0、0 warning 0 error;Release REC_OFF DLL 仍为 331,776 字节、Debug REC_ON 4,694,016 字节(与 `scan_mode` 改动前一致)。② 加载器单元测试 233 项断言全部通过:新增覆盖「样例 `scan_mode=0` 取值正确」「`scan_mode=2` 时加载返回 -1 且错误信息包含 `scan_mode`」,其余既有成功/失败路径(缺文件、语法错、缺键、类型错、未知键、缺段、越界、数组长度不符等)保持通过。③ 公开接口运行期测试(8 配置逐一编译链接运行)各 38 项断言全部通过(原 29 项 + 新增 9 项判圈运行时切换断言):同一份二进制加载样例(`scan_mode=0` 相扫)后波位号 24 → `data_preprocess` 返回 1(判满圈);加载临时配置(`scan_mode=1` 机扫)后波位号 24 → 返回 2、波位号 0 → 返回 1;再切回样例配置并清空后行为一致;PS 与 MS 构建的测试结果相同,证明判圈已完全由配置决定。④ 静态检查:`data_process.cpp` 中 `PHASE_SCANNING`/`MECHANICAL_SCANNING` 已无有效代码引用(仅注释性提及);宏仍存在于 `parameters.h`(`VERSION_INFO` / `#pragma message`)与 `CMakeLists.txt`(`RADAR_SCAN_MODE` 编译定义、构建目录/任务命名);`RDP_parameter` 成员数 = 加载器键数 = TOML 键数 = **63**(新增 `scan_mode` 后),11 个配置段不变。⑤ 记录点当前行号:TWS `RDP_RECORD_POINTS` 在 `data_process.cpp:72`、TAS 分支在 `data_process.cpp:150`。验证程序与日志位于 git 忽略的构建目录中,未入库。 -- **参数来源改为「TOML 配置文件 → `RDP_parameter`」(参数配置方式改造,工作区未提交)**:原先「宿主下发 `struct RadarPara` + `parameters.h` 编译期宏」两条参数来源统一为运行期配置文件;`struct.h::RDP_parameter` 成为工作参数唯一来源,由 `Data_Process::rdp_parameter{}`(零初始化)持有,`parameters_reload()` 成功后才整体替换。改造只替换参数来源,不改变公式、阈值语义与处理流程,默认数值与改造前一致。 -- **各模块参数传递方式(参数配置方式改造)**:`kalman`(使用量测误差/频点的 11 个方法:`kalman_filter_init_2dots`、`d_cal_track_init`、`kalman_filter_init_3dots`、`d_cal`、`d_cal_EKF`、`d_cal_with_doppler`、`kalman_filter_EKF`、`kalman_filter`、`d_cal_track_init_EKF`、`d_cal_track_init_with_doppler`、`Bind_speed`)、`dot_coh`/`dot_coh_tas`、`track_asso`/`track_asso_tas`/`track_asso_direct_tracking`、`track_init`/`track_init_direct_tracking`、`track_die`/`track_die_tas`、`track_index_mangement`、`tas_ctrl` 的入口与内部函数新增 `const RDP_parameter& rdp_parameter` 形参(原按值传递的 `struct RadarPara Work_Parameter` 全部删除);无参数依赖的 `kalman_pred` 保持原签名。 +- **本次 `scan_mode` 改动的验证(Lead 实测,2026-10-27,机扫/相扫合并前)**:① 构建:8 个配置(X256_PS/X256_MS × Release/Debug × REC_OFF/REC_ON)全部重建成功、退出码 0、0 warning 0 error;Release REC_OFF DLL 仍为 331,776 字节、Debug REC_ON 4,694,016 字节(与 `scan_mode` 改动前一致)。② 加载器单元测试 233 项断言全部通过:新增覆盖「样例 `scan_mode=0` 取值正确」「`scan_mode=2` 时加载返回 -1 且错误信息包含 `scan_mode`」,其余既有成功/失败路径(缺文件、语法错、缺键、类型错、未知键、缺段、越界、数组长度不符等)保持通过。③ 公开接口运行期测试(8 配置逐一编译链接运行)各 38 项断言全部通过(原 29 项 + 新增 9 项判圈运行时切换断言):同一份二进制加载样例(`scan_mode=0` 相扫)后波位号 24 → `data_preprocess` 返回 1(判满圈);加载临时配置(`scan_mode=1` 机扫)后波位号 24 → 返回 2、波位号 0 → 返回 1;再切回样例配置并清空后行为一致;PS 与 MS 构建的测试结果相同,证明判圈已完全由配置决定。④ 静态检查:`data_process.cpp` 中 `PHASE_SCANNING`/`MECHANICAL_SCANNING` 已无有效代码引用(仅注释性提及);宏仍存在于 `parameters.h`(`VERSION_INFO` / `#pragma message`)与 `CMakeLists.txt`(`RADAR_SCAN_MODE` 编译定义、构建目录/任务命名);`RDP_parameter` 成员数 = 加载器键数 = TOML 键数 = **63**(新增 `scan_mode` 后),11 个配置段不变。⑤ 该轮记录点行号:TWS `RDP_RECORD_POINTS` 在 `data_process.cpp:72`、TAS 分支在 `data_process.cpp:150`(全局工作参数对象改造后变为 `:75` / `:153`,见本区上方新增验证)。验证程序与日志位于 git 忽略的构建目录中,未入库。 +- **参数来源改为「TOML 配置文件 → `RDP_parameter`」(参数配置方式改造,工作区未提交)**:原先「宿主下发 `struct RadarPara` + `parameters.h` 编译期宏」两条参数来源统一为运行期配置文件;`struct.h::RDP_parameter` 成为工作参数唯一来源,初始由 `Data_Process::rdp_parameter{}`(零初始化)持有,`parameters_reload()` 成功后才整体替换(**后于「全局工作参数对象改造」改为 `struct.h::rdp_parameter` 全局对象,见本区上方**)。改造只替换参数来源,不改变公式、阈值语义与处理流程,默认数值与改造前一致。 +- **各模块参数传递方式(参数配置方式改造)**:`kalman`(使用量测误差/频点的 11 个方法:`kalman_filter_init_2dots`、`d_cal_track_init`、`kalman_filter_init_3dots`、`d_cal`、`d_cal_EKF`、`d_cal_with_doppler`、`kalman_filter_EKF`、`kalman_filter`、`d_cal_track_init_EKF`、`d_cal_track_init_with_doppler`、`Bind_speed`)、`dot_coh`/`dot_coh_tas`、`track_asso`/`track_asso_tas`/`track_asso_direct_tracking`、`track_init`/`track_init_direct_tracking`、`track_die`/`track_die_tas`、`track_index_mangement`、`tas_ctrl` 的入口与内部函数新增 `const RDP_parameter& rdp_parameter` 形参(原按值传递的 `struct RadarPara Work_Parameter` 全部删除);无参数依赖的 `kalman_pred` 保持原签名(**后于「全局工作参数对象改造」删除这些形参、改为直接访问全局对象,见本区上方**)。 - **旧宏与旧 `RadarPara` 字段的等价替换(参数配置方式改造)**:如 `SIGMA_R/A/E/V`→`sigma_range/azimuth/pitch/velocity`、`DOT_COH_RANGE/V/AZI`→`point_cohesion_range/velocity/azimuth`、`R_MIN/R_MAX`→`point_cohesion_range_min/max`、`FREQ0`→`freq_0_GHz`、`ASSO_THORD`→`associate_threshold`、`MAX_EXTRAPOLATE_NUM(_TAS)`→`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(_PRAMARY)/TRACK_DIE_ROUND(_PRIMARY/_TAS)`→`track_die_quality(_pramary)/track_die_round(_pramary/_tas)`、`TRACK_QUALITY_*`→`track_quality_*`、`work_mode/Height/Sys_delay`→`radar_work_mode/radar_height/radar_system_delay`、`track_start_point_num`→`track_init_point_num_min`、`V_MAX/V_MIN`→`track_init_velocity_max/min`、`track_prohibite_area_*`→`track_init_prohibite_area_*`、`TAS_prohibite_area_*`→`tas_prohibite_area_*`、`Model1/2/3_Q_fast/slow`→`model_1/2/3_Q_fast/slow`、`DATA_RATE_SHORT/MIDDLE/FAR`→`data_rate_tws`(契约确认的等价改法)、`DATA_RATE_TAS`→`data_rate_tas`;完整对照见 `README.md` 10.3 节。 - **航迹号、TAS 队列与跟踪波束类型改为按配置分配(参数配置方式改造)**:`track_index_mangement.cpp` 的定长数组 `int List[MAX_TRACK_INDEX]` 改为按 `rdp_parameter.track_index_max` 分配的 `std::vector`;TAS 队列固定容量改用编译期常量 `RDP_TAS_QUEUE_CAPACITY`(30),运行期同时跟踪目标数上限改用配置项 `tas_track_num_max`(加载器校验 0~30,原 `MAX_TAS_NUM` 相扫 4 / 机扫 1);跟踪波束 `Tracking_beam->type` 由硬编码 1 改为配置项 `default_track_beam_type`。 - **`parameters.h` 精简为编译期常量(参数配置方式改造)**:删除全部雷达工作参数宏,仅保留 `PI`、版本宏(`MAJOR_VERSION`/`MINOR_VERSION`/`PATCH_VERSION`/`VERSION_INFO`/`VERSION_STRING`)、日志宏(`RDP_LOG_*`)、记录宏(`RDP_RECORD_*`)、接口容量常量 `MAX_TRACK_NUM`(500)/`RDP_TAS_QUEUE_CAPACITY`(30)与 `Round`;`requirements.md` 同时改写为本次参数配置方式改造的需求说明。 @@ -51,6 +53,7 @@ ### Fixed +- 文档同步「全局工作参数对象改造」改动(本次文档更新):README 3/4.4/5.1/5.2/6.2/7.1/10.1/11.2/12 节、`docs/data_process_flow_report.md` 第 9 节、`docs/track_init_readme.md` 1.1/2.3/8.1~8.3/16.2 节、`docs/data_record_debug.md` 记录点行号——工作参数表述由「`Data_Process::rdp_parameter` 成员 / 函数形参逐层传入」改为「`struct.h::rdp_parameter` 全局对象(`data_process.cpp` 定义)」,同步删除文中传递实参的代码片段与表格行,记录点行号更新为 `data_process.cpp:75`(TWS)/ `:153`(TAS)。 - 文档同步「`scan_mode` 运行时判圈」改动(本次文档更新):README 1/2/3/4.2/7.2/8.1/10.1/10.2/10.3/10.4/11.2/12/13 节、`docs/data_process_flow_report.md` 2.2 与第 9 节、`docs/track_init_readme.md` 1.2 与输出字段表、`docs/data_record_debug.md` 记录点行号(`data_process.cpp:72` TWS / `:150` TAS)——判圈表述由「编译期 `PHASE_SCANNING`/`MECHANICAL_SCANNING` 隔离」改为「由配置项 `scan_mode` 运行时选择」,并同步 `UNCONF_TARGET` 宏删除后的语义写法。 - 修正文档中把参数来源写成「`parameters.h` 编译期宏 / 宿主下发 `RadarPara`」的过期描述(本次文档更新,对应参数配置方式改造):README 2、3、4.2、5.1、5.2、6.1、6.2、7.1、7.3、8.1~8.3、9.1~9.11、10、11、12、13 节与 `docs/data_process_flow_report.md` 第 9/10 节、`docs/track_init_readme.md` 第 1/2/4/6/8/10/11~16 节按源码同步——参数来源改为 TOML 配置文件 → `RDP_parameter`、旧宏改记为「原 …」并给出新字段名、新增 `parameters_reload` 调用方式与旧→新对照,数值未变。 - 修正文档中 TAS 航迹消亡圈数与高度平滑窗口的过期数值(本次文档更新):README 2/5.2/9.7/9.9/10.1 节与 `docs/data_process_flow_report.md` 4.6、6.1、9.1 节按 5d105d2、6284f3f 同步为「相扫 TAS 20 圈 / 机扫 96」、「相扫 H_F_WIN_LEN=6、TAS 偏移 +6/+8/+10/+12」。 diff --git a/README.md b/README.md index 1f1fc8c..bce6a5a 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ > > 版本号由 `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 配置文件**加载到内部 `RDP_parameter`,不再由宿主下发 `struct RadarPara`、也不再由 `parameters.h` 编译期宏配置(见 10)。 +> **工作参数来源(参数配置方式改造后)**:全部雷达工作参数由宿主调用 `parameters_reload(配置文件路径)` 从 **TOML 配置文件**加载到 DLL 内的**全局对象 `rdp_parameter`**(`struct.h` 中 `extern` 声明、`data_process.cpp` 中定义并零初始化),不再由宿主下发 `struct RadarPara`、也不再由 `parameters.h` 编译期宏配置;各处理模块直接访问该全局对象(见 5.1、10)。 --- @@ -50,7 +50,7 @@ | 坐标 | 直角坐标系 x/y 为水平面投影,z = 目标高度 + 雷达平台高度 | | 点迹类型 | point_type = 0 为 TWS,point_type = 1 为 TAS | | 跟踪模式 | Track_Mode = 0 为 TWS,Track_Mode = 1 为 TAS | -| 参数来源 | TOML 配置文件(`config/config_tmp.toml` 为样例)→ 内部 `struct RDP_parameter`,宿主通过 `parameters_reload()` 加载;参数对照见 10 | +| 参数来源 | 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) | --- @@ -121,9 +121,9 @@ │ ├── rdp_log.h / .cpp # 日志输出模块:rdbuf() 重定向 std::cout、RDP_LOG 宏(开关宏在 parameters.h) │ ├── 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)、清空/删除/转跟踪;含 point_id/frame_id/circle_id 自增计数(记录用) -│ ├── struct.h # 内部结构体:PointRecv / Trust_Track / Temp_track / Asso_Info / Tracking_Target / RDP_parameter(工作参数,与 TOML 配置一一对应) +│ ├── 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_*、RDP_RECORD_*、MAX_TRACK_NUM、RDP_TAS_QUEUE_CAPACITY、Round(不再含雷达工作参数宏;机扫/相扫合并后构建不再定义体制宏,版本串为 V1.5.9.GENERIC) │ ├── dot_coh.h / .cpp # TWS 点迹凝聚(含两帧滑窗缓冲) │ ├── dot_coh_tas.h / .cpp # TAS 点迹凝聚 @@ -236,7 +236,7 @@ VS Code 任务(`.vscode/tasks.json`)只保留以下 5 个(原有任务已 产物为 **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 的 `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)。 仓库 `build///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。 @@ -296,7 +296,6 @@ classDiagram -point_recv / point_recv_tas : vector PointRecv -trust_track : vector Trust_Track -temp_track : vector Temp_track - -rdp_parameter : RDP_parameter -dot_coh / dot_coh_tas / track_asso / track_asso_tas -track_init / track_die / track_die_tas / tas_ctrl } @@ -334,12 +333,14 @@ classDiagram 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.` 访问该对象,函数签名不再包含该参数。全局对象为 DLL 内**单实例可变状态**,处理期间只读;`parameters_reload()` 与处理调用之间**非线程安全**,宿主应按单线程接口使用、配置重载与处理互斥(与 BUG-03 一致,见 11.2)。 + ### 5.2 模块职责 | 类 / 文件 | 职责 | |---|---| -| Data_Process(data_process.cpp) | 对外接口实现与流程编排:输入缓存、按 model 分发 TWS/TAS 流水线、参数加载(`parameters_reload`:TOML → `rdp_parameter`)、航迹清空/删除、手动转/停 TAS、手动标记/取消重点目标(primary_target_add/cancel)、波束控制转发 | -| rdp_parameter_loader(rdp_parameter_loader.h/.cpp) | 参数加载器(内部模块):解析 TOML 并严格校验 11 个配置段/键集合/类型/取值范围/屏蔽区数组长度,全部通过后一次性写入 `RDP_parameter`;失败返回 -1 并给出首条原因、不改变入参(见 10.1) | +| 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(乱序/重复时间戳)的候选取出后不更新滤波、不刷新航迹,仅消费该点迹 | @@ -367,13 +368,13 @@ classDiagram | TrackingBeam | TAS 跟踪波束指令 | open_flag、type、Range、Azi、Elev、TAS_track_index | | Target_direct_tracking | 引导跟踪信息 | 批号、距离/方位/俯仰、开关(接口未启用) | -> 工作参数结构体 `RDP_parameter` 定义在内部头 `struct.h`,**不在公开头中导出**:宿主不再构造/下发参数结构体,改为通过 `parameters_reload(配置文件路径)` 把 TOML 配置加载进 DLL(参数含义见 10)。 +> 工作参数结构体 `RDP_parameter` 及全局对象 `rdp_parameter` 定义在内部头 `struct.h`(对象本身定义于 `data_process.cpp`),**不在公开头中导出**:宿主不再构造/下发参数结构体,改为通过 `parameters_reload(配置文件路径)` 把 TOML 配置加载进 DLL(参数含义见 10)。 ### 6.2 内部结构体(struct.h) | 结构体 | 用途 | 关键字段 | |---|---|---| -| RDP_parameter | 工作参数(唯一来源) | 按注释分组:雷达工作参数(`radar_work_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) | +| 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`) | @@ -396,7 +397,7 @@ classDiagram | 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()` 后立即调用一次,重连/换配置时再次调用即可热重载(见 10.1) | +| 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 波束控制(内部清零并重填航迹输出计数) | @@ -980,9 +981,12 @@ $$ ```text 宿主:GetB() → parameters_reload("config/config_tmp.toml") → data_preprocess / track_process / Beam_Ctrl ... (重连或切换配置时再次 parameters_reload 即可热重载;成功返回 0,失败返回 -1) -DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一次性赋值给 Data_Process::rdp_parameter +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` 的注释分组一一对应,**键名 = 结构体成员名**: | 配置段 | 内容 | @@ -1175,7 +1179,7 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一 - **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(参数初始化,已被本次改造改变)**:`Data_Process::rdp_parameter{}` 为零初始化,未加载配置时 `data_rate_tws`/`sigma_*` 等均为 0(非法)。宿主必须在**首次 `data_preprocess` 之前**调用 `parameters_reload()` 且确认返回 0;加载失败时保留的是上一次成功参数(首次失败则为全 0),DLL 不会自动纠正。 +- **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 删除,未恢复过滤)。 @@ -1217,14 +1221,15 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一 ## 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 消亡圈数与高度平滑调整、质量入库、参数配置方式改造、机扫/相扫版本合并与构建脚本适配),已记入 CHANGELOG 的 `[Unreleased]`,下表前列为其提交/工作区状态。 +当前代码版本:**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 消亡圈数与高度平滑调整、质量入库、参数配置方式改造、机扫/相扫版本合并与构建脚本适配、**全局工作参数对象改造**),已记入 CHANGELOG 的 `[Unreleased]`,下表前列为其提交/工作区状态。 近期提交(git log --oneline,新→旧;仅列代码改动,纯文档提交略): | 提交 | 内容 | |---|---| +| 工作区(全局工作参数对象改造,未提交) | **工作参数改为全局对象**:`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.` 一处未改、现直接解析全局对象;接口签名/公式/阈值/数值行为不变;全局对象为 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//`(去掉 PS/MS 维度);`config_paths.bat`/`configure.bat`/`build.bat`/`clean.bat` 参数改为 ` [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]` | +| 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 圈无实点才消亡 | diff --git a/config/config_tmp.toml b/config/config_tmp.toml index 980d5ab..84a9d16 100644 --- a/config/config_tmp.toml +++ b/config/config_tmp.toml @@ -10,7 +10,7 @@ [radar_params] # 工作模式:0 近程 / 1 中程 / 2 远程 radar_work_mode = 0 -# 扫描模式:0 相扫模式 / 1 机扫模式(决定 data_preprocess 判圈逻辑;版本后缀仍由构建体制决定) +# 扫描模式:0 相扫模式 / 1 机扫模式 scan_mode = 0 # 频点0频率(GHz) freq_0_GHz = 9.2 diff --git a/data_process_class_dll/data_process.cpp b/data_process_class_dll/data_process.cpp index 9f8bcd3..29f25fa 100644 --- a/data_process_class_dll/data_process.cpp +++ b/data_process_class_dll/data_process.cpp @@ -9,6 +9,9 @@ #include using namespace std; + +// 全局工作参数对象(声明见 struct.h)。所有处理模块直接访问,由 parameters_reload() 加载。 +RDP_parameter rdp_parameter{}; /*******************************************************************************/ /*******************************************************************************/ /************************************用户接口函数*******************************/ @@ -172,7 +175,7 @@ int model) if(model==2) { - dot_coh.dot_coh_process_buff(&Data_buffer,&point_recv,rdp_parameter); + dot_coh.dot_coh_process_buff(&Data_buffer,&point_recv); std::vector().swap(Data_buffer); } @@ -185,21 +188,18 @@ int model) &trust_track, Trust_Track_Output, Trust_track_num_Output, - latest_timestamp, - rdp_parameter + latest_timestamp ); track_die.track_die_process( &trust_track, Track_die_Index_Output, - Track_die_num_Output, - rdp_parameter); + Track_die_num_Output); track_init.track_init_process_logic( &point_recv, &trust_track, &temp_track, Trust_Track_Output, - Trust_track_num_Output, - rdp_parameter); + Trust_track_num_Output); } @@ -209,7 +209,7 @@ int model) *Trust_track_num_Output=0; //航迹更新数 *Track_die_num_Output=0; //航迹消亡数目 - dot_coh_tas.dot_coh_tas_process(&Data_buffer_tas,&point_recv_tas,rdp_parameter); //点迹凝聚 + dot_coh_tas.dot_coh_tas_process(&Data_buffer_tas,&point_recv_tas); //点迹凝聚 std::vector().swap(Data_buffer_tas);//凝聚完毕 清除Data_buffer @@ -217,7 +217,6 @@ int model) &trust_track, //航迹文件 Trust_Track_Output, //更新航迹信息 Trust_track_num_Output, //更新航迹数 - rdp_parameter, //工作参数 TAS_track_idx, latest_timestamp //最新时间戳 ); @@ -226,8 +225,7 @@ int model) track_die_tas.track_die_process_tas( &trust_track, Track_die_Index_Output, - Track_die_num_Output, - rdp_parameter); + Track_die_num_Output); //std::cout << "Extrapolate_round :" << trust_track[TAS_track_idx].Extrapolate_round; } @@ -241,21 +239,20 @@ void Data_Process::Beam_Ctrl(struct TrackingBeam *Tracking_beam, int *Trust_track_num_Output) { - tas_ctrl.tas_ctrl_process(&trust_track,Tracking_beam, Trust_Track_Output, Trust_track_num_Output,rdp_parameter, latest_timestamp); + tas_ctrl.tas_ctrl_process(&trust_track,Tracking_beam, Trust_Track_Output, Trust_track_num_Output, latest_timestamp); } -//数据处理参数加载(从 TOML 配置文件加载全部工作参数) +//数据处理参数加载(从 TOML 配置文件加载全部工作参数到全局 rdp_parameter) int Data_Process::parameters_reload(const char* parameter_file_path) { - RDP_parameter loaded{}; std::string error; - if (rdp_parameter_load(parameter_file_path, loaded, &error) != 0) + // rdp_parameter_load 仅在完整校验通过后写入目标对象,失败时保持原参数不变 + if (rdp_parameter_load(parameter_file_path, rdp_parameter, &error) != 0) { RDP_LOG << "parameters_reload failed: " << error << std::endl; return -1; } - rdp_parameter = loaded; RDP_LOG << "parameters_reload ok: " << parameter_file_path << std::endl; return 0; } diff --git a/data_process_class_dll/data_process.h b/data_process_class_dll/data_process.h index caf6a1f..5fe0724 100644 --- a/data_process_class_dll/data_process.h +++ b/data_process_class_dll/data_process.h @@ -83,8 +83,7 @@ private: std::vector trust_track; //可靠航迹 按航迹区存入 std::vector > temp_track; //临时航迹 按临时航迹区存入 - RDP_parameter rdp_parameter{}; //工作参数 由 parameters_reload() 从配置文件加载 - + // 工作参数为全局对象 struct.h::rdp_parameter(由 parameters_reload() 加载),不再作为类成员。 int Beam_num; //波位数 int beam_count; //波位计数 int data_num; //波位1点数 diff --git a/data_process_class_dll/dot_coh.cpp b/data_process_class_dll/dot_coh.cpp index baf7c01..f4fbad3 100644 --- a/data_process_class_dll/dot_coh.cpp +++ b/data_process_class_dll/dot_coh.cpp @@ -7,8 +7,7 @@ using namespace std; int Dot_Coh::dot_coh_process(std::vector *data_input, - std::vector *point_recv, - const RDP_parameter& rdp_parameter) + std::vector *point_recv) { if(data_input->size()>1) @@ -99,8 +98,7 @@ int Dot_Coh::dot_coh_process(std::vector *data_input, } int Dot_Coh::dot_coh_process_buff( std::vector *data_input, //输入的点迹 - std::vector *point_recv, //输出点迹 - const RDP_parameter& rdp_parameter //工作参数 + std::vector *point_recv //输出点迹 ) { diff --git a/data_process_class_dll/dot_coh.h b/data_process_class_dll/dot_coh.h index 85233a9..09d87de 100644 --- a/data_process_class_dll/dot_coh.h +++ b/data_process_class_dll/dot_coh.h @@ -14,14 +14,12 @@ public: // 点迹凝聚函数 int dot_coh_process( std::vector *data_input, //输入的点迹 - std::vector *point_recv, //输出点迹 - const RDP_parameter& rdp_parameter //工作参数 + std::vector *point_recv //输出点迹 ); //点迹凝聚函数,缓存一帧,一边输出,一边进行滑窗凝聚 int dot_coh_process_buff( std::vector *data_input, //输入的点迹 - std::vector *point_recv, //输出点迹 - const RDP_parameter& rdp_parameter //工作参数 + std::vector *point_recv //输出点迹 ); //构造函数 diff --git a/data_process_class_dll/dot_coh_tas.cpp b/data_process_class_dll/dot_coh_tas.cpp index f5f35d8..fa0c9ca 100644 --- a/data_process_class_dll/dot_coh_tas.cpp +++ b/data_process_class_dll/dot_coh_tas.cpp @@ -6,8 +6,7 @@ using namespace std; int Dot_Coh_TAS::dot_coh_tas_process(std::vector *data_input, //输入点迹 - std::vector *point_recv_tas, //输出点迹 - const RDP_parameter& rdp_parameter) + std::vector *point_recv_tas) //输出点迹 { if (data_input->size() == 0) { return 1; diff --git a/data_process_class_dll/dot_coh_tas.h b/data_process_class_dll/dot_coh_tas.h index 53b73fe..8363cff 100644 --- a/data_process_class_dll/dot_coh_tas.h +++ b/data_process_class_dll/dot_coh_tas.h @@ -9,8 +9,8 @@ public: // 点迹凝聚函数 int dot_coh_tas_process(std::vector *data_input, //输入点迹 - std::vector *point_recv_tas, //输出点迹 - const RDP_parameter& rdp_parameter); + std::vector *point_recv_tas //输出点迹 + ); }; #endif // DOT_COH_TAS_H diff --git a/data_process_class_dll/kalman.cpp b/data_process_class_dll/kalman.cpp index 42bc2c1..e140d83 100644 --- a/data_process_class_dll/kalman.cpp +++ b/data_process_class_dll/kalman.cpp @@ -15,7 +15,7 @@ static double wrapAnglePi(double a) } -void kalman:: kalman_filter_init_2dots(double Z0[2], double Z1[2], double T,double X[4], double P[4][4], const RDP_parameter& rdp_parameter) +void kalman:: kalman_filter_init_2dots(double Z0[2], double Z1[2], double T,double X[4], double P[4][4]) { X[0]=Z1[0]; @@ -57,7 +57,7 @@ void kalman:: kalman_filter_init_2dots(double Z0[2], double Z1[2], double T,doub } -double kalman::d_cal_track_init(double Z[2],double X[4],double P[4][4],double T, const RDP_parameter& rdp_parameter) +double kalman::d_cal_track_init(double Z[2],double X[4],double P[4][4],double T) { //X(k+1|k) @@ -122,7 +122,7 @@ double kalman::d_cal_track_init(double Z[2],double X[4],double P[4][4],double T, } -void kalman::kalman_filter_init_3dots(double Z0[2], double Z1[2],double Z2[2], double T1,double T2, double X[6], double P[6][6], const RDP_parameter& rdp_parameter) +void kalman::kalman_filter_init_3dots(double Z0[2], double Z1[2],double Z2[2], double T1,double T2, double X[6], double P[6][6]) { double x0=Z0[0]; double y0=Z0[1]; @@ -193,7 +193,7 @@ void kalman::kalman_filter_init_3dots(double Z0[2], double Z1[2],double Z2[2], d }; -double kalman::d_cal(double Z[2],double X[6],double P[6][6], const RDP_parameter& rdp_parameter) +double kalman::d_cal(double Z[2],double X[6],double P[6][6]) { VectorXd X_pred(6); MatrixXd P_pred(6,6); @@ -240,7 +240,7 @@ double kalman::d_cal(double Z[2],double X[6],double P[6][6], const RDP_parameter }; -double kalman::d_cal_EKF(double F[6][6], double Q[6][6] ,double Z[3],double X[6],double P[6][6],double prt,double freq_ind, const RDP_parameter& rdp_parameter) +double kalman::d_cal_EKF(double F[6][6], double Q[6][6] ,double Z[3],double X[6],double P[6][6],double prt,double freq_ind) { MatrixXd F1(6,6); @@ -299,7 +299,7 @@ double kalman::d_cal_EKF(double F[6][6], double Q[6][6] ,double Z[3],double X[6] S=H*P_pred*H.transpose()+R; //bind_speed - double v_bind=Bind_speed(prt, freq_ind, rdp_parameter); + double v_bind=Bind_speed(prt, freq_ind); //d Vector3d Z_mea(Z[0],Z[1],Z[2]); @@ -313,7 +313,7 @@ double kalman::d_cal_EKF(double F[6][6], double Q[6][6] ,double Z[3],double X[6] } -double kalman:: d_cal_with_doppler(double F[6][6], double Q[6][6] , double Z[2],double X[6],double P[6][6],double vr,double prt,double freq_ind, const RDP_parameter& rdp_parameter) +double kalman:: d_cal_with_doppler(double F[6][6], double Q[6][6] , double Z[2],double X[6],double P[6][6],double vr,double prt,double freq_ind) { MatrixXd F1(6,6); @@ -381,7 +381,7 @@ double kalman:: d_cal_with_doppler(double F[6][6], double Q[6][6] , double Z[2], S=H*P_pred*H.transpose()+R; // bind_speed - double v_bind=Bind_speed(prt, freq_ind, rdp_parameter); + double v_bind=Bind_speed(prt, freq_ind); //d Vector3d delta_z; @@ -431,7 +431,7 @@ void kalman::kalman_pred(double F[6][6], double Q[6][6] ,double X[6],double P[6] void kalman::kalman_filter_EKF(double F[6][6], double Q[6][6], double X_cur[6],double P_cur[6][6],double Z[3], double X_filter[6],double P_filter[6][6],double S_filter[3][3], - double prt,double freq_ind, const RDP_parameter& rdp_parameter ) + double prt,double freq_ind ) { MatrixXd F1(6,6); MatrixXd Q1(6,6); @@ -496,7 +496,7 @@ void kalman::kalman_filter_EKF(double F[6][6], double Q[6][6], double X_cur[6],d K=P_pred*H.transpose()*S.inverse(); //bind_speed - double v_bind=Bind_speed(prt, freq_ind, rdp_parameter); + double v_bind=Bind_speed(prt, freq_ind); //d Vector3d delta_z; @@ -530,7 +530,7 @@ void kalman::kalman_filter_EKF(double F[6][6], double Q[6][6], double X_cur[6],d void kalman::kalman_filter(double F[6][6], double Q[6][6], double X_cur[6],double P_cur[6][6], - double Z[2],double X_filter[6],double P_filter[6][6],double S_filter[2][2], const RDP_parameter& rdp_parameter) + double Z[2],double X_filter[6],double P_filter[6][6],double S_filter[2][2]) { MatrixXd F1(6,6); MatrixXd Q1(6,6); @@ -612,7 +612,7 @@ void kalman::kalman_filter(double F[6][6], double Q[6][6], }; -double kalman::d_cal_track_init_EKF(double Z[3],double X[4],double P[4][4],double T,double prt,double freq_ind, const RDP_parameter& rdp_parameter) +double kalman::d_cal_track_init_EKF(double Z[3],double X[4],double P[4][4],double T,double prt,double freq_ind) { //X(k+1|k) @@ -678,7 +678,7 @@ double kalman::d_cal_track_init_EKF(double Z[3],double X[4],double P[4][4],doubl S=H*P_pred*H.transpose()+R; //bind_speed - double v_bind=Bind_speed(prt, freq_ind, rdp_parameter); + double v_bind=Bind_speed(prt, freq_ind); //d Vector3d Z_presnet= Vector3d(Z[0],Z[1],Z[2]); @@ -692,7 +692,7 @@ double kalman::d_cal_track_init_EKF(double Z[3],double X[4],double P[4][4],doubl } -double kalman::d_cal_track_init_with_doppler(double Z[2],double X[4],double P[4][4],double T,double vr,double prt,double freq_ind, const RDP_parameter& rdp_parameter) +double kalman::d_cal_track_init_with_doppler(double Z[2],double X[4],double P[4][4],double T,double vr,double prt,double freq_ind) { //X(k+1|k) Matrix4d F; @@ -763,7 +763,7 @@ double kalman::d_cal_track_init_with_doppler(double Z[2],double X[4],double P[4] S=H*P_pred*H.transpose()+R; //bind_speed - double v_bind=Bind_speed(prt, freq_ind, rdp_parameter); + double v_bind=Bind_speed(prt, freq_ind); //d Vector3d Z_presnet= Vector3d(Z[0],Z[1],vr); @@ -777,7 +777,7 @@ double kalman::d_cal_track_init_with_doppler(double Z[2],double X[4],double P[4] }; -double kalman::Bind_speed(double prt,double freq_ind, const RDP_parameter& rdp_parameter) +double kalman::Bind_speed(double prt,double freq_ind) { double freq=rdp_parameter.freq_0_GHz+freq_ind*0.02; diff --git a/data_process_class_dll/kalman.h b/data_process_class_dll/kalman.h index 6ecad96..c82cd0d 100644 --- a/data_process_class_dll/kalman.h +++ b/data_process_class_dll/kalman.h @@ -13,29 +13,29 @@ public: void kalman_pred(double F[6][6], double Q[6][6], double X[6], double P[6][6], double X_pred[6], double P_pred[6][6]); - void kalman_filter_init_2dots(double Z0[2], double Z1[2], double T,double X[4], double P[4][4], const RDP_parameter& rdp_parameter);//两点初始化卡尔曼滤波器 + void kalman_filter_init_2dots(double Z0[2], double Z1[2], double T,double X[4], double P[4][4]);//两点初始化卡尔曼滤波器 - double d_cal_track_init(double Z[2],double X[4],double P[4][4],double T, const RDP_parameter& rdp_parameter); //计算点 临时航迹的d + double d_cal_track_init(double Z[2],double X[4],double P[4][4],double T); //计算点 临时航迹的d - double d_cal_track_init_with_doppler(double Z[2],double X[4],double P[4][4],double T,double vr,double prt,double freq_ind, const RDP_parameter& rdp_parameter); + double d_cal_track_init_with_doppler(double Z[2],double X[4],double P[4][4],double T,double vr,double prt,double freq_ind); - double d_cal_track_init_EKF(double Z[3],double X[4],double P[4][4],double T,double prt,double freq_ind, const RDP_parameter& rdp_parameter); + double d_cal_track_init_EKF(double Z[3],double X[4],double P[4][4],double T,double prt,double freq_ind); - void kalman_filter_init_3dots(double Z0[2], double Z1[2],double Z2[2], double T1,double T2, double X[6], double P[6][6], const RDP_parameter& rdp_parameter); + void kalman_filter_init_3dots(double Z0[2], double Z1[2],double Z2[2], double T1,double T2, double X[6], double P[6][6]); - double d_cal(double Z[2],double X[6],double P[6][6], const RDP_parameter& rdp_parameter); + double d_cal(double Z[2],double X[6],double P[6][6]); - double d_cal_with_doppler(double F[6][6], double Q[6][6] ,double Z[2],double X[6],double P[6][6],double vr,double prt,double freq_ind, const RDP_parameter& rdp_parameter); + double d_cal_with_doppler(double F[6][6], double Q[6][6] ,double Z[2],double X[6],double P[6][6],double vr,double prt,double freq_ind); - double d_cal_EKF(double F[6][6], double Q[6][6] ,double Z[3],double X[6],double P[6][6],double prt,double freq_ind, const RDP_parameter& rdp_parameter); + double d_cal_EKF(double F[6][6], double Q[6][6] ,double Z[3],double X[6],double P[6][6],double prt,double freq_ind); - void kalman_filter(double F[6][6], double Q[6][6], double X[6],double P[6][6],double Z[2],double X_filter[6],double P_filter[6][6],double S_filter[2][2], const RDP_parameter& rdp_parameter); + void kalman_filter(double F[6][6], double Q[6][6], double X[6],double P[6][6],double Z[2],double X_filter[6],double P_filter[6][6],double S_filter[2][2]); void kalman_filter_EKF(double F[6][6], double Q[6][6], double X[6],double P[6][6],double Z[3], double X_filter[6],double P_filter[6][6],double S_filter[3][3], - double prt,double freq_ind, const RDP_parameter& rdp_parameter ); + double prt,double freq_ind ); - double Bind_speed(double prt,double freq_ind, const RDP_parameter& rdp_parameter); //根据PRT 和 频率 计算不模糊速度 + double Bind_speed(double prt,double freq_ind); //根据PRT 和 频率 计算不模糊速度 }; #endif // KALMAN_H diff --git a/data_process_class_dll/struct.h b/data_process_class_dll/struct.h index 5935fa8..04adc79 100644 --- a/data_process_class_dll/struct.h +++ b/data_process_class_dll/struct.h @@ -278,4 +278,10 @@ struct RDP_parameter float tas_prohibite_area_azimuth_max[30]; //最大方位角 (度) }; +// ******************* 全局工作参数对象 ************************// +// 所有处理模块直接访问该全局对象,不再通过函数参数逐层传递。 +// 定义在 data_process.cpp;由 Data_Process::parameters_reload() 在配置文件完整校验通过后整体赋值 +// (失败时保持原值)。处理期间只读;配置重载应与处理互斥,宿主按单线程接口使用(见 README BUG-03)。 +extern RDP_parameter rdp_parameter; + #endif // STRUCT_H diff --git a/data_process_class_dll/tas_ctrl.cpp b/data_process_class_dll/tas_ctrl.cpp index 75dee26..9a8cf2d 100644 --- a/data_process_class_dll/tas_ctrl.cpp +++ b/data_process_class_dll/tas_ctrl.cpp @@ -27,14 +27,13 @@ void TAS_Ctrl::tas_ctrl_process(std::vector *trust_track struct TrackingBeam *Tracking_beam, struct Track Trust_Track_Output[][10], int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter, long long latest_timestamp) { if (Trust_track_num_Output == 0) return; *Trust_track_num_Output = 0; - tas_target_add(trust_track, Trust_Track_Output, Trust_track_num_Output,rdp_parameter); - tas_target_del(trust_track, Trust_Track_Output, Trust_track_num_Output,rdp_parameter); - tas_beam_output(trust_track,Tracking_beam,rdp_parameter,latest_timestamp); + tas_target_add(trust_track, Trust_Track_Output, Trust_track_num_Output); + tas_target_del(trust_track, Trust_Track_Output, Trust_track_num_Output); + tas_beam_output(trust_track,Tracking_beam,latest_timestamp); // //跟踪队列移位 // struct Tracking_Target tas_target_tmp; @@ -48,8 +47,7 @@ void TAS_Ctrl::tas_ctrl_process(std::vector *trust_track void TAS_Ctrl::tas_target_add(std::vector *trust_track, struct Track Trust_Track_Output[][10], - int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter) + int *Trust_track_num_Output) { for (size_t i=0;isize();i++) @@ -63,10 +61,10 @@ void TAS_Ctrl::tas_target_add(std::vector *trust_track, azi=azi/PI*180; //进入跟踪的条件: 1.手动跟踪的目标 或 满足速度、距离、高度条件满足 关联点数大于2 2.不在禁止跟踪区域 - if( ( (*trust_track)[i].manual_tracking_flag == 1)//|| (tas_auto_start( v, r, h, rdp_parameter)==1 && (*trust_track)[i][k].associate_point_number>=2) + if( ( (*trust_track)[i].manual_tracking_flag == 1)//|| (tas_auto_start( v, r, h)==1 && (*trust_track)[i][k].associate_point_number>=2) && tas_target_num < rdp_parameter.tas_track_num_max && (*trust_track)[i].Track_Mode == 0 - && tas_prohibite_area( r, azi, v, h, rdp_parameter) == 0) + && tas_prohibite_area( r, azi, v, h) == 0) { for(int j=0;j *trust_track, // TAS 距离/速度/高度门限,这些参数未纳入新的 RDP_parameter,故原实现保持停用; // 具体逻辑不再以注释代码形式保留(tas_ctrl.h 中保留声明,后续如需启用再按新参数补齐)。 -int TAS_Ctrl::tas_prohibite_area(double r,double azi, double v, double h,const RDP_parameter& rdp_parameter) +int TAS_Ctrl::tas_prohibite_area(double r,double azi, double v, double h) { for (int i=0;i *trust_track, struct Track Trust_Track_Output[][10], - int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter) + int *Trust_track_num_Output) { //查找TAS目标是否已经消批 若消批则移出TAS队列 @@ -169,7 +166,7 @@ void TAS_Ctrl::tas_target_del(std::vector *trust_track, // double v=sqrt(pow((*trust_track)[i].X[1],2)+pow((*trust_track)[i].X[4],2)); // double h=(*trust_track)[i].Height+rdp_parameter.radar_height; -// if((*trust_track)[i].manual_tracking_flag == 0 && (*trust_track)[i].Track_Mode == 1 && tas_auto_end(v,r,h,rdp_parameter) == 1) //满足结束跟踪条件 +// if((*trust_track)[i].manual_tracking_flag == 0 && (*trust_track)[i].Track_Mode == 1 && tas_auto_end(v,r,h) == 1) //满足结束跟踪条件 // { // int track_index=(*trust_track)[i].Track_Index; @@ -218,7 +215,6 @@ void TAS_Ctrl::tas_target_del(std::vector *trust_track, void TAS_Ctrl::tas_beam_output(std::vector *trust_track, struct TrackingBeam *Tracking_beam, - const RDP_parameter& rdp_parameter, long long latest_timestamp) { diff --git a/data_process_class_dll/tas_ctrl.h b/data_process_class_dll/tas_ctrl.h index 65e99e3..4c1cb4a 100644 --- a/data_process_class_dll/tas_ctrl.h +++ b/data_process_class_dll/tas_ctrl.h @@ -18,7 +18,6 @@ public: struct TrackingBeam *Tracking_beam, struct Track Trust_Track_Output[][10], int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter, long long latest_timestamp); private: @@ -26,29 +25,26 @@ private: //添加TAS目标 void tas_target_add(std::vector *trust_track, struct Track Trust_Track_Output[][10], - int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter); + int *Trust_track_num_Output); //删除TAS目标 void tas_target_del(std::vector *trust_track, struct Track Trust_Track_Output[][10], - int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter); + int *Trust_track_num_Output); //TAS队列信息输出 void tas_beam_output(std::vector *trust_track, struct TrackingBeam *Tracking_beam, - const RDP_parameter& rdp_parameter, long long latest_timestamp); //TAS 自动开启条件 - int tas_auto_start(double v, double r, double h, const RDP_parameter& rdp_parameter); + int tas_auto_start(double v, double r, double h); //TAS 自动退出条件 - int tas_auto_end(double v, double r, double h, const RDP_parameter& rdp_parameter); + int tas_auto_end(double v, double r, double h); // 禁止跟踪区域判断 - int tas_prohibite_area(double r,double azi, double v, double h,const RDP_parameter& rdp_parameter); + int tas_prohibite_area(double r,double azi, double v, double h); struct Tracking_Target tas_target_queue[RDP_TAS_QUEUE_CAPACITY]; //跟踪目标信息队列 diff --git a/data_process_class_dll/track_asso.cpp b/data_process_class_dll/track_asso.cpp index c985bdc..ca30f4d 100644 --- a/data_process_class_dll/track_asso.cpp +++ b/data_process_class_dll/track_asso.cpp @@ -19,8 +19,7 @@ int Track_Asso:: track_asso_process(std::vector *point_ std::vector *trust_track, //航迹文件 struct Track Trust_Track_Output[MAX_TRACK_NUM][10], //更新航迹信息 int *Trust_track_num_Output, //更新航迹数 - long long latest_timestamp, //最新时间戳 - const RDP_parameter& rdp_parameter //工作参数 + long long latest_timestamp //最新时间戳 ) { @@ -35,7 +34,7 @@ int Track_Asso:: track_asso_process(std::vector *point_ //IMM算法 model_interaction(trust_track); - model_filter(trust_track, rdp_parameter, latest_timestamp); + model_filter(trust_track, latest_timestamp); model_output(trust_track); @@ -288,7 +287,7 @@ void Track_Asso:: model_interaction(std::vector *trust_track) } // 产生 F Q 矩阵 -void Track_Asso::IMM_F_Q_gen(double v_track, double delta_T,double F[6][6], double Q1[6][6], double Q2[6][6], double Q3[6][6],const RDP_parameter& rdp_parameter) +void Track_Asso::IMM_F_Q_gen(double v_track, double delta_T,double F[6][6], double Q1[6][6], double Q2[6][6], double Q3[6][6]) { //F @@ -428,20 +427,19 @@ void Track_Asso::IMM_d_cal(double v_track, double X3[6], double P3[6][6], double Z[3], double prt,double freq_ind, double delta_T, - double *d1,double *d2,double *d3, - const RDP_parameter& rdp_parameter) + double *d1,double *d2,double *d3) { double F[6][6], Q1[6][6], Q2[6][6], Q3[6][6]; - IMM_F_Q_gen( v_track, delta_T,F, Q1, Q2, Q3,rdp_parameter); + IMM_F_Q_gen( v_track, delta_T,F, Q1, Q2, Q3); kalman Kalman; - *d1=Kalman.d_cal_EKF(F,Q1,Z,X1,P1,prt,freq_ind, rdp_parameter); - *d2=Kalman.d_cal_EKF(F,Q2,Z,X2,P2,prt,freq_ind, rdp_parameter); - *d3=Kalman.d_cal_EKF(F,Q3,Z,X3,P3,prt,freq_ind, rdp_parameter); + *d1=Kalman.d_cal_EKF(F,Q1,Z,X1,P1,prt,freq_ind); + *d2=Kalman.d_cal_EKF(F,Q2,Z,X2,P2,prt,freq_ind); + *d3=Kalman.d_cal_EKF(F,Q3,Z,X3,P3,prt,freq_ind); } -void Track_Asso:: model_filter(std::vector *trust_track,const RDP_parameter& rdp_parameter, long long latest_timestamp) +void Track_Asso:: model_filter(std::vector *trust_track, long long latest_timestamp) { @@ -492,7 +490,7 @@ void Track_Asso:: model_filter(std::vector *trust_track,const RDP_ //计算统计距离d double d1,d2,d3; - IMM_d_cal(v_track,X1,P1,X2,P2, X3,P3,Z,prt,freq_ind,delta_T,&d1,&d2,&d3,rdp_parameter); + IMM_d_cal(v_track,X1,P1,X2,P2, X3,P3,Z,prt,freq_ind,delta_T,&d1,&d2,&d3); //判定统计距离门限,thd_d bool thd_d = false; @@ -623,7 +621,7 @@ void Track_Asso:: model_filter(std::vector *trust_track,const RDP_ double v_track = sqrt(pow((*trust_track)[track_index-1].X[1],2)+pow((*trust_track)[track_index-1].X[4],2)); double delta_T = (point_process[point_index-1].CPI_time - (*trust_track)[track_index-1].T_track)/1000.0; double F[6][6], Q1[6][6], Q2[6][6], Q3[6][6]; - IMM_F_Q_gen( v_track, delta_T,F, Q1, Q2, Q3,rdp_parameter); + IMM_F_Q_gen( v_track, delta_T,F, Q1, Q2, Q3); if (delta_T > 0) { @@ -632,9 +630,9 @@ void Track_Asso:: model_filter(std::vector *trust_track,const RDP_ double X1_filter[6],X2_filter[6],X3_filter[6],P1_filter[6][6],P2_filter[6][6],P3_filter[6][6]; double S1[3][3] = {{0}},S2[3][3] = {{0}},S3[3][3] = {{0}}; kalman Kalman; - Kalman.kalman_filter_EKF(F,Q1,X1,P1,Z,X1_filter,P1_filter,S1, prt, freq_ind, rdp_parameter); - Kalman.kalman_filter_EKF(F,Q2,X2,P2,Z,X2_filter,P2_filter,S2, prt, freq_ind, rdp_parameter); - Kalman.kalman_filter_EKF(F,Q3,X3,P3,Z,X3_filter,P3_filter,S3, prt, freq_ind, rdp_parameter); + Kalman.kalman_filter_EKF(F,Q1,X1,P1,Z,X1_filter,P1_filter,S1, prt, freq_ind); + Kalman.kalman_filter_EKF(F,Q2,X2,P2,Z,X2_filter,P2_filter,S2, prt, freq_ind); + Kalman.kalman_filter_EKF(F,Q3,X3,P3,Z,X3_filter,P3_filter,S3, prt, freq_ind); Matrix3f S1_out,S2_out,S3_out; for (int ii=0;ii<3;ii++) @@ -721,7 +719,7 @@ void Track_Asso:: model_filter(std::vector *trust_track,const RDP_ std::memcpy((*trust_track)[track_index-1].range_dim, point_process[point_index-1].range_dim, sizeof((*trust_track)[track_index-1].range_dim)); //更新高度 - track_hight_update(track_index,point_index,trust_track,rdp_parameter); + track_hight_update(track_index,point_index,trust_track); (*trust_track)[track_index-1].Extrapolate_round = 0; //连续未用实点更新时间 (*trust_track)[track_index-1].point_flag=1; //实点 @@ -789,7 +787,7 @@ void Track_Asso:: model_filter(std::vector *trust_track,const RDP_ double v_track = sqrt(pow((*trust_track)[i].X[1],2)+pow((*trust_track)[i].X[4],2)); double F[6][6], Q1[6][6], Q2[6][6], Q3[6][6]; - IMM_F_Q_gen( v_track, delta_T, F, Q1, Q2, Q3,rdp_parameter); + IMM_F_Q_gen( v_track, delta_T, F, Q1, Q2, Q3); //航迹X P double X1[6],X2[6],X3[6],P1[6][6],P2[6][6],P3[6][6]; @@ -947,8 +945,7 @@ void Track_Asso:: model_output(std::vector *trust_track) //高度维更新 void Track_Asso:: track_hight_update(int updata_track_index, //更新的航迹号 int asso_point_index, //点迹号 - std::vector *trust_track, //航迹 - const RDP_parameter& rdp_parameter //工作参数 + std::vector *trust_track //航迹 ) { diff --git a/data_process_class_dll/track_asso.h b/data_process_class_dll/track_asso.h index 15d1747..a2defdf 100644 --- a/data_process_class_dll/track_asso.h +++ b/data_process_class_dll/track_asso.h @@ -16,8 +16,7 @@ public: std::vector *trust_track, //航迹文件 struct Track Trust_Track_Output[MAX_TRACK_NUM][10], //更新航迹信息 int *Trust_track_num_Output, //更新航迹数 - long long latest_timestamp, //最新时间戳 - const RDP_parameter& rdp_parameter //工作参数 + long long latest_timestamp //最新时间戳 ); Track_Asso(); @@ -31,7 +30,6 @@ private: void model_interaction(std::vector *trust_track); //模型交互 void model_filter(std::vector *trust_track, //滤波 - const RDP_parameter& rdp_parameter, long long latest_timestamp ); @@ -43,18 +41,16 @@ private: double X3[6], double P3[6][6], double Z[3], double prt,double freq_ind, double delta_T, - double *d1,double *d2,double *d3, - const RDP_parameter& rdp_parameter); + double *d1,double *d2,double *d3); - void IMM_F_Q_gen(double v_track, double delta_T,double F[6][6], double Q1[6][6], double Q2[6][6], double Q3[6][6],const RDP_parameter& rdp_parameter); + void IMM_F_Q_gen(double v_track, double delta_T,double F[6][6], double Q1[6][6], double Q2[6][6], double Q3[6][6]); double Pt[3][3]; //模型转移概率 //高度维更新 void track_hight_update(int updata_track_index, //更新的航迹号 int asso_point_index, //点迹号 - std::vector *trust_track, //航迹 - const RDP_parameter& rdp_parameter //工作参数 + std::vector *trust_track //航迹 ); }; #endif // TRACK_ASSO_H diff --git a/data_process_class_dll/track_asso_direct_tracking.cpp b/data_process_class_dll/track_asso_direct_tracking.cpp index 0d2490a..5157cbe 100644 --- a/data_process_class_dll/track_asso_direct_tracking.cpp +++ b/data_process_class_dll/track_asso_direct_tracking.cpp @@ -11,8 +11,7 @@ using namespace std; int Track_Asso_Direct_Tracking::track_asso_process_direct_tracking(std::vector *point_recv, //点迹 Trust_Track *trust_track, //航迹 struct Track Trust_Track_Output[MAX_TRACK_NUM][10], //更新航迹信息 - int *Trust_track_num_Output, //更新航迹数 - const RDP_parameter& rdp_parameter //工作参数 + int *Trust_track_num_Output //更新航迹数 ) { @@ -25,7 +24,7 @@ int Track_Asso_Direct_Tracking::track_asso_process_direct_tracking(std::vector

*point_recv, //点迹 Trust_Track *trust_track, //航迹 struct Track Trust_Track_Output[MAX_TRACK_NUM][10], //更新航迹信息 - int *Trust_track_num_Output, //更新航迹数 - const RDP_parameter& rdp_parameter //工作参数 + int *Trust_track_num_Output //更新航迹数 ); Track_Asso_Direct_Tracking(); @@ -27,8 +26,7 @@ class Track_Asso_Direct_Tracking //IMM void model_interaction(Trust_Track *trust_track); //模型交互 - void model_filter(Trust_Track *trust_track, //滤波 - const RDP_parameter& rdp_parameter + void model_filter(Trust_Track *trust_track //滤波 ); void model_output(Trust_Track *trust_track); //模型输出 @@ -39,17 +37,15 @@ class Track_Asso_Direct_Tracking double X3[6], double P3[6][6], double Z[3], double prt,double freq_ind, double delta_T, - double *d1,double *d2,double *d3, - const RDP_parameter& rdp_parameter); + double *d1,double *d2,double *d3); - void IMM_F_Q_gen(double v_track, double delta_T,double F[6][6], double Q1[6][6], double Q2[6][6], double Q3[6][6],const RDP_parameter& rdp_parameter); + void IMM_F_Q_gen(double v_track, double delta_T,double F[6][6], double Q1[6][6], double Q2[6][6], double Q3[6][6]); double Pt[3][3]; //模型转移概率 //高度维更新 void track_hight_update(int asso_point_index, //点迹号 - Trust_Track *trust_track, //航迹 - const RDP_parameter& rdp_parameter //工作参数 + Trust_Track *trust_track //航迹 ); }; diff --git a/data_process_class_dll/track_asso_tas.cpp b/data_process_class_dll/track_asso_tas.cpp index 60bb481..2d52d41 100644 --- a/data_process_class_dll/track_asso_tas.cpp +++ b/data_process_class_dll/track_asso_tas.cpp @@ -16,7 +16,6 @@ int Track_Asso_Tas::track_asso_process_tas(std::vector std::vector *trust_track, //航迹文件 struct Track Trust_Track_Output[MAX_TRACK_NUM][10], //更新航迹信息 int *Trust_track_num_Output, //更新航迹数 -const RDP_parameter& rdp_parameter, //工作参数 int tas_track_idx, long long latest_timestamp //最新时间戳 ) @@ -32,7 +31,7 @@ long long latest_timestamp //最新时间戳 //IMM算法 model_interaction(trust_track,tas_track_idx); - model_filter(trust_track, rdp_parameter,tas_track_idx, latest_timestamp); + model_filter(trust_track,tas_track_idx, latest_timestamp); model_output(trust_track,tas_track_idx); @@ -256,7 +255,6 @@ void Track_Asso_Tas:: model_interaction( std::vector *trust_track } void Track_Asso_Tas::model_filter( std::vector *trust_track, //滤波 - const RDP_parameter& rdp_parameter, int tas_track_idx, long long latest_timestamp //最新时间戳 ) @@ -322,7 +320,7 @@ void Track_Asso_Tas::model_filter( std::vector *t //计算统计距离d double d1,d2,d3; - IMM_d_cal(v_track,X1,P1,X2,P2, X3,P3,Z,prt,freq_ind,delta_T,&d1,&d2,&d3,rdp_parameter); + IMM_d_cal(v_track,X1,P1,X2,P2, X3,P3,Z,prt,freq_ind,delta_T,&d1,&d2,&d3); //判定统计距离门限,thd_d bool thd_d = false; @@ -418,7 +416,7 @@ void Track_Asso_Tas::model_filter( std::vector *t // Z[1]=point_process[point_index-1].Range*sin(point_process[point_index-1].Azimuth); double delta_T = (point_process[point_index-1].CPI_time - T_track)/1000.0; double F[6][6], Q1[6][6], Q2[6][6], Q3[6][6]; - IMM_F_Q_gen( v_track, delta_T,F, Q1, Q2, Q3,rdp_parameter); + IMM_F_Q_gen( v_track, delta_T,F, Q1, Q2, Q3); double X1_filter[6],X2_filter[6],X3_filter[6],P1_filter[6][6],P2_filter[6][6],P3_filter[6][6]; double S1[3][3] = {{0}},S2[3][3] = {{0}},S3[3][3] = {{0}}; @@ -426,9 +424,9 @@ void Track_Asso_Tas::model_filter( std::vector *t // Kalman.kalman_filter(F,Q1,X1,P1,Z,X1_filter,P1_filter,S1); // Kalman.kalman_filter(F,Q2,X2,P2,Z,X2_filter,P2_filter,S2); // Kalman.kalman_filter(F,Q3,X3,P3,Z,X3_filter,P3_filter,S3); - Kalman.kalman_filter_EKF(F,Q1,X1,P1,Z,X1_filter,P1_filter,S1, prt, freq_ind, rdp_parameter); - Kalman.kalman_filter_EKF(F,Q2,X2,P2,Z,X2_filter,P2_filter,S2, prt, freq_ind, rdp_parameter); - Kalman.kalman_filter_EKF(F,Q3,X3,P3,Z,X3_filter,P3_filter,S3, prt, freq_ind, rdp_parameter); + Kalman.kalman_filter_EKF(F,Q1,X1,P1,Z,X1_filter,P1_filter,S1, prt, freq_ind); + Kalman.kalman_filter_EKF(F,Q2,X2,P2,Z,X2_filter,P2_filter,S2, prt, freq_ind); + Kalman.kalman_filter_EKF(F,Q3,X3,P3,Z,X3_filter,P3_filter,S3, prt, freq_ind); Matrix3f S1_out,S2_out,S3_out; for (int ii=0;ii<3;ii++) for (int jj=0;jj<3;jj++) @@ -511,7 +509,7 @@ void Track_Asso_Tas::model_filter( std::vector *t std::memcpy((*trust_track)[i].range_dim, point_process[point_index-1].range_dim, sizeof((*trust_track)[i].range_dim)); //更新高度 - track_hight_update(tas_track_idx,point_index,trust_track,rdp_parameter); + track_hight_update(tas_track_idx,point_index,trust_track); } } @@ -539,7 +537,7 @@ void Track_Asso_Tas::model_filter( std::vector *t if (delta_T <= 0) continue; double F[6][6], Q1[6][6], Q2[6][6], Q3[6][6]; - IMM_F_Q_gen( v_track, delta_T, F, Q1, Q2, Q3,rdp_parameter); + IMM_F_Q_gen( v_track, delta_T, F, Q1, Q2, Q3); double X1_pred[6],X2_pred[6],X3_pred[6],P1_pred[6][6],P2_pred[6][6],P3_pred[6][6]; kalman Kalman; @@ -648,7 +646,7 @@ void Track_Asso_Tas::model_output(std::vector *trust_track, int } // 产生 F Q 矩阵 -void Track_Asso_Tas::IMM_F_Q_gen(double v_track, double delta_T,double F[6][6], double Q1[6][6], double Q2[6][6], double Q3[6][6],const RDP_parameter& rdp_parameter) +void Track_Asso_Tas::IMM_F_Q_gen(double v_track, double delta_T,double F[6][6], double Q1[6][6], double Q2[6][6], double Q3[6][6]) { //F @@ -764,27 +762,25 @@ double X2[6], double P2[6][6], double X3[6], double P3[6][6], double Z[3], double prt,double freq_ind, double delta_T, -double *d1,double *d2,double *d3, -const RDP_parameter& rdp_parameter) +double *d1,double *d2,double *d3) { double F[6][6], Q1[6][6], Q2[6][6], Q3[6][6]; - IMM_F_Q_gen( v_track, delta_T,F, Q1, Q2, Q3,rdp_parameter); + IMM_F_Q_gen( v_track, delta_T,F, Q1, Q2, Q3); kalman Kalman; // *d1=Kalman.d_cal_with_doppler(F,Q1,Z,X1,P1,v_point,prt,freq_ind); // *d2=Kalman.d_cal_with_doppler(F,Q2,Z,X2,P2,v_point,prt,freq_ind); // *d3=Kalman.d_cal_with_doppler(F,Q3,Z,X3,P3,v_point,prt,freq_ind); - *d1=Kalman.d_cal_EKF(F,Q1,Z,X1,P1,prt,freq_ind, rdp_parameter); - *d2=Kalman.d_cal_EKF(F,Q2,Z,X2,P2,prt,freq_ind, rdp_parameter); - *d3=Kalman.d_cal_EKF(F,Q3,Z,X3,P3,prt,freq_ind, rdp_parameter); + *d1=Kalman.d_cal_EKF(F,Q1,Z,X1,P1,prt,freq_ind); + *d2=Kalman.d_cal_EKF(F,Q2,Z,X2,P2,prt,freq_ind); + *d3=Kalman.d_cal_EKF(F,Q3,Z,X3,P3,prt,freq_ind); } //高度维更新 void Track_Asso_Tas::track_hight_update(int tas_track_idx, //更新的航迹号 int asso_point_index, //点迹号 - std::vector *trust_track, //航迹 - const RDP_parameter& rdp_parameter //工作参数 + std::vector *trust_track //航迹 ) { for(size_t i=0; isize(); i++) diff --git a/data_process_class_dll/track_asso_tas.h b/data_process_class_dll/track_asso_tas.h index c79e279..eee7a37 100644 --- a/data_process_class_dll/track_asso_tas.h +++ b/data_process_class_dll/track_asso_tas.h @@ -15,7 +15,6 @@ public: std::vector *trust_track, //航迹文件 struct Track Trust_Track_Output[MAX_TRACK_NUM][10], //更新航迹信息 int *Trust_track_num_Output, //更新航迹数 - const RDP_parameter& rdp_parameter, //工作参数 int tas_track_idx, long long latest_timestamp //最新时间戳 ); @@ -31,7 +30,6 @@ private: void model_interaction(std::vector *trust_track, int tas_track_idx); //模型交互 void model_filter(std::vector *trust_track, //滤波 - const RDP_parameter& rdp_parameter, int tas_track_idx, long long latest_timestamp //最新时间戳 ); @@ -44,18 +42,16 @@ private: double X3[6], double P3[6][6], double Z[3], double prt,double freq_ind, double delta_T, - double *d1,double *d2,double *d3, - const RDP_parameter& rdp_parameter); + double *d1,double *d2,double *d3); - void IMM_F_Q_gen(double v_track, double delta_T,double F[6][6], double Q1[6][6], double Q2[6][6], double Q3[6][6],const RDP_parameter& rdp_parameter); + void IMM_F_Q_gen(double v_track, double delta_T,double F[6][6], double Q1[6][6], double Q2[6][6], double Q3[6][6]); double Pt[3][3]; //模型转移概率 //高度维更新 void track_hight_update(int tas_track_idx, //更新的航迹号 int asso_point_index, //点迹号 - std::vector *trust_track, //航迹 - const RDP_parameter& rdp_parameter //工作参数 + std::vector *trust_track //航迹 ); }; diff --git a/data_process_class_dll/track_die.cpp b/data_process_class_dll/track_die.cpp index 7e584a3..f4abead 100644 --- a/data_process_class_dll/track_die.cpp +++ b/data_process_class_dll/track_die.cpp @@ -8,8 +8,7 @@ using namespace std; void Track_Die::track_die_process( std::vector *trust_track, int Track_die_Index_Output[], - int *Track_die_num_Output, - const RDP_parameter& rdp_parameter) + int *Track_die_num_Output) { std::vector ::iterator Iter; diff --git a/data_process_class_dll/track_die.h b/data_process_class_dll/track_die.h index 558f9d7..6d893bf 100644 --- a/data_process_class_dll/track_die.h +++ b/data_process_class_dll/track_die.h @@ -11,8 +11,7 @@ class Track_Die public: void track_die_process( std::vector *trust_track, int Track_die_Index_Output[], - int *Track_die_num_Output, - const RDP_parameter& rdp_parameter); + int *Track_die_num_Output); }; #endif // TRACK_DIE_H diff --git a/data_process_class_dll/track_die_tas.cpp b/data_process_class_dll/track_die_tas.cpp index 74094ce..ae35223 100644 --- a/data_process_class_dll/track_die_tas.cpp +++ b/data_process_class_dll/track_die_tas.cpp @@ -11,8 +11,7 @@ using namespace std; void Track_Die_Tas::track_die_process_tas( std::vector *trust_track, int Track_die_Index_Output[], - int *Track_die_num_Output, - const RDP_parameter& rdp_parameter) + int *Track_die_num_Output) { std::vector ::iterator Iter; diff --git a/data_process_class_dll/track_die_tas.h b/data_process_class_dll/track_die_tas.h index 54be9cd..b983ed9 100644 --- a/data_process_class_dll/track_die_tas.h +++ b/data_process_class_dll/track_die_tas.h @@ -11,8 +11,7 @@ class Track_Die_Tas public: void track_die_process_tas( std::vector *trust_track, int Track_die_Index_Output[], - int *Track_die_num_Output, - const RDP_parameter& rdp_parameter); + int *Track_die_num_Output); }; #endif // TRACK_DIE_TAS_H diff --git a/data_process_class_dll/track_index_mangement.cpp b/data_process_class_dll/track_index_mangement.cpp index d0d7686..8b7b4fe 100644 --- a/data_process_class_dll/track_index_mangement.cpp +++ b/data_process_class_dll/track_index_mangement.cpp @@ -11,8 +11,7 @@ void Track_Ind_Mangement::reset() lastest_index = 0; } -int Track_Ind_Mangement::track_ind_get( std::vector *trust_track, - const RDP_parameter& rdp_parameter) +int Track_Ind_Mangement::track_ind_get( std::vector *trust_track) { int isempty = 1; diff --git a/data_process_class_dll/track_index_mangement.h b/data_process_class_dll/track_index_mangement.h index 19a6354..f35dbd6 100644 --- a/data_process_class_dll/track_index_mangement.h +++ b/data_process_class_dll/track_index_mangement.h @@ -10,7 +10,7 @@ class Track_Ind_Mangement { public: - int track_ind_get( std::vector *trust_track, const RDP_parameter& rdp_parameter); + int track_ind_get( std::vector *trust_track); void reset(); private: diff --git a/data_process_class_dll/track_init.cpp b/data_process_class_dll/track_init.cpp index 476f944..f583dcc 100644 --- a/data_process_class_dll/track_init.cpp +++ b/data_process_class_dll/track_init.cpp @@ -13,8 +13,7 @@ int Track_Init::track_init_process_logic( std::vector std::vector *trust_track, //可靠航迹 std::vector > *temp_track, struct Track Trust_Track_Output[MAX_TRACK_NUM][10], - int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter + int *Trust_track_num_Output ) { @@ -35,10 +34,10 @@ int Track_Init::track_init_process_logic( std::vector if(point_process.size()>0) { //点迹与临时航迹关联 - point_temp_track_asso(temp_track,rdp_parameter); + point_temp_track_asso(temp_track); //点迹与航迹头关联 - point_track_head_asso(temp_track,rdp_parameter); + point_track_head_asso(temp_track); //删除关联上的点迹 std::vector ::iterator Iter; @@ -118,7 +117,7 @@ int Track_Init::track_init_process_logic( std::vector #endif //临时航迹满足起始长度 转为可靠航迹 - tmp_track_to_trust_track(trust_track,temp_track,Trust_Track_Output, Trust_track_num_Output,rdp_parameter); + tmp_track_to_trust_track(trust_track,temp_track,Trust_Track_Output, Trust_track_num_Output); } @@ -129,8 +128,7 @@ int Track_Init::track_init_process_logic( std::vector } -void Track_Init::point_temp_track_asso(std::vector > *temp_track, - const RDP_parameter& rdp_parameter) +void Track_Init::point_temp_track_asso(std::vector > *temp_track) { //关联信息 @@ -179,7 +177,7 @@ void Track_Init::point_temp_track_asso(std::vector > { //计算d kalman Kalman; - double d = Kalman.d_cal_track_init_EKF(Z,X,P,delta_T,prt,freq_ind,rdp_parameter); + double d = Kalman.d_cal_track_init_EKF(Z,X,P,delta_T,prt,freq_ind); //double d = Kalman.d_cal_track_init_with_doppler(Z,X,P,delta_T,vr_point,prt,freq_ind); //double d = Kalman.d_cal_track_init(Z,X,P,delta_T); //计算夹角 @@ -251,7 +249,7 @@ void Track_Init::point_temp_track_asso(std::vector > kalman Kalman; double T = ( point_process[asso_info[i].point_idx-1].CPI_time - (*temp_track)[asso_info[i].track_idx-1][L-1].CPI_time)/1000.0; - Kalman.kalman_filter_init_2dots(Z0,Z1,T,X,P,rdp_parameter); + Kalman.kalman_filter_init_2dots(Z0,Z1,T,X,P); memcpy(asso_track_info_tmp.X, X, 4*sizeof(double)); memcpy(asso_track_info_tmp.P, P, 4*4*sizeof(double)); (*temp_track)[(*temp_track).size()-1].push_back(asso_track_info_tmp); @@ -314,8 +312,7 @@ void Track_Init::point_temp_track_asso(std::vector > } } -void Track_Init::point_track_head_asso( std::vector > *temp_track, - const RDP_parameter& rdp_parameter) +void Track_Init::point_track_head_asso( std::vector > *temp_track) { //关联上的信息 @@ -434,7 +431,7 @@ void Track_Init::point_track_head_asso( std::vector > kalman Kalman; double T = (point_process[asso_info[i].point_idx-1].CPI_time - (*temp_track)[asso_info[i].track_idx-1][0].CPI_time)/1000.0; - Kalman.kalman_filter_init_2dots(Z0,Z1,T,X,P,rdp_parameter); + Kalman.kalman_filter_init_2dots(Z0,Z1,T,X,P); memcpy(asso_track_info_tmp.X, X, 4*sizeof(double)); memcpy(asso_track_info_tmp.P, P, 4*4*sizeof(double)); (*temp_track)[(*temp_track).size()-1].push_back(asso_track_info_tmp); @@ -473,8 +470,7 @@ double Track_Init::alpha_cal_track_init(double x0,double y0,double x1,double y1, void Track_Init::tmp_track_to_trust_track(std::vector *trust_track, std::vector > *temp_track, struct Track Trust_Track_Output[MAX_TRACK_NUM][10], - int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter) + int *Trust_track_num_Output) { std::vector > Track_to_start; @@ -519,7 +515,7 @@ void Track_Init::tmp_track_to_trust_track(std::vector *trust_tra } //航迹起批禁止区域判断 - if(track_init_prohibit(range,azi,rdp_parameter)!=0) + if(track_init_prohibit(range,azi)!=0) { track_init_flag = false; } @@ -634,7 +630,7 @@ void Track_Init::tmp_track_to_trust_track(std::vector *trust_tra if (Track_to_start[i].size() < 3) continue; if(trust_track->size() < static_cast(rdp_parameter.track_index_max)) { - int index = track_index_mangement.track_ind_get(trust_track, rdp_parameter); + int index = track_index_mangement.track_ind_get(trust_track); if(index>0) { @@ -647,7 +643,7 @@ void Track_Init::tmp_track_to_trust_track(std::vector *trust_tra double T1=(Track_to_start[i][L-2].CPI_time-Track_to_start[i][L-3].CPI_time)/1000.0; double T2=(Track_to_start[i][L-1].CPI_time-Track_to_start[i][L-2].CPI_time)/1000.0; kalman Kalman; - Kalman.kalman_filter_init_3dots(Z0, Z1, Z2, T1,T2, X ,P,rdp_parameter); + Kalman.kalman_filter_init_3dots(Z0, Z1, Z2, T1,T2, X ,P); Trust_Track trust_track_tmp = {}; memcpy(trust_track_tmp.X, X, 6*sizeof(double)); @@ -783,7 +779,7 @@ void Track_Init::tmp_track_die(std::vector > *temp_t } }; -int Track_Init::track_init_prohibit(double r, double azi, const RDP_parameter& rdp_parameter) +int Track_Init::track_init_prohibit(double r, double azi) { for (int i=0;i *trust_track, //可靠航迹 std::vector > *temp_track, struct Track Trust_Track_Output[MAX_TRACK_NUM][10], - int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter + int *Trust_track_num_Output ); Track_Init(); @@ -31,23 +30,20 @@ private: std::vector point_process; //要处理的点迹 - void point_temp_track_asso(std::vector > *temp_track, - const RDP_parameter& rdp_parameter); //临时航迹与点迹关联 + void point_temp_track_asso(std::vector > *temp_track); //临时航迹与点迹关联 - void point_track_head_asso( std::vector > *temp_track, - const RDP_parameter& rdp_parameter); //航迹头与点迹关联 + void point_track_head_asso( std::vector > *temp_track); //航迹头与点迹关联 void tmp_track_to_trust_track( std::vector *trust_track, //临时航迹转可靠航迹 std::vector > *temp_track, struct Track Trust_Track_Output[MAX_TRACK_NUM][10], - int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter); + int *Trust_track_num_Output); void tmp_track_die(std::vector > *temp_track);//临时航迹消亡 double alpha_cal_track_init(double x0,double y0,double x1,double y1,double x2,double y2); //计算夹角 - int track_init_prohibit(double r, double azi, const RDP_parameter& rdp_parameter); //判断目标是否位于航迹起始屏蔽区 是返回1 否返回0 + int track_init_prohibit(double r, double azi); //判断目标是否位于航迹起始屏蔽区 是返回1 否返回0 Track_Ind_Mangement track_index_mangement; diff --git a/data_process_class_dll/track_init_direct_tracking.cpp b/data_process_class_dll/track_init_direct_tracking.cpp index 8d8d4f4..f5e1d9d 100644 --- a/data_process_class_dll/track_init_direct_tracking.cpp +++ b/data_process_class_dll/track_init_direct_tracking.cpp @@ -13,7 +13,6 @@ int Track_Init_Direct_Tracking::track_init_process_logic( std::vector std::vector > *temp_track, struct Track Trust_Track_Output[MAX_TRACK_NUM][10], int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter, int track_ID ) { @@ -22,8 +21,7 @@ int Track_Init_Direct_Tracking::track_init_process_logic( std::vector } -void Track_Init_Direct_Tracking::point_temp_track_asso(std::vector > *temp_track, - const RDP_parameter& rdp_parameter) //临时航迹与点迹关联 +void Track_Init_Direct_Tracking::point_temp_track_asso(std::vector > *temp_track) //临时航迹与点迹关联 { //关联信息 struct Asso_info @@ -70,7 +68,7 @@ void Track_Init_Direct_Tracking::point_temp_track_asso(std::vector > *temp_track, - const RDP_parameter& rdp_parameter) //航迹头与点迹关联 +void Track_Init_Direct_Tracking::point_track_head_asso( std::vector > *temp_track) //航迹头与点迹关联 { //关联上的信息 struct Asso_info @@ -270,7 +267,7 @@ void Track_Init_Direct_Tracking::point_track_head_asso( std::vector > *temp_track, struct Track Trust_Track_Output[MAX_TRACK_NUM][10], int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter, int track_ID) { //temp_track中的临时航迹转为可靠航迹 @@ -326,7 +322,7 @@ void Track_Init_Direct_Tracking::tmp_track_to_trust_track( std::vector> *temp_track, struct Track Trust_Track_Output[MAX_TRACK_NUM][10], int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter, int track_ID ); @@ -25,17 +24,14 @@ private: std::vector point_process; //要处理的点迹 - void point_temp_track_asso(std::vector > *temp_track, - const RDP_parameter& rdp_parameter); //临时航迹与点迹关联 + void point_temp_track_asso(std::vector > *temp_track); //临时航迹与点迹关联 - void point_track_head_asso( std::vector > *temp_track, - const RDP_parameter& rdp_parameter); //航迹头与点迹关联 + void point_track_head_asso( std::vector > *temp_track); //航迹头与点迹关联 void tmp_track_to_trust_track( std::vector *trust_track, //临时航迹转可靠航迹 std::vector > *temp_track, struct Track Trust_Track_Output[MAX_TRACK_NUM][10], int *Trust_track_num_Output, - const RDP_parameter& rdp_parameter, int track_ID ); diff --git a/docs/data_process_flow_report.md b/docs/data_process_flow_report.md index 4687c3a..7d1c1bf 100644 --- a/docs/data_process_flow_report.md +++ b/docs/data_process_flow_report.md @@ -532,7 +532,7 @@ flowchart TD ## 9. 参数脉络(决定行为的旋钮) -> **参数配置方式改造后**:雷达工作参数不再来自 `parameters.h` 编译期宏或宿主下发的 `RadarPara`,而是由 TOML 配置文件(样例 `config/config_tmp.toml`)加载到 `struct.h::RDP_parameter`,经公开接口 `parameters_reload(配置文件路径)` 在运行期一次性加载(失败返回 -1 且不改变当前参数;严格校验规则与完整参数表见 README 第 10 节)。下表「样例值」为相扫配置;**机扫需在配置中改**的 5 项(`scan_mode` 及 4 个原按体制区分的参数)已单独标注。 +> **参数配置方式改造后**:雷达工作参数不再来自 `parameters.h` 编译期宏或宿主下发的 `RadarPara`,而是由 TOML 配置文件(样例 `config/config_tmp.toml`)加载到**全局工作参数对象 `rdp_parameter`**(`struct.h` 中 `extern RDP_parameter rdp_parameter;` 声明、`data_process.cpp` 定义并零初始化),经公开接口 `parameters_reload(配置文件路径)` 在运行期一次性加载(失败返回 -1 且不改变当前参数;严格校验规则与完整参数表见 README 第 10 节)。各处理模块直接访问该全局对象,不再经函数形参逐层传递;全局对象为 DLL 内单实例、非线程安全,配置重载应与处理互斥。下表「样例值」为相扫配置;**机扫需在配置中改**的 5 项(`scan_mode` 及 4 个原按体制区分的参数)已单独标注。 ### 9.1 配置文件参数(`[段] 键`,样例值 = 相扫) diff --git a/docs/data_record_debug.md b/docs/data_record_debug.md index 3522892..aea1b6f 100644 --- a/docs/data_record_debug.md +++ b/docs/data_record_debug.md @@ -226,7 +226,7 @@ void WriteTrackHeights(std::vector v); //RdpRecTrackHeight | # | 记录点 | 位置(文件:行) | 记录宏 | 表 | 说明 | |---|---|---|---|---|---| -| ① | 输入点迹(TWS + TAS) | `data_process.cpp:72`(TWS 分支,判圈 return 之前)/ `data_process.cpp:150`(TAS 分支,`circle_id++` 之前) | `RDP_RECORD_POINTS` | `RdpRecPoint` | TWS/TAS **共用一张表**,用 `point_type` 区分;每个输入点迹一行,含 `point_id` / `frame_id` / `circle_id` 三个链路标识 | +| ① | 输入点迹(TWS + TAS) | `data_process.cpp:75`(TWS 分支,判圈 return 之前)/ `data_process.cpp:153`(TAS 分支,`circle_id++` 之前) | `RDP_RECORD_POINTS` | `RdpRecPoint` | TWS/TAS **共用一张表**,用 `point_type` 区分;每个输入点迹一行,含 `point_id` / `frame_id` / `circle_id` 三个链路标识 | | ② | TWS 凝聚后点迹 | `dot_coh.cpp:239`(`data_input_buff` 输出到 `point_recv` 的循环之后) | `RDP_RECORD_COHESION_TWS` | `RdpRecPointCohesionTWS` | 两帧滑窗凝聚后进入关联的点迹 | | ③ | TAS 凝聚后点迹 | `dot_coh_tas.cpp:82`(输出到 `point_recv_tas` 的循环之后) | `RDP_RECORD_COHESION_TAS` | `RdpRecPointCohesionTAS` | 单帧凝聚后的 TAS 点迹 | | ④ | 临时航迹 | `track_init.cpp:117`(TWS 圈内**转为可靠航迹之前**,清空点迹之后、`tmp_track_to_trust_track()` 之前,双层遍历 `temp_track` 收集) | `RDP_RECORD_TEMP_TRACKS` | `RdpRecTempTrack` | 每条临时航迹的每个点一行,含 `temp_track_id` / `point_id` / `circle_id`;记录时机于 e982804 前移,因此表中包含**本圈参与起始判定但可能随即起批转走**的临时航迹(原先在消亡之后记录会丢失这部分数据) | diff --git a/docs/track_init_readme.md b/docs/track_init_readme.md index 66747c3..1520063 100644 --- a/docs/track_init_readme.md +++ b/docs/track_init_readme.md @@ -45,14 +45,14 @@ flowchart LR 调用点(`data_process.cpp`): ```cpp -// L130-161,仅 model==1(TWS 满一圈)时执行 +// track_process()(data_process.cpp L167 起),仅 model==1(TWS 满一圈)时执行 track_asso.track_asso_process(&point_recv, &trust_track, ...); // 入口删除 Use_Flag==1 的点 track_die.track_die_process(&trust_track, ...); track_init.track_init_process_logic(&point_recv, &trust_track, &temp_track, - Trust_Track_Output, Trust_track_num_Output, rdp_parameter); + Trust_Track_Output, Trust_track_num_Output); ``` -> `rdp_parameter` 为 `Data_Process` 成员(`const RDP_parameter&` 传入),由公开接口 `parameters_reload(配置文件路径)` 从 TOML 配置文件加载(参数来源见 README 第 10 节;改造前为宿主下发 `RadarPara` + `parameters.h` 宏)。 +> 工作参数为**全局对象 `rdp_parameter`**(`struct.h` 中 `extern` 声明、`data_process.cpp` 定义并零初始化),由公开接口 `parameters_reload(配置文件路径)` 从 TOML 配置文件加载;各模块直接以 `rdp_parameter.` 访问,不再作为函数形参逐层传递(参数来源见 README 第 10 节;改造前为宿主下发 `RadarPara` + `parameters.h` 宏,更早则由 `const RDP_parameter&` 形参传入)。 ### 1.2 调用频率 = 扫描圈 @@ -116,7 +116,7 @@ track_init.track_init_process_logic(&point_recv, &trust_track, &temp_track, | `temp_track` | 输入/输出 | 临时航迹表(跨圈状态) | | `Trust_Track_Output[MAX_TRACK_NUM][10]` | 输出 | 与 `track_asso` **共用同一数组与同一计数**;起始流程在 `track_asso` 已写入的行之后追加新航迹的历史点 | | `Trust_track_num_Output` | 输出 | 累计行数(track_asso 输出 N 行后,track_init 在其后继续追加) | -| `const RDP_parameter& rdp_parameter` | 输入 | 工作参数(由 TOML 配置加载;改造前为宿主下发的 `RadarPara`) | +| 全局 `rdp_parameter` | 读取 | 工作参数(TOML 配置加载的全局对象,`struct.h` 声明、`data_process.cpp` 定义);**不再经函数形参传入**,模块直接访问 | > **输出行数核算**:`track_asso` 先为当圈**有更新**的可靠航迹写 N 行(输出循环判 `Track_Update_Flag==1` 并清零,即只含关联到实点或成功外推的航迹);`track_die` 随后删除 D 条(已写出的行与计数不变);起始流程每次起批前判 `trust_track->size() < track_index_max`(配置项,默认 500),故最多再追加 `499 − N + D` 行,**合计最多 499 + D 行**。正常情况下 D 很小,远小于 500;但理论上当 D ≥ 2 且当圈起批数量恰好占满配额(需数百条同时起批)时,行号会超过第一维容量 500,存在越界写入风险(极端场景,见 15.14)。第二维 `[j]`(j < L ≤ 10)始终安全。代价是可靠航迹数达 `track_index_max` 时不再允许新起批。 @@ -385,7 +385,7 @@ double azi = (*Iter)[L-1].azi/PI*180; // 转度,供屏蔽区比较 double quality = (*Iter)[L-1].quality; // V1.5.8:末点航迹质量 if( L <= 10 && L >= rdp_parameter.track_init_point_num_min - && track_init_prohibit(range, azi, rdp_parameter) == 0 + && track_init_prohibit(range, azi) == 0 && quality >= 按长度取的质量门限 ) // V1.5.8 新增 { 复制到 Track_to_start; 从 temp_track 中 erase; } else @@ -428,7 +428,7 @@ for (i: 0 .. size-2) for (j: i+1 .. size-1) { ```cpp if (Track_to_start[i].size() < 3) continue; // 防御 if (trust_track->size() < rdp_parameter.track_index_max) { // 默认 500 条上限 - int index = track_index_mangement.track_ind_get(trust_track, rdp_parameter); + int index = track_index_mangement.track_ind_get(trust_track); if (index > 0) { ... } } ``` @@ -438,7 +438,7 @@ if (trust_track->size() < rdp_parameter.track_index_max) { // 默认 500 条上 ```cpp Z0 = 极坐标→直角(点[L-3]); Z1 = (点[L-2]); Z2 = (点[L-1]); T1 = (点[L-2].T − 点[L-3].T)/1000.0; T2 = (点[L-1].T − 点[L-2].T)/1000.0; -Kalman.kalman_filter_init_3dots(Z0, Z1, Z2, T1, T2, X, P, rdp_parameter); // 6 维 [x,vx,ax,y,vy,ay] +Kalman.kalman_filter_init_3dots(Z0, Z1, Z2, T1, T2, X, P); // 6 维 [x,vx,ax,y,vy,ay] ``` > ⚠ **不一致点**:初始化用「最后三点」,而输出历史点(8.4)只写「前 `L` 个点」。当航迹长度 = `track_init_point_num_min` 时两者一致;当因屏蔽区滞留使长度 > 阈值时,输出的历史点里**不包含**用于初始化的那三个点。 @@ -786,6 +786,6 @@ $$ | `kalman.cpp` L780-789 | `Bind_speed` | 盲速计算 | | `coor_trans.cpp` L8-20 | `polar2cart` / `cart2polar` | 坐标转换 | | `track_index_mangement.cpp` L14-77 | `track_ind_get` | 航迹号分配 | -| `data_process.cpp` L51 | `data_preprocess` | 一圈完成 → `model=1` | -| `data_process.cpp` L154-159 | `track_process` | 起始流程调用点 | -| `data_process.cpp` L204-222 | 参数加载 | `parameters_reload()`:TOML 配置 → `rdp_parameter`(原「参数初始化/修改」已删除) | +| `data_process.cpp` L22 | `data_preprocess` | 一圈完成 → `model=1` | +| `data_process.cpp` L167 起 | `track_process` | 起始流程调用点(L187-201 调用 `track_asso`/`track_die`/`track_init`) | +| `data_process.cpp` L246-258 | 参数加载 | `parameters_reload()`:TOML 配置 → 全局对象 `rdp_parameter`(原「参数初始化/修改」已删除) | diff --git a/requirements.md b/requirements.md index cbdb6b3..5632b93 100644 --- a/requirements.md +++ b/requirements.md @@ -1,23 +1 @@ # 雷达数据处理项目修改说明 - -## 概述 - -本次修改主要是改进雷达数据处理的参数配置方式,由原来的通过宿主程序下发参数结构体(struct RadarPara),改为通过配置文件读取参数。 - -## 说明 - -* 新的参数结构体已经定义好,在struct.h文件中的(struct RDP_parameter),该结构体包含了所有的工作参数,包括原struct RadarPara结构体的参数以及parameters.h文件中的参数宏定义,已经将不需要和未用到的参数排除。 -* 配置文件采用toml格式,配置文件中的参数和struct RDP_parameter中的成员一一对应。预定义了一个[配置文件](config\config_tmp.toml)用于测试。读取配置文件使用[tomlplusplus库](https://github.com/marzer/tomlplusplus),该库的头文件已经下载保存到[目录](third_party\toml\toml.hpp)。 - -## 具体需求 - -### 参数加载函数 - -* 将data_process.h中的track_process_parameters_initial和track_process_parameters_modify删除; -* 新增一个parameters_reload函数,原型为:int parameters_reload(const char* parameter_file_path);输入为配置文件路径,输出为读取是否成功,成功返回0,失败返回-1。该函数将输入的配置文件加载到Data_Process::rdp_parameter中。 - -### 参数替换 - -* 将原有的struct RadarPara Work_Parameter删除,同时将所有引用到struct RadarPara Work_Parameter的参数替换为RDP_parameter rdp_parameter。 -* 将原来使用parameters.h中的宏定义参数的地方也替换为RDP_parameter rdp_parameter中的参数。 -* 如果有不确定的参数,直接向我提问,我来决定。 \ No newline at end of file