1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
|
/*
* main.c April 10 2001
*
* A skeleton main() function to demonstrate the use of
* the various NORAD ephimerides in the norad.c file.
* The TLE sets used are those provided in NORAD's spacetrack
* report #3 so that a comparison with their own results
* can be made. The results produced by these software agree
* with NORAD's to the 5th or 6th figure, whatever this means!
* (But please note that NORAD uses mostly 'float' types with
* only a few 'doubles' for the critical variables).
*/
#include <stdio.h>
#include <string.h>
#include "norad.h"
static double test_data[5 * 6 * 5] = {
/* SGP: */
2328.96594238, -5995.21600342, 1719.97894287,
2.91110113, -0.98164053, -7.09049922,
2456.00610352, -6071.94232177, 1222.95977784,
2.67852119, -0.44705850, -7.22800565,
2567.39477539, -6112.49725342, 713.97710419,
2.43952477, 0.09884824, -7.31899641,
2663.03179932, -6115.37414551, 195.73919105,
2.19531813, 0.65333930, -7.36169147,
2742.85470581, -6079.13580322, -328.86091614,
1.94707947, 1.21346101, -7.35499924,
/* SGP4: */
2328.97048951, -5995.22076416, 1719.97067261,
2.91207230, -0.98341546, -7.09081703,
2456.10705566, -6071.93853760, 1222.89727783,
2.67938992, -0.44829041, -7.22879231,
2567.56195068, -6112.50384522, 713.96397400,
2.44024599, 0.09810869, -7.31995916,
2663.09078980, -6115.48229980, 196.39640427,
2.19611958, 0.65241995, -7.36282432,
2742.55133057, -6079.67144775, -326.38095856,
1.94850229, 1.21106251, -7.35619372,
/* SGP8: */
2328.87265015, -5995.21289063, 1720.04884338,
2.91210661, -0.98353850, -7.09081554,
2456.04577637, -6071.90490722, 1222.84086609,
2.67936245, -0.44820847, -7.22888553,
2567.68383789, -6112.40881348, 713.29282379,
2.43992555, 0.09893919, -7.32018769,
2663.49508667, -6115.18182373, 194.62816810,
2.19525236, 0.65453661, -7.36308974,
2743.29238892, -6078.90783691, -329.73434067,
1.94680957, 1.21500109, -7.35625595,
/* SDP4: */
7473.37066650, 428.95261765, 5828.74786377,
5.10715413, 6.44468284, -0.18613096,
-3305.22537232, 32410.86328125, -24697.1767581,
-1.30113538, -1.15131518, -0.28333528,
14271.28759766, 24110.46411133, -4725.76837158,
-0.32050445, 2.67984074, -2.08405289,
-9990.05883789, 22717.35522461, -23616.89062501,
-1.01667246, -2.29026759, 0.72892364,
9787.86975097, 33753.34667969, -15030.81176758,
-1.09425066, 0.92358845, -1.52230928,
/* SDP8: (gotta fix) */
7469.47631836, 415.99390792, 5829.64318848,
5.11402285, 6.44403201, -0.18296110,
-3337.38992310, 32351.39086914, -24658.63037109,
-1.30200730, -1.15603013, -0.28164955,
14226.54333496, 24236.08740234, -4856.19744873,
-0.33951668, 2.65315416, -2.08114153,
-10151.59838867, 22223.69848633, -23392.39770508,
-1.00112480, -2.33532837, 0.76987664,
9420.08203125, 33847.21875000, -15391.06469727,
-1.11986055, 0.85410149, -1.49506933 };
/* Main program */
int main( const int argc, const char **unused_argv)
{
double vel[3], pos[3]; /* Satellite position and velocity vectors */
double *test_ptr = test_data;
tle_t tle; /* Pointer to two-line elements set for satellite */
/* Data for the prediction type and time period */
double ts = 0.; /* Time since TLE epoch to start predictions */
double tf = 1440.; /* Time over which predictions are required */
double delt = 360.; /* Time interval between predictions */
double tsince; /* Time since epoch (in minutes) */
int i; /* Index for loops etc */
const char *tle_data[16] = {
"1 88888U 80275.98708465 .00073094 13844-3 66816-4 0 87",
"2 88888 72.8435 115.9689 0086731 52.6988 110.5714 16.05824518 1058",
"1 11801U 80230.29629788 .01431103 00000-0 14311-1 2",
"2 11801U 46.7916 230.4354 7318036 47.4722 10.4117 2.28537848 2",
/* GOES 9 */
"1 23581U 95025A 01311.43599209 -.00000094 00000-0 00000+0 0 8214",
"2 23581 1.1236 93.7945 0005741 214.4722 151.5103 1.00270260 23672",
/* Cosmos 1191 */
"1 11871U 80057A 01309.36911127 -.00000499 +00000-0 +10000-3 0 08380",
"2 11871 067.5731 001.8936 6344778 181.9632 173.2224 02.00993562062886",
/* ESA-GEOS 1 */
"1 09931U 77029A 01309.17453186 -.00000329 +00000-0 +10000-3 0 05967",
"2 09931 026.4846 264.1300 6609654 082.2734 342.9061 01.96179522175451",
/* Cosmos 1217 */
"1 12032U 80085A 01309.42683181 .00000182 00000-0 10000-3 0 3499",
"2 12032 65.2329 86.7607 7086222 172.0967 212.4632 2.00879501101699",
/* Molniya 3-19Rk */
"1 13446U 82083E 01283.10818257 .00098407 45745-7 54864-3 0 6240",
"2 13446 62.1717 83.8458 7498877 273.9677 320.2568 2.06357523137203",
/* Ariane Deb */
"1 23246U 91015G 01311.70347086 .00004957 00000-0 43218-2 0 8190",
"2 23246 7.1648 263.6949 5661268 241.8299 50.5793 4.44333001129208" };
for( i = 1; i <= 17; i++) /* Loop for each type of ephemeris */
{
int tle_idx = ((i - 2) / 2) * 2, err_code;
int ephem, is_deep;
const char *ephem_names[6] = { NULL, "SGP ", "SGP4", "SGP8", "SDP4", "SDP8" };
double sat_params[N_SAT_PARAMS];
/* Select the sgp or sdp TLE set for use below */
if( tle_idx < 0) tle_idx = 0;
printf( "\n%s\n%s", tle_data[tle_idx], tle_data[tle_idx + 1]);
err_code = parse_elements( tle_data[tle_idx], tle_data[tle_idx + 1], &tle);
if( err_code)
printf( "\nError parsing elements: %d\n", err_code);
if( i <= 5)
ephem = i;
else
ephem = 4 + ((i - 5) % 2);
/* Select ephemeris type */
/* Will select a "deep" (SDPx) or "general" (SGPx) ephemeris */
/* depending on the TLE parameters of the satellite: */
is_deep = select_ephemeris( &tle);
/* printf( "BStar: %.8lf\n", tle.bstar); */
if( is_deep)
printf("\nDeep-Space type Ephemeris (SDP*) selected:");
else
printf("\nNear-Earth type Ephemeris (SGP*) selected:");
/* Print some titles for the results */
printf("\nEphem:%s Tsince "
"X/Xdot Y/Ydot Z/Zdot\n", ephem_names[ephem]);
/* Calling of NORAD routines */
/* Each NORAD routine (SGP, SGP4, SGP8, SDP4, SDP8) */
/* will be called in turn with the appropriate TLE set */
switch( ephem)
{
case 1:
SGP_init( sat_params, &tle);
break;
case 2:
SGP4_init( sat_params, &tle);
break;
case 3:
SGP8_init( sat_params, &tle);
break;
case 4:
SDP4_init( sat_params, &tle);
break;
case 5:
SDP8_init( sat_params, &tle);
break;
}
for( tsince = ts; tsince <= tf; tsince += delt)
{
switch( ephem)
{
case 1:
SGP(tsince, &tle, sat_params, pos, vel);
break;
case 2:
SGP4(tsince, &tle, sat_params, pos, vel);
break;
case 3:
SGP8(tsince, &tle, sat_params, pos, vel);
break;
case 4:
SDP4(tsince, &tle, sat_params, pos, vel);
break;
case 5:
SDP8(tsince, &tle, sat_params, pos, vel);
break;
}
/* Calculate and print results */
vel[0] /= 60.; /* cvt km/minute to km/second */
vel[1] /= 60.;
vel[2] /= 60.;
if( argc > 1 && i <= 5) /* wanna show _difference from test data_ */
{
pos[0] -= *test_ptr++;
pos[1] -= *test_ptr++;
pos[2] -= *test_ptr++;
vel[0] -= *test_ptr++;
vel[1] -= *test_ptr++;
vel[2] -= *test_ptr++;
}
printf(" %12.4f %16.8f %16.8f %16.8f \n",
tsince,pos[0],pos[1],pos[2]);
printf(" %16.8f %16.8f %16.8f \n",
vel[0],vel[1],vel[2]);
} /* End of for(tsince = ts; tsince <= tf; tsince += delt) */
} /* End of for (i=1; i<=17; i++) */
return(0);
} /* End of main() */
/*------------------------------------------------------------------*/
|