更新:1、增加航迹指纹计算,TAS控制命令下发航迹指纹,不再下发批号,实现TAS正常回放;
Signed-off-by: waiwaylee <waiwaylee@foxmail.com>
This commit is contained in:
@@ -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 //最新时间戳
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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; //方位
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
@@ -648,6 +631,9 @@ void Track_Init::tmp_track_to_trust_track(std::vector<Trust_Track> *trust_tra
|
|||||||
Trust_Track trust_track_tmp = {};
|
Trust_Track trust_track_tmp = {};
|
||||||
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;
|
||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user