Contents
Demonstrate orbit estimation using UKFPredict and UKFUpdate.
The plots are the covariance, which goes to zero quickly, and the estimation errors.
See also KFInitialize, RK4, UKFPredict, UKFUpdate, RHSOrbitWithDisturbances, UKFWeight, MeasEarthTarget, MeasOrbitState
%-------------------------------------------------------------------------- % Copyright 2016 Princeton Satellite Systems, Inc. % All rights reserved. %--------------------------------------------------------------------------
Simulation parameters
nSim = 400; xP = zeros(19,nSim); rHSFunData = RHSOrbit; r = 7000; x = [r;0;0;0;sqrt(rHSFunData.mu/r);0]; dT = 100; % Position and velocity uncertainty rU = 10; vU = sqrt(rHSFunData.mu/r) - sqrt(rHSFunData.mu/(r+rU)); % State estimate at start m0 = [r+rU;0;0;0;sqrt(rHSFunData.mu/(r+rU));0]; % Covariance based on the uncertainty p0 = [rU^2;rU^2;rU^2;vU^2;vU^2;vU^2]; q0 = [0;0;0;1e-3;1e-3;1e-3]; % Plant noise noise1Sigma = 0.1*[1;1;1;1e-3;1e-3;1e-3]; noise1SigmaET = [0.01;0.0001]; r0 = diag(noise1Sigma.^2); rET0 = diag(noise1SigmaET.^2); % Initialize the UKF ukf = KFInitialize( 'ukf','f',@RHSOrbit,'alpha',1,... 'kappa',0,'beta',2,'dT',dT,'fData',rHSFunData,... 'p',diag(p0),'q',diag(q0),'x',x,... 'm',m0); ukf = UKFWeight( ukf ); hData = struct('noise1Sigma',[0;0;0;0;0;0]); hDataSim = struct('noise1Sigma',noise1Sigma); hETData = MeasEarthTarget; hETDataSim = hETData; hETDataSim.noise1Sigma = noise1SigmaET; [ukf.y(2).data, rT]= MeasEarthTarget( x, hETDataSim );
Simulate
t = (0:(nSim-1))*dT; for k = 1:nSim % Plotting dRho = Mag(ukf.m(1:3) - rT) - Mag(x(1:3) - rT); xP(:,k) = [ukf.m; x; diag(ukf.p); dRho]; % Kalman Filter Prediction step ukf.t = t(k); ukf = UKFPredict( ukf ); % Update the RHS x = RK4( @RHSOrbit, x, dT, t(k), rHSFunData ); % GPS sensor ukf.y(1).data = MeasOrbitState( x, hDataSim ); ukf.y(1).param.hFun = @MeasOrbitState; ukf.y(1).param.hData = hData; ukf.y(1).param.r = r0; % Earth sensor [ukf.y(2).data, rT] = MeasEarthTarget( x, hETDataSim ); ukf.y(2).param.hFun = @MeasEarthTarget; ukf.y(2).param.hData = hETData; ukf.y(2).param.r = rET0; % Filter update step ukf = UKFUpdate( ukf ); end
Plot
[t,tL] = TimeLabl(t); yL = {'x (km)' 'y (km)' 'z (km)' 'v_x (km/s)' 'v_y (km/s)' 'v_z (km/s)' '\rho_T (km)' }; dX = xP(1:6,:) - xP(7:12,:); Plot2D( t, dX(4:6,:), tL, yL(4:6), 'Orbit Velocity Estimation Error' ); Plot2D( t, sqrt(xP(13:18,:)), tL, yL(1:6), 'Orbit Covariance' ); l = 100:length(t); Plot2D( t(l), [dX(1:3,l);xP(19,l)], tL, yL([1:3 7]), 'Orbit Errors' ); %--------------------------------------