更新UWB-AOA的解算框架
This commit is contained in:
parent
0221786589
commit
70fc3668a3
24
Code/Matlab/UWBAOALocation/CalUWBAOA.m
Normal file
24
Code/Matlab/UWBAOALocation/CalUWBAOA.m
Normal file
@ -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
|
||||
|
38
Code/Matlab/UWBAOALocation/OutlierFilter.m
Normal file
38
Code/Matlab/UWBAOALocation/OutlierFilter.m
Normal file
@ -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
|
||||
|
1
Code/Matlab/UWBAOALocation/README.md
Normal file
1
Code/Matlab/UWBAOALocation/README.md
Normal file
@ -0,0 +1 @@
|
||||
# UWB-AOA 位置解算框架
|
BIN
Code/Matlab/UWBAOALocation/combined_data14.xlsx
Normal file
BIN
Code/Matlab/UWBAOALocation/combined_data14.xlsx
Normal file
Binary file not shown.
18
Code/Matlab/UWBAOALocation/firstOrderFilter.m
Normal file
18
Code/Matlab/UWBAOALocation/firstOrderFilter.m
Normal file
@ -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
|
114
Code/Matlab/UWBAOALocation/script.m
Normal file
114
Code/Matlab/UWBAOALocation/script.m
Normal file
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user