From 70fc3668a30b3a8661a7696fbfb0e6fedf16bd4d Mon Sep 17 00:00:00 2001 From: zhanli <719901725@qq.com> Date: Wed, 23 Apr 2025 11:27:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0UWB-AOA=E7=9A=84=E8=A7=A3?= =?UTF-8?q?=E7=AE=97=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Code/Matlab/UWBAOALocation/CalUWBAOA.m | 24 ++++ Code/Matlab/UWBAOALocation/OutlierFilter.m | 38 ++++++ Code/Matlab/UWBAOALocation/README.md | 1 + .../UWBAOALocation/combined_data14.xlsx | Bin 0 -> 52503 bytes Code/Matlab/UWBAOALocation/firstOrderFilter.m | 18 +++ Code/Matlab/UWBAOALocation/script.m | 114 ++++++++++++++++++ 6 files changed, 195 insertions(+) create mode 100644 Code/Matlab/UWBAOALocation/CalUWBAOA.m create mode 100644 Code/Matlab/UWBAOALocation/OutlierFilter.m create mode 100644 Code/Matlab/UWBAOALocation/README.md create mode 100644 Code/Matlab/UWBAOALocation/combined_data14.xlsx create mode 100644 Code/Matlab/UWBAOALocation/firstOrderFilter.m create mode 100644 Code/Matlab/UWBAOALocation/script.m diff --git a/Code/Matlab/UWBAOALocation/CalUWBAOA.m b/Code/Matlab/UWBAOALocation/CalUWBAOA.m new file mode 100644 index 0000000..c194124 --- /dev/null +++ b/Code/Matlab/UWBAOALocation/CalUWBAOA.m @@ -0,0 +1,24 @@ +function [ aoa ] = CalUWBAOA(pdoa) + Lambda = 3e8/6.5e9; % UWB波长 + D_M = 0.0208; % 久凌天线间距 + aoa = zeros(length(pdoa),1); + for ii=1:length(pdoa) + if pdoa(ii) < -180.0 + pdoa(ii)=pdoa(ii)+ 360.0; + elseif pdoa(ii) > 180.0 + pdoa(ii)=pdoa(ii)-360.0; + end + phase_m = pdoa(ii) * (Lambda/360.0); + % 天线非线性矫正 + % coef=[-14205, 419, 4.59, 0.8361,0]; + % phase_m = coef(1)+coef(2)*phase_m+coef(3)*phase_m^2+coef(4)*phase_m^3+coef(5)*phase_m^4; + alfa = phase_m / D_M; + if alfa < -1 + alfa = -1; + elseif alfa > 1 + alfa = 1; + end + aoa(ii)=asind(alfa); + end +end + diff --git a/Code/Matlab/UWBAOALocation/OutlierFilter.m b/Code/Matlab/UWBAOALocation/OutlierFilter.m new file mode 100644 index 0000000..56fa54b --- /dev/null +++ b/Code/Matlab/UWBAOALocation/OutlierFilter.m @@ -0,0 +1,38 @@ +function [ filtered ] = OutlierFilter( data ) + init_count = 0; + init_flag = 0; + filtered = zeros(1, length(data)); + filtered(1) = data(1); + for i = 2:length(data) + % 等待数据初始化、数据没有过大的波动才能正确追踪数据 + if(abs(data(i) - data(i-1)) < 30 && init_flag == 0) + filtered(i) = data(i); + init_count = init_count + 1; + if(init_count >= 5) + init_flag = 1; + end + continue; + end + % 如果没有初始化则不做任何处理 + if(init_flag == 0) + filtered(i) = data(i); + continue; + end + + % 默认情况下,滤波后数据等于原始值 + filtered(i) = data(i); + % 如果数据出现过大的波动 + if(abs(filtered(i) - filtered(i - 1)) > 40) + % 计算数据反向后的差距, 因为目前数据经常看到相位差刚好是反向的 + dif1 = abs(data(i) + filtered(i - 1)); + % 如果反向后差别很小,说明是反向的错误,直接用当前值取负处理填充 + if(dif1 < 20) + filtered(i) = -data(i); + else + % 如果数据不完全是反向的,那就用上一个滤波值 + filtered(i) = filtered(i-1); + end + end + end +end + diff --git a/Code/Matlab/UWBAOALocation/README.md b/Code/Matlab/UWBAOALocation/README.md new file mode 100644 index 0000000..0564220 --- /dev/null +++ b/Code/Matlab/UWBAOALocation/README.md @@ -0,0 +1 @@ +# UWB-AOA 浣嶇疆瑙g畻妗嗘灦 \ No newline at end of file diff --git a/Code/Matlab/UWBAOALocation/combined_data14.xlsx b/Code/Matlab/UWBAOALocation/combined_data14.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e2069c799df10d095789b7435a6ad0cf7c3ef249 GIT binary patch literal 52503 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 UFb|Fkg<1f=ap1zss*$h$56ShS>i_@% literal 0 HcmV?d00001 diff --git a/Code/Matlab/UWBAOALocation/firstOrderFilter.m b/Code/Matlab/UWBAOALocation/firstOrderFilter.m new file mode 100644 index 0000000..50ab787 --- /dev/null +++ b/Code/Matlab/UWBAOALocation/firstOrderFilter.m @@ -0,0 +1,18 @@ +function filtered_data = firstOrderFilter(data, alpha) + % 数据校验 + if ~isvector(data) + error('Data input must be a vector.'); + end + if alpha < 0 || alpha > 1 + error('Alpha must be between 0 and 1.'); + end + + % 初始化过滤后的数据数组 + filtered_data = zeros(size(data)); + filtered_data(1) = data(1); % 初始化第一个元素,通常设为原始数据的第一个值 + + % 应用一阶滑动窗口滤波 + for i = 2:length(data) + filtered_data(i) = alpha * filtered_data(i - 1) + (1 - alpha) * data(i); + end +end diff --git a/Code/Matlab/UWBAOALocation/script.m b/Code/Matlab/UWBAOALocation/script.m new file mode 100644 index 0000000..57b8ee0 --- /dev/null +++ b/Code/Matlab/UWBAOALocation/script.m @@ -0,0 +1,114 @@ +clc; +clear; +close all; +filename = 'combined_data14.xlsx'; + +% 读取Excel文件 +data = readtable(filename); + +VR_X = str2double(data.VR_X); +VR_Y = str2double(data.VR_Y); +VR_Z = str2double(data.VR_Z); + +Dist = data.D; +raw_pdoa = data.P; +UWB_X = data.Xcm; +UWB_Y = data.Ycm; + +pdoa_offset = 0.0; +Lambda = 3e8/6.5e9; % UWB波长 +D_M = 0.0208; % 久凌天线间距 + +raw_pdoa = raw_pdoa - pdoa_offset; +% PDOA异常值处理 +pdoa = OutlierFilter(raw_pdoa); + +% 绘制PDOA滤波前后对比图 +figure +plot(raw_pdoa);hold on +plot(pdoa); +legend('原始PDOA','异常处理后的PDOA'); +title('PDOA异常处理前后对比'); +xlabel('Time'); % 设置X轴标签 +ylabel('相位差 '); % 设置Y轴标签 + +pdoa_filtered = firstOrderFilter(pdoa, 0.9); + +% 绘制PDOA滤波前后对比图 +figure +plot(pdoa);hold on +plot(pdoa_filtered); +legend('未滤波PDOA','滤波PDOA'); +title('PDOA滤波前后对比'); +xlabel('Time'); % 设置X轴标签 +ylabel('相位差 '); % 设置Y轴标签 + +dist_filtered = firstOrderFilter(Dist, 0.9); + +figure +plot(Dist);hold on +plot(dist_filtered); +legend('原始测距','滤波后测距'); +title('滤波前后对比'); +xlabel('Time'); % 设置X轴标签 +ylabel('相位差 '); % 设置Y轴标签 + + +% 利用原始pdoa信号计算AOA +aoa = CalUWBAOA(pdoa); +% 利用滤波后的信号计算AOA +aoa_filtered = CalUWBAOA(pdoa_filtered); + +% 绘制AOA滤波前后对比图 +figure +plot(aoa);hold on +plot(aoa_filtered); +legend('未滤波AOA ','滤波AOA'); +title('AOA采用未滤波和滤波后的PODA计算对比'); +xlabel('Time'); % 设置X轴标签 +ylabel('Angle (角度°)'); % 设置Y轴标签 + +filter_x = dist_filtered .* sin(aoa_filtered / 180 * pi) / 100; +filter_y = dist_filtered .* cos(aoa_filtered / 180 * pi) / 100; + +% % 绘制AOA滤波前后对比图 +% figure +% plot(UWB_X/100,UWB_Y/100);hold on +% plot(filter_x,filter_y); +% plot(-VR_X,-VR_Z); +% legend('原始定位 ','滤波后解算定位','lighthouse真值'); +% title('定位滤波前后对比'); +% xlabel('X(m)'); % 设置X轴标签 +% ylabel('Y(m)'); % 设置Y轴标签 + + +% 创建lighthouse的旋转矩阵 +angle_degrees = 90; % 例如,90度 +angle_radians = deg2rad(angle_degrees); % 转换为弧度 +% 创建旋转矩阵 +R = [cos(angle_radians) -sin(angle_radians); sin(angle_radians) cos(angle_radians)]; +x_l = -VR_X; +y_l = -VR_Z; +points = [x_l'; y_l']; +rotated_points = R * points; + +% 提取旋转后的 x 和 y 向量 +x_lr = rotated_points(1, :)' + 1.0; +y_lr = rotated_points(2, :)' + 0.8; + +n = 500; +% 绘制AOA滤波前后对比图 +figure +plot(filter_x(1:n),filter_y(1:n),'b.');hold on +plot(x_lr(1:n),y_lr(1:n)); +legend('滤波后解算定位','lighthouse真值'); +title('定位滤波前后对比'); +xlabel('X(m)'); % 设置X轴标签 +ylabel('Y(m)'); % 设置Y轴标签 + +err_x = mean(abs(filter_x -x_lr)); +err_y = mean(abs(filter_y -y_lr)); + +fprintf('UWB和Lighthouse真值误差 Error X: %.2f m,Y: %.2f m\n',err_x,err_y); + +