00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <iostream.h>
00014 #include <iomanip.h>
00015 #include <fstream.h>
00016
00017
00018 #include "attitude/AttitudeModels/QuaternionAngVelDynamics.h"
00019 #include "utils/RungeKuttaIntegrator.h"
00020 #include "datahandling/History.h"
00021
00022 #include "orbit/orbitstaterep/Keplerian.h"
00023
00024
00025
00026 #include <dsacssinterface.h>
00027
00028 using namespace O_SESSAME;
00029
00030 #define PI M_PI
00031
00032
00033 const char *fileName = "DSACSSConfig.xml";
00034
00035 const char *spacecraft = "SPACECRAFT_1";
00036 const char *physicalProperties = "PHYSICAL_PROPERTIES";
00037 const char *attitudeProperties = "ATTITUDE_PROPERTIES";
00038 const char *hardwareProperties = "HARDWARE_PROPERTIES";
00039 const char *initialConditions = "INITIAL_CONDITIONS";
00040 const char *magnetometer = "MAGNETOMETER";
00041 const char *attribute = "value";
00042
00043
00044 Vector NullFunctor(const ssfTime& _pSSFTime, const OrbitState& _pOrbitState,
00045 const AttitudeState& _pAttitudeState)
00046 {
00047 return Vector(3);
00048 }
00049
00050 int main()
00051 {
00052
00053
00054
00055
00056
00057 TiXmlDocument config( fileName );
00058
00059 bool loadOkay = config.LoadFile();
00060 checkLoadFile(loadOkay, fileName, config);
00061
00062 TiXmlHandle docHandle( &config );
00063 int response;
00064
00065
00066 double mass;
00067 response = docHandle.FirstChild( spacecraft ).FirstChild( physicalProperties ).
00068 Child( "MASS", 0 ).Element() -> QueryDoubleAttribute(attribute, &mass);
00069 checkResponse(response);
00070
00071
00072 Matrix inertia = simulatorInertia(docHandle, spacecraft);
00073
00074
00075 Vector angularRateBody(3);
00076 for(int iterator=0; iterator<3; iterator++)
00077 {
00078 response = docHandle.FirstChild( spacecraft ).FirstChild( attitudeProperties ).
00079 FirstChild( initialConditions ).Child( "ANGULAR_RATE_BODY", iterator ).Element() ->
00080 QueryDoubleAttribute( "value", &angularRateBody(VectorIndexBase + iterator) );
00081 checkResponse(response);
00082 }
00083
00084
00085 Vector attitudeVector(4);
00086 for(int iterator=0; iterator<4; iterator++)
00087 {
00088 response = docHandle.FirstChild( spacecraft ).FirstChild( attitudeProperties ).
00089 FirstChild( initialConditions ).Child( "QUATERNION", iterator ).Element() ->
00090 QueryDoubleAttribute( "value", &attitudeVector(VectorIndexBase + iterator) );
00091 checkResponse(response);
00092 }
00093 Quaternion quaternion(attitudeVector);
00094
00095
00096 Vector orbitVector(6);
00097 Keplerian orbit;
00098 string str = docHandle.FirstChild( spacecraft ).FirstChild( "ORBIT_PROPERTIES" ).
00099 FirstChild( initialConditions ).Child( "KEPLERIAN", 0 ).Element() ->
00100 Attribute( "selection" );
00101 if ("ON" == str)
00102 {
00103 for(int iterator=0; iterator<6; iterator++)
00104 {
00105 response = docHandle.FirstChild( spacecraft ).FirstChild( "ORBIT_PROPERTIES" ).
00106 FirstChild( initialConditions ).FirstChild( "KEPLERIAN" ).Child( "VECTOR", iterator ).
00107 Element() -> QueryDoubleAttribute( "value", &orbitVector(VectorIndexBase + iterator) );
00108 checkResponse(response);
00109 }
00110
00111 for(int iterator=3; iterator<7; iterator++)
00112 {
00113 orbitVector(iterator) = Deg2Rad(orbitVector(iterator));
00114 }
00115 orbit.SetKeplerianRepresentationTrueAnamoly(orbitVector);
00116
00117 cout << "\nSemimajor Axis (km): " << orbit.GetSemimajorAxis()
00118 << " Eccentricity (~): " << orbit.GetEccentricity()
00119 << " Inclination (rad): " << orbit.GetInclination()
00120 << " Long Ascending Node (rad): " << orbit.GetLongAscNode()
00121 << " Argument of Perigee (rad): " << orbit.GetArgPerigee()
00122 << " True Anomaly (rad): " << orbit.GetTrueAnomaly()
00123 << endl << endl;
00124 }
00125
00126
00127 double integrationStepSize;
00128 response = docHandle.FirstChild( spacecraft ).FirstChild( "TIME" ).
00129 Child( "INTEGRATION_STEP_SIZE", 0 ).Element() -> QueryDoubleAttribute(attribute, &integrationStepSize);
00130 checkResponse(response);
00131
00132
00133 double numberOrbits;
00134 response = docHandle.FirstChild( spacecraft ).FirstChild( "TIME" ).
00135 Child( "NUMBER_OF_ORBITS", 0 ).Element() -> QueryDoubleAttribute(attribute, &numberOrbits);
00136 checkResponse(response);
00137
00138
00139
00140
00141
00142
00143
00144 tick();
00145
00146
00147 AttitudeState spacecraft_1;
00148
00149
00150 SpecificFunctor AttitudeForcesFunctor(&NullFunctor);
00151
00152
00153 RungeKuttaIntegrator attitudeIntegrator;
00154
00155
00156 double orbitPeriod = 2*PI/( orbit.GetMeanMotion() );
00157 int integrationSteps = orbitPeriod * numberOrbits / integrationStepSize;
00158 attitudeIntegrator.SetNumSteps( integrationSteps );
00159
00160
00161 vector<ssfTime> integrationTimes;
00162
00163 ssfTime begin(0);
00164 ssfTime end( begin + (orbitPeriod * numberOrbits) );
00165
00166 integrationTimes.push_back(begin);
00167 integrationTimes.push_back(end);
00168
00169 DirectionCosineMatrix Rbo;
00170 Rbo.Set( quaternion );
00171
00172 Vector angularRateInertial(3);
00173 angularRateInertial = angularRateBody;
00174
00175
00176
00177 spacecraft_1.SetRotation(Rbo);
00178 spacecraft_1.SetAngularVelocity(angularRateInertial);
00179
00180 Matrix history = attitudeIntegrator.Integrate(integrationTimes, &AttituteDynamics_QuaternionAngVel, spacecraft_1.GetState(),
00181 NULL, NULL, inertia, AttitudeForcesFunctor);
00182
00183
00184 ofstream outputFile;
00185 outputFile.open("DataFiles/GravGradNonLin.dat");
00186 outputFile << history;
00187 outputFile.close();
00188
00189
00190 cout << "The numerical simulation excution time was " << tock() << " seconds. \n \n" << endl;
00191
00192 return(0);
00193 }
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211