00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "Controller.h"
00013
00014 Controller::Controller( )
00015 {
00016 m_quaternionReference.initialize(4);
00017 m_angularRateReference.initialize(3);
00018 m_angularAccelReference.initialize(3);
00019 m_mrpReference.initialize(3);
00020 }
00021
00022 Controller::Controller(Whorl* ptr_whorl)
00023 {
00024 m_whorl = ptr_whorl;
00025 A = FindA();
00026 MOI_sw = FindMOI_sw();
00027
00028 m_quaternionReference.initialize(4);
00029 m_angularRateReference.initialize(3);
00030 m_angularAccelReference.initialize(3);
00031 m_mrpReference.initialize(3);
00032
00033 }
00034
00035 Controller::~Controller( )
00036 {
00037 }
00038
00039 Matrix Controller::FindA()
00040 {
00041
00042 static int wheel_num = m_whorl->GetMomentumWheel("REACTION_X")->GetWheelCount();
00043 Matrix temp(wheel_num,3);
00044 string wheel("REACTION_");
00045 string axis;
00046 string name;
00047 for (int ii =1;ii<=wheel_num;ii++)
00048 {
00049
00050 if (ii==1) axis = "X";
00051 if (ii==2) axis = "Y";
00052 if (ii==3) axis = "Z";
00053
00054
00055 string name =wheel+axis;
00056 MomentumWheel *whl = m_whorl->GetMomentumWheel(name);
00057 Vector tempVect = whl->GetWheelAxis();
00058 temp(_,ii)=tempVect;
00059 }
00060 return temp;
00061 }
00062
00063 Matrix Controller::FindMOI_sw()
00064 {
00065
00066 static int wheel_num = m_whorl->GetMomentumWheel("REACTION_X")->GetWheelCount();
00067 Matrix temp(wheel_num,wheel_num);
00068 string wheel("REACTION_");
00069 string axis;
00070 string name;
00071 for (int ii =1;ii<=wheel_num;ii++)
00072 {
00073 if (ii==1) axis="X";
00074 if (ii==2) axis="Y";
00075 if (ii==3) axis="Z";
00076
00077
00078 string name =wheel+axis;
00079 temp(ii,ii)=m_whorl->GetMomentumWheel(name)->GetAxialInertia();
00080 }
00081 return temp;
00082 }
00083
00084 int Controller::SetWheelTorque(Vector Torque)
00085 {
00086 static int wheel_num = m_whorl->GetMomentumWheel("REACTION_X")->GetWheelCount();
00087 string wheel("REACTION_");
00088 string axis;
00089 string name;
00090 for (int ii =1;ii<=wheel_num;ii++)
00091 {
00092 if (ii==1) axis="X";
00093 if (ii==2) axis="Y";
00094 if (ii==3) axis="Z";
00095
00096
00097 string name = wheel+axis;
00098 m_whorl->GetMomentumWheel(name)->SetWheelTorque(Torque(ii));
00099 }
00100 return 0;
00101 }
00102
00103
00104 int Controller::SetThrusterTorque(char Thruster_set, int Number_of_Pulses, double Pulse_legth)
00105 {
00106 return 0;
00107 }
00108
00109 void Controller::ReferenceModelSC( ssfTime deltaTime )
00110 {
00111
00112 RungeKuttaIntegrator myIntegrator;
00113 myIntegrator.SetNumSteps(10);
00114
00115
00116 vector<ssfTime> integrationTimes;
00117 ssfTime begin(0);
00118 ssfTime end( begin + deltaTime.GetSeconds( ) );
00119 integrationTimes.push_back(begin);
00120 integrationTimes.push_back(end);
00121
00122
00123 Vector state(7);
00124 state( _(1,4) ) = m_quaternionReference;
00125 state( _(5,7) ) = m_angularRateReference;
00126
00127 SpecificFunctor AttitudeForcesFunctor( &NullFunctor );
00128
00129
00130 Matrix Parameters(3,3);
00131 Parameters = m_whorl->GetMOI( );
00132
00133
00134 Matrix history = myIntegrator.Integrate(
00135 integrationTimes,
00136 &AttituteDynamics_QuaternionAngVel,
00137 state,
00138 NULL,
00139 NULL,
00140 Parameters,
00141 AttitudeForcesFunctor
00142 );
00143
00144 m_quaternionReference = ~history( 11, _(2,5) );
00145 m_angularRateReference = ~history( 11, _(6,8) );
00146
00147 Quaternion quaternion( m_quaternionReference );
00148 ModifiedRodriguezParameters mrpReference( quaternion );
00149 mrpReference.Switch( 1 );
00150 m_mrpReference = mrpReference;
00151
00152 state( _(1,4) ) = m_quaternionReference;
00153 state( _(5,7) ) = m_angularRateReference;
00154 Vector derivative = AttituteDynamics_QuaternionAngVel( end, state, NULL, NULL, Parameters, AttitudeForcesFunctor );
00155 m_angularAccelReference = derivative( _(5,7) );
00156
00157 return;
00158 }
00159
00160
00161 Vector NullFunctor(const ssfTime& _pSSFTime, const OrbitState& _pOrbitState, const AttitudeState& _pAttitudeState)
00162 {
00163 return Vector(3);
00164 }
00165
00166
00167 void Controller::ReferenceTrajectory( ssfTime deltaTime )
00168 {
00169
00170 if ( deltaTime.GetSeconds( ) < 25 )
00171 {
00172 deltaTime = 0;
00173 }
00174 else
00175 {
00176 deltaTime = deltaTime-25;
00177 }
00178
00179 double time = deltaTime.GetSeconds( );
00180
00181
00182 RungeKuttaIntegrator myIntegrator;
00183 myIntegrator.SetNumSteps(10);
00184
00185
00186 vector<ssfTime> integrationTimes;
00187 ssfTime begin(deltaTime);
00188 ssfTime end( begin + 0.5 );
00189 integrationTimes.push_back(begin);
00190 integrationTimes.push_back(end);
00191
00192
00193 Vector state(4);
00194 state( _(1,4) ) = m_quaternionReference;
00195
00196 SpecificFunctor AttitudeForcesFunctor( &NullFunctor );
00197
00198
00199 Matrix Parameters(3,3);
00200 Parameters = m_whorl->GetMOI( );
00201
00202 Matrix history = myIntegrator.Integrate(
00203 integrationTimes,
00204 &AttitudeTrajectory,
00205 state,
00206 NULL,
00207 NULL,
00208 Parameters,
00209 AttitudeForcesFunctor
00210 );
00211
00212 m_quaternionReference = ~history( 11, _(2,5) );
00213
00214
00215 double omega = 0.025;
00216 double C1 = 30;
00217 double C2 = -0.1;
00218 m_angularRateReference(1) = 0;
00219 m_angularRateReference(2) = 0;
00220 m_angularRateReference(3) = exp( -time/C1 )*sin( omega*time ) + C2;
00221
00222 Quaternion quaternion( m_quaternionReference );
00223 ModifiedRodriguezParameters mrpReference( quaternion );
00224 mrpReference.Switch( 1 );
00225 m_mrpReference = mrpReference;
00226
00227
00228
00229 m_angularAccelReference(1) = 0;
00230 m_angularAccelReference(2) = 0;
00231 m_angularAccelReference(3) = -exp( -time/C1 )*sin( omega*time )/C1 + omega*exp( -time/C1 )*cos( omega*time );
00232
00233 return;
00234 }
00235
00236
00237 Vector AttitudeTrajectory(const ssfTime &_time, const Vector& _state, Orbit *_Orbit, Attitude *_Attitude, const Matrix &_parameters, const Functor &_torqueFuncPtr)
00238 {
00239 static Vector stateDot(4);
00240
00241 static Vector _quaternionRate(4);
00242
00243 static Quaternion q;
00244 q = _state( _(1,4) );
00245
00246 static Quaternion qRate;
00247
00248 double time = _time.GetSeconds( );
00249
00250 double omega = 0.025;
00251 double C1 = 30;
00252 double C2 = -0.1;
00253 static Vector angularRate(3);
00254 angularRate(1) = 0;
00255 angularRate(2) = 0;
00256 angularRate(3) = exp( -time/C1 )*sin( omega*time ) + C2;
00257
00258
00259
00260
00261
00262
00263 AttitudeModels Rate;
00264 Rate.QuaternionKinematic( q, angularRate, qRate );
00265
00266 stateDot( _(1,4) ) = qRate;
00267
00268
00269 return (stateDot);
00270 }
00271
00272
00273 Vector Controller::Saturation( Vector _s, Vector _phi )
00274 {
00275 Vector _sat(3);
00276
00277 for( int iterator = 1; iterator < 4; iterator++ )
00278 {
00279 if( fabs( _s( iterator ) ) <= _phi( iterator ) )
00280 {
00281 _sat( iterator ) = _s( iterator )/_phi( iterator );
00282 }
00283 else
00284 {
00285 _sat( iterator ) = SignSingle( _s( iterator ) );
00286 }
00287 }
00288 return( _sat );
00289 }
00290
00291 Vector Controller::Sign( Vector _s )
00292 {
00293 Vector _sign(3);
00294
00295 for( int iterator = 1; iterator < 4; iterator++ )
00296 {
00297 _sign( iterator ) = SignSingle( _s( iterator ) );
00298 }
00299 return( _sign );
00300 }
00301
00302
00303 Vector Controller::WheelSaturation( Vector _u )
00304 {
00305 Vector _uSat(3);
00306
00307 for( int iterator = 1; iterator < 4; iterator++ )
00308 {
00309 if( fabs( _u( iterator ) ) <= m_uMax )
00310 {
00311 _uSat( iterator ) = _u( iterator );
00312 }
00313 else
00314 {
00315 _uSat( iterator ) = m_uMax*SignSingle( _u( iterator ) );
00316 }
00317 }
00318 return( _uSat );
00319 }
00320
00321
00322
00323 double Controller::SignSingle( double _s )
00324 {
00325 if( _s >= 0 )
00326 {
00327 _s = 1;
00328 }
00329 else
00330 {
00331 _s = -1;
00332 }
00333
00334 return( _s );
00335 }
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366