⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cekf3.m

📁 slam进阶学习
💻 M
字号:
function cekfTest1

% simulate a time interval where it is possible to run a compressed filter.

% ......................................
N=400 ;             % number of states
nObservations=200 ;
% ---- define active states indexes --
iiActiveStates = [1,5,11,55,6,88]; 
% ......................................



LA = length(iiActiveStates) ;
% ---- obtain passive states indexes --
iiActiveStates = int16(iiActiveStates);
ff = int16(zeros(1,N)) ;
ff(iiActiveStates)=1 ;
iiPassiveStates = int16(find(ff==0)) ;
% --------------------------------------
% create some correlated initial condition
%P = randn(N,N) ; 
P = randn(N,1) ;  P = P*P'+ eye(N,N)*0.01; % well correlate matrix

% P is to be used by CEKF 
P2=P     ;  % to be used by the optimized FULL EKF
P3=P     ;  % to be used by HCEKF

%set of observations. (supposed after linearization)
% here we consider a sequence of 'nObservations' observation of one dimension(only to simplify the example).
% we randomly obtain a set of observation jacobian matrixes and process and observation model noise covariances.

% observation jacobians
H_list  = randn(nObservations,LA) ;
% observation noise covariances
R_list  = abs(randn(nObservations,1)) ;
% process model noise covariances
Q_list  = randn(LA,LA,nObservations) ; 
for n=1:nObservations,                              %make it Possitive Definite 
    Q_list(:,:,n) = Q_list(:,:,n)*Q_list(:,:,n)'/1 ;   
end ;    

% apply the predictions and observations to the reduced system. We consider a sequence of predicion/update
% stages (it is not necessary to be like that)
disp('---------------------------') ;
Printi('number of states           =','[%d]',N)
Printi('number of active states    =','[%d]',LA)
Printi('number of observations\pred=','[%d]',nObservations)

% run compressed filter active component

disp('CEKF begins') ;    
t1 =cputime ;
%flops1 =flops ;
FiMat = eye(LA,LA) ;
PsiMat = zeros(LA,LA) ;
PAA = P(iiActiveStates,iiActiveStates) ;        % reduced system (active states) covariance matrix.

for n=1:nObservations,

    % prediction stage .......................................
    %J=MatrixOneinDiag + dF_list(:,:,n) ;
    %PAA = J*PAA*J' + Q_list(:,:,n) ;
   
  
    PAA = PAA + Q_list(:,:,n) ;
    % compressed auxiliary matrixes, in prediction stage ......
    %  FiMat  = J*FiMat ;  % process model jacobian is the identity matrix in this case. 
    % ......................................................
 
    
    % update stage
    H = H_list(n,:) ;                   % select observaton jacobian

    W = PAA*H' ;
    S = H*W + R_list(n) ;
    iS =inv(S) ;
    % compressed auxiliary matrixes, in update stage ......
    BetaMat = H'*iS*H ;  MuMat = PAA*BetaMat ;
    PsiMat = PsiMat + FiMat'*BetaMat*FiMat ;
    FiMat  = FiMat - MuMat*FiMat ;
    % ....................................
    PAA = PAA - W*iS*W' ;           % reduced system covariance matrix, update it.
    % ....................................
    
end ;    

% ----------------------------------------------------
% --- FULL UPDATE -----------------------------------
% ---- do full update ----
Pab_1 = P(iiActiveStates,iiPassiveStates) ;
P(iiActiveStates,iiActiveStates)=PAA ;
P(iiActiveStates,iiPassiveStates) = FiMat*Pab_1 ;
P(iiPassiveStates,iiActiveStates) = P(iiActiveStates,iiPassiveStates)' ; 
P(iiPassiveStates,iiPassiveStates)=P(iiPassiveStates,iiPassiveStates)- Pab_1'*PsiMat*Pab_1 ;
% ----------------------------------------------------
% ----------------------------------------------------
t2 =cputime ; dt = round((t2-t1)*1000) ;
%flops2 =flops ;
Printi('CEKF end            ,',' dt=[%d]ms',dt);

%dflops =flops2-flops1 ;Printi('flops    ,',' =[%%d]ms',dflops);


% ==============================================================================
% ------------------ Hybrid Compressed ---------------------------------------------------
disp('Hybrid Compressed (HCEKF) begins') ;    
t1 =cputime ;
%flops1 =flops ;

