forked from ZhanLi/UWBIns
		
	Compare commits
	
		
			No commits in common. "main" and "main" have entirely different histories.
		
	
	
		
	
		
| @ -1,580 +0,0 @@ | |||||||
| clear |  | ||||||
| clc |  | ||||||
| close all |  | ||||||
| load('data1.mat'); |  | ||||||
| nn = size(imuPosX,1); |  | ||||||
| %% lightHouse坐标系转换 |  | ||||||
| x =  lightHousePosX * 100; |  | ||||||
| y = -lightHousePosZ * 100; |  | ||||||
| 
 |  | ||||||
| % 定义误差函数,即均方根误差 |  | ||||||
| errorFunction = @(params) sqrt(mean((x(1:500) * cos(params(1)) - y(1:500) * sin(params(1)) + params(2) - imuPosX(1:500)).^2 + (x(1:500) * sin(params(1)) + y(1:500) * cos(params(1)) + params(3) - imuPosY(1:500)).^2)); |  | ||||||
| 
 |  | ||||||
| % 使用 fminsearch 优化误差函数,找到使误差最小的旋转角和位移 |  | ||||||
| initialGuess = [0, 10, 10]; % 初始猜测值,[旋转角, 位移] |  | ||||||
| optimizedParams = fminsearch(errorFunction, initialGuess); |  | ||||||
| 
 |  | ||||||
| % 输出优化后的旋转角和位移 |  | ||||||
| rotationAngle = optimizedParams(1); |  | ||||||
| xOffset = optimizedParams(2); |  | ||||||
| yOffset = optimizedParams(3); |  | ||||||
| % 旋转坐标 |  | ||||||
| xt = x * cos(rotationAngle) - y * sin(rotationAngle) + xOffset; |  | ||||||
| yt = x * sin(rotationAngle) + y * cos(rotationAngle) + yOffset; |  | ||||||
| %% |  | ||||||
| tagN = 4; |  | ||||||
| %标签坐标 |  | ||||||
| XN(:,1)=[-300;-300]; |  | ||||||
| XN(:,2)=[-300;300]; |  | ||||||
| XN(:,3)=[300;300]; |  | ||||||
| XN(:,4)=[300;-300]; |  | ||||||
| sim2=6; |  | ||||||
| Q=diag(repmat(sim2,1,2*tagN));%协方差矩阵 |  | ||||||
| measure_AOA = zeros(4,nn); |  | ||||||
| measure_d = zeros(4,nn); |  | ||||||
| measure_AOA(1,:) = aoa1'; |  | ||||||
| measure_AOA(2,:) = aoa2'; |  | ||||||
| measure_AOA(3,:) = aoa3'; |  | ||||||
| measure_AOA(4,:) = aoa4'; |  | ||||||
| measure_d(1,:) = d1'; |  | ||||||
| measure_d(2,:) = d2'; |  | ||||||
| measure_d(3,:) = d3'; |  | ||||||
| measure_d(4,:) = d4'; |  | ||||||
| %% uwb解算 |  | ||||||
| x_uwb(1) = 0; |  | ||||||
| y_uwb(1) = 0; |  | ||||||
| theta_uwb=zeros(nn,1); |  | ||||||
| for i=2:nn |  | ||||||
|     if measure_d(1,i) == 0 |  | ||||||
|         x_uwb(i) = x_uwb(i-1); |  | ||||||
|         y_uwb(i) = y_uwb(i-1);         |  | ||||||
|         continue; |  | ||||||
|     end |  | ||||||
|     [t1,theta] = WLS(XN,measure_AOA(:,i),measure_d(:,i),Q); |  | ||||||
|     x_uwb(i) = t1(1); |  | ||||||
|     y_uwb(i) = t1(2); |  | ||||||
|     theta_uwb(i) = 90-theta; |  | ||||||
|     theta_uwb(i) = mod(theta_uwb(i)+180,360)-180; |  | ||||||
|     derr_WLS(i)=norm(t1-[xt(i);yt(i)]); |  | ||||||
| end |  | ||||||
| thetat=zeros(nn,1); |  | ||||||
| for i=2:nn |  | ||||||
| detx=xt(i)-xt(i-1); |  | ||||||
| dety=yt(i)-yt(i-1); |  | ||||||
| thetat(i)=atan2d(detx,dety); |  | ||||||
| end |  | ||||||
| % Uwb.x=x_uwb; |  | ||||||
| % Uwb.y=y_uwb; |  | ||||||
| % Uwb.alpha=theta_uwb; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| % 角速度校准 |  | ||||||
| detW = mean(wZ(1:200)); |  | ||||||
| wZ = wZ - detW; |  | ||||||
| 
 |  | ||||||
| x_imu(1) = 0;  |  | ||||||
| y_imu(1) = 0; |  | ||||||
| Z=zeros(3,1); |  | ||||||
| WW = 0.05; |  | ||||||
| theta_imu(1) = 0; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| %  |  | ||||||
| % Imu.x=x_imu; |  | ||||||
| % Imu.y=y_imu; |  | ||||||
| % Imu.v=v_imu; |  | ||||||
| % Imu.alpha=alpha_imu; |  | ||||||
| % Imu.omega=omega_imu; |  | ||||||
| 
 |  | ||||||
| %%  KF |  | ||||||
| R = diag([1 1 1]); |  | ||||||
| % qq = 1; |  | ||||||
| qq = 0.00001; |  | ||||||
| Q1 = diag([qq qq qq qq qq]); |  | ||||||
| P0 = diag([0 0 0 0 0]); |  | ||||||
| H = [1 0 0 0 0; |  | ||||||
|     0 1 0 0 0; |  | ||||||
|     0 0 0 1 0]; |  | ||||||
| I = eye(5); |  | ||||||
| JF = zeros(5,5); |  | ||||||
| X_pre = zeros(5,nn); |  | ||||||
| X_kf(:,1) = [imuPosX(1);imuPosY(1);vXY(1)*100;0;wZ(1)]; |  | ||||||
| for i=2:nn |  | ||||||
|     % 计算IMU和里程计的时间差值 |  | ||||||
|     detImuTime = imuDataRxTime(i) - imuDataRxTime(i-1); |  | ||||||
|     detOdomTime = odomDataRxTime(i)-odomDataRxTime(i-1); |  | ||||||
|     % 获得此时Z轴角速度 |  | ||||||
|     w = wZ(i); |  | ||||||
|     % 获得小车的水平速度 |  | ||||||
|     v = vXY(i)*100; |  | ||||||
|     % 计算速度增量 |  | ||||||
|     detV=(vXY(i)-vXY(i-1))*100; |  | ||||||
|     % 计算位置增量 |  | ||||||
|     detD = v*detImuTime;  |  | ||||||
|     % 计算角度增量 |  | ||||||
|     detTheta = w*180/pi*detImuTime; |  | ||||||
|     % 计算角速度的变化量 |  | ||||||
|     detW = w-wZ(i-1); |  | ||||||
|     % 积分计算IMU的航位角 |  | ||||||
|     theta_imu(i) = theta_imu(i-1)+detTheta; |  | ||||||
|     % 航向约束 |  | ||||||
|     theta_imu(i) = mod(theta_imu(i)+180,360)-180; |  | ||||||
|      |  | ||||||
|     % 状态更新方程 |  | ||||||
|     F = [1 0 detImuTime*cosd(X_kf(4,i-1)) 0 0; |  | ||||||
|          0 1 detImuTime*sind(X_kf(4,i-1)) 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0;]; |  | ||||||
|     % 获得水平和垂直方向的位置增量 |  | ||||||
|     vtx = detD*cosd(theta_imu(i)); |  | ||||||
|     vty = detD*sind(theta_imu(i)); |  | ||||||
| 
 |  | ||||||
|     x_imu(i) = x_imu(i-1)+vtx;  |  | ||||||
|     y_imu(i) = y_imu(i-1)+vty; |  | ||||||
| 
 |  | ||||||
|     X_next = [vtx;vty;detV;detTheta;detW]; |  | ||||||
|     if (x_uwb(i) == x_uwb(i-1))&&(y_uwb(i) == y_uwb(i-1)) |  | ||||||
|         X_kf(:,i) = X_kf(:,i-1)+X_next; |  | ||||||
|         errKf(i) = norm(X_kf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|         theta_kf(i) = X_kf(4,i); |  | ||||||
|         continue |  | ||||||
|     end     |  | ||||||
|     X_pre(:,i) = X_kf(:,i-1)+X_next; |  | ||||||
|     Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|     P = F*P0*F'+Q1; |  | ||||||
|     Kg_kf = P*H'*inv(H*P*H'+R); |  | ||||||
|     X_kf(:,i) = X_pre(:,i)+Kg_kf*(Z-H*X_pre(:,i)); |  | ||||||
|     P0 = (I-Kg_kf*H)*P; |  | ||||||
| 
 |  | ||||||
