@@ -67,7 +67,8 @@
|
||||
- **点迹附加信息字段扩展(需同步重编译宿主)**:`DataRev` 新增 `amp_asv` / `prn_fftn`,`Track` 新增 `amp_asv_point` / `prn_fftn_point`,结构体布局随之变化,宿主必须使用同一版本头文件重新编译对接;输入侧已打通(TWS 输出有效,TAS 输出仍未写回),详见 11.2。
|
||||
- **高度维独立平滑**:按距离分段选择滑动平均窗长,TWS 为 `height_smooth_win + {2,3,4,6}`、TAS 为 `height_smooth_win + {6,8,10,12}`(样例配置 `height_smooth_win`=6 对应相扫;机扫需配 3),抑制俯仰测量跳变(见 9.7)。
|
||||
- **参数配置外置(参数配置方式改造)**:全部工作参数(原 `parameters.h` 宏 + `RadarPara` 字段)改由 TOML 配置文件提供,宿主在 `GetB()` 后调用一次 `parameters_reload(路径)` 加载(重连/换配置可再次调用);加载器严格校验 11 个配置段、键名/类型/取值范围与屏蔽区数组长度,失败返回 -1 且不改变当前参数(见 10.1)。样例配置 `config/config_tmp.toml` 为**相扫**取值(`scan_mode = 0`);机扫部署需改用 `scan_mode = 1` 并把 `extrapolate_max_tas`、`height_smooth_win`、`track_die_round_tas`、`tas_track_num_max` 配为 48 / 3 / 96 / 1(这 4 项在改造前按扫描体制取不同宏值,现在同一份配置对所有体制生效)。**判圈逻辑由配置项 `scan_mode` 决定**(不再是编译期体制),详见 4.2、7.2。
|
||||
- **TAS 波束控制**:手动转 TAS 目标入队(队列容量为编译期常量 `RDP_TAS_QUEUE_CAPACITY`、运行期上限为配置项 `tas_track_num_max`),按最新时间戳外推输出跟踪波束(距离/方位/俯仰/批号)。
|
||||
- **TAS 波束控制**:手动转 TAS 目标入队(队列容量为编译期常量 `RDP_TAS_QUEUE_CAPACITY`、运行期上限为配置项 `tas_track_num_max`),按最新时间戳外推输出跟踪波束(距离/方位/俯仰/**航迹指纹**)。
|
||||
- **航迹指纹(V1.5.9)**:起批时用末点的 `r`/`azi`/`vr`/`RCS`/`CPI_time` 生成 16 bit `Track_fingerprint`(量化 + splitmix64 混合 + 折叠);TAS 波束改为下发**指纹**而非可复用的批号,TAS 数据帧也按指纹定位航迹,使 TAS 控制命令在回放/重连后仍对应同一目标(见 9.12)。
|
||||
- **航迹生命周期管理**:外推轮数计数、超时消亡与质量消亡(普通 TWS 航迹)、手动删除、全清空(含各模块 reset,防重连后幽灵航迹)。
|
||||
- **防御性加固**:见 archived_docs/BUG_FIX_REPORT.md——越界防护、时间戳正序校验、方位角 ±π 环绕、asin 定义域钳位、IMM 概率奇异保护等已修复项。
|
||||
- **日志输出(基于 spdlog)**:内置 spdlog v1.17.0(`third_party/spdlog`,以静态库目标 `spdlog` 编译进 DLL),日志**始终同时**写到标准输出与 `RDP_LOG_DIR`(`.\rdp_logs\`)下按日期+时间命名的日志文件(`rdp_YYYYMMDD_HHMMSS.log`,每次 `GetB()` 一个文件;同一秒内文件已存在时追加 `_1`~`_999` 后缀,不复用文件):`GetB()` 调用 `rdp_log::Init()` 完成初始化、`Destroy()` 调用 `rdp_log::Shutdown()` flush 并关闭。日志行格式为 `[YYYY-MM-DD HH:MM:SS.mmm] [级别] [文件名:行号] 内容`(毫秒时间戳 + spdlog 级别 trace/debug/info/warning/error/critical + 源码位置),所有级别逐条 flush。日志宏为 `RDP_LOG_TRACE` / `RDP_LOG_DEBUG` / `RDP_LOG_INFO` / `RDP_LOG_WARN` / `RDP_LOG_ERROR` / `RDP_LOG_CRITICAL`(`RDP_LOG_ERR` 为 `RDP_LOG_ERROR` 的别名,支持 fmt 风格格式化,如 `RDP_LOG_INFO("batch: {}", id)`),原 `RDP_LOG` 流式宏已删除;日志级别由 CMake 缓存变量 `RDP_LOG_LEVEL` 映射 `SPDLOG_ACTIVE_LEVEL` 在**编译期**控制(AUTO 时 Debug=TRACE、其余构建=INFO,OFF 编译期关闭全部日志且不创建日志文件),原 `RDP_LOG_ENABLE` 布尔开关已移除(见 4.3、10.4)。
|
||||
@@ -359,7 +360,7 @@ classDiagram
|
||||
| Dot_Coh | TWS 点迹凝聚:两帧滑窗合并凝聚(dot_coh_process_buff) |
|
||||
| Dot_Coh_TAS | TAS 点迹凝聚(单帧,距离/方位/速度三维门限) |
|
||||
| Track_Asso | TWS 点航关联 + IMM 滤波:模型交互 → 门限筛选(NN)→ 各模型 EKF → 概率更新 → 模型输出(只输出 `Track_Update_Flag==1` 的航迹);未关联航迹按上限外推;高度平滑;按滤波速度矢量写 `Flag_Direction`;ΔT≤0(乱序/重复时间戳)的候选取出后不更新滤波、不刷新航迹,仅消费该点迹 |
|
||||
| Track_Asso_Tas | TAS 航迹关联(只处理指定批号 tas_track_idx,门限与 TWS 略有差异;输出同样受 `Track_Update_Flag` 门控,外推上限 `extrapolate_max_tas` 的判定方向与 TWS 相反) |
|
||||
| Track_Asso_Tas | TAS 航迹关联(只处理由指纹定位到的那条航迹 `tas_track_idx`,门限与 TWS 略有差异;输出同样受 `Track_Update_Flag` 门控,外推上限 `extrapolate_max_tas` 的判定方向与 TWS 相反) |
|
||||
| Track_Init | 逻辑法航迹起始,每圈顺序固定:点-临时航迹关联(延长 ≥2 点临时航迹)→ 点-航迹头关联(两点起始)→ 剩余点转新航迹头 → 长度达标者起批(三点卡尔曼初始化);另含起批屏蔽区判断与临时航迹消亡 |
|
||||
| Track_Die / Track_Die_Tas | 可靠航迹消亡:**TWS 普通航迹按航迹质量**(V1.5.8:`Quality < 0.3`)、TWS 重点航迹按未关联轮数(10)、TAS 按未关联轮数(相扫 20、机扫 96),或手动删除标志置位时输出消亡批号并删除 |
|
||||
| TAS_Ctrl | TAS 波束控制:手动目标入队(tas_target_add)、失效目标出队(tas_target_del)、跟踪波束预测输出(tas_beam_output:数据率门控 + 队内选择最早 CPI 目标)、调度时刻记录(last_track_time) |
|
||||
@@ -378,9 +379,9 @@ classDiagram
|
||||
|
||||
| 结构体 | 用途 | 要点 |
|
||||
|---|---|---|
|
||||
| DataRev | 输入点迹 | 距离(m)、方位/俯仰(°)、速度(m/s)、幅度/门限/SNR/RCS、码盘值、CPI/GNSS 时间(ms, long long)、方位波位(0-24)/俯仰波位(0-13)、PRI(µs,**不允许为 0**)、频点号、点数、点迹号、使用标记、TAS 批号、点迹类型、归一化幅度 `amp_asv`(dB)、速度维 FFT 点数 `prn_fftn`、十字星数据 speed_dim[129]/range_dim[8] |
|
||||
| DataRev | 输入点迹 | 距离(m)、方位/俯仰(°)、速度(m/s)、幅度/门限/SNR/RCS、码盘值、CPI/GNSS 时间(ms, long long)、方位波位(0-24)/俯仰波位(0-13)、PRI(µs,**不允许为 0**)、频点号、点数、点迹号、使用标记、**TAS 航迹指纹**(字段名仍为 `TAS_track_index`,V1.5.9 起语义由「批号」改为「指纹」)、点迹类型、归一化幅度 `amp_asv`(dB)、速度维 FFT 点数 `prn_fftn`、十字星数据 speed_dim[129]/range_dim[8] |
|
||||
| Track | 输出航迹 | 位置/速度、极坐标量、**航迹质量 `Quality`(0~100,V1.5.8 新增;插在 `Amplitude` 之后,宿主需同步重编译)**、航迹号、更新点数、方向标志 Flag_Direction(仅关联/外推输出路径赋值:按滤波速度矢量判定,1 靠近 / 0 远离,见 9.6;起批输出不写该字段)、实虚点标志 Flag_Point、一步预测、跟踪模式、航向角 Direction_Angle、目标类型、关联点信息、归一化幅度 `amp_asv_point` / 速度维 FFT 点数 `prn_fftn_point`、航迹时间(s)/GNSS、SNR/RCS、十字星数据透传 |
|
||||
| TrackingBeam | TAS 跟踪波束指令 | open_flag、type、Range、Azi、Elev、TAS_track_index |
|
||||
| TrackingBeam | TAS 跟踪波束指令 | open_flag、type、Range、Azi、Elev、**TAS_track_index(V1.5.9 起为航迹指纹,非批号)** |
|
||||
| Target_direct_tracking | 引导跟踪信息 | 批号、距离/方位/俯仰、开关(接口未启用) |
|
||||
|
||||
> 工作参数结构体 `RDP_parameter` 及全局对象 `rdp_parameter` 定义在内部头 `struct.h`(对象本身定义于 `data_process.cpp`),**不在公开头中导出**:宿主不再构造/下发参数结构体,改为通过 `parameters_reload(配置文件路径)` 把 TOML 配置加载进 DLL(参数含义见 10)。
|
||||
@@ -391,7 +392,7 @@ classDiagram
|
||||
|---|---|---|
|
||||
| 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] |
|
||||
| Trust_Track | 可靠航迹(IMM 全状态) | 航迹号、**航迹指纹 `Track_fingerprint`(16 bit,V1.5.9 新增,起批时按末点计算,TAS 波束与 TAS 数据帧用它定位航迹,见 9.12)**、标识字段 `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,决定消亡走质量还是 `track_die_round_pramary` 轮数)标志、关联点数、高度平滑缓冲 Hight_smooth、关联点信息、归一化幅度 `amp_asv_point` / 速度维 FFT 点数 `prn_fftn_point`、融合状态 X[6]/P[6][6]、三个子模型 X1/X2/X3、P1/P2/P3、模型概率 u[3] |
|
||||
| Temp_track | 临时航迹(航迹起始阶段) | 4 维状态 X[4]/P[4][4]、极坐标点信息(`r`/`azi`/`vr`/`height`/`SNR`/`RCS`/`amplitude`)、**航迹质量 `quality`(0~1,V1.5.8 新增,起批时带给 Trust_Track)**、时间戳 `CPI_time` / `GNSS_time`、`buff_round`(已缓存圈数)、标识字段 `temp_track_id` / `point_id` / `circle_id`、区号 `temp_track_section_idx`、俯仰波位号 `pitch_num`、关联标志(c3c7e66 起字段统一更名,如原 `snr`/`Amp`/`T`) |
|
||||
| Asso_Info | 点航关联候选(track_asso.cpp / track_asso_tas.cpp 共用) | `point_id` / `track_id` / `circle_id`、三模型统计距离 `d1`/`d2`/`d3` 与最小值 `d_min`、点迹/航迹下标、`delta_T`/`delta_h`/`R`/`VT`、来源标志 `tas_flag`(1 TAS / 0 TWS,5cb67cc 新增)、门限判定结果 `thd_d`/`thd_h`/`thd_r`、是否被最近邻取中 `min_d_flag`(b227ae1 提升到 struct.h;TAS 侧 5cb67cc 起改用同一结构) |
|
||||
| Tracking_Target | TAS 队列元素 | 批号 Index、空标志 empty_flag、最近波束输出时间 last_track_time |
|
||||
@@ -399,7 +400,7 @@ classDiagram
|
||||
|
||||
> 说明:Trust_Track 的状态布局为 [x, vx, ax, y, vy, ay],x/y 两轴解耦,每轴为「位置-速度-加速度」。
|
||||
>
|
||||
> ⚠ **结构体布局变更**:`DataRev` 新增 `amp_asv` / `prn_fftn`,`Track` 新增 `amp_asv_point` / `prn_fftn_point`;**V1.5.8 起 `Track` 又在 `Amplitude` 之后插入 `Quality`(之后字段整体后移)**,内部 `Trust_Track` / `Temp_track` 新增质量相关字段。宿主与 DLL 必须使用同一版本头文件并**同步重新编译**,否则字段错位。对外结构体中 `DataRev` 布局自 1.5.5 起未变化;原对外 `RadarPara` 已删除,`RDP_parameter` 仅在内部使用(宿主无需包含其定义)。
|
||||
> ⚠ **结构体布局变更**:`DataRev` 新增 `amp_asv` / `prn_fftn`,`Track` 新增 `amp_asv_point` / `prn_fftn_point`;**V1.5.8 起 `Track` 又在 `Amplitude` 之后插入 `Quality`(之后字段整体后移)**,内部 `Trust_Track` / `Temp_track` 新增质量相关字段。宿主与 DLL 必须使用同一版本头文件并**同步重新编译**,否则字段错位。**V1.5.9 的航迹指纹只新增内部 `Trust_Track::Track_fingerprint`,对外结构体字段与布局均未变化**;`DataRev` / `TrackingBeam` 的 `TAS_track_index` 字段名不变、仅语义改为指纹。对外结构体中 `DataRev` 布局自 1.5.5 起未变化;原对外 `RadarPara` 已删除,`RDP_parameter` 仅在内部使用(宿主无需包含其定义)。
|
||||
|
||||
---
|
||||
|
||||
@@ -438,7 +439,7 @@ classDiagram
|
||||
| 0 | 无效数据 | point_type 既非 0 也非 1 |
|
||||
| 1 | **TWS 满一圈,执行航迹处理** | point_type==0 且判圈条件成立:`scan_mode==0`(相扫)时当前帧方位波位号 ≤ 上一帧波位号 `last_beam_num`;`scan_mode==1`(机扫)时当前帧方位波位号 == 0 |
|
||||
| 2 | **TWS 未满一圈,继续蓄数据** | point_type==0 且上述判圈条件不成立;调用 track_process(model=2) 做滑窗凝聚 |
|
||||
| 3 | **TAS 处理** | point_type==1;同时记录 TAS_track_idx 与最新时间戳 |
|
||||
| 3 | **TAS 处理** | point_type==1;记录 `Data_Input[0].TAS_track_index`(**航迹指纹**)与最新时间戳 |
|
||||
|
||||
> **判圈由配置项 `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。
|
||||
|
||||
@@ -490,16 +491,17 @@ flowchart TD
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["data_preprocess: 点迹入 Data_buffer_tas,记录 TAS_track_idx/latest_timestamp → model=3"] --> B["track_process(3)"]
|
||||
B --> C["dot_coh_tas 单帧凝聚 → point_recv_tas"]
|
||||
C --> D["track_asso_tas: 仅对 tas_track_idx 批号做 IMM+EKF 关联(含高度门限)"]
|
||||
A["data_preprocess: 点迹入 Data_buffer_tas,记录 TAS 航迹指纹/latest_timestamp → model=3"] --> B["track_process(3)"]
|
||||
B --> B1["按指纹在航迹表中定位航迹 → 置 manual_tracking_flag=1、Track_Mode=1"]
|
||||
B1 --> C["dot_coh_tas 单帧凝聚 → point_recv_tas"]
|
||||
C --> D["track_asso_tas: 仅对该航迹做 IMM+EKF 关联(含高度门限)"]
|
||||
D --> E["未关联 → 按 latest_timestamp 外推(ΔT≤0 跳过)"]
|
||||
E --> F["track_die_tas: TAS 连续未关联超上限 / 手动删除 → 消亡输出"]
|
||||
F --> G["输出该批号航迹(point_type=1)"]
|
||||
G --> H["Beam_Ctrl: 数据率门控 + 队内最早 CPI 目标 + 预测波束输出"]
|
||||
F --> G["输出该航迹(point_type=1)"]
|
||||
G --> H["Beam_Ctrl: 数据率门控 + 队内最早 CPI 目标 + 预测波束输出(携带航迹指纹)"]
|
||||
```
|
||||
|
||||
TAS 输出同样受 `Track_Update_Flag` 门控:只有 `Track_Index == tas_track_idx` 且本圈有更新(关联到实点、或外推成功)时才向 `Trust_Track_Output` 写一行(`point_type=1`)。TAS 外推上限为配置项 `extrapolate_max_tas`(样例配置为相扫 5,机扫需配 48),判定方向与 TWS 相反(`Extrapolate_round >= 上限` 时才外推并输出),详见 9.9 与 11.2。
|
||||
TAS 输出同样受 `Track_Update_Flag` 门控:只有该航迹(由指纹定位)本圈有更新(关联到实点、或外推成功)时才向 `Trust_Track_Output` 写一行(`point_type=1`)。TAS 外推上限为配置项 `extrapolate_max_tas`(样例配置为相扫 5,机扫需配 48),判定方向与 TWS 相反(`Extrapolate_round >= 上限` 时才外推并输出),详见 9.9 与 11.2。TAS 队列内部仍以 `Track_Index` 索引,**只有对外接口(`DataRev` 输入、`TrackingBeam` 输出)使用指纹**(见 9.12)。
|
||||
|
||||
### 8.3 航迹起始流程(逻辑法)
|
||||
|
||||
@@ -860,7 +862,7 @@ $$
|
||||
|
||||
#### TAS(track_asso_tas.cpp)
|
||||
|
||||
只处理 tas_track_idx 指定的航迹,只有统计距离与高度两个门限,两者同时通过(`thd_d && thd_h`)才记为候选:
|
||||
只处理 `tas_track_idx` 指定的那条航迹(V1.5.9 起由输入帧的航迹指纹定位),只有统计距离与高度两个门限,两者同时通过(`thd_d && thd_h`)才记为候选:
|
||||
|
||||
$$
|
||||
thd\_d:\ d_i^2 < associate\_threshold^2 = 16 \qquad\text{且}\qquad thd\_h:\ \text{高度门限通过}
|
||||
@@ -936,7 +938,9 @@ x_p=x+v_x\Delta T,\quad y_p=y+v_y\Delta T,\quad
|
||||
r_p=\sqrt{x_p^2+y_p^2},\quad \theta_p=\operatorname{atan2}(y_p,x_p)
|
||||
$$
|
||||
|
||||
输出 TrackingBeam{open_flag=1, type=default_track_beam_type(配置项,样例 1), Range=rp, Azi=θp(°), Elev=asin(h/rp)(°), TAS_track_index};队空、目标不在航迹表或数据率门控未通过时 open_flag=0。输出后更新该目标队列项的 last_track_time;原每次 Beam_Ctrl 末尾的整队循环移位(队列轮转)已停用,改为按数据率门控在队列内轮换目标。
|
||||
输出 TrackingBeam{open_flag=1, type=default_track_beam_type(配置项,样例 1), Range=rp, Azi=θp(°), Elev=asin(h/rp)(°), **TAS_track_index=航迹指纹**(V1.5.9 起,不再下发批号)};队空、目标不在航迹表或数据率门控未通过时 open_flag=0。输出后更新该目标队列项的 last_track_time;原每次 Beam_Ctrl 末尾的整队循环移位(队列轮转)已停用,改为按数据率门控在队列内轮换目标。
|
||||
|
||||
> **入队当圈的输出(eb9f30c 修复)**:手动转 TAS 时 `tas_target_add()` 会立即输出一次该航迹的更新行;该行原只填少数字段,现与常规关联输出使用同一套字段(含 `Quality`、`Direction_Angle`、`Flag_Direction`、关联点信息、`x/y/v_x/v_y`、十字星数据等),宿主在转跟踪当圈即可拿到完整航迹信息。
|
||||
|
||||
> e0bf227 修正:数据率门控原先同时要求「距上次波束输出」与「航迹时间 T_track 距最新时间戳」都超过 `data_rate_tas`,第二个条件与「选 CPI 最早目标」的语义冲突(航迹时间越早反倒越容易被抑制),会漏掉本应输出的波束;现已只保留前者。
|
||||
|
||||
@@ -985,6 +989,34 @@ $$
|
||||
>
|
||||
> 已知局限(详见 11.2):TAS 通道不维护质量;`track_quality_min`、`track_die_quality_pramary`、`track_die_round` 当前可配置但未参与计算;起批质量门限按**临时航迹长度**取值,而实际起批只用末点质量。
|
||||
|
||||
### 9.12 航迹指纹(V1.5.9,0f3da99)
|
||||
|
||||
**目的**:航迹批号(`Track_Index`,1~500)在航迹消亡后会被复用,TAS 控制命令若只带批号,回放/重连后可能指向另一条航迹。为此在起批时为目标生成一个由目标特征决定的 **16 bit 指纹**,TAS 的输入与输出均改用指纹。
|
||||
|
||||
**生成**(`track_init.cpp::computeFingerprint()`,在 `tmp_track_to_trust_track()` 起批时对**末点**计算):
|
||||
|
||||
```cpp
|
||||
uint64_t h = kSeed; // 固定种子 0x243F6A8885A308D3
|
||||
h = mix64(h ^ quantize(r, 100.0)); // 距离:0.01 m
|
||||
h = mix64(h ^ quantize(azi, 1000.0)); // 方位:0.001°
|
||||
h = mix64(h ^ quantize(vr, 100.0)); // 径向速度:0.01 m/s
|
||||
h = mix64(h ^ quantize(RCS, 10.0)); // RCS:0.1 dBsm
|
||||
h = mix64(h ^ (uint64_t)CPI_time); // CPI 时间:毫秒整数
|
||||
fingerprint = fold16(h); // 折叠为 uint16
|
||||
```
|
||||
|
||||
- `quantize`:半舍入远离零(`std::round`),NaN / ±Inf 映射为固定常量,结果钳位到 ±9e18 以防止转 `int64` 溢出;
|
||||
- `mix64`:splitmix64 混合(`x^=x>>30; x*=0xBF58476D1CE4E5B9; x^=x>>27; x*=0x94D049BB133111EB; x^=x>>31`),使输入微小变化雪崩扩散;
|
||||
- `fold16`:把 64 bit 的高 32、16 位异或折叠到低 16 位(`h^=h>>32; h^=h>>16;`),充分使用熵后取 `uint16_t`。
|
||||
|
||||
**使用**
|
||||
|
||||
- **输出**:`tas_ctrl.cpp::tas_beam_output()` 写 `TrackingBeam::TAS_track_index = Track_fingerprint`(字段名沿用,语义已是指纹);
|
||||
- **输入**:`data_preprocess()` 的 TAS 分支把 `DataRev::TAS_track_index` 解释为指纹存入 `TAS_track_fingerprint`;`track_process(model=3)` 遍历航迹表寻找 `Track_fingerprint` 相同的航迹,命中后置 `manual_tracking_flag=1`、`Track_Mode=1` 再走 TAS 关联/外推;未命中则该帧无对应航迹(不处理);
|
||||
- **队列内部**:`Tracking_Target::Index` 仍存 `Track_Index`,即**队列与内部处理仍按批号**,只有跨 DLL 边界的数据用指纹(见 8.2)。
|
||||
|
||||
> 指纹是 **16 bit**(0~65535),理论上存在碰撞(同一时刻航迹数远小于 65536,实际概率低);指纹不含高度/批号,同一目标在两次独立起批时(例如消亡后重新起批)指纹可能不同。记录表 `RdpRecTrustTrack` 目前**未包含** `Track_fingerprint` 字段(见 docs/data_record_debug.md 第 7 节)。
|
||||
|
||||
---
|
||||
|
||||
## 10. 参数说明
|
||||
@@ -1212,6 +1244,8 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
||||
- **质量长度项含整数除法**:`1 − Valid_point_sum/Point_sum` 中两操作数均为 `int`,先做整数除法截断再乘 0.5,`Valid_point_sum/Point_sum` 的精度损失最大约 1/Point_sum;对点数很多的航迹影响可忽略,但精确复现公式时需注意。
|
||||
- **数据记录未采用关联信息裁剪与记录策略(P0-a / P2,V1.5.8 优化时明确不做)**:⑥ 关联信息仍按「每个候选一行」写入(单圈 ≈ 点迹数 × 航迹数),未裁剪为只记录取中候选,也未做按容量/时长切库与旧库清理;因此高航迹密度场景下判圈帧仍有可观记录开销(200 目标/150 点压测 p99 ≈ 13~24 ms),记录库也可能很大(60 圈约 1.06 GB)。属本轮刻意取舍,评价实时性时需区分普通帧(p99 ≈ 0.1 ms)与判圈帧。
|
||||
- **`scan_mode` 与实际雷达体制需一致(部署约束)**:DLL 不校验配置项 `scan_mode` 与实际雷达体制/波位号序列是否一致(不报错);机扫部署须把 `scan_mode` 配为 1 且 4 项数值按机扫取值(见 4.2)。机扫/相扫已合并为同一份构建,不再有编译期体制可作交叉校验。
|
||||
- **航迹指纹的复用与碰撞(V1.5.9)**:指纹为 **16 bit**(0~65535),由目标特征生成,因此 ① 理论上存在碰撞(同帧命中多条航迹时 `track_process(model=3)` 取遍历到的第一条);② 同一目标消亡后重新起批,因末点测量与 CPI 时间不同,指纹通常不同(跨起批不保证稳定);③ 指纹只用于跨 DLL 边界,**批号仍是内部主键**,`tracking_start/tracking_stop` 等手动接口仍按批号;④ 字段名 `TAS_track_index` 未改名而语义已变为指纹,对接时不要按旧含义当批号使用(见 9.12)。
|
||||
- **指纹未入记录表(V1.5.9)**:`RdpRecTrustTrack` 实体未包含 `Track_fingerprint`,记录库中只能通过 `Track_Index` / `track_id` 关联航迹;若要按指纹复盘 TAS 控制命令,需按 docs/data_record_debug.md 第 6 节配方自行加字段。
|
||||
|
||||
### 11.3 未启用功能
|
||||
|
||||
@@ -1238,20 +1272,22 @@ 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 消亡圈数与高度平滑调整、质量入库、参数配置方式改造、机扫/相扫版本合并与构建脚本适配、**全局工作参数对象改造**、**日志组件改为 spdlog**),已记入 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 之后的全部改动已随 [1.5.9] 归档**(参数配置方式改造 + 机扫/相扫合并、工作参数全局化、日志组件 spdlog、构建脚本适配、航迹指纹、手动转 TAS 输出修复),详见 CHANGELOG `[1.5.9]`。
|
||||
|
||||
近期提交(git log --oneline,新→旧;仅列代码改动,纯文档提交略):
|
||||
|
||||
| 提交 | 内容 |
|
||||
|---|---|
|
||||
| 工作区(日志组件改为 spdlog,未提交) | **日志组件由 `std::cout` 重定向改为内置 spdlog v1.17.0**:新增内置第三方库 `third_party/spdlog`(`include/` + `src/` + `LICENSE` + `UPSTREAM.md`,MIT,spdlog v1.17.0 上游快照,含随库内置的 {fmt} 12.1.0);根 `CMakeLists.txt` 新增静态库目标 `spdlog`(`SPDLOG_COMPILED_LIB`,第三方源码以 `/w` 编译)与缓存变量 `RDP_LOG_LEVEL`(`AUTO`/`TRACE`/`DEBUG`/`INFO`/`WARN`/`ERROR`/`CRITICAL`/`OFF`,AUTO 时 Debug=TRACE、其它构建=INFO),映射为 PUBLIC 编译定义 `SPDLOG_ACTIVE_LEVEL` 同时提供给 `data_process_class_dll` 与 `rdp_record`;`data_process_class_dll/rdp_log.h/.cpp` 重写:不再重定向 `std::cout`,`rdp_log::Init()` 创建 `RDP_LOG_DIR`(`.\rdp_logs\`)下 `rdp_YYYYMMDD_HHMMSS.log`(每次 `GetB()` 一个文件,同秒冲突追加 `_1`~`_999`),默认 logger 同时输出到标准输出与文件,行格式 `"[%Y-%m-%d %H:%M:%S.%e] [%l] [%s:%#] %v"`(毫秒时间戳、级别、文件名:行号、内容),所有级别逐条 flush,文件创建失败时降级为仅标准输出并返回 false;`rdp_log::Shutdown()` flush 并关闭日志文件;原流式 `RDP_LOG` 宏改为 `RDP_LOG_TRACE` / `RDP_LOG_DEBUG` / `RDP_LOG_INFO` / `RDP_LOG_WARN` / `RDP_LOG_ERROR` / `RDP_LOG_CRITICAL`(`RDP_LOG_ERR` 为 ERROR 别名)的 fmt 风格调用;`RDP_LOG_ENABLE` 宏已删除,日志级别改由 `SPDLOG_ACTIVE_LEVEL` 在编译期控制(OFF = 编译期关闭且不创建日志文件);`Data_Process_Factory::GetB()` 中启用 `rdp_log::Init()`(在 `rdp_record::Init()` 之前)、`Destroy()` 中在 `rdp_record::Shutdown()` 之后调用 `rdp_log::Shutdown()`;调用点迁移(`data_process.cpp` 参数重载成功 INFO / 失败 ERROR、`track_asso_tas.cpp` ΔT≤0 告警 WARN、`rdp_record.cpp` 19 处 info/warn/error 分级;其余注释代码中的旧宏同步改写);`parameters.h` 删除 `RDP_LOG_ENABLE`、保留 `RDP_LOG_DIR`,注释改为说明 spdlog + `SPDLOG_ACTIVE_LEVEL`。验证(Lead 实测,2026-10-28):4 配置(Release/Debug × REC_OFF/REC_ON)0 warning 0 error;公开接口测试 38 项断言全部通过;运行期实测日志同时写入标准输出与文件、文件名/行格式正确、`Destroy()`→`GetB()` 同秒重连生成 `_1` 后缀新文件(样例:`[2026-10-28 10:48:29.697] [info] [rdp_log.cpp:153] rdp_log enabled, log file: .\rdp_logs\rdp_20261028_104829.log`)。详见 CHANGELOG `[Unreleased]` |
|
||||
| 工作区(全局工作参数对象改造,未提交) | **工作参数改为全局对象**:`struct.h` 在 `struct RDP_parameter` 之后新增 `extern RDP_parameter rdp_parameter;`(声明位于 `struct.h:285`),`data_process.cpp` 定义并零初始化(L14);`Data_Process` 删除 `RDP_parameter rdp_parameter` 成员(`data_process.h` 保留注释说明);`parameters_reload()` 改为直接调用 `rdp_parameter_load(path, rdp_parameter, &error)`(loader 仅在校验全部通过后写入,失败不写入,「失败保持当前参数」语义不变);删除处理模块(kalman 11 个方法、dot_coh/dot_coh_tas、track_asso 系列、track_init 系列、track_die 系列、track_index_mangement、tas_ctrl,共 12 个模块的 24 个 .h/.cpp 文件)全部 `const RDP_parameter& rdp_parameter` 形参与调用实参,函数体内 `rdp_parameter.<field>` 一处未改、现直接解析全局对象;接口签名/公式/阈值/数值行为不变;全局对象为 DLL 内单实例、非线程安全(配置重载须与处理互斥,见 BUG-03/BUG-13)。验证(Lead 实测,2026-10-27):4 配置(Release/Debug × REC_OFF/REC_ON)重建成功、0 warning 0 error;DLL 体积 Release REC_OFF 331,264 / Release REC_ON 1,652,736 / Debug REC_OFF 1,715,200 / Debug REC_ON 4,691,968 字节;导出表仍 31 项(`parameters_reload` 在列、全局 `rdp_parameter` 不导出);加载器单测 233 项断言、公开接口运行期测试 4 配置 × 38 项断言全部通过;静态检查处理模块已无 `const RDP_parameter&` 形参(仅 loader 内部 `validate_parameter` 保留)。详见 CHANGELOG `[Unreleased]` |
|
||||
| 工作区(构建脚本适配机扫/相扫合并,未提交) | 构建不再区分 `PHASE_SCANNING` / `MECHANICAL_SCANNING`:`CMakeLists.txt` 删除 `RADAR_SCAN_MODE` 缓存变量与体制编译宏;构建目录改为 `build/<Debug\|Release>/<REC_AUTO\|REC_OFF\|REC_ON>`(去掉 PS/MS 维度);`config_paths.bat`/`configure.bat`/`build.bat`/`clean.bat` 参数改为 `<Debug\|Release> [AUTO\|ON\|OFF]`,新增 `build_config.bat`(单配置配置+构建,取代 `build_all.bat`),`clean_all.bat` 同时清理旧版 `build/X256_PS`、`build/X256_MS`;`tasks.json` 5 个任务改为「清理全部」+ 4 个「配置并构建(...)」;`settings.json`(buildDirectory 去掉 scanMode 维度)、`cmake-variants.yaml`(移除 scanMode 变体)、`c_cpp_properties.json`(合并为单个 X256 配置)、`launch.json` 同步。验证:5 个任务返回 0,4 种配置(Release/Debug × REC_OFF/REC_ON)0 warning 0 error,编译命令无体制宏,增量重建 0 编译步骤 |
|
||||
| 423c200 / 019af7a(参数配置方式改造 + 机扫/相扫版本合并) | **参数配置方式改造:TOML 配置文件 → `RDP_parameter`**。新增 `rdp_parameter_loader.h/.cpp`(严格校验 11 个配置段、标量键必填、类型/范围校验、未知段/键拒绝、屏蔽区数组长度等于 `*_num`,失败 -1 且不改变当前参数)与示例 `config/config_tmp.toml`;内置 toml++ v3.4.0 单头文件 `third_party/toml/toml.hpp`;公开头删除 `struct RadarPara` 与 `track_process_parameters_initial/modify`,新增 `virtual int parameters_reload(const char*)`(`Data_Process` 实现为加载成功后整体替换 `rdp_parameter`;**后于本工作区的「全局工作参数对象改造」改为写入全局对象**);`data_process.h` 删除 `Work_Parameter`,各模块(kalman 11 个方法、dot_coh、dot_coh_tas、track_asso(_tas/_direct_tracking)、track_init(_direct_tracking)、track_die(_tas)、track_index_mangement、tas_ctrl)改为 `const RDP_parameter& rdp_parameter`(**后于本工作区的「全局工作参数对象改造」删除该形参、改为直接访问全局对象**),宏与旧字段按映射等价替换;**新增配置项 `scan_mode`(0 相扫 / 1 机扫)**,`data_process.cpp` 的 TWS 判圈由编译期 `#ifdef PHASE_SCANNING` 改为按 `scan_mode` 运行时选择(行为逐分支等价);019af7a 进一步把机扫/相扫合并为**同一份代码与同一份构建**(版本号 1.5.9、`VERSION_INFO` 改为 `GENERIC`,`PHASE_SCANNING`/`MECHANICAL_SCANNING` 不再参与任何功能);`parameters.h` 仅保留 PI、版本/日志/记录宏、`MAX_TRACK_NUM`、`RDP_TAS_QUEUE_CAPACITY`、`Round`(`UNCONF_TARGET` 已删除,起批处 `Target_Type` 直接写 0);`track_index_mangement` 航迹号表改按 `track_index_max` 分配,TAS 队列容量用 `RDP_TAS_QUEUE_CAPACITY`、运行期上限用 `tas_track_num_max`,波束类型用 `default_track_beam_type`。验证(Lead 实测,2026-10-27):合并前 8 配置、合并后 4 配置均 0 warning 0 error;Release REC_OFF DLL 331,776 字节、Debug REC_ON 4,694,528 字节、导出表 31 项(新增 `parameters_reload`,旧参数接口与 `RadarPara` 符号消失);加载器单测 233 项断言、公开接口运行期测试(含判圈运行时切换)全部通过;`RDP_parameter` 成员 / 加载器键 / TOML 键均为 63 个,11 个配置段不变。详见 CHANGELOG `[Unreleased]` |
|
||||
| eb9f30c | 修复手动转 TAS 时输出航迹更新信息不完整:`tas_target_add()` 的即时输出行改为与常规关联输出同一套字段(含 `Quality`/`Direction_Angle`/`Flag_Direction`/关联点信息/`x,y,v_x,v_y`/十字星数据等),并补写 `point_type=0` |
|
||||
| 0f3da99 | 增加航迹指纹:`Trust_Track::Track_fingerprint`(16 bit,起批时按末点 `r`/`azi`/`vr`/`RCS`/`CPI_time` 量化 + splitmix64 + 折叠生成);TAS 波束改为下发指纹、TAS 数据帧按指纹匹配航迹(不再按批号),实现 TAS 回放(见 9.12) |
|
||||
| 24ce1e6 | **日志组件由 `std::cout` 重定向改为内置 spdlog v1.17.0**:新增内置第三方库 `third_party/spdlog`(`include/` + `src/` + `LICENSE` + `UPSTREAM.md`,MIT,spdlog v1.17.0 上游快照,含随库内置的 {fmt} 12.1.0);根 `CMakeLists.txt` 新增静态库目标 `spdlog`(`SPDLOG_COMPILED_LIB`,第三方源码以 `/w` 编译)与缓存变量 `RDP_LOG_LEVEL`(`AUTO`/`TRACE`/`DEBUG`/`INFO`/`WARN`/`ERROR`/`CRITICAL`/`OFF`,AUTO 时 Debug=TRACE、其它构建=INFO),映射为 PUBLIC 编译定义 `SPDLOG_ACTIVE_LEVEL` 同时提供给 `data_process_class_dll` 与 `rdp_record`;`data_process_class_dll/rdp_log.h/.cpp` 重写:不再重定向 `std::cout`,`rdp_log::Init()` 创建 `RDP_LOG_DIR`(`.\rdp_logs\`)下 `rdp_YYYYMMDD_HHMMSS.log`(每次 `GetB()` 一个文件,同秒冲突追加 `_1`~`_999`),默认 logger 同时输出到标准输出与文件,行格式 `"[%Y-%m-%d %H:%M:%S.%e] [%l] [%s:%#] %v"`(毫秒时间戳、级别、文件名:行号、内容),所有级别逐条 flush,文件创建失败时降级为仅标准输出并返回 false;`rdp_log::Shutdown()` flush 并关闭日志文件;原流式 `RDP_LOG` 宏改为 `RDP_LOG_TRACE` / `RDP_LOG_DEBUG` / `RDP_LOG_INFO` / `RDP_LOG_WARN` / `RDP_LOG_ERROR` / `RDP_LOG_CRITICAL`(`RDP_LOG_ERR` 为 ERROR 别名)的 fmt 风格调用;`RDP_LOG_ENABLE` 宏已删除,日志级别改由 `SPDLOG_ACTIVE_LEVEL` 在编译期控制(OFF = 编译期关闭且不创建日志文件);`Data_Process_Factory::GetB()` 中启用 `rdp_log::Init()`(在 `rdp_record::Init()` 之前)、`Destroy()` 中在 `rdp_record::Shutdown()` 之后调用 `rdp_log::Shutdown()`;调用点迁移(`data_process.cpp` 参数重载成功 INFO / 失败 ERROR、`track_asso_tas.cpp` ΔT≤0 告警 WARN、`rdp_record.cpp` 19 处 info/warn/error 分级;其余注释代码中的旧宏同步改写);`parameters.h` 删除 `RDP_LOG_ENABLE`、保留 `RDP_LOG_DIR`,注释改为说明 spdlog + `SPDLOG_ACTIVE_LEVEL`。验证(Lead 实测,2026-10-28):4 配置(Release/Debug × REC_OFF/REC_ON)0 warning 0 error;公开接口测试 38 项断言全部通过;运行期实测日志同时写入标准输出与文件、文件名/行格式正确、`Destroy()`→`GetB()` 同秒重连生成 `_1` 后缀新文件。详见 CHANGELOG `[1.5.9]` |
|
||||
| 7e4cb29 | **工作参数改为全局对象**:`struct.h` 新增 `extern RDP_parameter rdp_parameter;`(声明位于 `struct.h`),`data_process.cpp` 定义并零初始化;`Data_Process` 删除 `RDP_parameter` 成员;`parameters_reload()` 直接调用 `rdp_parameter_load(path, rdp_parameter, &error)`(loader 仅在校验全部通过后写入,失败不写入,「失败保持当前参数」语义不变);删除处理模块(kalman 11 个方法、dot_coh/dot_coh_tas、track_asso 系列、track_init 系列、track_die 系列、track_index_mangement、tas_ctrl,共 12 个模块的 24 个 .h/.cpp 文件)全部 `const RDP_parameter& rdp_parameter` 形参与调用实参,函数体内 `rdp_parameter.<field>` 一处未改、现直接解析全局对象;接口签名/公式/阈值/数值行为不变;全局对象为 DLL 内单实例、非线程安全(配置重载须与处理互斥,见 BUG-03/BUG-13)。验证(Lead 实测,2026-10-27):4 配置(Release/Debug × REC_OFF/REC_ON)重建成功、0 warning 0 error;DLL 体积 Release REC_OFF 331,264 / Release REC_ON 1,652,736 / Debug REC_OFF 1,715,200 / Debug REC_ON 4,691,968 字节;导出表仍 31 项(`parameters_reload` 在列、全局 `rdp_parameter` 不导出);加载器单测 233 项断言、公开接口运行期测试 4 配置 × 38 项断言全部通过;静态检查处理模块已无 `const RDP_parameter&` 形参(仅 loader 内部 `validate_parameter` 保留)。详见 CHANGELOG `[1.5.9]` |
|
||||
| 76b0b46 | 构建脚本适配机扫/相扫合并:构建不再区分 `PHASE_SCANNING` / `MECHANICAL_SCANNING`:`CMakeLists.txt` 删除 `RADAR_SCAN_MODE` 缓存变量与体制编译宏;构建目录改为 `build/<Debug\|Release>/<REC_AUTO\|REC_OFF\|REC_ON>`(去掉 PS/MS 维度);`config_paths.bat`/`configure.bat`/`build.bat`/`clean.bat` 参数改为 `<Debug\|Release> [AUTO\|ON\|OFF]`,新增 `build_config.bat`(单配置配置+构建,取代 `build_all.bat`),`clean_all.bat` 同时清理旧版 `build/X256_PS`、`build/X256_MS`;`tasks.json` 5 个任务改为「清理全部」+ 4 个「配置并构建(...)」;`settings.json`(buildDirectory 去掉 scanMode 维度)、`cmake-variants.yaml`(移除 scanMode 变体)、`c_cpp_properties.json`(合并为单个 X256 配置)、`launch.json` 同步。验证:5 个任务返回 0,4 种配置(Release/Debug × REC_OFF/REC_ON)0 warning 0 error,编译命令无体制宏,增量重建 0 编译步骤 |
|
||||
| 423c200 / 019af7a(参数配置方式改造 + 机扫/相扫版本合并) | **参数配置方式改造:TOML 配置文件 → `RDP_parameter`**。新增 `rdp_parameter_loader.h/.cpp`(严格校验 11 个配置段、标量键必填、类型/范围校验、未知段/键拒绝、屏蔽区数组长度等于 `*_num`,失败 -1 且不改变当前参数)与示例 `config/config_tmp.toml`;内置 toml++ v3.4.0 单头文件 `third_party/toml/toml.hpp`;公开头删除 `struct RadarPara` 与 `track_process_parameters_initial/modify`,新增 `virtual int parameters_reload(const char*)`(`Data_Process` 实现为加载成功后整体替换 `rdp_parameter`;**后于本工作区的「全局工作参数对象改造」改为写入全局对象**);`data_process.h` 删除 `Work_Parameter`,各模块(kalman 11 个方法、dot_coh、dot_coh_tas、track_asso(_tas/_direct_tracking)、track_init(_direct_tracking)、track_die(_tas)、track_index_mangement、tas_ctrl)改为 `const RDP_parameter& rdp_parameter`(**后于本工作区的「全局工作参数对象改造」删除该形参、改为直接访问全局对象**),宏与旧字段按映射等价替换;**新增配置项 `scan_mode`(0 相扫 / 1 机扫)**,`data_process.cpp` 的 TWS 判圈由编译期 `#ifdef PHASE_SCANNING` 改为按 `scan_mode` 运行时选择(行为逐分支等价);019af7a 进一步把机扫/相扫合并为**同一份代码与同一份构建**(版本号 1.5.9、`VERSION_INFO` 改为 `GENERIC`,`PHASE_SCANNING`/`MECHANICAL_SCANNING` 不再参与任何功能);`parameters.h` 仅保留 PI、版本/日志/记录宏、`MAX_TRACK_NUM`、`RDP_TAS_QUEUE_CAPACITY`、`Round`(`UNCONF_TARGET` 已删除,起批处 `Target_Type` 直接写 0);`track_index_mangement` 航迹号表改按 `track_index_max` 分配,TAS 队列容量用 `RDP_TAS_QUEUE_CAPACITY`、运行期上限用 `tas_track_num_max`,波束类型用 `default_track_beam_type`。验证(Lead 实测,2026-10-27):合并前 8 配置、合并后 4 配置均 0 warning 0 error;Release REC_OFF DLL 331,776 字节、Debug REC_ON 4,694,528 字节、导出表 31 项(新增 `parameters_reload`,旧参数接口与 `RadarPara` 符号消失);加载器单测 233 项断言、公开接口运行期测试(含判圈运行时切换)全部通过;`RDP_parameter` 成员 / 加载器键 / TOML 键均为 63 个,11 个配置段不变。详见 CHANGELOG `[1.5.9]` |
|
||||
| 1ffb287 | 增加航迹质量记录到数据库:`RdpRecTempTrack` 增 `quality`,`RdpRecTrustTrack` 增 `Quality`/`Unupdated_time`/`Point_sum`/`Valid_point_sum` 并同步注册 |
|
||||
| 6284f3f | 修改 TAS 模式高度平滑点数:`track_asso_tas.cpp` 分段偏移 `+2/+3/+4/+6` → `+6/+8/+10/+12`,相扫 `H_F_WIN_LEN` 3→6(相扫 TAS 窗口 12/14/16/18、机扫 9/11/13/15;TWS 相扫随之 8/9/10/12) |
|
||||
| 5d105d2 | 修改相扫模式下 TAS 航迹消亡圈数:`TRACK_DIE_ROUND_TAS` 10→20(机扫保持 96),相扫 TAS 实际连续 21 圈无实点才消亡 |
|
||||
| 17a3d99 | 数据记录调试功能性能优化:`rdp_record.h` 新增 `Stats`/`stats()` 与 6 个异步入队接口及对应宏(旧 `RDP_RECORD`/`RDP_RECORD_BATCH` 保留为遗留同步接口);`Init()` 启动**异步写线程**,处理线程只入队、实体构造与批量事务由写线程完成;有界队列(64 MB / 4096 批,满则丢弃并计数);WAL + `synchronous=OFF` + 8 MB 缓存 + 去除 `AUTOINCREMENT`;写失败每表提示一次、连续 10 次熔断;`Shutdown()` 排空后 `wal_checkpoint(TRUNCATE)`;12 个记录点改为「收集 → 一次入队」,记录行数与表列不变;`parameters.h` 新增 10 个可调宏。验证与完整条目见 CHANGELOG `[Unreleased]` |
|
||||
| 17a3d99 | 数据记录调试功能性能优化:`rdp_record.h` 新增 `Stats`/`stats()` 与 6 个异步入队接口及对应宏(旧 `RDP_RECORD`/`RDP_RECORD_BATCH` 保留为遗留同步接口);`Init()` 启动**异步写线程**,处理线程只入队、实体构造与批量事务由写线程完成;有界队列(64 MB / 4096 批,满则丢弃并计数);WAL + `synchronous=OFF` + 8 MB 缓存 + 去除 `AUTOINCREMENT`;写失败每表提示一次、连续 10 次熔断;`Shutdown()` 排空后 `wal_checkpoint(TRUNCATE)`;12 个记录点改为「收集 → 一次入队」,记录行数与表列不变;`parameters.h` 新增 10 个可调宏。验证与完整条目见 CHANGELOG `[1.5.9]` |
|
||||
| 3dee734 | 优化配置构建脚本:构建目录改为按完整配置隔离 `build/<X256_PS\|X256_MS>/<Debug\|Release>/<REC_AUTO\|REC_OFF\|REC_ON>`;新增 `config_paths.bat`(目录推导与参数校验)、`build_all.bat`(两种扫描体制依次配置+构建)、`clean_all.bat`(清理全部配置);`configure.bat`/`build.bat`/`clean.bat` 参数改为「扫描体制 + 构建类型 + 记录模式」并自动推导目录;`tasks.json` 原有 15 个任务全部删除,仅保留 5 个任务(清理全部 + Release/Debug × REC_OFF/REC_ON 的「配置并构建全部」);`settings.json`/`cmake-variants.yaml`/`c_cpp_properties.json`/`launch.json` 同步;验证:5 个任务实际执行均返回 0,8 种配置(PS/MS × Release/Debug × REC_OFF/REC_ON)0 warning、0 error,产物位于各配置目录的 `bin/`、`lib/`(**该 PS/MS 双构建布局已由工作区的「构建脚本适配机扫/相扫合并」取代**) |
|
||||
| 3088ce4(**V1.5.8** 版本号来源) | 更新版本号至 V1.5.8(`PATCH_VERSION` 7→8) |
|
||||
| 782bff5 | 调整航迹质量下降逻辑(改为按未更新时长的二次函数衰减,系数 −0.0008 / −0.0025);**普通 TWS 航迹消亡条件改为由航迹质量确定**(`Quality < TRACK_DIE_QUALITY` = 0.3),重点航迹与 TAS 仍按外推圈数 |
|
||||
@@ -1274,7 +1310,7 @@ DLL :rdp_parameter_load() 解析 TOML → 严格校验 → 全部通过后一
|
||||
| 50e0b5c | 新增手动重点目标接口(`primary_target_add`/`primary_target_cancel` + `Trust_Track::primary_target_flag`)与重点航迹消亡圈数 `TRACK_DIE_ROUND_PRIMARY`(10);输出航迹改为只输出 `Track_Update_Flag==1` 的本圈更新航迹;未关联航迹外推限制在 `MAX_EXTRAPOLATE_NUM`(3)圈内,TAS 侧新增 `MAX_EXTRAPOLATE_NUM_TAS`(相扫 5 / 机扫 48);`TRACK_DIE_ROUND` 由 4 调整为 6、`TRACK_DIE_ROUND_TAS` 相扫由 5 调整为 10,消亡判据改为 `>`;同步更新 README/CHANGELOG/docs |
|
||||
| e0bf227 | 关联判定重构并加强:TWS `track_asso.cpp` 新增按航迹距离分段的高度门限(原高度门限代码块为注释状态)、统计距离/高度/距离三类判据拆为 `thd_d`/`thd_h`/`thd_r` 布尔量;`parameters.h` 的 `ASSO_THORD` 由 3 调大至 4(等效门限 d < 4,提高机动目标关联概率);TAS `track_asso_tas.cpp` 高度门限 2000~3000 m 段由 200 m 放宽至 250 m;修复 `tas_beam_output()` 的数据率门控条件(去掉与「取最早 CPI 目标」冲突的 T_track 判据);删除 `docs/data_process_flow_report.html`;`.gitignore` 增加 `design_docs/`;同步更新 README/CHANGELOG/docs |
|
||||
| f249fdc | 输出航迹新增「靠近/远离」方向标志:`track_asso.cpp`(TWS)与 `track_asso_tas.cpp`(TAS)在写入 `vr_point` 后补 `Flag_Direction = vr_point > 0 ? 1 : 0`;新增 `docs/data_process_flow_report.md`、`docs/data_process_flow_report.html`、`docs/track_init_readme.md` 三份流程与专项文档(其中 HTML 版已于 e0bf227 删除) |
|
||||
| 7d5a56f | 满圈判据由「波位号变小」改为「方位波位号 == 0」(避免机扫转台反转误判,`data_process.cpp`);点-航迹头关联改为统一速度区间 `V_MIN·ΔT ≤ dis ≤ V_MAX·ΔT` 并新增 `dis ≥ |vr_point|·ΔT`、`dis ≥ |v_track_head|·ΔT` 两条多普勒-几何一致性约束,限制切向高速短航迹(`track_init.cpp`);同步更新 README/CHANGELOG |
|
||||
| 7d5a56f | 满圈判据由「波位号变小」改为「方位波位号 == 0」(避免机扫转台反转误判,`data_process.cpp`);点-航迹头关联改为统一速度区间 `V_MIN·ΔT ≤ dis ≤ V_MAX·ΔT` 并新增 `dis ≥ \|vr_point\|·ΔT`、`dis ≥ \|v_track_head\|·ΔT` 两条多普勒-几何一致性约束,限制切向高速短航迹(`track_init.cpp`);同步更新 README/CHANGELOG |
|
||||
| 604f158 | TWS 关联中 ΔT≤0(点迹时间戳不晚于航迹时间)的候选不再剔除:仍参与最近邻选取但不更新 IMM/EKF、不刷新航迹时间与新鲜度,并标记该点迹已使用(`Use_Flag=1`)消费掉,避免其继续参与航迹起始生成虚假 TWS 航迹;`track_asso.cpp` 的 ΔT≤0 告警日志注释停用;过期文档(BUG_REPORT.md、BUG_FIX_REPORT.md、requirements.md)移入 archived_docs/ 留档 |
|
||||
| d6cdbc0 | 删除 `data_process.cpp`、`dot_coh.cpp` 中已注释停用的调试输出与早期 1 km SNR 过滤代码残留(不改变运行逻辑);同步更新 README/CHANGELOG |
|
||||
| 1521592 | 新增日志模块(`rdp_log.h/.cpp`,CMake SOURCES 注册、.gitignore 忽略 `rdp_logs/`):`RDP_LOG_ENABLE` / `RDP_LOG_DIR` 宏(parameters.h)、std::cout 经 `rdbuf()` 重定向到 `.\rdp_logs\` 下日期+时间命名日志、`RDP_LOG` 前缀宏、ΔT≤0 告警日志;`RadarPara.DATA_RATE_TAS` 单位由 Hz 改为 s;修复 `tas_beam_output()` 将向量下标误赋给 `Tracking_beam->TAS_track_index` 的问题(该日志实现——`std::cout` 重定向 + 流式 `RDP_LOG` 宏——已于「工作区(日志组件改为 spdlog,未提交)」改为 spdlog);更新 README/CHANGELOG |
|
||||
|
||||
Reference in New Issue
Block a user