Compare commits

...
3 Commits
Author SHA1 Message Date
waiwaylee 5f820987a9 更新:1、修复全部C4819 / C4018 / C4244警告;
2、更新项目文档;
2026-09-07 14:29:24 +08:00
waiwaylee f438ac53d9 更新:1、优化TAS逻辑
2、优化宏定义

Signed-off-by: waiwaylee <waiwaylee@foxmail.com>
2026-09-07 09:48:58 +08:00
waiwaylee e729c5baee 更新:修改FREQ0宏定义为9.2GHz
Signed-off-by: waiwaylee <waiwaylee@foxmail.com>
2026-09-02 11:30:10 +08:00
37 changed files with 409 additions and 418 deletions
+15 -4
View File
@@ -10,12 +10,23 @@
### Added ### Added
- 新增 CHANGELOG.md,采用 Keep a Changelog 格式记录项目变更历史。 - 新增 CHANGELOG.md,采用 Keep a Changelog 格式记录项目变更历史。
- `RadarPara` 结构体新增 `DATA_RATE_TAS`(TAS 模式数据率)字段,由 DLL 调用者通过 `track_process_parameters_initial()` 输入。 - `RadarPara` 结构体新增 `DATA_RATE_TAS`(TAS 模式数据率)字段,由 DLL 调用者通过 `track_process_parameters_initial()` 输入b3e2f52
- `Tracking_Target` 新增 `last_track_time` 字段,记录各 TAS 目标最近一次波束输出时间(f438ac5)。
- 新增 requirements.md,说明 TAS 波束控制逻辑的修改背景与约定(b3e2f52)。
- 更新 README.md:目录结构补充 CHANGELOG.md / requirements.md;版本历史表补充 93d3924、b3e2f52、e729c5b、f438ac5 提交记录。
### Changed ### Changed
- TAS 波束控制增加数据率门控`Beam_Ctrl()`在队首目标航迹时间 `T_track`最新时间戳 `latest_timestamp` 的差值大于 `1 / DATA_RATE_TAS` 秒时输出 TAS 跟踪波束,使 TAS 目标数据率不再随波束时间(Beam_Ctrl 调用频率)变化;队列轮转逻辑保持不变 - TAS 波束控制改为按固定数据率调度`Beam_Ctrl()`当目标满足 `1 / DATA_RATE_TAS` 秒的数据率间隔(相对航迹时间 `T_track`上次波束输出 `last_track_time`)时才输出 TAS 跟踪波束,使 TAS 目标数据率不再随波束时间(Beam_Ctrl 调用频率)变化。
- 波束门控使用 `Work_Parameter.DATA_RATE_TAS`(运行时参数)而非 `parameters.h` 中的 `DATA_RATE_TAS` 宏;参数 ≤ 0 时不做门控,保持原输出行为 - TAS 波束输出目标改为队列内调度:不再固定取队首,而是遍历 TAS 队列,选择满足数据率门控且 CPI 时间最早的目标输出;原每次 Beam_Ctrl 末尾的整队循环移位(队列轮转)已停用(代码注释保留)
- 数据率门控统一使用运行时参数 `Work_Parameter.DATA_RATE_TAS`(由 DLL 调用者经 `track_process_parameters_initial()` 输入,需为 >0 的有效值);`parameters.h``DATA_RATE_TAS` 编译期宏(相扫 0.3 / 机扫 0.0625)已注释停用,引导跟踪外推同步改用运行时参数。
- 编译时以 `#pragma message` 提示当前启用的扫描体制宏(MECHANICAL_SCANNING / PHASE_SCANNING)。
- 频点宏由 `FREQ0~FREQ20`16.8 GHz)精简为单个 `FREQ0`,取值改为 9.2 GHze729c5b)。
- MSVC 编译选项按编译器版本条件追加 `/utf-8`VS2015 及以上);MSVC 2013 不支持该选项,改用源码文件带 BOM 的 UTF-8 编码解决 C4819。
### 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` 等)。
## [1.5.5] - 2026-08-27 ## [1.5.5] - 2026-08-27
@@ -53,4 +64,4 @@
### Removed ### Removed
- 移除 `requirements.md``CLAUDE.md`、Makefile 系列、Qt 工程用户文件、内置 Eigen 3.3.7 冗余文件及「航迹点迹区分区说明」等不必要文件。 - 移除 `requirements.md`93d3924 移除,后于 b3e2f52 重新加入并改为 TAS 波束控制说明)`CLAUDE.md`、Makefile 系列、Qt 工程用户文件、内置 Eigen 3.3.7 冗余文件及「航迹点迹区分区说明」等不必要文件。
+7
View File
@@ -80,6 +80,13 @@ if(MSVC)
/FS /FS
$<$<CONFIG:Release>:/Zc:strictStrings> $<$<CONFIG:Release>:/Zc:strictStrings>
) )
# 修复 C4819(源文件含当前代码页无法表示的字符)。
# /utf-8 从 VS2015 Update 2 开始支持;本工程使用 MSVC 2013 时无该选项,
# 通过为源码文件添加 UTF-8 BOM 解决 C4819,这里仅对支持 /utf-8 的新版 MSVC 开启。
if(MSVC_VERSION GREATER_EQUAL 1900)
target_compile_options(data_process_class_dll PRIVATE /utf-8)
endif()
endif() endif()
# 输出目录:build/bin 下为 DLL/PDBbuild/lib 下为导入库。 # 输出目录:build/bin 下为 DLL/PDBbuild/lib 下为导入库。
+23 -9
View File
@@ -70,6 +70,8 @@
├── CMakeLists.txt # CMake 构建脚本(扫描模式切换、导出宏、输出目录) ├── CMakeLists.txt # CMake 构建脚本(扫描模式切换、导出宏、输出目录)
├── 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 提交记录维护)
├── requirements.md # TAS 波束控制逻辑修改说明(固定数据率调度设计)
├── .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 变体
@@ -159,6 +161,12 @@ cmake --build build/X256_PS
仓库 build/X256_PS/bin/ 内还带有 **rdp_playback.exe**(回放测试工具,依赖 Qt5Core.dll、sqlite3.dll,配置样例 RadarConfigParam.ini,可回放 .db 记录的点迹数据验证 DLL 输出),不在本仓库源码范围内。 仓库 build/X256_PS/bin/ 内还带有 **rdp_playback.exe**(回放测试工具,依赖 Qt5Core.dll、sqlite3.dll,配置样例 RadarConfigParam.ini,可回放 .db 记录的点迹数据验证 DLL 输出),不在本仓库源码范围内。
### 4.5 编译警告处理
- 源码文件统一使用 **带 BOM 的 UTF-8** 编码保存,兼容 MSVC 2013(该版本不支持 `/utf-8`),消除 C4819。
- `CMakeLists.txt` 对 MSVC 19.0 及以上版本自动追加 `/utf-8` 编译选项;使用 MSVC 2013 构建时请保持源码为 UTF-8 with BOM。
- 修复了 `/W3` 下全部 C4018signed/unsigned 不匹配)与 C4244(类型转换可能丢失数据)警告:循环变量按需改为 `size_t`,窄化转换改为 `static_cast` 显式转换,不改变原有计算逻辑。
--- ---
## 5. 总体架构 ## 5. 总体架构
@@ -238,7 +246,7 @@ classDiagram
| Track_Asso_Tas | TAS 航迹关联(只处理指定批号 tas_track_idx,门限与 TWS 略有差异) | | Track_Asso_Tas | TAS 航迹关联(只处理指定批号 tas_track_idx,门限与 TWS 略有差异) |
| Track_Init | 逻辑法航迹起始:航迹头维护、点-头关联(两点)、点-临时航迹关联(三点及以上)、起批(三点卡尔曼初始化)、屏蔽区判断、临时航迹消亡 | | Track_Init | 逻辑法航迹起始:航迹头维护、点-头关联(两点)、点-临时航迹关联(三点及以上)、起批(三点卡尔曼初始化)、屏蔽区判断、临时航迹消亡 |
| Track_Die / Track_Die_Tas | 可靠航迹消亡:外推轮数超限或手动删除标志置位时输出消亡批号并删除 | | 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数据率门控 + 队内选择最早 CPI 目标)、调度时刻记录(last_track_time |
| 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 | 极坐标 ↔ 直角坐标转换 |
@@ -355,7 +363,7 @@ flowchart TD
D --> E["未关联 → 按 latest_timestamp 外推(ΔT≤0 跳过)"] D --> E["未关联 → 按 latest_timestamp 外推(ΔT≤0 跳过)"]
E --> F["track_die_tas: TAS 超时/手动删除 → 消亡输出"] E --> F["track_die_tas: TAS 超时/手动删除 → 消亡输出"]
F --> G["输出该批号航迹(point_type=1"] F --> G["输出该批号航迹(point_type=1"]
G --> H["Beam_Ctrl: 队列轮转 + 预测波束输出"] G --> H["Beam_Ctrl: 数据率门控 + 队内最早 CPI 目标 + 预测波束输出"]
``` ```
### 8.3 航迹起始流程(逻辑法) ### 8.3 航迹起始流程(逻辑法)
@@ -646,7 +654,7 @@ $$
$$ $$
v_{bind}=\frac{150000}{f_{GHz}\cdot PRI_{µs}}\quad(\mathrm{m/s}),\qquad v_{bind}=\frac{150000}{f_{GHz}\cdot PRI_{µs}}\quad(\mathrm{m/s}),\qquad
f_{GHz}=16.8+0.02\cdot f_{ind} f_{GHz}=9.2+0.02\cdot f_{ind}
$$ $$
(PRI ≤ 0 或 f ≤ 0 时返回安全值 1.0,接口约定 PRI 不允许为 0。) (PRI ≤ 0 或 f ≤ 0 时返回安全值 1.0,接口约定 PRI 不允许为 0。)
@@ -721,16 +729,16 @@ $$
### 9.10 TAS 波束控制(tas_ctrl.cpp ### 9.10 TAS 波束控制(tas_ctrl.cpp
- **入队条件**(仅手动):manual_tracking_flag==1 且 Track_Mode==0 且队列未满(MAX_TAS_NUM,相扫 4 / 机扫 1)且不在 TAS 禁止区内。入队即置 Track_Mode=1 并输出一次航迹更新。 - **入队条件**(仅手动):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 逻辑全部注释停用——只支持手动。)
- **波束输出**取队首目标,先用**数据率门控**航迹时间 T_track 与当前最新时间戳 latest_timestamp 的差值须大于 `1 / DATA_RATE_TAS`才输出(保证 TAS 目标数据率不随波束时间变化;DATA_RATE_TAS ≤ 0 时不做门控,按原逻辑输出)。门控通过后,用其状态外推到 latest_timestamp - **波束输出**在 TAS 队列内遍历,选择满足**数据率门控**的目标——目标距上次波束输出(`last_track_time`)的时间、以及航迹时间 T_track 与最新时间戳 latest_timestamp 的差值,均须大于 `1 / DATA_RATE_TAS`(使用运行时参数 Work_Parameter.DATA_RATE_TAS,需为 >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
r_p=\sqrt{x_p^2+y_p^2},\quad \theta_p=\operatorname{atan2}(y_p,x_p) 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。输出后更新该目标队列项的 last_track_time;原每次 Beam_Ctrl 末尾的整队循环移位(队列轮转)已停用,改为按数据率门控在队列内轮换目标
- tas_ctrl_process 入口强制 *Trust_track_num_Output=0 并在写入前检查容量,防止输出数组越界(BUG-09 修复)。 - tas_ctrl_process 入口强制 *Trust_track_num_Output=0 并在写入前检查容量,防止输出数组越界(BUG-09 修复)。
--- ---
@@ -741,7 +749,7 @@ $$
| 宏 | 相扫 PHASE_SCANNING | 机扫 MECHANICAL_SCANNING | 含义 | | 宏 | 相扫 PHASE_SCANNING | 机扫 MECHANICAL_SCANNING | 含义 |
|---|---|---|---| |---|---|---|---|
| DATA_RATE_TAS | 0.3 | 0.0625 | TAS 数据率(1/s)。**TAS 波束输出门控已改用运行时参数 RadarPara.DATA_RATE_TAS(见 10.2,不再使用该宏**;宏目前仅被未加入 CMake 的 track_asso_direct_tracking.cpp 引用 | | 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 / 方位 ° |
| MAX_BEAM_NUM | 100 | 同左 | 最大波位数 | | MAX_BEAM_NUM | 100 | 同左 | 最大波位数 |
@@ -754,7 +762,7 @@ $$
| ASSO_THORD | 3 | 同左 | 关联波门 | | ASSO_THORD | 3 | 同左 | 关联波门 |
| H_F_WIN_LEN | 3 | 同左 | 高度平滑窗长基数(实际 +2/+3/+4/+6 | | H_F_WIN_LEN | 3 | 同左 | 高度平滑窗长基数(实际 +2/+3/+4/+6 |
| TAS_QUEUE_LENGTH / MAX_TAS_NUM | 4 / 4 | 1 / 1 | TAS 队列长度 / 最大 TAS 目标数 | | TAS_QUEUE_LENGTH / MAX_TAS_NUM | 4 / 4 | 1 / 1 | TAS 队列长度 / 最大 TAS 目标数 |
| FREQ0~FREQ20 | 16.8 GHz | 同左 | 各频点频率 | | FREQ0 | 9.2 GHz | 同左 | 载波频点(原 FREQ0~FREQ20 一组宏已精简为单个 FREQ0e729c5b 起由 16.8 GHz 改为 9.2 GHz |
### 10.2 运行时参数(RadarPara ### 10.2 运行时参数(RadarPara
@@ -771,7 +779,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 输入;TAS 波束输出门控阈值 1/DATA_RATE_TAS 秒,≤0 时不做门控 | | DATA_RATE_TAS | TAS 模式数据率(1/s | 由调用者经 track_process_parameters_initial 输入(须为 >0 的有效值);TAS 波束输出门控阈值 1/DATA_RATE_TAS 秒,引导跟踪外推同样使用该运行时参数 |
| 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 |
@@ -819,6 +827,10 @@ $$
| 提交 | 内容 | | 提交 | 内容 |
|---|---| |---|---|
| f438ac5 | 优化 TAS 调度:波束输出改为在队列内选择满足数据率门控且 CPI 时间最早的目标,停用整队循环移位;DATA_RATE_TAS 编译期宏停用、统一使用运行时参数;#pragma message 提示扫描体制 |
| e729c5b | 频点宏精简为 FREQ0 = 9.2 GHz(原 FREQ0~FREQ20 均为 16.8 GHz |
| b3e2f52 | TAS 波束控制改为按固定数据率调度,RadarPara 新增 DATA_RATE_TAS 运行时参数;新增 CHANGELOG.md、requirements.mdREADME 补充相应说明 |
| 93d3924 | 新增 README.md(本文档);移除 requirements.md;调整 .gitignore |
| 3500652 | 去掉 1 km 以内航迹起批的 20 dB 信噪比门限 | | 3500652 | 去掉 1 km 以内航迹起批的 20 dB 信噪比门限 |
| 01d28e0 | 改用 VS Code + CMake 重新编译(编译器不变);修复若干逻辑 BUG(见 BUG_FIX_REPORT.md | | 01d28e0 | 改用 VS Code + CMake 重新编译(编译器不变);修复若干逻辑 BUG(见 BUG_FIX_REPORT.md |
| 0cb31b4 | 删除不必要文件;输入点迹/输出航迹的 CPI 与 GNSS 时间改为 64 位整型;修复 TAS 外推时间差可能无效的问题 | | 0cb31b4 | 删除不必要文件;输入点迹/输出航迹的 CPI 与 GNSS 时间改为 64 位整型;修复 TAS 外推时间差可能无效的问题 |
@@ -841,8 +853,10 @@ $$
| 文档 | 内容 | | 文档 | 内容 |
|---|---| |---|---|
| 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 |
| 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 -1
View File
@@ -1,4 +1,4 @@
#include "coor_trans.h" #include "coor_trans.h"
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
#include <vector> #include <vector>
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef COOR_TRANS_H #ifndef COOR_TRANS_H
#define COOR_TRANS_H #define COOR_TRANS_H
#include "parameters.h" #include "parameters.h"
+4 -5
View File
@@ -1,4 +1,4 @@
#include "data_process.h" #include "data_process.h"
#include <cstring> #include <cstring>
#include <vector> #include <vector>
#include <cmath> #include <cmath>
@@ -65,7 +65,6 @@ int Data_Process::data_preprocess(struct DataRev Data_Input[150])
data_num = min(max(Data_Input[0].Point_Sum, 0), 150); data_num = min(max(Data_Input[0].Point_Sum, 0), 150);
TAS_track_idx = Data_Input[0].TAS_track_index; TAS_track_idx = Data_Input[0].TAS_track_index;
latest_timestamp = Data_Input[0].CPI_time;
for (int i=0; i<data_num;i++) for (int i=0; i<data_num;i++)
{ {
PointRecv Data_buffer_temp; PointRecv Data_buffer_temp;
@@ -247,7 +246,7 @@ int Data_Process:: track_delete(int delete_track_num, //手动
{ {
for (int i=0;i<delete_track_num ;i++) for (int i=0;i<delete_track_num ;i++)
{ {
for (int j=0;j<trust_track.size();j++) for (size_t j=0;j<trust_track.size();j++)
{ {
if(trust_track[j].Track_Index == delete_track_index[i]) if(trust_track[j].Track_Index == delete_track_index[i])
{ {
@@ -266,7 +265,7 @@ int Data_Process:: track_delete(int delete_track_num, //手动
int Data_Process:: tracking_start(int track_index) //需要手动转入TAS跟踪的航迹号 int Data_Process:: tracking_start(int track_index) //需要手动转入TAS跟踪的航迹号
{ {
for ( int i=0; i<trust_track.size();i++) for ( size_t i=0; i<trust_track.size();i++)
if(trust_track[i].Track_Index==track_index) if(trust_track[i].Track_Index==track_index)
{ {
trust_track[i].manual_tracking_flag = 1; trust_track[i].manual_tracking_flag = 1;
@@ -279,7 +278,7 @@ int Data_Process:: tracking_start(int track_index) //需要手动
int Data_Process:: tracking_stop(int track_index) //需要手动转入TAS跟踪的航迹号 int Data_Process:: tracking_stop(int track_index) //需要手动转入TAS跟踪的航迹号
{ {
for ( int i=0; i<trust_track.size();i++){ for ( size_t i=0; i<trust_track.size();i++){
if(trust_track[i].Track_Index==track_index) if(trust_track[i].Track_Index==track_index)
{ {
trust_track[i].manual_tracking_flag = 0; trust_track[i].manual_tracking_flag = 0;
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef DATA_PROCESS_H #ifndef DATA_PROCESS_H
#define DATA_PROCESS_H #define DATA_PROCESS_H
#pragma once #pragma once
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
@@ -1,4 +1,4 @@
#ifndef DATA_PROCESS_CLASS_DLL_LIBRARY #ifndef DATA_PROCESS_CLASS_DLL_LIBRARY
#define DATA_PROCESS_CLASS_DLL_LIBRARY #define DATA_PROCESS_CLASS_DLL_LIBRARY
#endif #endif
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
@@ -1,4 +1,4 @@
#pragma once #pragma once
#ifndef DATA_PROCESS_CLASS_DLL_H #ifndef DATA_PROCESS_CLASS_DLL_H
#define DATA_PROCESS_CLASS_DLL_H #define DATA_PROCESS_CLASS_DLL_H
@@ -1,4 +1,4 @@
#ifndef DATA_PROCESS_CLASS_DLL_GLOBAL_H #ifndef DATA_PROCESS_CLASS_DLL_GLOBAL_H
#define DATA_PROCESS_CLASS_DLL_GLOBAL_H #define DATA_PROCESS_CLASS_DLL_GLOBAL_H
#if defined(DATA_PROCESS_CLASS_DLL_LIBRARY) #if defined(DATA_PROCESS_CLASS_DLL_LIBRARY)
+40 -40
View File
@@ -1,4 +1,4 @@
#include "dot_coh.h" #include "dot_coh.h"
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
#include <vector> #include <vector>
@@ -16,18 +16,18 @@ int Dot_Coh::dot_coh_process(std::vector <PointRecv> *data_input,
{ {
if( (*data_input)[loop_of_point].Use_Flag!=1) if( (*data_input)[loop_of_point].Use_Flag!=1)
{ {
float point_0_R=(*data_input)[loop_of_point].Range; float point_0_R=static_cast<float>((*data_input)[loop_of_point].Range);
float point_0_V=(*data_input)[loop_of_point].Velocity; float point_0_V=static_cast<float>((*data_input)[loop_of_point].Velocity);
float point_0_F=(*data_input)[loop_of_point].Azimuth; float point_0_F=static_cast<float>((*data_input)[loop_of_point].Azimuth);
float point_0_A=(*data_input)[loop_of_point].Amplitude; float point_0_A=static_cast<float>((*data_input)[loop_of_point].Amplitude);
for (unsigned int i=loop_of_point+1;i<data_input->size();i++) for (unsigned int i=loop_of_point+1;i<data_input->size();i++)
{ {
if((*data_input)[loop_of_point].Use_Flag!=1 && (*data_input)[i].Use_Flag!=1) if((*data_input)[loop_of_point].Use_Flag!=1 && (*data_input)[i].Use_Flag!=1)
{ {
float point_1_R=(*data_input)[i].Range; float point_1_R=static_cast<float>((*data_input)[i].Range);
float point_1_V=(*data_input)[i].Velocity; float point_1_V=static_cast<float>((*data_input)[i].Velocity);
float point_1_F=(*data_input)[i].Azimuth; float point_1_F=static_cast<float>((*data_input)[i].Azimuth);
float point_1_A=(*data_input)[i].Amplitude; float point_1_A=static_cast<float>((*data_input)[i].Amplitude);
//凝聚条件: 距离、方位接近 //凝聚条件: 距离、方位接近
if(Work_Parameter.work_mode == 0) if(Work_Parameter.work_mode == 0)
@@ -36,10 +36,10 @@ int Dot_Coh::dot_coh_process(std::vector <PointRecv> *data_input,
if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V)// if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V)//
&& point_0_A <point_1_A )// && point_0_A <point_1_A )//
{ {
point_0_R=(*data_input)[i].Range; point_0_R=static_cast<float>((*data_input)[i].Range);
point_0_V=(*data_input)[i].Velocity; point_0_V=static_cast<float>((*data_input)[i].Velocity);
point_0_A=(*data_input)[i].Amplitude; point_0_A=static_cast<float>((*data_input)[i].Amplitude);
point_0_F=(*data_input)[i].Azimuth; point_0_F=static_cast<float>((*data_input)[i].Azimuth);
(*data_input)[loop_of_point].Use_Flag=1; (*data_input)[loop_of_point].Use_Flag=1;
} }
else if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V)// else if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V)//
@@ -54,10 +54,10 @@ int Dot_Coh::dot_coh_process(std::vector <PointRecv> *data_input,
if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI )// if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI )//
&& point_0_A <point_1_A )// && point_0_A <point_1_A )//
{ {
point_0_R=(*data_input)[i].Range; point_0_R=static_cast<float>((*data_input)[i].Range);
point_0_V=(*data_input)[i].Velocity; point_0_V=static_cast<float>((*data_input)[i].Velocity);
point_0_A=(*data_input)[i].Amplitude; point_0_A=static_cast<float>((*data_input)[i].Amplitude);
point_0_F=(*data_input)[i].Azimuth; point_0_F=static_cast<float>((*data_input)[i].Azimuth);
(*data_input)[loop_of_point].Use_Flag=1; (*data_input)[loop_of_point].Use_Flag=1;
} }
else if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI )// else if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI )//
@@ -88,7 +88,7 @@ int Dot_Coh::dot_coh_process(std::vector <PointRecv> *data_input,
} }
} }
for (int i=0;i<data_input->size();i++) //data_buffer_2 ---> point_recv for (size_t i=0;i<data_input->size();i++) //data_buffer_2 ---> point_recv
{ {
(*point_recv).push_back((*data_input)[i]); (*point_recv).push_back((*data_input)[i]);
} }
@@ -106,20 +106,20 @@ int Dot_Coh::dot_coh_process_buff( std::vector <PointRecv> *data_input,
//1.1 data_input、data_input_buff中的数据放在一起 //1.1 data_input、data_input_buff中的数据放在一起
std::vector <PointRecv> data_tmp; std::vector <PointRecv> data_tmp;
for (int i=0;i<data_input_buff.size();i++) for (size_t i=0;i<data_input_buff.size();i++)
{ {
data_tmp.push_back(data_input_buff[i]); data_tmp.push_back(data_input_buff[i]);
data_tmp[data_tmp.size()-1].point_section_asso = 1; data_tmp[data_tmp.size()-1].point_section_asso = 1;
} }
for (int i=0;i<data_input->size();i++) for (size_t i=0;i<data_input->size();i++)
{ {
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的点 // //去除点迹中,1km以内,SNR小于20dB的点
// for (int i=0;i<data_input->size();i++) // for (size_t i=0;i<data_input->size();i++)
// { // {
// if((*data_input)[i].Range > 1000 || (*data_input)[i].snr >= 20){ // if((*data_input)[i].Range > 1000 || (*data_input)[i].snr >= 20){
// data_tmp.push_back((*data_input)[i]); // data_tmp.push_back((*data_input)[i]);
@@ -140,18 +140,18 @@ int Dot_Coh::dot_coh_process_buff( std::vector <PointRecv> *data_input,
{ {
if( data_tmp[loop_of_point].Use_Flag!=1) if( data_tmp[loop_of_point].Use_Flag!=1)
{ {
float point_0_R=data_tmp[loop_of_point].Range; float point_0_R=static_cast<float>(data_tmp[loop_of_point].Range);
float point_0_V=data_tmp[loop_of_point].Velocity; float point_0_V=static_cast<float>(data_tmp[loop_of_point].Velocity);
float point_0_F=data_tmp[loop_of_point].Azimuth; float point_0_F=static_cast<float>(data_tmp[loop_of_point].Azimuth);
float point_0_A=data_tmp[loop_of_point].Amplitude; float point_0_A=static_cast<float>(data_tmp[loop_of_point].Amplitude);
for (unsigned int i=loop_of_point+1;i<data_tmp.size();i++) for (unsigned int i=loop_of_point+1;i<data_tmp.size();i++)
{ {
if(data_tmp[loop_of_point].Use_Flag!=1 && data_tmp[i].Use_Flag!=1) if(data_tmp[loop_of_point].Use_Flag!=1 && data_tmp[i].Use_Flag!=1)
{ {
float point_1_R=data_tmp[i].Range; float point_1_R=static_cast<float>(data_tmp[i].Range);
float point_1_V=data_tmp[i].Velocity; float point_1_V=static_cast<float>(data_tmp[i].Velocity);
float point_1_F=data_tmp[i].Azimuth; float point_1_F=static_cast<float>(data_tmp[i].Azimuth);
float point_1_A=data_tmp[i].Amplitude; float point_1_A=static_cast<float>(data_tmp[i].Amplitude);
//凝聚条件: 距离、方位接近 //凝聚条件: 距离、方位接近
if(Work_Parameter.work_mode == 0) if(Work_Parameter.work_mode == 0)
@@ -160,10 +160,10 @@ int Dot_Coh::dot_coh_process_buff( std::vector <PointRecv> *data_input,
if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V)// if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V)//
&& point_0_A <point_1_A )// && point_0_A <point_1_A )//
{ {
point_0_R=data_tmp[i].Range; point_0_R=static_cast<float>(data_tmp[i].Range);
point_0_V=data_tmp[i].Velocity; point_0_V=static_cast<float>(data_tmp[i].Velocity);
point_0_A=data_tmp[i].Amplitude; point_0_A=static_cast<float>(data_tmp[i].Amplitude);
point_0_F=data_tmp[i].Azimuth; point_0_F=static_cast<float>(data_tmp[i].Azimuth);
data_tmp[loop_of_point].Use_Flag=1; data_tmp[loop_of_point].Use_Flag=1;
} }
else if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V)// else if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V)//
@@ -178,10 +178,10 @@ int Dot_Coh::dot_coh_process_buff( std::vector <PointRecv> *data_input,
if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI )// if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI )//
&& point_0_A <point_1_A )// && point_0_A <point_1_A )//
{ {
point_0_R=data_tmp[i].Range; point_0_R=static_cast<float>(data_tmp[i].Range);
point_0_V=data_tmp[i].Velocity; point_0_V=static_cast<float>(data_tmp[i].Velocity);
point_0_A=data_tmp[i].Amplitude; point_0_A=static_cast<float>(data_tmp[i].Amplitude);
point_0_F=data_tmp[i].Azimuth; point_0_F=static_cast<float>(data_tmp[i].Azimuth);
data_tmp[loop_of_point].Use_Flag=1; data_tmp[loop_of_point].Use_Flag=1;
} }
else if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI )// else if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI )//
@@ -213,7 +213,7 @@ int Dot_Coh::dot_coh_process_buff( std::vector <PointRecv> *data_input,
} }
//1.5 将data_tmp中凝聚后的点再分到 data_input_buff和data_input中 //1.5 将data_tmp中凝聚后的点再分到 data_input_buff和data_input中
for (int i=0;i<data_tmp.size();i++) for (size_t i=0;i<data_tmp.size();i++)
{ {
if(data_tmp[i].point_section_asso==1) if(data_tmp[i].point_section_asso==1)
{ {
@@ -229,7 +229,7 @@ int Dot_Coh::dot_coh_process_buff( std::vector <PointRecv> *data_input,
//2.data_input_buff数据输出给point_recv //2.data_input_buff数据输出给point_recv
for (int i=0;i<data_input_buff.size();i++) for (size_t i=0;i<data_input_buff.size();i++)
{ {
(*point_recv).push_back(data_input_buff[i]); (*point_recv).push_back(data_input_buff[i]);
} }
@@ -237,7 +237,7 @@ int Dot_Coh::dot_coh_process_buff( std::vector <PointRecv> *data_input,
std::vector<PointRecv>().swap(data_input_buff); std::vector<PointRecv>().swap(data_input_buff);
//3.data_input数据输出给data_input_buff //3.data_input数据输出给data_input_buff
for (int i=0;i<data_input->size();i++) for (size_t i=0;i<data_input->size();i++)
{ {
data_input_buff.push_back((*data_input)[i]); data_input_buff.push_back((*data_input)[i]);
} }
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef DOT_COH_H #ifndef DOT_COH_H
#define DOT_COH_H #define DOT_COH_H
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
#include "parameters.h" #include "parameters.h"
+16 -16
View File
@@ -1,4 +1,4 @@
#include "dot_coh_tas.h" #include "dot_coh_tas.h"
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
#include <vector> #include <vector>
@@ -12,32 +12,32 @@ int Dot_Coh_TAS::dot_coh_tas_process(std::vector <PointRecv> *dat
return 1; return 1;
} }
for (int loop_of_point=0; loop_of_point<data_input->size()-1;loop_of_point++ ) for (size_t loop_of_point=0; loop_of_point<data_input->size()-1;loop_of_point++ )
{ {
if( (*data_input)[loop_of_point].Use_Flag!=1) if( (*data_input)[loop_of_point].Use_Flag!=1)
{ {
float point_0_R=(*data_input)[loop_of_point].Range; float point_0_R=static_cast<float>((*data_input)[loop_of_point].Range);
float point_0_V=(*data_input)[loop_of_point].Velocity; float point_0_V=static_cast<float>((*data_input)[loop_of_point].Velocity);
float point_0_F=(*data_input)[loop_of_point].Azimuth; float point_0_F=static_cast<float>((*data_input)[loop_of_point].Azimuth);
float point_0_A=(*data_input)[loop_of_point].Amplitude; float point_0_A=static_cast<float>((*data_input)[loop_of_point].Amplitude);
for ( int i=loop_of_point+1;i<(*data_input).size();i++) for ( size_t i=loop_of_point+1;i<(*data_input).size();i++)
{ {
if((*data_input)[loop_of_point].Use_Flag!=1 && (*data_input)[i].Use_Flag!=1) if((*data_input)[loop_of_point].Use_Flag!=1 && (*data_input)[i].Use_Flag!=1)
{ {
float point_1_R=(*data_input)[i].Range; float point_1_R=static_cast<float>((*data_input)[i].Range);
float point_1_V=(*data_input)[i].Velocity; float point_1_V=static_cast<float>((*data_input)[i].Velocity);
float point_1_F=(*data_input)[i].Azimuth; float point_1_F=static_cast<float>((*data_input)[i].Azimuth);
float point_1_A=(*data_input)[i].Amplitude; float point_1_A=static_cast<float>((*data_input)[i].Amplitude);
//凝聚条件: 距离、方位接近 //凝聚条件: 距离、方位接近
float delta_F = fabs(point_0_F-point_1_F)<2*PI-fabs(point_0_F-point_1_F) ? fabs(point_0_F-point_1_F) :2*PI-fabs(point_0_F-point_1_F); float delta_F = fabs(point_0_F-point_1_F)<2*PI-fabs(point_0_F-point_1_F) ? fabs(point_0_F-point_1_F) :2*PI-fabs(point_0_F-point_1_F);
if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V) if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V)
&& point_0_A <point_1_A ) && point_0_A <point_1_A )
{ {
point_0_R=(*data_input)[i].Range; point_0_R=static_cast<float>((*data_input)[i].Range);
point_0_V=(*data_input)[i].Velocity; point_0_V=static_cast<float>((*data_input)[i].Velocity);
point_0_A=(*data_input)[i].Amplitude; point_0_A=static_cast<float>((*data_input)[i].Amplitude);
point_0_F=(*data_input)[i].Azimuth; point_0_F=static_cast<float>((*data_input)[i].Azimuth);
(*data_input)[loop_of_point].Use_Flag=1; (*data_input)[loop_of_point].Use_Flag=1;
} }
else if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V) else if( (fabs(point_0_R-point_1_R)<=DOT_COH_RANGE && delta_F <=DOT_COH_AZI/180.0*PI && fabs(point_0_V-point_1_V)<=DOT_COH_V)
@@ -65,7 +65,7 @@ int Dot_Coh_TAS::dot_coh_tas_process(std::vector <PointRecv> *dat
} }
} }
for (int i=0;i<data_input->size();i++) for (size_t i=0;i<data_input->size();i++)
{ {
(*point_recv_tas).push_back((*data_input)[i]); (*point_recv_tas).push_back((*data_input)[i]);
} }
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef DOT_COH_TAS_H #ifndef DOT_COH_TAS_H
#define DOT_COH_TAS_H #define DOT_COH_TAS_H
#include "parameters.h" #include "parameters.h"
#include "struct.h" #include "struct.h"
+1 -1
View File
@@ -1,4 +1,4 @@
#include "kalman.h" #include "kalman.h"
#include "coor_trans.h" #include "coor_trans.h"
#include "parameters.h" #include "parameters.h"
#include <cmath> #include <cmath>
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef KALMAN_H #ifndef KALMAN_H
#define KALMAN_H #define KALMAN_H
#include "parameters.h" #include "parameters.h"
#include "struct.h" #include "struct.h"
+8 -24
View File
@@ -1,38 +1,18 @@
#ifndef PARAMETERS_H #ifndef PARAMETERS_H
#define PARAMETERS_H #define PARAMETERS_H
#pragma once #pragma once
/**********************************雷达参数*************************************************/ /**********************************雷达参数*************************************************/
#define PI 3.1415926f #define PI 3.1415926f
//频点(GHz) //频点(GHz)
#define FREQ0 16.8 #define FREQ0 9.2
#define FREQ1 16.8
#define FREQ2 16.8
#define FREQ3 16.8
#define FREQ4 16.8
#define FREQ5 16.8
#define FREQ6 16.8
#define FREQ7 16.8
#define FREQ8 16.8
#define FREQ9 16.8
#define FREQ10 16.8
#define FREQ11 16.8
#define FREQ12 16.8
#define FREQ13 16.8
#define FREQ14 16.8
#define FREQ15 16.8
#define FREQ16 16.8
#define FREQ17 16.8
#define FREQ18 16.8
#define FREQ19 16.8
#define FREQ20 16.8
//#define MECHANICAL_SCANNING //#define MECHANICAL_SCANNING
//#define PHASE_SCANNING //#define PHASE_SCANNING
#ifdef MECHANICAL_SCANNING #ifdef MECHANICAL_SCANNING
/******************************数据处理参数**************************************/ /******************************数据处理参数**************************************/
#define DATA_RATE_TAS 0.0625 // #define DATA_RATE_TAS 0.0625
#define SIGMA_R 10.0 //测量误差 #define SIGMA_R 10.0 //测量误差
#define SIGMA_A 0.02 #define SIGMA_A 0.02
@@ -72,12 +52,14 @@
#define DIRECT_TRACKING_QUEUE_LENGTH 10 #define DIRECT_TRACKING_QUEUE_LENGTH 10
#pragma message("MECHANICAL_SCANNING")
#endif #endif
#ifdef PHASE_SCANNING #ifdef PHASE_SCANNING
/******************************数据处理参数**************************************/ /******************************数据处理参数**************************************/
#define DATA_RATE_TAS 0.3 // #define DATA_RATE_TAS 0.3
#define SIGMA_R 10.0 //测量误差 #define SIGMA_R 10.0 //测量误差
#define SIGMA_A 0.02 #define SIGMA_A 0.02
@@ -119,6 +101,8 @@
#define DIRECT_TRACKING_QUEUE_LENGTH 10 #define DIRECT_TRACKING_QUEUE_LENGTH 10
#pragma message("PHASE_SCANNING")
#endif #endif
#define Round(x) (((x) > 0) \ #define Round(x) (((x) > 0) \
+2 -2
View File
@@ -1,4 +1,4 @@
#ifndef STRUCT_H #ifndef STRUCT_H
#define STRUCT_H #define STRUCT_H
#pragma once #pragma once
@@ -125,7 +125,7 @@ struct Tracking_Target
{ {
int Index; //目标批号 int Index; //目标批号
int empty_flag; //是否为空标志位 1非空 0空 int empty_flag; //是否为空标志位 1非空 0空
long long last_track_time; //最新跟踪时间
}; };
//引导跟踪目标结构体 //引导跟踪目标结构体
+73 -64
View File
@@ -1,4 +1,4 @@
#include "tas_ctrl.h" #include "tas_ctrl.h"
#include "coor_trans.h" #include "coor_trans.h"
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
@@ -39,14 +39,14 @@ void TAS_Ctrl::tas_ctrl_process(std::vector<Trust_Track> *trust_track
tas_target_del(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,Work_Parameter,latest_timestamp); tas_beam_output(trust_track,Tracking_beam,Work_Parameter,latest_timestamp);
//跟踪队列移位 // //跟踪队列移位
struct Tracking_Target tas_target_tmp; // struct Tracking_Target tas_target_tmp;
memcpy(&tas_target_tmp, &tas_target_queue[TAS_QUEUE_LENGTH-1], sizeof(Tracking_Target)); // memcpy(&tas_target_tmp, &tas_target_queue[TAS_QUEUE_LENGTH-1], sizeof(Tracking_Target));
for (int i=TAS_QUEUE_LENGTH-1;i>0;i--) // for (int i=TAS_QUEUE_LENGTH-1;i>0;i--)
{ // {
memcpy(&tas_target_queue[i],&tas_target_queue[i-1],sizeof(Tracking_Target)); // memcpy(&tas_target_queue[i],&tas_target_queue[i-1],sizeof(Tracking_Target));
} // }
memcpy(&tas_target_queue[0], &tas_target_tmp, sizeof(Tracking_Target)); // memcpy(&tas_target_queue[0], &tas_target_tmp, sizeof(Tracking_Target));
}; };
void TAS_Ctrl::tas_target_add(std::vector<Trust_Track> *trust_track, void TAS_Ctrl::tas_target_add(std::vector<Trust_Track> *trust_track,
@@ -55,7 +55,7 @@ void TAS_Ctrl::tas_target_add(std::vector<Trust_Track> *trust_track,
struct RadarPara Work_Parameter) struct RadarPara Work_Parameter)
{ {
for (int i=0;i<trust_track->size();i++) for (size_t i=0;i<trust_track->size();i++)
{ {
double r=sqrt(pow((*trust_track)[i].X[0],2)+pow((*trust_track)[i].X[3],2)); double r=sqrt(pow((*trust_track)[i].X[0],2)+pow((*trust_track)[i].X[3],2));
double v=sqrt(pow((*trust_track)[i].X[1],2)+pow((*trust_track)[i].X[4],2)); double v=sqrt(pow((*trust_track)[i].X[1],2)+pow((*trust_track)[i].X[4],2));
@@ -81,6 +81,7 @@ void TAS_Ctrl::tas_target_add(std::vector<Trust_Track> *trust_track,
//插入跟踪队列 //插入跟踪队列
tas_target_queue[j].Index=(*trust_track)[i].Track_Index; tas_target_queue[j].Index=(*trust_track)[i].Track_Index;
tas_target_queue[j].empty_flag=1; tas_target_queue[j].empty_flag=1;
tas_target_queue[j].last_track_time=(*trust_track)[i].T_track;
//跟踪目标数目加一 //跟踪目标数目加一
tas_target_num=tas_target_num+1; tas_target_num=tas_target_num+1;
@@ -94,18 +95,18 @@ void TAS_Ctrl::tas_target_add(std::vector<Trust_Track> *trust_track,
coor_trans Coor_trans; coor_trans Coor_trans;
Coor_trans.cart2polar((*trust_track)[i].X[0],(*trust_track)[i].X[3],&r_output,&azmi_output); Coor_trans.cart2polar((*trust_track)[i].X[0],(*trust_track)[i].X[3],&r_output,&azmi_output);
Trust_Track_Output[*Trust_track_num_Output-1][0].Point_Sum=1; Trust_Track_Output[*Trust_track_num_Output-1][0].Point_Sum=1;
Trust_Track_Output[*Trust_track_num_Output-1][0].Range=r_output; Trust_Track_Output[*Trust_track_num_Output-1][0].Range=static_cast<float>(r_output);
Trust_Track_Output[*Trust_track_num_Output-1][0].Azimuth=azmi_output/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][0].Azimuth=static_cast<float>(azmi_output/PI*180);
Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Index=(*trust_track)[i].Track_Index; //航迹号 Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Index=(*trust_track)[i].Track_Index; //航迹号
Trust_Track_Output[*Trust_track_num_Output-1][0].Range_V= Trust_Track_Output[*Trust_track_num_Output-1][0].Range_V=
sqrt((*trust_track)[i].X[1]*(*trust_track)[i].X[1]+(*trust_track)[i].X[4]*(*trust_track)[i].X[4]); static_cast<float>(sqrt((*trust_track)[i].X[1]*(*trust_track)[i].X[1]+(*trust_track)[i].X[4]*(*trust_track)[i].X[4]));
Trust_Track_Output[*Trust_track_num_Output-1][0].Amplitude=(*trust_track)[i].Amplitude; Trust_Track_Output[*Trust_track_num_Output-1][0].Amplitude=static_cast<float>((*trust_track)[i].Amplitude);
Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Point=(*trust_track)[i].point_flag; Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Point=(*trust_track)[i].point_flag;
Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Mode=(*trust_track)[i].Track_Mode; Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Mode=(*trust_track)[i].Track_Mode;
Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation=asin((*trust_track)[i].Height/r_output)/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation=static_cast<float>(asin((*trust_track)[i].Height/r_output)/PI*180);
Trust_Track_Output[*Trust_track_num_Output-1][0].z=(*trust_track)[i].Height+Work_Parameter.Height; Trust_Track_Output[*Trust_track_num_Output-1][0].z=static_cast<float>((*trust_track)[i].Height+Work_Parameter.Height);
Trust_Track_Output[*Trust_track_num_Output-1][0].Target_Type=(*trust_track)[i].Target_Type; Trust_Track_Output[*Trust_track_num_Output-1][0].Target_Type=(*trust_track)[i].Target_Type;
Trust_Track_Output[*Trust_track_num_Output-1][0].track_snr = (*trust_track)[i].snr_point; Trust_Track_Output[*Trust_track_num_Output-1][0].track_snr = static_cast<float>((*trust_track)[i].snr_point);
break; break;
} }
@@ -163,7 +164,7 @@ void TAS_Ctrl::tas_target_del(std::vector<Trust_Track> *trust_track,
{ {
//查找TAS队列里的目标是否存在 //查找TAS队列里的目标是否存在
int flag=0; int flag=0;
for (int j=0;j<trust_track->size();j++){ for (size_t j=0;j<trust_track->size();j++){
{ {
if(tas_target_queue[i].Index==(*trust_track)[j].Track_Index && (*trust_track)[j].Track_Mode == 1 && (*trust_track)[j].manual_tracking_flag == 1) if(tas_target_queue[i].Index==(*trust_track)[j].Track_Index && (*trust_track)[j].Track_Mode == 1 && (*trust_track)[j].manual_tracking_flag == 1)
{ {
@@ -212,17 +213,17 @@ void TAS_Ctrl::tas_target_del(std::vector<Trust_Track> *trust_track,
// coor_trans Coor_trans; // coor_trans Coor_trans;
// Coor_trans.cart2polar((*trust_track)[i].X[0],(*trust_track)[i].X[3],&r_output,&azmi_output); // Coor_trans.cart2polar((*trust_track)[i].X[0],(*trust_track)[i].X[3],&r_output,&azmi_output);
// Trust_Track_Output[*Trust_track_num_Output-1][0].Point_Sum=1; // Trust_Track_Output[*Trust_track_num_Output-1][0].Point_Sum=1;
// Trust_Track_Output[*Trust_track_num_Output-1][0].Range=r_output; // Trust_Track_Output[*Trust_track_num_Output-1][0].Range=static_cast<float>(r_output);
// Trust_Track_Output[*Trust_track_num_Output-1][0].Azimuth=azmi_output/PI*180; // Trust_Track_Output[*Trust_track_num_Output-1][0].Azimuth=static_cast<float>(azmi_output/PI*180);
// Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Index=(*trust_track)[i].Track_Index; //航迹号 // Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Index=(*trust_track)[i].Track_Index; //航迹号
// Trust_Track_Output[*Trust_track_num_Output-1][0].Range_V=sqrt((*trust_track)[i].X[1]*(*trust_track)[i].X[1]+(*trust_track)[i].X[4]*(*trust_track)[i].X[4]); // Trust_Track_Output[*Trust_track_num_Output-1][0].Range_V=static_cast<float>(sqrt((*trust_track)[i].X[1]*(*trust_track)[i].X[1]+(*trust_track)[i].X[4]*(*trust_track)[i].X[4]));
// Trust_Track_Output[*Trust_track_num_Output-1][0].Amplitude=(*trust_track)[i].Amplitude; // Trust_Track_Output[*Trust_track_num_Output-1][0].Amplitude=static_cast<float>((*trust_track)[i].Amplitude);
// Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Point=(*trust_track)[i].point_flag; // Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Point=(*trust_track)[i].point_flag;
// Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Mode=(*trust_track)[i].Track_Mode; // Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Mode=(*trust_track)[i].Track_Mode;
// Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation=asin((*trust_track)[i].Height/r_output)/PI*180; // Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation=static_cast<float>(asin((*trust_track)[i].Height/r_output)/PI*180);
// Trust_Track_Output[*Trust_track_num_Output-1][0].z=(*trust_track)[i].Height+Work_Parameter.Height; // Trust_Track_Output[*Trust_track_num_Output-1][0].z=static_cast<float>((*trust_track)[i].Height+Work_Parameter.Height);
// Trust_Track_Output[*Trust_track_num_Output-1][0].Target_Type=(*trust_track)[i].Target_Type; // Trust_Track_Output[*Trust_track_num_Output-1][0].Target_Type=(*trust_track)[i].Target_Type;
// Trust_Track_Output[*Trust_track_num_Output-1][0].track_snr = (*trust_track)[i].snr_point; // Trust_Track_Output[*Trust_track_num_Output-1][0].track_snr = static_cast<float>((*trust_track)[i].snr_point);
// } // }
// } // }
// } // }
@@ -255,46 +256,61 @@ void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *trust_track
struct RadarPara Work_Parameter, struct RadarPara Work_Parameter,
long long latest_timestamp) long long latest_timestamp)
{ {
if(tas_target_queue[0].empty_flag==1)
{
double H_track = 0;
double X_now[6] = {0};
long long CPI_time = 0; long long CPI_time = 0;
bool found_track = false; long long earliest_CPI_time = LLONG_MAX;
for (int i=0;i<trust_track->size();i++ ) float delta_T = 0;
double H_track = 0;
int earliest_track_idx=-1;
int earliest_tas_queue_idx=-1;
double X_now[6] = {0};
//查找TAS队列中CPI时间最早的目标且满足TAS数据率的目标
for(int tas_idx=0;tas_idx<TAS_QUEUE_LENGTH;tas_idx++)
{ {
if((*trust_track)[i].Track_Index == tas_target_queue[0].Index) if(tas_target_queue[tas_idx].empty_flag==0)
{ {
H_track = (*trust_track)[i].Height; continue;
CPI_time = (*trust_track)[i].T_track; }
for(int ii=0;ii<6;ii++)
X_now[ii]=(*trust_track)[i].X[ii]; for (size_t track_idx=0;track_idx<trust_track->size();track_idx++ )
found_track = true; {
if((*trust_track)[track_idx].Track_Index == tas_target_queue[tas_idx].Index)
{
CPI_time = (*trust_track)[track_idx].T_track;
delta_T = (latest_timestamp - CPI_time) / 1000.0f;
//查找最早的CPI时间, 航迹时间与当前最新时间戳的差值大于 1/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)
{
earliest_CPI_time = CPI_time;
H_track = (*trust_track)[track_idx].Height;
earliest_track_idx = track_idx;
earliest_tas_queue_idx = tas_idx;
for(int ii=0;ii<6;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;
}
} }
} }
if (!found_track) //没有满足条件的TAS目标,关闭跟踪波束
if(earliest_track_idx == -1)
{ {
Tracking_beam->open_flag = 0; Tracking_beam->open_flag = 0;
return; return;
} }
//数据率门控:航迹时间与当前最新时间戳的差值大于 1/DATA_RATE_TAS 时才输出TAS跟踪波束, //更新目标最后跟踪时间
//保证TAS目标数据率不随波束时间变化(使用Work_Parameter中的DATA_RATE_TAS参数值)。 tas_target_queue[earliest_tas_queue_idx].last_track_time = latest_timestamp;
//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;
//预测目标位置 计算跟踪波束波位号 俯仰角 //预测目标位置 计算跟踪波束波位号 俯仰角
double x_track=X_now[0]+X_now[1]*delta_T; double x_track=X_now[0]+X_now[1]*delta_T;
@@ -304,9 +320,9 @@ void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *trust_track
Coor_trans.cart2polar(x_track,y_track,&range,&amzi); Coor_trans.cart2polar(x_track,y_track,&range,&amzi);
//目标距离 //目标距离
Tracking_beam->Range=range; Tracking_beam->Range=(float)range;
//目标方位 //目标方位
Tracking_beam->Azi=amzi/PI*180; Tracking_beam->Azi=(float)amzi/PI*180;
// Tracking_beam->Azi+=6; // Tracking_beam->Azi+=6;
//目标俯仰角 //目标俯仰角
double elev=asin(H_track/range)/PI*180; double elev=asin(H_track/range)/PI*180;
@@ -318,23 +334,16 @@ void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *trust_track
// else // else
// elev=elev; // elev=elev;
Tracking_beam->Elev=elev; Tracking_beam->Elev=(float)elev;
//跟踪波束类型 //跟踪波束类型
Tracking_beam->type=1; Tracking_beam->type=1;
//跟踪目标批号 //跟踪目标批号
Tracking_beam->TAS_track_index = tas_target_queue[0].Index; Tracking_beam->TAS_track_index = earliest_track_idx;
//跟踪波束开关开启 //跟踪波束开关开启
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; //std::cout << "TAS: range: " <<Tracking_beam->Range << "azi: " <<Tracking_beam->Azi <<"pit: " <<Tracking_beam->Elev;
}
else
{
//跟踪波束开关关闭
Tracking_beam->open_flag=0;
}
} }
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef TAS_CTRL_H #ifndef TAS_CTRL_H
#define TAS_CTRL_H #define TAS_CTRL_H
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
#include "parameters.h" #include "parameters.h"
+43 -43
View File
@@ -1,4 +1,4 @@
#include "track_asso.h" #include "track_asso.h"
#include "kalman.h" #include "kalman.h"
#include "coor_trans.h" #include "coor_trans.h"
#include <cmath> #include <cmath>
@@ -20,7 +20,7 @@ int Track_Asso:: track_asso_process(std::vector<PointRecv> *point_
{ {
//取出对应点迹区的点 //取出对应点迹区的点
for (int i=0;i< point_recv->size();i++) for (size_t i=0;i< point_recv->size();i++)
{ {
point_process.push_back((*point_recv)[i]); point_process.push_back((*point_recv)[i]);
int n=point_process.size(); int n=point_process.size();
@@ -51,7 +51,7 @@ int Track_Asso:: track_asso_process(std::vector<PointRecv> *point_
//剩余点重新存入点迹 //剩余点重新存入点迹
std::vector<PointRecv>().swap((*point_recv)); std::vector<PointRecv>().swap((*point_recv));
for (int i=0;i<point_process.size();i++) for (size_t i=0;i<point_process.size();i++)
{ {
(*point_recv).push_back(point_process[i]); (*point_recv).push_back(point_process[i]);
@@ -62,7 +62,7 @@ int Track_Asso:: track_asso_process(std::vector<PointRecv> *point_
std::vector<PointRecv>().swap(point_process); std::vector<PointRecv>().swap(point_process);
//输出航迹 //输出航迹
for (int i=0;i<trust_track->size();i++) for (size_t i=0;i<trust_track->size();i++)
{ // 输出更新航迹条件: { // 输出更新航迹条件:
// if((*trust_track)[i].manual_tracking_flag==0) // if((*trust_track)[i].manual_tracking_flag==0)
// { // {
@@ -76,53 +76,53 @@ int Track_Asso:: track_asso_process(std::vector<PointRecv> *point_
coor_trans Coor_trans; coor_trans Coor_trans;
double r, azi; double r, azi;
Coor_trans.cart2polar(x, y, &r, &azi); Coor_trans.cart2polar(x, y, &r, &azi);
Trust_Track_Output[*Trust_track_num_Output-1][0].Range=r; Trust_Track_Output[*Trust_track_num_Output-1][0].Range=static_cast<float>(r);
Trust_Track_Output[*Trust_track_num_Output-1][0].Azimuth=azi/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][0].Azimuth=static_cast<float>(azi/PI*180);
if((*trust_track)[i].Height<r) if((*trust_track)[i].Height<r)
Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation = asin((*trust_track)[i].Height/r)/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation = static_cast<float>(asin((*trust_track)[i].Height/r)/PI*180);
else else
Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation = (*trust_track)[i].elev_point; Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation = static_cast<float>((*trust_track)[i].elev_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Index=(*trust_track)[i].Track_Index; Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Index=(*trust_track)[i].Track_Index;
Trust_Track_Output[*Trust_track_num_Output-1][0].Range_V = Trust_Track_Output[*Trust_track_num_Output-1][0].Range_V =
sqrt((*trust_track)[i].X[1]*(*trust_track)[i].X[1]+(*trust_track)[i].X[4]*(*trust_track)[i].X[4]); static_cast<float>(sqrt((*trust_track)[i].X[1]*(*trust_track)[i].X[1]+(*trust_track)[i].X[4]*(*trust_track)[i].X[4]));
Trust_Track_Output[*Trust_track_num_Output-1][0].Amplitude = (*trust_track)[i].Amplitude; Trust_Track_Output[*Trust_track_num_Output-1][0].Amplitude = static_cast<float>((*trust_track)[i].Amplitude);
Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Mode=(*trust_track)[i].Track_Mode; Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Mode=(*trust_track)[i].Track_Mode;
Trust_Track_Output[*Trust_track_num_Output-1][0].track_time=(*trust_track)[i].T_track/1000.0; Trust_Track_Output[*Trust_track_num_Output-1][0].track_time=static_cast<float>((*trust_track)[i].T_track/1000.0);
Trust_Track_Output[*Trust_track_num_Output-1][0].GNSS_time=(*trust_track)[i].GNSS_time; Trust_Track_Output[*Trust_track_num_Output-1][0].GNSS_time=(*trust_track)[i].GNSS_time;
Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Point = (*trust_track)[i].point_flag; Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Point = (*trust_track)[i].point_flag;
Trust_Track_Output[*Trust_track_num_Output-1][0].z=(*trust_track)[i].Height+Work_Parameter.Height; Trust_Track_Output[*Trust_track_num_Output-1][0].z=static_cast<float>((*trust_track)[i].Height+Work_Parameter.Height);
double Direction_Angle; double Direction_Angle;
Direction_Angle=atan2((*trust_track)[i].X[4], (*trust_track)[i].X[1]); Direction_Angle=atan2((*trust_track)[i].X[4], (*trust_track)[i].X[1]);
if(Direction_Angle<0){Direction_Angle=Direction_Angle+2*PI;} if(Direction_Angle<0){Direction_Angle=Direction_Angle+2*PI;}
Trust_Track_Output[*Trust_track_num_Output-1][0].Direction_Angle=Direction_Angle/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][0].Direction_Angle=static_cast<float>(Direction_Angle/PI*180);
//关联点信息 //关联点信息
Trust_Track_Output[*Trust_track_num_Output-1][0].range_point=(*trust_track)[i].range_point; Trust_Track_Output[*Trust_track_num_Output-1][0].range_point=static_cast<float>((*trust_track)[i].range_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].azi_point=(*trust_track)[i].azi_point; Trust_Track_Output[*Trust_track_num_Output-1][0].azi_point=static_cast<float>((*trust_track)[i].azi_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].elev_point=(*trust_track)[i].elev_point; Trust_Track_Output[*Trust_track_num_Output-1][0].elev_point=static_cast<float>((*trust_track)[i].elev_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].vr_point=(*trust_track)[i].vr_point; Trust_Track_Output[*Trust_track_num_Output-1][0].vr_point=static_cast<float>((*trust_track)[i].vr_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].point_type=0; Trust_Track_Output[*Trust_track_num_Output-1][0].point_type=0;
Trust_Track_Output[*Trust_track_num_Output-1][0].prf_point = (*trust_track)[i].prf_point; Trust_Track_Output[*Trust_track_num_Output-1][0].prf_point = static_cast<float>((*trust_track)[i].prf_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].track_snr = (*trust_track)[i].snr_point; Trust_Track_Output[*Trust_track_num_Output-1][0].track_snr = static_cast<float>((*trust_track)[i].snr_point);
//直接输出点迹高度-20260605 //直接输出点迹高度-20260605
//Trust_Track_Output[*Trust_track_num_Output-1][0].z = (*trust_track)[i].range_point * sin((*trust_track)[i].elev_point/180.0*PI); //Trust_Track_Output[*Trust_track_num_Output-1][0].z = (*trust_track)[i].range_point * sin((*trust_track)[i].elev_point/180.0*PI);
//输出平滑后的高度 //输出平滑后的高度
Trust_Track_Output[*Trust_track_num_Output-1][0].z = (*trust_track)[i].Height+Work_Parameter.Height; Trust_Track_Output[*Trust_track_num_Output-1][0].z = static_cast<float>((*trust_track)[i].Height+Work_Parameter.Height);
Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation = (*trust_track)[i].elev_point; Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation = static_cast<float>((*trust_track)[i].elev_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].x=(*trust_track)[i].X[0]; Trust_Track_Output[*Trust_track_num_Output-1][0].x=static_cast<float>((*trust_track)[i].X[0]);
Trust_Track_Output[*Trust_track_num_Output-1][0].y=(*trust_track)[i].X[3]; Trust_Track_Output[*Trust_track_num_Output-1][0].y=static_cast<float>((*trust_track)[i].X[3]);
Trust_Track_Output[*Trust_track_num_Output-1][0].v_x=(*trust_track)[i].X[1]; Trust_Track_Output[*Trust_track_num_Output-1][0].v_x=static_cast<float>((*trust_track)[i].X[1]);
Trust_Track_Output[*Trust_track_num_Output-1][0].v_y=(*trust_track)[i].X[4]; Trust_Track_Output[*Trust_track_num_Output-1][0].v_y=static_cast<float>((*trust_track)[i].X[4]);
Trust_Track_Output[*Trust_track_num_Output-1][0].track_rcs = (*trust_track)[i].RCS; Trust_Track_Output[*Trust_track_num_Output-1][0].track_rcs = static_cast<float>((*trust_track)[i].RCS);
Trust_Track_Output[*Trust_track_num_Output-1][0].pitch_num = (*trust_track)[i].pitch_num; Trust_Track_Output[*Trust_track_num_Output-1][0].pitch_num = (*trust_track)[i].pitch_num;
std::memcpy(Trust_Track_Output[*Trust_track_num_Output-1][0].speed_dim, (*trust_track)[i].speed_dim, sizeof(Trust_Track_Output[*Trust_track_num_Output-1][0].speed_dim)); std::memcpy(Trust_Track_Output[*Trust_track_num_Output-1][0].speed_dim, (*trust_track)[i].speed_dim, sizeof(Trust_Track_Output[*Trust_track_num_Output-1][0].speed_dim));
@@ -137,7 +137,7 @@ int Track_Asso:: track_asso_process(std::vector<PointRecv> *point_
void Track_Asso:: model_interaction(std::vector <Trust_Track> *trust_track) void Track_Asso:: model_interaction(std::vector <Trust_Track> *trust_track)
{ {
for (int loop_of_track=0;loop_of_track<trust_track->size();loop_of_track++) for (size_t loop_of_track=0;loop_of_track<trust_track->size();loop_of_track++)
{ {
// if((*trust_track)[loop_of_track].manual_tracking_flag == 0) // if((*trust_track)[loop_of_track].manual_tracking_flag == 0)
@@ -413,13 +413,13 @@ void Track_Asso:: model_filter(std::vector <Trust_Track> *trust_track,struct Ra
std::vector <asso_info> associated_info; std::vector <asso_info> associated_info;
//遍历所有点迹航迹 计算点迹和航迹的统计距离 //遍历所有点迹航迹 计算点迹和航迹的统计距离
for (int loop_of_track = 0; loop_of_track<trust_track->size();loop_of_track++) for (size_t loop_of_track = 0; loop_of_track<trust_track->size();loop_of_track++)
{ {
// if((*trust_track)[loop_of_track].manual_tracking_flag==0) // if((*trust_track)[loop_of_track].manual_tracking_flag==0)
// { // {
(*trust_track)[loop_of_track].point_flag = 0; //航迹的point_flag置为0 关联上点后再置为1 (*trust_track)[loop_of_track].point_flag = 0; //航迹的point_flag置为0 关联上点后再置为1
for (int loop_of_point = 0; loop_of_point<point_process.size();loop_of_point++) for (size_t loop_of_point = 0; loop_of_point<point_process.size();loop_of_point++)
{ {
//时间差 //时间差
@@ -554,8 +554,8 @@ void Track_Asso:: model_filter(std::vector <Trust_Track> *trust_track,struct Ra
associated_info_tmp.d1=d1; associated_info_tmp.d1=d1;
associated_info_tmp.d2=d2; associated_info_tmp.d2=d2;
associated_info_tmp.d3=d3; associated_info_tmp.d3=d3;
associated_info_tmp.point_index=loop_of_point+1; associated_info_tmp.point_index=static_cast<int>(loop_of_point)+1;
associated_info_tmp.track_index=loop_of_track+1; associated_info_tmp.track_index=static_cast<int>(loop_of_track)+1;
if(d1<=d2&&d1<=d3) if(d1<=d2&&d1<=d3)
associated_info_tmp.d_min=d1; associated_info_tmp.d_min=d1;
else if(d2<=d1&& d2<=d3) else if(d2<=d1&& d2<=d3)
@@ -571,7 +571,7 @@ void Track_Asso:: model_filter(std::vector <Trust_Track> *trust_track,struct Ra
//最近邻法关联 //最近邻法关联
int associated_num=associated_info.size(); int associated_num=associated_info.size();
for (int i=0;i<trust_track->size();i++) for (size_t i=0;i<trust_track->size();i++)
{ {
//寻找最小d //寻找最小d
if(associated_num>0) if(associated_num>0)
@@ -650,9 +650,9 @@ void Track_Asso:: model_filter(std::vector <Trust_Track> *trust_track,struct Ra
for (int ii=0;ii<3;ii++) for (int ii=0;ii<3;ii++)
for (int jj=0;jj<3;jj++) for (int jj=0;jj<3;jj++)
{ {
S1_out(ii,jj)=S1[ii][jj]; S1_out(ii,jj)=static_cast<float>(S1[ii][jj]);
S2_out(ii,jj)=S2[ii][jj]; S2_out(ii,jj)=static_cast<float>(S2[ii][jj]);
S3_out(ii,jj)=S3[ii][jj]; S3_out(ii,jj)=static_cast<float>(S3[ii][jj]);
} }
double det_S1=S1_out.determinant(); double det_S1=S1_out.determinant();
double Possibility1=(det_S1>1e-12)?(1.0/sqrt(pow(2*PI,3)*det_S1)*exp(-0.5*d1)):0.0; double Possibility1=(det_S1>1e-12)?(1.0/sqrt(pow(2*PI,3)*det_S1)*exp(-0.5*d1)):0.0;
@@ -755,7 +755,7 @@ void Track_Asso:: model_filter(std::vector <Trust_Track> *trust_track,struct Ra
} }
//未关联上的航迹 进行外推 tws //未关联上的航迹 进行外推 tws
for (int i =0; i<(*trust_track).size();i++ ) for (size_t i =0; i<(*trust_track).size();i++ )
{ {
if((*trust_track)[i].point_flag == 0 && (*trust_track)[i].manual_tracking_flag == 0) if((*trust_track)[i].point_flag == 0 && (*trust_track)[i].manual_tracking_flag == 0)
{ {
@@ -804,8 +804,8 @@ void Track_Asso:: model_filter(std::vector <Trust_Track> *trust_track,struct Ra
memcpy((*trust_track)[i].P2,P2_pred,6*6*sizeof(double)); memcpy((*trust_track)[i].P2,P2_pred,6*6*sizeof(double));
memcpy((*trust_track)[i].P3,P3_pred,6*6*sizeof(double)); memcpy((*trust_track)[i].P3,P3_pred,6*6*sizeof(double));
(*trust_track)[i].T_track = (*trust_track)[i].T_track+delta_T*1000.0; //更新航迹时间 (*trust_track)[i].T_track = static_cast<long long>((*trust_track)[i].T_track+delta_T*1000.0); //更新航迹时间
(*trust_track)[i].GNSS_time = (*trust_track)[i].GNSS_time+delta_T*1000.0; //更新航迹时间 (*trust_track)[i].GNSS_time = static_cast<long long>((*trust_track)[i].GNSS_time+delta_T*1000.0); //更新航迹时间
(*trust_track)[i].Extrapolate_round =(*trust_track)[i].Extrapolate_round+1; //连续未用实点更新时间 (*trust_track)[i].Extrapolate_round =(*trust_track)[i].Extrapolate_round+1; //连续未用实点更新时间
(*trust_track)[i].point_flag=0; //虚点 (*trust_track)[i].point_flag=0; //虚点
} }
@@ -815,7 +815,7 @@ void Track_Asso:: model_filter(std::vector <Trust_Track> *trust_track,struct Ra
void Track_Asso:: model_output(std::vector <Trust_Track> *trust_track) void Track_Asso:: model_output(std::vector <Trust_Track> *trust_track)
{ {
for(int loop_of_track=0; loop_of_track<trust_track->size(); loop_of_track++) for(size_t loop_of_track=0; loop_of_track<trust_track->size(); loop_of_track++)
{ {
// if((*trust_track)[loop_of_track].manual_tracking_flag==0) // if((*trust_track)[loop_of_track].manual_tracking_flag==0)
@@ -919,7 +919,7 @@ void Track_Asso:: track_hight_update(int updata_
) )
{ {
if(updata_track_index<=trust_track->size() && asso_point_index<=point_process.size()) if(updata_track_index<=static_cast<int>(trust_track->size()) && asso_point_index<=static_cast<int>(point_process.size()))
{ {
(*trust_track)[updata_track_index-1].Hight_smooth.push_back(point_process[asso_point_index-1].Height); (*trust_track)[updata_track_index-1].Hight_smooth.push_back(point_process[asso_point_index-1].Height);
@@ -944,10 +944,10 @@ void Track_Asso:: track_hight_update(int updata_
} }
double sum=0; double sum=0;
if((*trust_track)[updata_track_index-1].Hight_smooth.size()<height_win_length) if((*trust_track)[updata_track_index-1].Hight_smooth.size()<static_cast<size_t>(height_win_length))
{ {
for (int i=0;i<(*trust_track)[updata_track_index-1].Hight_smooth.size();i++) for (size_t i=0;i<(*trust_track)[updata_track_index-1].Hight_smooth.size();i++)
{ {
sum=sum+(*trust_track)[updata_track_index-1].Hight_smooth[i]; sum=sum+(*trust_track)[updata_track_index-1].Hight_smooth[i];
@@ -956,7 +956,7 @@ void Track_Asso:: track_hight_update(int updata_
(*trust_track)[updata_track_index-1].Height=sum/(*trust_track)[updata_track_index-1].Hight_smooth.size(); (*trust_track)[updata_track_index-1].Height=sum/(*trust_track)[updata_track_index-1].Hight_smooth.size();
} }
else if((*trust_track)[updata_track_index-1].Hight_smooth.size()>=height_win_length) else if((*trust_track)[updata_track_index-1].Hight_smooth.size()>=static_cast<size_t>(height_win_length))
{ {
int N=(*trust_track)[updata_track_index-1].Hight_smooth.size(); int N=(*trust_track)[updata_track_index-1].Hight_smooth.size();
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef TRACK_ASSO_H #ifndef TRACK_ASSO_H
#define TRACK_ASSO_H #define TRACK_ASSO_H
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
@@ -1,4 +1,4 @@
#include "track_asso_direct_tracking.h" #include "track_asso_direct_tracking.h"
#include "kalman.h" #include "kalman.h"
#include "coor_trans.h" #include "coor_trans.h"
#include <cmath> #include <cmath>
@@ -424,7 +424,7 @@ void Track_Asso_Direct_Tracking::model_filter(Trust_Track *trust_track,
//未关联上,航迹外推 //未关联上,航迹外推
else else
{ {
double delta_T = DATA_RATE_TAS; double delta_T = Work_Parameter.DATA_RATE_TAS/1000.0;
double F[6][6], Q1[6][6], Q2[6][6], Q3[6][6]; double F[6][6], Q1[6][6], Q2[6][6], Q3[6][6];
IMM_F_Q_gen( v_track, delta_T, F, Q1, Q2, Q3,Work_Parameter); IMM_F_Q_gen( v_track, delta_T, F, Q1, Q2, Q3,Work_Parameter);
@@ -1,4 +1,4 @@
#ifndef TRACK_ASSO_DIRECT_TRACKING_H #ifndef TRACK_ASSO_DIRECT_TRACKING_H
#define TRACK_ASSO_DIRECT_TRACKING_H #define TRACK_ASSO_DIRECT_TRACKING_H
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
#include "parameters.h" #include "parameters.h"
+41 -41
View File
@@ -1,4 +1,4 @@
#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 <cmath> #include <cmath>
@@ -20,7 +20,7 @@ long long latest_timestamp //最新时间戳
{ {
//取出点迹 //取出点迹
for (int i=0;i< point_recv_tas->size();i++) for (size_t i=0;i< point_recv_tas->size();i++)
{ {
point_process.push_back((*point_recv_tas)[i]); point_process.push_back((*point_recv_tas)[i]);
} }
@@ -36,7 +36,7 @@ long long latest_timestamp //最新时间戳
std::vector<PointRecv>().swap(point_process); std::vector<PointRecv>().swap(point_process);
//输出航迹 //输出航迹
for (int 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)
{ {
@@ -49,42 +49,42 @@ long long latest_timestamp //最新时间戳
coor_trans Coor_trans; coor_trans Coor_trans;
double r, azi; double r, azi;
Coor_trans.cart2polar(x, y, &r, &azi); Coor_trans.cart2polar(x, y, &r, &azi);
Trust_Track_Output[*Trust_track_num_Output-1][0].Range=r; Trust_Track_Output[*Trust_track_num_Output-1][0].Range=static_cast<float>(r);
Trust_Track_Output[*Trust_track_num_Output-1][0].Azimuth=azi/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][0].Azimuth=static_cast<float>(azi/PI*180);
{ {
double elev_ratio = (r > 0.0) ? (*trust_track)[i].Height / r : 0.0; double elev_ratio = (r > 0.0) ? (*trust_track)[i].Height / r : 0.0;
if (elev_ratio > 1.0) elev_ratio = 1.0; if (elev_ratio > 1.0) elev_ratio = 1.0;
if (elev_ratio < -1.0) elev_ratio = -1.0; if (elev_ratio < -1.0) elev_ratio = -1.0;
Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation = asin(elev_ratio)/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation = static_cast<float>(asin(elev_ratio)/PI*180);
} }
Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Index=(*trust_track)[i].Track_Index; Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Index=(*trust_track)[i].Track_Index;
Trust_Track_Output[*Trust_track_num_Output-1][0].Range_V = Trust_Track_Output[*Trust_track_num_Output-1][0].Range_V =
sqrt((*trust_track)[i].X[1]*(*trust_track)[i].X[1]+(*trust_track)[i].X[4]*(*trust_track)[i].X[4]); static_cast<float>(sqrt((*trust_track)[i].X[1]*(*trust_track)[i].X[1]+(*trust_track)[i].X[4]*(*trust_track)[i].X[4]));
Trust_Track_Output[*Trust_track_num_Output-1][0].Amplitude = (*trust_track)[i].Amplitude; Trust_Track_Output[*Trust_track_num_Output-1][0].Amplitude = static_cast<float>((*trust_track)[i].Amplitude);
Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Mode=(*trust_track)[i].Track_Mode; Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Mode=(*trust_track)[i].Track_Mode;
Trust_Track_Output[*Trust_track_num_Output-1][0].track_time=(*trust_track)[i].T_track/1000.0; Trust_Track_Output[*Trust_track_num_Output-1][0].track_time=static_cast<float>((*trust_track)[i].T_track/1000.0);
Trust_Track_Output[*Trust_track_num_Output-1][0].GNSS_time=(*trust_track)[i].GNSS_time; Trust_Track_Output[*Trust_track_num_Output-1][0].GNSS_time=(*trust_track)[i].GNSS_time;
Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Point = (*trust_track)[i].point_flag; Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Point = (*trust_track)[i].point_flag;
Trust_Track_Output[*Trust_track_num_Output-1][0].z=(*trust_track)[i].Height+Work_Parameter.Height; Trust_Track_Output[*Trust_track_num_Output-1][0].z=static_cast<float>((*trust_track)[i].Height+Work_Parameter.Height);
double Direction_Angle; double Direction_Angle;
Direction_Angle=atan2((*trust_track)[i].X[4], (*trust_track)[i].X[1]); Direction_Angle=atan2((*trust_track)[i].X[4], (*trust_track)[i].X[1]);
if(Direction_Angle<0){Direction_Angle=Direction_Angle+2*PI;} if(Direction_Angle<0){Direction_Angle=Direction_Angle+2*PI;}
Trust_Track_Output[*Trust_track_num_Output-1][0].Direction_Angle=Direction_Angle/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][0].Direction_Angle=static_cast<float>(Direction_Angle/PI*180);
//关联点信息 //关联点信息
Trust_Track_Output[*Trust_track_num_Output-1][0].range_point=(*trust_track)[i].range_point; Trust_Track_Output[*Trust_track_num_Output-1][0].range_point=static_cast<float>((*trust_track)[i].range_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].azi_point=(*trust_track)[i].azi_point; Trust_Track_Output[*Trust_track_num_Output-1][0].azi_point=static_cast<float>((*trust_track)[i].azi_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].elev_point=(*trust_track)[i].elev_point; Trust_Track_Output[*Trust_track_num_Output-1][0].elev_point=static_cast<float>((*trust_track)[i].elev_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].vr_point=(*trust_track)[i].vr_point; Trust_Track_Output[*Trust_track_num_Output-1][0].vr_point=static_cast<float>((*trust_track)[i].vr_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].point_type=1; Trust_Track_Output[*Trust_track_num_Output-1][0].point_type=1;
Trust_Track_Output[*Trust_track_num_Output-1][0].prf_point = (*trust_track)[i].prf_point; Trust_Track_Output[*Trust_track_num_Output-1][0].prf_point = static_cast<float>((*trust_track)[i].prf_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].track_snr = (*trust_track)[i].snr_point; Trust_Track_Output[*Trust_track_num_Output-1][0].track_snr = static_cast<float>((*trust_track)[i].snr_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].x=(*trust_track)[i].X[0]; Trust_Track_Output[*Trust_track_num_Output-1][0].x=static_cast<float>((*trust_track)[i].X[0]);
Trust_Track_Output[*Trust_track_num_Output-1][0].y=(*trust_track)[i].X[3]; Trust_Track_Output[*Trust_track_num_Output-1][0].y=static_cast<float>((*trust_track)[i].X[3]);
Trust_Track_Output[*Trust_track_num_Output-1][0].v_x=(*trust_track)[i].X[1]; Trust_Track_Output[*Trust_track_num_Output-1][0].v_x=static_cast<float>((*trust_track)[i].X[1]);
Trust_Track_Output[*Trust_track_num_Output-1][0].v_y=(*trust_track)[i].X[4]; Trust_Track_Output[*Trust_track_num_Output-1][0].v_y=static_cast<float>((*trust_track)[i].X[4]);
Trust_Track_Output[*Trust_track_num_Output-1][0].track_rcs = (*trust_track)[i].RCS; Trust_Track_Output[*Trust_track_num_Output-1][0].track_rcs = static_cast<float>((*trust_track)[i].RCS);
Trust_Track_Output[*Trust_track_num_Output-1][0].pitch_num = (*trust_track)[i].pitch_num; Trust_Track_Output[*Trust_track_num_Output-1][0].pitch_num = (*trust_track)[i].pitch_num;
std::memcpy(Trust_Track_Output[*Trust_track_num_Output-1][0].speed_dim, (*trust_track)[i].speed_dim, sizeof(Trust_Track_Output[*Trust_track_num_Output-1][0].speed_dim)); std::memcpy(Trust_Track_Output[*Trust_track_num_Output-1][0].speed_dim, (*trust_track)[i].speed_dim, sizeof(Trust_Track_Output[*Trust_track_num_Output-1][0].speed_dim));
@@ -101,7 +101,7 @@ long long latest_timestamp //最新时间戳
void Track_Asso_Tas:: model_interaction( std::vector<Trust_Track> *trust_track, int tas_track_idx) void Track_Asso_Tas:: model_interaction( std::vector<Trust_Track> *trust_track, int tas_track_idx)
{ {
for (int loop_of_track=0;loop_of_track<trust_track->size();loop_of_track++) for (size_t loop_of_track=0;loop_of_track<trust_track->size();loop_of_track++)
{ {
if((*trust_track)[loop_of_track].Track_Index == tas_track_idx) if((*trust_track)[loop_of_track].Track_Index == tas_track_idx)
@@ -238,7 +238,7 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
double r_track = 0; double r_track = 0;
double h_track = 0; double h_track = 0;
bool found_tas_track = false; bool found_tas_track = false;
for (int loop_of_track=0;loop_of_track<trust_track->size();loop_of_track++) for (size_t loop_of_track=0;loop_of_track<trust_track->size();loop_of_track++)
{ {
if((*trust_track)[loop_of_track].Track_Index == tas_track_idx) if((*trust_track)[loop_of_track].Track_Index == tas_track_idx)
{ {
@@ -257,7 +257,7 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
memcpy(P2,(*trust_track)[loop_of_track].P2,6*6*sizeof(double)); memcpy(P2,(*trust_track)[loop_of_track].P2,6*6*sizeof(double));
memcpy(P3,(*trust_track)[loop_of_track].P3,6*6*sizeof(double)); memcpy(P3,(*trust_track)[loop_of_track].P3,6*6*sizeof(double));
T_track = (*trust_track)[loop_of_track].T_track; T_track = static_cast<double>((*trust_track)[loop_of_track].T_track);
v_track = sqrt(pow((*trust_track)[loop_of_track].X[1],2)+pow((*trust_track)[loop_of_track].X[4],2)); v_track = sqrt(pow((*trust_track)[loop_of_track].X[1],2)+pow((*trust_track)[loop_of_track].X[4],2));
r_track = sqrt(pow((*trust_track)[loop_of_track].X[0],2)+pow((*trust_track)[loop_of_track].X[3],2)); r_track = sqrt(pow((*trust_track)[loop_of_track].X[0],2)+pow((*trust_track)[loop_of_track].X[3],2));
h_track = (*trust_track)[loop_of_track].Height; h_track = (*trust_track)[loop_of_track].Height;
@@ -269,7 +269,7 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
return; return;
// 计算量测和航迹统计距离 // 计算量测和航迹统计距离
for (int loop_of_point = 0; loop_of_point<point_process.size();loop_of_point++) for (size_t loop_of_point = 0; loop_of_point<point_process.size();loop_of_point++)
{ {
//量测信息 //量测信息
// double Z[2]={point_process[loop_of_point].Range*cos(point_process[loop_of_point].Azimuth), // double Z[2]={point_process[loop_of_point].Range*cos(point_process[loop_of_point].Azimuth),
@@ -355,7 +355,7 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
associated_info_tmp.d1=d1; associated_info_tmp.d1=d1;
associated_info_tmp.d2=d2; associated_info_tmp.d2=d2;
associated_info_tmp.d3=d3; associated_info_tmp.d3=d3;
associated_info_tmp.point_index=loop_of_point+1; associated_info_tmp.point_index=static_cast<int>(loop_of_point)+1;
if(d1<=d2&&d1<=d3) if(d1<=d2&&d1<=d3)
associated_info_tmp.d_min=d1; associated_info_tmp.d_min=d1;
else if(d2<=d1&& d2<=d3) else if(d2<=d1&& d2<=d3)
@@ -376,12 +376,12 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
//找最近点 //找最近点
int min_index=1; int min_index=1;
double min_d=associated_info[0].d_min; double min_d=associated_info[0].d_min;
for (int ii=0;ii<associated_info.size();ii++) for (size_t ii=0;ii<associated_info.size();ii++)
{ {
if(associated_info[ii].d_min<min_d) if(associated_info[ii].d_min<min_d)
{ {
min_d=associated_info[ii].d_min; min_d=associated_info[ii].d_min;
min_index=ii+1; min_index=static_cast<int>(ii)+1;
} }
} }
int point_index=associated_info[min_index-1].point_index; int point_index=associated_info[min_index-1].point_index;
@@ -413,9 +413,9 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
for (int ii=0;ii<3;ii++) for (int ii=0;ii<3;ii++)
for (int jj=0;jj<3;jj++) for (int jj=0;jj<3;jj++)
{ {
S1_out(ii,jj)=S1[ii][jj]; S1_out(ii,jj)=static_cast<float>(S1[ii][jj]);
S2_out(ii,jj)=S2[ii][jj]; S2_out(ii,jj)=static_cast<float>(S2[ii][jj]);
S3_out(ii,jj)=S3[ii][jj]; S3_out(ii,jj)=static_cast<float>(S3[ii][jj]);
} }
double det_S1=S1_out.determinant(); double det_S1=S1_out.determinant();
double Possibility1=(det_S1>1e-12)?(1.0/sqrt(pow(2*PI,3)*det_S1)*exp(-0.5*d1)):0.0; double Possibility1=(det_S1>1e-12)?(1.0/sqrt(pow(2*PI,3)*det_S1)*exp(-0.5*d1)):0.0;
@@ -425,7 +425,7 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
double Possibility3=(det_S3>1e-12)?(1.0/sqrt(pow(2*PI,3)*det_S3)*exp(-0.5*d3)):0.0; double Possibility3=(det_S3>1e-12)?(1.0/sqrt(pow(2*PI,3)*det_S3)*exp(-0.5*d3)):0.0;
//更新航迹 //更新航迹
for(int 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)
{ {
@@ -496,7 +496,7 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
else else
{ {
for(int 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)
{ {
double delta_T = (latest_timestamp - T_track)/1000.0; double delta_T = (latest_timestamp - T_track)/1000.0;
@@ -517,8 +517,8 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
memcpy((*trust_track)[i].P2,P2_pred,6*6*sizeof(double)); memcpy((*trust_track)[i].P2,P2_pred,6*6*sizeof(double));
memcpy((*trust_track)[i].P3,P3_pred,6*6*sizeof(double)); memcpy((*trust_track)[i].P3,P3_pred,6*6*sizeof(double));
(*trust_track)[i].T_track = (*trust_track)[i].T_track+delta_T*1000.0; //更新航迹时间 (*trust_track)[i].T_track = static_cast<long long>((*trust_track)[i].T_track+delta_T*1000.0); //更新航迹时间
(*trust_track)[i].GNSS_time = (*trust_track)[i].GNSS_time+delta_T*1000.0; //更新航迹时间 (*trust_track)[i].GNSS_time = static_cast<long long>((*trust_track)[i].GNSS_time+delta_T*1000.0); //更新航迹时间
(*trust_track)[i].point_flag=0; //虚点 (*trust_track)[i].point_flag=0; //虚点
(*trust_track)[i].Extrapolate_round =(*trust_track)[i].Extrapolate_round+1; (*trust_track)[i].Extrapolate_round =(*trust_track)[i].Extrapolate_round+1;
} }
@@ -529,7 +529,7 @@ void Track_Asso_Tas::model_filter( std::vector<Trust_Track> *t
void Track_Asso_Tas::model_output(std::vector<Trust_Track> *trust_track, int tas_track_idx ) void Track_Asso_Tas::model_output(std::vector<Trust_Track> *trust_track, int tas_track_idx )
{ {
for(int 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)
{ {
@@ -737,7 +737,7 @@ void Track_Asso_Tas::track_hight_update(int tas_
std::vector<Trust_Track> *trust_track //航迹 std::vector<Trust_Track> *trust_track //航迹
) )
{ {
for(int 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)
{ {
(*trust_track)[i].Hight_smooth.push_back(point_process[asso_point_index-1].Height); (*trust_track)[i].Hight_smooth.push_back(point_process[asso_point_index-1].Height);
@@ -761,10 +761,10 @@ void Track_Asso_Tas::track_hight_update(int tas_
} }
double sum=0; double sum=0;
if((*trust_track)[i].Hight_smooth.size()<height_win_length) if((*trust_track)[i].Hight_smooth.size()<static_cast<size_t>(height_win_length))
{ {
for (int ii=0;ii<(*trust_track)[i].Hight_smooth.size();ii++) for (size_t ii=0;ii<(*trust_track)[i].Hight_smooth.size();ii++)
{ {
sum=sum+(*trust_track)[i].Hight_smooth[ii]; sum=sum+(*trust_track)[i].Hight_smooth[ii];
@@ -773,7 +773,7 @@ void Track_Asso_Tas::track_hight_update(int tas_
(*trust_track)[i].Height=sum/(*trust_track)[i].Hight_smooth.size(); (*trust_track)[i].Height=sum/(*trust_track)[i].Hight_smooth.size();
} }
else if((*trust_track)[i].Hight_smooth.size()>=height_win_length) else if((*trust_track)[i].Hight_smooth.size()>=static_cast<size_t>(height_win_length))
{ {
int N=(*trust_track)[i].Hight_smooth.size(); int N=(*trust_track)[i].Hight_smooth.size();
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef TRACK_ASSO_TAS_H #ifndef TRACK_ASSO_TAS_H
#define TRACK_ASSO_TAS_H #define TRACK_ASSO_TAS_H
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
#include "parameters.h" #include "parameters.h"
+1 -1
View File
@@ -1,4 +1,4 @@
#include "track_die.h" #include "track_die.h"
#include "kalman.h" #include "kalman.h"
#include "coor_trans.h" #include "coor_trans.h"
#include <cmath> #include <cmath>
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef TRACK_DIE_H #ifndef TRACK_DIE_H
#define TRACK_DIE_H #define TRACK_DIE_H
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
#include "parameters.h" #include "parameters.h"
+1 -1
View File
@@ -1,4 +1,4 @@
#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 <iostream> #include <iostream>
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef TRACK_DIE_TAS_H #ifndef TRACK_DIE_TAS_H
#define TRACK_DIE_TAS_H #define TRACK_DIE_TAS_H
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
#include "parameters.h" #include "parameters.h"
@@ -1,4 +1,4 @@
#include "track_index_mangement.h" #include "track_index_mangement.h"
#include <cmath> #include <cmath>
#include <cstring> #include <cstring>
#include <vector> #include <vector>
@@ -30,7 +30,7 @@ int Track_Ind_Mangement ::track_ind_get( std::vector<Trust_Track> *trust_track
{ {
//建立航迹号列表 //建立航迹号列表
int List[MAX_TRACK_INDEX]={0}; int List[MAX_TRACK_INDEX]={0};
for (int i=0;i<trust_track->size();i++) for (size_t i=0;i<trust_track->size();i++)
{ {
int ti = (*trust_track)[i].Track_Index; int ti = (*trust_track)[i].Track_Index;
if (ti >= 1 && ti <= MAX_TRACK_INDEX) if (ti >= 1 && ti <= MAX_TRACK_INDEX)
@@ -1,4 +1,4 @@
#ifndef TRACK_INDEX_MANGEMENT_H #ifndef TRACK_INDEX_MANGEMENT_H
#define TRACK_INDEX_MANGEMENT_H #define TRACK_INDEX_MANGEMENT_H
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
#include "parameters.h" #include "parameters.h"
+37 -71
View File
@@ -1,4 +1,4 @@
#include "track_init.h" #include "track_init.h"
#include "kalman.h" #include "kalman.h"
#include "coor_trans.h" #include "coor_trans.h"
#include <cmath> #include <cmath>
@@ -34,13 +34,13 @@ int Track_Init::track_init_process_logic( std::vector <PointRecv>
// } // }
//取出待起航的点迹数据 //取出待起航的点迹数据
for (int i=0;i<(*point_recv).size();i++) for (size_t i=0;i<(*point_recv).size();i++)
point_process.push_back((*point_recv)[i]); point_process.push_back((*point_recv)[i]);
//临时航迹的buff_round+1 //临时航迹的buff_round+1
for (int i=0;i<temp_track->size();i++) for (size_t i=0;i<temp_track->size();i++)
{ {
for (int j=0;j<(*temp_track)[i].size();j++) for (size_t j=0;j<(*temp_track)[i].size();j++)
{ {
(*temp_track)[i][j].buff_round = (*temp_track)[i][j].buff_round+1; (*temp_track)[i][j].buff_round = (*temp_track)[i][j].buff_round+1;
} }
@@ -71,7 +71,7 @@ int Track_Init::track_init_process_logic( std::vector <PointRecv>
//剩余点重新存入点迹 //剩余点重新存入点迹
std::vector<PointRecv>().swap((*point_recv)); std::vector<PointRecv>().swap((*point_recv));
for (int i=0;i<point_process.size();i++) for (size_t i=0;i<point_process.size();i++)
(*point_recv).push_back(point_process[i]); (*point_recv).push_back(point_process[i]);
//剩余点转为航迹头 //剩余点转为航迹头
@@ -155,9 +155,9 @@ void Track_Init::point_temp_track_asso(std::vector <std::vector<Temp_track>>
}; };
std::vector <Asso_info> asso_info; std::vector <Asso_info> asso_info;
for ( int i=0;i<point_process.size();i++) for ( size_t i=0;i<point_process.size();i++)
{ {
for ( int j=0;j<(*temp_track).size();j++) for ( size_t j=0;j<(*temp_track).size();j++)
{ {
int L = (*temp_track)[j].size(); int L = (*temp_track)[j].size();
@@ -174,7 +174,7 @@ void Track_Init::point_temp_track_asso(std::vector <std::vector<Temp_track>>
double prt = point_process[i].PRF_index; double prt = point_process[i].PRF_index;
double freq_ind = point_process[i].Freq_index; double freq_ind = point_process[i].Freq_index;
double h_point = point_process[i].Height; double h_point = point_process[i].Height;
double T_point = point_process[i].CPI_Time; double T_point = static_cast<double>(point_process[i].CPI_Time);
//航迹信息 //航迹信息
double X[4]; double X[4];
@@ -184,7 +184,7 @@ void Track_Init::point_temp_track_asso(std::vector <std::vector<Temp_track>>
double v_temp_track=(*temp_track)[j][L-1].vr; double v_temp_track=(*temp_track)[j][L-1].vr;
double r_temp_track=(*temp_track)[j][L-1].r; double r_temp_track=(*temp_track)[j][L-1].r;
double h_temp_track=(*temp_track)[j][L-1].height; double h_temp_track=(*temp_track)[j][L-1].height;
double T_track_head = (*temp_track)[j][L-1].T; double T_track_head = static_cast<double>((*temp_track)[j][L-1].T);
double delta_T = (T_point - T_track_head)/1000.0; double delta_T = (T_point - T_track_head)/1000.0;
@@ -221,8 +221,8 @@ void Track_Init::point_temp_track_asso(std::vector <std::vector<Temp_track>>
if(d*d<=TRACK_START_THRESHOLD*TRACK_START_THRESHOLD && alpha<ALPHA_START && vr_point*v_temp_track>0)// && fabs(h_point-h_temp_track )<= r_point*SIGMA_E&& abs(vr_point-v_temp_track)/abs(v_temp_track)<0.8 if(d*d<=TRACK_START_THRESHOLD*TRACK_START_THRESHOLD && alpha<ALPHA_START && vr_point*v_temp_track>0)// && fabs(h_point-h_temp_track )<= r_point*SIGMA_E&& abs(vr_point-v_temp_track)/abs(v_temp_track)<0.8
{ {
struct Asso_info asso_info_tmp; struct Asso_info asso_info_tmp;
asso_info_tmp.point_idx = i+1; asso_info_tmp.point_idx = static_cast<int>(i)+1;
asso_info_tmp.track_idx = j+1; asso_info_tmp.track_idx = static_cast<int>(j)+1;
asso_info_tmp.d = d; asso_info_tmp.d = d;
asso_info.push_back(asso_info_tmp); asso_info.push_back(asso_info_tmp);
(*temp_track)[j][L-1].asso_flag = 1; (*temp_track)[j][L-1].asso_flag = 1;
@@ -235,7 +235,7 @@ void Track_Init::point_temp_track_asso(std::vector <std::vector<Temp_track>>
} }
// temp_track中加入新关联上的临时航迹 // temp_track中加入新关联上的临时航迹
for (int i = 0 ; i<asso_info.size();i++ ) for (size_t i = 0 ; i<asso_info.size();i++ )
{ {
(*temp_track).push_back(std::vector <Temp_track> ()); (*temp_track).push_back(std::vector <Temp_track> ());
@@ -316,10 +316,10 @@ void Track_Init::point_track_head_asso( std::vector <std::vector<Temp_track>>
std::vector <Asso_info> asso_info; std::vector <Asso_info> asso_info;
//关联 //关联
for ( int i=0;i<point_process.size();i++) for ( size_t i=0;i<point_process.size();i++)
{ {
for ( int j=0;j<temp_track->size();j++) for ( size_t j=0;j<temp_track->size();j++)
{ {
if((*temp_track)[j].size()==1 && (*temp_track)[j][0].buff_round >= 2) if((*temp_track)[j].size()==1 && (*temp_track)[j][0].buff_round >= 2)
@@ -332,7 +332,7 @@ void Track_Init::point_track_head_asso( std::vector <std::vector<Temp_track>>
vr_point=point_process[i].Velocity; vr_point=point_process[i].Velocity;
double r_point=point_process[i].Range; double r_point=point_process[i].Range;
double h_point = point_process[i].Height; double h_point = point_process[i].Height;
double T_point = point_process[i].CPI_Time; double T_point = static_cast<double>(point_process[i].CPI_Time);
//航迹信息 //航迹信息
double x_track_head, y_track_head; double x_track_head, y_track_head;
@@ -340,30 +340,7 @@ void Track_Init::point_track_head_asso( std::vector <std::vector<Temp_track>>
y_track_head=(*temp_track)[j][0].X[2]; y_track_head=(*temp_track)[j][0].X[2];
double v_track_head=(*temp_track)[j][0].vr; double v_track_head=(*temp_track)[j][0].vr;
double h_track_head = (*temp_track)[j][0].height; double h_track_head = (*temp_track)[j][0].height;
double T_track_head = (*temp_track)[j][0].T; double T_track_head = static_cast<double>((*temp_track)[j][0].T);
// if(T_track_head == 30675948)
// {
// std::cout << "r_point=" << r_point
// << "h_point=" << h_point
// << "T_point=" << T_point
// << "x_track_head=" << x_track_head
// << "y_track_head=" << y_track_head
// << "v_track_head=" << v_track_head
// << "T_track_head=" << T_track_head;
// }
// if(T_point == 30682320)
// {
// std::cout <<"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
// std::cout << "r_point=" << r_point
// << "h_point=" << h_point
// << "T_point=" << T_point
// << "x_track_head=" << x_track_head
// << "y_track_head=" << y_track_head
// << "v_track_head=" << v_track_head
// << "T_track_head=" << T_track_head;
// }
//距离差 //距离差
double dis = sqrt(pow(x_point-x_track_head,2)+pow(y_point-y_track_head,2)); double dis = sqrt(pow(x_point-x_track_head,2)+pow(y_point-y_track_head,2));
@@ -390,20 +367,9 @@ void Track_Init::point_track_head_asso( std::vector <std::vector<Temp_track>>
&& vr_point*v_track_head>0 ) && vr_point*v_track_head>0 )
{ {
// if(T_track_head == 30675948)
// {
// std::cout << "r_point=" << r_point
// << "h_point=" << h_point
// << "T_point=" << T_point
// << "x_track_head=" << x_track_head
// << "y_track_head=" << y_track_head
// << "v_track_head=" << v_track_head
// << "T_track_head=" << T_track_head;
// }
struct Asso_info asso_info_tmp; struct Asso_info asso_info_tmp;
asso_info_tmp.point_idx = i+1; asso_info_tmp.point_idx = static_cast<int>(i)+1;
asso_info_tmp.track_idx = j+1; asso_info_tmp.track_idx = static_cast<int>(j)+1;
asso_info.push_back(asso_info_tmp); asso_info.push_back(asso_info_tmp);
(*temp_track)[j][0].asso_flag = 1; (*temp_track)[j][0].asso_flag = 1;
point_process[i].Use_Flag = 1; point_process[i].Use_Flag = 1;
@@ -415,7 +381,7 @@ void Track_Init::point_track_head_asso( std::vector <std::vector<Temp_track>>
} }
// temp_track中加入新关联上的临时航迹 // temp_track中加入新关联上的临时航迹
for (int i = 0 ; i<asso_info.size();i++ ) for (size_t i = 0 ; i<asso_info.size();i++ )
{ {
(*temp_track).push_back(std::vector <Temp_track> ()); (*temp_track).push_back(std::vector <Temp_track> ());
@@ -646,19 +612,19 @@ void Track_Init::tmp_track_to_trust_track(std::vector<Trust_Track> *trust_tra
Trust_Track_Output[*Trust_track_num_Output-1][j].Track_Index=index; Trust_Track_Output[*Trust_track_num_Output-1][j].Track_Index=index;
Trust_Track_Output[*Trust_track_num_Output-1][j].Point_Sum=L; Trust_Track_Output[*Trust_track_num_Output-1][j].Point_Sum=L;
Trust_Track_Output[*Trust_track_num_Output-1][j].Range=Track_to_start[i][j].r; Trust_Track_Output[*Trust_track_num_Output-1][j].Range=static_cast<float>(Track_to_start[i][j].r);
Trust_Track_Output[*Trust_track_num_Output-1][j].Azimuth=Track_to_start[i][j].azi/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][j].Azimuth=static_cast<float>(Track_to_start[i][j].azi/PI*180);
{ {
double elev_ratio = (Track_to_start[i][j].r > 0.0) ? Track_to_start[i][j].height / Track_to_start[i][j].r : 0.0; double elev_ratio = (Track_to_start[i][j].r > 0.0) ? Track_to_start[i][j].height / Track_to_start[i][j].r : 0.0;
if (elev_ratio > 1.0) elev_ratio = 1.0; if (elev_ratio > 1.0) elev_ratio = 1.0;
if (elev_ratio < -1.0) elev_ratio = -1.0; if (elev_ratio < -1.0) elev_ratio = -1.0;
Trust_Track_Output[*Trust_track_num_Output-1][j].Elevation=asin(elev_ratio)/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][j].Elevation=static_cast<float>(asin(elev_ratio)/PI*180);
} }
Trust_Track_Output[*Trust_track_num_Output-1][j].Range_V=sqrt(pow(Track_to_start[i][j].X[1],2)+pow(Track_to_start[i][j].X[3],2)); Trust_Track_Output[*Trust_track_num_Output-1][j].Range_V=static_cast<float>(sqrt(pow(Track_to_start[i][j].X[1],2)+pow(Track_to_start[i][j].X[3],2)));
Trust_Track_Output[*Trust_track_num_Output-1][j].z=Track_to_start[i][j].height; Trust_Track_Output[*Trust_track_num_Output-1][j].z=static_cast<float>(Track_to_start[i][j].height);
Trust_Track_Output[*Trust_track_num_Output-1][j].Amplitude=Track_to_start[i][j].Amp; Trust_Track_Output[*Trust_track_num_Output-1][j].Amplitude=static_cast<float>(Track_to_start[i][j].Amp);
Trust_Track_Output[*Trust_track_num_Output-1][j].track_snr = Track_to_start[i][j].snr; Trust_Track_Output[*Trust_track_num_Output-1][j].track_snr = static_cast<float>(Track_to_start[i][j].snr);
Trust_Track_Output[*Trust_track_num_Output-1][j].track_rcs = Track_to_start[i][j].RCS; Trust_Track_Output[*Trust_track_num_Output-1][j].track_rcs = static_cast<float>(Track_to_start[i][j].RCS);
Trust_Track_Output[*Trust_track_num_Output-1][j].pitch_num = Track_to_start[i][j].pitch_num; Trust_Track_Output[*Trust_track_num_Output-1][j].pitch_num = Track_to_start[i][j].pitch_num;
@@ -668,25 +634,25 @@ void Track_Init::tmp_track_to_trust_track(std::vector<Trust_Track> *trust_tra
Direction_Angle=atan2(Track_to_start[i][j].X[3],Track_to_start[i][j].X[1]); Direction_Angle=atan2(Track_to_start[i][j].X[3],Track_to_start[i][j].X[1]);
if(Direction_Angle<0) if(Direction_Angle<0)
Direction_Angle=Direction_Angle+2*PI; Direction_Angle=Direction_Angle+2*PI;
Trust_Track_Output[*Trust_track_num_Output-1][j].Direction_Angle=Direction_Angle/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][j].Direction_Angle=static_cast<float>(Direction_Angle/PI*180);
Trust_Track_Output[*Trust_track_num_Output-1][j].track_time=(Track_to_start[i][j].T)/1000.0; Trust_Track_Output[*Trust_track_num_Output-1][j].track_time=static_cast<float>((Track_to_start[i][j].T)/1000.0);
Trust_Track_Output[*Trust_track_num_Output-1][j].GNSS_time=Track_to_start[i][j].GNSS_time; Trust_Track_Output[*Trust_track_num_Output-1][j].GNSS_time=Track_to_start[i][j].GNSS_time;
Trust_Track_Output[*Trust_track_num_Output-1][j].x=Track_to_start[i][j].X[0]; Trust_Track_Output[*Trust_track_num_Output-1][j].x=static_cast<float>(Track_to_start[i][j].X[0]);
Trust_Track_Output[*Trust_track_num_Output-1][j].v_x=Track_to_start[i][j].X[1]; Trust_Track_Output[*Trust_track_num_Output-1][j].v_x=static_cast<float>(Track_to_start[i][j].X[1]);
Trust_Track_Output[*Trust_track_num_Output-1][j].y=Track_to_start[i][j].X[2]; Trust_Track_Output[*Trust_track_num_Output-1][j].y=static_cast<float>(Track_to_start[i][j].X[2]);
Trust_Track_Output[*Trust_track_num_Output-1][j].v_y=Track_to_start[i][j].X[3]; Trust_Track_Output[*Trust_track_num_Output-1][j].v_y=static_cast<float>(Track_to_start[i][j].X[3]);
Trust_Track_Output[*Trust_track_num_Output-1][j].range_point=Track_to_start[i][j].r; Trust_Track_Output[*Trust_track_num_Output-1][j].range_point=static_cast<float>(Track_to_start[i][j].r);
Trust_Track_Output[*Trust_track_num_Output-1][j].azi_point=Track_to_start[i][j].azi/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][j].azi_point=static_cast<float>(Track_to_start[i][j].azi/PI*180);
{ {
double elev_ratio = (Track_to_start[i][j].r > 0.0) ? Track_to_start[i][j].height / Track_to_start[i][j].r : 0.0; double elev_ratio = (Track_to_start[i][j].r > 0.0) ? Track_to_start[i][j].height / Track_to_start[i][j].r : 0.0;
if (elev_ratio > 1.0) elev_ratio = 1.0; if (elev_ratio > 1.0) elev_ratio = 1.0;
if (elev_ratio < -1.0) elev_ratio = -1.0; if (elev_ratio < -1.0) elev_ratio = -1.0;
Trust_Track_Output[*Trust_track_num_Output-1][j].elev_point=asin(elev_ratio)/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][j].elev_point=static_cast<float>(asin(elev_ratio)/PI*180);
} }
Trust_Track_Output[*Trust_track_num_Output-1][j].vr_point=Track_to_start[i][j].vr; Trust_Track_Output[*Trust_track_num_Output-1][j].vr_point=static_cast<float>(Track_to_start[i][j].vr);
Trust_Track_Output[*Trust_track_num_Output-1][j].point_type=0; Trust_Track_Output[*Trust_track_num_Output-1][j].point_type=0;
Trust_Track_Output[*Trust_track_num_Output-1][j].Flag_Point=1; Trust_Track_Output[*Trust_track_num_Output-1][j].Flag_Point=1;
Trust_Track_Output[*Trust_track_num_Output-1][j].Track_Mode=0;//跟踪模式 TWS 0 Trust_Track_Output[*Trust_track_num_Output-1][j].Track_Mode=0;//跟踪模式 TWS 0
+1 -1
View File
@@ -1,4 +1,4 @@
#ifndef TRACK_INIT_H #ifndef TRACK_INIT_H
#define TRACK_INIT_H #define TRACK_INIT_H
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
#include "track_index_mangement.h" #include "track_index_mangement.h"
@@ -1,4 +1,4 @@
#include "track_init_direct_tracking.h" #include "track_init_direct_tracking.h"
#include "kalman.h" #include "kalman.h"
#include "coor_trans.h" #include "coor_trans.h"
#include <cmath> #include <cmath>
@@ -33,9 +33,9 @@ void Track_Init_Direct_Tracking::point_temp_track_asso(std::vector <std::vector<
}; };
std::vector <Asso_info> asso_info; std::vector <Asso_info> asso_info;
for ( int i=0;i<point_process.size();i++) for ( size_t i=0;i<point_process.size();i++)
{ {
for ( int j=0;j<(*temp_track).size();j++) for ( size_t j=0;j<(*temp_track).size();j++)
{ {
int L = (*temp_track)[j].size(); int L = (*temp_track)[j].size();
@@ -52,7 +52,7 @@ void Track_Init_Direct_Tracking::point_temp_track_asso(std::vector <std::vector<
double prt = point_process[i].PRF_index; double prt = point_process[i].PRF_index;
double freq_ind = point_process[i].Freq_index; double freq_ind = point_process[i].Freq_index;
double h_point = point_process[i].Height; double h_point = point_process[i].Height;
double T_point = point_process[i].CPI_Time; double T_point = static_cast<double>(point_process[i].CPI_Time);
//航迹信息 //航迹信息
double X[4]; double X[4];
@@ -62,7 +62,7 @@ void Track_Init_Direct_Tracking::point_temp_track_asso(std::vector <std::vector<
double v_temp_track=(*temp_track)[j][L-1].vr; double v_temp_track=(*temp_track)[j][L-1].vr;
double r_temp_track=(*temp_track)[j][L-1].r; double r_temp_track=(*temp_track)[j][L-1].r;
double h_temp_track=(*temp_track)[j][L-1].height; double h_temp_track=(*temp_track)[j][L-1].height;
double T_track_head = (*temp_track)[j][L-1].T; double T_track_head = static_cast<double>((*temp_track)[j][L-1].T);
double delta_T = (T_point - T_track_head)/1000.0; double delta_T = (T_point - T_track_head)/1000.0;
@@ -85,8 +85,8 @@ void Track_Init_Direct_Tracking::point_temp_track_asso(std::vector <std::vector<
if(d*d<=TRACK_START_THRESHOLD*TRACK_START_THRESHOLD && alpha<ALPHA_START && vr_point*v_temp_track>0)// && fabs(h_point-h_temp_track )<= r_point*SIGMA_E&& abs(vr_point-v_temp_track)/abs(v_temp_track)<0.8 if(d*d<=TRACK_START_THRESHOLD*TRACK_START_THRESHOLD && alpha<ALPHA_START && vr_point*v_temp_track>0)// && fabs(h_point-h_temp_track )<= r_point*SIGMA_E&& abs(vr_point-v_temp_track)/abs(v_temp_track)<0.8
{ {
struct Asso_info asso_info_tmp; struct Asso_info asso_info_tmp;
asso_info_tmp.point_idx = i+1; asso_info_tmp.point_idx = static_cast<int>(i)+1;
asso_info_tmp.track_idx = j+1; asso_info_tmp.track_idx = static_cast<int>(j)+1;
asso_info.push_back(asso_info_tmp); asso_info.push_back(asso_info_tmp);
(*temp_track)[j][L-1].asso_flag = 1; (*temp_track)[j][L-1].asso_flag = 1;
point_process[i].Use_Flag = 1; point_process[i].Use_Flag = 1;
@@ -97,7 +97,7 @@ void Track_Init_Direct_Tracking::point_temp_track_asso(std::vector <std::vector<
} }
// temp_track中加入新关联上的临时航迹 // temp_track中加入新关联上的临时航迹
for (int i = 0 ; i<asso_info.size();i++ ) for (size_t i = 0 ; i<asso_info.size();i++ )
{ {
(*temp_track).push_back(std::vector <Temp_track> ()); (*temp_track).push_back(std::vector <Temp_track> ());
@@ -175,10 +175,10 @@ void Track_Init_Direct_Tracking::point_track_head_asso( std::vector <std::vector
std::vector <Asso_info> asso_info; std::vector <Asso_info> asso_info;
//关联 //关联
for ( int i=0;i<point_process.size();i++) for ( size_t i=0;i<point_process.size();i++)
{ {
for ( int j=0;j<temp_track->size();j++) for ( size_t j=0;j<temp_track->size();j++)
{ {
if((*temp_track)[j].size()==1 && (*temp_track)[j][0].buff_round >= 2) if((*temp_track)[j].size()==1 && (*temp_track)[j][0].buff_round >= 2)
@@ -191,7 +191,7 @@ void Track_Init_Direct_Tracking::point_track_head_asso( std::vector <std::vector
vr_point=point_process[i].Velocity; vr_point=point_process[i].Velocity;
double r_point=point_process[i].Range; double r_point=point_process[i].Range;
double h_point = point_process[i].Height; double h_point = point_process[i].Height;
double T_point = point_process[i].CPI_Time; double T_point = static_cast<double>(point_process[i].CPI_Time);
//航迹信息 //航迹信息
double x_track_head, y_track_head; double x_track_head, y_track_head;
@@ -199,7 +199,7 @@ void Track_Init_Direct_Tracking::point_track_head_asso( std::vector <std::vector
y_track_head=(*temp_track)[j][0].X[2]; y_track_head=(*temp_track)[j][0].X[2];
double v_track_head=(*temp_track)[j][0].vr; double v_track_head=(*temp_track)[j][0].vr;
double h_track_head = (*temp_track)[j][0].height; double h_track_head = (*temp_track)[j][0].height;
double T_track_head = (*temp_track)[j][0].T; double T_track_head = static_cast<double>((*temp_track)[j][0].T);
//距离差 //距离差
double dis = sqrt(pow(x_point-x_track_head,2)+pow(y_point-y_track_head,2)); double dis = sqrt(pow(x_point-x_track_head,2)+pow(y_point-y_track_head,2));
@@ -225,8 +225,8 @@ void Track_Init_Direct_Tracking::point_track_head_asso( std::vector <std::vector
&& vr_point*v_track_head>0 )//&& fabs(vr_point-v_track_head)/fabs(v_track_head)<0.2 && fabs(h_point-h_track_head)<=r_point*SIGMA_E && vr_point*v_track_head>0 )//&& fabs(vr_point-v_track_head)/fabs(v_track_head)<0.2 && fabs(h_point-h_track_head)<=r_point*SIGMA_E
{ {
struct Asso_info asso_info_tmp; struct Asso_info asso_info_tmp;
asso_info_tmp.point_idx = i+1; asso_info_tmp.point_idx = static_cast<int>(i)+1;
asso_info_tmp.track_idx = j+1; asso_info_tmp.track_idx = static_cast<int>(j)+1;
asso_info.push_back(asso_info_tmp); asso_info.push_back(asso_info_tmp);
(*temp_track)[j][0].asso_flag = 1; (*temp_track)[j][0].asso_flag = 1;
point_process[i].Use_Flag = 1; point_process[i].Use_Flag = 1;
@@ -237,7 +237,7 @@ void Track_Init_Direct_Tracking::point_track_head_asso( std::vector <std::vector
} }
// temp_track中加入新关联上的临时航迹 // temp_track中加入新关联上的临时航迹
for (int i = 0 ; i<asso_info.size();i++ ) for (size_t i = 0 ; i<asso_info.size();i++ )
{ {
(*temp_track).push_back(std::vector <Temp_track> ()); (*temp_track).push_back(std::vector <Temp_track> ());
@@ -370,29 +370,29 @@ void Track_Init_Direct_Tracking::tmp_track_to_trust_track( std::vector<Trust_Tr
Trust_Track_Output[*Trust_track_num_Output-1][j].Track_Index=track_ID; Trust_Track_Output[*Trust_track_num_Output-1][j].Track_Index=track_ID;
Trust_Track_Output[*Trust_track_num_Output-1][j].Point_Sum=L; Trust_Track_Output[*Trust_track_num_Output-1][j].Point_Sum=L;
Trust_Track_Output[*Trust_track_num_Output-1][j].Range=(*Iter)[j].r; Trust_Track_Output[*Trust_track_num_Output-1][j].Range=static_cast<float>((*Iter)[j].r);
Trust_Track_Output[*Trust_track_num_Output-1][j].Azimuth=(*Iter)[j].azi/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][j].Azimuth=static_cast<float>((*Iter)[j].azi/PI*180);
Trust_Track_Output[*Trust_track_num_Output-1][j].Elevation=asin((*Iter)[j].height/(*Iter)[j].r)/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][j].Elevation=static_cast<float>(asin((*Iter)[j].height/(*Iter)[j].r)/PI*180);
Trust_Track_Output[*Trust_track_num_Output-1][j].Range_V=sqrt(pow((*Iter)[j].X[1],2)+pow((*Iter)[j].X[3],2)); Trust_Track_Output[*Trust_track_num_Output-1][j].Range_V=static_cast<float>(sqrt(pow((*Iter)[j].X[1],2)+pow((*Iter)[j].X[3],2)));
Trust_Track_Output[*Trust_track_num_Output-1][j].z=(*Iter)[j].height; Trust_Track_Output[*Trust_track_num_Output-1][j].z=static_cast<float>((*Iter)[j].height);
Trust_Track_Output[*Trust_track_num_Output-1][j].Amplitude=(*Iter)[j].Amp; Trust_Track_Output[*Trust_track_num_Output-1][j].Amplitude=static_cast<float>((*Iter)[j].Amp);
Trust_Track_Output[*Trust_track_num_Output-1][j].track_snr = (*Iter)[j].snr; Trust_Track_Output[*Trust_track_num_Output-1][j].track_snr = static_cast<float>((*Iter)[j].snr);
Trust_Track_Output[*Trust_track_num_Output-1][j].track_rcs = (*Iter)[j].RCS; Trust_Track_Output[*Trust_track_num_Output-1][j].track_rcs = static_cast<float>((*Iter)[j].RCS);
double Direction_Angle; double Direction_Angle;
Direction_Angle=atan2((*Iter)[j].X[3],(*Iter)[j].X[1]); Direction_Angle=atan2((*Iter)[j].X[3],(*Iter)[j].X[1]);
if(Direction_Angle<0) if(Direction_Angle<0)
Direction_Angle=Direction_Angle+2*PI; Direction_Angle=Direction_Angle+2*PI;
Trust_Track_Output[*Trust_track_num_Output-1][j].Direction_Angle=Direction_Angle/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][j].Direction_Angle=static_cast<float>(Direction_Angle/PI*180);
Trust_Track_Output[*Trust_track_num_Output-1][j].track_time=((*Iter)[j].T)/1000.0; Trust_Track_Output[*Trust_track_num_Output-1][j].track_time=static_cast<float>(((*Iter)[j].T)/1000.0);
Trust_Track_Output[*Trust_track_num_Output-1][j].x=(*Iter)[j].X[0]; Trust_Track_Output[*Trust_track_num_Output-1][j].x=static_cast<float>((*Iter)[j].X[0]);
Trust_Track_Output[*Trust_track_num_Output-1][j].v_x=(*Iter)[j].X[1]; Trust_Track_Output[*Trust_track_num_Output-1][j].v_x=static_cast<float>((*Iter)[j].X[1]);
Trust_Track_Output[*Trust_track_num_Output-1][j].y=(*Iter)[j].X[2]; Trust_Track_Output[*Trust_track_num_Output-1][j].y=static_cast<float>((*Iter)[j].X[2]);
Trust_Track_Output[*Trust_track_num_Output-1][j].v_y=(*Iter)[j].X[3]; Trust_Track_Output[*Trust_track_num_Output-1][j].v_y=static_cast<float>((*Iter)[j].X[3]);
Trust_Track_Output[*Trust_track_num_Output-1][j].range_point=(*Iter)[j].r; Trust_Track_Output[*Trust_track_num_Output-1][j].range_point=static_cast<float>((*Iter)[j].r);
Trust_Track_Output[*Trust_track_num_Output-1][j].azi_point=(*Iter)[j].azi/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][j].azi_point=static_cast<float>((*Iter)[j].azi/PI*180);
Trust_Track_Output[*Trust_track_num_Output-1][j].elev_point=asin((*Iter)[j].height/(*Iter)[j].r)/PI*180; Trust_Track_Output[*Trust_track_num_Output-1][j].elev_point=static_cast<float>(asin((*Iter)[j].height/(*Iter)[j].r)/PI*180);
Trust_Track_Output[*Trust_track_num_Output-1][j].vr_point=(*Iter)[j].vr; Trust_Track_Output[*Trust_track_num_Output-1][j].vr_point=static_cast<float>((*Iter)[j].vr);
Trust_Track_Output[*Trust_track_num_Output-1][j].point_type=0; Trust_Track_Output[*Trust_track_num_Output-1][j].point_type=0;
Trust_Track_Output[*Trust_track_num_Output-1][j].Flag_Point=1; Trust_Track_Output[*Trust_track_num_Output-1][j].Flag_Point=1;
Trust_Track_Output[*Trust_track_num_Output-1][j].Track_Mode=1;//跟踪模式 TWS 0 Trust_Track_Output[*Trust_track_num_Output-1][j].Track_Mode=1;//跟踪模式 TWS 0
@@ -1,4 +1,4 @@
#ifndef TRACK_INIT_DIRECT_TRACKING_H #ifndef TRACK_INIT_DIRECT_TRACKING_H
#define TRACK_INIT_DIRECT_TRACKING_H #define TRACK_INIT_DIRECT_TRACKING_H
#include "data_process_class_dll.h" #include "data_process_class_dll.h"
#include "parameters.h" #include "parameters.h"
+2 -1
View File
@@ -2,6 +2,7 @@
## 概述 ## 概述
<!-- 过时信息
本次主要修改TAS波束控制逻辑, 本次主要修改TAS波束控制逻辑,
原有逻辑为: 原有逻辑为:
- 维护一个tas_target_queue队列,队列中每个元素可以保存一个TAS跟踪目标 - 维护一个tas_target_queue队列,队列中每个元素可以保存一个TAS跟踪目标
@@ -16,4 +17,4 @@
- 每次调用Beam_Ctrl()函数时,判断队列首个元素是否为空(empty_flag),若不为空,则再判断目标的航迹时间(T_track)和当前最新时间戳(latest_timestamp)的差值,若差值大于1 / DATA_RATE_TAS,则输出TAS跟踪波束信息,否则不输出 - 每次调用Beam_Ctrl()函数时,判断队列首个元素是否为空(empty_flag),若不为空,则再判断目标的航迹时间(T_track)和当前最新时间戳(latest_timestamp)的差值,若差值大于1 / DATA_RATE_TAS,则输出TAS跟踪波束信息,否则不输出
- 将队列进行循环移位,队列第一个目标移动至队尾,下一次Beam_Ctrl()调用将会跟踪下一个目标 - 将队列进行循环移位,队列第一个目标移动至队尾,下一次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宏定义值。 注意:在RadarPara结构体中新增一项:DATA_RATE_TAS(TAS模式数据率),由dll调用者输入该参数的值(track_process_parameters_initial()),上述逻辑中DATA_RATE_TAS使用Work_Parameter中的DATA_RATE_TAS参数值,而不是使用parameters.h中的DATA_RATE_TAS宏定义值。 -->