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

📄 obs_test.cpp

📁 卫星计算码
💻 CPP
字号:
/*
    obs_test.cpp     23 September 2002

   An example 'main' function illustrating how to get topocentric
ephemerides for artificial satellites,  using the basic satellite
code plus the add-on topocentric functions.  The code reads the
file 'obs_test.txt',  getting commands setting the observer lat/lon
and altitude and time of observation.  When it gets a command
setting a particular JD,  it computes the topocentric RA/dec/dist
and prints them out.

   At present,  'obs_test.txt' sets up a lat/lon/height in Bowdoinham,
Maine,  corporate headquarters of Project Pluto,  and computes the
position of one low-orbit satellite (ISS) and one high-orbit satellite
(Cosmos 1966 rocket booster).  Comparison values are given in
'obs_test.txt', so you can check your implementation.

*/


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "norad.h"
#include "observe.h"

#define PI 3.141592653589793238462643383279

int main( int argc, char **argv)
{
   FILE *ifile = fopen( (argc == 1) ? "obs_test.txt" : argv[1], "rb");
   tle_t tle; /* Pointer to two-line elements set for satellite */
   char line1[100], line2[100];
   double lat = 0., lon = 0., ht_in_meters = 0., jd = 0.;
   int ephem = 1;       /* default to SGP4 */

   if( !ifile)
      {
      printf( "Couldn't open input OBS_TEST.TXT file\n");
      exit( -1);
      }
   fgets( line1, sizeof( line1), ifile);
   while( fgets( line2, sizeof( line2), ifile))
      {
      if( !memcmp( line2, "Ephem ", 6))
         ephem = (line2[6] - '0');
      else if( !memcmp( line2, "JD ", 3))
         jd = atof( line2 + 3);
      else if( !memcmp( line2, "ht ", 3))
         ht_in_meters = atof( line2 + 3);
      else if( !memcmp( line2, "lat ", 4))
         lat = atof( line2 + 4) * PI / 180.;     /* cvt degrees to radians */
      else if( !memcmp( line2, "lon ", 4))
         lon = atof( line2 + 4) * PI / 180.;
      else if( !parse_elements( line1, line2, &tle))    /* hey! we got a TLE! */
         {
         int is_deep = select_ephemeris( &tle);
         char *ephem_names[5] = { "SGP ", "SGP4", "SGP8", "SDP4", "SDP8" };
         double sat_params[N_SAT_PARAMS], observer_loc[3];
         double rho_sin_phi, rho_cos_phi;
         double ra, dec, dist_to_satellite, t_since;
         double pos[3]; /* Satellite position vector */

         lat_alt_to_parallax( lat, ht_in_meters, &rho_cos_phi, &rho_sin_phi);
         observer_cartesian_coords( jd, lon, rho_cos_phi, rho_sin_phi,
                     observer_loc);
         if( is_deep && (ephem == 1 || ephem == 2))
            ephem += 2;    /* switch to an SDx */
         if( !is_deep && (ephem == 3 || ephem == 4))
            ephem -= 2;    /* switch to an SGx */
         if( is_deep)
            printf("Deep-Space type Ephemeris (%s) selected:\n",
                                       ephem_names[ephem]);
         else
            printf("Near-Earth type Ephemeris (%s) selected:\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 */
         t_since = (jd - tle.epoch) * 1440.;
         switch( ephem)
            {
            case 0:
               SGP_init( sat_params, &tle);
               SGP( t_since, &tle, sat_params, pos, NULL);
               break;
            case 1:
               SGP4_init( sat_params, &tle);
               SGP4( t_since, &tle, sat_params, pos, NULL);
               break;
            case 2:
               SGP8_init( sat_params, &tle);
               SGP8( t_since, &tle, sat_params, pos, NULL);
               break;
            case 3:
               SDP4_init( sat_params, &tle);
               SDP4( t_since, &tle, sat_params, pos, NULL);
               break;
            case 4:
               SDP8_init( sat_params, &tle);
               SDP8( t_since, &tle, sat_params, pos, NULL);
               break;
            }
         line1[15] = '\0';
         printf( "Object %s, as seen from lat %.5lf lon %.5lf, JD %.5lf\n",
                  line1 + 2, lat * 180. / PI, lon * 180. / PI, jd);
         get_satellite_ra_dec_delta( observer_loc, pos,
                                 &ra, &dec, &dist_to_satellite);
         epoch_of_date_to_j2000( jd, &ra, &dec);
         printf( "RA %.4lf (J2000) dec %.4lf dist %.5lf km\n",
                     ra * 180. / PI, dec * 180. / PI, dist_to_satellite);
         }
      strcpy( line1, line2);
      }
   return( 0);
} /* End of main() */

⌨️ 快捷键说明

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