⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_sat.cpp

📁 卫星计算码
💻 CPP
字号:
/*
 *  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( int argc, char **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;
      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() */

/*------------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -