更新:1、增加扫描模式配置项;
2、优化不必要的宏定义; 3、合并机扫和相扫版本; Signed-off-by: waiwaylee <waiwaylee@foxmail.com>
This commit is contained in:
+7
-2
@@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
- **新增配置参数 `scan_mode`(参数配置方式改造)**:`struct.h::RDP_parameter` 的雷达工作参数组新增 `int scan_mode`(紧跟 `radar_work_mode`),语义 **0=相扫模式 / 1=机扫模式**;`rdp_parameter_loader.cpp` 在 `[radar_params]` 登记该键为**必填 int**,并校验只允许 0/1;样例 `config/config_tmp.toml` 新增 `scan_mode = 0`(相扫)。该配置项决定 `data_preprocess()` 的 TWS 判圈逻辑(见 Changed)。
|
||||||
- **参数加载器(参数配置方式改造,工作区未提交)**:新增内部模块 `data_process_class_dll/rdp_parameter_loader.h/.cpp`,把 TOML 配置文件解析到 `struct.h::RDP_parameter`(接口 `int rdp_parameter_load(const char* path, RDP_parameter& parameter, std::string* error_msg)`)。采用**严格校验**:11 个配置段(`radar_params` / `cohesion` / `track_associate` / `track_init` / `track_die` / `track_quality` / `track_index` / `beam_control` / `singer_model` / `track_init_prohibite_area` / `tas_prohibite_area`)全部必填;标量键全部必填且校验类型(数字/整数)与取值范围;拒绝未知配置段与未知键(拼错即报错);屏蔽区 4 个数组必须存在且元素个数等于对应 `*_num`(`*_num` 限 0~30,为 0 时数组可省略或为空数组),并逐区校验距离/方位范围。任一错误返回 -1 并给出首条可读原因,**不修改**调用方传入的参数(全部通过后才一次性赋值)。
|
- **参数加载器(参数配置方式改造,工作区未提交)**:新增内部模块 `data_process_class_dll/rdp_parameter_loader.h/.cpp`,把 TOML 配置文件解析到 `struct.h::RDP_parameter`(接口 `int rdp_parameter_load(const char* path, RDP_parameter& parameter, std::string* error_msg)`)。采用**严格校验**:11 个配置段(`radar_params` / `cohesion` / `track_associate` / `track_init` / `track_die` / `track_quality` / `track_index` / `beam_control` / `singer_model` / `track_init_prohibite_area` / `tas_prohibite_area`)全部必填;标量键全部必填且校验类型(数字/整数)与取值范围;拒绝未知配置段与未知键(拼错即报错);屏蔽区 4 个数组必须存在且元素个数等于对应 `*_num`(`*_num` 限 0~30,为 0 时数组可省略或为空数组),并逐区校验距离/方位范围。任一错误返回 -1 并给出首条可读原因,**不修改**调用方传入的参数(全部通过后才一次性赋值)。
|
||||||
- **新增公开虚接口 `parameters_reload`(参数配置方式改造)**:`data_process_class_dll.h` 的 `Data_process_class_dll` 新增 `virtual int parameters_reload(const char* parameter_file_path)`(基类空实现返回 -1);`Data_Process` 实现为「加载成功后整体赋值 `rdp_parameter`,失败保留当前参数并经 `RDP_LOG` 打印原因」。宿主改为在 `GetB()` 之后调用一次即可完成全部工作参数配置,重连/换配置时再次调用可热重载;不再需要构造并下发 `struct RadarPara`。
|
- **新增公开虚接口 `parameters_reload`(参数配置方式改造)**:`data_process_class_dll.h` 的 `Data_process_class_dll` 新增 `virtual int parameters_reload(const char* parameter_file_path)`(基类空实现返回 -1);`Data_Process` 实现为「加载成功后整体赋值 `rdp_parameter`,失败保留当前参数并经 `RDP_LOG` 打印原因」。宿主改为在 `GetB()` 之后调用一次即可完成全部工作参数配置,重连/换配置时再次调用可热重载;不再需要构造并下发 `struct RadarPara`。
|
||||||
- **示例配置文件 `config/config_tmp.toml`(参数配置方式改造)**:11 个配置段与 `RDP_parameter` 的注释分组一一对应,键名与结构体成员名完全一致(`[radar_params]`、`[cohesion]`、`[track_associate]`、`[track_init]`、`[track_die]`、`[track_quality]`、`[track_index]`、`[beam_control]`、`[singer_model]` 为标量段,两个屏蔽区段用与成员同名的 TOML 数组,样例为 `*_num = 0` + 空数组);数值与改造前的宏/`RadarPara` 默认值一致。
|
- **示例配置文件 `config/config_tmp.toml`(参数配置方式改造)**:11 个配置段与 `RDP_parameter` 的注释分组一一对应,键名与结构体成员名完全一致(`[radar_params]`、`[cohesion]`、`[track_associate]`、`[track_init]`、`[track_die]`、`[track_quality]`、`[track_index]`、`[beam_control]`、`[singer_model]` 为标量段,两个屏蔽区段用与成员同名的 TOML 数组,样例为 `*_num = 0` + 空数组);数值与改造前的宏/`RadarPara` 默认值一致。
|
||||||
@@ -28,12 +29,14 @@
|
|||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
- **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` 宏保留,但只剩以下用途:CMake 缓存变量 `RADAR_SCAN_MODE` 的编译定义与构建目录/任务命名、`parameters.h` 的 `VERSION_INFO`(PS/MS 版本后缀)与 `#pragma message`;**不再决定 `data_process.cpp` 的判圈行为**。配置项与构建体制不一致时不会报错(版本串反映构建体制、判圈行为反映配置),部署时应保持一致。
|
||||||
|
- **本次 `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()` 成功后才整体替换。改造只替换参数来源,不改变公式、阈值语义与处理流程,默认数值与改造前一致。
|
- **参数来源改为「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` 保持原签名。
|
- **各模块参数传递方式(参数配置方式改造)**:`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 节。
|
- **旧宏与旧 `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<int>`;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`。
|
- **航迹号、TAS 队列与跟踪波束类型改为按配置分配(参数配置方式改造)**:`track_index_mangement.cpp` 的定长数组 `int List[MAX_TRACK_INDEX]` 改为按 `rdp_parameter.track_index_max` 分配的 `std::vector<int>`;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)、`UNCONF_TARGET` 与 `Round`;`requirements.md` 同时改写为本次参数配置方式改造的需求说明。
|
- **`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` 同时改写为本次参数配置方式改造的需求说明。
|
||||||
- **本次改造的验证(Lead 实测,2026-10-27)**:① 构建:8 个配置(X256_PS/X256_MS × Release/Debug × REC_OFF/REC_ON)全部成功、退出码 0、0 warning 0 error,每个配置均生成 `bin/data_process_class_dll.dll`;Release REC_OFF DLL 体积 331,776 字节(约 324 KB,较改造前约 178 KB 增大,原因是纯头文件的 toml++ 解析器编入 DLL),Debug REC_ON 为 4,694,016 字节。② 导出表(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` 等其余接口不变。③ 加载器单元测试(229 项断言全部通过):样例配置 62 个键逐字段取值正确(含整数/浮点与负的二次/一次衰减系数);文件不存在、空路径、nullptr、TOML 语法错误、缺标量键、类型错误、未知键、缺配置段、取值越界(起批点数 2、`data_rate_tas=0`)、区域数 31、区域方位 min≥max、数组长度与 `*_num` 不一致等失败路径均返回 -1 且不修改当前参数,失败后可重新加载成功;屏蔽区数组按 `*_num` 读取、未使用位置保持 0。④ 公开接口运行期测试(8 个配置逐一编译链接运行,各 29 项断言全部通过):`GetB()`/`version_info`(`V1.5.8.PS`/`V1.5.8.MS`)、`parameters_reload` 成功/失败返回值与「失败后再加载成功」、TWS/TAS 主流程冒烟、`Beam_Ctrl`、`track_clear_all`、`track_delete`/`tracking_start`/`tracking_stop`/`primary_target_add`/`primary_target_cancel`/`tracking_point`、`Destroy()` 后重新 `GetB()` 并再次加载配置均正常。⑤ 静态审计:源码无 `Work_Parameter`/`RadarPara`/旧参数宏残留(区分大小写整词审计 0 命中);62 个 `RDP_parameter` 成员 ↔ 62 个加载器键 ↔ 62 个 TOML 键一一对应,11 个配置段与加载器一致。验证程序与日志位于 git 忽略的构建目录中,未入库。
|
- **本次改造的验证(Lead 实测,2026-10-27)**:① 构建:8 个配置(X256_PS/X256_MS × Release/Debug × REC_OFF/REC_ON)全部成功、退出码 0、0 warning 0 error,每个配置均生成 `bin/data_process_class_dll.dll`;Release REC_OFF DLL 体积 331,776 字节(约 324 KB,较改造前约 178 KB 增大,原因是纯头文件的 toml++ 解析器编入 DLL),Debug REC_ON 为 4,694,016 字节。② 导出表(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` 等其余接口不变。③ 加载器单元测试(229 项断言全部通过):样例配置 62 个键逐字段取值正确(含整数/浮点与负的二次/一次衰减系数;该轮为 `scan_mode` 新增前的验证,新增后样例共 63 个键,见上一条 `scan_mode` 验证);文件不存在、空路径、nullptr、TOML 语法错误、缺标量键、类型错误、未知键、缺配置段、取值越界(起批点数 2、`data_rate_tas=0`)、区域数 31、区域方位 min≥max、数组长度与 `*_num` 不一致等失败路径均返回 -1 且不修改当前参数,失败后可重新加载成功;屏蔽区数组按 `*_num` 读取、未使用位置保持 0。④ 公开接口运行期测试(8 个配置逐一编译链接运行,各 29 项断言全部通过):`GetB()`/`version_info`(`V1.5.8.PS`/`V1.5.8.MS`)、`parameters_reload` 成功/失败返回值与「失败后再加载成功」、TWS/TAS 主流程冒烟、`Beam_Ctrl`、`track_clear_all`、`track_delete`/`tracking_start`/`tracking_stop`/`primary_target_add`/`primary_target_cancel`/`tracking_point`、`Destroy()` 后重新 `GetB()` 并再次加载配置均正常。⑤ 静态审计:源码无 `Work_Parameter`/`RadarPara`/旧参数宏残留(区分大小写整词审计 0 命中);首轮验证时 62 个 `RDP_parameter` 成员 ↔ 62 个加载器键 ↔ 62 个 TOML 键一一对应(新增 `scan_mode` 后为 63 个),11 个配置段与加载器一致。验证程序与日志位于 git 忽略的构建目录中,未入库。
|
||||||
- 构建目录布局由「每个扫描体制一个目录(Release/Debug 共用、重新配置互相覆盖)」改为按完整配置隔离:`build/<X256_PS|X256_MS>/<Debug|Release>/<REC_AUTO|REC_OFF|REC_ON>`,关闭/开启记录模块的产物可并存、互不覆盖。
|
- 构建目录布局由「每个扫描体制一个目录(Release/Debug 共用、重新配置互相覆盖)」改为按完整配置隔离:`build/<X256_PS|X256_MS>/<Debug|Release>/<REC_AUTO|REC_OFF|REC_ON>`,关闭/开启记录模块的产物可并存、互不覆盖。
|
||||||
- `configure.bat` / `build.bat` / `clean.bat` 参数由 `<build-dir> ...` 改为 `<PHASE_SCANNING|MECHANICAL_SCANNING> <Debug|Release> [AUTO|ON|OFF]`,构建目录自动推导;`clean.bat` 由 `cmake --build --target clean` 改为删除该配置的构建目录(因此放在配置目录 `bin/` 下、CMake 不会重建的 `rdp_playback.exe`/回放数据会一并删除,需放到 `build/output/` 或仓库外)。
|
- `configure.bat` / `build.bat` / `clean.bat` 参数由 `<build-dir> ...` 改为 `<PHASE_SCANNING|MECHANICAL_SCANNING> <Debug|Release> [AUTO|ON|OFF]`,构建目录自动推导;`clean.bat` 由 `cmake --build --target clean` 改为删除该配置的构建目录(因此放在配置目录 `bin/` 下、CMake 不会重建的 `rdp_playback.exe`/回放数据会一并删除,需放到 `build/output/` 或仓库外)。
|
||||||
- VS Code 配置同步:`settings.json` 的 `cmake.buildDirectory` 改为 `${workspaceFolder}/build/${variant:scanMode}/${buildType}/${variant:recordMode}`、`compileCommands` 指向 `build/X256_PS/Debug/REC_ON/compile_commands.json`;`cmake-variants.yaml` 新增 `recordMode` 变体(REC_AUTO / REC_OFF / REC_ON,映射 `RDP_DATA_RECORD`);`c_cpp_properties.json` 的 `compileCommands` 更新到新目录;`launch.json` 的 `preLaunchTask` 改为「配置并构建全部(Debug/REC_ON)」,`program`/`symbolSearchPath` 指向 `build/X256_PS/Debug/REC_ON/bin`。
|
- VS Code 配置同步:`settings.json` 的 `cmake.buildDirectory` 改为 `${workspaceFolder}/build/${variant:scanMode}/${buildType}/${variant:recordMode}`、`compileCommands` 指向 `build/X256_PS/Debug/REC_ON/compile_commands.json`;`cmake-variants.yaml` 新增 `recordMode` 变体(REC_AUTO / REC_OFF / REC_ON,映射 `RDP_DATA_RECORD`);`c_cpp_properties.json` 的 `compileCommands` 更新到新目录;`launch.json` 的 `preLaunchTask` 改为「配置并构建全部(Debug/REC_ON)」,`program`/`symbolSearchPath` 指向 `build/X256_PS/Debug/REC_ON/bin`。
|
||||||
@@ -48,6 +51,7 @@
|
|||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
|
- 文档同步「`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` 调用方式与旧→新对照,数值未变。
|
- 修正文档中把参数来源写成「`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」。
|
- 修正文档中 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」。
|
||||||
- 修正 `docs/data_record_debug.md` 中「质量字段尚未加入记录实体」的过期描述(本次文档更新,对应 1ffb287):字段速查与记录点说明补齐 `quality` / `Quality` / `Unupdated_time` / `Point_sum` / `Valid_point_sum`。
|
- 修正 `docs/data_record_debug.md` 中「质量字段尚未加入记录实体」的过期描述(本次文档更新,对应 1ffb287):字段速查与记录点说明补齐 `quality` / `Quality` / `Unupdated_time` / `Point_sum` / `Valid_point_sum`。
|
||||||
@@ -56,6 +60,7 @@
|
|||||||
|
|
||||||
- **删除 `struct RadarPara` 与两个旧公开虚接口(参数配置方式改造)**:`data_process_class_dll.h` 中的 `struct RadarPara` 及 `track_process_parameters_initial(RadarPara)` / `track_process_parameters_modify(RadarPara)` 整体删除,由 `parameters_reload(const char*)` 取代;`data_process.h` 中的 `struct RadarPara Work_Parameter` 删除。旧 `RadarPara` 中实现未使用的字段(`R_TAS_max/min`、`V_TAS_max/min`、`TAS_Height_1~5`、`cfar_th`、`north_angle`、`Beam_num`)未进入新结构体(相应自动 TAS 逻辑仍保持停用)。
|
- **删除 `struct RadarPara` 与两个旧公开虚接口(参数配置方式改造)**:`data_process_class_dll.h` 中的 `struct RadarPara` 及 `track_process_parameters_initial(RadarPara)` / `track_process_parameters_modify(RadarPara)` 整体删除,由 `parameters_reload(const char*)` 取代;`data_process.h` 中的 `struct RadarPara Work_Parameter` 删除。旧 `RadarPara` 中实现未使用的字段(`R_TAS_max/min`、`V_TAS_max/min`、`TAS_Height_1~5`、`cfar_th`、`north_angle`、`Beam_num`)未进入新结构体(相应自动 TAS 逻辑仍保持停用)。
|
||||||
- **删除 `parameters.h` 中的雷达工作参数宏(参数配置方式改造)**:`SIGMA_R/A/E/V`、`DOT_COH_RANGE/V/AZI`、`R_MIN`/`R_MAX`、`FREQ0`、`ASSO_THORD`、`MAX_EXTRAPOLATE_NUM(_TAS)`、`H_F_WIN_LEN`、`TRACK_START_THRESHOLD`、`ALPHA_START`、`TRACK_START_QUALITY_L3~L7`、`TRACK_DIE_*`、`TRACK_QUALITY_*`、`MAX_TRACK_INDEX`、`MAX_TAS_NUM`、`TAS_QUEUE_LENGTH`、`DATA_RATE_*`(含 `H_F_WIN_LEN`、`MAX_BEAM_NUM`、`ASSOCIATE_THRESHOLD_MIN/MID/MAX`、`DIRECT_TRACKING_QUEUE_LENGTH` 等)以及已注释的 `V_MAX`/`V_MIN` 残留;这些参数改由配置文件提供(见 `README.md` 10.1~10.3)。
|
- **删除 `parameters.h` 中的雷达工作参数宏(参数配置方式改造)**:`SIGMA_R/A/E/V`、`DOT_COH_RANGE/V/AZI`、`R_MIN`/`R_MAX`、`FREQ0`、`ASSO_THORD`、`MAX_EXTRAPOLATE_NUM(_TAS)`、`H_F_WIN_LEN`、`TRACK_START_THRESHOLD`、`ALPHA_START`、`TRACK_START_QUALITY_L3~L7`、`TRACK_DIE_*`、`TRACK_QUALITY_*`、`MAX_TRACK_INDEX`、`MAX_TAS_NUM`、`TAS_QUEUE_LENGTH`、`DATA_RATE_*`(含 `H_F_WIN_LEN`、`MAX_BEAM_NUM`、`ASSOCIATE_THRESHOLD_MIN/MID/MAX`、`DIRECT_TRACKING_QUEUE_LENGTH` 等)以及已注释的 `V_MAX`/`V_MIN` 残留;这些参数改由配置文件提供(见 `README.md` 10.1~10.3)。
|
||||||
|
- **删除 `UNCONF_TARGET` 宏(参数配置方式改造)**:`parameters.h` 的未确认目标类型语义常量 `UNCONF_TARGET`(0)删除,`track_init.cpp` / `track_init_direct_tracking.cpp` 起批处 `Target_Type` 改为直接写 0,语义不变。
|
||||||
- 删除 `tasks.json` 中原有的 15 个任务(`CMake: 配置 X256_PS|X256_MS`、`CMake: 构建 ...`、`CMake: 清理 ...`、`CMake: 配置并构建 ...` 等),改为上述 5 个任务。
|
- 删除 `tasks.json` 中原有的 15 个任务(`CMake: 配置 X256_PS|X256_MS`、`CMake: 构建 ...`、`CMake: 清理 ...`、`CMake: 配置并构建 ...` 等),改为上述 5 个任务。
|
||||||
|
|
||||||
## [1.5.8] - 2026-10-20
|
## [1.5.8] - 2026-10-20
|
||||||
|
|||||||
@@ -51,12 +51,13 @@
|
|||||||
| 点迹类型 | point_type = 0 为 TWS,point_type = 1 为 TAS |
|
| 点迹类型 | point_type = 0 为 TWS,point_type = 1 为 TAS |
|
||||||
| 跟踪模式 | Track_Mode = 0 为 TWS,Track_Mode = 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` 为样例)→ 内部 `struct RDP_parameter`,宿主通过 `parameters_reload()` 加载;参数对照见 10 |
|
||||||
|
| 判圈模式 | 由配置项 `[radar_params] scan_mode` 运行时选择:0 相扫(波位号 ≤ 上一帧判满圈)/ 1 机扫(波位号 == 0 判满圈),与构建体制解耦(见 4.2、7.2) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. 功能特性
|
## 2. 功能特性
|
||||||
|
|
||||||
- **双模式处理管线**:data_preprocess 按输入类型与扫描圈完成标志返回 0/1/2/3,track_process 据此调度 TWS 凝聚/关联/起始或 TAS 凝聚/关联。判圈条件按扫描体制区分(3e6763c,编译期 `#ifdef PHASE_SCANNING` 隔离):**相扫**比较前后两帧方位波位号(当前波位号 ≤ 上一帧波位号即判满圈),**机扫**以「方位波位号 == 0」判满圈(规避转台反转导致的误判),详见 7.2。
|
- **双模式处理管线**:data_preprocess 按输入类型与扫描圈完成标志返回 0/1/2/3,track_process 据此调度 TWS 凝聚/关联/起始或 TAS 凝聚/关联。判圈条件由配置项 `[radar_params] scan_mode` **运行时**选择(0 相扫 / 1 机扫):**相扫**比较前后两帧方位波位号(当前波位号 ≤ 上一帧波位号即判满圈),**机扫**以「方位波位号 == 0」判满圈(规避转台反转导致的误判),详见 7.2。
|
||||||
- **两帧滑窗点迹凝聚**:TWS 点迹先与上一帧缓存合并凝聚,再进入关联,兼顾跨波位(CPI)相邻点迹的分裂问题;近程模式增加速度维约束。
|
- **两帧滑窗点迹凝聚**:TWS 点迹先与上一帧缓存合并凝聚,再进入关联,兼顾跨波位(CPI)相邻点迹的分裂问题;近程模式增加速度维约束。
|
||||||
- **逻辑法航迹起始**:每圈按固定顺序推进——① 未关联点迹先与 ≥2 点临时航迹做 EKF 波门 + 折角约束关联(延长临时航迹),② 再与 1 点航迹头做速度法关联(两点卡尔曼初始化出 2 点临时航迹),③ 两步都做完后删除被消费的点迹、剩余点迹转成新航迹头,④ 长度达标的临时航迹经三点卡尔曼初始化转可靠航迹;带起批屏蔽区与重复航迹去重。
|
- **逻辑法航迹起始**:每圈按固定顺序推进——① 未关联点迹先与 ≥2 点临时航迹做 EKF 波门 + 折角约束关联(延长临时航迹),② 再与 1 点航迹头做速度法关联(两点卡尔曼初始化出 2 点临时航迹),③ 两步都做完后删除被消费的点迹、剩余点迹转成新航迹头,④ 长度达标的临时航迹经三点卡尔曼初始化转可靠航迹;带起批屏蔽区与重复航迹去重。
|
||||||
- **3 模型 IMM 滤波**:三个 Singer 模型(低/中/高过程噪声),量测为「距离-方位-径向速度」三维的 EKF,多普勒残差按盲速折叠,似然用 3×3 新息协方差。
|
- **3 模型 IMM 滤波**:三个 Singer 模型(低/中/高过程噪声),量测为「距离-方位-径向速度」三维的 EKF,多普勒残差按盲速折叠,似然用 3×3 新息协方差。
|
||||||
@@ -65,8 +66,8 @@
|
|||||||
- **航迹质量(V1.5.8)**:归一化航迹质量(0~1,内部)贯穿起始→关联→外推三阶段——临时航迹每延长一点按「统计距离 + SNR」重算,关联实点后按「统计距离 + SNR + 有效点占比」加权并指数平滑,未关联期间按未更新时长二次衰减;起批需达到**按长度分级**的最低质量,输出航迹给 0~100 的 `Quality` 字段;**普通 TWS 航迹的消亡改由质量决定**(`Quality < 0.3`),重点航迹与 TAS 航迹仍按外推圈数(见 9.11)。
|
- **航迹质量(V1.5.8)**:归一化航迹质量(0~1,内部)贯穿起始→关联→外推三阶段——临时航迹每延长一点按「统计距离 + SNR」重算,关联实点后按「统计距离 + SNR + 有效点占比」加权并指数平滑,未关联期间按未更新时长二次衰减;起批需达到**按长度分级**的最低质量,输出航迹给 0~100 的 `Quality` 字段;**普通 TWS 航迹的消亡改由质量决定**(`Quality < 0.3`),重点航迹与 TAS 航迹仍按外推圈数(见 9.11)。
|
||||||
- **点迹附加信息字段扩展(需同步重编译宿主)**:`DataRev` 新增 `amp_asv` / `prn_fftn`,`Track` 新增 `amp_asv_point` / `prn_fftn_point`,结构体布局随之变化,宿主必须使用同一版本头文件重新编译对接;输入侧已打通(TWS 输出有效,TAS 输出仍未写回),详见 11.2。
|
- **点迹附加信息字段扩展(需同步重编译宿主)**:`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)。
|
- **高度维独立平滑**:按距离分段选择滑动平均窗长,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` 为**相扫**取值;`extrapolate_max_tas`、`height_smooth_win`、`track_die_round_tas`、`tas_track_num_max` 在改造前按扫描体制取不同宏值(机扫依次为 48 / 3 / 96 / 1),现在同一份配置对所有体制生效,机扫部署需改用对应取值的配置文件(相扫/机扫的**判圈逻辑**仍由编译期 `PHASE_SCANNING` / `MECHANICAL_SCANNING` 区分,见 4.2、7.2)。
|
- **参数配置外置(参数配置方式改造)**:全部工作参数(原 `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 目标入队(队列长度与容量随扫描体制切换),按最新时间戳外推输出跟踪波束(距离/方位/俯仰/批号)。
|
- **TAS 波束控制**:手动转 TAS 目标入队(队列容量为编译期常量 `RDP_TAS_QUEUE_CAPACITY`、运行期上限为配置项 `tas_track_num_max`),按最新时间戳外推输出跟踪波束(距离/方位/俯仰/批号)。
|
||||||
- **航迹生命周期管理**:外推轮数计数、超时消亡与质量消亡(普通 TWS 航迹)、手动删除、全清空(含各模块 reset,防重连后幽灵航迹)。
|
- **航迹生命周期管理**:外推轮数计数、超时消亡与质量消亡(普通 TWS 航迹)、手动删除、全清空(含各模块 reset,防重连后幽灵航迹)。
|
||||||
- **防御性加固**:见 archived_docs/BUG_FIX_REPORT.md——越界防护、时间戳正序校验、方位角 ±π 环绕、asin 定义域钳位、IMM 概率奇异保护等已修复项。
|
- **防御性加固**:见 archived_docs/BUG_FIX_REPORT.md——越界防护、时间戳正序校验、方位角 ±π 环绕、asin 定义域钳位、IMM 概率奇异保护等已修复项。
|
||||||
- **日志文件输出**:`RDP_LOG_ENABLE` 定义时,首次 `Data_Process_Factory::GetB()` 自动用 `rdbuf()` 将 `std::cout` 重定向到 `RDP_LOG_DIR`(`.\rdp_logs\`)下按日期+时间命名的日志文件,`Destroy()` 时恢复控制台并关闭文件;`RDP_LOG` 日志宏在每条日志前附加 `[时间戳][文件:行号]`。该宏在 `parameters.h` 中**当前为注释状态(默认不启用)**,即默认不做重定向、日志输出到控制台(见 10.4)。
|
- **日志文件输出**:`RDP_LOG_ENABLE` 定义时,首次 `Data_Process_Factory::GetB()` 自动用 `rdbuf()` 将 `std::cout` 重定向到 `RDP_LOG_DIR`(`.\rdp_logs\`)下按日期+时间命名的日志文件,`Destroy()` 时恢复控制台并关闭文件;`RDP_LOG` 日志宏在每条日志前附加 `[时间戳][文件:行号]`。该宏在 `parameters.h` 中**当前为注释状态(默认不启用)**,即默认不做重定向、日志输出到控制台(见 10.4)。
|
||||||
@@ -123,7 +124,7 @@
|
|||||||
│ ├── rdp_parameter_loader.h / .cpp # TOML 参数加载器(内部模块,不属于宿主接口):rdp_parameter_load() 严格校验 11 个配置段并写入 RDP_parameter,失败返回 -1 且不改变入参
|
│ ├── 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 自增计数(记录用)
|
│ ├── 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 配置一一对应)
|
│ ├── struct.h # 内部结构体:PointRecv / Trust_Track / Temp_track / Asso_Info / Tracking_Target / RDP_parameter(工作参数,与 TOML 配置一一对应)
|
||||||
│ ├── parameters.h # 编译期常量:PI、版本宏、RDP_LOG_*、RDP_RECORD_*、MAX_TRACK_NUM、RDP_TAS_QUEUE_CAPACITY、UNCONF_TARGET、Round(不再含雷达工作参数宏)
|
│ ├── parameters.h # 编译期常量:PI、版本宏、RDP_LOG_*、RDP_RECORD_*、MAX_TRACK_NUM、RDP_TAS_QUEUE_CAPACITY、Round(不再含雷达工作参数宏;扫描体制宏由 CMake 传入,仅用于版本后缀/构建标识)
|
||||||
│ ├── dot_coh.h / .cpp # TWS 点迹凝聚(含两帧滑窗缓冲)
|
│ ├── dot_coh.h / .cpp # TWS 点迹凝聚(含两帧滑窗缓冲)
|
||||||
│ ├── dot_coh_tas.h / .cpp # TAS 点迹凝聚
|
│ ├── dot_coh_tas.h / .cpp # TAS 点迹凝聚
|
||||||
│ ├── coor_trans.h / .cpp # 极坐标 ↔ 直角坐标转换
|
│ ├── coor_trans.h / .cpp # 极坐标 ↔ 直角坐标转换
|
||||||
@@ -168,7 +169,11 @@
|
|||||||
|
|
||||||
### 4.2 扫描体制
|
### 4.2 扫描体制
|
||||||
|
|
||||||
通过 CMake 缓存变量 RADAR_SCAN_MODE 切换,决定编译期扫描体制分支(`parameters.h` 中不再有按体制分组的雷达工作参数宏,参数统一由配置文件提供,见 10);每个「扫描体制 × 构建类型 × 记录模式」组合拥有独立构建目录(见 4.3):
|
通过 CMake 缓存变量 RADAR_SCAN_MODE 切换构建体制,`CMakeLists.txt` 以 `target_compile_definitions` 定义 `PHASE_SCANNING` / `MECHANICAL_SCANNING` 宏。该体制现在**只决定**:① `parameters.h` 的 `VERSION_INFO`(`V1.5.8.PS` / `V1.5.8.MS` 版本后缀)与 `#pragma message`;② 构建目录与 VS Code 任务命名(`X256_PS` / `X256_MS`)。**TWS 判圈行为不再由构建体制决定**,而由参数配置项 `[radar_params] scan_mode` 在运行时选择(0 相扫 / 1 机扫,见 7.2);参数统一由配置文件提供(见 10)。
|
||||||
|
|
||||||
|
> ⚠ **部署一致性要求**:DLL 不校验 `scan_mode` 与构建体制是否一致。若不一致,`version_info` 版本串反映的是构建体制、而实际判圈行为反映配置(不报错)。**机扫部署应同时使用机扫构建(`MECHANICAL_SCANNING`)与 `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` 为相扫取值)。
|
||||||
|
|
||||||
|
每个「扫描体制 × 构建类型 × 记录模式」组合拥有独立构建目录(见 4.3):
|
||||||
|
|
||||||
| 变量值 | 对应宏 | 构建目录 |
|
| 变量值 | 对应宏 | 构建目录 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -419,11 +424,11 @@ classDiagram
|
|||||||
| 返回值 | 含义 | 触发条件 |
|
| 返回值 | 含义 | 触发条件 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 0 | 无效数据 | point_type 既非 0 也非 1 |
|
| 0 | 无效数据 | point_type 既非 0 也非 1 |
|
||||||
| 1 | **TWS 满一圈,执行航迹处理** | point_type==0 且判圈条件成立:**相扫**(`PHASE_SCANNING`)当前帧方位波位号 ≤ 上一帧波位号 `last_beam_num`;**机扫**(`MECHANICAL_SCANNING`)当前帧方位波位号 == 0 |
|
| 1 | **TWS 满一圈,执行航迹处理** | point_type==0 且判圈条件成立:`scan_mode==0`(相扫)时当前帧方位波位号 ≤ 上一帧波位号 `last_beam_num`;`scan_mode==1`(机扫)时当前帧方位波位号 == 0 |
|
||||||
| 2 | **TWS 未满一圈,继续蓄数据** | point_type==0 且上述判圈条件不成立;调用 track_process(model=2) 做滑窗凝聚 |
|
| 2 | **TWS 未满一圈,继续蓄数据** | point_type==0 且上述判圈条件不成立;调用 track_process(model=2) 做滑窗凝聚 |
|
||||||
| 3 | **TAS 处理** | point_type==1;同时记录 TAS_track_idx 与最新时间戳 |
|
| 3 | **TAS 处理** | point_type==1;同时记录 TAS_track_idx 与最新时间戳 |
|
||||||
|
|
||||||
> **判圈条件按体制区分(3e6763c)**:源码用 `#ifdef PHASE_SCANNING` 把两条判据编译期隔离——相扫走「波位号不变大(当前 ≤ 上一帧)即为新一圈」的判据(`last_beam_num` 参与判断,`track_clear_all()` 复位为 INT_MAX,故**相扫首帧即返回 1**);机扫保持 7d5a56f 的「方位波位号 == 0」判据(机扫转台反转时波位号会变小但并未扫完一圈,用波位号比较会误判),此分支下 `last_beam_num` 仍被赋值但不参与判断。因此同一份源码按体制构建出的判圈行为不同,调用方需按实际体制提供对应的波位号序列:相扫要求每圈波位号先增后回到起点、机扫要求每圈均出现 0。
|
> **判圈由配置项 `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 典型调用序列
|
### 7.3 典型调用序列
|
||||||
|
|
||||||
@@ -455,7 +460,7 @@ flowchart TD
|
|||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
flowchart TD
|
flowchart TD
|
||||||
A["data_preprocess: 点迹入 Data_buffer(度→弧度、高度=Range·sin(Elev)、时间戳缓存)"] --> B["判圈成立(相扫: 波位号 ≤ 上一帧 / 机扫: 波位号 == 0)→ model=1"]
|
A["data_preprocess: 点迹入 Data_buffer(度→弧度、高度=Range·sin(Elev)、时间戳缓存)"] --> B["判圈成立(由配置 scan_mode 选择:0 相扫: 波位号 ≤ 上一帧 / 1 机扫: 波位号 == 0)→ model=1"]
|
||||||
B --> C["track_process(1)"]
|
B --> C["track_process(1)"]
|
||||||
C --> D["dot_coh 两帧滑窗凝聚 → point_recv"]
|
C --> D["dot_coh 两帧滑窗凝聚 → point_recv"]
|
||||||
D --> E["track_asso: IMM 交互 → 点航波门筛选(NN)→ EKF 滤波 → 模型输出"]
|
D --> E["track_asso: IMM 交互 → 点航波门筛选(NN)→ EKF 滤波 → 模型输出"]
|
||||||
@@ -986,7 +991,7 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
|||||||
|
|
||||||
| 配置段 | 内容 |
|
| 配置段 | 内容 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `[radar_params]` | 雷达工作参数:工作模式、频点、平台高度、系统延迟、TWS/TAS/纯跟踪数据率 |
|
| `[radar_params]` | 雷达工作参数:工作模式、**扫描模式 `scan_mode`**、频点、平台高度、系统延迟、TWS/TAS/纯跟踪数据率 |
|
||||||
| `[cohesion]` | 点迹凝聚参数:距离/速度/方位门限、有效量程上下限 |
|
| `[cohesion]` | 点迹凝聚参数:距离/速度/方位门限、有效量程上下限 |
|
||||||
| `[track_associate]` | 航迹关联参数:量测误差 `sigma_*`、关联门限 `associate_threshold`、外推上限、高度平滑窗长 |
|
| `[track_associate]` | 航迹关联参数:量测误差 `sigma_*`、关联门限 `associate_threshold`、外推上限、高度平滑窗长 |
|
||||||
| `[track_init]` | 航迹起始参数:起批波门/折角/点数、起批质量门限 L3~L7、起始速度范围 |
|
| `[track_init]` | 航迹起始参数:起批波门/折角/点数、起批质量门限 L3~L7、起始速度范围 |
|
||||||
@@ -1003,11 +1008,11 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
|||||||
1. 11 个配置段**全部必填**,且必须是 TOML 表;顶层出现未知配置段直接拒绝;
|
1. 11 个配置段**全部必填**,且必须是 TOML 表;顶层出现未知配置段直接拒绝;
|
||||||
2. 所有**标量键必填**,类型必须匹配(浮点参数接受整数或浮点,整数参数只接受整数),且不得超出 C++ `float`/`int` 可表示范围;
|
2. 所有**标量键必填**,类型必须匹配(浮点参数接受整数或浮点,整数参数只接受整数),且不得超出 C++ `float`/`int` 可表示范围;
|
||||||
3. 每个段内只允许登记过的键,**拼错的键按未知参数拒绝**(不会静默忽略);
|
3. 每个段内只允许登记过的键,**拼错的键按未知参数拒绝**(不会静默忽略);
|
||||||
4. 取值范围校验:如 `radar_work_mode∈[0,2]`、`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 等(完整清单以源码为准);
|
4. 取值范围校验:如 `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 等(完整清单以源码为准);
|
||||||
5. 屏蔽区:`*_num∈[0,30]`;4 个数组的元素个数必须**等于** `*_num`(`*_num=0` 时数组可省略,存在时必须为空数组);并逐区校验距离 `0≤min<max`、方位 `0≤min<max≤360`;
|
5. 屏蔽区:`*_num∈[0,30]`;4 个数组的元素个数必须**等于** `*_num`(`*_num=0` 时数组可省略,存在时必须为空数组);并逐区校验距离 `0≤min<max`、方位 `0≤min<max≤360`;
|
||||||
6. 失败语义:返回 -1,并经可选 `std::string* error_msg` 给出**首条**可读原因(`Data_Process::parameters_reload` 会打印到 `RDP_LOG`),**当前已加载参数保持不变**(加载过程先写入临时对象,全部成功后才整体赋值)。
|
6. 失败语义:返回 -1,并经可选 `std::string* error_msg` 给出**首条**可读原因(`Data_Process::parameters_reload` 会打印到 `RDP_LOG`),**当前已加载参数保持不变**(加载过程先写入临时对象,全部成功后才整体赋值)。
|
||||||
|
|
||||||
> 兼容性提示:改造前 `TRACK_DIE_ROUND_TAS`、`MAX_EXTRAPOLATE_NUM_TAS`、`H_F_WIN_LEN`、`TAS_QUEUE_LENGTH`/`MAX_TAS_NUM` 按扫描体制取不同宏值;现在同一份配置对所有体制生效。`config/config_tmp.toml` 是**相扫**取值,机扫部署需把这 4 项分别配为 `track_die_round_tas=96`、`extrapolate_max_tas=48`、`height_smooth_win=3`、`tas_track_num_max=1`(其余参数两体制相同)。注意「相扫/机扫判圈逻辑」不是配置项,仍由编译期 `PHASE_SCANNING` / `MECHANICAL_SCANNING` 区分(见 7.2)。
|
> 兼容性提示:改造前 `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),不再由编译期 `PHASE_SCANNING` / `MECHANICAL_SCANNING` 区分;构建体制只决定版本后缀与构建目录/产物命名,两者应保持一致(见 4.2)。
|
||||||
|
|
||||||
### 10.2 参数表(`RDP_parameter` 字段 ↔ TOML 键 ↔ 样例值)
|
### 10.2 参数表(`RDP_parameter` 字段 ↔ TOML 键 ↔ 样例值)
|
||||||
|
|
||||||
@@ -1016,6 +1021,7 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
|||||||
| 配置段 | 键(=结构体字段) | 样例值 | 含义 / 影响 |
|
| 配置段 | 键(=结构体字段) | 样例值 | 含义 / 影响 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| radar_params | `radar_work_mode` | 0 | 工作模式:0 近程 / 1 中程 / 2 远程(当前影响凝聚是否带速度维约束;TWS 外推已改为固定 `data_rate_tws`、不再按模式三选一;原 `RadarPara.work_mode`) |
|
| 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);与构建体制解耦,部署时应与构建体制保持一致(见 4.2) |
|
||||||
| radar_params | `freq_0_GHz` | 9.2 | 载波频点(GHz,盲速计算基准;原 `FREQ0`) |
|
| radar_params | `freq_0_GHz` | 9.2 | 载波频点(GHz,盲速计算基准;原 `FREQ0`) |
|
||||||
| radar_params | `radar_height` | 0 | 雷达平台高度(m,输出 z 叠加;原 `Height`) |
|
| radar_params | `radar_height` | 0 | 雷达平台高度(m,输出 z 叠加;原 `Height`) |
|
||||||
| radar_params | `radar_system_delay` | 0 | 系统延迟(s,输出位置按 `x + vx·delay` 补偿;原 `Sys_delay`) |
|
| radar_params | `radar_system_delay` | 0 | 系统延迟(s,输出位置按 `x + vx·delay` 补偿;原 `Sys_delay`) |
|
||||||
@@ -1093,6 +1099,7 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
|||||||
| `V_MAX` / `V_MIN` | `track_init_velocity_max/min` | 航迹头关联速度范围 |
|
| `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 模型过程噪声 |
|
| `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 逻辑保持停用) |
|
| `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` 宏**
|
**(b)旧 `parameters.h` 宏**
|
||||||
|
|
||||||
@@ -1117,7 +1124,8 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
|||||||
| `MAX_TAS_NUM` | `tas_track_num_max` | 最大同时跟踪 TAS 目标数 |
|
| `MAX_TAS_NUM` | `tas_track_num_max` | 最大同时跟踪 TAS 目标数 |
|
||||||
| `TAS_QUEUE_LENGTH` | 编译期常量 `RDP_TAS_QUEUE_CAPACITY`(30,见 10.4) | 队列容量仍为编译期常量,运行期上限用 `tas_track_num_max` |
|
| `TAS_QUEUE_LENGTH` | 编译期常量 `RDP_TAS_QUEUE_CAPACITY`(30,见 10.4) | 队列容量仍为编译期常量,运行期上限用 `tas_track_num_max` |
|
||||||
| 硬编码 `Tracking_beam->type = 1` | `default_track_beam_type` | 跟踪波束类型 |
|
| 硬编码 `Tracking_beam->type = 1` | `default_track_beam_type` | 跟踪波束类型 |
|
||||||
| `PI`、`MAX_TRACK_NUM`、`UNCONF_TARGET`、版本/日志/记录宏、`Round` | 保留不变 | 见 10.4 |
|
| `UNCONF_TARGET` | 无(宏已删除) | 未确认目标类型语义常量;起批处 `Target_Type` 直接写 0,语义不变 |
|
||||||
|
| `PI`、`MAX_TRACK_NUM`、版本/日志/记录宏、`Round` | 保留不变 | 见 10.4 |
|
||||||
|
|
||||||
### 10.4 编译期常量(parameters.h 保留宏)
|
### 10.4 编译期常量(parameters.h 保留宏)
|
||||||
|
|
||||||
@@ -1127,7 +1135,6 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `MAX_TRACK_NUM` | 500 | 输出航迹数组 `Track[500][10]` 的固定容量(宿主接口维度) |
|
| `MAX_TRACK_NUM` | 500 | 输出航迹数组 `Track[500][10]` 的固定容量(宿主接口维度) |
|
||||||
| `RDP_TAS_QUEUE_CAPACITY` | 30 | TAS 跟踪队列容量上限;运行期配置项 `tas_track_num_max` 不得超过该值 |
|
| `RDP_TAS_QUEUE_CAPACITY` | 30 | TAS 跟踪队列容量上限;运行期配置项 `tas_track_num_max` 不得超过该值 |
|
||||||
| `UNCONF_TARGET` | 0 | 未确认目标类型(`Track::Target_Type` 的缺省语义值) |
|
|
||||||
| `PI` | 3.1415926f | 圆周率常量 |
|
| `PI` | 3.1415926f | 圆周率常量 |
|
||||||
| `MAJOR_VERSION` / `MINOR_VERSION` / `PATCH_VERSION` | 1 / 5 / 8 | 版本号(拼装为 `VERSION_STRING`,见 7.1) |
|
| `MAJOR_VERSION` / `MINOR_VERSION` / `PATCH_VERSION` | 1 / 5 / 8 | 版本号(拼装为 `VERSION_STRING`,见 7.1) |
|
||||||
| `VERSION_INFO` / `VERSION_STRING` | `PS`/`MS`、`V1.5.8.PS`/`V1.5.8.MS` | 扫描体制后缀与完整版本串(由 `GetB()` 写入 `version_info`) |
|
| `VERSION_INFO` / `VERSION_STRING` | `PS`/`MS`、`V1.5.8.PS`/`V1.5.8.MS` | 扫描体制后缀与完整版本串(由 `GetB()` 写入 `version_info`) |
|
||||||
@@ -1149,6 +1156,8 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
|||||||
| RDP_RECORD_DROP_LOG_INTERVAL | 1024 | 队列丢弃日志限频:每累计丢弃该行数提示一次 |
|
| 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` |
|
| rdp_record::Stats / stats()(非宏) | — | 运行统计结构体(定义于 `rdp_record.h`,任意时刻线程安全读取、`Shutdown()` 时自动打印):`enqueued_rows`/`dropped_rows`/`written_rows`/`transactions`/`write_errors`/`queue_peak_bytes`/`queue_peak_rows` |
|
||||||
|
|
||||||
|
> **构建体制宏(不在 parameters.h 中定义)**:`PHASE_SCANNING` / `MECHANICAL_SCANNING` 由 CMake 缓存变量 `RADAR_SCAN_MODE` 经 `target_compile_definitions` 传入,仅用于 `parameters.h` 的 `VERSION_INFO`(`V1.5.8.PS` / `V1.5.8.MS`)与 `#pragma message`,以及构建目录/任务命名;**不参与 `data_process.cpp` 判圈**(判圈由配置项 `scan_mode` 决定,见 7.2)。源码中已无「按体制编译的判圈分支」。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 11. 已知问题与限制
|
## 11. 已知问题与限制
|
||||||
@@ -1185,6 +1194,7 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
|||||||
- **起批质量门限取的是临时航迹「末点」质量**:`tmp_track_to_trust_track()` 用 `(*Iter)[L-1].quality` 与按长度取的门限比较,而临时航迹质量只在 L=3 时写过所有点、L>3 时只更新末点,因此门限表实际是针对「最新一点的质量」,不是整条航迹的平均质量。
|
- **起批质量门限取的是临时航迹「末点」质量**:`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;对点数很多的航迹影响可忽略,但精确复现公式时需注意。
|
- **质量长度项含整数除法**:`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)与判圈帧。
|
- **数据记录未采用关联信息裁剪与记录策略(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` 与编译期 `PHASE_SCANNING`/`MECHANICAL_SCANNING` 是否一致;两者不一致时不会报错,`version_info`(PS/MS)反映构建体制、实际判圈行为反映配置,存在版本串与实际行为不符的风险。部署时应保证「构建体制 = 配置 `scan_mode` = 实际雷达体制」三者一致(机扫需 `scan_mode=1` 且 4 项数值按机扫取值,见 4.2)。
|
||||||
|
|
||||||
### 11.3 未启用功能
|
### 11.3 未启用功能
|
||||||
|
|
||||||
@@ -1217,7 +1227,7 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
|||||||
|
|
||||||
| 提交 | 内容 |
|
| 提交 | 内容 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 工作区(本次改造,未提交) | **参数配置方式改造: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`,宏与旧字段按映射等价替换;`parameters.h` 仅保留 PI、版本/日志/记录宏、`MAX_TRACK_NUM`、`RDP_TAS_QUEUE_CAPACITY`、`UNCONF_TARGET`、`Round`;`track_index_mangement` 航迹号表改按 `track_index_max` 分配,TAS 队列容量用 `RDP_TAS_QUEUE_CAPACITY`、运行期上限用 `tas_track_num_max`,波束类型用 `default_track_beam_type`。验证(Lead 实测,2026-10-27):8 配置构建成功且 0 warning 0 error;Release REC_OFF DLL 331,776 字节、导出表 31 项(新增 `parameters_reload`,旧参数接口与 `RadarPara` 符号消失);加载器单测 229 项断言、公开接口运行期测试(8 配置各 29 项断言)全部通过;62 个结构体成员 ↔ 62 个加载器键 ↔ 62 个 TOML 键一一对应。详见 CHANGELOG `[Unreleased]` |
|
| 工作区(本次改造,未提交) | **参数配置方式改造: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` 运行时选择(行为逐分支等价),`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 配置重建成功且 0 warning 0 error;Release REC_OFF DLL 331,776 字节(Debug REC_ON 4,694,016 字节,与 scan_mode 改动前一致)、导出表 31 项(新增 `parameters_reload`,旧参数接口与 `RadarPara` 符号消失);加载器单测 233 项断言、公开接口运行期测试(8 配置各 38 项断言,含判圈运行时切换)全部通过;`RDP_parameter` 成员 / 加载器键 / TOML 键均为 63 个,11 个配置段不变。详见 CHANGELOG `[Unreleased]` |
|
||||||
| 1ffb287 | 增加航迹质量记录到数据库:`RdpRecTempTrack` 增 `quality`,`RdpRecTrustTrack` 增 `Quality`/`Unupdated_time`/`Point_sum`/`Valid_point_sum` 并同步注册 |
|
| 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) |
|
| 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 圈无实点才消亡 |
|
| 5d105d2 | 修改相扫模式下 TAS 航迹消亡圈数:`TRACK_DIE_ROUND_TAS` 10→20(机扫保持 96),相扫 TAS 实际连续 21 圈无实点才消亡 |
|
||||||
@@ -1283,7 +1293,7 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
|||||||
| archived_docs/BUG_REPORT.md | 全量逻辑 BUG 分析(P0~P3 共 37 项,含位置、说明、建议、处置结论)——过期留档,仅作历史参考 |
|
| archived_docs/BUG_REPORT.md | 全量逻辑 BUG 分析(P0~P3 共 37 项,含位置、说明、建议、处置结论)——过期留档,仅作历史参考 |
|
||||||
| archived_docs/BUG_FIX_REPORT.md | 修复明细、修复状态汇总表与 MSVC 2013 x86 编译验证记录——过期留档(对应 01d28e0 时期) |
|
| archived_docs/BUG_FIX_REPORT.md | 修复明细、修复状态汇总表与 MSVC 2013 x86 编译验证记录——过期留档(对应 01d28e0 时期) |
|
||||||
| requirements.md | 修改需求说明:**雷达参数配置方式改造**(删除 `RadarPara`/旧参数接口、新增 `parameters_reload(const char*)`、TOML 配置文件 → `RDP_parameter`)——已按该说明实现(见 10);此前同名的数据记录调试功能与日志文件输出需求亦已实现,分别见 docs/data_record_debug.md 与 10.4 |
|
| requirements.md | 修改需求说明:**雷达参数配置方式改造**(删除 `RadarPara`/旧参数接口、新增 `parameters_reload(const char*)`、TOML 配置文件 → `RDP_parameter`)——已按该说明实现(见 10);此前同名的数据记录调试功能与日志文件输出需求亦已实现,分别见 docs/data_record_debug.md 与 10.4 |
|
||||||
| config/config_tmp.toml | 参数配置样例(TOML,11 个配置段、62 个键与 `RDP_parameter` 成员一一对应,样例为相扫取值;机扫差异项见 10.1 兼容性提示)——参数表见 10.2 |
|
| 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)` 包裹使用,来源与许可证信息见文件头 |
|
| 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 工程文件(源文件清单参考) |
|
| 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) |
|
| .vscode/tasks.json、.vscode/cmake-variants.yaml、.vscode/scripts/*.bat | VS Code 任务、构建变体与构建脚本(构建目录布局见 4.3) |
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
[radar_params]
|
[radar_params]
|
||||||
# 工作模式:0 近程 / 1 中程 / 2 远程
|
# 工作模式:0 近程 / 1 中程 / 2 远程
|
||||||
radar_work_mode = 0
|
radar_work_mode = 0
|
||||||
|
# 扫描模式:0 相扫模式 / 1 机扫模式(决定 data_preprocess 判圈逻辑;版本后缀仍由构建体制决定)
|
||||||
|
scan_mode = 0
|
||||||
# 频点0频率(GHz)
|
# 频点0频率(GHz)
|
||||||
freq_0_GHz = 9.2
|
freq_0_GHz = 9.2
|
||||||
# 雷达平台高度(m)
|
# 雷达平台高度(m)
|
||||||
|
|||||||
@@ -72,11 +72,16 @@ int Data_Process::data_preprocess(struct DataRev Data_Input[150])
|
|||||||
RDP_RECORD_POINTS(rec_points);
|
RDP_RECORD_POINTS(rec_points);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef PHASE_SCANNING
|
// 判圈:扫描模式由配置参数 scan_mode 决定(0=相扫,1=机扫),替代原编译期 PHASE_SCANNING/MECHANICAL_SCANNING 分支。
|
||||||
// 相扫模式下,判断前后两帧波位号的大小,来判断是否扫描一周完成
|
// 相扫:判断前后两帧波位号的大小,来判断是否扫描一周完成(当前波位号 <= 上一帧波位号即判满圈);
|
||||||
if(Data_Input[0].Beam_index_aiz <= last_beam_num) //TWS
|
// 机扫:可能存在转台反转导致波位号变小但并未扫描一周,因此改为波位号为 0 时判满圈。
|
||||||
{
|
const bool circle_done = (rdp_parameter.scan_mode == 0)
|
||||||
|
? (Data_Input[0].Beam_index_aiz <= last_beam_num) //TWS 相扫
|
||||||
|
: (Data_Input[0].Beam_index_aiz == 0); //TWS 机扫
|
||||||
|
|
||||||
last_beam_num = Data_Input[0].Beam_index_aiz;
|
last_beam_num = Data_Input[0].Beam_index_aiz;
|
||||||
|
if(circle_done)
|
||||||
|
{
|
||||||
circle_id++;
|
circle_id++;
|
||||||
// std::cout << Data_Input[0].CPI_time << std::endl;
|
// std::cout << Data_Input[0].CPI_time << std::endl;
|
||||||
// RDP_LOG<<"CPI_time: "<<Data_Input[0].CPI_time<<std::endl;
|
// RDP_LOG<<"CPI_time: "<<Data_Input[0].CPI_time<<std::endl;
|
||||||
@@ -84,25 +89,8 @@ int Data_Process::data_preprocess(struct DataRev Data_Input[150])
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
last_beam_num = Data_Input[0].Beam_index_aiz;
|
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
// 机扫模式下,可能存在转台反转的情况,导致波位号变小,但并未扫描一周,因此改为判断波位号为0时,表示扫描一周完成
|
|
||||||
if(Data_Input[0].Beam_index_aiz == 0) //TWS
|
|
||||||
{
|
|
||||||
last_beam_num = Data_Input[0].Beam_index_aiz;
|
|
||||||
circle_id++;
|
|
||||||
// std::cout << Data_Input[0].CPI_time << std::endl;
|
|
||||||
// RDP_LOG<<"CPI_time: "<<Data_Input[0].CPI_time<<std::endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
last_beam_num = Data_Input[0].Beam_index_aiz;
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
else if(Data_Input[0].point_type == 1) //tas数据
|
else if(Data_Input[0].point_type == 1) //tas数据
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,12 +7,8 @@
|
|||||||
/**********************************版本信息*************************************************/
|
/**********************************版本信息*************************************************/
|
||||||
#define MAJOR_VERSION 1
|
#define MAJOR_VERSION 1
|
||||||
#define MINOR_VERSION 5
|
#define MINOR_VERSION 5
|
||||||
#define PATCH_VERSION 8
|
#define PATCH_VERSION 9
|
||||||
#ifdef PHASE_SCANNING
|
#define VERSION_INFO "GENERIC"
|
||||||
#define VERSION_INFO "PS"
|
|
||||||
#else
|
|
||||||
#define VERSION_INFO "MS"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define STRINGIFY_IMPL(x) #x
|
#define STRINGIFY_IMPL(x) #x
|
||||||
#define STRINGIFY(x) STRINGIFY_IMPL(x)
|
#define STRINGIFY(x) STRINGIFY_IMPL(x)
|
||||||
@@ -95,8 +91,6 @@
|
|||||||
#define MAX_TRACK_NUM 500
|
#define MAX_TRACK_NUM 500
|
||||||
//TAS 跟踪队列容量上限(运行期配置项 tas_track_num_max 不得超过该值)
|
//TAS 跟踪队列容量上限(运行期配置项 tas_track_num_max 不得超过该值)
|
||||||
#define RDP_TAS_QUEUE_CAPACITY 30
|
#define RDP_TAS_QUEUE_CAPACITY 30
|
||||||
//未确认目标类型(Track::Target_Type 的缺省语义值)
|
|
||||||
#define UNCONF_TARGET 0
|
|
||||||
|
|
||||||
#define Round(x) (((x) > 0) \
|
#define Round(x) (((x) > 0) \
|
||||||
? (((int)((x) + 0.5) > (int)(x)) ? ((int)(x) + 1) : ((int)(x))) \
|
? (((int)((x) + 0.5) > (int)(x)) ? ((int)(x) + 1) : ((int)(x))) \
|
||||||
|
|||||||
@@ -140,6 +140,7 @@ const FloatField kFloatFields[] = {
|
|||||||
const IntField kIntFields[] = {
|
const IntField kIntFields[] = {
|
||||||
// [radar_params] 雷达工作参数
|
// [radar_params] 雷达工作参数
|
||||||
{"radar_params", "radar_work_mode", &RDP_parameter::radar_work_mode},
|
{"radar_params", "radar_work_mode", &RDP_parameter::radar_work_mode},
|
||||||
|
{"radar_params", "scan_mode", &RDP_parameter::scan_mode},
|
||||||
// [track_associate] 航迹关联参数
|
// [track_associate] 航迹关联参数
|
||||||
{"track_associate", "extrapolate_max", &RDP_parameter::extrapolate_max},
|
{"track_associate", "extrapolate_max", &RDP_parameter::extrapolate_max},
|
||||||
{"track_associate", "extrapolate_max_tas", &RDP_parameter::extrapolate_max_tas},
|
{"track_associate", "extrapolate_max_tas", &RDP_parameter::extrapolate_max_tas},
|
||||||
@@ -357,6 +358,8 @@ bool validate_parameter(const RDP_parameter& p, LoadContext& ctx)
|
|||||||
// 雷达工作参数
|
// 雷达工作参数
|
||||||
if (p.radar_work_mode < 0 || p.radar_work_mode > 2)
|
if (p.radar_work_mode < 0 || p.radar_work_mode > 2)
|
||||||
return ctx.fail("参数 radar_work_mode 必须在 0~2 之间(实际 " + std::to_string(p.radar_work_mode) + ")");
|
return ctx.fail("参数 radar_work_mode 必须在 0~2 之间(实际 " + std::to_string(p.radar_work_mode) + ")");
|
||||||
|
if (p.scan_mode != 0 && p.scan_mode != 1)
|
||||||
|
return ctx.fail("参数 scan_mode 必须为 0(相扫模式)或 1(机扫模式)(实际 " + std::to_string(p.scan_mode) + ")");
|
||||||
if (!(p.freq_0_GHz > 0.0f))
|
if (!(p.freq_0_GHz > 0.0f))
|
||||||
return ctx.fail("参数 freq_0_GHz 必须大于 0");
|
return ctx.fail("参数 freq_0_GHz 必须大于 0");
|
||||||
if (p.radar_system_delay < 0.0f)
|
if (p.radar_system_delay < 0.0f)
|
||||||
|
|||||||
@@ -194,6 +194,7 @@ struct RDP_parameter
|
|||||||
{
|
{
|
||||||
// ******************* 雷达工作参数 ************************//
|
// ******************* 雷达工作参数 ************************//
|
||||||
int radar_work_mode; //工作模式
|
int radar_work_mode; //工作模式
|
||||||
|
int scan_mode; //扫描模式 0=相扫模式 1=机扫模式(决定判圈逻辑,替代原编译期 PHASE_SCANNING/MECHANICAL_SCANNING 分支)
|
||||||
float freq_0_GHz; //频点0频率
|
float freq_0_GHz; //频点0频率
|
||||||
float radar_height; //雷达平台高度 (m)
|
float radar_height; //雷达平台高度 (m)
|
||||||
float radar_system_delay; //系统延迟 (s)
|
float radar_system_delay; //系统延迟 (s)
|
||||||
|
|||||||
@@ -667,7 +667,7 @@ void Track_Init::tmp_track_to_trust_track(std::vector<Trust_Track> *trust_tra
|
|||||||
trust_track_tmp.Unupdated_time = 0;
|
trust_track_tmp.Unupdated_time = 0;
|
||||||
trust_track_tmp.point_flag=1; //实点
|
trust_track_tmp.point_flag=1; //实点
|
||||||
trust_track_tmp.Track_Mode=0; //跟踪模式 TWS 0
|
trust_track_tmp.Track_Mode=0; //跟踪模式 TWS 0
|
||||||
trust_track_tmp.Target_Type=UNCONF_TARGET;
|
trust_track_tmp.Target_Type=0;
|
||||||
trust_track_tmp.Track_Index=index;
|
trust_track_tmp.Track_Index=index;
|
||||||
trust_track_tmp.Height=Track_to_start[i][L-1].height;
|
trust_track_tmp.Height=Track_to_start[i][L-1].height;
|
||||||
trust_track_tmp.Extrapolate_round=0;
|
trust_track_tmp.Extrapolate_round=0;
|
||||||
|
|||||||
@@ -338,7 +338,7 @@ void Track_Init_Direct_Tracking::tmp_track_to_trust_track( std::vector<Trust_Tr
|
|||||||
trust_track_tmp.T_track = (*Iter)[L-1].CPI_time;
|
trust_track_tmp.T_track = (*Iter)[L-1].CPI_time;
|
||||||
trust_track_tmp.point_flag=1; //实点
|
trust_track_tmp.point_flag=1; //实点
|
||||||
trust_track_tmp.Track_Mode=1; //跟踪模式 TWS 0
|
trust_track_tmp.Track_Mode=1; //跟踪模式 TWS 0
|
||||||
trust_track_tmp.Target_Type=UNCONF_TARGET;
|
trust_track_tmp.Target_Type=0;
|
||||||
trust_track_tmp.Height=(*Iter)[L-1].height;
|
trust_track_tmp.Height=(*Iter)[L-1].height;
|
||||||
trust_track_tmp.Extrapolate_round=0;
|
trust_track_tmp.Extrapolate_round=0;
|
||||||
trust_track_tmp.approach_flag = -1;
|
trust_track_tmp.approach_flag = -1;
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ flowchart TD
|
|||||||
flowchart TD
|
flowchart TD
|
||||||
A["收到一帧点迹"] --> B{"point_type ?"}
|
A["收到一帧点迹"] --> B{"point_type ?"}
|
||||||
B -->|"0 = TWS"| C["写入 TWS 缓存"]
|
B -->|"0 = TWS"| C["写入 TWS 缓存"]
|
||||||
C --> D{"判圈条件成立 ?<br/>相扫: Beam_index_aiz <= last_beam_num<br/>机扫: Beam_index_aiz == 0"}
|
C --> D{"判圈条件成立(由配置 scan_mode 选择)?<br/>scan_mode=0 相扫: Beam_index_aiz <= last_beam_num<br/>scan_mode=1 机扫: Beam_index_aiz == 0"}
|
||||||
D -->|"是"| E["return 1:满一圈,执行 TWS 航迹处理"]
|
D -->|"是"| E["return 1:满一圈,执行 TWS 航迹处理"]
|
||||||
D -->|"否"| F["return 2:未满圈,仅做滑窗凝聚"]
|
D -->|"否"| F["return 2:未满圈,仅做滑窗凝聚"]
|
||||||
B -->|"1 = TAS"| G["写入 TAS 缓存<br/>记录 TAS 批号与本帧时间戳"]
|
B -->|"1 = TAS"| G["写入 TAS 缓存<br/>记录 TAS 批号与本帧时间戳"]
|
||||||
@@ -84,9 +84,10 @@ flowchart TD
|
|||||||
|
|
||||||
**要点**
|
**要点**
|
||||||
|
|
||||||
- 判圈条件按扫描体制区分(3e6763c,源码用 `#ifdef PHASE_SCANNING` 编译期隔离):
|
- 判圈条件由配置项 `[radar_params] scan_mode` **运行时**选择(0 相扫 / 1 机扫;加载器校验仅允许 0/1),替代原先 `#ifdef PHASE_SCANNING` 的编译期分支:
|
||||||
- **相扫**:比较前后两帧方位波位号,当前帧 `Beam_index_aiz <= last_beam_num` 判为满一圈;`last_beam_num` 参与判断,`track_clear_all()` 复位为 INT_MAX,故**清空后/首帧即判满一圈**;
|
- **scan_mode=0(相扫)**:比较前后两帧方位波位号,当前帧 `Beam_index_aiz <= last_beam_num` 判为满一圈;`last_beam_num` 参与判断,`track_clear_all()` 复位为 INT_MAX,故**清空后/首帧即判满一圈**;
|
||||||
- **机扫**:判 **波位号为 0**(7d5a56f 起),避免转台反转时波位号变小导致误判一圈完成(代码中保留了旧判断的注释);该分支下 `last_beam_num` 仍被赋值但不参与判断。
|
- **scan_mode=1(机扫)**:判 **波位号为 0**(7d5a56f 起),避免转台反转时波位号变小导致误判一圈完成(代码中保留了旧判断的注释);该模式下 `last_beam_num` 仍被更新但不参与判断。
|
||||||
|
- 两种模式下 `last_beam_num` 每帧都会更新,仅判满圈时 `circle_id++` 并返回 1;判圈行为不再由构建体制(`PHASE_SCANNING`/`MECHANICAL_SCANNING`)决定,配置与构建体制应保持一致(见 README 4.2)。
|
||||||
- 机扫下波位号 0 是每圈的起始波位,因此**每圈恰好触发一次 model=1**。
|
- 机扫下波位号 0 是每圈的起始波位,因此**每圈恰好触发一次 model=1**。
|
||||||
- TAS 数据不参与判圈,**每来一帧就处理一次**(TAS 是调度的跟踪波位,本身就是单目标 CPI)。
|
- TAS 数据不参与判圈,**每来一帧就处理一次**(TAS 是调度的跟踪波位,本身就是单目标 CPI)。
|
||||||
|
|
||||||
@@ -531,13 +532,14 @@ flowchart TD
|
|||||||
|
|
||||||
## 9. 参数脉络(决定行为的旋钮)
|
## 9. 参数脉络(决定行为的旋钮)
|
||||||
|
|
||||||
> **参数配置方式改造后**:雷达工作参数不再来自 `parameters.h` 编译期宏或宿主下发的 `RadarPara`,而是由 TOML 配置文件(样例 `config/config_tmp.toml`)加载到 `struct.h::RDP_parameter`,经公开接口 `parameters_reload(配置文件路径)` 在运行期一次性加载(失败返回 -1 且不改变当前参数;严格校验规则与完整参数表见 README 第 10 节)。下表「样例值」为相扫配置;**机扫需在配置中改**的 4 项已单独标注。
|
> **参数配置方式改造后**:雷达工作参数不再来自 `parameters.h` 编译期宏或宿主下发的 `RadarPara`,而是由 TOML 配置文件(样例 `config/config_tmp.toml`)加载到 `struct.h::RDP_parameter`,经公开接口 `parameters_reload(配置文件路径)` 在运行期一次性加载(失败返回 -1 且不改变当前参数;严格校验规则与完整参数表见 README 第 10 节)。下表「样例值」为相扫配置;**机扫需在配置中改**的 5 项(`scan_mode` 及 4 个原按体制区分的参数)已单独标注。
|
||||||
|
|
||||||
### 9.1 配置文件参数(`[段] 键`,样例值 = 相扫)
|
### 9.1 配置文件参数(`[段] 键`,样例值 = 相扫)
|
||||||
|
|
||||||
| 配置键 | 样例值 | 作用点 |
|
| 配置键 | 样例值 | 作用点 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `[radar_params] radar_work_mode` | 0 | 凝聚是否带速度维约束(当前唯一生效点;航迹起始的远近程分支取值相同,属死分支;TWS 外推已改为固定 `data_rate_tws`,不再按模式三选一) |
|
| `[radar_params] radar_work_mode` | 0 | 凝聚是否带速度维约束(当前唯一生效点;航迹起始的远近程分支取值相同,属死分支;TWS 外推已改为固定 `data_rate_tws`,不再按模式三选一) |
|
||||||
|
| `[radar_params] scan_mode` | 0(**机扫配 1**) | **扫描模式 0 相扫 / 1 机扫**(必填,加载器校验仅允许 0/1):决定 `data_preprocess()` 的 TWS 判圈逻辑(0 用波位号比较、1 用波位号==0),替代原编译期 `PHASE_SCANNING`/`MECHANICAL_SCANNING` 分支;与构建体制解耦,应保持一致 |
|
||||||
| `[radar_params] freq_0_GHz` | 9.2 | 盲速计算基准频率(原 `FREQ0`) |
|
| `[radar_params] freq_0_GHz` | 9.2 | 盲速计算基准频率(原 `FREQ0`) |
|
||||||
| `[radar_params] radar_height` / `radar_system_delay` | 0 / 0 | 输出 z 叠加平台高度 / 输出位置系统延迟补偿(原 `Height` / `Sys_delay`) |
|
| `[radar_params] radar_height` / `radar_system_delay` | 0 / 0 | 输出 z 叠加平台高度 / 输出位置系统延迟补偿(原 `Height` / `Sys_delay`) |
|
||||||
| `[radar_params] data_rate_tws` | 3 | TWS 未关联航迹外推步长(秒;原按 `work_mode` 在 `DATA_RATE_SHORT/MIDDLE/FAR` 中三选一,现统一单字段) |
|
| `[radar_params] data_rate_tws` | 3 | TWS 未关联航迹外推步长(秒;原按 `work_mode` 在 `DATA_RATE_SHORT/MIDDLE/FAR` 中三选一,现统一单字段) |
|
||||||
@@ -571,12 +573,11 @@ flowchart TD
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `MAX_TRACK_NUM` | 500 | 输出航迹数组固定容量(宿主接口维度) |
|
| `MAX_TRACK_NUM` | 500 | 输出航迹数组固定容量(宿主接口维度) |
|
||||||
| `RDP_TAS_QUEUE_CAPACITY` | 30 | TAS 队列容量上限;运行期上限用 `tas_track_num_max` |
|
| `RDP_TAS_QUEUE_CAPACITY` | 30 | TAS 队列容量上限;运行期上限用 `tas_track_num_max` |
|
||||||
| `UNCONF_TARGET` | 0 | 未确认目标类型语义值 |
|
|
||||||
| `PI` / `Round(x)` | 3.1415926f / 宏 | 圆周率 / 四舍五入取整 |
|
| `PI` / `Round(x)` | 3.1415926f / 宏 | 圆周率 / 四舍五入取整 |
|
||||||
| 版本宏 | 1.5.8 + 体制后缀 | `VERSION_STRING` → `V1.5.8.PS` / `V1.5.8.MS` |
|
| 版本宏 | 1.5.8 + 体制后缀 | `VERSION_STRING` → `V1.5.8.PS` / `V1.5.8.MS` |
|
||||||
| `RDP_LOG_*` / `RDP_RECORD_*` | — | 日志落盘开关/目录、数据记录开关与性能参数(见 README 10.4) |
|
| `RDP_LOG_*` / `RDP_RECORD_*` | — | 日志落盘开关/目录、数据记录开关与性能参数(见 README 10.4) |
|
||||||
|
|
||||||
> 扫描体制(`PHASE_SCANNING` / `MECHANICAL_SCANNING`)仍决定编译期分支(如判圈判据、版本后缀),但**不再决定任何工作参数数值**。
|
> 扫描体制宏(`PHASE_SCANNING` / `MECHANICAL_SCANNING`,由 CMake 的 `RADAR_SCAN_MODE` 传入)仅决定 `VERSION_INFO` 版本后缀(PS/MS)与 `#pragma message` 及构建目录/任务命名,**不再决定任何工作参数数值,也不再决定判圈判据**(判圈由配置项 `scan_mode` 决定,见 2.2);`UNCONF_TARGET` 宏已删除(起批处 `Target_Type` 直接写 0)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -631,7 +632,7 @@ flowchart TD
|
|||||||
|
|
||||||
| 项 | README 描述(更新前) | 当前源码 |
|
| 项 | README 描述(更新前) | 当前源码 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| 满圈判据 | 当前方位波位号 < 上一帧波位号 | 按体制区分(3e6763c):**相扫**当前波位号 ≤ 上一帧波位号(等价于原判据)、**机扫**方位波位号 == 0(7d5a56f,适应机扫转台反转) |
|
| 满圈判据 | 当前方位波位号 < 上一帧波位号 | 判据由配置项 `scan_mode` 运行时选择(原按体制编译期分支):**scan_mode=0 相扫**当前波位号 ≤ 上一帧波位号(3e6763c,等价于原判据)、**scan_mode=1 机扫**方位波位号 == 0(7d5a56f,适应机扫转台反转) |
|
||||||
| 点-航迹头判据 | 按距离分段收紧速度门限(半速、1/2~1/3 速) | 该分支注释停用;改为统一速度区间 **+ 两条多普勒-几何一致性约束**(7d5a56f) |
|
| 点-航迹头判据 | 按距离分段收紧速度门限(半速、1/2~1/3 速) | 该分支注释停用;改为统一速度区间 **+ 两条多普勒-几何一致性约束**(7d5a56f) |
|
||||||
| 起始输出历史点 | "临时航迹的全部 L 个点" | 实际输出**前 `track_init_point_num_min` 个点** |
|
| 起始输出历史点 | "临时航迹的全部 L 个点" | 实际输出**前 `track_init_point_num_min` 个点** |
|
||||||
| 起始输入过滤 | "track_init 跳过 Use_Flag==1 的点" | 上游 `track_asso_process()` 结束前已把 `Use_Flag==1` 的点迹从 `point_recv` 删除;`track_init` 入口(L59-70)也会再剔除一次 `Use_Flag==1` 的点,两道处理叠加,效果一致 |
|
| 起始输入过滤 | "track_init 跳过 Use_Flag==1 的点" | 上游 `track_asso_process()` 结束前已把 `Use_Flag==1` 的点迹从 `point_recv` 删除;`track_init` 入口(L59-70)也会再剔除一次 `Use_Flag==1` 的点,两道处理叠加,效果一致 |
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ void WriteTrackHeights(std::vector<Trust_Track> v); //RdpRecTrackHeight
|
|||||||
|
|
||||||
| # | 记录点 | 位置(文件:行) | 记录宏 | 表 | 说明 |
|
| # | 记录点 | 位置(文件:行) | 记录宏 | 表 | 说明 |
|
||||||
|---|---|---|---|---|---|
|
|---|---|---|---|---|---|
|
||||||
| ① | 输入点迹(TWS + TAS) | `data_process.cpp:70`(TWS 分支,判圈 return 之前)/ `data_process.cpp:160`(TAS 分支,`circle_id++` 之前) | `RDP_RECORD_POINTS` | `RdpRecPoint` | TWS/TAS **共用一张表**,用 `point_type` 区分;每个输入点迹一行,含 `point_id` / `frame_id` / `circle_id` 三个链路标识 |
|
| ① | 输入点迹(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 凝聚后点迹 | `dot_coh.cpp:239`(`data_input_buff` 输出到 `point_recv` 的循环之后) | `RDP_RECORD_COHESION_TWS` | `RdpRecPointCohesionTWS` | 两帧滑窗凝聚后进入关联的点迹 |
|
| ② | 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 点迹 |
|
| ③ | 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 前移,因此表中包含**本圈参与起始判定但可能随即起批转走**的临时航迹(原先在消亡之后记录会丢失这部分数据) |
|
| ④ | 临时航迹 | `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 前移,因此表中包含**本圈参与起始判定但可能随即起批转走**的临时航迹(原先在消亡之后记录会丢失这部分数据) |
|
||||||
@@ -232,7 +232,7 @@ void WriteTrackHeights(std::vector<Trust_Track> v); //RdpRecTrackHeight
|
|||||||
|
|
||||||
> 表清单即上表 ①②③④⑤⑥ 六张在用表。① 在判圈判定之前入队,因此即使本帧触发判圈/返回,输入点迹也不会漏记;②③④⑤ 在收集循环结束后一次入队;⑥ 按分块上限多次入队并在函数返回前 flush。
|
> 表清单即上表 ①②③④⑤⑥ 六张在用表。① 在判圈判定之前入队,因此即使本帧触发判圈/返回,输入点迹也不会漏记;②③④⑤ 在收集循环结束后一次入队;⑥ 按分块上限多次入队并在函数返回前 flush。
|
||||||
|
|
||||||
**链路串联**:①→②/③(点迹 → 凝聚后点迹)按 `point_id` 关联;②/③→④/⑤ 按 `point_id` 与 `circle_id` 关联;④→⑤ 通过起批时透传的 `track_id`(取自临时航迹末点的 `temp_track_id`)关联;⑤→⑥ 按 `track_id` 与 `point_id` 关联。TWS 与 TAS 可先用 `RdpRecPoint.point_type`、`RdpRecTrustTrack.Track_Mode`、`RdpRecAssoInfo.tas_flag` 三处之一区分通道。`circle_id` 在 TWS 每判满一圈(相扫为波位号不再增大、机扫为波位号 0,见 README 7.2)、TAS 每帧处理结束时自增,可用来划分「第几圈/第几帧」。
|
**链路串联**:①→②/③(点迹 → 凝聚后点迹)按 `point_id` 关联;②/③→④/⑤ 按 `point_id` 与 `circle_id` 关联;④→⑤ 通过起批时透传的 `track_id`(取自临时航迹末点的 `temp_track_id`)关联;⑤→⑥ 按 `track_id` 与 `point_id` 关联。TWS 与 TAS 可先用 `RdpRecPoint.point_type`、`RdpRecTrustTrack.Track_Mode`、`RdpRecAssoInfo.tas_flag` 三处之一区分通道。`circle_id` 在 TWS 每判满一圈(由配置项 `scan_mode` 选择判据:0 相扫为波位号不再增大、1 机扫为波位号 0,见 README 7.2)、TAS 每帧处理结束时自增,可用来划分「第几圈/第几帧」。
|
||||||
|
|
||||||
**字段速查**(字段顺序即建表列顺序;首列均为 `int64_t id` 自增主键):
|
**字段速查**(字段顺序即建表列顺序;首列均为 `int64_t id` 自增主键):
|
||||||
|
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ track_init.track_init_process_logic(&point_recv, &trust_track, &temp_track,
|
|||||||
|
|
||||||
### 1.2 调用频率 = 扫描圈
|
### 1.2 调用频率 = 扫描圈
|
||||||
|
|
||||||
`data_preprocess` 判为一圈完成时返回 1(`data_process.cpp`),宿主据此调用 `track_process(model=1)`。判据按扫描体制区分(3e6763c):**相扫**比较前后两帧方位波位号(当前 ≤ 上一帧即满圈,`last_beam_num` 参与判断,清空后/首帧即满圈),**机扫**判 `Data_Input[0].Beam_index_aiz == 0`(详见 README 7.2 与 `docs/data_process_flow_report.md` 2.2 节)。
|
`data_preprocess` 判为一圈完成时返回 1(`data_process.cpp`),宿主据此调用 `track_process(model=1)`。判据由配置项 `[radar_params] scan_mode` **运行时**选择(0 相扫 / 1 机扫;替代原编译期 `PHASE_SCANNING`/`MECHANICAL_SCANNING` 分支):**scan_mode=0** 比较前后两帧方位波位号(当前 ≤ 上一帧即满圈,`last_beam_num` 参与判断,清空后/首帧即满圈);**scan_mode=1** 判 `Data_Input[0].Beam_index_aiz == 0`(详见 README 7.2 与 `docs/data_process_flow_report.md` 2.2 节)。
|
||||||
因此 **`track_init_process_logic()` 每次调用对应 TWS 一圈**,`Temp_track::buff_round`(已缓存圈数)正是以「调用次数」为单位累加的。
|
因此 **`track_init_process_logic()` 每次调用对应 TWS 一圈**,`Temp_track::buff_round`(已缓存圈数)正是以「调用次数」为单位累加的。
|
||||||
|
|
||||||
### 1.3 类接口
|
### 1.3 类接口
|
||||||
@@ -456,7 +456,7 @@ Kalman.kalman_filter_init_3dots(Z0, Z1, Z2, T1, T2, X, P, rdp_parameter); // 6
|
|||||||
| `track_id / point_id / circle_id` | 取末点的 `temp_track_id / point_id / circle_id`(记录链路标识,b227ae1 新增) |
|
| `track_id / point_id / circle_id` | 取末点的 `temp_track_id / point_id / circle_id`(记录链路标识,b227ae1 新增) |
|
||||||
| `point_flag = 1` | 实点 |
|
| `point_flag = 1` | 实点 |
|
||||||
| `Track_Mode = 0` | TWS |
|
| `Track_Mode = 0` | TWS |
|
||||||
| `Target_Type = UNCONF_TARGET(0)` | 未确认目标 |
|
| `Target_Type = 0` | 未确认目标(`UNCONF_TARGET` 宏已删除,直接写 0) |
|
||||||
| `Extrapolate_round = 0` | 外推计数清零 |
|
| `Extrapolate_round = 0` | 外推计数清零 |
|
||||||
| `approach_flag = -1` | 接近标志复位 |
|
| `approach_flag = -1` | 接近标志复位 |
|
||||||
| `manual_delete_flag / manual_tracking_flag / associate_point_number / point_type / primary_target_flag = 0` | 各类标志复位(`Trust_Track trust_track_tmp = {}` 零初始化,故新航迹的重点目标标记为 0) |
|
| `manual_delete_flag / manual_tracking_flag / associate_point_number / point_type / primary_target_flag = 0` | 各类标志复位(`Trust_Track trust_track_tmp = {}` 零初始化,故新航迹的重点目标标记为 0) |
|
||||||
@@ -681,7 +681,7 @@ $$
|
|||||||
- **真实目标起批慢**:提高 `track_init_threshold` / `track_init_angle`,或降低 `track_init_point_num_min`(最小 3)。
|
- **真实目标起批慢**:提高 `track_init_threshold` / `track_init_angle`,或降低 `track_init_point_num_min`(最小 3)。
|
||||||
- **静止/低速杂波起批**:提高 `track_init_velocity_min`。
|
- **静止/低速杂波起批**:提高 `track_init_velocity_min`。
|
||||||
- **某方位扇区/距离段禁止起批**(如地物、干扰区):配置起批屏蔽区,比调门限更精准。
|
- **某方位扇区/距离段禁止起批**(如地物、干扰区):配置起批屏蔽区,比调门限更精准。
|
||||||
- **注意**:`config/config_tmp.toml` 是相扫取值;机扫部署时 `extrapolate_max_tas`、`height_smooth_win`、`track_die_round_tas`、`tas_track_num_max` 需按机扫取值配置(见 README 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` 按机扫取值配置(见 README 4.2、10.1)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user