|     errKf(i) = norm(X_kf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|     theta_kf(i) = X_kf(4,i); |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| %%  EKF |  | ||||||
| R = diag([1 1 1]); |  | ||||||
| % qq = 1; |  | ||||||
| qq = 0.00001; |  | ||||||
| Q1 = diag([qq qq qq qq qq]); |  | ||||||
| P0 = diag([0 0 0 0 0]); |  | ||||||
| H = [1 0 0 0 0; |  | ||||||
|     0 1 0 0 0; |  | ||||||
|     0 0 0 1 0]; |  | ||||||
| KK = zeros(5,3); |  | ||||||
| X_ekf(:,1) = [imuPosX(1);imuPosY(1);vXY(1)*100;0;wZ(1)]; |  | ||||||
| I = eye(5); |  | ||||||
| JF = zeros(5,5); |  | ||||||
| X_pre = zeros(5,nn); |  | ||||||
| 
 |  | ||||||
| for i=2:nn |  | ||||||
|     detImuTime = imuDataRxTime(i) - imuDataRxTime(i-1); |  | ||||||
|     detOdomTime = odomDataRxTime(i)-odomDataRxTime(i-1); |  | ||||||
|     w = wZ(i); |  | ||||||
|     v = vXY(i)*100; |  | ||||||
|     detV=(vXY(i)-vXY(i-1))*100; |  | ||||||
|     detD = v*detImuTime;  |  | ||||||
|     detTheta = w*180/pi*detImuTime; |  | ||||||
|     detW = w-wZ(i-1); |  | ||||||
|     theta_imu(i) = theta_imu(i-1)+detTheta; |  | ||||||
|     theta_imu(i) = mod(theta_imu(i)+180,360)-180; |  | ||||||
|     F = [1 0 detImuTime*cosd(X_ekf(4,i-1)) 0 0; |  | ||||||
|          0 1 detImuTime*sind(X_ekf(4,i-1)) 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0;]; |  | ||||||
|     if w<WW |  | ||||||
|         vtx = detD*cosd(theta_imu(i)); |  | ||||||
|         vty = detD*sind(theta_imu(i)); |  | ||||||
|     else |  | ||||||
|         vtx = v/w*(sind(theta_imu(i))-sind(theta_imu(i-1))); |  | ||||||
|         vty = v/w*(-cosd(theta_imu(i))+cosd(theta_imu(i-1)));            |  | ||||||
|     end |  | ||||||
|     x_imu(i) = x_imu(i-1)+vtx;  |  | ||||||
|     y_imu(i) = y_imu(i-1)+vty; |  | ||||||
|     errUwb(i) = norm([x_uwb(i);y_uwb(i)]-[xt(i);yt(i)]); |  | ||||||
|     errImu(i) = norm([x_imu(i);y_imu(i)]-[xt(i);yt(i)]); |  | ||||||
|     X_next = [vtx;vty;detV;detTheta;detW]; |  | ||||||
|     if (x_uwb(i) == x_uwb(i-1))&&(y_uwb(i) == y_uwb(i-1)) |  | ||||||
|         X_ekf(:,i) = X_ekf(:,i-1)+X_next; |  | ||||||
|         errEKf(i) = norm(X_ekf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|         theta_ekf(i) = X_ekf(4,i); |  | ||||||
|         continue |  | ||||||
|     end     |  | ||||||
|     if w<WW |  | ||||||
|         X_pre(:,i) = X_ekf(:,i-1)+X_next; |  | ||||||
|         Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|         P = F*P0*F'+Q1; |  | ||||||
|         Kg = P*H'*inv(H*P*H'+R); |  | ||||||
|         X_ekf(:,i) = X_pre(:,i)+Kg*(Z-H*X_pre(:,i)); |  | ||||||
|         P0 = (I-Kg*H)*P; |  | ||||||
|     else |  | ||||||
|         JF = [1 0 1/w*(sind(theta_imu(i))-sind(theta_imu(i-1))) v/w*(cosd(theta_imu(i))-cosd(theta_imu(i-1))) detD/w*cosd(theta_imu(i))-v/(w^2)*(sind(theta_imu(i))-sind(theta_imu(i-1))); |  | ||||||
|              0 1 1/w*(-cosd(theta_imu(i))+cosd(theta_imu(i-1))) v/w*(sind(theta_imu(i))-sind(theta_imu(i-1))) detD/w*sind(theta_imu(i))-v/(w^2)*(-cosd(theta_imu(i))+cosd(theta_imu(i-1))); |  | ||||||
|              0 0 1 0 0; |  | ||||||
|              0 0 0 1 detImuTime; |  | ||||||
|              0 0 0 0 1]; |  | ||||||
| 
 |  | ||||||
|         X_pre(:,i) = X_ekf(:,i-1)+X_next; |  | ||||||
|         Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|         P = JF*P0*JF'+Q1; |  | ||||||
|         Kg = P*H'*inv(H*P*H'+R); |  | ||||||
|         X_ekf(:,i) = X_pre(:,i)+Kg*(Z-H*X_pre(:,i)); |  | ||||||
|         P0 = (I-Kg*H)*P; |  | ||||||
|     end |  | ||||||
|     errEKf(i) = norm(X_ekf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|     theta_ekf(i) = X_ekf(4,i); |  | ||||||
| end |  | ||||||
| %%  UKF |  | ||||||
| % UKF settings |  | ||||||
| ukf_L = 5; %numer of states |  | ||||||
| ukf_m = 3; %numer of measurements |  | ||||||
| ukf_kappa = 3 - ukf_L; |  | ||||||
| ukf_alpha = 0.9; |  | ||||||
| ukf_beta = 2; |  | ||||||
| 
 |  | ||||||
| ukf_lambda = ukf_alpha^2*(ukf_L + ukf_kappa) - ukf_L; |  | ||||||
| ukf_gamma = sqrt(ukf_L + ukf_lambda); |  | ||||||
| ukf_W0_c = ukf_lambda / (ukf_L + ukf_lambda) + (1 - ukf_alpha^2 + ukf_beta); |  | ||||||
| ukf_W0_m = ukf_lambda / (ukf_L + ukf_lambda); |  | ||||||
| ukf_Wi_m = 1 / (2*(ukf_L + ukf_lambda)); |  | ||||||
| ukf_Wi_c = ukf_Wi_m; |  | ||||||
| 
 |  | ||||||
| q=0.01;    %std of process  |  | ||||||
| r=5;    %std of measurement |  | ||||||
| p=2; |  | ||||||
| Qu=q*eye(ukf_L); % std matrix of process |  | ||||||
| Ru=r*eye(ukf_m);        % std of measurement  |  | ||||||
| Pu=p*eye(ukf_L); |  | ||||||
| H = [1 0 0 0 0; |  | ||||||
|      0 1 0 0 0; |  | ||||||
|      0 0 0 1 0]; |  | ||||||
| X_ukf(:,1) = [imuPosX(1);imuPosY(1);vXY(1)*100;0;wZ(1)]; |  | ||||||
| I = eye(5); |  | ||||||
| JF = zeros(5,5); |  | ||||||
| X_pre = zeros(5,nn); |  | ||||||
| for i=2:nn |  | ||||||
|     detImuTime = imuDataRxTime(i) - imuDataRxTime(i-1); |  | ||||||
|     detOdomTime = odomDataRxTime(i)-odomDataRxTime(i-1); |  | ||||||
|     w = wZ(i); |  | ||||||
|     v = vXY(i)*100; |  | ||||||
|     detV=(vXY(i)-vXY(i-1))*100; |  | ||||||
|     detD = v*detImuTime;  |  | ||||||
|     detTheta = w*180/pi*detImuTime; |  | ||||||
|     detW = w-wZ(i-1); |  | ||||||
|     theta_imu(i) = theta_imu(i-1)+detTheta; |  | ||||||
|     theta_imu(i) = mod(theta_imu(i)+180,360)-180; |  | ||||||
|     % F = [1 0 detImuTime*cosd(X_ekf(4,i-1)) 0 0; |  | ||||||
|     %      0 1 detImuTime*sind(X_ekf(4,i-1)) 0 0; |  | ||||||
|     %      0 0 0 0 0; |  | ||||||
|     %      0 0 0 0 0; |  | ||||||
|     %      0 0 0 0 0;]; |  | ||||||
|     if w<WW |  | ||||||
|         vtx = detD*cosd(theta_imu(i)); |  | ||||||
|         vty = detD*sind(theta_imu(i)); |  | ||||||
|     else |  | ||||||
|         vtx = v/w*(sind(theta_imu(i))-sind(theta_imu(i-1))); |  | ||||||
|         vty = v/w*(-cosd(theta_imu(i))+cosd(theta_imu(i-1)));            |  | ||||||
|     end |  | ||||||
|     x_imu(i) = x_imu(i-1)+vtx;  |  | ||||||
|     y_imu(i) = y_imu(i-1)+vty; |  | ||||||
|     errUwb(i) = norm([x_uwb(i);y_uwb(i)]-[xt(i);yt(i)]); |  | ||||||
|     errImu(i) = norm([x_imu(i);y_imu(i)]-[xt(i);yt(i)]); |  | ||||||
|     X_next = [vtx;vty;detV;detTheta;detW]; |  | ||||||
|     if (x_uwb(i) == x_uwb(i-1))&&(y_uwb(i) == y_uwb(i-1)) |  | ||||||
|         X_ukf(:,i) = X_ukf(:,i-1)+X_next; |  | ||||||
|         errUKf(i) = norm(X_ukf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|         theta_ukf(i) = X_ukf(4,i); |  | ||||||
|         continue |  | ||||||
|     end     |  | ||||||
| 
 |  | ||||||
|     xestimate = X_ukf(:,i-1); |  | ||||||
|     Xx = repmat(xestimate, 1, length(xestimate)); |  | ||||||
|     Xsigma = [xestimate, ( Xx + ukf_gamma * Pu ), ( Xx - ukf_gamma * Pu )]; |  | ||||||
|      |  | ||||||
|     %第二步:对Sigma点集进行一步预测 |  | ||||||
|     [Xsigmapre]=fun1(Xsigma,detImuTime); |  | ||||||
|     %第三步:估计预测状态 |  | ||||||
|     Xpred = ukf_W0_m * Xsigmapre(:,1) + ukf_Wi_m * sum(Xsigmapre(:,2:end), 2); |  | ||||||
|     %第四步:均值和方差 |  | ||||||
|       Xx = repmat(Xpred, 1, length(xestimate)*2); |  | ||||||
|      [~, R] = qr([sqrt(ukf_Wi_c) * ( Xsigmapre(:,2:end) - Xx ), Qu]', 0); |  | ||||||
|      Ppred = cholupdate(R, sqrt(ukf_W0_c) * (Xsigmapre(:,1) - Xpred), '-')'; |  | ||||||
| 
 |  | ||||||
|     %第5步:根据预测值,再一次使用UT变换,得到新的sigma点集 |  | ||||||
|     Xx = repmat(Xpred, 1, length(xestimate)); |  | ||||||
|     Xsigmapre = [Xpred, ( Xx + ukf_gamma * Ppred ), ( Xx - ukf_gamma * Ppred )]; |  | ||||||
| 
 |  | ||||||
|     %第6步:观测预测 |  | ||||||
|     Zsigmapre=H*Xsigmapre; |  | ||||||
| 
 |  | ||||||
|     %第7步:计算观测预测均值和协方差 |  | ||||||
|     Zpred = ukf_W0_m * Zsigmapre(:,1) + ukf_Wi_m * sum(Zsigmapre(:,2:end), 2); |  | ||||||
| 
 |  | ||||||
|     Yy = repmat(Zpred, 1, length(xestimate)*2); |  | ||||||
|     [~, Rz] = qr([sqrt(ukf_Wi_c) * (Zsigmapre(:,2:end) - Yy), Ru]', 0); |  | ||||||
|     Pzz = cholupdate(Rz, sqrt(ukf_W0_c) * (Zsigmapre(:,1) - Zpred), '-')'; |  | ||||||
| 
 |  | ||||||
|     Xd = Xsigmapre - repmat(Xpred, 1, length(xestimate)*2 + 1); |  | ||||||
|     Zd = Zsigmapre - repmat(Zpred, 1, length(xestimate)*2 + 1); |  | ||||||
|    |  | ||||||
|     Pxz = ( ukf_W0_c*  Xd(:,1) * Zd(:,1)' ) + ( ukf_Wi_c * Xd(:,2:end) * Zd(:,2:end)' ); |  | ||||||
| 
 |  | ||||||
|     %第七步:计算kalman增益 |  | ||||||
|     Kukf= (Pxz / Pzz') / Pzz; |  | ||||||
|     %第八步:状态和方差更新 |  | ||||||
|     Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|     Xpred=Xpred+Kukf*(Z-Zpred); |  | ||||||
|     U = Kukf * Pzz; |  | ||||||
|     Rp = Ppred'; |  | ||||||
|     for ii=1:size(U, 2) |  | ||||||
|         Rp = cholupdate(Rp, U(:,ii), '-'); |  | ||||||
|     end |  | ||||||
|     Ppred = Rp'; |  | ||||||
|     X_ukf(:,i)=Xpred; |  | ||||||
| 
 |  | ||||||
|     errUKf(i) = norm(X_ukf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|     theta_ukf(i) = X_ukf(4,i); |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| %% |  | ||||||
| %%AEKF |  | ||||||
| R = diag([1 1 1]); |  | ||||||
| % qq = 50; |  | ||||||
| % qq = 10; |  | ||||||
| qq = 0.01; |  | ||||||
| Q = diag([qq qq qq qq qq]); |  | ||||||
| P0 = diag([0 0 0 0 0]); |  | ||||||
| H = [1 0 0 0 0; |  | ||||||
|      0 1 0 0 0; |  | ||||||
|      0 0 0 1 0]; |  | ||||||
| X_aekf = zeros(5,nn); |  | ||||||
| X_aekf(:,1) = [imuPosX(1);imuPosY(1);vXY(1)*100;0;wZ(1)]; |  | ||||||
| I = eye(5); |  | ||||||
| JF = zeros(5,5); |  | ||||||
| X_pre = zeros(5,nn); |  | ||||||
| alfa = 0.97; |  | ||||||
| 
 |  | ||||||
| windowlength=5; |  | ||||||
| x_aekf_sw=zeros(1,nn); |  | ||||||
| y_aekf_sw=zeros(1,nn); |  | ||||||
| for i=2:nn |  | ||||||
|     detImuTime = imuDataRxTime(i) - imuDataRxTime(i-1); |  | ||||||
|     detOdomTime = odomDataRxTime(i)-odomDataRxTime(i-1); |  | ||||||
|     w = wZ(i); |  | ||||||
|     v = vXY(i)*100; |  | ||||||
|     detV=(vXY(i)-vXY(i-1))*100; |  | ||||||
|     detD = v*detImuTime;  |  | ||||||
|     detTheta = w*180/pi*detImuTime; |  | ||||||
|     detW = w-wZ(i-1); |  | ||||||
|     theta_imu(i) = theta_imu(i-1)+detTheta; |  | ||||||
|     theta_imu(i) = mod(theta_imu(i)+180,360)-180; |  | ||||||
|     F = [1 0 detImuTime*cosd(X_aekf(4,i-1)) 0 0; |  | ||||||
|          0 1 detImuTime*sind(X_aekf(4,i-1)) 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0;]; |  | ||||||
|     if w<WW |  | ||||||
|         vtx = detD*cosd(theta_imu(i)); |  | ||||||
|         vty = detD*sind(theta_imu(i)); |  | ||||||
|     else |  | ||||||
|         vtx = v/w*(sind(theta_imu(i))-sind(theta_imu(i-1))); |  | ||||||
|         vty = v/w*(-cosd(theta_imu(i))+cosd(theta_imu(i-1)));            |  | ||||||
|     end |  | ||||||
|     x_imu(i) = x_imu(i-1)+vtx;  |  | ||||||
|     y_imu(i) = y_imu(i-1)+vty; |  | ||||||
|     X_next = [vtx;vty;detV;detTheta;detW]; |  | ||||||
|     if (x_uwb(i) == x_uwb(i-1))&&(y_uwb(i) == y_uwb(i-1)) |  | ||||||
|         X_aekf(:,i) = X_aekf(:,i-1)+X_next; |  | ||||||
|         errAEKf(i) = norm(X_aekf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|         theta_aekf(i) = X_aekf(4,i); |  | ||||||
|         continue |  | ||||||
|     end     |  | ||||||
|     if w<WW |  | ||||||
|         X_pre(:,i) = X_aekf(:,i-1)+X_next; |  | ||||||
|         Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|         P = F*P0*F'+Q; |  | ||||||
|         Kg = P*H'*inv(H*P*H'+R); |  | ||||||
|         KK(1,1) = Kg(1,1); |  | ||||||
|         KK(2,2) = Kg(2,2); |  | ||||||
|         KK(4,3) = Kg(4,3); |  | ||||||
|         X_aekf(:,i) = X_pre(:,i)+KK*(Z-H*X_pre(:,i)); |  | ||||||
|         P0 = (I-Kg*H)*P; |  | ||||||
|     else |  | ||||||
|         JF = [1 0 1/w*(sind(theta_imu(i))-sind(theta_imu(i-1))) v/w*(cosd(theta_imu(i))-cosd(theta_imu(i-1))) detD/w*cosd(theta_imu(i))-v/(w^2)*(sind(theta_imu(i))-sind(theta_imu(i-1))); |  | ||||||
|              0 1 1/w*(-cosd(theta_imu(i))+cosd(theta_imu(i-1))) v/w*(sind(theta_imu(i))-sind(theta_imu(i-1))) detD/w*sind(theta_imu(i))-v/(w^2)*(-cosd(theta_imu(i))+cosd(theta_imu(i-1))); |  | ||||||
|              0 0 1 0 0; |  | ||||||
|              0 0 0 1 detImuTime; |  | ||||||
|              0 0 0 0 1]; |  | ||||||
|         X_pre(:,i) = X_aekf(:,i-1)+X_next; |  | ||||||
|         dk = Z - H*X_pre(:,i); |  | ||||||
|         Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|         P = JF*P0*JF'+Q; |  | ||||||
|         Kg = P*H'*inv(H*P*H'+R); |  | ||||||
|         KK(1,1) = Kg(1,1); |  | ||||||
|         KK(2,2) = Kg(2,2); |  | ||||||
|         KK(4,3) = Kg(4,3); |  | ||||||
|         X_aekf(:,i) = X_pre(:,i)+KK*(Z-H*X_pre(:,i)); |  | ||||||
|         epz = Z-H*X_aekf(:,i); |  | ||||||
|         R=alfa*R+(1-alfa)*(epz*epz'+H*P*H'); |  | ||||||
|         Q=alfa*Q+(1-alfa)*Kg*dk*dk'*Kg'; |  | ||||||
|         P0 = (I-Kg*H)*P; |  | ||||||
|     end |  | ||||||
|     errAEKf(i) = norm(X_aekf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|     theta_aekf(i) = X_aekf(4,i); |  | ||||||
|     % if errAEKf(i)>15 |  | ||||||
|     %     xxx = 1; |  | ||||||
|     % end |  | ||||||
| end |  | ||||||
| errAEKf_sw=zeros(1,nn); |  | ||||||
| weightedvector=[0.3;0.25;0.2;0.15;0.1]; |  | ||||||
| for i=1:nn |  | ||||||
| if i>windowlength-1 |  | ||||||
|     x_win=X_aekf(1,i-windowlength+1:i); |  | ||||||
|     y_win=X_aekf(2,i-windowlength+1:i); |  | ||||||
|     x_aekf_sw(i)=x_win*weightedvector; |  | ||||||
|     y_aekf_sw(i)=y_win*weightedvector; |  | ||||||
| else  |  | ||||||
|     x_aekf_sw(i)=X_aekf(1,i); |  | ||||||
|     y_aekf_sw(i)=X_aekf(2,i); |  | ||||||
| end |  | ||||||
| errAEKf_sw(i) = norm([x_aekf_sw(i);y_aekf_sw(i)]-[xt(i);yt(i)]); |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| figure; |  | ||||||
| plot(errAEKf_sw); |  | ||||||
| 
 |  | ||||||
| %% |  | ||||||
| for i=2:length(theta_uwb)-1 |  | ||||||
|     if theta_uwb(i) == 0 |  | ||||||
|         theta_uwb(i) = theta_uwb(i-1); |  | ||||||
|     end |  | ||||||
| end |  | ||||||
| figure(1) |  | ||||||
| clf(1) |  | ||||||
| plot(x_uwb,y_uwb,'.','color',[205/255, 133/255, 63/255],'LineWidth',0.2);hold on |  | ||||||
| plot(x_imu, y_imu, '-','color',[0, 128/255, 0],'LineWidth',0.5); |  | ||||||
| plot(xt, yt, '-black','LineWidth',0.5); |  | ||||||
| legend('AUAM','IMU','True value'); |  | ||||||
| xlabel('X(cm)'); |  | ||||||
| ylabel('Y(cm)'); |  | ||||||
| grid on |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| % figure(1) |  | ||||||
| % clf(1) |  | ||||||
| % hold on |  | ||||||
| % plot((1:nn)/100,thetat,'-black','LineWidth',1); |  | ||||||
| % plot((1:nn)/100,theta_uwb,'-','color','#CD853F','LineWidth',1); |  | ||||||
| % plot((1:nn)/100,theta_imu, '-','color','#008000','LineWidth',1); |  | ||||||
| % legend('LightHouse','UWB', 'INS'); |  | ||||||
| % xlabel('time(s)'); |  | ||||||
| % ylabel('\alpha(°)'); |  | ||||||
| % grid on |  | ||||||
| 
 |  | ||||||
| % figure(2) |  | ||||||
| % clf(2) |  | ||||||
| % hold on |  | ||||||
| % plot(theta_imu,'.'); |  | ||||||
| % plot(theta_uwb,'.'); |  | ||||||
| % legend('imu','uwb'); |  | ||||||
| % xlabel('运行时间(10ms)'); |  | ||||||
| % ylabel('偏航角(°)'); |  | ||||||
| % title('角速度校准后imu和uwb测量偏航角'); |  | ||||||
| % grid on |  | ||||||
| %  |  | ||||||
| % figure(3) |  | ||||||
| % clf(3) |  | ||||||
| % hold on |  | ||||||
| % plot(xt, yt, '.-black','LineWidth',1); |  | ||||||
| % plot(X_ekf(1,:), X_ekf(2,:), '.-','color','#7E2F8E','LineWidth',1); |  | ||||||
| % plot(X_aekf(1,:), X_aekf(2,:), '.-','color','#D95319','LineWidth',0.5) |  | ||||||
| % plot(x_aekf_sw, y_aekf_sw, '.-','color','#2E8B57','LineWidth',0.5) |  | ||||||
| % legend('True','EKF', 'AEKF', 'AEKF-SWF'); |  | ||||||
| % xlabel('x(cm)'); |  | ||||||
| % ylabel('y(cm)'); |  | ||||||
| % grid on |  | ||||||
| %  |  | ||||||
| % figure(4) |  | ||||||
| % clf(4) |  | ||||||
| % hold on |  | ||||||
| % plot(errKf,'.','color','#0072BD'); |  | ||||||
| % plot(errEKf,'.','color','#EDB120'); |  | ||||||
| % plot(errUKf,'.','color','#D95319'); |  | ||||||
| % plot(errAEKf,'.','color','#7E2F8E'); |  | ||||||
| % plot(errAEKf_sw,'.','color','#77AC30'); |  | ||||||
| % legend('KF','EKF','UKF','AEKF','AEKF-SWF'); |  | ||||||
| % xlabel('运行时间(10ms)'); |  | ||||||
| % ylabel('误差(cm)'); |  | ||||||
| % title('定位误差随时间变化图'); |  | ||||||
|   |  | ||||||
| % slt = 1; |  | ||||||
| % uwbcount = 9; |  | ||||||
| % imucount = 15; |  | ||||||
| % ekfcount = 12; |  | ||||||
| % aekfcount = 5; |  | ||||||
| % figure(5) |  | ||||||
| % clf(5) |  | ||||||
| % hold on |  | ||||||
| % [fUWB,xUWB] = ksdensity(errUwb(slt:end)); |  | ||||||
| % [fIMU,xIMU] = ksdensity(errImu(slt:end)); |  | ||||||
| % [fAEKF,xAEKF] = ksdensity(errAEKf(slt:end)); |  | ||||||
| % [fUKF,xUKF] = ksdensity(errUKf(slt:end)); |  | ||||||
| % [fAEKF_sw,xAEKF_sw] = ksdensity(errAEKf_sw(slt:end)); |  | ||||||
| % [fEKF,xEKF] = ksdensity(errEKf(slt:end)); |  | ||||||
| % [fKF,xKF] = ksdensity(errKf(slt:end)); |  | ||||||
| % plot(xKF(ekfcount:end),fKF(ekfcount:end), 'color','#0072BD','LineWidth',0.5); |  | ||||||
| % plot(xEKF(ekfcount:end),fEKF(ekfcount:end),'color','#EDB120','LineWidth',0.5); |  | ||||||
| % plot(xUKF(ekfcount:end), fUKF(ekfcount:end),'color','#D95319','LineWidth',0.5); |  | ||||||
| % plot(xAEKF(aekfcount:end),fAEKF(aekfcount:end),'color','#7E2F8E','LineWidth',0.5); |  | ||||||
| % plot(xAEKF_sw(aekfcount:end),fAEKF_sw(aekfcount:end), 'color','#77AC30','LineWidth',0.5) |  | ||||||
| % legend('KF','EKF','UKF','AEKF','AEKF-SWF');%'UWB','INS', |  | ||||||
| % xlabel('Error(cm)'); |  | ||||||
| % ylabel('Probability(%)'); |  | ||||||
| % grid on |  | ||||||
| %  |  | ||||||
| %  |  | ||||||
| %  |  | ||||||
| % slt = 3000; |  | ||||||
| % uwbcount = 9; |  | ||||||
| % imucount = 9; |  | ||||||
| % ekfcount = 13; |  | ||||||
| % aekfcount = 7; |  | ||||||
| % figure(6) |  | ||||||
| % clf(6) |  | ||||||
| % hold on |  | ||||||
| % [fAEKF,xAEKF] = ksdensity(errAEKf(slt:end)); |  | ||||||
| % [fUKF,xUKF] = ksdensity(errUKf(slt:end)); |  | ||||||
| % [fAEKF_sw,xAEKF_sw] = ksdensity(errAEKf_sw(slt:end)); |  | ||||||
| % [fEKF,xEKF] = ksdensity(errEKf(slt:end)); |  | ||||||
| % [fKF,xKF] = ksdensity(errKf(slt:end)); |  | ||||||
| % plot(xKF(ekfcount:end),fKF(ekfcount:end), 'color','#0072BD','LineWidth',0.5); |  | ||||||
| % plot(xEKF(ekfcount:end),fEKF(ekfcount:end),'color','#EDB120','LineWidth',0.5); |  | ||||||
| % plot(xUKF(ekfcount:end), fUKF(ekfcount:end),'color','#D95319','LineWidth',0.5); |  | ||||||
| % plot(xAEKF(aekfcount:end),fAEKF(aekfcount:end),'color','#7E2F8E','LineWidth',0.5); |  | ||||||
| % plot(xAEKF_sw(aekfcount:end),fAEKF_sw(aekfcount:end), 'color','#77AC30','LineWidth',0.5) |  | ||||||
| % legend('KF','EKF','UKF','AEKF','AEKF-SWF');%'UWB','INS', |  | ||||||
| % xlabel('Error(cm)'); |  | ||||||
| % ylabel('PDF'); |  | ||||||
| % grid on |  | ||||||
| %  |  | ||||||
| % figure(7) |  | ||||||
| % clf(7) |  | ||||||
| % hold on |  | ||||||
| % h1 = cdfplot(errKf(slt:end)); |  | ||||||
| % h2 = cdfplot(errEKf(slt:end)); |  | ||||||
| % h3 = cdfplot(errUKf(slt:end)); |  | ||||||
| % h4 = cdfplot(errAEKf(slt:end)); |  | ||||||
| % h5 = cdfplot(errAEKf_sw(slt:end)); |  | ||||||
| % set(h1,'color','#0072BD','LineWidth',0.5); |  | ||||||
| % set(h2,'color','#EDB120','LineWidth',0.5); |  | ||||||
| % set(h3,'color','#D95319','LineWidth',0.5); |  | ||||||
| % set(h4,'color','#7E2F8E','LineWidth',0.5); |  | ||||||
| % set(h5,'color','#77AC30','LineWidth',0.5); |  | ||||||
| % legend('KF','EKF','UKF','AEKF','AEKF-SWF'); |  | ||||||
| % xlabel('Error(cm)'); |  | ||||||
| % ylabel('CDF'); |  | ||||||
| % grid on |  | ||||||
| @ -1,33 +0,0 @@ | |||||||
| function [x,theta] = WLS(XN,mean_aoa,mean_d,Q) |  | ||||||
| %PLE 此处显示有关此函数的摘要 |  | ||||||
| %   此处显示详细说明 |  | ||||||
| nn = size(XN,2); |  | ||||||
| A = zeros(2*nn, 6); |  | ||||||
| b = zeros(2*nn, 1); |  | ||||||
| for j=1:nn |  | ||||||
|     XN_Tag(1,j)=mean_d(j)*sind(mean_aoa(j)); |  | ||||||
|     XN_Tag(2,j)=mean_d(j)*cosd(mean_aoa(j)); |  | ||||||
|     A(2*j-1,:)  = [XN_Tag(1,j) 0 XN_Tag(2,j) 0 1 0]; |  | ||||||
|     A(2*j,:)    = [0 XN_Tag(1,j) 0 XN_Tag(2,j) 0 1]; |  | ||||||
|     b(2*j-1:2*j)=[XN(1,j) XN(2,j)];      |  | ||||||
| end  |  | ||||||
| f=(A'*A)^(-1)*A'*b; |  | ||||||
| for i=1:2 |  | ||||||
|     for j=1:nn |  | ||||||
|         B(2*j-1,2*j-1) = XN(2,j)-f(6); |  | ||||||
|         B(2*j,2*j) = XN(1,j)-f(5); |  | ||||||
|     end |  | ||||||
|   W = inv(B*Q*B'); |  | ||||||
|   f=(A'*W*A)\A'*W*b; |  | ||||||
| end |  | ||||||
| x=(f(5:6)); |  | ||||||
| theta1(1)=atan2d(-f(2),f(1)); |  | ||||||
| theta1(2)=atan2d(f(3),f(4)); |  | ||||||
| % theta1(1)=acosd(-f(1)); |  | ||||||
| % theta1(2)=asind(-f(2)); |  | ||||||
| % theta1(3)=asind(f(3)); |  | ||||||
| % theta1(4)=acosd(-f(4)); |  | ||||||
| 
 |  | ||||||
| theta = mean(theta1); |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
										
											Binary file not shown.
										
									
								
							| @ -1,28 +0,0 @@ | |||||||
| function [Y] = fun1(X,dt) |  | ||||||
| %FUN 此处显示有关此函数的摘要 |  | ||||||
| %   此处显示详细说明 |  | ||||||
| WW = 0.05; |  | ||||||
| nn = size(X,2); |  | ||||||
| Y = zeros(5,nn); |  | ||||||
| 
 |  | ||||||
| for i=1:nn |  | ||||||
|     v = X(3,i); |  | ||||||
|     alfa = X(4,i); |  | ||||||
|     w = X(5,i)*180/pi; |  | ||||||
|     if w<WW |  | ||||||
|         alfa = alfa+w*dt; |  | ||||||
|         Y(:,i) = [X(1,i) + v*dt*cosd(alfa); |  | ||||||
|                   X(2,i) - v*dt*sind(alfa); |  | ||||||
|                   v; |  | ||||||
|                   alfa; |  | ||||||
|                   w*pi/180];         |  | ||||||
|     else |  | ||||||
|         Y(:,i) = [X(1,i) + v/w*(sind(alfa+w*dt)-sind(alfa)); |  | ||||||
|                   X(2,i) - v/w*(cosd(alfa+w*dt)-cosd(alfa)); |  | ||||||
|                   v; |  | ||||||
|                   alfa+w*dt; |  | ||||||
|                   w*pi/180]; |  | ||||||
|     end |  | ||||||
| end |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| @ -1,36 +0,0 @@ | |||||||
| 
 |  | ||||||
| 
 |  | ||||||
| clear |  | ||||||
| clc |  | ||||||
| close all |  | ||||||
| load('data1.mat'); |  | ||||||
| nn = size(imuPosX,1); |  | ||||||
| %% lightHouse坐标系转换 |  | ||||||
| x =  lightHousePosX * 100; |  | ||||||
| y = -lightHousePosZ * 100; |  | ||||||
| 
 |  | ||||||
| plot(x,y,'r',imuPosX,imuPosY); |  | ||||||
| 
 |  | ||||||
| % 定义误差函数,即均方根误差 |  | ||||||
| errorFunction = @(params) sqrt(mean((x(1:500) * cos(params(1)) - y(1:500) * sin(params(1)) + params(2) - imuPosX(1:500)).^2 + (x(1:500) * sin(params(1)) + y(1:500) * cos(params(1)) + params(3) - imuPosY(1:500)).^2)); |  | ||||||
| 
 |  | ||||||
| % 使用 fminsearch 优化误差函数,找到使误差最小的旋转角和位移 |  | ||||||
| initialGuess = [0, 10, 10]; % 初始猜测值,[旋转角, 位移] |  | ||||||
| optimizedParams = fminsearch(errorFunction, initialGuess); |  | ||||||
| 
 |  | ||||||
| % 输出优化后的旋转角和位移 |  | ||||||
| rotationAngle = optimizedParams(1); |  | ||||||
| xOffset = optimizedParams(2); |  | ||||||
| yOffset = optimizedParams(3); |  | ||||||
| % 旋转坐标 |  | ||||||
| xt = x * cos(rotationAngle) - y * sin(rotationAngle) + xOffset; |  | ||||||
| yt = x * sin(rotationAngle) + y * cos(rotationAngle) + yOffset; |  | ||||||
| 
 |  | ||||||
| plot(xt,yt,'r',imuPosX,imuPosY); |  | ||||||
| 
 |  | ||||||
| ds = zeros(1,length(imuDataRxTime)); |  | ||||||
| for i = 1:length(imuDataRxTime)-1 |  | ||||||
|     ds(i) = 1 / (imuDataRxTime(i+1)-imuDataRxTime(i)); |  | ||||||
| end |  | ||||||
| plot(ds) |  | ||||||
| 
 |  | ||||||
| @ -1,199 +0,0 @@ | |||||||
| clear |  | ||||||
| clc |  | ||||||
| close all |  | ||||||
| load('data1.mat'); |  | ||||||
| nn = size(imuPosX,1); |  | ||||||
| %% lightHouse坐标系转换 |  | ||||||
| x =  lightHousePosX * 100; |  | ||||||
| y = -lightHousePosZ * 100; |  | ||||||
| 
 |  | ||||||
| % 定义误差函数,即均方根误差 |  | ||||||
| errorFunction = @(params) sqrt(mean((x(1:500) * cos(params(1)) - y(1:500) * sin(params(1)) + params(2) - imuPosX(1:500)).^2 + (x(1:500) * sin(params(1)) + y(1:500) * cos(params(1)) + params(3) - imuPosY(1:500)).^2)); |  | ||||||
| 
 |  | ||||||
| % 使用 fminsearch 优化误差函数,找到使误差最小的旋转角和位移 |  | ||||||
| initialGuess = [0, 10, 10]; % 初始猜测值,[旋转角, 位移] |  | ||||||
| optimizedParams = fminsearch(errorFunction, initialGuess); |  | ||||||
| 
 |  | ||||||
| % 输出优化后的旋转角和位移 |  | ||||||
| rotationAngle = optimizedParams(1); |  | ||||||
| xOffset = optimizedParams(2); |  | ||||||
| yOffset = optimizedParams(3); |  | ||||||
| % 旋转坐标 |  | ||||||
| xt = x * cos(rotationAngle) - y * sin(rotationAngle) + xOffset; |  | ||||||
| yt = x * sin(rotationAngle) + y * cos(rotationAngle) + yOffset; |  | ||||||
| %% |  | ||||||
| tagN = 4; |  | ||||||
| %标签坐标 |  | ||||||
| XN(:,1)=[-300;-300]; |  | ||||||
| XN(:,2)=[-300;300]; |  | ||||||
| XN(:,3)=[300;300]; |  | ||||||
| XN(:,4)=[300;-300]; |  | ||||||
| sim2=6; |  | ||||||
| Q=diag(repmat(sim2,1,2*tagN));%协方差矩阵 |  | ||||||
| measure_AOA = zeros(4,nn); |  | ||||||
| measure_d = zeros(4,nn); |  | ||||||
| measure_AOA(1,:) = aoa1'; |  | ||||||
| measure_AOA(2,:) = aoa2'; |  | ||||||
| measure_AOA(3,:) = aoa3'; |  | ||||||
| measure_AOA(4,:) = aoa4'; |  | ||||||
| measure_d(1,:) = d1'; |  | ||||||
| measure_d(2,:) = d2'; |  | ||||||
| measure_d(3,:) = d3'; |  | ||||||
| measure_d(4,:) = d4'; |  | ||||||
| %% uwb解算 |  | ||||||
| x_uwb(1) = 0; |  | ||||||
| y_uwb(1) = 0; |  | ||||||
| theta_uwb=zeros(nn,1); |  | ||||||
| for i=2:nn |  | ||||||
|     if measure_d(1,i) == 0 |  | ||||||
|         x_uwb(i) = x_uwb(i-1); |  | ||||||
|         y_uwb(i) = y_uwb(i-1);         |  | ||||||
|         continue; |  | ||||||
|     end |  | ||||||
|     [t1,theta] = WLS(XN,measure_AOA(:,i),measure_d(:,i),Q); |  | ||||||
|     x_uwb(i) = t1(1); |  | ||||||
|     y_uwb(i) = t1(2); |  | ||||||
|     theta_uwb(i) = 90-theta; |  | ||||||
|     theta_uwb(i) = mod(theta_uwb(i)+180,360)-180; |  | ||||||
|     derr_WLS(i)=norm(t1-[xt(i);yt(i)]); |  | ||||||
| end |  | ||||||
| thetat=zeros(nn,1); |  | ||||||
| for i=2:nn |  | ||||||
| detx=xt(i)-xt(i-1); |  | ||||||
| dety=yt(i)-yt(i-1); |  | ||||||
| thetat(i)=atan2d(detx,dety); |  | ||||||
| end |  | ||||||
| % Uwb.x=x_uwb; |  | ||||||
| % Uwb.y=y_uwb; |  | ||||||
| % Uwb.alpha=theta_uwb; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| % 角速度校准 |  | ||||||
| detW = mean(wZ(1:200)); |  | ||||||
| wZ = wZ - detW; |  | ||||||
| 
 |  | ||||||
| x_imu(1) = 0;  |  | ||||||
| y_imu(1) = 0; |  | ||||||
| Z=zeros(3,1); |  | ||||||
| WW = 0.05; |  | ||||||
| theta_imu(1) = 0; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| %%  EKF |  | ||||||
| KK = zeros(5,3); |  | ||||||
| 
 |  | ||||||
| %% |  | ||||||
| %%AEKF |  | ||||||
| R = diag([1 1 1]); |  | ||||||
| % qq = 50; |  | ||||||
| % qq = 10; |  | ||||||
| qq = 0.01; |  | ||||||
| Q = diag([qq qq qq qq qq]); |  | ||||||
| P0 = diag([0 0 0 0 0]); |  | ||||||
| H = [1 0 0 0 0; |  | ||||||
|      0 1 0 0 0; |  | ||||||
|      0 0 0 1 0]; |  | ||||||
| X_aekf = zeros(5,nn); |  | ||||||
| X_aekf(:,1) = [imuPosX(1);imuPosY(1);vXY(1)*100;0;wZ(1)]; |  | ||||||
| I = eye(5); |  | ||||||
| JF = zeros(5,5); |  | ||||||
| X_pre = zeros(5,nn); |  | ||||||
| alfa = 0.97; |  | ||||||
| 
 |  | ||||||
| windowlength=5; |  | ||||||
| x_aekf_sw=zeros(1,nn); |  | ||||||
| y_aekf_sw=zeros(1,nn); |  | ||||||
| for i=2:nn |  | ||||||
|     detImuTime = imuDataRxTime(i) - imuDataRxTime(i-1); |  | ||||||
|     detOdomTime = odomDataRxTime(i)-odomDataRxTime(i-1); |  | ||||||
|     w = wZ(i); |  | ||||||
|     v = vXY(i)*100; |  | ||||||
|     detV=(vXY(i)-vXY(i-1))*100; |  | ||||||
|     detD = v*detImuTime;  |  | ||||||
|     detTheta = w*180/pi*detImuTime; |  | ||||||
|     detW = w-wZ(i-1); |  | ||||||
|     theta_imu(i) = theta_imu(i-1)+detTheta; |  | ||||||
|     theta_imu(i) = mod(theta_imu(i)+180,360)-180; |  | ||||||
|     F = [1 0 detImuTime*cosd(X_aekf(4,i-1)) 0 0; |  | ||||||
|          0 1 detImuTime*sind(X_aekf(4,i-1)) 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0;]; |  | ||||||
|       |  | ||||||
|     if w<WW |  | ||||||
|         vtx = detD*cosd(theta_imu(i)); |  | ||||||
|         vty = detD*sind(theta_imu(i)); |  | ||||||
|     else |  | ||||||
|         vtx = v/w*(sind(theta_imu(i))-sind(theta_imu(i-1))); |  | ||||||
|         vty = v/w*(-cosd(theta_imu(i))+cosd(theta_imu(i-1)));            |  | ||||||
|     end |  | ||||||
|      |  | ||||||
|     x_imu(i) = x_imu(i-1)+vtx;  |  | ||||||
|     y_imu(i) = y_imu(i-1)+vty; |  | ||||||
|     X_next = [vtx;vty;detV;detTheta;detW]; |  | ||||||
|      |  | ||||||
|     if (x_uwb(i) == x_uwb(i-1))&&(y_uwb(i) == y_uwb(i-1)) |  | ||||||
|         X_aekf(:,i) = X_aekf(:,i-1)+X_next; |  | ||||||
|         errAEKf(i) = norm(X_aekf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|         theta_aekf(i) = X_aekf(4,i); |  | ||||||
|         continue |  | ||||||
|     end     |  | ||||||
|     if w<WW |  | ||||||
|         X_pre(:,i) = X_aekf(:,i-1)+X_next; |  | ||||||
|         Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|         P = F*P0*F'+Q; |  | ||||||
|         Kg = P*H'*inv(H*P*H'+R); |  | ||||||
|         KK(1,1) = Kg(1,1); |  | ||||||
|         KK(2,2) = Kg(2,2); |  | ||||||
|         KK(4,3) = Kg(4,3); |  | ||||||
|         X_aekf(:,i) = X_pre(:,i)+KK*(Z-H*X_pre(:,i)); |  | ||||||
|         P0 = (I-Kg*H)*P; |  | ||||||
|     else |  | ||||||
|         JF = [1 0 1/w*(sind(theta_imu(i))-sind(theta_imu(i-1))) v/w*(cosd(theta_imu(i))-cosd(theta_imu(i-1))) detD/w*cosd(theta_imu(i))-v/(w^2)*(sind(theta_imu(i))-sind(theta_imu(i-1))); |  | ||||||
|              0 1 1/w*(-cosd(theta_imu(i))+cosd(theta_imu(i-1))) v/w*(sind(theta_imu(i))-sind(theta_imu(i-1))) detD/w*sind(theta_imu(i))-v/(w^2)*(-cosd(theta_imu(i))+cosd(theta_imu(i-1))); |  | ||||||
|              0 0 1 0 0; |  | ||||||
|              0 0 0 1 detImuTime; |  | ||||||
|              0 0 0 0 1]; |  | ||||||
|         X_pre(:,i) = X_aekf(:,i-1)+X_next; |  | ||||||
|         dk = Z - H*X_pre(:,i); |  | ||||||
|         Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|         P = JF*P0*JF'+Q; |  | ||||||
|         Kg = P*H'*inv(H*P*H'+R); |  | ||||||
|         KK(1,1) = Kg(1,1); |  | ||||||
|         KK(2,2) = Kg(2,2); |  | ||||||
|         KK(4,3) = Kg(4,3); |  | ||||||
|         X_aekf(:,i) = X_pre(:,i)+KK*(Z-H*X_pre(:,i)); |  | ||||||
|         epz = Z-H*X_aekf(:,i); |  | ||||||
|         R=alfa*R+(1-alfa)*(epz*epz'+H*P*H'); |  | ||||||
|         Q=alfa*Q+(1-alfa)*Kg*dk*dk'*Kg'; |  | ||||||
|         P0 = (I-Kg*H)*P; |  | ||||||
|     end |  | ||||||
|     errAEKf(i) = norm(X_aekf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|     theta_aekf(i) = X_aekf(4,i); |  | ||||||
|     % if errAEKf(i)>15 |  | ||||||
|     %     xxx = 1; |  | ||||||
|     % end |  | ||||||
| end |  | ||||||
| errAEKf_sw=zeros(1,nn); |  | ||||||
| weightedvector=[0.3;0.25;0.2;0.15;0.1]; |  | ||||||
| for i=1:nn |  | ||||||
| if i>windowlength-1 |  | ||||||
|     x_win=X_aekf(1,i-windowlength+1:i); |  | ||||||
|     y_win=X_aekf(2,i-windowlength+1:i); |  | ||||||
|     x_aekf_sw(i)=x_win*weightedvector; |  | ||||||
|     y_aekf_sw(i)=y_win*weightedvector; |  | ||||||
| else  |  | ||||||
|     x_aekf_sw(i)=X_aekf(1,i); |  | ||||||
|     y_aekf_sw(i)=X_aekf(2,i); |  | ||||||
| end |  | ||||||
| errAEKf_sw(i) = norm([x_aekf_sw(i);y_aekf_sw(i)]-[xt(i);yt(i)]); |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| figure; |  | ||||||
| plot(errAEKf_sw); |  | ||||||
| figure; |  | ||||||
| plot(x_imu,y_imu,xt,yt); |  | ||||||
| mean(errAEKf_sw) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @ -1,342 +0,0 @@ | |||||||
| clear |  | ||||||
| clc |  | ||||||
| close all |  | ||||||
| load('data1.mat'); |  | ||||||
| nn = size(imuPosX,1); |  | ||||||
| %% lightHouse坐标系转换 |  | ||||||
| x =  lightHousePosX * 100; |  | ||||||
| y = -lightHousePosZ * 100; |  | ||||||
| 
 |  | ||||||
| % 定义误差函数,即均方根误差 |  | ||||||
| errorFunction = @(params) sqrt(mean((x(1:500) * cos(params(1)) - y(1:500) * sin(params(1)) + params(2) - imuPosX(1:500)).^2 + (x(1:500) * sin(params(1)) + y(1:500) * cos(params(1)) + params(3) - imuPosY(1:500)).^2)); |  | ||||||
| 
 |  | ||||||
| % 使用 fminsearch 优化误差函数,找到使误差最小的旋转角和位移 |  | ||||||
| initialGuess = [0, 10, 10]; % 初始猜测值,[旋转角, 位移] |  | ||||||
| optimizedParams = fminsearch(errorFunction, initialGuess); |  | ||||||
| 
 |  | ||||||
| % 输出优化后的旋转角和位移 |  | ||||||
| rotationAngle = optimizedParams(1); |  | ||||||
| xOffset = optimizedParams(2); |  | ||||||
| yOffset = optimizedParams(3); |  | ||||||
| % 旋转坐标 |  | ||||||
| xt = x * cos(rotationAngle) - y * sin(rotationAngle) + xOffset; |  | ||||||
| yt = x * sin(rotationAngle) + y * cos(rotationAngle) + yOffset; |  | ||||||
| %% |  | ||||||
| tagN = 4; |  | ||||||
| %标签坐标 |  | ||||||
| XN(:,1)=[-300;-300]; |  | ||||||
| XN(:,2)=[-300;300]; |  | ||||||
| XN(:,3)=[300;300]; |  | ||||||
| XN(:,4)=[300;-300]; |  | ||||||
| sim2=6; |  | ||||||
| Q=diag(repmat(sim2,1,2*tagN));%协方差矩阵 |  | ||||||
| measure_AOA = zeros(4,nn); |  | ||||||
| measure_d = zeros(4,nn); |  | ||||||
| measure_AOA(1,:) = aoa1'; |  | ||||||
| measure_AOA(2,:) = aoa2'; |  | ||||||
| measure_AOA(3,:) = aoa3'; |  | ||||||
| measure_AOA(4,:) = aoa4'; |  | ||||||
| measure_d(1,:) = d1'; |  | ||||||
| measure_d(2,:) = d2'; |  | ||||||
| measure_d(3,:) = d3'; |  | ||||||
| measure_d(4,:) = d4'; |  | ||||||
| %% uwb解算 |  | ||||||
| x_uwb(1) = 0; |  | ||||||
| y_uwb(1) = 0; |  | ||||||
| theta_uwb=zeros(nn,1); |  | ||||||
| for i=2:nn |  | ||||||
|     if measure_d(1,i) == 0 |  | ||||||
|         x_uwb(i) = x_uwb(i-1); |  | ||||||
|         y_uwb(i) = y_uwb(i-1);         |  | ||||||
|         continue; |  | ||||||
|     end |  | ||||||
|     [t1,theta] = WLS(XN,measure_AOA(:,i),measure_d(:,i),Q); |  | ||||||
|     x_uwb(i) = t1(1); |  | ||||||
|     y_uwb(i) = t1(2); |  | ||||||
|     theta_uwb(i) = 90-theta; |  | ||||||
|     theta_uwb(i) = mod(theta_uwb(i)+180,360)-180; |  | ||||||
|     derr_WLS(i)=norm(t1-[xt(i);yt(i)]); |  | ||||||
| end |  | ||||||
| thetat=zeros(nn,1); |  | ||||||
| for i=2:nn |  | ||||||
| detx=xt(i)-xt(i-1); |  | ||||||
| dety=yt(i)-yt(i-1); |  | ||||||
| thetat(i)=atan2d(detx,dety); |  | ||||||
| end |  | ||||||
| % Uwb.x=x_uwb; |  | ||||||
| % Uwb.y=y_uwb; |  | ||||||
| % Uwb.alpha=theta_uwb; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| % 角速度校准 |  | ||||||
| detW = mean(wZ(1:200)); |  | ||||||
| wZ = wZ - detW; |  | ||||||
| 
 |  | ||||||
| x_imu(1) = 0;  |  | ||||||
| y_imu(1) = 0; |  | ||||||
| Z=zeros(3,1); |  | ||||||
| WW = 0.05; |  | ||||||
| theta_imu(1) = 0; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| %  |  | ||||||
| % Imu.x=x_imu; |  | ||||||
| % Imu.y=y_imu; |  | ||||||
| % Imu.v=v_imu; |  | ||||||
| % Imu.alpha=alpha_imu; |  | ||||||
| % Imu.omega=omega_imu; |  | ||||||
| 
 |  | ||||||
| %%  KF |  | ||||||
| R = diag([1 1 1]); |  | ||||||
| % qq = 1; |  | ||||||
| qq = 0.00001; |  | ||||||
| Q1 = diag([qq qq qq qq qq]); |  | ||||||
| P0 = diag([0 0 0 0 0]); |  | ||||||
| H = [1 0 0 0 0; |  | ||||||
|     0 1 0 0 0; |  | ||||||
|     0 0 0 1 0]; |  | ||||||
| I = eye(5); |  | ||||||
| JF = zeros(5,5); |  | ||||||
| X_pre = zeros(5,nn); |  | ||||||
| X_kf(:,1) = [imuPosX(1);imuPosY(1);vXY(1)*100;0;wZ(1)]; |  | ||||||
| for i=2:nn |  | ||||||
|     % 计算IMU和里程计的时间差值 |  | ||||||
|     detImuTime = imuDataRxTime(i) - imuDataRxTime(i-1); |  | ||||||
|     detOdomTime = odomDataRxTime(i)-odomDataRxTime(i-1); |  | ||||||
|     % 获得此时Z轴角速度 |  | ||||||
|     w = wZ(i); |  | ||||||
|     % 获得小车的水平速度 |  | ||||||
|     v = vXY(i)*100; |  | ||||||
|     % 计算速度增量 |  | ||||||
|     detV=(vXY(i)-vXY(i-1))*100; |  | ||||||
|     % 计算位置增量 |  | ||||||
|     detD = v*detImuTime;  |  | ||||||
|     % 计算角度增量 |  | ||||||
|     detTheta = w*180/pi*detImuTime; |  | ||||||
|     % 计算角速度的变化量 |  | ||||||
|     detW = w-wZ(i-1); |  | ||||||
|     % 积分计算IMU的航位角 |  | ||||||
|     theta_imu(i) = theta_imu(i-1)+detTheta; |  | ||||||
|     % 航向约束 |  | ||||||
|     theta_imu(i) = mod(theta_imu(i)+180,360)-180; |  | ||||||
|      |  | ||||||
|     % 状态更新方程 |  | ||||||
|     F = [1 0 detImuTime*cosd(X_kf(4,i-1)) 0 0; |  | ||||||
|          0 1 detImuTime*sind(X_kf(4,i-1)) 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0;]; |  | ||||||
|     % 获得水平和垂直方向的位置增量 |  | ||||||
|     vtx = detD*cosd(theta_imu(i)); |  | ||||||
|     vty = detD*sind(theta_imu(i)); |  | ||||||
| 
 |  | ||||||
|     x_imu(i) = x_imu(i-1)+vtx;  |  | ||||||
|     y_imu(i) = y_imu(i-1)+vty; |  | ||||||
| 
 |  | ||||||
|     X_next = [vtx;vty;detV;detTheta;detW]; |  | ||||||
|     if (x_uwb(i) == x_uwb(i-1))&&(y_uwb(i) == y_uwb(i-1)) |  | ||||||
|         X_kf(:,i) = X_kf(:,i-1)+X_next; |  | ||||||
|         errKf(i) = norm(X_kf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|         theta_kf(i) = X_kf(4,i); |  | ||||||
|         continue |  | ||||||
|     end     |  | ||||||
|     X_pre(:,i) = X_kf(:,i-1)+X_next; |  | ||||||
|     Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|     P = F*P0*F'+Q1; |  | ||||||
|     Kg_kf = P*H'*inv(H*P*H'+R); |  | ||||||
|     X_kf(:,i) = X_pre(:,i)+Kg_kf*(Z-H*X_pre(:,i)); |  | ||||||
|     P0 = (I-Kg_kf*H)*P; |  | ||||||
| 
 |  | ||||||
|     errKf(i) = norm(X_kf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|     theta_kf(i) = X_kf(4,i); |  | ||||||
| end |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| %%  EKF |  | ||||||
| R = diag([1 1 1]); |  | ||||||
| % qq = 1; |  | ||||||
| qq = 0.00001; |  | ||||||
| Q1 = diag([qq qq qq qq qq]); |  | ||||||
| P0 = diag([0 0 0 0 0]); |  | ||||||
| H = [1 0 0 0 0; |  | ||||||
|     0 1 0 0 0; |  | ||||||
|     0 0 0 1 0]; |  | ||||||
| KK = zeros(5,3); |  | ||||||
| X_ekf(:,1) = [imuPosX(1);imuPosY(1);vXY(1)*100;0;wZ(1)]; |  | ||||||
| I = eye(5); |  | ||||||
| JF = zeros(5,5); |  | ||||||
| X_pre = zeros(5,nn); |  | ||||||
| 
 |  | ||||||
| for i=2:nn |  | ||||||
|     detImuTime = imuDataRxTime(i) - imuDataRxTime(i-1); |  | ||||||
|     detOdomTime = odomDataRxTime(i)-odomDataRxTime(i-1); |  | ||||||
|     w = wZ(i); |  | ||||||
|     v = vXY(i)*100; |  | ||||||
|     detV=(vXY(i)-vXY(i-1))*100; |  | ||||||
|     detD = v*detImuTime;  |  | ||||||
|     detTheta = w*180/pi*detImuTime; |  | ||||||
|     detW = w-wZ(i-1); |  | ||||||
|     theta_imu(i) = theta_imu(i-1)+detTheta; |  | ||||||
|     theta_imu(i) = mod(theta_imu(i)+180,360)-180; |  | ||||||
|     F = [1 0 detImuTime*cosd(X_ekf(4,i-1)) 0 0; |  | ||||||
|          0 1 detImuTime*sind(X_ekf(4,i-1)) 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0;]; |  | ||||||
|     if w<WW |  | ||||||
|         vtx = detD*cosd(theta_imu(i)); |  | ||||||
|         vty = detD*sind(theta_imu(i)); |  | ||||||
|     else |  | ||||||
|         vtx = v/w*(sind(theta_imu(i))-sind(theta_imu(i-1))); |  | ||||||
|         vty = v/w*(-cosd(theta_imu(i))+cosd(theta_imu(i-1)));            |  | ||||||
|     end |  | ||||||
|     x_imu(i) = x_imu(i-1)+vtx;  |  | ||||||
|     y_imu(i) = y_imu(i-1)+vty; |  | ||||||
|     errUwb(i) = norm([x_uwb(i);y_uwb(i)]-[xt(i);yt(i)]); |  | ||||||
|     errImu(i) = norm([x_imu(i);y_imu(i)]-[xt(i);yt(i)]); |  | ||||||
|     X_next = [vtx;vty;detV;detTheta;detW]; |  | ||||||
|     if (x_uwb(i) == x_uwb(i-1))&&(y_uwb(i) == y_uwb(i-1)) |  | ||||||
|         X_ekf(:,i) = X_ekf(:,i-1)+X_next; |  | ||||||
|         errEKf(i) = norm(X_ekf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|         theta_ekf(i) = X_ekf(4,i); |  | ||||||
|         continue |  | ||||||
|     end     |  | ||||||
|     if w<WW |  | ||||||
|         X_pre(:,i) = X_ekf(:,i-1)+X_next; |  | ||||||
|         Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|         P = F*P0*F'+Q1; |  | ||||||
|         Kg = P*H'*inv(H*P*H'+R); |  | ||||||
|         X_ekf(:,i) = X_pre(:,i)+Kg*(Z-H*X_pre(:,i)); |  | ||||||
|         P0 = (I-Kg*H)*P; |  | ||||||
|     else |  | ||||||
|         JF = [1 0 1/w*(sind(theta_imu(i))-sind(theta_imu(i-1))) v/w*(cosd(theta_imu(i))-cosd(theta_imu(i-1))) detD/w*cosd(theta_imu(i))-v/(w^2)*(sind(theta_imu(i))-sind(theta_imu(i-1))); |  | ||||||
|              0 1 1/w*(-cosd(theta_imu(i))+cosd(theta_imu(i-1))) v/w*(sind(theta_imu(i))-sind(theta_imu(i-1))) detD/w*sind(theta_imu(i))-v/(w^2)*(-cosd(theta_imu(i))+cosd(theta_imu(i-1))); |  | ||||||
|              0 0 1 0 0; |  | ||||||
|              0 0 0 1 detImuTime; |  | ||||||
|              0 0 0 0 1]; |  | ||||||
| 
 |  | ||||||
|         X_pre(:,i) = X_ekf(:,i-1)+X_next; |  | ||||||
|         Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|         P = JF*P0*JF'+Q1; |  | ||||||
|         Kg = P*H'*inv(H*P*H'+R); |  | ||||||
|         X_ekf(:,i) = X_pre(:,i)+Kg*(Z-H*X_pre(:,i)); |  | ||||||
|         P0 = (I-Kg*H)*P; |  | ||||||
|     end |  | ||||||
|     errEKf(i) = norm(X_ekf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|     theta_ekf(i) = X_ekf(4,i); |  | ||||||
| end |  | ||||||
| %%  UKF |  | ||||||
| % UKF settings |  | ||||||
| ukf_L = 5; %numer of states |  | ||||||
| ukf_m = 3; %numer of measurements |  | ||||||
| ukf_kappa = 3 - ukf_L; |  | ||||||
| ukf_alpha = 0.9; |  | ||||||
| ukf_beta = 2; |  | ||||||
| 
 |  | ||||||
| ukf_lambda = ukf_alpha^2*(ukf_L + ukf_kappa) - ukf_L; |  | ||||||
| ukf_gamma = sqrt(ukf_L + ukf_lambda); |  | ||||||
| ukf_W0_c = ukf_lambda / (ukf_L + ukf_lambda) + (1 - ukf_alpha^2 + ukf_beta); |  | ||||||
| ukf_W0_m = ukf_lambda / (ukf_L + ukf_lambda); |  | ||||||
| ukf_Wi_m = 1 / (2*(ukf_L + ukf_lambda)); |  | ||||||
| ukf_Wi_c = ukf_Wi_m; |  | ||||||
| 
 |  | ||||||
| q=0.01;    %std of process  |  | ||||||
| r=5;    %std of measurement |  | ||||||
| p=2; |  | ||||||
| Qu=q*eye(ukf_L); % std matrix of process |  | ||||||
| Ru=r*eye(ukf_m);        % std of measurement  |  | ||||||
| Pu=p*eye(ukf_L); |  | ||||||
| H = [1 0 0 0 0; |  | ||||||
|      0 1 0 0 0; |  | ||||||
|      0 0 0 1 0]; |  | ||||||
| X_ukf(:,1) = [imuPosX(1);imuPosY(1);vXY(1)*100;0;wZ(1)]; |  | ||||||
| I = eye(5); |  | ||||||
| JF = zeros(5,5); |  | ||||||
| X_pre = zeros(5,nn); |  | ||||||
| for i=2:nn |  | ||||||
|     detImuTime = imuDataRxTime(i) - imuDataRxTime(i-1); |  | ||||||
|     detOdomTime = odomDataRxTime(i)-odomDataRxTime(i-1); |  | ||||||
|     w = wZ(i); |  | ||||||
|     v = vXY(i)*100; |  | ||||||
|     detV=(vXY(i)-vXY(i-1))*100; |  | ||||||
|     detD = v*detImuTime;  |  | ||||||
|     detTheta = w*180/pi*detImuTime; |  | ||||||
|     detW = w-wZ(i-1); |  | ||||||
|     theta_imu(i) = theta_imu(i-1)+detTheta; |  | ||||||
|     theta_imu(i) = mod(theta_imu(i)+180,360)-180; |  | ||||||
|     % F = [1 0 detImuTime*cosd(X_ekf(4,i-1)) 0 0; |  | ||||||
|     %      0 1 detImuTime*sind(X_ekf(4,i-1)) 0 0; |  | ||||||
|     %      0 0 0 0 0; |  | ||||||
|     %      0 0 0 0 0; |  | ||||||
|     %      0 0 0 0 0;]; |  | ||||||
|     if w<WW |  | ||||||
|         vtx = detD*cosd(theta_imu(i)); |  | ||||||
|         vty = detD*sind(theta_imu(i)); |  | ||||||
|     else |  | ||||||
|         vtx = v/w*(sind(theta_imu(i))-sind(theta_imu(i-1))); |  | ||||||
|         vty = v/w*(-cosd(theta_imu(i))+cosd(theta_imu(i-1)));            |  | ||||||
|     end |  | ||||||
|     x_imu(i) = x_imu(i-1)+vtx;  |  | ||||||
|     y_imu(i) = y_imu(i-1)+vty; |  | ||||||
|     errUwb(i) = norm([x_uwb(i);y_uwb(i)]-[xt(i);yt(i)]); |  | ||||||
|     errImu(i) = norm([x_imu(i);y_imu(i)]-[xt(i);yt(i)]); |  | ||||||
|     X_next = [vtx;vty;detV;detTheta;detW]; |  | ||||||
|     if (x_uwb(i) == x_uwb(i-1))&&(y_uwb(i) == y_uwb(i-1)) |  | ||||||
|         X_ukf(:,i) = X_ukf(:,i-1)+X_next; |  | ||||||
|         errUKf(i) = norm(X_ukf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|         theta_ukf(i) = X_ukf(4,i); |  | ||||||
|         continue |  | ||||||
|     end     |  | ||||||
| 
 |  | ||||||
|     xestimate = X_ukf(:,i-1); |  | ||||||
|     Xx = repmat(xestimate, 1, length(xestimate)); |  | ||||||
|     Xsigma = [xestimate, ( Xx + ukf_gamma * Pu ), ( Xx - ukf_gamma * Pu )]; |  | ||||||
|      |  | ||||||
|     %第二步:对Sigma点集进行一步预测 |  | ||||||
|     [Xsigmapre]=fun1(Xsigma,detImuTime); |  | ||||||
|     %第三步:估计预测状态 |  | ||||||
|     Xpred = ukf_W0_m * Xsigmapre(:,1) + ukf_Wi_m * sum(Xsigmapre(:,2:end), 2); |  | ||||||
|     %第四步:均值和方差 |  | ||||||
|       Xx = repmat(Xpred, 1, length(xestimate)*2); |  | ||||||
|      [~, R] = qr([sqrt(ukf_Wi_c) * ( Xsigmapre(:,2:end) - Xx ), Qu]', 0); |  | ||||||
|      Ppred = cholupdate(R, sqrt(ukf_W0_c) * (Xsigmapre(:,1) - Xpred), '-')'; |  | ||||||
| 
 |  | ||||||
|     %第5步:根据预测值,再一次使用UT变换,得到新的sigma点集 |  | ||||||
|     Xx = repmat(Xpred, 1, length(xestimate)); |  | ||||||
|     Xsigmapre = [Xpred, ( Xx + ukf_gamma * Ppred ), ( Xx - ukf_gamma * Ppred )]; |  | ||||||
| 
 |  | ||||||
|     %第6步:观测预测 |  | ||||||
|     Zsigmapre=H*Xsigmapre; |  | ||||||
| 
 |  | ||||||
|     %第7步:计算观测预测均值和协方差 |  | ||||||
|     Zpred = ukf_W0_m * Zsigmapre(:,1) + ukf_Wi_m * sum(Zsigmapre(:,2:end), 2); |  | ||||||
| 
 |  | ||||||
|     Yy = repmat(Zpred, 1, length(xestimate)*2); |  | ||||||
|     [~, Rz] = qr([sqrt(ukf_Wi_c) * (Zsigmapre(:,2:end) - Yy), Ru]', 0); |  | ||||||
|     Pzz = cholupdate(Rz, sqrt(ukf_W0_c) * (Zsigmapre(:,1) - Zpred), '-')'; |  | ||||||
| 
 |  | ||||||
|     Xd = Xsigmapre - repmat(Xpred, 1, length(xestimate)*2 + 1); |  | ||||||
|     Zd = Zsigmapre - repmat(Zpred, 1, length(xestimate)*2 + 1); |  | ||||||
|    |  | ||||||
|     Pxz = ( ukf_W0_c*  Xd(:,1) * Zd(:,1)' ) + ( ukf_Wi_c * Xd(:,2:end) * Zd(:,2:end)' ); |  | ||||||
| 
 |  | ||||||
|     %第七步:计算kalman增益 |  | ||||||
|     Kukf= (Pxz / Pzz') / Pzz; |  | ||||||
|     %第八步:状态和方差更新 |  | ||||||
|     Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|     Xpred=Xpred+Kukf*(Z-Zpred); |  | ||||||
|     U = Kukf * Pzz; |  | ||||||
|     Rp = Ppred'; |  | ||||||
|     for ii=1:size(U, 2) |  | ||||||
|         Rp = cholupdate(Rp, U(:,ii), '-'); |  | ||||||
|     end |  | ||||||
|     Ppred = Rp'; |  | ||||||
|     X_ukf(:,i)=Xpred; |  | ||||||
| 
 |  | ||||||
|     errUKf(i) = norm(X_ukf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|     theta_ukf(i) = X_ukf(4,i); |  | ||||||
| end |  | ||||||
| plot(errUKf); |  | ||||||
| mean(errUKf) |  | ||||||
| @ -1,155 +0,0 @@ | |||||||
| clear |  | ||||||
| clc |  | ||||||
| close all |  | ||||||
| load('data1.mat'); |  | ||||||
| nn = size(imuPosX,1); |  | ||||||
| %% lightHouse坐标系转换 |  | ||||||
| x =  lightHousePosX * 100; |  | ||||||
| y = -lightHousePosZ * 100; |  | ||||||
| 
 |  | ||||||
| % 定义误差函数,即均方根误差 |  | ||||||
| errorFunction = @(params) sqrt(mean((x(1:500) * cos(params(1)) - y(1:500) * sin(params(1)) + params(2) - imuPosX(1:500)).^2 + (x(1:500) * sin(params(1)) + y(1:500) * cos(params(1)) + params(3) - imuPosY(1:500)).^2)); |  | ||||||
| 
 |  | ||||||
| % 使用 fminsearch 优化误差函数,找到使误差最小的旋转角和位移 |  | ||||||
| initialGuess = [0, 10, 10]; % 初始猜测值,[旋转角, 位移] |  | ||||||
| optimizedParams = fminsearch(errorFunction, initialGuess); |  | ||||||
| 
 |  | ||||||
| % 输出优化后的旋转角和位移 |  | ||||||
| rotationAngle = optimizedParams(1); |  | ||||||
| xOffset = optimizedParams(2); |  | ||||||
| yOffset = optimizedParams(3); |  | ||||||
| % 旋转坐标 |  | ||||||
| xt = x * cos(rotationAngle) - y * sin(rotationAngle) + xOffset; |  | ||||||
| yt = x * sin(rotationAngle) + y * cos(rotationAngle) + yOffset; |  | ||||||
| %% |  | ||||||
| tagN = 4; |  | ||||||
| %标签坐标 |  | ||||||
| XN(:,1)=[-300;-300]; |  | ||||||
| XN(:,2)=[-300;300]; |  | ||||||
| XN(:,3)=[300;300]; |  | ||||||
| XN(:,4)=[300;-300]; |  | ||||||
| sim2=6; |  | ||||||
| Q=diag(repmat(sim2,1,2*tagN));%协方差矩阵 |  | ||||||
| measure_AOA = zeros(4,nn); |  | ||||||
| measure_d = zeros(4,nn); |  | ||||||
| measure_AOA(1,:) = aoa1'; |  | ||||||
| measure_AOA(2,:) = aoa2'; |  | ||||||
| measure_AOA(3,:) = aoa3'; |  | ||||||
| measure_AOA(4,:) = aoa4'; |  | ||||||
| measure_d(1,:) = d1'; |  | ||||||
| measure_d(2,:) = d2'; |  | ||||||
| measure_d(3,:) = d3'; |  | ||||||
| measure_d(4,:) = d4'; |  | ||||||
| %% uwb解算 |  | ||||||
| x_uwb(1) = 0; |  | ||||||
| y_uwb(1) = 0; |  | ||||||
| theta_uwb=zeros(nn,1); |  | ||||||
| for i=2:nn |  | ||||||
|     if measure_d(1,i) == 0 |  | ||||||
|         x_uwb(i) = x_uwb(i-1); |  | ||||||
|         y_uwb(i) = y_uwb(i-1);         |  | ||||||
|         continue; |  | ||||||
|     end |  | ||||||
|     [t1,theta] = WLS(XN,measure_AOA(:,i),measure_d(:,i),Q); |  | ||||||
|     x_uwb(i) = t1(1); |  | ||||||
|     y_uwb(i) = t1(2); |  | ||||||
|     theta_uwb(i) = 90-theta; |  | ||||||
|     theta_uwb(i) = mod(theta_uwb(i)+180,360)-180; |  | ||||||
|     derr_WLS(i)=norm(t1-[xt(i);yt(i)]); |  | ||||||
| end |  | ||||||
| thetat=zeros(nn,1); |  | ||||||
| for i=2:nn |  | ||||||
| detx=xt(i)-xt(i-1); |  | ||||||
| dety=yt(i)-yt(i-1); |  | ||||||
| thetat(i)=atan2d(detx,dety); |  | ||||||
| end |  | ||||||
| % Uwb.x=x_uwb; |  | ||||||
| % Uwb.y=y_uwb; |  | ||||||
| % Uwb.alpha=theta_uwb; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| % 角速度校准 |  | ||||||
| detW = mean(wZ(1:200)); |  | ||||||
| wZ = wZ - detW; |  | ||||||
| 
 |  | ||||||
| x_imu(1) = 0;  |  | ||||||
| y_imu(1) = 0; |  | ||||||
| Z=zeros(3,1); |  | ||||||
| WW = 0.05; |  | ||||||
| theta_imu(1) = 0; |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| %  |  | ||||||
| % Imu.x=x_imu; |  | ||||||
| % Imu.y=y_imu; |  | ||||||
| % Imu.v=v_imu; |  | ||||||
| % Imu.alpha=alpha_imu; |  | ||||||
| % Imu.omega=omega_imu; |  | ||||||
| 
 |  | ||||||
| %%  KF |  | ||||||
| R = diag([1 1 1]); |  | ||||||
| % qq = 1; |  | ||||||
| qq = 0.005; |  | ||||||
| Q1 = diag([qq qq qq qq qq]); |  | ||||||
| P0 = diag([0 0 0 0 0]); |  | ||||||
| H = [1 0 0 0 0; |  | ||||||
|     0 1 0 0 0; |  | ||||||
|     0 0 0 1 0]; |  | ||||||
| I = eye(5); |  | ||||||
| JF = zeros(5,5); |  | ||||||
| X_pre = zeros(5,nn); |  | ||||||
| X_kf(:,1) = [imuPosX(1);imuPosY(1);vXY(1)*100;0;wZ(1)]; |  | ||||||
| for i=2:nn |  | ||||||
|     % 计算IMU和里程计的时间差值 |  | ||||||
|     detImuTime = imuDataRxTime(i) - imuDataRxTime(i-1); |  | ||||||
|     detOdomTime = odomDataRxTime(i)-odomDataRxTime(i-1); |  | ||||||
|     % 获得此时Z轴角速度 |  | ||||||
|     w = wZ(i); |  | ||||||
|     % 获得小车的水平速度 |  | ||||||
|     v = vXY(i)*100; |  | ||||||
|     % 计算速度增量 |  | ||||||
|     detV=(vXY(i)-vXY(i-1))*100; |  | ||||||
|     % 计算位置增量 |  | ||||||
|     detD = v*detImuTime;  |  | ||||||
|     % 计算角度增量 |  | ||||||
|     detTheta = w*180/pi*detImuTime; |  | ||||||
|     % 计算角速度的变化量 |  | ||||||
|     detW = w-wZ(i-1); |  | ||||||
|     % 积分计算IMU的航位角 |  | ||||||
|     theta_imu(i) = theta_imu(i-1)+detTheta; |  | ||||||
|     % 航向约束 |  | ||||||
|     theta_imu(i) = mod(theta_imu(i)+180,360)-180; |  | ||||||
|      |  | ||||||
|     % 状态更新方程 |  | ||||||
|     F = [1 0 detImuTime*cosd(X_kf(4,i-1)) 0 0; |  | ||||||
|          0 1 detImuTime*sind(X_kf(4,i-1)) 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0; |  | ||||||
|          0 0 0 0 0;]; |  | ||||||
|     % 获得水平和垂直方向的位置增量 |  | ||||||
|     vtx = detD*cosd(theta_imu(i)); |  | ||||||
|     vty = detD*sind(theta_imu(i)); |  | ||||||
| 
 |  | ||||||
|     x_imu(i) = x_imu(i-1)+vtx;  |  | ||||||
|     y_imu(i) = y_imu(i-1)+vty; |  | ||||||
| 
 |  | ||||||
|     X_next = [vtx;vty;detV;detTheta;detW]; |  | ||||||
|     if (x_uwb(i) == x_uwb(i-1))&&(y_uwb(i) == y_uwb(i-1)) |  | ||||||
|         X_kf(:,i) = X_kf(:,i-1)+X_next; |  | ||||||
|         errKf(i) = norm(X_kf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|         theta_kf(i) = X_kf(4,i); |  | ||||||
|         continue |  | ||||||
|     end     |  | ||||||
|     X_pre(:,i) = X_kf(:,i-1)+X_next; |  | ||||||
|     % 观测矩阵: UWB的位置、UWB的航向角 |  | ||||||
|     Z = [x_uwb(i);y_uwb(i);theta_uwb(i)]; |  | ||||||
|     P = F*P0*F'+Q1; |  | ||||||
|     Kg_kf = P*H'*inv(H*P*H'+R); |  | ||||||
|     X_kf(:,i) = X_pre(:,i)+Kg_kf*(Z-H*X_pre(:,i)); |  | ||||||
|     P0 = (I-Kg_kf*H)*P; |  | ||||||
| 
 |  | ||||||
|     errKf(i) = norm(X_kf(1:2,i)-[xt(i);yt(i)]); |  | ||||||
|     theta_kf(i) = X_kf(4,i); |  | ||||||
| end |  | ||||||
| plot(errKf); |  | ||||||
| mean(errKf) |  | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user