Paa = P3(iiActiveStates,iiActiveStates) ;    
PAA = [ Paa,Paa;Paa,Paa] ; 

iia2 = int16([1:LA]) ;
iia1 = int16([LA+1:2*LA]) ;
Palpha0 = Paa ;
for n=1:nObservations,
    PAA(iia2,iia2) = PAA(iia2,iia2) + Q_list(:,:,n) ;
    % update stage
    H = H_list(n,:) ;                   % select observaton jacobian
    W = PAA(:,iia2)*H' ;
    S = H*W(iia2,:) + R_list(n) ;
    iS =inv(S) ;
    PAA = PAA - W*iS*W' ;           % reduced system covariance matrix, update it.
end ;    

% ----------------------------------------------------
% --- FULL UPDATE -----------------------------------
% ---- do full update ----
Palpha =     PAA(iia1,iia1) ;
iPalfa0 = inv(Palpha0) ;
Mua = P3(iiPassiveStates,iiActiveStates)*iPalfa0 ;
DeltaPalpha = Palpha0 - Palpha ;
P3(iiPassiveStates,iiPassiveStates)=P3(iiPassiveStates,iiPassiveStates)-Mua*DeltaPalpha*Mua' ;
P3(iiActiveStates,iiActiveStates) = PAA(iia2,iia2) ;

P3(iiActiveStates,iiPassiveStates)=PAA(iia2,iia1)*Mua' ;
P3(iiPassiveStates,iiActiveStates)=P3(iiActiveStates,iiPassiveStates)' ; 

% ----------------------------------------------------
t2 =cputime ; dt = round((t2-t1)*1000) ;
Printi('HCEKF       end     ,',' dt=[%d]ms',dt)
% ---------------------------------------------------------------------

% ================= FULL FILTER ================================================

disp('FULL EKF begins') ;    
t1 =cputime ;
%flops1 =flops ;
for n=1:nObservations,

    % P=P+Q, only affect part of the P matrix
    P2(iiActiveStates,iiActiveStates) = P2(iiActiveStates,iiActiveStates) + Q_list(:,:,n) ;
    
 
    % non optimized full EKF (brute force)
    %H =zeros(1,N) ;
    %H(1,iiActiveStates) = H_list(n,:) ;  % select observaton jacobian
    %W = P2*H' ;   S = H*W + R_list(n) ;

    % optimized full EKF
    H = H_list(n,:) ;
    W = P2(:,iiActiveStates)*H' ; S = H*W(iiActiveStates,:)+R_list(n) ;
    
    
    iS =inv(S) ;
    P2 = P2 - W*iS*W' ;           
end ;    
t2 =cputime ; dt = round((t2-t1)*1000) ;
%flops2 =flops ;
Printi('FULL EKF end,        ',' dt=[%d]ms',dt)

%dflops =flops2-flops1 ;Printi('flops    ,',' =[%d]ms',dflops);


% normalize matrixes to have good idea what is going on.
dd  =sqrt(diag(P)) ; P = P./(dd*dd') ; 
dd  =sqrt(diag(P2)) ; P2 = P2./(dd*dd') ; 
dd  =sqrt(diag(P3)) ; P3 = P3./(dd*dd') ; 
clear dd ;


error2 = sum(sum(abs(P2-P))) ;
error3 = sum(sum(abs(P3-P))) ;
disp('..') ;
disp(sprintf('sum absolute errors between both normalized covariance matrixes [error = sum(sum(abs(P_cekf-P_full)))].\nIt is due to numerical error'));
Printi('error_cekf, error_Hcekf=','[%.14f]',[error2,error3]);
Printi('error_cekf, error_Hcekf=','[%e]'   ,[error2,error3]);
% ---------------------------------------------------------------------
disp('---------------------------') ;

figure(1) ;  clf ; colormap('gray') ; image(P*60); title('matrix image') ; 
hold on ; 
plot(iiActiveStates,iiActiveStates,'*y') ; 
hold off ; 


return ;
% ---------------------------------------------------------------------
function Printi(s,frmt,x)
	s1 = sprintf(frmt,x) ;
	disp([s,s1]) ;
return ; 
% ---------------------------------------------------------------------









⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -