更新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