更新:1、增加航迹指纹计算,TAS控制命令下发航迹指纹,不再下发批号,实现TAS正常回放;

Signed-off-by: waiwaylee <waiwaylee@foxmail.com>
This commit is contained in:
2026-10-29 14:24:00 +08:00
parent 24ce1e6dbf
commit 0f3da9994c
6 changed files with 72 additions and 25 deletions
+13 -5
View File
@@ -97,11 +97,8 @@ int Data_Process::data_preprocess(struct DataRev Data_Input[150])
} }
else if(Data_Input[0].point_type == 1) //tas数据 else if(Data_Input[0].point_type == 1) //tas数据
{ {
// std::cout << "TAS TARGET :" <<Data_Input[0].TAS_track_index;
//std::cout << "TAS time :" <<Data_Input[0].CPI_time;
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_fingerprint = Data_Input[0].TAS_track_index;
#ifdef RDP_RECORD_ENABLE #ifdef RDP_RECORD_ENABLE
//记录输入点迹:处理线程内先收集源结构体,循环结束后一次入队(构造实体与写库由记录写线程完成) //记录输入点迹:处理线程内先收集源结构体,循环结束后一次入队(构造实体与写库由记录写线程完成)
std::vector<PointRecv> rec_points; std::vector<PointRecv> rec_points;
@@ -209,6 +206,17 @@ int model)
*Trust_track_num_Output=0; //航迹更新数 *Trust_track_num_Output=0; //航迹更新数
*Track_die_num_Output=0; //航迹消亡数目 *Track_die_num_Output=0; //航迹消亡数目
//查找指定指纹的Track_idx
int tas_track_idx = -1;
for(auto& t : trust_track){
if(t.Track_fingerprint == TAS_track_fingerprint){
tas_track_idx = t.Track_Index;
t.manual_tracking_flag = 1;
t.Track_Mode = 1;
break;
}
}
dot_coh_tas.dot_coh_tas_process(&Data_buffer_tas,&point_recv_tas); //点迹凝聚 dot_coh_tas.dot_coh_tas_process(&Data_buffer_tas,&point_recv_tas); //点迹凝聚
std::vector<PointRecv>().swap(Data_buffer_tas);//凝聚完毕 清除Data_buffer std::vector<PointRecv>().swap(Data_buffer_tas);//凝聚完毕 清除Data_buffer
@@ -217,7 +225,7 @@ int model)
&trust_track, //航迹文件 &trust_track, //航迹文件
Trust_Track_Output, //更新航迹信息 Trust_Track_Output, //更新航迹信息
Trust_track_num_Output, //更新航迹数 Trust_track_num_Output, //更新航迹数
TAS_track_idx, tas_track_idx,
latest_timestamp //最新时间戳 latest_timestamp //最新时间戳
); );
+1 -1
View File
@@ -90,7 +90,7 @@ private:
int beam_index[3]; //3个波位号(当前帧) int beam_index[3]; //3个波位号(当前帧)
int TAS_track_idx; //TAS数据的目标批号 int TAS_track_fingerprint; //TAS数据的目标批号
int Track_Mode; //跟踪模式 1TAS 0TWS int Track_Mode; //跟踪模式 1TAS 0TWS
+1
View File
@@ -44,6 +44,7 @@ struct Trust_Track
long long circle_id; //处理圈数ID long long circle_id; //处理圈数ID
int Track_Index; //航迹号 int Track_Index; //航迹号
int Track_fingerprint; //航迹指纹
double Range; //距离 double Range; //距离
double Azimuth; //方位 double Azimuth; //方位
+2 -2
View File
@@ -300,10 +300,10 @@ void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *trust_track
Tracking_beam->type=rdp_parameter.default_track_beam_type; Tracking_beam->type=rdp_parameter.default_track_beam_type;
//跟踪目标批号 //跟踪目标批号
Tracking_beam->TAS_track_index = (*trust_track)[earliest_track_idx].Track_Index; Tracking_beam->TAS_track_index = (*trust_track)[earliest_track_idx].Track_fingerprint;
//跟踪波束开关开启 //跟踪波束开关开启
Tracking_beam->open_flag=1; Tracking_beam->open_flag=1;
//RDP_LOG_DEBUG("TAS <{}> output: range: {} azi: {} pit: {}", (*trust_track)[earliest_track_idx].Track_Index, Tracking_beam->Range, Tracking_beam->Azi, Tracking_beam->Elev); // RDP_LOG_INFO("TAS <{}> output: range: {} azi: {} pit: {}", Tracking_beam->TAS_track_index, Tracking_beam->Range, Tracking_beam->Azi, Tracking_beam->Elev);
} }
+48 -17
View File
@@ -484,23 +484,6 @@ void Track_Init::tmp_track_to_trust_track(std::vector<Trust_Track> *trust_tra
double azi=(*Iter)[L-1].azi/PI*180; double azi=(*Iter)[L-1].azi/PI*180;
double quality = (*Iter)[L-1].quality; double quality = (*Iter)[L-1].quality;
// //计算航迹初始质量
// double average_snr = 0;
// for(int i=0;i<L;i++)
// {
// average_snr += (*Iter)[i].SNR;
// }
// average_snr /= L;
// double snr_tmp = 1/(1+exp(-(average_snr - 16) / 1.2));
// double &d = (*Iter)[L-1].d;
// double d_tmp = exp(-d);
// double quality_tmp = d_tmp * rdp_parameter.track_quality_d_weight + snr_tmp * rdp_parameter.track_quality_snr_weight;
// quality_tmp /= (rdp_parameter.track_quality_d_weight + rdp_parameter.track_quality_snr_weight);
// for(int i=0;i<L;i++)
// {
// (*Iter)[i].quality = quality_tmp;
// }
//航迹起批条件判断 //航迹起批条件判断
bool track_init_flag = true; bool track_init_flag = true;
@@ -649,6 +632,9 @@ void Track_Init::tmp_track_to_trust_track(std::vector<Trust_Track> *trust_tra
memcpy(trust_track_tmp.X, X, 6*sizeof(double)); memcpy(trust_track_tmp.X, X, 6*sizeof(double));
memcpy(trust_track_tmp.P, P, 6*6*sizeof(double)); memcpy(trust_track_tmp.P, P, 6*6*sizeof(double));
//计算航迹指纹
trust_track_tmp.Track_fingerprint = computeFingerprint(Track_to_start[i][L-1].r, Track_to_start[i][L-1].azi, Track_to_start[i][L-1].vr, Track_to_start[i][L-1].RCS, Track_to_start[i][L-1].CPI_time);
trust_track_tmp.track_id = Track_to_start[i][L-1].temp_track_id; trust_track_tmp.track_id = Track_to_start[i][L-1].temp_track_id;
trust_track_tmp.point_id = Track_to_start[i][L-1].point_id; trust_track_tmp.point_id = Track_to_start[i][L-1].point_id;
trust_track_tmp.circle_id = Track_to_start[i][L-1].circle_id; trust_track_tmp.circle_id = Track_to_start[i][L-1].circle_id;
@@ -794,6 +780,51 @@ int Track_Init::track_init_prohibit(double r, double azi)
} }
uint64_t Track_Init::mix64(uint64_t x) {
x ^= x >> 30; x *= 0xBF58476D1CE4E5B9ULL;
x ^= x >> 27; x *= 0x94D049BB133111EBULL;
x ^= x >> 31;
return x;
}
uint64_t Track_Init::quantize(double v, double scale) {
if (std::isnan(v)) return 0x9E3779B97F4A7C15ULL;
if (std::isinf(v))
return v > 0 ? 0x2C08A6D5E3F1B907ULL : 0xD5E3F1B9072C08A6ULL;
double q = std::round(v * scale); // half away from zero
constexpr double kLim = 9.0e18; // < 2^63,避免转 int64 溢出
if (q > kLim) q = kLim;
if (q < -kLim) q = -kLim;
return static_cast<uint64_t>(static_cast<int64_t>(q));
}
uint64_t Track_Init::bits_of(double v) {
if (std::isnan(v)) return 0x7FF8000000000000ULL;
if (v == 0.0) return 0ULL;
uint64_t b;
std::memcpy(&b, &v, sizeof(b));
return b;
}
uint16_t Track_Init::fold16(uint64_t h) {
h ^= h >> 32;
h ^= h >> 16;
return static_cast<uint16_t>(h);
}
uint16_t Track_Init::computeFingerprint(double r, double azi, double vr, double RCS,
long long CPI_time)
{
uint64_t h = kSeed;
h = mix64(h ^ quantize(r, 100.0)); // 距离:保留 0.01 m
h = mix64(h ^ quantize(azi, 1000.0)); // 方位:保留 0.001°
h = mix64(h ^ quantize(vr, 100.0)); // 径向速度:保留 0.01 m/s
h = mix64(h ^ quantize(RCS, 10.0)); // RCS:保留 0.1 dBsm
h = mix64(h ^ static_cast<uint64_t>(CPI_time));
return fold16(h);
}
Track_Init::Track_Init() Track_Init::Track_Init()
{ {
+7
View File
@@ -45,6 +45,13 @@ private:
int track_init_prohibit(double r, double azi); //判断目标是否位于航迹起始屏蔽区 是返回1 否返回0 int track_init_prohibit(double r, double azi); //判断目标是否位于航迹起始屏蔽区 是返回1 否返回0
const uint64_t kSeed = 0x243F6A8885A308D3ULL;
uint64_t mix64(uint64_t x); // splitmix64 混合函数:对任意 64bit 输入产生雪崩均匀的 64bit 输出
uint64_t quantize(double v, double scale); // 量化:把 double 映射到整数域,可容忍 ±0.5/scale 的浮点噪声
uint64_t bits_of(double v); // bit-exact:直接使用 IEEE754 位模式(-0.0 归一为 +0.0,NaN 归一)
uint16_t fold16(uint64_t h); // 把 64bit 折叠成 16bit,充分使用全部熵
uint16_t computeFingerprint(double r, double azi, double vr, double RCS, long long CPI_time); //计算航迹指纹
Track_Ind_Mangement track_index_mangement; Track_Ind_Mangement track_index_mangement;
}; };