00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "DefaultObserver.h"
00014
00015 Matrix Euler_Fmatrix(KalmanFilter* ekf);
00016 Matrix Euler_Hmatrix(KalmanFilter* kf);
00017 Matrix Euler_Qmatrix(KalmanFilter* kf);
00018 Matrix Euler_Rmatrix(KalmanFilter* kf);
00019 Vector Euler_stateRHSFunc(double t, Vector initialState, Vector controls, Vector params);
00020 Vector Euler_measurementRHSFunc(ExtendedKalmanFilter* ekf);
00021
00022
00023 int DefaultObserver::Initialize() {
00024
00025
00026 Matrix P(3,3);
00027 P(1,1) = 0.001; P(1,2) = 0.0; P(1,3) = 0.0;
00028 P(2,1) = 0.0; P(2,2) = 0.001; P(2,3) = 0.0;
00029 P(3,1) = 0.0; P(3,2) = 0.0; P(3,3) = 0.001;
00030 Matrix K(3,3);
00031 K(1,1) = 0.001; K(1,2) = 0.0; K(1,3) = 0.0;
00032 K(2,1) = 0.0; K(2,2) = 0.001; K(2,3) = 0.0;
00033 K(3,1) = 0.0; K(3,2) = 0.0; K(3,3) = 0.001;
00034
00035 ekf.SetCovarianceMatrix(P);
00036 ekf.SetKalmanGainMatrix(K);
00037
00038 ekf.SetSystemProcessNoiseMatrix(&Euler_Qmatrix);
00039 ekf.SetMeasurementCovarianceMatrix(&Euler_Rmatrix);
00040 ekf.SetStateJacobianMatrix(&Euler_Fmatrix);
00041 ekf.SetMeasurementJacobianMatrix(&Euler_Hmatrix);
00042
00043 ekf.SetStateRHS(&Euler_stateRHSFunc);
00044 ekf.SetMeasurementRHS(&Euler_measurementRHSFunc);
00045
00046 return 0;
00047
00048 };
00049
00050
00051 int DefaultObserver::Run() {
00052
00053
00054 m_measurements[0] = m_whorl->GetRateGyro(string("dmu_rg1"))->GetMeasurement();
00055 m_measurements[1] = m_whorl->GetRateGyro(string("dmu_rg2"))->GetMeasurement();
00056 m_measurements[2] = m_whorl->GetRateGyro(string("dmu_rg3"))->GetMeasurement();
00057 Vector z(3);
00058 z(1) = m_measurements[0].GetAsDouble();
00059 z(2) = m_measurements[1].GetAsDouble();
00060 z(3) = m_measurements[2].GetAsDouble();
00061
00062
00063 timeval measurementTime, currentTime;
00064 m_measurements[0].GetTime(measurementTime);
00065 currentTime = m_whorl->GetTimeOfEstimate();
00066 double relTimeOfMeasurement = static_cast<double>(measurementTime.tv_sec - currentTime.tv_sec) + (static_cast<double>(measurementTime.tv_usec - currentTime.tv_usec)) * 1e-6;
00067
00068
00069
00070
00071 Vector state = m_whorl->GetOmegaBL();
00072 Vector control = m_whorl->GetControl();
00073 Vector params = m_whorl->GetParameter();
00074 double zero = 0.0;
00075 ekf.SetTimeOfEstimate(zero);
00076 ekf.SetTimeOfMeasurements(relTimeOfMeasurement);
00077 ekf.SetStateVector(state);
00078 ekf.SetControlVector(control);
00079 ekf.SetParameterVector(params);
00080 ekf.SetMeasurementVector(z);
00081
00082
00083 ekf.EstimateState();
00084
00085
00086
00087 state = ekf.GetStateVector();
00088 Vector fullState(7);
00089 fullState(4) = 1.0;
00090 fullState(_(5,7)) = state;
00091 m_whorl->SetState(fullState);
00092 m_whorl->SetTimeOfEstimate(measurementTime);
00093
00094 return 0;
00095
00096 };
00097
00098 Matrix Euler_Fmatrix(KalmanFilter* ekf) {
00099
00100 Vector state = ekf->GetStateVector();
00101 Vector params = ekf->GetParameterVector();
00102
00103 Matrix MOI(3,3);
00104
00105 MOI(1,1) = params(1); MOI(1,2) = params(2); MOI(1,3) = params(3);
00106 MOI(2,1) = params(2); MOI(2,2) = params(4); MOI(2,3) = params(5);
00107 MOI(3,1) = params(3); MOI(3,2) = params(5); MOI(3,3) = params(6);
00108
00109 Vector w = state;
00110
00111 Matrix temp = MOI/( -skew(w)*MOI + skew(MOI * w) );
00112
00113 return temp;
00114
00115 };
00116
00117 Matrix Euler_Hmatrix(KalmanFilter* kf) {
00118
00119 Matrix temp(3,3);
00120
00121 temp(1,1) = 1.0; temp(1,2) = 0.0; temp(1,3) = 0.0;
00122 temp(2,1) = 0.0; temp(2,2) = 1.0; temp(2,3) = 0.0;
00123 temp(3,1) = 0.0; temp(3,2) = 0.0; temp(3,3) = 1.0;
00124
00125 return temp;
00126
00127 };
00128
00129 Matrix Euler_Qmatrix(KalmanFilter* kf) {
00130
00131 Matrix temp(3,3);
00132
00133 temp(1,1) = 0.0001; temp(1,2) = 0.0; temp(1,3) = 0.0;
00134 temp(2,1) = 0.0; temp(2,2) = 0.001; temp(2,3) = 0.0;
00135 temp(3,1) = 0.0; temp(3,2) = 0.0; temp(3,3) = 0.001;
00136
00137 return temp;
00138
00139 };
00140
00141 Matrix Euler_Rmatrix(KalmanFilter* ekf) {
00142
00143 Matrix temp(3,3);
00144 double gyro_err = 0.005, gyro_std = gyro_err / pow(2.0, 0.5);
00145
00146 temp(1,1) = pow(gyro_std, 2.0); temp(1,2) = 0.0; temp(1,3) = 0.0;
00147 temp(2,1) = 0.0; temp(2,2) = pow(gyro_std, 2.0); temp(2,3) = 0.0;
00148 temp(3,1) = 0.0; temp(3,2) = 0.0; temp(3,3) = pow(gyro_std, 2.0);
00149
00150 return temp;
00151
00152 };
00153
00154 Vector Euler_stateRHSFunc(double t, Vector initialState, Vector controls, Vector params) {
00155
00156 Vector w = initialState;
00157
00158 Matrix MOI(3,3);
00159
00160 MOI(1,1) = params(1); MOI(1,2) = params(2); MOI(1,3) = params(3);
00161 MOI(2,1) = params(2); MOI(2,2) = params(4); MOI(2,3) = params(5);
00162 MOI(3,1) = params(3); MOI(3,2) = params(5); MOI(3,3) = params(6);
00163
00164
00165 return (MOI / ( (-skew(w) * MOI * w) + controls) );
00166 };
00167
00168 Vector Euler_measurementRHSFunc(ExtendedKalmanFilter* ekf) { return ekf->GetStateVector(); };
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223