extract_centroid.mfunction[centroids, ClusterMetrics]extract_centroids(data_cluster,targets)%% 函数功能提取当前帧点云聚类后的质心点(Measurement Fusion)% 输入参数 % data_cluster -[N x6]矩阵聚类后的点云数据 % 第1,2,3列: X, Y, Z(直角坐标)% 第4列: Velocity(多普勒速度/径向速度)% 第5列: SNR / Power(信号能量)% 第6列: Cluster ID(聚类标签0或-1代表噪声)% targets -[M x4]矩阵真实目标质心 Range, Vel, HorAngle, TargetID % 输出参数 % centroids -[M x5]矩阵凝聚后的多目标质心点迹列表(M 为目标个数)% 每一行格式为:[X, Y, Z, Velocity, Total_Power]% ClusterMetrics - 结构体数组(长度为 M)包含每个簇的量化评估指标 % .density_vol - 空间绝对密度(点数/立方米)% .compactness - 相对紧凑度(碎点到质心的平均欧氏距离米)% .center_error - 凝聚质心与飞机真实几何中心的物理偏差(米)%ClusterMetrics.avg_density0.0;ClusterMetrics.avg_compact0.0;ClusterMetrics.avg_center_errNaN;% 测距测角偏差没配上时按学术惯例挂 NaN %1. 安全检查如果当前帧没有任何点云直接返回空ifisempty(data_cluster)centroids[];ClusterMetrics[];return;end %2. 提取所有唯一的聚类标签 all_idsdata_cluster(:,6);% Cluster ID unique_idsunique(all_ids);% 聚类数 %3. 剔除噪声标签(DBSCAN 中通常0或-1代表无法成类的孤立噪声点)valid_idsunique_ids(unique_ids0);num_clusterslength(valid_ids);% 有效聚类数 %4. 如果没有合法的聚类目标直接返回空ifnum_clusters0centroids[];ClusterMetrics[];return;end %5. 合成每个有效聚类的质心点 centroidszeros(num_clusters,5);%[X, Y, Z, Velocity, Total_Power]W_pointszeros(num_clusters,1);% 记录每个有效聚类中的碎点数 % 预分配指标结构体数组单个聚类的 TermMetricsstruct(density_vol, cell(num_clusters,1),...compactness, cell(num_clusters,1),...center_error, cell(num_clusters,1));forii1:num_clusters % 遍历每一个有效聚类簇将属于同一个标签的所有碎点的坐标、速度进行算术平均能量SNR累加 current_idvalid_ids(ii);points_in_clusterdata_cluster(all_idscurrent_id,:);% 提取属于当前聚类 ID 的所有碎点 N_pointssize(points_in_cluster,1);% 当前有效聚类的碎点数 W_points(ii)N_points;% 记录该簇碎点数 mean_Xmean(points_in_cluster(:,1));mean_Ymean(points_in_cluster(:,2));mean_Zmean(points_in_cluster(:,3));mean_Vmean(points_in_cluster(:,4));% 速度平均 snr_db_pointspoints_in_cluster(:,5);% 提取所有碎点的单点 SNR(dB)sum_snr_linearsum(10.^(snr_db_points ./10));% 转回再求和【不能将db值简单相加】 total_snr_db10* log10(sum_snr_linear);% 能量和不能将db值简单相加 centroids(ii,:)[mean_X, mean_Y, mean_Z, mean_V, total_snr_db];% 簇质心 %%指标一点云空间绝对密度(Volume Density)% 包围单簇的三维立方体长宽高 dxmax(points_in_cluster(:,1))- min(points_in_cluster(:,1));dymax(points_in_cluster(:,2))- min(points_in_cluster(:,2));dzmax(points_in_cluster(:,3))- min(points_in_cluster(:,3));volumemax(0.1, dx)* max(0.1, dy)* max(0.1, dz);% 立方体体积规避分母为0风险 TermMetrics(ii).density_volN_points / volume;% 单位: points / m^3 %%指标二点云相对紧凑度(Compactness)% 计算该簇内所有碎点到凝聚质心中心的平均欧氏距离 TermMetrics(ii).compactnessmean(sqrt((points_in_cluster(:,1)-mean_X).^2...(points_in_cluster(:,2)-mean_Y).^2...(points_in_cluster(:,3)-mean_Z).^2));%%指标三【多目标最近邻真值偏差】(Center Error)has_truth(nargin1)~isempty(targets);if has_truth unique_true_idsunique(targets(:,4));% 真实大目标数 num_true_targetslength(unique_true_ids);% 动态建立每个大目标的直角坐标几何中心矩阵[X Y Z]True_Centerszeros(num_true_targets,3);fortIdx1:num_true_targets % 遍历每个大目标 curr_true_idunique_true_ids(tIdx);curr_target_mask(targets(:,4)curr_true_id);% 获取每个大目标的所有碎点信息 % 分别计算这架特定飞机的碎点极坐标均值 r_meanmean(targets(curr_target_mask,1));% 所有碎点距离均值 ang_meanmean(targets(curr_target_mask,3));% 所有碎点角度均值 % 转换到直角坐标得到该大目标的纯正几何中心 True_Centers(tIdx,1)r_mean * sind(ang_mean);% 大目标质心的X值 True_Centers(tIdx,2)r_mean * cosd(ang_mean);% 大目标质心的Y值 True_Centers(tIdx,3)0;% 2D平面高度置零 大目标质心的Z值置零 end % 当前簇质心与最接近的真实目标质心距离偏差 TermMetrics(ii).center_errormin(sqrt((mean_X-True_Centers(:,1)).^2 ...(mean_Y - True_Centers(:,2)).^2 ...(mean_Z - True_Centers(:,3)).^2));elseTermMetrics(ii).center_errorNaN;end end % 【多目标情况下不能简单的用所有真实目标的均值来计算】 raw_densities[TermMetrics.density_vol]; raw_compactness [TermMetrics.compactness];raw_errors[TermMetrics.center_error]; W_norm W_points(:) / sum(W_points); % 归一化点数权重 (大目标权重高小噪声权重低) if num_clusters 0 ClusterMetrics.avg_density W_norm* raw_densities;ClusterMetrics.avg_compactW_norm * raw_compactness; % 针对中心偏差进行无效值(NaN)过滤防护 valid_err_mask ~isnan(raw_errors); if any(valid_err_mask) W_err W_points(valid_err_mask); W_err_norm W_err(:) / sum(W_err); sub_errors raw_errors(valid_err_mask); % 标量化相乘 ClusterMetrics.avg_center_err W_err_norm* sub_errors(:);elseClusterMetrics.avg_center_errNaN;endelseClusterMetrics.avg_densityTermMetrics.density_vol;ClusterMetrics.avg_compactTermMetrics.compactness;ClusterMetrics.avg_center_errTermMetrics.center_error;end end簇的质心。对属于每个聚类簇的碎点xyzv取均值能量/SNR先转回线性表达求和再转回db形式不能直接将db值相加。点云空间绝对密度 (Volume Density)点云数量/该簇立方体体积点云相对紧凑度 (Compactness)单个簇的碎点到簇的质心的平均距离。多目标最近邻真值偏差(Center Error) 已知目标质心真值簇碎点到其最近目标质心的平均距离最小。多目标下上述指标求平均大簇权重高小簇权重低求得整个场景下的平均空间绝对密度、平均相对紧凑度平均最近邻真值偏差。中间结果对于仿真的单个飞机目标该目标质心的[距离, 目标中心与雷达角度, 航向速度, 航向角][60, 10, -4, 225]使用dbscan聚类结果求点云质心将质心点绘制成红色五角星对于仿真的多个飞机目标的聚类效果airplanes_config [ % [距离, 目标中心与雷达角度, 航向速度, 航向角]60, 10, -4, 225; % 飞机 1: 中距离迎面快速斜切100, -20, -4, 110; % 飞机 2: 远距离左侧斜穿40, 35, 3, 75; % 飞机 3: 近距离大角度脱离];
Pipeline-聚类质心提取
发布时间:2026/7/4 4:40:51
extract_centroid.mfunction[centroids, ClusterMetrics]extract_centroids(data_cluster,targets)%% 函数功能提取当前帧点云聚类后的质心点(Measurement Fusion)% 输入参数 % data_cluster -[N x6]矩阵聚类后的点云数据 % 第1,2,3列: X, Y, Z(直角坐标)% 第4列: Velocity(多普勒速度/径向速度)% 第5列: SNR / Power(信号能量)% 第6列: Cluster ID(聚类标签0或-1代表噪声)% targets -[M x4]矩阵真实目标质心 Range, Vel, HorAngle, TargetID % 输出参数 % centroids -[M x5]矩阵凝聚后的多目标质心点迹列表(M 为目标个数)% 每一行格式为:[X, Y, Z, Velocity, Total_Power]% ClusterMetrics - 结构体数组(长度为 M)包含每个簇的量化评估指标 % .density_vol - 空间绝对密度(点数/立方米)% .compactness - 相对紧凑度(碎点到质心的平均欧氏距离米)% .center_error - 凝聚质心与飞机真实几何中心的物理偏差(米)%ClusterMetrics.avg_density0.0;ClusterMetrics.avg_compact0.0;ClusterMetrics.avg_center_errNaN;% 测距测角偏差没配上时按学术惯例挂 NaN %1. 安全检查如果当前帧没有任何点云直接返回空ifisempty(data_cluster)centroids[];ClusterMetrics[];return;end %2. 提取所有唯一的聚类标签 all_idsdata_cluster(:,6);% Cluster ID unique_idsunique(all_ids);% 聚类数 %3. 剔除噪声标签(DBSCAN 中通常0或-1代表无法成类的孤立噪声点)valid_idsunique_ids(unique_ids0);num_clusterslength(valid_ids);% 有效聚类数 %4. 如果没有合法的聚类目标直接返回空ifnum_clusters0centroids[];ClusterMetrics[];return;end %5. 合成每个有效聚类的质心点 centroidszeros(num_clusters,5);%[X, Y, Z, Velocity, Total_Power]W_pointszeros(num_clusters,1);% 记录每个有效聚类中的碎点数 % 预分配指标结构体数组单个聚类的 TermMetricsstruct(density_vol, cell(num_clusters,1),...compactness, cell(num_clusters,1),...center_error, cell(num_clusters,1));forii1:num_clusters % 遍历每一个有效聚类簇将属于同一个标签的所有碎点的坐标、速度进行算术平均能量SNR累加 current_idvalid_ids(ii);points_in_clusterdata_cluster(all_idscurrent_id,:);% 提取属于当前聚类 ID 的所有碎点 N_pointssize(points_in_cluster,1);% 当前有效聚类的碎点数 W_points(ii)N_points;% 记录该簇碎点数 mean_Xmean(points_in_cluster(:,1));mean_Ymean(points_in_cluster(:,2));mean_Zmean(points_in_cluster(:,3));mean_Vmean(points_in_cluster(:,4));% 速度平均 snr_db_pointspoints_in_cluster(:,5);% 提取所有碎点的单点 SNR(dB)sum_snr_linearsum(10.^(snr_db_points ./10));% 转回再求和【不能将db值简单相加】 total_snr_db10* log10(sum_snr_linear);% 能量和不能将db值简单相加 centroids(ii,:)[mean_X, mean_Y, mean_Z, mean_V, total_snr_db];% 簇质心 %%指标一点云空间绝对密度(Volume Density)% 包围单簇的三维立方体长宽高 dxmax(points_in_cluster(:,1))- min(points_in_cluster(:,1));dymax(points_in_cluster(:,2))- min(points_in_cluster(:,2));dzmax(points_in_cluster(:,3))- min(points_in_cluster(:,3));volumemax(0.1, dx)* max(0.1, dy)* max(0.1, dz);% 立方体体积规避分母为0风险 TermMetrics(ii).density_volN_points / volume;% 单位: points / m^3 %%指标二点云相对紧凑度(Compactness)% 计算该簇内所有碎点到凝聚质心中心的平均欧氏距离 TermMetrics(ii).compactnessmean(sqrt((points_in_cluster(:,1)-mean_X).^2...(points_in_cluster(:,2)-mean_Y).^2...(points_in_cluster(:,3)-mean_Z).^2));%%指标三【多目标最近邻真值偏差】(Center Error)has_truth(nargin1)~isempty(targets);if has_truth unique_true_idsunique(targets(:,4));% 真实大目标数 num_true_targetslength(unique_true_ids);% 动态建立每个大目标的直角坐标几何中心矩阵[X Y Z]True_Centerszeros(num_true_targets,3);fortIdx1:num_true_targets % 遍历每个大目标 curr_true_idunique_true_ids(tIdx);curr_target_mask(targets(:,4)curr_true_id);% 获取每个大目标的所有碎点信息 % 分别计算这架特定飞机的碎点极坐标均值 r_meanmean(targets(curr_target_mask,1));% 所有碎点距离均值 ang_meanmean(targets(curr_target_mask,3));% 所有碎点角度均值 % 转换到直角坐标得到该大目标的纯正几何中心 True_Centers(tIdx,1)r_mean * sind(ang_mean);% 大目标质心的X值 True_Centers(tIdx,2)r_mean * cosd(ang_mean);% 大目标质心的Y值 True_Centers(tIdx,3)0;% 2D平面高度置零 大目标质心的Z值置零 end % 当前簇质心与最接近的真实目标质心距离偏差 TermMetrics(ii).center_errormin(sqrt((mean_X-True_Centers(:,1)).^2 ...(mean_Y - True_Centers(:,2)).^2 ...(mean_Z - True_Centers(:,3)).^2));elseTermMetrics(ii).center_errorNaN;end end % 【多目标情况下不能简单的用所有真实目标的均值来计算】 raw_densities[TermMetrics.density_vol]; raw_compactness [TermMetrics.compactness];raw_errors[TermMetrics.center_error]; W_norm W_points(:) / sum(W_points); % 归一化点数权重 (大目标权重高小噪声权重低) if num_clusters 0 ClusterMetrics.avg_density W_norm* raw_densities;ClusterMetrics.avg_compactW_norm * raw_compactness; % 针对中心偏差进行无效值(NaN)过滤防护 valid_err_mask ~isnan(raw_errors); if any(valid_err_mask) W_err W_points(valid_err_mask); W_err_norm W_err(:) / sum(W_err); sub_errors raw_errors(valid_err_mask); % 标量化相乘 ClusterMetrics.avg_center_err W_err_norm* sub_errors(:);elseClusterMetrics.avg_center_errNaN;endelseClusterMetrics.avg_densityTermMetrics.density_vol;ClusterMetrics.avg_compactTermMetrics.compactness;ClusterMetrics.avg_center_errTermMetrics.center_error;end end簇的质心。对属于每个聚类簇的碎点xyzv取均值能量/SNR先转回线性表达求和再转回db形式不能直接将db值相加。点云空间绝对密度 (Volume Density)点云数量/该簇立方体体积点云相对紧凑度 (Compactness)单个簇的碎点到簇的质心的平均距离。多目标最近邻真值偏差(Center Error) 已知目标质心真值簇碎点到其最近目标质心的平均距离最小。多目标下上述指标求平均大簇权重高小簇权重低求得整个场景下的平均空间绝对密度、平均相对紧凑度平均最近邻真值偏差。中间结果对于仿真的单个飞机目标该目标质心的[距离, 目标中心与雷达角度, 航向速度, 航向角][60, 10, -4, 225]使用dbscan聚类结果求点云质心将质心点绘制成红色五角星对于仿真的多个飞机目标的聚类效果airplanes_config [ % [距离, 目标中心与雷达角度, 航向速度, 航向角]60, 10, -4, 225; % 飞机 1: 中距离迎面快速斜切100, -20, -4, 110; % 飞机 2: 远距离左侧斜穿40, 35, 3, 75; % 飞机 3: 近距离大角度脱离];