更新:1、修复配置文件加载时范围判断错误导致参数加载失败的问题;

2、新增4份配置文件;
3、修复单跟踪模式下,会偶尔发送TWS波束的问题;
4、新增手动取消目标TAS跟踪时输出航迹更新信息,修复手动取消目标TAS跟踪航迹状态不更新的问题;
5、新增用户操作日志输出;

Signed-off-by: waiwaylee <waiwaylee@foxmail.com>
This commit is contained in:
2026-10-30 16:40:54 +08:00
parent 80193c5e4c
commit c77b6c239e
12 changed files with 763 additions and 73 deletions
+10 -6
View File
@@ -209,9 +209,8 @@ int model)
//查找指定指纹的Track_idx
int tas_track_idx = -1;
for(auto& t : trust_track){
if(t.Track_fingerprint == TAS_track_fingerprint){
if(t.Track_fingerprint == TAS_track_fingerprint && t.manual_untracking_flag == 0){
tas_track_idx = t.Track_Index;
t.manual_tracking_flag = 1;
t.Track_Mode = 1;
break;
}
@@ -284,6 +283,8 @@ int Data_Process::track_clear_all(void)
tas_ctrl.reset();
last_beam_num = INT_MAX;
RDP_LOG_INFO("All track clear");
return 0;
}
@@ -299,7 +300,7 @@ int Data_Process:: track_delete(int delete_track_num, //手动
{
trust_track[j].manual_delete_flag=1;
// RDP_LOG_DEBUG("Delete : {}", trust_track[j].Track_Index);
RDP_LOG_INFO("Track <{}> deleted by user", trust_track[j].Track_Index);
}
}
@@ -316,7 +317,7 @@ int Data_Process::primary_target_add(int track_index)
if(trust_track[i].Track_Index==track_index)
{
trust_track[i].primary_target_flag = 1;
//std::cout<< "Add primary target :" << trust_track[i].Track_Index << std::endl;
RDP_LOG_INFO("Track <{}> is set as a primary target by the user", trust_track[i].Track_Index);
break;
}
}
@@ -332,7 +333,7 @@ int Data_Process::primary_target_cancel(int track_index)
if(trust_track[i].Track_Index==track_index)
{
trust_track[i].primary_target_flag = 0;
//std::cout<< "Cancel primary target :" << trust_track[i].Track_Index << std::endl;
RDP_LOG_INFO("Track <{}> has been cancelled as a primary target by the user", trust_track[i].Track_Index);
break;
}
}
@@ -348,6 +349,8 @@ int Data_Process:: tracking_start(int track_index) //需要手动
if(trust_track[i].Track_Index==track_index)
{
trust_track[i].manual_tracking_flag = 1;
trust_track[i].manual_untracking_flag = 0;
RDP_LOG_INFO("Track <{}> is set to tracking mode by the user", trust_track[i].Track_Index);
break;
}
}
@@ -363,7 +366,8 @@ int Data_Process:: tracking_stop(int track_index) //需要手动转
if(trust_track[i].Track_Index==track_index)
{
trust_track[i].manual_tracking_flag = 0;
trust_track[i].Track_Mode = 0;
trust_track[i].manual_untracking_flag = 1;
RDP_LOG_INFO("Track <{}> has been canceled from tracking mode by the user", trust_track[i].Track_Index);
break;
}
}
@@ -366,8 +366,8 @@ bool validate_parameter(const RDP_parameter& p, LoadContext& ctx)
return ctx.fail("参数 radar_system_delay 不能为负");
if (!(p.data_rate_tws > 0.0f))
return ctx.fail("参数 data_rate_tws 必须大于 0");
if (!(p.data_rate_tas > 0.0f))
return ctx.fail("参数 data_rate_tas 必须大于 0");
if (p.data_rate_tas < 0.0f)
return ctx.fail("参数 data_rate_tas 不能为负(0 表示不做 DLL 内部 TAS 波束限速,由宿主调用频率决定)");
if (p.data_rate_track_only < 0.0f)
return ctx.fail("参数 data_rate_track_only 不能为负");
+1
View File
@@ -74,6 +74,7 @@ struct Trust_Track
int manual_delete_flag; //手动航迹删除
int manual_tracking_flag; //手动TAS
int manual_untracking_flag; //手动取消TAS
int primary_target_flag; //重点目标标记
int Target_Type; //目标类型 搜索目标 低空目标 地面目标
+97 -58
View File
@@ -66,7 +66,7 @@ void TAS_Ctrl::tas_target_add(std::vector<Trust_Track> *trust_track,
&& (*trust_track)[i].Track_Mode == 0
&& tas_prohibite_area( r, azi, v, h) == 0)
{
for(int j=0;j<RDP_TAS_QUEUE_CAPACITY;j++)
for(int j=0;j<rdp_parameter.tas_track_num_max;j++)
{
if(tas_target_queue[j].empty_flag==0)// && j%2==0)
{
@@ -89,8 +89,8 @@ void TAS_Ctrl::tas_target_add(std::vector<Trust_Track> *trust_track,
Trust_Track_Output[*Trust_track_num_Output-1][0].Point_Sum=1;
double x,y;
x=(*trust_track)[i].X[0]+(*trust_track)[i].X[1]*rdp_parameter.radar_system_delay;
y=(*trust_track)[i].X[3]+(*trust_track)[i].X[4]*rdp_parameter.radar_system_delay;
x=(*trust_track)[i].X[0];
y=(*trust_track)[i].X[3];
coor_trans Coor_trans;
double r, azi;
Coor_trans.cart2polar(x, y, &r, &azi);
@@ -194,78 +194,116 @@ void TAS_Ctrl::tas_target_del(std::vector<Trust_Track> *trust_track,
{
//查找TAS目标是否已经消批 若消批则移出TAS队列
for (int i=0;i<RDP_TAS_QUEUE_CAPACITY;i++)
for (int i=0;i<rdp_parameter.tas_track_num_max;i++)
{
if(tas_target_queue[i].empty_flag == 1)
{
int track_index = -1;
//查找TAS队列里的目标是否存在
int flag=0;
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){
track_index = static_cast<int>(j);
if((*trust_track)[j].Track_Mode == 1 && (*trust_track)[j].manual_tracking_flag == 1){
flag=1;
}
break;
}
}
//目标不存在 说明已消批 从队列里删除
if(flag == 0)
{
RDP_LOG_INFO("Tatget <{}> delete from TAS queue", tas_target_queue[i].Index);
memset(&tas_target_queue[i],0,sizeof(Tracking_Target));
tas_target_num=tas_target_num-1;
if(track_index != -1){
//目标跟踪状态发生改变 对外输出航迹更新信息
*Trust_track_num_Output= *Trust_track_num_Output+1;
Trust_Track_Output[*Trust_track_num_Output-1][0].Point_Sum=1;
(*trust_track)[track_index].Track_Mode = 0;
double x,y;
x=(*trust_track)[track_index].X[0];
y=(*trust_track)[track_index].X[3];
coor_trans Coor_trans;
double r, azi;
Coor_trans.cart2polar(x, y, &r, &azi);
Trust_Track_Output[*Trust_track_num_Output-1][0].Range=static_cast<float>(r);
Trust_Track_Output[*Trust_track_num_Output-1][0].Azimuth=static_cast<float>(azi/PI*180);
if((*trust_track)[track_index].Height<r)
Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation = static_cast<float>(asin((*trust_track)[track_index].Height/r)/PI*180);
else
Trust_Track_Output[*Trust_track_num_Output-1][0].Elevation = static_cast<float>((*trust_track)[track_index].elev_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Index=(*trust_track)[track_index].Track_Index;
Trust_Track_Output[*Trust_track_num_Output-1][0].Range_V = static_cast<float>(sqrt((*trust_track)[track_index].X[1]*(*trust_track)[track_index].X[1]+(*trust_track)[track_index].X[4]*(*trust_track)[track_index].X[4]));
Trust_Track_Output[*Trust_track_num_Output-1][0].Amplitude = static_cast<float>((*trust_track)[track_index].Amplitude);
Trust_Track_Output[*Trust_track_num_Output-1][0].Track_Mode=(*trust_track)[track_index].Track_Mode;
Trust_Track_Output[*Trust_track_num_Output-1][0].track_time=static_cast<float>((*trust_track)[track_index].T_track/1000.0);
Trust_Track_Output[*Trust_track_num_Output-1][0].GNSS_time=(*trust_track)[track_index].GNSS_time;
Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Point = (*trust_track)[track_index].point_flag;
Trust_Track_Output[*Trust_track_num_Output-1][0].z=static_cast<float>((*trust_track)[track_index].Height+rdp_parameter.radar_height);
Trust_Track_Output[*Trust_track_num_Output-1][0].Quality = static_cast<float>((*trust_track)[track_index].Quality * rdp_parameter.track_quality_max);
double Direction_Angle;
Direction_Angle=atan2((*trust_track)[track_index].X[4], (*trust_track)[track_index].X[1]);
if(Direction_Angle<0){Direction_Angle=Direction_Angle+2*PI;}
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=static_cast<float>((*trust_track)[track_index].range_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].azi_point=static_cast<float>((*trust_track)[track_index].azi_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].elev_point=static_cast<float>((*trust_track)[track_index].elev_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].vr_point=static_cast<float>((*trust_track)[track_index].vr_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].point_type=0;
Trust_Track_Output[*Trust_track_num_Output-1][0].prf_point = static_cast<float>((*trust_track)[track_index].prf_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].track_snr = static_cast<float>((*trust_track)[track_index].snr_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].amp_asv_point = static_cast<float>((*trust_track)[track_index].amp_asv_point);
Trust_Track_Output[*Trust_track_num_Output-1][0].prn_fftn_point = static_cast<float>((*trust_track)[track_index].prn_fftn_point);
//输出平滑后的高度
Trust_Track_Output[*Trust_track_num_Output-1][0].z = static_cast<float>((*trust_track)[track_index].Height+rdp_parameter.radar_height);
Trust_Track_Output[*Trust_track_num_Output-1][0].x=static_cast<float>((*trust_track)[track_index].X[0]);
Trust_Track_Output[*Trust_track_num_Output-1][0].y=static_cast<float>((*trust_track)[track_index].X[3]);
Trust_Track_Output[*Trust_track_num_Output-1][0].v_x=static_cast<float>((*trust_track)[track_index].X[1]);
Trust_Track_Output[*Trust_track_num_Output-1][0].v_y=static_cast<float>((*trust_track)[track_index].X[4]);
if(acos((-x * cos(Direction_Angle) - y * sin(Direction_Angle)) / r ) < PI / 2)
{
Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Direction=1;
// if(r*abs(sin(azi - Direction_Angle))<500)
// {
// Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Direction=1;
// }
// else
// {
// Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Direction=0;
// }
}
else
{
Trust_Track_Output[*Trust_track_num_Output-1][0].Flag_Direction=0;
}
Trust_Track_Output[*Trust_track_num_Output-1][0].track_rcs = static_cast<float>((*trust_track)[track_index].RCS);
Trust_Track_Output[*Trust_track_num_Output-1][0].pitch_num = (*trust_track)[track_index].pitch_num;
std::memcpy(Trust_Track_Output[*Trust_track_num_Output-1][0].speed_dim, (*trust_track)[track_index].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].range_dim, (*trust_track)[track_index].range_dim, sizeof(Trust_Track_Output[*Trust_track_num_Output-1][0].range_dim));
break;
}
}
}
}
//判断TAS目标是否满足自动跟踪条件 若不满足移除TAS队列 通知界面改变目标状态
// for ( int 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 v=sqrt(pow((*trust_track)[i].X[1],2)+pow((*trust_track)[i].X[4],2));
// double h=(*trust_track)[i].Height+rdp_parameter.radar_height;
// if((*trust_track)[i].manual_tracking_flag == 0 && (*trust_track)[i].Track_Mode == 1 && tas_auto_end(v,r,h) == 1) //满足结束跟踪条件
// {
// int track_index=(*trust_track)[i].Track_Index;
// for (int ii=0;ii<RDP_TAS_QUEUE_CAPACITY;ii++)
// {
// if(tas_target_queue[ii].Index == track_index)
// {
// //从队列中删除
// memset(&tas_target_queue[ii],0,sizeof(Tracking_Target));
// tas_target_num=tas_target_num-1;
// //TAS跟踪标志置零
// (*trust_track)[i].Track_Mode=0;
// //目标类型设为地面目标
// (*trust_track)[i].Target_Type = 0;
// //航迹状态发生改变 对外输出航迹更新信息
// *Trust_track_num_Output= *Trust_track_num_Output+1;
// double r_output,azmi_output;
// coor_trans Coor_trans;
// 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].Range=static_cast<float>(r_output);
// 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].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=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].Track_Mode=(*trust_track)[i].Track_Mode;
// 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=static_cast<float>((*trust_track)[i].Height+rdp_parameter.radar_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].track_snr = static_cast<float>((*trust_track)[i].snr_point);
// }
// }
// }
// }
};
// 说明:TAS 自动结束(tas_auto_end)的原实现同样依赖未纳入 RDP_parameter 的
@@ -286,7 +324,7 @@ void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *trust_track
double X_now[6] = {0};
//查找TAS队列中CPI时间最早的目标且满足TAS数据率的目标
for(int tas_idx=0;tas_idx<RDP_TAS_QUEUE_CAPACITY;tas_idx++)
for(int tas_idx=0;tas_idx<rdp_parameter.tas_track_num_max;tas_idx++)
{
if(tas_target_queue[tas_idx].empty_flag==0)
{
@@ -301,7 +339,7 @@ void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *trust_track
delta_T_last_track = (latest_timestamp - tas_target_queue[tas_idx].last_track_time) / 1000.0f;
//查找CPI时间最早,且满足TAS数据率的目标
if(CPI_time < earliest_CPI_time && (delta_T_last_track > rdp_parameter.data_rate_tas))
if(CPI_time < earliest_CPI_time && (delta_T_last_track >= rdp_parameter.data_rate_tas))
{
earliest_CPI_time = CPI_time;
H_track = (*trust_track)[track_idx].Height;
@@ -324,6 +362,7 @@ void TAS_Ctrl::tas_beam_output(std::vector<Trust_Track> *trust_track
if(earliest_track_idx == -1)
{
Tracking_beam->open_flag = 0;
// RDP_LOG_INFO("TAS close {} {} {}", CPI_time, earliest_CPI_time, delta_T_last_track);
return;
}