Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages | Examples

AngularRateController.cpp

Go to the documentation of this file.
00001 //////////////////////////////////////////////////////////////////////////////////////////////////
00002 /*! \file AngularRateController.cpp
00003 *  \brief Implementation of the AngularRateController class.
00004 *  \author $Author: jayhawk_hokie $
00005 *  \version $Revision: 1.1 $
00006 *  \date    $Date: 2007/08/31 15:52:56 $
00007 *//////////////////////////////////////////////////////////////////////////////////////////////////
00008 /*! 
00009 */
00010 //////////////////////////////////////////////////////////////////////////////////////////////////
00011 
00012 
00013 #include "AngularRateController.h"
00014 
00015 /* Constructor */
00016 AngularRateController::AngularRateController( )
00017 { 
00018 }
00019 
00020 AngularRateController::AngularRateController( Whorl* ptr_whorl ) 
00021 {
00022         /* Set Maximum control torque for wheels. */
00023         m_uMax = 1.5; // [N-m]
00024 
00025         // From Controller Class
00026         m_whorl = ptr_whorl;
00027         
00028         Initialize( );
00029         
00030 }
00031 
00032 /* Deconstructor */
00033 AngularRateController::~AngularRateController() 
00034 { }
00035 
00036 int AngularRateController::Initialize( ) 
00037 {
00038         /* Initialize control torque */
00039         m_controlTorque.initialize(3); // [N-m]
00040 
00041         m_uMax =1.5; // [N-m]
00042 
00043         double K = 1.5;
00044 
00045         /* Set the contorl gain matrix. semi automatic gain selection */
00046         m_gainMatrix.initialize(3,3);
00047         Matrix _inertiaTemp(3,3);
00048         _inertiaTemp = m_whorl->GetMOI( );
00049         for ( int i=1; i<4; i++ )
00050         {
00051                 m_gainMatrix(i,i) = pow( ( K* _inertiaTemp(i,i) ), 0.5 );
00052         }
00053         
00054         /* Get orientation of Momentum Wheels */
00055         A = FindA( );
00056 
00057         /* Get Momentum Wheel spin axis MOI */
00058         MOI_sw = FindMOI_sw( );
00059 
00060         /* Reference Model, Regulator problem, therefore desired states are zero. */
00061         Quaternion qri( 0.0, 0.0, 0.0, 1.0 );
00062         m_quaternionReference(1) = qri(1);
00063         m_quaternionReference(2) = qri(2);
00064         m_quaternionReference(3) = qri(3);
00065         m_quaternionReference(4) = qri(4);
00066         m_mrpReference = ModifiedRodriguezParameters( qri );
00067         m_angularRateReference(1) = 0.0; // [rad/s]
00068         m_angularRateReference(2) = 0.0; // [rad/s]
00069         m_angularRateReference(3) = 0.0; // [rad/s]
00070 
00071         ssfTime time;
00072         time = Now( );
00073         m_previousTime = time.GetSeconds( );
00074 
00075         return( 0 );
00076 }
00077 
00078 int AngularRateController::Run( )
00079 {
00080         ssfTime currentTime;
00081         currentTime = Now( );
00082         ssfTime deltaTime;
00083         deltaTime = ( currentTime.GetSeconds( ) - m_previousTime );
00084         //m_previousTime = currentTime.GetSeconds( ); // update time
00085         // dont' update time, thus provides duration time in seconds.
00086 
00087         /* Desired State. Reference Model */
00088         //ReferenceModelSC( deltaTime );
00089         ReferenceTrajectory( deltaTime );
00090 
00091         ModifiedRodriguezParameters mrp( m_whorl->GetMRP( ) );
00092         ModifiedRodriguezParameters mrpReference( m_mrpReference );
00093 
00094         /* Determine Rotation Matirx */
00095         Rotation RBN( mrp ); // body relative to inertial frame
00096         Rotation RRN( mrpReference ); // reference relative to inertial frame
00097         Rotation RBR; // body relative to reference frame
00098         RBR = RBN*~RRN;
00099 
00100         /* Error */
00101         Vector angularRateError(3);
00102         angularRateError = m_whorl->GetOmegaBL( ) - RBR*(m_angularRateReference); // angular rate error [rad/s]
00103         ModifiedRodriguezParameters mrpError;
00104         mrpError = mrp - mrpReference; // mrp error
00105         mrpError.Switch( 1 ); // important to activate switch condition
00106 
00107         /* Set Whorl Error Values */
00108         m_whorl->SetMRPError( mrpError );
00109         m_whorl->SetAngularRateError( angularRateError );
00110 
00111         /* Set Whorl Reference Parameters */
00112         m_whorl->SetReferenceOmegaBL( m_angularRateReference );
00113         m_whorl->SetReferenceQuaternion( m_quaternionReference );
00114 
00115         /* Reaction Wheel Speed */
00116         Vector wheelSpeed(3);
00117         double meastime;
00118         m_whorl->GetMomentumWheel("REACTION_X")->GetWheelSpeed( wheelSpeed(1), meastime );
00119         m_whorl->GetMomentumWheel("REACTION_Y")->GetWheelSpeed( wheelSpeed(2), meastime );
00120         m_whorl->GetMomentumWheel("REACTION_Z")->GetWheelSpeed( wheelSpeed(3), meastime );
00121 
00122         /* Reaction Wheel Angular Momentum */
00123         Vector hs(3);
00124         Vector w(3);
00125         Matrix ws(1,1);
00126         for ( int i=1; i<4; i++ )
00127         {
00128                 w(1) = A(1,i);
00129                 w(2) = A(2,i);
00130                 w(3) = A(3,i);
00131                 ws = ~w*m_whorl->GetOmegaBL( );
00132                 hs(i) = MOI_sw(i,i) * ( ws(1,1) + wheelSpeed(i) );
00133         }
00134 
00135         /* Angular Rate Controller - angular rate for any simulator */
00136 /*      m_controlTorque = (~A)*( -(m_gainMatrix) * m_whorl->GetOmegaBL( ) 
00137                 + skew( m_whorl->GetOmegaBL( ) )*(A)*hs ); // [N-m]
00138 */       
00139         /* tracking Angular Rate Control law - attitude and angular rate */
00140         m_controlTorque = (~A)*( - (m_gainMatrix)*angularRateError
00141                 + skew( m_whorl->GetOmegaBL( ) )*(m_whorl->GetMOI( )*m_whorl->GetOmegaBL( ) + (A)*hs)
00142                 + m_whorl->GetMOI( )*( RBR.GetDCM( )*(m_angularAccelReference)
00143                 - skew( m_whorl->GetOmegaBL( ) )*RBR.GetDCM( )*(m_angularRateReference) ) ); // [N-m]
00144 
00145         /* Wheel Saturation Function */
00146         m_controlTorque = WheelSaturation( m_controlTorque ); // [N-m]
00147 
00148         /* Set the desird contorl torque in the whorl object */
00149         m_whorl->SetControl( m_controlTorque ); // [N-m]
00150 
00151         /* Set the torque for the momentum wheels to produce */
00152         SetWheelTorque( m_controlTorque ); // [N-m]
00153 
00154         return( 0 );
00155 }
00156 
00157 // Do not change the comments below - they will be added automatically by CVS
00158 /*****************************************************************************
00159 *       $Log: AngularRateController.cpp,v $
00160 *       Revision 1.1  2007/08/31 15:52:56  jayhawk_hokie
00161 *       Initial Submission.
00162 *       
00163 *       
00164 *
00165 ******************************************************************************/

Generated on Wed Sep 5 12:54:17 2007 for DSACSS Operational Code by  doxygen 1.3.9.1