From b3e2f5226253469ee8effec25500de669c13be1f Mon Sep 17 00:00:00 2001 From: waiwaylee Date: Thu, 27 Aug 2026 16:19:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=9A1=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9TAS=E6=B3=A2=E6=9D=9F=E6=8E=A7=E5=88=B6=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E7=8E=B0=E5=9C=A8=E6=8C=89=E5=9B=BA=E5=AE=9A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=8E=87=E8=B0=83=E5=BA=A6TAS=E6=B3=A2?= =?UTF-8?q?=E6=9D=9F=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: waiwaylee --- CHANGELOG.md | 56 +++++++++++++++++++ README.md | 9 +-- .../data_process_class_dll.h | 2 + data_process_class_dll/tas_ctrl.cpp | 23 +++++++- data_process_class_dll/tas_ctrl.h | 1 + requirements.md | 19 +++++++ 6 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 requirements.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e00c5eb --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,56 @@ +# Changelog + +本项目的所有重要变更记录于此文件。 + +格式遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/), +版本号遵循 [语义化版本(SemVer)](https://semver.org/lang/zh-CN/)。 + +## [Unreleased] + +### Added + +- 新增 CHANGELOG.md,采用 Keep a Changelog 格式记录项目变更历史。 +- `RadarPara` 结构体新增 `DATA_RATE_TAS`(TAS 模式数据率)字段,由 DLL 调用者通过 `track_process_parameters_initial()` 输入。 + +### Changed + +- TAS 波束控制增加数据率门控:`Beam_Ctrl()` 仅在队首目标航迹时间 `T_track` 与最新时间戳 `latest_timestamp` 的差值大于 `1 / DATA_RATE_TAS` 秒时输出 TAS 跟踪波束,使 TAS 目标数据率不再随波束时间(Beam_Ctrl 调用频率)变化;队列轮转逻辑保持不变。 +- 波束门控使用 `Work_Parameter.DATA_RATE_TAS`(运行时参数)而非 `parameters.h` 中的 `DATA_RATE_TAS` 宏;参数 ≤ 0 时不做门控,保持原输出行为。 + +## [1.5.5] - 2026-08-27 + +初始版本记录:汇总仓库现有功能与自 2022 年以来的主要变更(依据 git 提交历史与 README.md 整理)。 + +### Added + +- TWS/TAS 双通道雷达数据处理:输入点迹预处理、两帧滑窗点迹凝聚、逻辑法航迹起始(3~9 点起批,含屏蔽区)、IMM + EKF 航迹滤波、最近邻点航关联、航迹外推/消亡/航迹号管理、TAS 波束控制输出。 +- 支持相扫(X256_PS)与机扫(X256_MS)两种扫描体制,通过 `RADAR_SCAN_MODE` / 编译宏配置切换。 +- 适配四面阵机扫跟踪模式;机扫跟踪时增加高度门限判断。 +- 输入点迹、输出航迹的 CPI 时间与 GNSS 时间改为 64 位整型(毫秒)。 +- 增加航迹清空功能,解决重连时大量航迹乱窜的问题。 +- TWS 输出增加高度平滑处理。 +- TWS 点航关联增加俯仰门限与点航距离门限,限制大幅度跳变或突跳到远距离的点迹关联。 +- 航迹起始增加屏蔽区域。 +- 新增 README.md、BUG_REPORT.md、BUG_FIX_REPORT.md 等文档。 + +### Changed + +- 工程由 Qt/qmake 迁移为 VS Code + CMake 构建,编译器保持 MSVC 2013 x86 不变。 +- 机扫与相扫程序合并,通过宏定义配置切换。 +- TAS 航迹外推时间间隔改为按波束时间计算。 +- 扫描一圈完成的判断逻辑改为用“波位号变小”判断。 +- 点迹凝聚角度约束放宽至 4 度;凝聚条件按近程/中程模式区分。 +- 去掉自动转 TAS 功能,仅支持手动转 TAS。 +- 去掉 1 km 以内航迹起批的 20 dB 信噪比门限。 +- 统一代码缩进格式。 + +### Fixed + +- 修复若干逻辑 BUG(数组越界/下溢、局部变量未初始化、时间差无效、方位角 ±π 环绕、IMM 概率奇异、输出数组容量越界等),明细见 `BUG_FIX_REPORT.md`。 +- 修复 TAS 外推时间差可能为无效值的问题。 +- 修复航迹起始时未输出跟踪类型、可靠航迹手动转跟踪标志未清零的问题。 +- 修复量测噪声协方差矩阵 R 赋值错误、数据预处理波位号判断规则、点迹数量上限、雅可比矩阵取值、起批负索引等问题。 + +### Removed + +- 移除 `requirements.md`、`CLAUDE.md`、Makefile 系列、Qt 工程用户文件、内置 Eigen 3.3.7 冗余文件及「航迹点迹区分区说明」等不必要文件。 diff --git a/README.md b/README.md index 1dede5b..de1984f 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,7 @@ classDiagram | Track_Asso_Tas | TAS 航迹关联(只处理指定批号 tas_track_idx,门限与 TWS 略有差异) | | Track_Init | 逻辑法航迹起始:航迹头维护、点-头关联(两点)、点-临时航迹关联(三点及以上)、起批(三点卡尔曼初始化)、屏蔽区判断、临时航迹消亡 | | Track_Die / Track_Die_Tas | 可靠航迹消亡:外推轮数超限或手动删除标志置位时输出消亡批号并删除 | -| TAS_Ctrl | TAS 波束控制:手动目标入队(tas_target_add)、失效目标出队(tas_target_del)、跟踪波束预测输出(tas_beam_output)、队列轮转 | +| TAS_Ctrl | TAS 波束控制:手动目标入队(tas_target_add)、失效目标出队(tas_target_del)、跟踪波束预测输出(tas_beam_output,含数据率门控)、队列轮转 | | Track_Ind_Mangement | 航迹号 1~500 的顺序分配与回绕复用 | | kalman | 两点/三点滤波初始化、线性卡尔曼预测/滤波、EKF(3 维量测含多普勒)、马氏统计距离 d、盲速 Bind_speed | | coor_trans | 极坐标 ↔ 直角坐标转换 | @@ -723,14 +723,14 @@ $$ - **入队条件**(仅手动):manual_tracking_flag==1 且 Track_Mode==0 且队列未满(MAX_TAS_NUM,相扫 4 / 机扫 1)且不在 TAS 禁止区内。入队即置 Track_Mode=1 并输出一次航迹更新。 - **出队**:队列中目标在航迹表中不存在、或不再处于手动 TAS 状态时清除。(自动转 TAS / 自动退出的 tas_auto_start/tas_auto_end 逻辑全部注释停用——只支持手动。) -- **波束输出**:取队首目标,用其状态外推到 latest_timestamp: +- **波束输出**:取队首目标,先用**数据率门控**:航迹时间 T_track 与当前最新时间戳 latest_timestamp 的差值必须大于 `1 / DATA_RATE_TAS` 秒才输出(保证 TAS 目标数据率不随波束时间变化;DATA_RATE_TAS ≤ 0 时不做门控,按原逻辑输出)。门控通过后,用其状态外推到 latest_timestamp: $$ 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=1, Range=rp, Azi=θp(°), Elev=asin(h/rp)(°), TAS_track_index};队空则 open_flag=0。每次 Beam_Ctrl 末尾做队列轮转(实现 TAS_QUEUE_LENGTH 深度的循环跟踪)。 +输出 TrackingBeam{open_flag=1, type=1, Range=rp, Azi=θp(°), Elev=asin(h/rp)(°), TAS_track_index};队空、目标不在航迹表或数据率门控未通过时 open_flag=0。每次 Beam_Ctrl 末尾做队列轮转(实现 TAS_QUEUE_LENGTH 深度的循环跟踪)。 - tas_ctrl_process 入口强制 *Trust_track_num_Output=0 并在写入前检查容量,防止输出数组越界(BUG-09 修复)。 --- @@ -741,7 +741,7 @@ $$ | 宏 | 相扫 PHASE_SCANNING | 机扫 MECHANICAL_SCANNING | 含义 | |---|---|---|---| -| DATA_RATE_TAS | 0.3 | 0.0625 | TAS 数据率(s) | +| DATA_RATE_TAS | 0.3 | 0.0625 | TAS 数据率(1/s)。**TAS 波束输出门控已改用运行时参数 RadarPara.DATA_RATE_TAS(见 10.2),不再使用该宏**;宏目前仅被未加入 CMake 的 track_asso_direct_tracking.cpp 引用 | | 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 / 方位 ° | | MAX_BEAM_NUM | 100 | 同左 | 最大波位数 | @@ -771,6 +771,7 @@ $$ | north_angle | 北偏角 | 保留 | | V_MAX / V_MIN | 目标速度上下限(m/s) | 航迹头关联速度区间门限 | | DATA_RATE_SHORT / MIDDLE / FAR | 三模式数据率(s) | TWS 外推步长 | +| DATA_RATE_TAS | TAS 模式数据率(1/s) | 由调用者经 track_process_parameters_initial 输入;TAS 波束输出门控阈值 1/DATA_RATE_TAS 秒,≤0 时不做门控 | | track_start_point_num | 起批点数 | 校验范围 3~9 | | 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 | diff --git a/data_process_class_dll/data_process_class_dll.h b/data_process_class_dll/data_process_class_dll.h index 8fad612..02dfe83 100644 --- a/data_process_class_dll/data_process_class_dll.h +++ b/data_process_class_dll/data_process_class_dll.h @@ -147,6 +147,8 @@ struct DATA_PROCESS_CLASS_DLLSHARED_EXPORT RadarPara float DATA_RATE_MIDDLE; float DATA_RATE_FAR; + float DATA_RATE_TAS; //TAS模式数据率,由dll调用者输入;TAS波束输出间隔阈值为 1/DATA_RATE_TAS 秒 + //数据关联参数 int track_start_point_num; //起批点数(典型值 3或4) float track_start_threshold; //起航波门大小(典型值 3) diff --git a/data_process_class_dll/tas_ctrl.cpp b/data_process_class_dll/tas_ctrl.cpp index 7969f9e..5b61332 100644 --- a/data_process_class_dll/tas_ctrl.cpp +++ b/data_process_class_dll/tas_ctrl.cpp @@ -6,6 +6,12 @@ using namespace std; +// parameters.h 中定义了 DATA_RATE_TAS 宏(相扫0.3/机扫0.0625), +// 而本模块的波束门控必须使用 RadarPara 结构体成员 Work_Parameter.DATA_RATE_TAS +// (由dll调用者经 track_process_parameters_initial 输入),故取消该宏定义, +// 否则 Work_Parameter.DATA_RATE_TAS 会被预处理器展开为非法常量表达式。 +#undef DATA_RATE_TAS + TAS_Ctrl::TAS_Ctrl() { memset(tas_target_queue,0,TAS_QUEUE_LENGTH*sizeof(Tracking_Target)); @@ -31,7 +37,7 @@ void TAS_Ctrl::tas_ctrl_process(std::vector *trust_track *Trust_track_num_Output = 0; tas_target_add(trust_track, Trust_Track_Output, Trust_track_num_Output,Work_Parameter); tas_target_del(trust_track, Trust_Track_Output, Trust_track_num_Output,Work_Parameter); - tas_beam_output(trust_track,Tracking_beam,latest_timestamp); + tas_beam_output(trust_track,Tracking_beam,Work_Parameter,latest_timestamp); //跟踪队列移位 struct Tracking_Target tas_target_tmp; @@ -246,6 +252,7 @@ void TAS_Ctrl::tas_target_del(std::vector *trust_track, void TAS_Ctrl::tas_beam_output(std::vector *trust_track, struct TrackingBeam *Tracking_beam, + struct RadarPara Work_Parameter, long long latest_timestamp) { if(tas_target_queue[0].empty_flag==1) @@ -273,6 +280,20 @@ void TAS_Ctrl::tas_beam_output(std::vector *trust_track return; } + //数据率门控:航迹时间与当前最新时间戳的差值大于 1/DATA_RATE_TAS 时才输出TAS跟踪波束, + //保证TAS目标数据率不随波束时间变化(使用Work_Parameter中的DATA_RATE_TAS参数值)。 + //DATA_RATE_TAS<=0 时不做门控,按原逻辑每次输出(避免除零,兼容未配置该参数的调用者)。 + if (Work_Parameter.DATA_RATE_TAS > 0) + { + double delta_T_track = (double)(latest_timestamp - CPI_time) / 1000.0; + if (delta_T_track <= 1.0 / Work_Parameter.DATA_RATE_TAS) + { + //更新间隔未到 不输出跟踪波束 + Tracking_beam->open_flag = 0; + return; + } + } + float delta_T = (latest_timestamp - CPI_time) / 1000.0f; //预测目标位置 计算跟踪波束波位号 俯仰角 diff --git a/data_process_class_dll/tas_ctrl.h b/data_process_class_dll/tas_ctrl.h index a73b2cb..ed5149b 100644 --- a/data_process_class_dll/tas_ctrl.h +++ b/data_process_class_dll/tas_ctrl.h @@ -38,6 +38,7 @@ private: //TAS队列信息输出 void tas_beam_output(std::vector *trust_track, struct TrackingBeam *Tracking_beam, + struct RadarPara Work_Parameter, long long latest_timestamp); //TAS 自动开启条件 diff --git a/requirements.md b/requirements.md new file mode 100644 index 0000000..8862677 --- /dev/null +++ b/requirements.md @@ -0,0 +1,19 @@ +# 雷达数据处理项目修改说明 + +## 概述 + +本次主要修改TAS波束控制逻辑, +原有逻辑为: +- 维护一个tas_target_queue队列,队列中每个元素可以保存一个TAS跟踪目标 +- 每次调用Beam_Ctrl()函数时,判断队列首个元素是否为空(empty_flag),若不为空,则输出TAS跟踪波束信息,否则不输出 +- 将队列进行循环移位,队列第一个目标移动至队尾,下一次Beam_Ctrl()调用将会跟踪下一个目标 + +原有逻辑的问题: +- 原有逻辑下,TAS跟踪目标的数据率(目标信息更新频率)与波束时间相关,波束时间越短,则调用Beam_Ctrl()的频率越高,TAS目标的数据率也越高 + +新的逻辑为保证TAS目标的数据率不变: +- 维护一个tas_target_queue队列,队列中每个元素可以保存一个TAS跟踪目标 +- 每次调用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宏定义值。 \ No newline at end of file