00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "slidingModeControlMRPMW.h"
00014
00015
00016
00017
00018 slidingModeControlMRPMW::slidingModeControlMRPMW( )
00019 {
00020 }
00021
00022
00023
00024
00025
00026 slidingModeControlMRPMW::slidingModeControlMRPMW( Whorl* ptr_whorl )
00027 {
00028 m_whorl = ptr_whorl;
00029 int retcode = Initialize( );
00030 retcode = 0;
00031 }
00032
00033
00034
00035
00036 slidingModeControlMRPMW::~slidingModeControlMRPMW( )
00037 {
00038
00039 }
00040
00041
00042
00043
00044 int slidingModeControlMRPMW::Initialize( )
00045 {
00046 m_controlTorque.initialize(3);
00047
00048 m_uMax = 1.5;
00049
00050
00051 m_gainMRPError.initialize(3,3);
00052
00053
00054
00055 m_gainMRPError(1,1) = 0.05;
00056 m_gainMRPError(2,2) = 0.05;
00057 m_gainMRPError(3,3) = 0.1;
00058
00059 m_gainMRPRate.initialize(3,3);
00060
00061 for ( int i=1; i<4; i++ )
00062 {
00063 m_gainMRPRate(i,i) = 4*pow( m_gainMRPError(i,i), 0.5 );
00064 }
00065
00066
00067 A = FindA( );
00068
00069
00070 MOI_sw = FindMOI_sw();
00071
00072
00073 Quaternion qri( 0.0, 0.0, 0.0, 1.0 );
00074 m_quaternionReference(1) = qri(1);
00075 m_quaternionReference(2) = qri(2);
00076 m_quaternionReference(3) = qri(3);
00077 m_quaternionReference(4) = qri(4);
00078 m_mrpReference = ModifiedRodriguezParameters( qri );
00079 m_angularRateReference(1) = 0;
00080 m_angularRateReference(2) = 0.0;
00081 m_angularRateReference(3) = 0.0;
00082
00083 ssfTime time;
00084 time = Now( );
00085 m_previousTime = time.GetSeconds( );
00086
00087 m_estimateInertiaInv.initialize(3,3);
00088 m_estimateInertiaInv(_(1,3),_(1,3)) = matrixInv3x3( m_whorl->GetMOI( ) );
00089
00090 m_normEstimateInertiaInv = norm2( m_estimateInertiaInv );
00091
00092 m_normEstimateInertia = norm2( m_whorl->GetMOI( ) );
00093
00094 m_estimateB.initialize(3,3);
00095 m_estimateB(_(1,3),_(1,3)) = matrixInv3x3( m_whorl->GetMOI( ) );
00096
00097 m_estimateBinv.initialize(3,3);
00098 m_estimateBinv(_(1,3),_(1,3)) = matrixInv3x3( m_estimateB );
00099
00100
00101
00102 m_phi.initialize(3);
00103 m_phi(1) = 0.5;
00104 m_phi(2) = 0.5;
00105 m_phi(3) = 0.5;
00106
00107
00108
00109
00110
00111
00112 m_eta.initialize(3);
00113 m_eta(1) = 0.04;
00114 m_eta(2) = 0.04;
00115 m_eta(3) = 0.04;
00116
00117
00118
00119
00120
00121
00122 m_torqueMax = 0.02;
00123
00124 m_D_I.initialize(3,3);
00125 m_D_I(1,1) = 0.35, m_D_I(1,2)=0.05, m_D_I(1,3)=0.05;
00126 m_D_I(2,1) = 0.05, m_D_I(2,2)=0.35, m_D_I(2,3)=0.05;
00127 m_D_I(3,1) = 0.05, m_D_I(3,2)=0.05, m_D_I(3,3)=0.35;
00128 m_normD_I = norm2( m_D_I );
00129
00130 m_D_w.initialize(3,3);
00131 m_D_w(1,1) = 0.1, m_D_w(1,2) = 0.088, m_D_w(1,3) = 0.088;
00132 m_D_w(2,1) = 0.088, m_D_w(2,2) = 0.1, m_D_w(2,3) = 0.088;
00133 m_D_w(3,1) = 0.088, m_D_w(3,2) = 0.088, m_D_w(3,3) = 0.1;
00134
00135
00136
00137
00138
00139
00140 m_D_B.initialize(3,3);
00141
00142 m_D_B(_(1,3),_(1,3)) = matrixInv3x3( m_whorl->GetMOI( ) ) * ( m_D_w + m_D_I + m_D_I*m_D_w )*m_whorl->GetMOI( );
00143
00144 m_normD_B = norm2( m_D_B );
00145
00146 m_D_D.initialize(3,3);
00147 m_D_D(_(1,3),_(1,3)) = m_D_w;
00148
00149
00150 m_normD_D = norm2( m_D_D );
00151
00152 return( 0 );
00153 }
00154
00155 int slidingModeControlMRPMW::Run()
00156 {
00157
00158 Vector angularRate(3);
00159 angularRate = m_whorl->GetOmegaBL( );
00160
00161
00162
00163
00164 Vector MRP(3);
00165 MRP = m_whorl->GetMRP( );
00166
00167
00168
00169
00170
00171 ssfTime currentTime;
00172 currentTime = Now( );
00173 ssfTime deltaTime;
00174 deltaTime = ( currentTime.GetSeconds( ) - m_previousTime );
00175
00176
00177
00178
00179
00180
00181 ReferenceTrajectory( deltaTime );
00182
00183 ModifiedRodriguezParameters mrp;
00184 mrp.Set( MRP );
00185 ModifiedRodriguezParameters mrpReference;
00186 mrpReference.Set( m_mrpReference );
00187
00188
00189 Rotation RBN;
00190 RBN.Set( mrp );
00191 Rotation RRN;
00192 RRN.Set( mrpReference );
00193 Rotation RBR;
00194 RBR = RBN*~RRN;
00195
00196
00197 Vector angularRateError(3);
00198 angularRateError = angularRate - RBR.GetDCM( )*(m_angularRateReference);
00199 ModifiedRodriguezParameters mrpError;
00200 mrpError = mrp - mrpReference;
00201 mrpError.Switch( 1 );
00202 cout << "MRP: " << mrp << endl;
00203 cout << "Rate: " << angularRate << endl;
00204
00205
00206 m_whorl->SetMRPError( mrpError );
00207 m_whorl->SetAngularRateError( angularRateError );
00208
00209
00210 m_whorl->SetReferenceOmegaBL( m_angularRateReference );
00211 m_whorl->SetReferenceQuaternion( m_quaternionReference );
00212
00213
00214 Vector wheelSpeed(3);
00215 double meastime;
00216
00217 m_whorl->GetMomentumWheel("REACTION_X")->GetWheelSpeed( wheelSpeed(1), meastime );
00218 m_whorl->GetMomentumWheel("REACTION_Y")->GetWheelSpeed( wheelSpeed(2), meastime );
00219 m_whorl->GetMomentumWheel("REACTION_Z")->GetWheelSpeed( wheelSpeed(3), meastime );
00220
00221
00222
00223
00224
00225
00226
00227 Vector hs(3);
00228 Vector w(3);
00229 Matrix ws(1,1);
00230 for ( int i=1; i<4; i++ )
00231 {
00232 w(1) = A(1,i);
00233 w(2) = A(2,i);
00234 w(3) = A(3,i);
00235 ws = ~w*angularRate;
00236 hs(i) = MOI_sw(i,i) * ( ws(1,1) + wheelSpeed(i) );
00237 }
00238
00239 Vector estimatef(3);
00240 estimatef = -m_estimateInertiaInv*skew( angularRate )*( m_whorl->GetMOI( )*angularRate + A*hs );
00241
00242
00243
00244
00245
00246
00247
00248 ModifiedRodriguezParameters mrpRate;
00249 AttitudeModels MRPRate;
00250 MRPRate.MRPKinematic( mrpError, angularRateError, mrpRate );
00251
00252
00253 Vector ueq(3);
00254
00255 ueq = m_estimateBinv*( -estimatef + RBR.GetDCM( )*(m_angularAccelReference)
00256 - skew( angularRate )*RBR.GetDCM( )*(m_angularRateReference) - m_gainMRPRate*mrpRate
00257 - m_gainMRPError*mrpError );
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267 Vector s(3);
00268 double dt = 0.5;
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 s = angularRateError + m_gainMRPRate*mrpError + m_gainMRPError*mrpError*dt;
00279
00280
00281
00282 Vector sat(3);
00283 sat = Saturation( s, m_phi );
00284
00285
00286 Vector D_s(3);
00287 D_s = A*hs;
00288
00289 Vector one(3);
00290 one(1) = 1;
00291 one(2) = 1;
00292 one(3) = 1;
00293
00294 Vector F(3);
00295
00296
00297
00298
00299
00300
00301
00302
00303 F = matrixInv3x3( m_whorl->GetMOI( ) )*Vabs( ( -skew( angularRate )*m_D_I + m_D_I*skew( angularRate ) + m_D_I*skew( angularRate )*m_D_I )*m_whorl->GetMOI( )*angularRate
00304 + ( -skew( angularRate )*m_D_D + m_D_I*skew( angularRate ) + m_D_I*skew( angularRate )*m_D_D )*D_s
00305 + ( eye(3) + m_D_I )*m_torqueMax*one );
00306
00307 cout << "F: " << F << endl;
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317 Vector K(3);
00318 K = matrixInv3x3( eye(3) - m_D_B )*( F + m_D_B*(Vabs( estimatef - RBR.GetDCM( )*(m_angularAccelReference)
00319 + skew( angularRate )*RBR.GetDCM( )*(m_angularRateReference) + m_gainMRPRate*mrpRate
00320 + m_gainMRPError*mrpError ) ) + m_eta );
00321
00322
00323
00324
00325
00326
00327
00328 Matrix matK(3,3);
00329 matK(1,1) = K(1);
00330 matK(2,2) = K(2);
00331 matK(3,3) = K(3);
00332 cerr << "K: " << ~K << endl;
00333
00334
00335 Vector urob(3);
00336 urob = m_estimateBinv*matK*sat;
00337
00338
00339
00340
00341
00342
00343
00344 m_controlTorque = ( ueq - urob );
00345 cout << "control before A: " << ~m_controlTorque << endl;
00346 m_controlTorque = ~A*m_controlTorque;
00347
00348 cout << "A: " << A << endl;
00349 cout << "A inv: " << (~A) << endl;
00350 cout << "eq: " << ~ueq << endl;
00351 cout << "rob: " << ~urob << endl;
00352
00353 cout << "control after A: " << ~m_controlTorque << endl;
00354
00355 m_controlTorque = WheelSaturation( m_controlTorque );
00356
00357 cout << "control after Wheel Sat: " << ~m_controlTorque << endl;
00358
00359
00360 m_whorl->SetControl( m_controlTorque );
00361
00362
00363 SetWheelTorque( m_controlTorque );
00364
00365 return( 0 );
00366 }
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380