00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 #include "ExtendedKalmanFilter.h"
00013 #include "KalmanFilterHistory.h"
00014 #include "utils/Time.h"
00015 #include <iostream>
00016 #include <fstream>
00017 #include <float.h>
00018 using namespace std;
00019 using namespace O_SESSAME;
00020 
00021 Matrix state_Euler_Fmatrix(KalmanFilter*);
00022 Matrix state_Euler_Hmatrix(KalmanFilter*);
00023 Matrix state_Euler_Qmatrix(KalmanFilter*);
00024 Matrix state_Euler_Rmatrix(KalmanFilter*);
00025 
00026 Vector state_Euler_stateRHSFunc(double t, Vector initialState, Vector controls, Vector params);
00027 Vector state_Euler_measurementRHSFunc(ExtendedKalmanFilter* ekf);
00028 
00029 Matrix param_Euler_Ematrix(ExtendedKalmanFilter* stateEKF);  
00030 
00031 
00032 int main() {
00033         
00034         tick();         
00035                 
00036 
00037         Vector states(3);
00038         Vector parameters(6);
00039         Vector measurements(3);
00040         Vector controls(3);                     
00041         double t = 0.0;
00042         
00043 
00044         states(1) = 0.2;
00045         states(2) = 0.2;
00046         states(3) = 0.2;
00047         
00048         parameters(1) = 5.7;
00049         parameters(2) = 0.4;
00050         parameters(3) = 0.3;
00051         parameters(4) = 5.3;
00052         parameters(5) = 0.45;
00053         parameters(6) = 9.7;
00054                 
00055         
00056 
00057         ifstream iFile;
00058         ofstream oFile;
00059         
00060 
00061         iFile.open("DataFiles/eulermeasurements.txt");
00062         oFile.open("DataFiles/EKFomegaEKFparam.txt");
00063         
00064         
00065 
00066         iFile >> t >> measurements(1) >> measurements(2) >> measurements(3);
00067 
00068 
00069 
00070 
00071         Matrix covariance = eye(3);
00072         covariance *= 0.5;
00073         
00074         Matrix kalmanGain(3,3); 
00075         
00076         
00077 
00078         ExtendedKalmanFilter state_ekf;
00079         KalmanFilterHistory state_ekfhist(&state_ekf);
00080         
00081         state_ekf.SetCovarianceMatrix(covariance);
00082         state_ekf.SetKalmanGainMatrix(kalmanGain);
00083         
00084         state_ekf.SetTimeOfEstimate(t);
00085         state_ekf.SetTimeOfMeasurements(t);
00086         state_ekf.SetStateVector(states);
00087         state_ekf.SetControlVector(controls);
00088         state_ekf.SetMeasurementVector(measurements);
00089         state_ekf.SetParameterVector(parameters);
00090 
00091         state_ekf.SetSystemProcessNoiseMatrix(&state_Euler_Qmatrix);
00092         state_ekf.SetMeasurementCovarianceMatrix(&state_Euler_Rmatrix);
00093         state_ekf.SetStateJacobianMatrix(&state_Euler_Fmatrix);
00094         state_ekf.SetMeasurementJacobianMatrix(&state_Euler_Hmatrix);
00095         
00096         state_ekf.SetStateRHS(&state_Euler_stateRHSFunc);
00097         state_ekf.SetMeasurementRHS(&state_Euler_measurementRHSFunc);
00098         
00099         state_ekfhist.AppendHistory(t);
00100         
00101         
00102         
00103 
00104         double forgettingFactor = 0.999;        
00105         Matrix param_covariance = eye(6);
00106         param_covariance *= 0.5;        
00107                 
00108         Matrix param_kalmanGain(6,3);
00109         Matrix param_Rmatrix(3,3);
00110         
00111         Matrix Ek;
00112         Vector errorVector;
00113         Vector previousStates;
00114         Vector newParameters;
00115         
00116         
00117         
00118         
00119         
00120                 
00121         while (iFile) {
00122                 
00123 
00124                 iFile >> t >> measurements(1) >> measurements(2) >> measurements(3);
00125 
00126 
00127                 state_ekf.SetTimeOfMeasurements(t);
00128                 state_ekf.SetMeasurementVector(measurements);
00129                 
00130 
00131                 state_ekf.EstimateState();
00132                 previousStates = states;
00133                 states = state_ekf.GetStateVector();
00134                 
00135                 
00136 
00137                 param_covariance *= 1.0/forgettingFactor;
00138 
00139                 Ek = param_Euler_Ematrix(&state_ekf);
00140                 
00141                 param_Rmatrix = eye(3) * pow( (0.005/pow(2.0,0.5)), 2.0 );      
00142                 param_kalmanGain = (param_covariance * ~Ek) * (Ek * param_covariance * ~Ek + param_Rmatrix).inverse();
00143 
00144                 
00145                 errorVector = (( states - previousStates ) / state_ekf.GetPropagationStepSize()) 
00146                                                          - state_ekf.GetStateDot(t, states, controls, parameters);
00147                 
00148                 newParameters = parameters + param_kalmanGain*errorVector;                              
00149                 param_covariance = ( eye(6) - param_kalmanGain*Ek )*param_covariance;
00150 
00151 
00152 
00153                 state_ekf.SetParameterVector(newParameters);
00154                 
00155                 
00156 
00157                 state_ekfhist.AppendHistory(t);
00158                 
00159         }
00160         
00161         oFile << state_ekfhist.GetHistory();
00162         
00163         cout << "Run completed @ " << tock() << endl;
00164         
00165         iFile.close();
00166         oFile.close();
00167         
00168         return 1;
00169         
00170 }
00171 
00172 
00173 
00174 
00175 
00176 
00177 Vector state_Euler_stateRHSFunc(double t, Vector initialState, Vector controls, Vector params) {
00178         
00179         
00180         Matrix MOI(3,3);
00181         MOI(1,1) = params(1);   MOI(1,2) = params(2);   MOI(1,3) = params(3);
00182         MOI(2,1) = params(2);   MOI(2,2) = params(4);   MOI(2,3) = params(5);
00183         MOI(3,1) = params(3);   MOI(3,2) = params(5);   MOI(3,3) = params(6);
00184 
00185         
00186         Vector omega(3);
00187         omega = initialState;
00188         
00189         
00190         Vector updatedState(3);
00191         updatedState = MOI/( -skew(omega) * MOI * omega );
00192                 
00193         return (updatedState);
00194         
00195 };
00196 
00197 
00198 
00199 
00200 Vector state_Euler_measurementRHSFunc(ExtendedKalmanFilter* ekf) { 
00201         
00202         Vector temp(3);
00203         temp = ekf->GetStateVector(); 
00204         
00205         return(temp);
00206         
00207 };
00208 
00209 
00210 
00211 Matrix state_Euler_Fmatrix(KalmanFilter* ekf) {
00212         
00213         Vector state  = ekf->GetStateVector();
00214         Vector params = ekf->GetParameterVector();
00215         
00216         
00217         Matrix MOI(3,3);
00218         MOI(1,1) = params(1);   MOI(1,2) = params(2);   MOI(1,3) = params(3);
00219         MOI(2,1) = params(2);   MOI(2,2) = params(4);   MOI(2,3) = params(5);
00220         MOI(3,1) = params(3);   MOI(3,2) = params(5);   MOI(3,3) = params(6);
00221         
00222         
00223         Vector omega(3);
00224         omega = state;
00225         
00226         
00227         Matrix temp(3,3);
00228         temp =  MOI/( -skew(omega) * MOI + skew(MOI*omega) );
00229         
00230         return temp;
00231         
00232 };
00233 
00234 Matrix state_Euler_Hmatrix(KalmanFilter* ekf) {
00235         
00236         Matrix temp(3,3);
00237         temp = eye(3);
00238         
00239         return temp;
00240         
00241 };
00242 
00243 Matrix state_Euler_Qmatrix(KalmanFilter* ekf) {
00244         
00245         Matrix temp = eye(3);
00246         temp *= 0.002;
00247 
00248         return temp;
00249 
00250 };
00251 
00252 Matrix state_Euler_Rmatrix(KalmanFilter* ekf) {
00253         
00254         Matrix temp = eye(3);
00255         double gyro_err = 1.0, gyro_std = gyro_err / pow(2.0, 0.5);
00256         
00257         temp *= pow(gyro_std, 2.0);
00258         
00259         return temp;
00260         
00261 };
00262 
00263 
00264 
00265 
00266 
00267 
00268 
00269 Matrix param_Euler_Ematrix(ExtendedKalmanFilter* stateEKF) {
00270         
00271         Matrix  temp(3,6);
00272         double  t = stateEKF->GetTimeOfEstimate();
00273         Vector  state = stateEKF->GetStateVector();
00274         Vector  controls = stateEKF->GetControlVector();
00275         Vector  params = stateEKF->GetParameterVector();
00276         Vector  twiddleParams;
00277         Vector  twiddlef;
00278         
00279         Vector  nominalf;
00280         nominalf = stateEKF->GetStateDot(t, state, controls, params);
00281         
00282         double  delta = sqrt(DBL_EPSILON);
00283         double  perturbation;
00284         
00285                         
00286         for (int jj = 1; jj <= 6; jj++) {
00287                 
00288                 twiddleParams = params;
00289                 perturbation = twiddleParams(jj)*delta + delta;  
00290                 twiddleParams(jj) += perturbation;
00291         
00292                 twiddlef = stateEKF->GetStateDot(t, state, controls, twiddleParams);
00293                 temp( _(1,3),jj ) = (twiddlef - nominalf) / perturbation;
00294         }
00295         
00296         return temp;
00297         
00298 };
00299 
00300 
00301 
00302 
00303 
00304 
00305 
00306 
00307 
00308 
00309 
00310 
00311 
00312 
00313 
00314 
00315 
00316 
00317 
00318 
00319 
00320 
00321 
00322 
00323 
00324 
00325