diff --git a/data_process_class_dll/data_process_class_dll.h b/data_process_class_dll/data_process_class_dll.h index 6847416..f8b3a4e 100644 --- a/data_process_class_dll/data_process_class_dll.h +++ b/data_process_class_dll/data_process_class_dll.h @@ -51,6 +51,7 @@ struct DATA_PROCESS_CLASS_DLLSHARED_EXPORT Track float Elevation; //俯仰 float Range_V; //速度 float Amplitude; //幅度 + float Quality; //航迹质量 int Track_Index; //航迹号 int Point_Sum; //本条航迹更新点的数目 int Flag_Direction; //方向标志1靠近/0远离 diff --git a/data_process_class_dll/parameters.h b/data_process_class_dll/parameters.h index b6e56a7..7251442 100644 --- a/data_process_class_dll/parameters.h +++ b/data_process_class_dll/parameters.h @@ -49,8 +49,21 @@ //#define MECHANICAL_SCANNING //#define PHASE_SCANNING +/******************************通用数据处理参数**************************************/ +//航迹质量管理参数 +#define TRACK_QUALITY_MAX 100 +#define TRACK_QUALITY_MIN 0 +#define TRACK_QUALITY_D_WEIGHT 0.5 +#define TRACK_QUALITY_SNR_WEIGHT 0.3 +#define TRACK_QUALITY_LEN_WEIGHT 0.2 +#define TRACK_QUALITY_ITER_COEFF 0.8 +#define TRACK_QUALITY_DECREASE_COEFF 0.01 + +//航迹起批质量条件 +#define TRACK_START_QUALITY 0.5 + #ifdef MECHANICAL_SCANNING -/******************************数据处理参数**************************************/ +/******************************机扫数据处理参数**************************************/ // #define DATA_RATE_TAS 0.0625 #define SIGMA_R 10.0 //测量误差 @@ -101,7 +114,7 @@ #ifdef PHASE_SCANNING -/******************************数据处理参数**************************************/ +/******************************相扫数据处理参数**************************************/ // #define DATA_RATE_TAS 0.3 #define SIGMA_R 10.0 //测量误差 diff --git a/data_process_class_dll/struct.h b/data_process_class_dll/struct.h index f1f91b6..b2fd65b 100644 --- a/data_process_class_dll/struct.h +++ b/data_process_class_dll/struct.h @@ -46,17 +46,21 @@ struct Trust_Track int Track_Index; //航迹号 double Range; //距离 - double Azimuth; //方位 - double Elevation; //俯仰 + double Azimuth; //方位 + double Elevation; //俯仰 double Velocity; //航向速度 double Amplitude; //幅度 double Height; //高度 + double RCS; //RCS + double Quality; //航迹质量 - long long T_track; //航迹时间 + long long T_track; //航迹时间 long long GNSS_time; //GNSS时间 int Track_Sum; //航迹总数 int Point_Index; //该航迹上的第几个点 + int Point_sum; //本条航迹更新点的数目 + int Valid_point_sum; //本条航迹有效点的数目 int Track_Mode; //跟踪模式 int Track_Update_Flag; //航迹更新标志 1已更新/0未更新 @@ -87,8 +91,6 @@ struct Trust_Track float amp_asv_point; //关联上的点迹信息(归一化幅度) float prn_fftn_point; //点迹速度维FFT点数 - double RCS; - int pitch_num; // 俯仰波位号 float speed_dim[129]; // 目标的十字星数据,目标点速度维129个点 float range_dim[8]; // 目标的十字星数据,目标点距离维8个点 @@ -122,6 +124,7 @@ struct Temp_track double SNR; //信噪比 double RCS; //RCS double amplitude; //幅度 + double quality; //航迹质量 long long CPI_time; //时间戳 long long GNSS_time; //GNSS时间戳 diff --git a/data_process_class_dll/track_asso.cpp b/data_process_class_dll/track_asso.cpp index 2deab69..d7001f4 100644 --- a/data_process_class_dll/track_asso.cpp +++ b/data_process_class_dll/track_asso.cpp @@ -100,6 +100,7 @@ int Track_Asso:: track_asso_process(std::vector *point_ 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].z=static_cast((*trust_track)[i].Height+Work_Parameter.Height); + Trust_Track_Output[*Trust_track_num_Output-1][0].Quality = static_cast((*trust_track)[i].Quality * TRACK_QUALITY_MAX); double Direction_Angle; Direction_Angle=atan2((*trust_track)[i].X[4], (*trust_track)[i].X[1]); @@ -656,6 +657,14 @@ void Track_Asso:: model_filter(std::vector *trust_track,struct Ra (*trust_track)[track_index-1].P3[ii][jj]=P3_filter[ii][jj]; } + //计算航迹质量 + double d_tmp = exp(-associated_info[min_index-1].d_min); + double snr_tmp = 1/(1+exp(-(point_process[point_index-1].SNR - 16) / 1.2)); + double len_tmp = 1/(1+exp(-((*trust_track)[track_index-1].Valid_point_sum - 4) / 1.2)) * 0.5 + (1 - (*trust_track)[track_index-1].Valid_point_sum / (*trust_track)[track_index-1].Point_sum) * 0.5; + double tq_tmp = TRACK_QUALITY_D_WEIGHT * d_tmp + TRACK_QUALITY_SNR_WEIGHT * snr_tmp + TRACK_QUALITY_LEN_WEIGHT * len_tmp; + + (*trust_track)[track_index-1].Quality = (*trust_track)[track_index-1].Quality * TRACK_QUALITY_ITER_COEFF + tq_tmp * (1 - TRACK_QUALITY_ITER_COEFF); + //更新航迹时间 (*trust_track)[track_index-1].T_track = point_process[point_index-1].CPI_time; (*trust_track)[track_index-1].GNSS_time = point_process[point_index-1].GNSS_time; @@ -688,6 +697,8 @@ void Track_Asso:: model_filter(std::vector *trust_track,struct Ra (*trust_track)[track_index-1].point_flag=1; //实点 (*trust_track)[track_index-1].associate_point_number = (*trust_track)[track_index-1].associate_point_number+1; //关联点数+1 (*trust_track)[track_index-1].Track_Update_Flag = 1; //航迹更新标志 + (*trust_track)[track_index-1].Point_sum = (*trust_track)[track_index-1].Point_sum + 1; + (*trust_track)[track_index-1].Valid_point_sum = (*trust_track)[track_index-1].Valid_point_sum + 1; } //删除associated_info中关联上的航迹 点迹信息 @@ -778,6 +789,7 @@ void Track_Asso:: model_filter(std::vector *trust_track,struct Ra memcpy((*trust_track)[i].P2,P2_pred,6*6*sizeof(double)); memcpy((*trust_track)[i].P3,P3_pred,6*6*sizeof(double)); + (*trust_track)[i].circle_id++; (*trust_track)[i].T_track = static_cast((*trust_track)[i].T_track+delta_T*1000.0); //更新航迹时间 (*trust_track)[i].GNSS_time = static_cast((*trust_track)[i].GNSS_time+delta_T*1000.0); //更新航迹时间 (*trust_track)[i].Extrapolate_round =(*trust_track)[i].Extrapolate_round+1; //连续未用实点更新时间 @@ -788,9 +800,13 @@ void Track_Asso:: model_filter(std::vector *trust_track,struct Ra (*trust_track)[i].point_flag=0; //虚点 (*trust_track)[i].Track_Update_Flag = 0; //航迹更新标志 } + + //航迹质量递减 + (*trust_track)[i].Quality -= (*trust_track)[i].Extrapolate_round * TRACK_QUALITY_DECREASE_COEFF; + (*trust_track)[i].Quality = (*trust_track)[i].Quality < 0.0 ? 0.0 : (*trust_track)[i].Quality; + (*trust_track)[i].Point_sum = (*trust_track)[i].Point_sum + 1; } } - } void Track_Asso:: model_output(std::vector *trust_track) diff --git a/data_process_class_dll/track_init.cpp b/data_process_class_dll/track_init.cpp index 9733374..59ca8d8 100644 --- a/data_process_class_dll/track_init.cpp +++ b/data_process_class_dll/track_init.cpp @@ -452,16 +452,48 @@ void Track_Init::tmp_track_to_trust_track(std::vector *trust_tra double range=(*Iter)[L-1].r; double azi=(*Iter)[L-1].azi/PI*180; - //(已停用)1km以内,SNR小于20dB的临时航迹不转为可靠航迹 - // bool snr_flag = true; - // for(int p_idx = 0; p_idx < L; p_idx++){ - // if((*Iter)[p_idx].r < 1000 && (*Iter)[p_idx].snr < 20){ - // snr_flag = false; - // break; - // } - // } + //计算航迹初始质量 + double average_snr = 0; + for(int i=0;i=Work_Parameter.track_start_point_num)&& track_init_prohibit(range,azi,Work_Parameter)==0) //按长度查找TRUST_TRACK_POINT + //航迹起批条件判断 + bool track_init_flag = true; + + //航迹长度大于10点,不起批 + if(L > 10){ + track_init_flag = false; + } + + //航迹长度小于起始点数,不起批 + if(L < Work_Parameter.track_start_point_num){ + track_init_flag = false; + } + + //航迹起批禁止区域判断 + if(track_init_prohibit(range,azi,Work_Parameter)!=0) + { + track_init_flag = false; + } + + //TODO: 航迹质量起批条件判断 + + + //TODO: 杂波密度判断 + + if(track_init_flag) { //加入Track_to_start中 Track_to_start.push_back(std::vector ()); @@ -576,6 +608,9 @@ void Track_Init::tmp_track_to_trust_track(std::vector *trust_tra trust_track_tmp.associate_point_number = 0; trust_track_tmp.manual_tracking_flag = 0; trust_track_tmp.point_type = 0; + trust_track_tmp.Quality = Track_to_start[i][L-1].quality; + trust_track_tmp.Point_sum = L; + trust_track_tmp.Valid_point_sum = L; trust_track_tmp.u[0]=0.3333; trust_track_tmp.u[1]=0.3333; trust_track_tmp.u[2]=0.3333; @@ -612,6 +647,7 @@ void Track_Init::tmp_track_to_trust_track(std::vector *trust_tra Trust_Track_Output[*Trust_track_num_Output-1][j].Amplitude=static_cast(Track_to_start[i][j].amplitude); Trust_Track_Output[*Trust_track_num_Output-1][j].track_snr = static_cast(Track_to_start[i][j].SNR); Trust_Track_Output[*Trust_track_num_Output-1][j].track_rcs = static_cast(Track_to_start[i][j].RCS); + Trust_Track_Output[*Trust_track_num_Output-1][j].Quality = static_cast(Track_to_start[i][j].quality * TRACK_QUALITY_MAX); Trust_Track_Output[*Trust_track_num_Output-1][j].pitch_num = Track_to_start[i][j].pitch_num;