更新:1、修改TAS波束控制逻辑,现在按固定数据率调度TAS波束;
Signed-off-by: waiwaylee <waiwaylee@foxmail.com>
This commit is contained in:
@@ -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 冗余文件及「航迹点迹区分区说明」等不必要文件。
|
||||
@@ -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 |
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
*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> *trust_track,
|
||||
|
||||
void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *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> *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;
|
||||
|
||||
//预测目标位置 计算跟踪波束波位号 俯仰角
|
||||
|
||||
@@ -38,6 +38,7 @@ private:
|
||||
//TAS队列信息输出
|
||||
void tas_beam_output(std::vector<Trust_Track> *trust_track,
|
||||
struct TrackingBeam *Tracking_beam,
|
||||
struct RadarPara Work_Parameter,
|
||||
long long latest_timestamp);
|
||||
|
||||
//TAS 自动开启条件
|
||||
|
||||
@@ -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宏定义值。
|
||||
Reference in New Issue
Block a user