Compare commits
2
Commits
5f820987a9
...
d6cdbc0120
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d6cdbc0120 | ||
|
|
15215926c5 |
@@ -3,4 +3,5 @@ build-data_process_class_dll-Desktop_Qt_5_7_0_MSVC2013_32bit-Release/
|
|||||||
debug/
|
debug/
|
||||||
release/
|
release/
|
||||||
build/
|
build/
|
||||||
|
rdp_logs/
|
||||||
.mnemon/
|
.mnemon/
|
||||||
@@ -14,6 +14,8 @@
|
|||||||
- `Tracking_Target` 新增 `last_track_time` 字段,记录各 TAS 目标最近一次波束输出时间(f438ac5)。
|
- `Tracking_Target` 新增 `last_track_time` 字段,记录各 TAS 目标最近一次波束输出时间(f438ac5)。
|
||||||
- 新增 requirements.md,说明 TAS 波束控制逻辑的修改背景与约定(b3e2f52)。
|
- 新增 requirements.md,说明 TAS 波束控制逻辑的修改背景与约定(b3e2f52)。
|
||||||
- 更新 README.md:目录结构补充 CHANGELOG.md / requirements.md;版本历史表补充 93d3924、b3e2f52、e729c5b、f438ac5 提交记录。
|
- 更新 README.md:目录结构补充 CHANGELOG.md / requirements.md;版本历史表补充 93d3924、b3e2f52、e729c5b、f438ac5 提交记录。
|
||||||
|
- 新增日志文件输出功能:`parameters.h` 增加 `RDP_LOG_ENABLE` 开关(默认开启)与 `RDP_LOG_DIR` 目录宏(`.\\rdp_logs\\`);新增 `rdp_log.h/.cpp` 日志模块,首次 `Data_Process_Factory::GetB()` 时按 `RDP_LOG_ENABLE` 决定是否用 `rdbuf()` 将 `std::cout` 重定向到 `.\rdp_logs\` 下按日期+时间命名的日志文件(`rdp_YYYYMMDD_HHMMSS.log`,目录不存在自动创建),`Destroy()` 销毁实例时恢复 `std::cout` 并关闭文件;开关注释关闭时不重定向、日志仍输出到标准输出;日志文件在 `CMakeLists.txt` 的 SOURCES 中注册。
|
||||||
|
- 新增 `RDP_LOG` 日志输出宏(`rdp_log.h`):自动在每条日志前附加 `[时间戳][代码文件:行号]` 信息后再输出到标准输出(重定向开启时随之写入日志文件),供后续新增日志统一使用。
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
@@ -23,10 +25,14 @@
|
|||||||
- 编译时以 `#pragma message` 提示当前启用的扫描体制宏(MECHANICAL_SCANNING / PHASE_SCANNING)。
|
- 编译时以 `#pragma message` 提示当前启用的扫描体制宏(MECHANICAL_SCANNING / PHASE_SCANNING)。
|
||||||
- 频点宏由 `FREQ0~FREQ20`(16.8 GHz)精简为单个 `FREQ0`,取值改为 9.2 GHz(e729c5b)。
|
- 频点宏由 `FREQ0~FREQ20`(16.8 GHz)精简为单个 `FREQ0`,取值改为 9.2 GHz(e729c5b)。
|
||||||
- MSVC 编译选项按编译器版本条件追加 `/utf-8`(VS2015 及以上);MSVC 2013 不支持该选项,改用源码文件带 BOM 的 UTF-8 编码解决 C4819。
|
- MSVC 编译选项按编译器版本条件追加 `/utf-8`(VS2015 及以上);MSVC 2013 不支持该选项,改用源码文件带 BOM 的 UTF-8 编码解决 C4819。
|
||||||
|
- 存量调试输出收敛为告警级 `RDP_LOG` 日志(1521592):`track_asso.cpp` / `track_asso_tas.cpp` 的 `model_filter()` 在 ΔT ≤ 0(乱序/重复时间戳)分支新增告警日志(含航迹/点迹/时间差信息);`tas_ctrl.cpp` 中 TAS 波束最早目标调度的 `printf` 调试输出移除,`data_process.cpp` 手动删除与 `track_die_tas.cpp` TAS 目标消亡的 `std::cout` 调试输出注释停用。重定向开启时上述日志随 `std::cout` 一并写入日志文件。
|
||||||
|
- `RadarPara.DATA_RATE_TAS` 单位由 Hz(1/s)改为 s(秒)(1521592):`tas_beam_output()` 的 TAS 波束输出门控由 `1 / DATA_RATE_TAS` 秒改为直接按 `DATA_RATE_TAS` 秒比较,`data_process_class_dll.h` 字段注释同步更新;调用者改按「波束输出间隔(秒)」输入该参数(原 0.3 Hz 的含义不再适用,需按新单位换算后传入)。
|
||||||
|
- requirements.md 内容更新为「雷达数据处理项目修改说明」(1521592):现描述日志文件输出功能需求(rdbuf() 重定向、日志开关宏、日期+时间命名日志、前缀日志宏,附参考示例)。
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- 修复 MSVC `/W3` 下全部 C4819 / C4018 / C4244 编译警告:源码文件改为带 BOM 的 UTF-8 编码;signed/unsigned 不匹配处改用 `size_t` 循环变量或显式 `static_cast<int>` 比较;double/float、__int64/double 等窄化转换改为 `static_cast` 显式转换,保持原有计算逻辑不变(涉及 `data_process.cpp`、`dot_coh.cpp`、`dot_coh_tas.cpp`、`tas_ctrl.cpp`、`track_asso.cpp`、`track_asso_tas.cpp`、`track_init.cpp`、`track_init_direct_tracking.cpp`、`track_index_mangement.cpp` 等)。
|
- 修复 MSVC `/W3` 下全部 C4819 / C4018 / C4244 编译警告:源码文件改为带 BOM 的 UTF-8 编码;signed/unsigned 不匹配处改用 `size_t` 循环变量或显式 `static_cast<int>` 比较;double/float、__int64/double 等窄化转换改为 `static_cast` 显式转换,保持原有计算逻辑不变(涉及 `data_process.cpp`、`dot_coh.cpp`、`dot_coh_tas.cpp`、`tas_ctrl.cpp`、`track_asso.cpp`、`track_asso_tas.cpp`、`track_init.cpp`、`track_init_direct_tracking.cpp`、`track_index_mangement.cpp` 等)。
|
||||||
|
- 修复 `TAS_Ctrl::tas_beam_output()` 把航迹向量下标 `earliest_track_idx` 误赋给 `Tracking_beam->TAS_track_index` 的问题(1521592):现输出实际航迹号 `(*trust_track)[earliest_track_idx].Track_Index`,避免跟踪波束批号与目标不符。
|
||||||
|
|
||||||
## [1.5.5] - 2026-08-27
|
## [1.5.5] - 2026-08-27
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ if(NOT CMAKE_GENERATOR MATCHES "Visual Studio")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(SOURCES
|
set(SOURCES
|
||||||
|
data_process_class_dll/rdp_log.cpp
|
||||||
data_process_class_dll/data_process_class_dll.cpp
|
data_process_class_dll/data_process_class_dll.cpp
|
||||||
data_process_class_dll/data_process.cpp
|
data_process_class_dll/data_process.cpp
|
||||||
data_process_class_dll/dot_coh.cpp
|
data_process_class_dll/dot_coh.cpp
|
||||||
|
|||||||
@@ -60,6 +60,7 @@
|
|||||||
- **TAS 波束控制**:手动转 TAS 目标入队(队列长度与容量随扫描体制切换),按最新时间戳外推输出跟踪波束(距离/方位/俯仰/批号)。
|
- **TAS 波束控制**:手动转 TAS 目标入队(队列长度与容量随扫描体制切换),按最新时间戳外推输出跟踪波束(距离/方位/俯仰/批号)。
|
||||||
- **航迹生命周期管理**:外推轮数计数、超时消亡、手动删除、全清空(含各模块 reset,防重连后幽灵航迹)。
|
- **航迹生命周期管理**:外推轮数计数、超时消亡、手动删除、全清空(含各模块 reset,防重连后幽灵航迹)。
|
||||||
- **防御性加固**:见 BUG_FIX_REPORT.md——越界防护、时间戳正序校验、方位角 ±π 环绕、asin 定义域钳位、IMM 概率奇异保护等已修复项。
|
- **防御性加固**:见 BUG_FIX_REPORT.md——越界防护、时间戳正序校验、方位角 ±π 环绕、asin 定义域钳位、IMM 概率奇异保护等已修复项。
|
||||||
|
- **日志文件输出**:`RDP_LOG_ENABLE` 开启时(默认),首次 `Data_Process_Factory::GetB()` 自动用 `rdbuf()` 将 `std::cout` 重定向到 `RDP_LOG_DIR`(`.\rdp_logs\`)下按日期+时间命名的日志文件,`Destroy()` 时恢复控制台并关闭文件;`RDP_LOG` 日志宏在每条日志前附加 `[时间戳][文件:行号]`,开关注释关闭时不重定向、日志仍输出到控制台。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -71,7 +72,7 @@
|
|||||||
├── BUG_REPORT.md # 全量逻辑 BUG 分析报告(P0~P3,37 项)
|
├── BUG_REPORT.md # 全量逻辑 BUG 分析报告(P0~P3,37 项)
|
||||||
├── BUG_FIX_REPORT.md # BUG 修复报告(修复明细 + 编译验证结果)
|
├── BUG_FIX_REPORT.md # BUG 修复报告(修复明细 + 编译验证结果)
|
||||||
├── CHANGELOG.md # 变更日志(Keep a Changelog 格式,按 git 提交记录维护)
|
├── CHANGELOG.md # 变更日志(Keep a Changelog 格式,按 git 提交记录维护)
|
||||||
├── requirements.md # TAS 波束控制逻辑修改说明(固定数据率调度设计)
|
├── requirements.md # 需求说明:日志文件输出功能修改要求(含 rdbuf() 重定向参考示例)
|
||||||
├── .vscode/ # VS Code 工程配置
|
├── .vscode/ # VS Code 工程配置
|
||||||
│ ├── settings.json # cmake.generator=NMake、MSVC2013 x86 环境变量、compile_commands
|
│ ├── settings.json # cmake.generator=NMake、MSVC2013 x86 环境变量、compile_commands
|
||||||
│ ├── cmake-variants.yaml # X256_PS / X256_MS × Release / Debug 变体
|
│ ├── cmake-variants.yaml # X256_PS / X256_MS × Release / Debug 变体
|
||||||
@@ -85,6 +86,7 @@
|
|||||||
│ ├── data_process_class_dll.h # 对外接口:DataRev/Track/TrackingBeam/RadarPara 结构体、抽象基类、工厂类
|
│ ├── data_process_class_dll.h # 对外接口:DataRev/Track/TrackingBeam/RadarPara 结构体、抽象基类、工厂类
|
||||||
│ ├── data_process_class_dll_global.h # DLL 导入导出宏
|
│ ├── data_process_class_dll_global.h # DLL 导入导出宏
|
||||||
│ ├── data_process_class_dll.cpp # 工厂实现(GetB/Destroy 单例)
|
│ ├── data_process_class_dll.cpp # 工厂实现(GetB/Destroy 单例)
|
||||||
|
│ ├── rdp_log.h / .cpp # 日志输出模块:rdbuf() 重定向 std::cout、RDP_LOG 宏(开关宏在 parameters.h)
|
||||||
│ ├── data_process.h / .cpp # Data_Process 实现:接口分发、TWS/TAS 主流程、参数管理、清空/删除/转跟踪
|
│ ├── data_process.h / .cpp # Data_Process 实现:接口分发、TWS/TAS 主流程、参数管理、清空/删除/转跟踪
|
||||||
│ ├── struct.h # 内部结构体:PointRecv / Trust_Track / Temp_track / Tracking_Target
|
│ ├── struct.h # 内部结构体:PointRecv / Trust_Track / Temp_track / Tracking_Target
|
||||||
│ ├── parameters.h # 编译期宏参数(按 MECHANICAL_SCANNING / PHASE_SCANNING 分两组)
|
│ ├── parameters.h # 编译期宏参数(按 MECHANICAL_SCANNING / PHASE_SCANNING 分两组)
|
||||||
@@ -106,6 +108,7 @@
|
|||||||
│ ├── X256_PS/ # 相扫构建目录(含 bin/data_process_class_dll.dll、rdp_playback.exe 等)
|
│ ├── X256_PS/ # 相扫构建目录(含 bin/data_process_class_dll.dll、rdp_playback.exe 等)
|
||||||
│ ├── X256_MS/ # 机扫构建目录
|
│ ├── X256_MS/ # 机扫构建目录
|
||||||
│ └── output/ # 早期打包导出(其中 data_process_class_dll.h 为旧版 32 位时间戳接口,勿作为当前 API 依据)
|
│ └── output/ # 早期打包导出(其中 data_process_class_dll.h 为旧版 32 位时间戳接口,勿作为当前 API 依据)
|
||||||
|
├── rdp_logs/ # 日志输出目录(运行时自动创建于宿主进程当前工作目录下,被 .gitignore 忽略)
|
||||||
└── .gitignore
|
└── .gitignore
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -250,6 +253,7 @@ classDiagram
|
|||||||
| Track_Ind_Mangement | 航迹号 1~500 的顺序分配与回绕复用 |
|
| Track_Ind_Mangement | 航迹号 1~500 的顺序分配与回绕复用 |
|
||||||
| kalman | 两点/三点滤波初始化、线性卡尔曼预测/滤波、EKF(3 维量测含多普勒)、马氏统计距离 d、盲速 Bind_speed |
|
| kalman | 两点/三点滤波初始化、线性卡尔曼预测/滤波、EKF(3 维量测含多普勒)、马氏统计距离 d、盲速 Bind_speed |
|
||||||
| coor_trans | 极坐标 ↔ 直角坐标转换 |
|
| coor_trans | 极坐标 ↔ 直角坐标转换 |
|
||||||
|
| rdp_log(rdp_log.h/.cpp) | 日志输出:按 parameters.h 的 `RDP_LOG_ENABLE` 开关,在 `Init()` 中用 `rdbuf()` 将 `std::cout` 重定向到日期+时间命名的日志文件、`Shutdown()` 恢复控制台并关闭;提供 `RDP_LOG` 宏自动附加 `[时间戳][文件:行号]` 前缀 |
|
||||||
| Track_Init_Direct_Tracking / Track_Asso_Direct_Tracking | 引导跟踪(direct tracking)专用起批/关联。**当前入口为空实现、未启用**;track_asso_direct_tracking.cpp 未加入 CMake 源列表 |
|
| Track_Init_Direct_Tracking / Track_Asso_Direct_Tracking | 引导跟踪(direct tracking)专用起批/关联。**当前入口为空实现、未启用**;track_asso_direct_tracking.cpp 未加入 CMake 源列表 |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -300,6 +304,8 @@ classDiagram
|
|||||||
| tracking_point(azimuth) | 0 | 手动打跟踪波束——**未实现(保留空实现)** |
|
| tracking_point(azimuth) | 0 | 手动打跟踪波束——**未实现(保留空实现)** |
|
||||||
| direct_tracking_process(...) | 0 | 引导跟踪——**未实现(保留空实现)** |
|
| direct_tracking_process(...) | 0 | 引导跟踪——**未实现(保留空实现)** |
|
||||||
|
|
||||||
|
> 日志输出为 DLL 内部功能(不对外导出,接口见 10.1 的宏开关):首次 `GetB()` 创建实例时自动初始化(`RDP_LOG_ENABLE` 开启则将 `std::cout` 重定向到 `.\rdp_logs\` 下按日期+时间命名的日志文件),`Destroy()` 销毁实例时恢复 `std::cout` 并关闭日志文件。
|
||||||
|
|
||||||
### 7.2 data_preprocess 返回值的含义
|
### 7.2 data_preprocess 返回值的含义
|
||||||
|
|
||||||
| 返回值 | 含义 | 触发条件 |
|
| 返回值 | 含义 | 触发条件 |
|
||||||
@@ -731,7 +737,7 @@ $$
|
|||||||
|
|
||||||
- **入队条件**(仅手动):manual_tracking_flag==1 且 Track_Mode==0 且队列未满(MAX_TAS_NUM,相扫 4 / 机扫 1)且不在 TAS 禁止区内。入队即置 Track_Mode=1、以航迹时间初始化 last_track_time,并输出一次航迹更新。
|
- **入队条件**(仅手动):manual_tracking_flag==1 且 Track_Mode==0 且队列未满(MAX_TAS_NUM,相扫 4 / 机扫 1)且不在 TAS 禁止区内。入队即置 Track_Mode=1、以航迹时间初始化 last_track_time,并输出一次航迹更新。
|
||||||
- **出队**:队列中目标在航迹表中不存在、或不再处于手动 TAS 状态时清除。(自动转 TAS / 自动退出的 tas_auto_start/tas_auto_end 逻辑全部注释停用——只支持手动。)
|
- **出队**:队列中目标在航迹表中不存在、或不再处于手动 TAS 状态时清除。(自动转 TAS / 自动退出的 tas_auto_start/tas_auto_end 逻辑全部注释停用——只支持手动。)
|
||||||
- **波束输出**:在 TAS 队列内遍历,选择满足**数据率门控**的目标——目标距上次波束输出(`last_track_time`)的时间、以及航迹时间 T_track 与最新时间戳 latest_timestamp 的差值,均须大于 `1 / DATA_RATE_TAS` 秒(使用运行时参数 Work_Parameter.DATA_RATE_TAS,需为 >0 的有效值),保证 TAS 目标数据率不随波束时间(Beam_Ctrl 调用频率)变化;多个候选中取 CPI 时间最早者,用其状态外推到 latest_timestamp:
|
- **波束输出**:在 TAS 队列内遍历,选择满足**数据率门控**的目标——目标距上次波束输出(`last_track_time`)的时间、以及航迹时间 T_track 与最新时间戳 latest_timestamp 的差值,均须大于运行时参数 `Work_Parameter.DATA_RATE_TAS` 秒(单位 s,1521592 起由 Hz 改为 s,需为 >0 的有效值),保证 TAS 目标输出间隔不随波束时间(Beam_Ctrl 调用频率)变化;多个候选中取 CPI 时间最早者,用其状态外推到 latest_timestamp:
|
||||||
|
|
||||||
$$
|
$$
|
||||||
x_p=x+v_x\Delta T,\quad y_p=y+v_y\Delta T,\quad
|
x_p=x+v_x\Delta T,\quad y_p=y+v_y\Delta T,\quad
|
||||||
@@ -749,6 +755,8 @@ $$
|
|||||||
|
|
||||||
| 宏 | 相扫 PHASE_SCANNING | 机扫 MECHANICAL_SCANNING | 含义 |
|
| 宏 | 相扫 PHASE_SCANNING | 机扫 MECHANICAL_SCANNING | 含义 |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
|
| RDP_LOG_ENABLE | 定义(默认开启) | 同左 | 日志文件输出开关:定义时将 `std::cout` 重定向到日志文件;注释掉则不重定向(日志仍输出到标准输出/控制台) |
|
||||||
|
| RDP_LOG_DIR | `.\rdp_logs\` | 同左 | 日志文件输出目录(相对宿主进程当前工作目录,目录不存在时自动创建) |
|
||||||
| DATA_RATE_TAS | 已停用(原 0.3) | 已停用(原 0.0625) | 编译期宏已注释停用;TAS 数据率统一由运行时参数 RadarPara.DATA_RATE_TAS 提供(见 10.2) |
|
| DATA_RATE_TAS | 已停用(原 0.3) | 已停用(原 0.0625) | 编译期宏已注释停用;TAS 数据率统一由运行时参数 RadarPara.DATA_RATE_TAS 提供(见 10.2) |
|
||||||
| SIGMA_R / SIGMA_A / SIGMA_E / SIGMA_V | 10.0 / 0.02 / 0.2 / 2.0(两体制相同) | 同左 | 量测误差:距离 m / 方位 rad / 俯仰 rad / 速度 m/s |
|
| SIGMA_R / SIGMA_A / SIGMA_E / SIGMA_V | 10.0 / 0.02 / 0.2 / 2.0(两体制相同) | 同左 | 量测误差:距离 m / 方位 rad / 俯仰 rad / 速度 m/s |
|
||||||
| DOT_COH_RANGE / DOT_COH_V / DOT_COH_AZI | 80 / 2 / 6 | 同左 | 凝聚门限:距离 m / 速度 m/s / 方位 ° |
|
| DOT_COH_RANGE / DOT_COH_V / DOT_COH_AZI | 80 / 2 / 6 | 同左 | 凝聚门限:距离 m / 速度 m/s / 方位 ° |
|
||||||
@@ -779,7 +787,7 @@ $$
|
|||||||
| north_angle | 北偏角 | 保留 |
|
| north_angle | 北偏角 | 保留 |
|
||||||
| V_MAX / V_MIN | 目标速度上下限(m/s) | 航迹头关联速度区间门限 |
|
| V_MAX / V_MIN | 目标速度上下限(m/s) | 航迹头关联速度区间门限 |
|
||||||
| DATA_RATE_SHORT / MIDDLE / FAR | 三模式数据率(s) | TWS 外推步长 |
|
| DATA_RATE_SHORT / MIDDLE / FAR | 三模式数据率(s) | TWS 外推步长 |
|
||||||
| DATA_RATE_TAS | TAS 模式数据率(1/s) | 由调用者经 track_process_parameters_initial 输入(须为 >0 的有效值);TAS 波束输出门控阈值 1/DATA_RATE_TAS 秒,引导跟踪外推同样使用该运行时参数 |
|
| DATA_RATE_TAS | TAS 波束输出间隔(s) | 由调用者经 track_process_parameters_initial 输入(须为 >0 的有效值);`tas_beam_output()` 门控阈值为 DATA_RATE_TAS 秒(1521592 起单位由 Hz 改为 s),引导跟踪外推同样使用该运行时参数 |
|
||||||
| track_start_point_num | 起批点数 | 校验范围 3~9 |
|
| track_start_point_num | 起批点数 | 校验范围 3~9 |
|
||||||
| track_start_threshold / track_asso_threshold / track_asso_threshold_tas | 起批/关联波门 | **⚠ 声明但当前实现未使用**,实际门限为宏 TRACK_START_THRESHOLD / ASSO_THORD |
|
| track_start_threshold / track_asso_threshold / track_asso_threshold_tas | 起批/关联波门 | **⚠ 声明但当前实现未使用**,实际门限为宏 TRACK_START_THRESHOLD / ASSO_THORD |
|
||||||
| Model1/2/3_Q_fast/slow | 三个 Singer 模型过程噪声强度 | Model1_Q_fast 未使用;分档规则见 9.5.1 |
|
| Model1/2/3_Q_fast/slow | 三个 Singer 模型过程噪声强度 | Model1_Q_fast 未使用;分档规则见 9.5.1 |
|
||||||
@@ -827,6 +835,8 @@ $$
|
|||||||
|
|
||||||
| 提交 | 内容 |
|
| 提交 | 内容 |
|
||||||
|---|---|
|
|---|---|
|
||||||
|
| 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` 的问题;更新 README/CHANGELOG |
|
||||||
|
| 5f82098 | 修复 MSVC `/W3` 下全部 C4819 / C4018 / C4244 警告(UTF-8 with BOM、size_t / static_cast 等);更新项目文档 |
|
||||||
| f438ac5 | 优化 TAS 调度:波束输出改为在队列内选择满足数据率门控且 CPI 时间最早的目标,停用整队循环移位;DATA_RATE_TAS 编译期宏停用、统一使用运行时参数;#pragma message 提示扫描体制 |
|
| f438ac5 | 优化 TAS 调度:波束输出改为在队列内选择满足数据率门控且 CPI 时间最早的目标,停用整队循环移位;DATA_RATE_TAS 编译期宏停用、统一使用运行时参数;#pragma message 提示扫描体制 |
|
||||||
| e729c5b | 频点宏精简为 FREQ0 = 9.2 GHz(原 FREQ0~FREQ20 均为 16.8 GHz) |
|
| e729c5b | 频点宏精简为 FREQ0 = 9.2 GHz(原 FREQ0~FREQ20 均为 16.8 GHz) |
|
||||||
| b3e2f52 | TAS 波束控制改为按固定数据率调度,RadarPara 新增 DATA_RATE_TAS 运行时参数;新增 CHANGELOG.md、requirements.md,README 补充相应说明 |
|
| b3e2f52 | TAS 波束控制改为按固定数据率调度,RadarPara 新增 DATA_RATE_TAS 运行时参数;新增 CHANGELOG.md、requirements.md,README 补充相应说明 |
|
||||||
@@ -856,7 +866,7 @@ $$
|
|||||||
| CHANGELOG.md | 变更日志(Keep a Changelog 格式,按 git 提交记录维护) |
|
| CHANGELOG.md | 变更日志(Keep a Changelog 格式,按 git 提交记录维护) |
|
||||||
| BUG_REPORT.md | 全量逻辑 BUG 分析(P0~P3 共 37 项,含位置、说明、建议、处置结论) |
|
| BUG_REPORT.md | 全量逻辑 BUG 分析(P0~P3 共 37 项,含位置、说明、建议、处置结论) |
|
||||||
| BUG_FIX_REPORT.md | 本次修复明细、修复状态汇总表与 MSVC 2013 x86 编译验证记录 |
|
| BUG_FIX_REPORT.md | 本次修复明细、修复状态汇总表与 MSVC 2013 x86 编译验证记录 |
|
||||||
| requirements.md | TAS 波束控制逻辑修改说明(固定数据率调度与运行时参数 DATA_RATE_TAS) |
|
| requirements.md | 修改需求说明:日志文件输出功能(rdbuf() 重定向、parameters.h 日志开关宏、日期+时间命名日志、前缀日志宏,附参考示例) |
|
||||||
| 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 | VS Code 构建任务与变体定义 |
|
| .vscode/tasks.json、.vscode/cmake-variants.yaml | VS Code 构建任务与变体定义 |
|
||||||
| build/X256_PS/bin/RadarConfigParam.ini | 回放测试工具(rdp_playback.exe)配置样例 |
|
| build/X256_PS/bin/RadarConfigParam.ini | 回放测试工具(rdp_playback.exe)配置样例 |
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "data_process.h"
|
#include "data_process.h"
|
||||||
|
#include "rdp_log.h"
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
@@ -143,11 +144,6 @@ int model)
|
|||||||
Trust_Track_Output,
|
Trust_Track_Output,
|
||||||
Trust_track_num_Output,
|
Trust_track_num_Output,
|
||||||
Work_Parameter);
|
Work_Parameter);
|
||||||
// std::cout << "point_recv: " <<point_recv.size();
|
|
||||||
// std::cout << "trust_track: " <<trust_track.size();
|
|
||||||
// std::cout << "temp_track: " <<temp_track.size();
|
|
||||||
// std::cout << "Trust_track_num_Output: " <<*Trust_track_num_Output;
|
|
||||||
// std::cout << "Track_die_num_Output: " <<*Track_die_num_Output;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,12 +155,6 @@ int model)
|
|||||||
|
|
||||||
dot_coh_tas.dot_coh_tas_process(&Data_buffer_tas,&point_recv_tas); //点迹凝聚
|
dot_coh_tas.dot_coh_tas_process(&Data_buffer_tas,&point_recv_tas); //点迹凝聚
|
||||||
|
|
||||||
// if(point_recv_tas.size()>0)
|
|
||||||
// {
|
|
||||||
// std::cout << "point_recv_tas :" <<point_recv_tas[0].Azimuth/PI*180<<" "<<point_recv_tas[0].Range;
|
|
||||||
// }
|
|
||||||
//std::cout << "TAS process :" << TAS_track_idx << "p a r:"<<point_recv_tas[0].Point_Sum<<" " <<point_recv_tas[0].Azimuth/PI*180<<" "<<point_recv_tas[0].Range;
|
|
||||||
|
|
||||||
std::vector<PointRecv>().swap(Data_buffer_tas);//凝聚完毕 清除Data_buffer
|
std::vector<PointRecv>().swap(Data_buffer_tas);//凝聚完毕 清除Data_buffer
|
||||||
|
|
||||||
track_asso_tas.track_asso_process_tas(&point_recv_tas, //点迹文件
|
track_asso_tas.track_asso_process_tas(&point_recv_tas, //点迹文件
|
||||||
@@ -252,7 +242,7 @@ int Data_Process:: track_delete(int delete_track_num, //手动
|
|||||||
{
|
{
|
||||||
|
|
||||||
trust_track[j].manual_delete_flag=1;
|
trust_track[j].manual_delete_flag=1;
|
||||||
std::cout << "Delete :" << trust_track[j].Track_Index << std::endl;
|
// RDP_LOG << "Delete :" << trust_track[j].Track_Index << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "data_process_class_dll.h"
|
#include "data_process_class_dll.h"
|
||||||
#include "data_process.h"
|
#include "data_process.h"
|
||||||
|
#include "rdp_log.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Data_process_class_dll::Data_process_class_dll()
|
Data_process_class_dll::Data_process_class_dll()
|
||||||
@@ -16,7 +17,9 @@ Data_process_class_dll *Data_Process_Factory::GetB()
|
|||||||
{
|
{
|
||||||
if(!p)
|
if(!p)
|
||||||
{
|
{
|
||||||
p=new Data_Process();
|
//初始化日志输出:RDP_LOG_ENABLE 开启时重定向 std::cout 到日志文件
|
||||||
|
//rdp_log::Init();
|
||||||
|
p=new Data_Process();
|
||||||
}
|
}
|
||||||
|
|
||||||
return p;
|
return p;
|
||||||
@@ -30,5 +33,8 @@ void Data_Process_Factory::Destroy()
|
|||||||
if (p) {
|
if (p) {
|
||||||
delete p;
|
delete p;
|
||||||
p = nullptr;
|
p = nullptr;
|
||||||
|
|
||||||
|
//恢复 std::cout 到控制台并关闭日志文件
|
||||||
|
//rdp_log::Shutdown();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ struct DATA_PROCESS_CLASS_DLLSHARED_EXPORT RadarPara
|
|||||||
float DATA_RATE_MIDDLE;
|
float DATA_RATE_MIDDLE;
|
||||||
float DATA_RATE_FAR;
|
float DATA_RATE_FAR;
|
||||||
|
|
||||||
float DATA_RATE_TAS; //TAS模式数据率,由dll调用者输入;TAS波束输出间隔阈值为 1/DATA_RATE_TAS 秒
|
float DATA_RATE_TAS; //TAS模式数据率,由dll调用者输入;TAS波束输出间隔阈值为 DATA_RATE_TAS 秒
|
||||||
|
|
||||||
//数据关联参数
|
//数据关联参数
|
||||||
int track_start_point_num; //起批点数(典型值 3或4)
|
int track_start_point_num; //起批点数(典型值 3或4)
|
||||||
|
|||||||
@@ -118,14 +118,6 @@ int Dot_Coh::dot_coh_process_buff( std::vector <PointRecv> *data_input,
|
|||||||
data_tmp.push_back((*data_input)[i]);
|
data_tmp.push_back((*data_input)[i]);
|
||||||
data_tmp[data_tmp.size()-1].point_section_asso = 2;
|
data_tmp[data_tmp.size()-1].point_section_asso = 2;
|
||||||
}
|
}
|
||||||
// //去除点迹中,1km以内,SNR小于20dB的点
|
|
||||||
// for (size_t i=0;i<data_input->size();i++)
|
|
||||||
// {
|
|
||||||
// if((*data_input)[i].Range > 1000 || (*data_input)[i].snr >= 20){
|
|
||||||
// data_tmp.push_back((*data_input)[i]);
|
|
||||||
// data_tmp[data_tmp.size()-1].point_section_asso = 2;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
//1.2 把data_input、data_input_buff清空
|
//1.2 把data_input、data_input_buff清空
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,17 @@
|
|||||||
//频点(GHz)
|
//频点(GHz)
|
||||||
#define FREQ0 9.2
|
#define FREQ0 9.2
|
||||||
|
|
||||||
|
/**********************************日志输出开关**********************************************/
|
||||||
|
// 日志文件输出功能开关:
|
||||||
|
// 1) 定义(默认)RDP_LOG_ENABLE:启用日志文件输出 —— 调用 Data_Process_Factory::GetB()
|
||||||
|
// 时自动将 std::cout 重定向到日志文件,日志文件存放于 RDP_LOG_DIR 目录,
|
||||||
|
// 文件名按当前日期+时间自动命名(如 rdp_20240826_153000.log);
|
||||||
|
// 2) 注释掉 RDP_LOG_ENABLE:关闭 —— 不做重定向,日志仍输出到标准输出(控制台)。
|
||||||
|
//#define RDP_LOG_ENABLE
|
||||||
|
|
||||||
|
//日志文件输出目录(相对当前工作目录的路径,目录不存在时自动创建)
|
||||||
|
#define RDP_LOG_DIR ".\\rdp_logs\\"
|
||||||
|
|
||||||
//#define MECHANICAL_SCANNING
|
//#define MECHANICAL_SCANNING
|
||||||
//#define PHASE_SCANNING
|
//#define PHASE_SCANNING
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,154 @@
|
|||||||
|
#include "rdp_log.h"
|
||||||
|
#include "parameters.h"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <time.h>
|
||||||
|
#include <direct.h>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
//日志模块内部状态:日志文件流 + 重定向前 std::cout 的原始缓冲区
|
||||||
|
struct RdpLogState
|
||||||
|
{
|
||||||
|
std::ofstream file; //日志文件输出流
|
||||||
|
std::streambuf *original_buf; //重定向前 std::cout 的原始缓冲区
|
||||||
|
bool enabled; //是否已成功重定向到日志文件
|
||||||
|
|
||||||
|
RdpLogState() : original_buf(0), enabled(false) {}
|
||||||
|
|
||||||
|
~RdpLogState()
|
||||||
|
{
|
||||||
|
//进程退出兜底:若宿主进程未调用 Data_Process_Factory::Destroy(),
|
||||||
|
//此处恢复 std::cout,避免其仍指向即将析构的日志文件流缓冲区。
|
||||||
|
if (enabled && original_buf)
|
||||||
|
{
|
||||||
|
std::cout.rdbuf(original_buf);
|
||||||
|
enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
RdpLogState &State()
|
||||||
|
{
|
||||||
|
static RdpLogState s;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
//当前本地时间字符串,格式 "YYYY-MM-DD HH:MM:SS"
|
||||||
|
std::string CurrentTime()
|
||||||
|
{
|
||||||
|
char buf[32] = {0};
|
||||||
|
time_t now = time(NULL);
|
||||||
|
struct tm local;
|
||||||
|
if (localtime_s(&local, &now) != 0)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &local);
|
||||||
|
return std::string(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
//提取纯文件名(去掉路径前缀),日志前缀中只显示 文件名:行号
|
||||||
|
const char *FileName(const char *path)
|
||||||
|
{
|
||||||
|
if (path == 0)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
const char *base = path;
|
||||||
|
for (const char *p = path; *p != '\0'; ++p)
|
||||||
|
{
|
||||||
|
if (*p == '\\' || *p == '/')
|
||||||
|
{
|
||||||
|
base = p + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return base;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace rdp_log
|
||||||
|
{
|
||||||
|
bool Init()
|
||||||
|
{
|
||||||
|
RdpLogState &st = State();
|
||||||
|
if (st.enabled)
|
||||||
|
{
|
||||||
|
return true; //已经重定向,避免重复初始化
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef RDP_LOG_ENABLE
|
||||||
|
//创建日志目录(目录已存在时 _mkdir 返回 EEXIST,忽略)
|
||||||
|
std::string log_dir = RDP_LOG_DIR;
|
||||||
|
while (log_dir.size() > 0 &&
|
||||||
|
(log_dir[log_dir.size() - 1] == '\\' || log_dir[log_dir.size() - 1] == '/'))
|
||||||
|
{
|
||||||
|
log_dir.erase(log_dir.size() - 1);
|
||||||
|
}
|
||||||
|
if (log_dir.size() > 0)
|
||||||
|
{
|
||||||
|
_mkdir(log_dir.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
//按当前日期+时间生成日志文件名:rdp_YYYYMMDD_HHMMSS.log
|
||||||
|
char time_buf[32] = {0};
|
||||||
|
time_t now = time(NULL);
|
||||||
|
struct tm local;
|
||||||
|
if (localtime_s(&local, &now) != 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
strftime(time_buf, sizeof(time_buf), "%Y%m%d_%H%M%S", &local);
|
||||||
|
|
||||||
|
std::string log_path = RDP_LOG_DIR;
|
||||||
|
log_path += "rdp_";
|
||||||
|
log_path += time_buf;
|
||||||
|
log_path += ".log";
|
||||||
|
|
||||||
|
st.file.open(log_path.c_str(), std::ios::out | std::ios::trunc);
|
||||||
|
if (!st.file.is_open())
|
||||||
|
{
|
||||||
|
//日志文件打开失败(目录不可写等):保持控制台输出,不做重定向
|
||||||
|
std::cout << "[rdp_log] cannot open log file: " << log_path << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//用 rdbuf() 将 std::cout 的流缓冲区替换为日志文件输出流
|
||||||
|
st.original_buf = std::cout.rdbuf();
|
||||||
|
std::cout.rdbuf(st.file.rdbuf());
|
||||||
|
st.enabled = true;
|
||||||
|
|
||||||
|
//重定向成功后写入起始标记(该行已写入日志文件)
|
||||||
|
std::cout << prefix(__FILE__, __LINE__)
|
||||||
|
<< "rdp_log enabled, log file: " << log_path << std::endl;
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
//日志开关关闭:不重定向,日志仍输出到标准输出
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Shutdown()
|
||||||
|
{
|
||||||
|
RdpLogState &st = State();
|
||||||
|
if (!st.enabled)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//写入结束标记后刷新、恢复 std::cout 并关闭日志文件
|
||||||
|
std::cout << prefix(__FILE__, __LINE__) << "rdp_log shutdown" << std::endl;
|
||||||
|
st.file.flush();
|
||||||
|
std::cout.rdbuf(st.original_buf);
|
||||||
|
st.enabled = false;
|
||||||
|
st.file.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string prefix(const char *file, int line)
|
||||||
|
{
|
||||||
|
std::ostringstream oss;
|
||||||
|
oss << "[" << CurrentTime() << "][" << FileName(file) << ":" << line << "] ";
|
||||||
|
return oss.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef RDP_LOG_H
|
||||||
|
#define RDP_LOG_H
|
||||||
|
#pragma once
|
||||||
|
/*************************************日志输出模块*******************************************/
|
||||||
|
// 功能:
|
||||||
|
// 1) rdp_log::Init():按 parameters.h 中 RDP_LOG_ENABLE 宏开关决定是否将 std::cout
|
||||||
|
// 重定向到日志文件(RDP_LOG_DIR 目录,文件名按当前日期+时间自动生成)。
|
||||||
|
// 开关关闭(注释掉 RDP_LOG_ENABLE)时不做重定向,日志仍输出到标准输出。
|
||||||
|
// 2) rdp_log::Shutdown():恢复 std::cout 原始缓冲区(回到控制台)并关闭日志文件。
|
||||||
|
// 3) RDP_LOG 宏:日志输出宏,在每条日志前自动附加 [时间戳][代码文件:行号] 信息,
|
||||||
|
// 随后输出到 std::cout(若开关开启则随 cout 一并写入日志文件)。
|
||||||
|
// 用法示例:
|
||||||
|
// RDP_LOG << "目标批号:" << track_index << std::endl;
|
||||||
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace rdp_log
|
||||||
|
{
|
||||||
|
bool Init(); //初始化日志输出(由 Data_Process_Factory::GetB() 调用)
|
||||||
|
void Shutdown(); //恢复 std::cout 并关闭日志文件(由 Data_Process_Factory::Destroy() 调用)
|
||||||
|
std::string prefix(const char *file, int line); //生成 "[时间戳][文件名:行号] " 前缀字符串
|
||||||
|
}
|
||||||
|
|
||||||
|
//日志输出宏:自动附加 时间戳、代码文件、代码行号 后输出到标准输出(std::cout)
|
||||||
|
#define RDP_LOG std::cout << rdp_log::prefix(__FILE__, __LINE__)
|
||||||
|
|
||||||
|
#endif // RDP_LOG_H
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
#include "tas_ctrl.h"
|
#include "tas_ctrl.h"
|
||||||
#include "coor_trans.h"
|
#include "coor_trans.h"
|
||||||
|
#include "rdp_log.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@@ -280,8 +283,8 @@ void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *trust_track
|
|||||||
CPI_time = (*trust_track)[track_idx].T_track;
|
CPI_time = (*trust_track)[track_idx].T_track;
|
||||||
delta_T = (latest_timestamp - CPI_time) / 1000.0f;
|
delta_T = (latest_timestamp - CPI_time) / 1000.0f;
|
||||||
|
|
||||||
//查找最早的CPI时间, 航迹时间与当前最新时间戳的差值大于 1/DATA_RATE_TAS 时才输出TAS跟踪波束
|
//查找最早的CPI时间, 航迹时间与当前最新时间戳的差值大于 DATA_RATE_TAS 时才输出TAS跟踪波束
|
||||||
if(CPI_time < earliest_CPI_time && (latest_timestamp - tas_target_queue[tas_idx].last_track_time) / 1000.0f > 1.0f / Work_Parameter.DATA_RATE_TAS && delta_T > 1.0f / Work_Parameter.DATA_RATE_TAS)
|
if(CPI_time < earliest_CPI_time && (latest_timestamp - tas_target_queue[tas_idx].last_track_time) / 1000.0f > Work_Parameter.DATA_RATE_TAS && delta_T > Work_Parameter.DATA_RATE_TAS)
|
||||||
{
|
{
|
||||||
earliest_CPI_time = CPI_time;
|
earliest_CPI_time = CPI_time;
|
||||||
H_track = (*trust_track)[track_idx].Height;
|
H_track = (*trust_track)[track_idx].Height;
|
||||||
@@ -293,8 +296,6 @@ void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *trust_track
|
|||||||
X_now[ii]=(*trust_track)[track_idx].X[ii];
|
X_now[ii]=(*trust_track)[track_idx].X[ii];
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("TAS: earliest_track_idx: %d, CPI_time: %lld, delta_T: %.3f\n", earliest_track_idx, CPI_time, delta_T);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@@ -340,10 +341,10 @@ void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *trust_track
|
|||||||
Tracking_beam->type=1;
|
Tracking_beam->type=1;
|
||||||
|
|
||||||
//跟踪目标批号
|
//跟踪目标批号
|
||||||
Tracking_beam->TAS_track_index = earliest_track_idx;
|
Tracking_beam->TAS_track_index = (*trust_track)[earliest_track_idx].Track_Index;
|
||||||
|
|
||||||
//跟踪波束开关开启
|
//跟踪波束开关开启
|
||||||
Tracking_beam->open_flag=1;
|
Tracking_beam->open_flag=1;
|
||||||
|
|
||||||
//std::cout << "TAS: range: " <<Tracking_beam->Range << "azi: " <<Tracking_beam->Azi <<"pit: " <<Tracking_beam->Elev;
|
//RDP_LOG << "TAS <" << (*trust_track)[earliest_track_idx].Track_Index << "> output: range: " <<Tracking_beam->Range << "azi: " <<Tracking_beam->Azi <<"pit: " <<Tracking_beam->Elev << std::endl;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "track_asso.h"
|
#include "track_asso.h"
|
||||||
#include "kalman.h"
|
#include "kalman.h"
|
||||||
#include "coor_trans.h"
|
#include "coor_trans.h"
|
||||||
|
#include "rdp_log.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -611,6 +612,8 @@ void Track_Asso:: model_filter(std::vector <Trust_Track> *trust_track,struct Ra
|
|||||||
|
|
||||||
if (delta_T <= 0)
|
if (delta_T <= 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
RDP_LOG<<"delta_T <= 0, track_index: "<<track_index<<", point_index: "<<point_index<<", delta_T: "<<delta_T<<std::endl;
|
||||||
// 乱序/重复时间戳:不作为有效关联,不标记点迹已使用、不刷新航迹新鲜度
|
// 乱序/重复时间戳:不作为有效关联,不标记点迹已使用、不刷新航迹新鲜度
|
||||||
for (int ii=0;ii<associated_num;)
|
for (int ii=0;ii<associated_num;)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "track_asso_tas.h"
|
#include "track_asso_tas.h"
|
||||||
#include "kalman.h"
|
#include "kalman.h"
|
||||||
#include "coor_trans.h"
|
#include "coor_trans.h"
|
||||||
|
#include "rdp_log.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -244,11 +245,6 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
|
|||||||
{
|
{
|
||||||
found_tas_track = true;
|
found_tas_track = true;
|
||||||
|
|
||||||
// if(point_process.size()>0)
|
|
||||||
// {
|
|
||||||
// std::cout << "model_filter point_process :" <<point_process[0].Azimuth/PI*180<<" "<<point_process[0].Range;
|
|
||||||
// }
|
|
||||||
|
|
||||||
(*trust_track)[loop_of_track].point_flag = 0; //航迹的point_flag置为0 关联上点后再置为1
|
(*trust_track)[loop_of_track].point_flag = 0; //航迹的point_flag置为0 关联上点后再置为1
|
||||||
memcpy(X1,(*trust_track)[loop_of_track].X1,6*sizeof(double));
|
memcpy(X1,(*trust_track)[loop_of_track].X1,6*sizeof(double));
|
||||||
memcpy(X2,(*trust_track)[loop_of_track].X2,6*sizeof(double));
|
memcpy(X2,(*trust_track)[loop_of_track].X2,6*sizeof(double));
|
||||||
@@ -281,8 +277,11 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
|
|||||||
double prt = point_process[loop_of_point].PRF_index;
|
double prt = point_process[loop_of_point].PRF_index;
|
||||||
double freq_ind = point_process[loop_of_point].Freq_index;
|
double freq_ind = point_process[loop_of_point].Freq_index;
|
||||||
double delta_T = (point_process[loop_of_point].CPI_Time - T_track)/1000.0;
|
double delta_T = (point_process[loop_of_point].CPI_Time - T_track)/1000.0;
|
||||||
if (delta_T <= 0)
|
if (delta_T <= 0){
|
||||||
|
RDP_LOG << "Warning: delta_T <= 0, skipping point association for point index " << point_process[loop_of_point].CPI_Time << " " << T_track << std::endl;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
double h_point = point_process[loop_of_point].Height;
|
double h_point = point_process[loop_of_point].Height;
|
||||||
|
|
||||||
//计算统计距离d
|
//计算统计距离d
|
||||||
@@ -370,7 +369,7 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
|
|||||||
//有关联 滤波
|
//有关联 滤波
|
||||||
if (associated_info.size()>0)
|
if (associated_info.size()>0)
|
||||||
{
|
{
|
||||||
|
//RDP_LOG << "associated point for track index " << tas_track_idx << std::endl;
|
||||||
// std::cout << "TAS asoooooo222" ;
|
// std::cout << "TAS asoooooo222" ;
|
||||||
|
|
||||||
//找最近点
|
//找最近点
|
||||||
@@ -495,7 +494,7 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
|
|||||||
//未关联上,航迹外推
|
//未关联上,航迹外推
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//RDP_LOG << "unassociated point for track index " << tas_track_idx << std::endl;
|
||||||
for(size_t i=0;i<trust_track->size();i++)
|
for(size_t i=0;i<trust_track->size();i++)
|
||||||
if((*trust_track)[i].Track_Index == tas_track_idx)
|
if((*trust_track)[i].Track_Index == tas_track_idx)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "track_die_tas.h"
|
#include "track_die_tas.h"
|
||||||
#include "kalman.h"
|
#include "kalman.h"
|
||||||
#include "coor_trans.h"
|
#include "coor_trans.h"
|
||||||
|
#include "rdp_log.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
@@ -20,7 +21,7 @@ void Track_Die_Tas::track_die_process_tas( std::vector <Trust_Track> *trust_trac
|
|||||||
||(*Iter).manual_delete_flag == 1)
|
||(*Iter).manual_delete_flag == 1)
|
||||||
|
|
||||||
{
|
{
|
||||||
std::cout << "remove tas target :" << (*Iter).Track_Index << std::endl;
|
// RDP_LOG << "remove tas target :" << (*Iter).Track_Index << std::endl;
|
||||||
//输出消亡信息
|
//输出消亡信息
|
||||||
*Track_die_num_Output=*Track_die_num_Output+1;
|
*Track_die_num_Output=*Track_die_num_Output+1;
|
||||||
Track_die_Index_Output[*Track_die_num_Output-1]=(*Iter).Track_Index;
|
Track_die_Index_Output[*Track_die_num_Output-1]=(*Iter).Track_Index;
|
||||||
|
|||||||
+35
-13
@@ -2,19 +2,41 @@
|
|||||||
|
|
||||||
## 概述
|
## 概述
|
||||||
|
|
||||||
<!-- 过时信息
|
增加日志文件输出功能,具体需求如下:
|
||||||
本次主要修改TAS波束控制逻辑,
|
- 将标准输出std::cout重定向到日志文件,考虑使用 rdbuf() 方法,见[参考1](#参考1)
|
||||||
原有逻辑为:
|
- 在parameters.h中添加一个日志输出开关的宏定义,开关关闭时,不重定向输出到文件
|
||||||
- 维护一个tas_target_queue队列,队列中每个元素可以保存一个TAS跟踪目标
|
- 日志文件输出路径为“.\\rdp_logs\\”,日志文件名按当前日期+时间命名
|
||||||
- 每次调用Beam_Ctrl()函数时,判断队列首个元素是否为空(empty_flag),若不为空,则输出TAS跟踪波束信息,否则不输出
|
- 增加宏定义,在输出日志时添加时间戳、代码文件、代码行数等关键信息再输出到标准输出
|
||||||
- 将队列进行循环移位,队列第一个目标移动至队尾,下一次Beam_Ctrl()调用将会跟踪下一个目标
|
|
||||||
|
|
||||||
原有逻辑的问题:
|
## 参考
|
||||||
- 原有逻辑下,TAS跟踪目标的数据率(目标信息更新频率)与波束时间相关,波束时间越短,则调用Beam_Ctrl()的频率越高,TAS目标的数据率也越高
|
|
||||||
|
|
||||||
新的逻辑为保证TAS目标的数据率不变:
|
### 参考1
|
||||||
- 维护一个tas_target_queue队列,队列中每个元素可以保存一个TAS跟踪目标
|
使用 rdbuf() 方法重定向标准输出,更符合C++的流式风格,通过替换 std::cout 的底层流缓冲区(streambuf),将其指向一个文件输出流(std::ofstream)。
|
||||||
- 每次调用Beam_Ctrl()函数时,判断队列首个元素是否为空(empty_flag),若不为空,则再判断目标的航迹时间(T_track)和当前最新时间戳(latest_timestamp)的差值,若差值大于1 / DATA_RATE_TAS,则输出TAS跟踪波束信息,否则不输出
|
|
||||||
- 将队列进行循环移位,队列第一个目标移动至队尾,下一次Beam_Ctrl()调用将会跟踪下一个目标
|
|
||||||
|
|
||||||
注意:在RadarPara结构体中新增一项:DATA_RATE_TAS(TAS模式数据率),由dll调用者输入该参数的值(track_process_parameters_initial()),上述逻辑中DATA_RATE_TAS使用Work_Parameter中的DATA_RATE_TAS参数值,而不是使用parameters.h中的DATA_RATE_TAS宏定义值。 -->
|
```cpp
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::ofstream file("output.txt");
|
||||||
|
if (!file.is_open()) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存原始的 cout 缓冲区,以便之后恢复
|
||||||
|
auto original_buf = std::cout.rdbuf();
|
||||||
|
|
||||||
|
// 将 cout 的缓冲区替换为 file 的缓冲区
|
||||||
|
std::cout.rdbuf(file.rdbuf());
|
||||||
|
|
||||||
|
// 此后的输出都会写入文件
|
||||||
|
std::cout << "这条信息会写入文件。" << std::endl;
|
||||||
|
|
||||||
|
// 恢复 cout 的原始缓冲区,让输出回到控制台
|
||||||
|
std::cout.rdbuf(original_buf);
|
||||||
|
// file 对象会在析构时自动关闭
|
||||||
|
|
||||||
|
std::cout << "这条信息会回到控制台。" << std::endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user