From 4defc7bc64c98b3268d49eb63217a6378f73787f Mon Sep 17 00:00:00 2001 From: Carlos Augusto Porto Freitas Date: Mon, 1 Jul 2024 18:58:30 -0300 Subject: [PATCH 1/7] firmware: app: libs: libpredict: Remove dynamic allocation Malloc calls were replaced by static allocated singletons. Free calls were replaced by memset's, which reset the singletons. --- .../libs/libpredict/include/predict/predict.h | 6 ++-- firmware/app/libs/libpredict/src/observer.c | 11 ++++--- firmware/app/libs/libpredict/src/orbit.c | 31 +++++++++++++------ firmware/app/libs/libpredict/src/sdp4.c | 8 +++++ firmware/app/libs/libpredict/src/sdp4.h | 6 +++- firmware/app/libs/libpredict/src/sgp4.c | 8 +++++ firmware/app/libs/libpredict/src/sgp4.h | 5 +++ 7 files changed, 57 insertions(+), 18 deletions(-) diff --git a/firmware/app/libs/libpredict/include/predict/predict.h b/firmware/app/libs/libpredict/include/predict/predict.h index 77ba1cc5..e5c1f4c3 100644 --- a/firmware/app/libs/libpredict/include/predict/predict.h +++ b/firmware/app/libs/libpredict/include/predict/predict.h @@ -132,8 +132,8 @@ typedef struct { predict_orbital_elements_t* predict_parse_tle(const char *tle_line_1, const char *tle_line_2); /** - * Free memory allocated in orbital elements structure. - * \param orbital_elements Orbit to free + * Reset memory allocated in orbital elements structure. + * \param orbital_elements Orbit to reset **/ void predict_destroy_orbital_elements(predict_orbital_elements_t *orbital_elements); @@ -290,7 +290,7 @@ struct predict_observation { predict_observer_t *predict_create_observer(const char *name, double lat, double lon, double alt); /** - * Free observer. + * Reset observer. * * \param obs Observer to be freed. **/ diff --git a/firmware/app/libs/libpredict/src/observer.c b/firmware/app/libs/libpredict/src/observer.c index a328a790..79c87f98 100644 --- a/firmware/app/libs/libpredict/src/observer.c +++ b/firmware/app/libs/libpredict/src/observer.c @@ -5,13 +5,14 @@ #include "defs.h" #include "sun.h" +/* Static Allocated observer */ +static predict_observer_t observer; + void observer_calculate(const predict_observer_t *observer, double time, const double pos[3], const double vel[3], struct predict_observation *result); predict_observer_t *predict_create_observer(const char *name, double lat, double lon, double alt) { - // Allocate memory - predict_observer_t *obs = (predict_observer_t*)malloc(sizeof(predict_observer_t)); - if (obs == NULL) return NULL; + predict_observer_t *obs = &observer; strncpy(obs->name, name, 128); obs->name[127] = '\0'; @@ -24,8 +25,8 @@ predict_observer_t *predict_create_observer(const char *name, double lat, double void predict_destroy_observer(predict_observer_t *obs) { - if (obs != NULL) { - free(obs); + if (obs == &observer) { + memset((void*)obs, 0, sizeof(predict_observer_t)); } } diff --git a/firmware/app/libs/libpredict/src/orbit.c b/firmware/app/libs/libpredict/src/orbit.c index 706084fe..0182971e 100644 --- a/firmware/app/libs/libpredict/src/orbit.c +++ b/firmware/app/libs/libpredict/src/orbit.c @@ -7,6 +7,9 @@ #include "sgp4.h" #include "sun.h" +/* Static Allocated orbital elements */ +static predict_orbital_elements_t elem; + bool is_eclipsed(const double pos[3], const double sol[3], double *depth); bool predict_decayed(const predict_orbital_elements_t *orbital_elements, predict_julian_date_t time); @@ -16,8 +19,7 @@ bool predict_decayed(const predict_orbital_elements_t *orbital_elements, predict predict_orbital_elements_t* predict_parse_tle(const char *tle_line_1, const char *tle_line_2) { double tempnum; - predict_orbital_elements_t *m = (predict_orbital_elements_t*)malloc(sizeof(predict_orbital_elements_t)); - if (m == NULL) return NULL; + predict_orbital_elements_t *m = &elem; char substring_buffer[SUBSTRING_BUFFER_LENGTH]; m->satellite_number = atol(SubString(tle_line_1,SUBSTRING_BUFFER_LENGTH,substring_buffer,2,6)); @@ -57,8 +59,8 @@ predict_orbital_elements_t* predict_parse_tle(const char *tle_line_1, const char if (TWO_PI/xnodp/MINUTES_PER_DAY >= 0.15625) { m->ephemeris = EPHEMERIS_SDP4; - // Allocate memory for ephemeris data - m->ephemeris_data = malloc(sizeof(struct _sdp4)); + // Get ptr to static allocated _sdp4 + m->ephemeris_data = sdp4_static_alloc(); if (m->ephemeris_data == NULL) { predict_destroy_orbital_elements(m); @@ -70,8 +72,8 @@ predict_orbital_elements_t* predict_parse_tle(const char *tle_line_1, const char } else { m->ephemeris = EPHEMERIS_SGP4; - // Allocate memory for ephemeris data - m->ephemeris_data = malloc(sizeof(struct _sgp4)); + // Get ptr to static allocated _sgp4 + m->ephemeris_data = sgp4_static_alloc(); if (m->ephemeris_data == NULL) { predict_destroy_orbital_elements(m); @@ -88,11 +90,22 @@ void predict_destroy_orbital_elements(predict_orbital_elements_t *m) { if (m == NULL) return; - if (m->ephemeris_data != NULL) { - free(m->ephemeris_data); + if (m->ephemeris_data != NULL) + { + switch (m->ephemeris) + { + case EPHEMERIS_SDP4: + memset(m->ephemeris_data, 0, sizeof(struct _sdp4)); + break; + case EPHEMERIS_SGP4: + memset(m->ephemeris_data, 0, sizeof(struct _sgp4)); + break; + default: + break; + } } - free(m); + memset((void*)m, 0, sizeof(predict_orbital_elements_t)); } bool predict_is_geosynchronous(const predict_orbital_elements_t *m) diff --git a/firmware/app/libs/libpredict/src/sdp4.c b/firmware/app/libs/libpredict/src/sdp4.c index 97787265..fb51259c 100644 --- a/firmware/app/libs/libpredict/src/sdp4.c +++ b/firmware/app/libs/libpredict/src/sdp4.c @@ -6,6 +6,9 @@ #include "defs.h" #include "unsorted.h" +/* Static Allocated sdp4 struct */ +static struct _sdp4 sdp4_; + /// Entry points of deep() #define DPSecular 1 #define DPPeriodic 2 @@ -29,6 +32,11 @@ void sdp4_deep_initialize(const predict_orbital_elements_t *tle, struct _sdp4 *m **/ void deep_arg_dynamic_init(const struct _sdp4 *m, deep_arg_dynamic_t *deep_dyn); +struct _sdp4 *sdp4_static_alloc(void) +{ + return &sdp4_; +} + void sdp4_init(const predict_orbital_elements_t *tle, struct _sdp4 *m) { m->lunarTermsDone = 0; diff --git a/firmware/app/libs/libpredict/src/sdp4.h b/firmware/app/libs/libpredict/src/sdp4.h index 4c44180f..6deb44d7 100644 --- a/firmware/app/libs/libpredict/src/sdp4.h +++ b/firmware/app/libs/libpredict/src/sdp4.h @@ -14,7 +14,6 @@ struct model_output { double phase; }; - /** * Parameters for deep space perturbations **/ @@ -111,5 +110,10 @@ void sdp4_predict(const struct _sdp4 *m, double tsince, struct model_output *out **/ void sdp4_deep(const struct _sdp4 *m, int ientry, const deep_arg_fixed_t * deep_arg, deep_arg_dynamic_t *deep_dyn); +/** + * Returns ptr to static allocated _sdp4 struct + **/ +struct _sdp4 *sdp4_static_alloc(void); + #endif // ifndef _SDP4_H_ diff --git a/firmware/app/libs/libpredict/src/sgp4.c b/firmware/app/libs/libpredict/src/sgp4.c index 29b8ccfa..b2dcf40f 100644 --- a/firmware/app/libs/libpredict/src/sgp4.c +++ b/firmware/app/libs/libpredict/src/sgp4.c @@ -3,6 +3,14 @@ #include "defs.h" #include "unsorted.h" +/* Static Allocated sgp4 struct */ +static struct _sgp4 sgp4_; + +struct _sgp4 *sgp4_static_alloc(void) +{ + return &sgp4_; +} + void sgp4_init(const predict_orbital_elements_t *orbital_elements, struct _sgp4 *m) { m->simpleFlag = 0; diff --git a/firmware/app/libs/libpredict/src/sgp4.h b/firmware/app/libs/libpredict/src/sgp4.h index b7c2a564..ffaa0abe 100644 --- a/firmware/app/libs/libpredict/src/sgp4.h +++ b/firmware/app/libs/libpredict/src/sgp4.h @@ -46,4 +46,9 @@ void sgp4_init(const predict_orbital_elements_t *orbital_elements, struct _sgp4 **/ void sgp4_predict(const struct _sgp4 *m, double tsince, struct model_output *output); +/** + * Returns ptr to static allocated _sgp4 struct + **/ +struct _sgp4 *sgp4_static_alloc(void); + #endif From 00c03148f4c665cc7816fd45e1a870c92a56c43e Mon Sep 17 00:00:00 2001 From: Carlos Augusto Porto Freitas Date: Sat, 10 Aug 2024 23:46:38 -0300 Subject: [PATCH 2/7] firmware: app: libs: libpredict: Fix longitude format --- firmware/app/libs/libpredict/src/unsorted.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/firmware/app/libs/libpredict/src/unsorted.c b/firmware/app/libs/libpredict/src/unsorted.c index debbe1ae..0a3c61bc 100644 --- a/firmware/app/libs/libpredict/src/unsorted.c +++ b/firmware/app/libs/libpredict/src/unsorted.c @@ -204,6 +204,9 @@ void Calculate_LatLonAlt(double time, const double pos[3], geodetic_t *geodetic if (geodetic->lat>PI_HALF) geodetic->lat-= 2*M_PI; + + if (geodetic->lon>M_PI) + geodetic->lat-= 2*M_PI; } void Calculate_Obs(double time, const double pos[3], const double vel[3], geodetic_t *geodetic, vector_t *obs_set) From 2d4e0f7c70385f357f9931fdf547ccab60bfa47a Mon Sep 17 00:00:00 2001 From: Carlos Augusto Porto Freitas Date: Sat, 10 Aug 2024 23:48:05 -0300 Subject: [PATCH 3/7] firmware: app: tasks: pos_det: Update task to incorporate changes on libpredict --- firmware/app/tasks/pos_det.c | 66 ++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/firmware/app/tasks/pos_det.c b/firmware/app/tasks/pos_det.c index f1f6a345..b1565706 100644 --- a/firmware/app/tasks/pos_det.c +++ b/firmware/app/tasks/pos_det.c @@ -58,46 +58,38 @@ void vTaskPosDet(void) TickType_t last_cycle = xTaskGetTickCount(); /* Load TLE lines */ - const char *tle_line_1 = "1 25544U 98067A 15129.86961041 .00015753 00000-0 23097-3 0 9998"; - const char *tle_line_2 = "2 25544 51.6464 275.3867 0006524 289.1638 208.5861 15.55704207942078"; - + const char *tle_line_1 = "1 25544U 98067A 24223.83784911 .00020194 00000+0 36238-3 0 9994"; + const char *tle_line_2 = "2 25544 51.6408 44.5872 0005770 185.1957 306.5656 15.49872002467029"; + /* Create orbit object */ predict_orbital_elements_t *satellite = predict_parse_tle(tle_line_1, tle_line_2); - if (satellite != NULL) - { - /* Predict satellite position */ - struct predict_position my_orbit; - - sys_time_t now = system_get_time(); - - predict_julian_date_t curr_time = predict_to_julian(now - 631065600UL); /* Unix timestamp in 1989/12/31 00:00:00 UTC */ - - predict_orbit(satellite, &my_orbit, curr_time); - - float lat = my_orbit.latitude * 180.0 / M_PI; - float lon = my_orbit.longitude * 180.0 / M_PI; - float alt = my_orbit.altitude; - - sat_data_buf.obdh.data.position.latitude = (int16_t)lat; - sat_data_buf.obdh.data.position.longitude = (int16_t)lon; - sat_data_buf.obdh.data.position.altitude = (int16_t)alt; - sat_data_buf.obdh.data.position.timestamp = now; - - sys_log_print_event_from_module(SYS_LOG_INFO, TASK_POS_DET_NAME, "Current position (lat/lon/alt): "); - sys_log_print_float(lat, 2); - sys_log_print_msg(" deg/"); - sys_log_print_float(lon, 2); - sys_log_print_msg(" deg/"); - sys_log_print_float(alt, 2); - sys_log_print_msg(" km"); - sys_log_new_line(); - } - else - { - sys_log_print_event_from_module(SYS_LOG_ERROR, TASK_POS_DET_NAME, "Failed to initialize orbit from TLE!"); - sys_log_new_line(); - } + /* Predict satellite position */ + struct predict_position my_orbit; + + sys_time_t now = system_get_time(); + + predict_julian_date_t curr_time = predict_to_julian(now + 1723341922ULL); /* 1723341922ULL Corresponds to ISO Time Stamp: 2024-08-11T02:05:22Z */ + + predict_orbit(satellite, &my_orbit, curr_time); + + float lat = my_orbit.latitude * 180.0 / M_PI; + float lon = my_orbit.longitude * 180.0 / M_PI; + float alt = my_orbit.altitude; + + sat_data_buf.obdh.data.position.latitude = (int16_t)lat; + sat_data_buf.obdh.data.position.longitude = (int16_t)lon; + sat_data_buf.obdh.data.position.altitude = (int16_t)alt; + sat_data_buf.obdh.data.position.timestamp = now; + + sys_log_print_event_from_module(SYS_LOG_INFO, TASK_POS_DET_NAME, "Current position (lat/lon/alt): "); + sys_log_print_float(lat, 2); + sys_log_print_msg(" deg/"); + sys_log_print_float(lon, 2); + sys_log_print_msg(" deg/"); + sys_log_print_float(alt, 2); + sys_log_print_msg(" km"); + sys_log_new_line(); predict_destroy_orbital_elements(satellite); From 6209d3e0da17a34a4ea712fb402add7573c241e3 Mon Sep 17 00:00:00 2001 From: Carlos Augusto Porto Freitas Date: Sat, 17 Aug 2024 16:21:34 -0300 Subject: [PATCH 4/7] firmware: app: libs: Change libpredict to the MISRA fork(v0.5.0) --- firmware/app/libs/libpredict/.gitignore | 52 - firmware/app/libs/libpredict/CONTRIBUTING.md | 30 - .../app/libs/libpredict/{COPYING => LICENSE} | 0 firmware/app/libs/libpredict/Makefile | 45 +- firmware/app/libs/libpredict/README.md | 114 +- .../libs/libpredict/examples/basic/.gitignore | 1 - .../libs/libpredict/examples/basic/Makefile | 19 - .../app/libs/libpredict/examples/basic/README | 7 - .../app/libs/libpredict/examples/basic/main.c | 69 - .../examples/orbit-2d/CMakeLists.txt | 6 - .../libpredict/examples/orbit-2d/README.md | 20 - .../examples/orbit-2d/data/orbits.tle | 24 - .../examples/orbit-2d/generate_orbit_data.cpp | 113 - .../libpredict/examples/orbit-2d/orbits.png | Bin 36918 -> 0 bytes .../examples/orbit-2d/plot_orbits.py | 55 - .../examples/passplot/CMakeLists.txt | 8 - .../libpredict/examples/passplot/README.md | 18 - .../examples/passplot/generate_pass_data.c | 69 - .../libs/libpredict/examples/passplot/map.png | Bin 108785 -> 0 bytes .../examples/passplot/pass_properties.png | Bin 69395 -> 0 bytes .../libpredict/examples/passplot/plot_pass.py | 108 - .../libpredict/examples/setrise/.gitignore | 1 - .../examples/setrise/CMakeLists.txt | 8 - .../libs/libpredict/examples/setrise/main.c | 122 - .../libs/libpredict/include/predict/defs.h | 197 + .../libs/libpredict/include/predict/predict.h | 690 +- .../libs/libpredict/include/predict/sdp4.h | 49 + .../libs/libpredict/include/predict/sgp4.h | 37 + .../app/libs/libpredict/include/predict/sun.h | 14 + .../libpredict/include/predict/unsorted.h | 277 + firmware/app/libs/libpredict/src/.gitignore | 3 - firmware/app/libs/libpredict/src/Makefile | 20 +- firmware/app/libs/libpredict/src/defs.h | 173 - .../app/libs/libpredict/src/julian_date.c | 100 +- firmware/app/libs/libpredict/src/moon.c | 520 +- firmware/app/libs/libpredict/src/observer.c | 764 ++- firmware/app/libs/libpredict/src/orbit.c | 819 ++- .../app/libs/libpredict/src/predict.pc.in | 10 - firmware/app/libs/libpredict/src/refraction.c | 82 +- firmware/app/libs/libpredict/src/sdp4.c | 1658 ++--- firmware/app/libs/libpredict/src/sdp4.h | 119 - firmware/app/libs/libpredict/src/sgp4.c | 648 +- firmware/app/libs/libpredict/src/sgp4.h | 54 - firmware/app/libs/libpredict/src/sun.c | 237 +- firmware/app/libs/libpredict/src/sun.h | 6 - firmware/app/libs/libpredict/src/unsorted.c | 667 +- firmware/app/libs/libpredict/src/unsorted.h | 196 - firmware/app/libs/libpredict/src/version.c | 26 - .../app/libs/libpredict/tests/CMakeLists.txt | 63 - .../app/libs/libpredict/tests/aoslos-t.cpp | 164 - .../generate_predict_testcases.sh | 221 - .../tests/data-generator/predict_client.c | 224 - .../prepare_geosynchronous_testcase_data.sh | 68 - .../tests/data-generator/testcase.db | 72 - .../tests/data-generator/testcase.qth | 4 - .../tests/data-generator/testcase.tle | 24 - .../libpredict/tests/data/geostationary.tle | 1323 ---- .../data/geosynchronous_satellite_numbers.dat | 2094 ------ .../tests/data/large-tle-collection.tle | 5667 ----------------- .../tests/data/moon_201509201000.test | 26 - .../tests/data/moon_201509201600.test | 26 - .../tests/data/sat_ERS-1_201509261800.test | 33 - .../data/sat_GPS_BIIA-10_201509261800.test | 33 - .../tests/data/sat_HINODE_201509261800.test | 33 - .../tests/data/sat_ISS_201509261800.test | 33 - .../data/sat_MOLNIYA_1-29_201509261800.test | 33 - .../tests/data/sat_SIRIUS-1_201509261800.test | 33 - .../tests/data/sat_THOR_III_201509261800.test | 33 - .../tests/data/sat_VELA-1_201509261800.test | 33 - .../tests/data/sun_201509201933.test | 26 - .../tests/data/sun_201509210600.test | 26 - firmware/app/libs/libpredict/tests/dummy-t.c | 9 - .../libs/libpredict/tests/geostationary-t.cpp | 158 - firmware/app/libs/libpredict/tests/link-t.c | 23 - .../libs/libpredict/tests/maxelevation-t.cpp | 252 - firmware/app/libs/libpredict/tests/moon-t.cpp | 134 - .../app/libs/libpredict/tests/orbit-t.cpp | 226 - firmware/app/libs/libpredict/tests/sun-t.cpp | 131 - .../libs/libpredict/tests/testcase_reader.cpp | 246 - .../libs/libpredict/tests/testcase_reader.h | 57 - 80 files changed, 4297 insertions(+), 15486 deletions(-) delete mode 100644 firmware/app/libs/libpredict/.gitignore delete mode 100644 firmware/app/libs/libpredict/CONTRIBUTING.md rename firmware/app/libs/libpredict/{COPYING => LICENSE} (100%) delete mode 100644 firmware/app/libs/libpredict/examples/basic/.gitignore delete mode 100644 firmware/app/libs/libpredict/examples/basic/Makefile delete mode 100644 firmware/app/libs/libpredict/examples/basic/README delete mode 100644 firmware/app/libs/libpredict/examples/basic/main.c delete mode 100644 firmware/app/libs/libpredict/examples/orbit-2d/CMakeLists.txt delete mode 100644 firmware/app/libs/libpredict/examples/orbit-2d/README.md delete mode 100644 firmware/app/libs/libpredict/examples/orbit-2d/data/orbits.tle delete mode 100644 firmware/app/libs/libpredict/examples/orbit-2d/generate_orbit_data.cpp delete mode 100644 firmware/app/libs/libpredict/examples/orbit-2d/orbits.png delete mode 100644 firmware/app/libs/libpredict/examples/orbit-2d/plot_orbits.py delete mode 100644 firmware/app/libs/libpredict/examples/passplot/CMakeLists.txt delete mode 100644 firmware/app/libs/libpredict/examples/passplot/README.md delete mode 100644 firmware/app/libs/libpredict/examples/passplot/generate_pass_data.c delete mode 100644 firmware/app/libs/libpredict/examples/passplot/map.png delete mode 100644 firmware/app/libs/libpredict/examples/passplot/pass_properties.png delete mode 100644 firmware/app/libs/libpredict/examples/passplot/plot_pass.py delete mode 100644 firmware/app/libs/libpredict/examples/setrise/.gitignore delete mode 100644 firmware/app/libs/libpredict/examples/setrise/CMakeLists.txt delete mode 100644 firmware/app/libs/libpredict/examples/setrise/main.c create mode 100644 firmware/app/libs/libpredict/include/predict/defs.h create mode 100644 firmware/app/libs/libpredict/include/predict/sdp4.h create mode 100644 firmware/app/libs/libpredict/include/predict/sgp4.h create mode 100644 firmware/app/libs/libpredict/include/predict/sun.h create mode 100644 firmware/app/libs/libpredict/include/predict/unsorted.h delete mode 100644 firmware/app/libs/libpredict/src/.gitignore delete mode 100644 firmware/app/libs/libpredict/src/defs.h delete mode 100644 firmware/app/libs/libpredict/src/predict.pc.in delete mode 100644 firmware/app/libs/libpredict/src/sdp4.h delete mode 100644 firmware/app/libs/libpredict/src/sgp4.h delete mode 100644 firmware/app/libs/libpredict/src/sun.h delete mode 100644 firmware/app/libs/libpredict/src/unsorted.h delete mode 100644 firmware/app/libs/libpredict/src/version.c delete mode 100644 firmware/app/libs/libpredict/tests/CMakeLists.txt delete mode 100644 firmware/app/libs/libpredict/tests/aoslos-t.cpp delete mode 100755 firmware/app/libs/libpredict/tests/data-generator/generate_predict_testcases.sh delete mode 100644 firmware/app/libs/libpredict/tests/data-generator/predict_client.c delete mode 100755 firmware/app/libs/libpredict/tests/data-generator/prepare_geosynchronous_testcase_data.sh delete mode 100644 firmware/app/libs/libpredict/tests/data-generator/testcase.db delete mode 100644 firmware/app/libs/libpredict/tests/data-generator/testcase.qth delete mode 100644 firmware/app/libs/libpredict/tests/data-generator/testcase.tle delete mode 100644 firmware/app/libs/libpredict/tests/data/geostationary.tle delete mode 100644 firmware/app/libs/libpredict/tests/data/geosynchronous_satellite_numbers.dat delete mode 100644 firmware/app/libs/libpredict/tests/data/large-tle-collection.tle delete mode 100644 firmware/app/libs/libpredict/tests/data/moon_201509201000.test delete mode 100644 firmware/app/libs/libpredict/tests/data/moon_201509201600.test delete mode 100644 firmware/app/libs/libpredict/tests/data/sat_ERS-1_201509261800.test delete mode 100644 firmware/app/libs/libpredict/tests/data/sat_GPS_BIIA-10_201509261800.test delete mode 100644 firmware/app/libs/libpredict/tests/data/sat_HINODE_201509261800.test delete mode 100644 firmware/app/libs/libpredict/tests/data/sat_ISS_201509261800.test delete mode 100644 firmware/app/libs/libpredict/tests/data/sat_MOLNIYA_1-29_201509261800.test delete mode 100644 firmware/app/libs/libpredict/tests/data/sat_SIRIUS-1_201509261800.test delete mode 100644 firmware/app/libs/libpredict/tests/data/sat_THOR_III_201509261800.test delete mode 100644 firmware/app/libs/libpredict/tests/data/sat_VELA-1_201509261800.test delete mode 100644 firmware/app/libs/libpredict/tests/data/sun_201509201933.test delete mode 100644 firmware/app/libs/libpredict/tests/data/sun_201509210600.test delete mode 100644 firmware/app/libs/libpredict/tests/dummy-t.c delete mode 100644 firmware/app/libs/libpredict/tests/geostationary-t.cpp delete mode 100644 firmware/app/libs/libpredict/tests/link-t.c delete mode 100644 firmware/app/libs/libpredict/tests/maxelevation-t.cpp delete mode 100644 firmware/app/libs/libpredict/tests/moon-t.cpp delete mode 100644 firmware/app/libs/libpredict/tests/orbit-t.cpp delete mode 100644 firmware/app/libs/libpredict/tests/sun-t.cpp delete mode 100644 firmware/app/libs/libpredict/tests/testcase_reader.cpp delete mode 100644 firmware/app/libs/libpredict/tests/testcase_reader.h diff --git a/firmware/app/libs/libpredict/.gitignore b/firmware/app/libs/libpredict/.gitignore deleted file mode 100644 index c6127b38..00000000 --- a/firmware/app/libs/libpredict/.gitignore +++ /dev/null @@ -1,52 +0,0 @@ -# Prerequisites -*.d - -# Object files -*.o -*.ko -*.obj -*.elf - -# Linker output -*.ilk -*.map -*.exp - -# Precompiled Headers -*.gch -*.pch - -# Libraries -*.lib -*.a -*.la -*.lo - -# Shared objects (inc. Windows DLLs) -*.dll -*.so -*.so.* -*.dylib - -# Executables -*.exe -*.out -*.app -*.i*86 -*.x86_64 -*.hex - -# Debug files -*.dSYM/ -*.su -*.idb -*.pdb - -# Kernel Module Compile Results -*.mod* -*.cmd -.tmp_versions/ -modules.order -Module.symvers -Mkfile.old -dkms.conf diff --git a/firmware/app/libs/libpredict/CONTRIBUTING.md b/firmware/app/libs/libpredict/CONTRIBUTING.md deleted file mode 100644 index 91d1012d..00000000 --- a/firmware/app/libs/libpredict/CONTRIBUTING.md +++ /dev/null @@ -1,30 +0,0 @@ -Contributing to libpredict -========================== - -Thank you for showing an interest in libpredict! Feel free to send bug -reports, feature requests and submit pull requests! - - -Contributor Agreement ---------------------- - -![Number of signed CLAs](https://cla-assistant.io/readme/badge/la1k/libpredict "This is how many people have signed this CLA") - -Currently, libpredict is licensed as GPLv2+. That's not optimal for a -library, so we want to change it to something more library friendly, -e.g., LGPL. It's going to be a while before we can do so, but it is a -long term goal. - -In order to do that, we must do several things, like replace all the -GPLv2+ code. When that is done, we can relicense the library, but only -if we have the right to do so. There are several ways of achieving this, -but we've chosen to use a contributor agreement that gives [Akademisk -radioklubb (LA1K)](https://la1k.no/) rights to the code. If you create a -pull request, you will be asked to confirm that your contribution is -submitted under this contributor agreement. - -You can find the text of the contributor agreement at -https://gist.github.com/la1k-admin/18d0510aa3dbe0db1b8f86e6b46c20bd - -Short summary: You allow Akademisk radioklubb to use the code, but -without taking away your right to also use the code as you please. diff --git a/firmware/app/libs/libpredict/COPYING b/firmware/app/libs/libpredict/LICENSE similarity index 100% rename from firmware/app/libs/libpredict/COPYING rename to firmware/app/libs/libpredict/LICENSE diff --git a/firmware/app/libs/libpredict/Makefile b/firmware/app/libs/libpredict/Makefile index 8ebdda12..c344d124 100644 --- a/firmware/app/libs/libpredict/Makefile +++ b/firmware/app/libs/libpredict/Makefile @@ -1,30 +1,49 @@ -TARGET=libpredict.a +LIB_PREDICT_VERSION = 0.5 -ifndef BUILD_DIR - BUILD_DIR=$(CURDIR) -endif +STATIC_TARGET := libpredict.a +SHARED_TARGET := libpredict.so.$(LIB_PREDICT_VERSION) -AR=ar -FLAGS=rcs +BUILD_DIR ?= $(CURDIR) + +BUILD_DIR_ABS = $(abspath $(BUILD_DIR)) + +INSTALL_DIR ?= /usr/lib/ + +TOOLCHAIN_PREFIX ?= +AR_FLAGS_APPEND ?= +LD_FLAGS_APPEND ?= +CC_FLAGS_APPEND ?= + +AR_FLAGS := rcs +LD_FLAGS := -shared -soname $(SHARED_TARGET) -lc -lm + +AR_FLAGS += $(AR_FLAGS_APPEND) +LD_FLAGS += $(LD_FLAGS_APPEND) + +AR := $(TOOLCHAIN_PREFIX)ar +LD := $(TOOLCHAIN_PREFIX)ld .PHONY: all all: @echo "Compiling libpredict..." - $(MAKE) BUILD_DIR=$(BUILD_DIR) -C src - $(AR) $(FLAGS) $(BUILD_DIR)/$(TARGET) $(BUILD_DIR)/*.o + $(MAKE) -C src BUILD_DIR=$(BUILD_DIR_ABS) TOOLCHAIN_PREFIX=$(TOOLCHAIN_PREFIX) CC_FLAGS_APPEND="$(CC_FLAGS_APPEND)" + $(AR) $(AR_FLAGS) $(BUILD_DIR_ABS)/$(STATIC_TARGET) $(BUILD_DIR_ABS)/*.o + $(LD) $(LD_FLAGS) -o $(BUILD_DIR_ABS)/$(SHARED_TARGET) $(BUILD_DIR_ABS)/*.o .PHONY: install install: - @echo "Installing libpredict driver..." - cp -r $(BUILD_DIR)/$(TARGET) /usr/lib/ + @echo "Installing libpredict..." + cp -r $(BUILD_DIR_ABS)/$(SHARED_TARGET) $(INSTALL_DIR) + cp -r $(BUILD_DIR_ABS)/$(STATIC_TARGET) $(INSTALL_DIR) cp -r include/predict /usr/include/ .PHONY: uninstall uninstall: - @echo "Uninstalling libpredict driver..." - rm /usr/lib/$(TARGET) + @echo "Uninstalling libpredict..." + rm $(INSTALL_DIR)/$(STATIC_TARGET) + rm $(INSTALL_DIR)/$(SHARED_TARGET) rm -r /usr/include/predict/ .PHONY: clean clean: - rm $(BUILD_DIR)/*.o $(BUILD_DIR)/*.a + rm $(BUILD_DIR_ABS)/*.o $(BUILD_DIR_ABS)/*.a $(BUILD_DIR_ABS)/*.so* diff --git a/firmware/app/libs/libpredict/README.md b/firmware/app/libs/libpredict/README.md index 4c3511ee..db72dfa5 100644 --- a/firmware/app/libs/libpredict/README.md +++ b/firmware/app/libs/libpredict/README.md @@ -1,86 +1,64 @@ -libpredict -========== +

libpredict

-A satellite orbit prediction library. +

A satellite orbit prediction library.

+This is a fork of **[la1k/libpredict](https://github.com/la1k/libpredict/)** and is inspired by **[philcrump's](https://github.com/philcrump/libpredict/)** fork of the same library. -Building --------- +## Major differences from la1k's library -We recommend using out-of-source builds. +This fork is intended to be used on embedded systems, therefore it supports static allocated +structs, instead of the dynamic allocated ones from the original library. Another major +change is that this fork intends to make the library MISRA-C 2012 compliant, which is +a requirement for many critical embedded applications, like spacecraft. Because of +compliance, pretty much every single function of the original library will be modified. -``` -cd $SOURCEDIR -mkdir build -cd build -cmake .. -make -``` +## MISRA-C 2012 Compliance Progress + +The following list contains the status of the library files: + +- [X] Headers +- [X] Orbit +- [ ] Observer +- [X] SGP4 +- [ ] SDP4 +- [X] Sun +- [ ] Moon +- [X] Unsorted +- [X] Julian Date +- [ ] Refraction +## Building -Installation ------------- +To build the library it should be as simple as running: +``` bash +make ``` -make install + +To specify a custom build directory you can do as follows: + +``` bash +make BUILD_DIR=/your/build/dir/ ``` -The install location is defined by `CMAKE_INSTALL_PREFIX`, which -defaults to `/usr/local`. To relocate the whole installation (to make -usr/local etc. inside another directory, e.g., if you want to make a -tarball or package it afterwards), use `make DESTDIR=/foo/bar install`. +To specify a custom toolchain prefix, like the arm-none-eabi, you can do as follows: -Linking -------- +``` bash +make TOOLCHAIN_PREFIX=arm-none-eabi- CC_FLAGS_APPEND="-mthumb -mcpu=cortex-m3" +``` -The library comes with pkg-config information, so the include and -library paths and flags can be found using the `pkg-config` command or -by using the `PKG_CHECK_MODULES` autotools macro or CMake command. +Note that any compiler, linker and ar flags can be appended to the default ones using +`CC_FLAGS_APPEND`, `LD_FLAGS_APPEND` and `AR_FLAGS_APPEND` variables. The previous +toolchain example shows how its done aswell. -Quickstart ----------- -We recommend to investigate the examples under `examples/` and the API documentation in `include/predict/predict.h`. +## Installation -A condensed version is that -``` -predict_orbital_elements_t *orbital_elements = orbital_elements = predict_parse_tle(tle_line_1, tle_line_2); -``` -parses a TLE in the form of two char arrays to orbital elements representing a satellite, and that -``` -predict_observer_t *observer = predict_create_observer(name, latitude_radians, longitude_radians, altitude_meters); -``` -defines a QTH for observation. For prediction, ``` -struct predict_position orbit; -predict_orbit(orbital_elements, &orbit, prediction_time); -``` -can be used to calculate properties that are independent of an observer (longitude, latitude, ...), while -``` -struct predict_observation observation; -predict_observe_orbit(observer, &orbit, &observation); +make install ``` -will convert to properties that will be relative to our observer (azimuth, elevation, ...). - -License -------- - - Copyright 1991-2006 John A. Magliacane (KD2BD) - - Copyright 2013- Akademisk radioklubb (LA1K) - - Copyright 2013-2015 Knut Magnus Kvamtrø (LA3DPA) - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2 of the License, or (at your -option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -Public License for more details. - -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +The install location is defined by `INSTALL_DIR`, which +defaults to `/usr/lib`. To relocate the whole installation (to make +usr/local etc. inside another directory, e.g., if you want to make a +tarball or package it afterwards), use `make INSTALL_DIR=/foo/bar install`. diff --git a/firmware/app/libs/libpredict/examples/basic/.gitignore b/firmware/app/libs/libpredict/examples/basic/.gitignore deleted file mode 100644 index 15a13db4..00000000 --- a/firmware/app/libs/libpredict/examples/basic/.gitignore +++ /dev/null @@ -1 +0,0 @@ -basic diff --git a/firmware/app/libs/libpredict/examples/basic/Makefile b/firmware/app/libs/libpredict/examples/basic/Makefile deleted file mode 100644 index 4d7c7a3d..00000000 --- a/firmware/app/libs/libpredict/examples/basic/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -TARGET=basic - -ifndef BUILD_DIR - BUILD_DIR=$(CURDIR) -endif - -CC=gcc -FLAGS=-fpic -std=gnu99 -Wall -pedantic -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -lm - -.PHONY: all -all: $(BUILD_DIR)/main.o - $(CC) $(FLAGS) $(BUILD_DIR)/main.o -o $(BUILD_DIR)/$(TARGET) -lpredict - -$(BUILD_DIR)/main.o: main.c - $(CC) $(FLAGS) -c $< -o $@ - -.PHONY: clean -clean: - rm $(BUILD_DIR)/*.o $(BUILD_DIR)/$(TARGET) diff --git a/firmware/app/libs/libpredict/examples/basic/README b/firmware/app/libs/libpredict/examples/basic/README deleted file mode 100644 index 503139d9..00000000 --- a/firmware/app/libs/libpredict/examples/basic/README +++ /dev/null @@ -1,7 +0,0 @@ -This example application shows how to calculate and print the position -of the International Space Station (latitude, longitude and altitude) -from a hard coded two-line element. The application will continue -printing the updated position until it's aborted. - -The provided CMakeLists.txt assumes libpredict and its development files are -installed on the system. diff --git a/firmware/app/libs/libpredict/examples/basic/main.c b/firmware/app/libs/libpredict/examples/basic/main.c deleted file mode 100644 index 459bc8d1..00000000 --- a/firmware/app/libs/libpredict/examples/basic/main.c +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include -#include -#include - -#include - -int main(int argc, char **argv) -{ - - const char *tle_line_1 = "1 25544U 98067A 15129.86961041 .00015753 00000-0 23097-3 0 9998"; - const char *tle_line_2 = "2 25544 51.6464 275.3867 0006524 289.1638 208.5861 15.55704207942078"; - - // Create orbit object - predict_orbital_elements_t *iss = predict_parse_tle(tle_line_1, tle_line_2); - if (!iss) { - fprintf(stderr, "Failed to initialize orbit from tle!"); - exit(1); - } - - // Create observer object - predict_observer_t *obs = predict_create_observer("Me", 63.9*M_PI/180.0, 10.9*M_PI/180.0, 0); - if (!obs) { - fprintf(stderr, "Failed to initialize observer!"); - exit(1); - } - - printf("\e[1;1H\e[2J"); //clear screen - - while (true) { - printf("\033[0;0H"); //print from start of the terminal - - predict_julian_date_t curr_time = predict_to_julian(time(NULL)); - - // Predict ISS - struct predict_position iss_orbit; - predict_orbit(iss, &iss_orbit, curr_time); - printf("ISS: lat=%f, lon=%f, alt=%f\n", iss_orbit.latitude*180.0/M_PI, iss_orbit.longitude*180.0/M_PI, iss_orbit.altitude); - - // Observe ISS - struct predict_observation iss_obs; - predict_observe_orbit(obs, &iss_orbit, &iss_obs); - printf("ISS: azi=%f (rate: %f), ele=%f (rate: %f)\n", iss_obs.azimuth*180.0/M_PI, iss_obs.azimuth_rate*180.0/M_PI, iss_obs.elevation*180.0/M_PI, iss_obs.elevation_rate*180.0/M_PI); - - // Apparent elevation - double apparent_elevation = predict_apparent_elevation(iss_obs.elevation); - printf("Apparent ISS elevation: %.2f\n\n", apparent_elevation*180.0/M_PI); - - // Predict and observe MOON - struct predict_observation moon_obs; - predict_observe_moon(obs, curr_time, &moon_obs); - printf("MOON: %f, %f\n", moon_obs.azimuth*180.0/M_PI, moon_obs.elevation*180.0/M_PI); - - // Predict and observe SUN - struct predict_observation sun_obs; - predict_observe_sun(obs, curr_time, &sun_obs); - printf("SUN: %f, %f\n", sun_obs.azimuth*180.0/M_PI, sun_obs.elevation*180.0/M_PI); - - //Sleep - fflush(stdout); - usleep(1000000); - } - - // Free memory - predict_destroy_orbital_elements(iss); - predict_destroy_observer(obs); - - return 0; -} diff --git a/firmware/app/libs/libpredict/examples/orbit-2d/CMakeLists.txt b/firmware/app/libs/libpredict/examples/orbit-2d/CMakeLists.txt deleted file mode 100644 index 4683da6a..00000000 --- a/firmware/app/libs/libpredict/examples/orbit-2d/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -project(orbit-plot-example CXX) - -add_executable(generate_orbit_data generate_orbit_data.cpp) -target_link_libraries(generate_orbit_data predict) diff --git a/firmware/app/libs/libpredict/examples/orbit-2d/README.md b/firmware/app/libs/libpredict/examples/orbit-2d/README.md deleted file mode 100644 index 3977718f..00000000 --- a/firmware/app/libs/libpredict/examples/orbit-2d/README.md +++ /dev/null @@ -1,20 +0,0 @@ -Calculates a full revolution of various orbits and plots their positions using -Matplotlib. - -![](orbits.png) - -Compilation: - -* `mkdir build` -* `cd build` -* `cmake ..` -* `make` - -Running the example: - -* `./generate_orbit_data ../data/orbits.tle` -* `python ../plot_orbits.py sat_track_*.dat` - -This should produce a couple of plots showing the shape of the satellite orbits -in testcase.tle. These are projected down to two of the orthogonal coordinate -axes as defined by libpredict, with center of Earth in origo. diff --git a/firmware/app/libs/libpredict/examples/orbit-2d/data/orbits.tle b/firmware/app/libs/libpredict/examples/orbit-2d/data/orbits.tle deleted file mode 100644 index 14d11e72..00000000 --- a/firmware/app/libs/libpredict/examples/orbit-2d/data/orbits.tle +++ /dev/null @@ -1,24 +0,0 @@ -MOLNIYA_1-29 -1 07780U 75036A 15268.44024861 .00000357 00000-0 -30994-3 0 9998 -2 07780 61.6281 228.0088 7320994 263.7628 16.5221 2.00561847296359 -THOR_III -1 25358U 98035A 15268.24841071 -.00000057 00000-0 00000+0 0 9999 -2 25358 4.3158 63.1329 0002182 131.4584 254.3027 1.00273084 63433 -HINODE -1 29479U 06041A 15269.11672282 .00000318 00000-0 69027-4 0 9994 -2 29479 98.1514 267.8479 0018201 43.1347 317.1278 14.64523079481168 -ERS-1 -1 21574U 91050A 15268.99630557 .00000263 00000-0 10150-3 0 9991 -2 21574 98.3773 218.1360 0034080 40.2399 0.7933 14.37359081267054 -VELA-1 -1 00692U 63039C 15270.70453905 -.00001516 00000-0 00000+0 0 9999 -2 00692 35.8806 1.0617 5492959 190.0635 359.6944 0.22560069 41927 -GPS_BIIA-10 -1 20959U 90103A 15268.04814446 -.00000015 00000-0 00000+0 0 9997 -2 20959 54.2521 190.2003 0113059 6.2850 353.8618 2.00562036181841 -SIRIUS-1 -1 26390U 00035A 15263.05767392 .00000057 00000-0 00000+0 0 9995 -2 26390 59.7673 235.4685 2643498 268.8985 140.1391 1.00280878 55759 -ISS -1 25544U 98067A 15268.21313216 .00005785 00000-0 94507-4 0 9995 -2 25544 51.6463 304.6860 0005196 319.3549 152.0018 15.54144244963604 diff --git a/firmware/app/libs/libpredict/examples/orbit-2d/generate_orbit_data.cpp b/firmware/app/libs/libpredict/examples/orbit-2d/generate_orbit_data.cpp deleted file mode 100644 index 6919e980..00000000 --- a/firmware/app/libs/libpredict/examples/orbit-2d/generate_orbit_data.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -typedef struct { - std::string name; - predict_orbital_elements_t *orbital_elements; -} satellite_t; - -/** - * Parse a TLE file and return as a list of orbital elements. Based on - * tle_db_from_file() in flyby, in turn based on ReadDataFiles() from Predict. - * - * \param tle_file Path to TLE file - * \return Parsed orbital elements and associated satellite names as acquired from TLE file. - **/ -std::vector orbital_elements_from_file(const char *tle_file); - -int main(int argc, char **argv) -{ - if (argc < 2) { - fprintf(stderr, "Usage: %s \n", argv[0]); - exit(1); - } - - //parse TLE file - std::vector satellite_list = orbital_elements_from_file(argv[1]); - if (satellite_list.size() <= 0) { - fprintf(stderr, "No TLEs found in input file.\n"); - exit(1); - } - - //set fixed start time in UTC close to the epoch of the TLEs - setenv("TZ", "GMT", 1); - tzset(); - - struct tm timeval = {0}; - timeval.tm_year = 2015-1900; - timeval.tm_mon = 8; - timeval.tm_mday = 26; - timeval.tm_hour = 18; - timeval.tm_min = 0; - - predict_julian_date_t start_time = predict_to_julian(mktime(&timeval)); - double time_step = 1.0/(24.0*60.0); - - for (int i=0; i < satellite_list.size(); i++) { - satellite_t satellite = satellite_list[i]; - predict_julian_date_t end_time = start_time + 1.0/satellite.orbital_elements->mean_motion; //mean_motion is the revolutions per day, so the period of the satellite should be 1/mean_motion plus/minus a bit. - predict_julian_date_t curr_time = start_time; - - std::ofstream file(("sat_track_" + satellite.name + ".dat").c_str()); - - while (curr_time < end_time) { - struct predict_position orbit; - predict_orbit(satellite.orbital_elements, &orbit, curr_time); - file << orbit.position[0] << " " << orbit.position[1] << " " << orbit.position[2] << std::endl; - curr_time += time_step; - } - file.close(); - - predict_destroy_orbital_elements(satellite.orbital_elements); - } -} - -#define NUM_CHARS_IN_TLE 80 - -std::vector orbital_elements_from_file(const char *tle_file) -{ - std::vector ret_list; - - FILE *fd = fopen(tle_file,"r"); - if (fd == NULL) { - return ret_list; - } - - while (feof(fd) == 0) { - satellite_t satellite; - - char name[NUM_CHARS_IN_TLE] = {0}; - char line1[NUM_CHARS_IN_TLE] = {0}; - char line2[NUM_CHARS_IN_TLE] = {0}; - - //read element set - if (fgets(name, NUM_CHARS_IN_TLE, fd) == NULL) break; - if (fgets(line1, NUM_CHARS_IN_TLE, fd) == NULL) break; - if (fgets(line2, NUM_CHARS_IN_TLE, fd) == NULL) break; - - //parse element set - predict_orbital_elements_t *temp_elements = predict_parse_tle(line1, line2); - satellite.orbital_elements = temp_elements; - satellite.name = std::string(name); - - //trim name - std::stringstream stream(satellite.name); - stream >> satellite.name; - - ret_list.push_back(satellite); - } - - fclose(fd); - return ret_list; -} diff --git a/firmware/app/libs/libpredict/examples/orbit-2d/orbits.png b/firmware/app/libs/libpredict/examples/orbit-2d/orbits.png deleted file mode 100644 index 54d8bb3486c7a7ff0f0bc0eae668946d89fa7899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36918 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

lADc_cpSI#oI@rcV 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") - sys.exit() - -import matplotlib.pyplot as plt -import numpy as np -import re -from mpl_toolkits.mplot3d import Axes3D - -#2d plots -f_2d, (ax1, ax2) = plt.subplots(2, figsize=(15,15));#, sharex=True, sharey=True) - -#3d plot -f_3d = plt.figure(); -ax_3d = f_3d.add_subplot(111, projection='3d') - -#regexp for extracting satellite name from filename -prog = re.compile("sat_track_(.*)\.dat"); - -for i in range(1, len(sys.argv)): - sat_data = np.loadtxt(sys.argv[i]); - satname = prog.match(sys.argv[i]).group(1); - - #orbits projected onto xy and yz planes - ax1.plot(sat_data[:,0], sat_data[:,1], label=satname); - ax2.plot(sat_data[:,1], sat_data[:,2], label=satname); - - #orbits in 3d plot - ax_3d.plot(sat_data[:,0], sat_data[:,1], sat_data[:,2], label=satname); - -#set aspect ratios of 2d plot -ax1.set_aspect(1); -ax2.set_aspect(1); - -#set fixed limits of 2d plot -range_start = -100000; -range_y_end = 100000; -range_x_end = 200000; - -ax1.set_xlim(range_start, range_x_end); -ax2.set_xlim(range_start, range_x_end); - -ax1.set_ylim(range_start, range_y_end); -ax2.set_ylim(range_start, range_y_end); -ax1.legend(loc='best', fontsize=10); -ax2.legend(loc='best', fontsize=10); - -f_2d.savefig("2d_plot.png", bbox_inches='tight'); -f_3d.savefig("3d_plot.png", bbox_inches='tight'); - - diff --git a/firmware/app/libs/libpredict/examples/passplot/CMakeLists.txt b/firmware/app/libs/libpredict/examples/passplot/CMakeLists.txt deleted file mode 100644 index a4e2ee19..00000000 --- a/firmware/app/libs/libpredict/examples/passplot/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -project(passplot-example C) - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") - -add_executable(generate_pass_data generate_pass_data.c) -target_link_libraries(generate_pass_data predict m) diff --git a/firmware/app/libs/libpredict/examples/passplot/README.md b/firmware/app/libs/libpredict/examples/passplot/README.md deleted file mode 100644 index 14975176..00000000 --- a/firmware/app/libs/libpredict/examples/passplot/README.md +++ /dev/null @@ -1,18 +0,0 @@ -Example showing how to specify a very specific time for satellite prediction, -predict the AOS of a pass and calculate properties throughout the pass, finally -plotting these properties using Python and Matplotlib. - -![](map.png) -![](pass_properties.png) - -Compilation: - -* `mkdir build` -* `cd build` -* `cmake ..` -* `make` - -Running the example: - -* `./generate_pass_data > pass_data` -* `python ../plot_pass.py pass_data` diff --git a/firmware/app/libs/libpredict/examples/passplot/generate_pass_data.c b/firmware/app/libs/libpredict/examples/passplot/generate_pass_data.c deleted file mode 100644 index da1ea457..00000000 --- a/firmware/app/libs/libpredict/examples/passplot/generate_pass_data.c +++ /dev/null @@ -1,69 +0,0 @@ -#include -#include -#include -#include - -#include - -double rad_to_deg(double rad) -{ - double deg = rad*180.0/M_PI; - return deg; -} - -int main(int argc, char **argv) -{ - //TLE of OSCAR 7 obtained at 2017-02-27 - const char *oscar7_tle_line_1 = "1 07530U 74089B 17058.02491442 -.00000048 00000-0 -22049-4 0 9995"; - const char *oscar7_tle_line_2 = "2 07530 101.6163 28.9438 0011984 174.4353 227.0960 12.53625643935054"; - predict_orbital_elements_t *orbital_elements = predict_parse_tle(oscar7_tle_line_1, oscar7_tle_line_2); - float latitude = 63.9; - float longitude = 10.9; - predict_observer_t *observer = predict_create_observer("LA1K", latitude*M_PI/180.0, longitude*M_PI/180.0, 10); - - //force UTC time in order to fix correct time below (in general not necessary for correct libpredict operation, as libpredict does conversions to and from timezones automatically) - setenv("TZ", "GMT", 1); - tzset(); - - //fixed time close to TLE epoch date so that the TLE is valid. - //the fixed time corresponds to 2017-02-28 11:30 UTC - struct tm timeval = {0}; - timeval.tm_year = 2017-1900; - timeval.tm_mon = 1; //this is february - timeval.tm_mday = 28; - timeval.tm_hour = 11; - timeval.tm_min = 30; - - //predict next AOS and LOS after defined time - predict_julian_date_t start_time = predict_to_julian(mktime(&timeval)); - struct predict_observation aos, los; - aos = predict_next_aos(observer, orbital_elements, start_time); - los = predict_next_los(observer, orbital_elements, start_time); - - //calculate properties between AOS and LOS - struct predict_position orbit; - struct predict_observation observation; - - double timestep = 1.0/(24.0*60.0*60); - predict_julian_date_t curr_time = aos.time - 30*60*timestep; - predict_julian_date_t end_time = los.time + 30*60*timestep; - - double freq = 1000; - - while (curr_time < end_time) { - predict_orbit(orbital_elements, &orbit, curr_time); - predict_observe_orbit(observer, &orbit, &observation); - double shift = predict_doppler_shift(&observation, freq); - - //print independent properties - printf("%f %f ", rad_to_deg(orbit.latitude), rad_to_deg(orbit.longitude)); - - //print observed properties - printf("%f %f %f ", rad_to_deg(observation.elevation), rad_to_deg(observation.azimuth), freq + shift); - printf("%f\n", rad_to_deg(observation.elevation_rate)); - curr_time += timestep; - } - - predict_destroy_observer(observer); - predict_destroy_orbital_elements(orbital_elements); -} diff --git a/firmware/app/libs/libpredict/examples/passplot/map.png b/firmware/app/libs/libpredict/examples/passplot/map.png deleted file mode 100644 index 18a251b2a058c88869bf6cbc3ea2ad8a3c30bd40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108785 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 diff --git a/firmware/app/libs/libpredict/examples/passplot/pass_properties.png b/firmware/app/libs/libpredict/examples/passplot/pass_properties.png deleted file mode 100644 index 7b61040661fdcfd5355f3acd843fa88fe42b0d0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69395 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 KCZBTg-SjUy&k^DP diff --git a/firmware/app/libs/libpredict/examples/passplot/plot_pass.py b/firmware/app/libs/libpredict/examples/passplot/plot_pass.py deleted file mode 100644 index 3dbff4cd..00000000 --- a/firmware/app/libs/libpredict/examples/passplot/plot_pass.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python - -import sys - -if len(sys.argv) < 2: - print("Usage: plot_pass ") - sys.exit() - -from mpl_toolkits.basemap import Basemap -import matplotlib.pyplot as plt -import numpy as np -from scipy.interpolate import InterpolatedUnivariateSpline - -####################### -# Plot pass on a map. # -####################### - -qth_lat = 63.422; -qth_lon = 10.39; - -#prepare world map approximately limited to the pass -plt.figure(1); -map_width = 8000000; -map_height = 10000000; -basemap = Basemap(width=map_width,height=map_height,\ - resolution='l',projection='gnom',\ - lat_0=qth_lat,lon_0=qth_lon) -basemap.drawcoastlines(linewidth=0.25) -basemap.drawcountries(linewidth=0.25) -basemap.drawmapboundary(fill_color='aqua') -basemap.fillcontinents(color='#cc9966',lake_color='#99ffff') - -#load satellite data -sat_data = np.loadtxt(sys.argv[1]); -sat_data[sat_data[:,3] > 180, 3] -= 360; - -sat_visible = sat_data[sat_data[:,2] > 0]; #nonnegative elevation - -#plot satellite track on map -basemap.plot(sat_data[:,1], sat_data[:,0], linewidth=6.0, color='black', latlon=True, label='Elevation < 0') - -#indicate in satellite track where the satellite is observable from the QTH coordinates -basemap.plot(sat_visible[:,1], sat_visible[:,0], linewidth=6.0, color='green', latlon=True, label='Elevation > 0') - -elevation_thresh_10 = sat_visible[:,2] > 10; -basemap.plot(sat_visible[elevation_thresh_10,1], sat_visible[elevation_thresh_10,0], linewidth=4.0, color='yellow', latlon=True, label='Elevation > 10') - -elevation_thresh_50 = sat_visible[:,2] > 50; -basemap.plot(sat_visible[elevation_thresh_50,1], sat_visible[elevation_thresh_50,0], linewidth=2.0, color='red', latlon=True, label='Elevation > 50') - -#plot QTH point -qth_x,qth_y = basemap(qth_lon, qth_lat); -basemap.plot(qth_lon, qth_lat, 'bo', latlon=True); -plt.text(qth_x, qth_y, 'QTH',fontsize=14, - ha='right',va='bottom',color='black') -plt.legend(fontsize=10) - -#save map -plt.savefig("map.png", bbox_inches='tight'); - -######################### -# Plot pass properties. # -######################### - -f, (ax1, ax2, ax3) = plt.subplots(3, sharex=True) - -#plot elevation and azimuth in simple plot -x = np.arange(0, len(sat_data[:,1])); -x = x/60.0; #convert to minutes -ax1.plot(x, sat_data[:,2], label="Elevation"); -ax1.plot(x, sat_data[:,3], label="Azimuth"); -ax1.plot(x, np.repeat(0, len(x)), label="Horizon", linestyle="dashed"); -legendsize=10 -ax1.legend(loc='best', fontsize=legendsize); -ax1.set_ylabel("Degrees"); - -#plot elevation rate -ax2.plot(x, sat_data[:,5], label="Elevation rate"); - -#plot numerical derivative estimated from an interpolating spline -f = InterpolatedUnivariateSpline(x, sat_data[:,2], k=1) -dfdx = f.derivative() -dydx = dfdx(x) -ax2.plot(x, sat_data[0,5]/dydx[0]*dydx, label="Scaled numerical derivative"); -ax2.legend(loc='best', fontsize=legendsize); -ax2.set_ylabel("Degrees"); -ax2.set_ylabel("Degrees"); - -#plot doppler shift -ax3.plot(x, np.repeat(1000, len(x)), label="Downlink frequency"); -ax3.plot(x, sat_data[:,4], label="Doppler-shifted downlink frequency"); -ax3.legend(loc='best', fontsize=legendsize); -ax3.set_ylabel("Frequency (MHz)"); -tickrange=np.arange(999.98, 1000.025, 0.01); -ax3.set_yticks(tickrange) -ax3.set_yticklabels(map(str, tickrange)); -plt.xlabel("Timestep (min)"); -plt.savefig("pass.png"); - -#plot azimuth and elevation in a polar diagram -f, ax = plt.subplots(1, subplot_kw=dict(projection='polar')) -x = np.arange(0, len(sat_visible[:,2])); -ax.set_theta_zero_location("N") -ax.set_theta_direction(-1) -ax.plot(sat_visible[:,3]*np.pi/180.0, 90 - sat_visible[:,2]); -ax.set_yticks(range(0, 90, 10)) # Define the yticks -ax.set_yticklabels(map(str, range(90, 0, -10))) # Change the labels -plt.savefig("azimuth.png", bbox_inches='tight'); diff --git a/firmware/app/libs/libpredict/examples/setrise/.gitignore b/firmware/app/libs/libpredict/examples/setrise/.gitignore deleted file mode 100644 index 09cc59d1..00000000 --- a/firmware/app/libs/libpredict/examples/setrise/.gitignore +++ /dev/null @@ -1 +0,0 @@ -setrise diff --git a/firmware/app/libs/libpredict/examples/setrise/CMakeLists.txt b/firmware/app/libs/libpredict/examples/setrise/CMakeLists.txt deleted file mode 100644 index 86fbc373..00000000 --- a/firmware/app/libs/libpredict/examples/setrise/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -project(setrise-example C) - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") - -add_executable(setrise-example main.c) -target_link_libraries(setrise-example predict) diff --git a/firmware/app/libs/libpredict/examples/setrise/main.c b/firmware/app/libs/libpredict/examples/setrise/main.c deleted file mode 100644 index 214d5005..00000000 --- a/firmware/app/libs/libpredict/examples/setrise/main.c +++ /dev/null @@ -1,122 +0,0 @@ -#include -#include -#include -#include -#include - -#include - -double observer_next_sunset(const predict_observer_t *observer, double time, struct predict_observation *obs) -{ - struct predict_observation sun; - - // Scan for first elevation > 0 (t0) - double t0 = time; - predict_observe_sun(observer, t0, &sun); - while (sun.elevation < 0) { - t0 += 1.0/24.0/3600.0; - predict_observe_sun(observer, t0, &sun); - } - - //Scan for elevation < 0 (t1); - double t1 = t0 + 1.0/24.0/3600.0; - predict_observe_sun(observer, t1, &sun); - while (sun.elevation > 0) { - t1 += 1.0/24.0/3600.0; - predict_observe_sun(observer, t1, &sun); - } - - while ( fabs(t0-t1) > 0.01/24/3600 ) { - - time = (t0 + t1) / 2.0; - predict_observe_sun(observer, time, &sun); - - if (sun.elevation > 0) t0 = time; - else t1 = time; - - } - - if (obs != NULL) { - memcpy(obs, &sun, sizeof(struct predict_observation)); - } - - return time; -} - -double observer_next_sunrise(const predict_observer_t *observer, double time, struct predict_observation *obs) -{ - struct predict_observation sun; - - // Scan for first elevation < 0 (t0) - double t0 = time; - predict_observe_sun(observer, t0, &sun); - while (sun.elevation > 0) { - t0 += 1.0/24.0/3600.0; - predict_observe_sun(observer, t0, &sun); - } - - //Scan for elevation > 0 (t1); - double t1 = t0 + 1.0/24.0/3600.0; - predict_observe_sun(observer, t1, &sun); - while (sun.elevation < 0) { - t1 += 1.0/24.0/3600.0; - predict_observe_sun(observer, t1, &sun); - } - - while ( fabs(t0-t1) > 0.01/24/3600 ) { - - time = (t0 + t1) / 2.0; - predict_observe_sun(observer, time, &sun); - - if (sun.elevation < 0) t0 = time; - else t1 = time; - - } - - if (obs != NULL) { - memcpy(obs, &sun, sizeof(struct predict_observation)); - } - - return time; -} - -int main(int argc, char **argv) -{ - - // Create observer object - predict_observer_t *obs = predict_create_observer("Me", 59.95*M_PI/180.0, 10.75*M_PI/180.0, 0); - if (!obs) { - fprintf(stderr, "Failed to initialize observer!"); - exit(1); - } - - predict_julian_date_t curr_time = predict_to_julian(time(NULL)); - - struct predict_observation sun; - double sunset = observer_next_sunset(obs, curr_time, &sun); - - // Convert to hour, minute, seconds - double timeto = (sunset - curr_time)*24*3600; - int h = timeto / 3600; - int m = (timeto-h*3600) / 60; - int s = ((int)timeto)%60; - - time_t t = (time_t)(86400.0 * (sunset + 3651.0)); - printf("Next sunset in %02i:%02i:%02i, azimuth=%.1f, at UTC %s", h, m, s, sun.azimuth*180.0/M_PI, asctime(gmtime(&t))); - - double sunrise = observer_next_sunrise(obs, curr_time, &sun); - - // Convert to hour, minute, seconds - timeto = (sunrise - curr_time)*24*3600; - h = timeto / 3600; - m = (timeto-h*3600) / 60; - s = ((int)timeto)%60; - - t = (time_t)(86400.0 * (sunrise + 3651.0)); - printf("Next sunrise in %02i:%02i:%02i, azimuth=%.1f, at UTC %s", h, m, s, sun.azimuth*180.0/M_PI, asctime(gmtime(&t))); - - // Free memory - predict_destroy_observer(obs); - - return 0; -} diff --git a/firmware/app/libs/libpredict/include/predict/defs.h b/firmware/app/libs/libpredict/include/predict/defs.h new file mode 100644 index 00000000..93ed88d1 --- /dev/null +++ b/firmware/app/libs/libpredict/include/predict/defs.h @@ -0,0 +1,197 @@ +#ifndef PREDICT_DEFS_H_ +#define PREDICT_DEFS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** \name Geosynchronous orbit definitions + * Requirements for an orbit to be called geosynchronous. + */ +///@{ +/// lower mean motion for geosynchronous satellites +#define GEOSYNCHRONOUS_LOWER_MEAN_MOTION ( 0.9 ) +/// upper mean motion for geosynchronous satellites +#define GEOSYNCHRONOUS_UPPER_MEAN_MOTION ( 1.1 ) +/// upper eccentricity for geosynchronous satellites +#define GEOSYNCHRONOUS_ECCENTRICITY_THRESHOLD ( 0.2 ) +/// upper inclination for geosynchronous satellites +#define GEOSYNCHRONOUS_INCLINATION_THRESHOLD_DEGREES ( 70 ) +///@} + +/** \name Mathematical constants + * Mathematical convenience constants used by sgp4/sdp4 and related routines. + */ +///@{ +/// pi +#define PI ( 3.14159265358979323846 ) +/// pi/2 +#define PI_HALF ( 1.57079632679489656 ) +/// 2*pi +#define TWO_PI ( 6.28318530717958623 ) +/// 3*pi/2 +#define THREE_PI_HALF ( 4.71238898038468967 ) +/// 2/3 +#define TWO_THIRD ( 6.6666666666666666E-1 ) +///@} + +/** \name Time constants + * Constants used for time conversions. + */ +///@{ +/// Number of minutes per day, XMNPDA in spacetrack report #3 +#define MINUTES_PER_DAY ( 1.44E3 ) +/// Number of seconds per day +#define SECONDS_PER_DAY ( 8.6400E4 ) +/// Difference between libpredict's predict_julian_date_t and the julian time +/// format used in some of the internal functions +#define JULIAN_TIME_DIFF ( 2444238.5 ) +///@} + +/** \name Physical properties + * General physical properties and definitions. + */ +///@{ +/// J3 Harmonic (WGS '72), XJ3 in spacetrack report #3 +#define J3_HARMONIC_WGS72 ( -2.53881E-6 ) +/// WGS 84 Earth radius km, XKMPER in spacetrack report #3 +#define EARTH_RADIUS_KM_WGS84 ( 6.378137E3 ) +/// Flattening factor +#define FLATTENING_FACTOR ( 3.35281066474748E-3 ) +/// Earth rotations per siderial day +#define EARTH_ROTATIONS_PER_SIDERIAL_DAY ( 1.00273790934 ) +/// Solar radius in kilometers (IAU 76) +#define SOLAR_RADIUS_KM ( 6.96000E5 ) +/// Astronomical unit in kilometers (IAU 76) +#define ASTRONOMICAL_UNIT_KM ( 1.49597870691E8 ) +/// Upper elevation threshold for nautical twilight +#define NAUTICAL_TWILIGHT_SUN_ELEVATION ( -12.0 ) +/// Speed of light in vacuum +#define SPEED_OF_LIGHT ( 299792458.0 ) +/// Angular velocity of Earth in radians per seconds +#define EARTH_ANGULAR_VELOCITY ( 7.292115E-5 ) +///@} + +/** \name Iteration constants + * Constants used in iteration functions like predict_max_elevation(), + * predict_next_aos() and predict_next_los(). + */ +///@{ +/// Threshold used for fine-tuning of AOS/LOS +#define AOSLOS_HORIZON_THRESHOLD ( 0.3 ) +/// Threshold used for comparing lower and upper brackets in find_max_elevation +#define MAXELE_TIME_EQUALITY_THRESHOLD FLT_EPSILON +/// Maximum number of iterations in find_max_elevation +#define MAXELE_MAX_NUM_ITERATIONS ( ( uint16_t ) 10000 ) +///@} + +/** \name General spacetrack report #3 constants + * These constants are also used outside of SGP4/SDP4 code. The + * constants/symbols are defined on page 76 to page 78 in the report. + */ +///@{ +/// k_e = sqrt(Newton's universal gravitational * mass of the Earth), in units +/// (earth radii per minutes)^3/2 +#define XKE ( 7.43669161E-2 ) +/// Corresponds to 1/2 * J_2 * a_E^2. J_2 is the second gravitational zonal +/// harmonic of Earth, a_E is the equatorial radius of Earth. +#define CK2 ( 5.413079E-4 ) +///@} + +/** \name Specific spacetrack report #3 constants + * These constants are only used by SGP4/SDP4 code. The constants/symbols are + * defined on page 76 to page 78 in the report. + */ +///@{ +/// Shorthand for 10^-6. +#define E6A ( 1.0E-6 ) +/// Distance units / Earth radii. +#define AE ( 1.0 ) +/// Corresponds to -3/8 * J_4 * a_E^4, where J_4 is the fourth gravitational +/// zonal harmonic of Earth. +#define CK4 ( 6.209887E-7 ) +/// Parameter for SGP4/SGP8 density function. +#define S_DENSITY_PARAM ( 1.012229 ) +/// Corresponds to (q_0 - s)^4 in units (earth radii)^4, where q_0 and s are +/// parameters for the SGP4/SGP8 density function. +#define QOMS2T ( 1.880279E-09 ) +///@} + +/** \name Constants in deep space subroutines + * Not defined in spacetrack report #3. + * + * The constants might originally be defined in Hujsak (1979) and/or Hujsak + * and Hoots (1977), but this is unavailable on the Internet. Reiterated in F. + * R. Hoots, P. W. Schumacher and R. A. Glober, "A HISTORY OF ANALYTICAL + * ORBIT MODELING IN THE UNITED STATES SPACE SURVEILLANCE SYSTEM", 2004. Page + * numbers below refer to this article. + */ +///@{ +/// Solar mean motion (n_s in units radians/minute, p. 29) +#define ZNS ( 1.19459E-5 ) +/// Solar perturbation coefficient (C_s in units radians/minute, p. 29) +#define C1SS ( 2.9864797E-6 ) +/// Solar eccentricity (e_s, p. 29) +#define ZES ( 1.675E-2 ) +/// Lunar mean motion (n_m in units radians/minute, p. 29) +#define ZNL ( 1.5835218E-4 ) +/// Lunar perturbation coefficient (C_m in units radians/minute, p. 29) +#define C1L ( 4.7968065E-7 ) +/// Lunar eccentricity (e_m, p. 29) +#define ZEL ( 5.490E-2 ) +/// Cosine of the solar inclination (not defined directly in the paper, but +/// corresponds with cos(I_s) with I_s as the solar inclination on p. 29) +#define ZCOSIS ( 9.1744867E-1 ) +/// Sine of the solar inclination (sin(I_s), I_s on p. 29. See comment above) +#define ZSINIS ( 3.9785416E-1 ) +/// Corresponds to sin(\omega_s) (\omega_s defined on p. 29, no description. See +/// comment above) +#define ZSINGS ( -9.8088458E-1 ) +/// Corresponds to cos(\omega_s) (\omega_s defined on p. 29, no description. See +/// comment above) +#define ZCOSGS ( 1.945905E-1 ) +/// Constants for one-day resonance conditions, satellite-independent for 1-day +/// period satellites (Initialization of resonance effects of Earth gravity, +/// Q_22, Q_31 and Q_33, p. 31) +#define Q22 ( 1.7891679E-6 ) +/// See above +#define Q31 ( 2.1460748E-6 ) +/// See above +#define Q33 ( 2.2123015E-7 ) +/// Constants for secular update for resonance effects of Earth gravity (G_22, +/// G_32, G_44, G_52 and G_54, p. 36) +#define G22 ( 5.7686396 ) +/// See above +#define G32 ( 9.5240898E-1 ) +/// See above +#define G44 ( 1.8014998 ) +/// See above +#define G52 ( 1.0508330 ) +/// See above +#define G54 ( 4.4108898 ) +/// Constants for 1/2-day resonance conditions, satellite-independent for +/// 1/2-day period satellites (Initialization for resonance effects of Earth +/// gravity, sqrt(C_ij^2 + S_ij^2) where ij = 22, 32, 44, 52 and 54, p. 32) +#define ROOT22 ( 1.7891679E-6 ) +/// See above +#define ROOT32 ( 3.7393792E-7 ) +/// See above +#define ROOT44 ( 7.3636953E-9 ) +/// See above +#define ROOT52 ( 1.1428639E-7 ) +/// See above +#define ROOT54 ( 2.1765803E-9 ) +/// The time-derivative of the Greenwich hour angle in radians per minute +/// (\dot{\theta}, used on p. 36. Not directly defined in report, but values and +/// naming are consistent with this) +#define THDT ( 4.3752691E-3 ) +///@} + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/firmware/app/libs/libpredict/include/predict/predict.h b/firmware/app/libs/libpredict/include/predict/predict.h index e5c1f4c3..e13b4a51 100644 --- a/firmware/app/libs/libpredict/include/predict/predict.h +++ b/firmware/app/libs/libpredict/include/predict/predict.h @@ -1,191 +1,403 @@ -#ifndef _PREDICT_H_ -#define _PREDICT_H_ +#ifndef PREDICT_H_ +#define PREDICT_H_ +#include #ifdef __cplusplus extern "C" { #endif -#include #include -#define PREDICT_VERSION_MAJOR 2 -#define PREDICT_VERSION_MINOR 0 -#define PREDICT_VERSION_PATCH 0 -#define PREDICT_VERSION 20000 -#define PREDICT_VERSION_STRING "v2.0.0" - -/** - * Get the major version number of the library - * - * \return Major version number - */ -int predict_version_major(); +struct model_output +{ + double xinck; // inclination? + double omgadf; // argument of perigee? + double xnodek; // RAAN? + + double pos[ 3 ]; + double vel[ 3 ]; + + double phase; +}; /** - * Get the minor version number of the library - * - * \return Minor version number - */ -int predict_version_minor(); + * Parameters for deep space perturbations + **/ +typedef struct +{ + /* Used by dpinit part of Deep() */ + double eosq; + double sinio; + double cosio; + double betao; + double aodp; + double theta2; + double sing; + double cosg; + double betao2; + double xmdot; + double omgdot; + double xnodot; + double xnodp; + + /* Used by thetg and Deep() */ + double ds50; +} deep_arg_fixed_t; /** - * Get the patch version number of the library - * - * \return Patch version number - */ -int predict_version_patch(); + * Output from deep space perturbations. + **/ +typedef struct +{ + /* Moved from deep_arg_t. */ + /* Used by dpsec and dpper parts of Deep() */ + double xll; + double omgadf; + double xnode; + double em; + double xinc; + double xn; + double t; + + /* Previously a part of _sdp4, moved here. */ + double pl; + double pinc; + double pe; + double sh1; + double sghl; + double shs; + double savtsn; + double atime; + double xni; + double xli; + double sghs; + /// Do loop flag: + int32_t loopFlag; + /// Epoch restart flag: + int32_t epochRestartFlag; +} deep_arg_dynamic_t; /** - * Get the version number of the library - * - * \return 2 digit major, 2 digit minor, 2 digit patch decimal version number - */ -int predict_version(); + * Parameters relevant for SDP4 (simplified deep space perturbations) orbital + *model. + **/ +struct predict_sdp4 +{ + /// Lunar terms done? + int32_t lunarTermsDone; + /// Resonance flag: + int32_t resonanceFlag; + /// Synchronous flag: + int32_t synchronousFlag; + + /// Static variables from SDP4(): + double x3thm1; + double c1; + double x1mth2; + double c4; + double xnodcf; + double t2cof; + double xlcof; + double aycof; + double x7thm1; + deep_arg_fixed_t deep_arg; + + /// Static variables from Deep(): + double thgr; + double xnq; + double xqncl; + double omegaq; + double zmol; + double zmos; + double ee2; + double e3; + double xi2; + double xl2; + double xl3; + double xl4; + double xgh2; + double xgh3; + double xgh4; + double xh2; + double xh3; + double sse; + double ssi; + double ssg; + double xi3; + double se2; + double si2; + double sl2; + double sgh2; + double sh2; + double se3; + double si3; + double sl3; + double sgh3; + double sh3; + double sl4; + double sgh4; + double ssl; + double ssh; + double d3210; + double d3222; + double d4410; + double d4422; + double d5220; + double d5232; + double d5421; + double d5433; + double del1; + double del2; + double del3; + double fasx2; + double fasx4; + double fasx6; + double xlamo; + double xfact; + double stepp; + double stepn; + double step2; + double preep; + double d2201; + double d2211; + double zsingl; + double zcosgl; + double zsinhl; + double zcoshl; + double zsinil; + double zcosil; + + // converted fields from predict_orbital_elements_t. + double xnodeo; + double omegao; + double xmo; + double xincl; + double eo; + double xno; + double bstar; + double epoch; +}; /** - * Get the version number string of the library - * - * \return Version number string ("major.minor.patch") - */ -char *predict_version_string(); + * Parameters relevant for SGP4 (simplified general perturbations) orbital + *model. + **/ +struct predict_sgp4 +{ + /// Simple flag + int32_t simpleFlag; + + /// Static variables from original SGP4() (time-independent, and might + /// probably have physical meaningfulness) + double aodp; + double aycof; + double c1; + double c4; + double c5; + double cosio; + double d2; + double d3; + double d4; + double delmo; + double omgcof; + double eta; + double omgdot; + double sinio; + double xnodp; + double sinmo; + double t2cof; + double t3cof; + double t4cof; + double t5cof; + double x1mth2; + double x3thm1; + double x7thm1; + double xmcof; + double xmdot; + double xnodcf; + double xnodot; + double xlcof; + + // tle fields copied (and converted) from predict_orbital_t. The fields + // above are TLE-dependent anyway, and interrelated with the values below. + double bstar; + double xincl; + double xnodeo; + double eo; + double omegao; + double xmo; + double xno; +}; /** - * The representation of time used by libpredict: The number of days since 31Dec79 00:00:00 UTC. + * The representation of time used by libpredict: The number of days since + *31Dec79 00:00:00 UTC. **/ typedef double predict_julian_date_t; /** - * Convert time_t in UTC to Julian date in UTC. + * Convert Unix timestamp to Julian. (Both in UTC) * * \param time Time in UTC * \return Julian day in UTC **/ -predict_julian_date_t predict_to_julian(time_t time); +predict_julian_date_t julian_from_timestamp( uint64_t time ); + +/** + * Convert Unix timestamp in ms to Julian. (Both in UTC) + * + * \param time Time, millisecond resolution, in UTC + * \return Julian day in UTC + **/ +predict_julian_date_t julian_from_timestamp_ms( uint64_t time_ms ); + +/** + * Convert Julian time to Unix timestamp. (Both in UTC) + * + * \param Julian day in UTC + * \return time Time in UTC + **/ +uint64_t timestamp_from_julian( predict_julian_date_t date ); /** - * Convert Julian date in UTC back to a time_t in UTC. + * Convert Julian time to Unix timestamp. (Both in UTC) * - * \param date Julian date in UTC - * \return Time in UTC + * \param Julian day in UTC + * \return time Time, millisecond resolution, in UTC **/ -time_t predict_from_julian(predict_julian_date_t date); +uint64_t timestamp_ms_from_julian( predict_julian_date_t date ); /** * Simplified perturbation models used in modeling the satellite orbits. **/ -enum predict_ephemeris { - EPHEMERIS_SGP4 = 0, - EPHEMERIS_SDP4 = 1, - EPHEMERIS_SGP8 = 2, - EPHEMERIS_SDP8 = 3 +enum predict_ephemeris +{ + EPHEMERIS_SGP4 = 0, + EPHEMERIS_SDP4 = 1, + EPHEMERIS_SGP8 = 2, + EPHEMERIS_SDP8 = 3 }; /** * Container for processed TLE data from TLE strings. **/ -typedef struct { - ///Satellite number (line 1, field 2) - int satellite_number; - ///Element number (line 1, field 13) - long element_number; - ///International designator (line 1, fields 4, 5, 6) - char designator[10]; - ///Epoch year (last two digits) (line 1, field 7) - int epoch_year; - ///Epoch day (day of year and fractional portion of day, line 1, field 8) - double epoch_day; - ///Inclination (line 2, field 3) - double inclination; - ///Right Ascension of the Ascending Node [Degrees] (line 2, field 4) - double right_ascension; - ///Eccentricity (line 2, field 5) - double eccentricity; - ///Argument of Perigee [Degrees] (line 2, field 6) - double argument_of_perigee; - ///Mean Anomaly [Degrees] (line 2, field 7) - double mean_anomaly; - ///Mean Motion [Revs per day] (line 2, field 8) - double mean_motion; - ///First Time Derivative of the Mean Motion divided by two (line 1, field 9) - double derivative_mean_motion; - ///Second Time Derivative of Mean Motion divided by six (line 1, field 10) - double second_derivative_mean_motion; - ///BSTAR drag term (decimal point assumed, line 1, field 11) - double bstar_drag_term; - ///Number of revolutions around Earth at epoch (line 2, field 9) - int revolutions_at_epoch; - - ///Which perturbation model to use - enum predict_ephemeris ephemeris; - ///Ephemeris data structure pointer - void *ephemeris_data; +typedef struct +{ + /// Satellite number (line 1, field 2) + int32_t satellite_number; + /// Element number (line 1, field 13) + int64_t element_number; + /// International designator (line 1, fields 4, 5, 6) + char designator[ 10 ]; + /// Epoch year (last two digits) (line 1, field 7) + int32_t epoch_year; + /// Epoch day (day of year and fractional portion of day, line 1, field 8) + double epoch_day; + /// Inclination (line 2, field 3) + double inclination; + /// Right Ascension of the Ascending Node [Degrees] (line 2, field 4) + double right_ascension; + /// Eccentricity (line 2, field 5) + double eccentricity; + /// Argument of Perigee [Degrees] (line 2, field 6) + double argument_of_perigee; + /// Mean Anomaly [Degrees] (line 2, field 7) + double mean_anomaly; + /// Mean Motion [Revs per day] (line 2, field 8) + double mean_motion; + /// First Time Derivative of the Mean Motion divided by two (line 1, field + /// 9) + double derivative_mean_motion; + /// Second Time Derivative of Mean Motion divided by six (line 1, field 10) + double second_derivative_mean_motion; + /// BSTAR drag term (decimal point assumed, line 1, field 11) + double bstar_drag_term; + /// Number of revolutions around Earth at epoch (line 2, field 9) + int32_t revolutions_at_epoch; + + /// Which perturbation model to use + enum predict_ephemeris ephemeris; + /// Ephemeris data structure pointer + void * ephemeris_data; } predict_orbital_elements_t; /** * Create predict_orbital_elements_t from TLE strings. * - * \param tle_line_1 First line of NORAD two-line element set string - * \param tle_line_2 Second line of NORAD two-line element set string - * \return Processed TLE parameters - * \copyright GPLv2+ + * \param elements Pointer to a static allocated predict_orbital_elements_t + *struct. \param sgp4 Pointer to a static allocated sgp4 struct. \param + *sdp4 Pointer to a static allocated sdp4 struct. \param tle_line_1 First + *line of NORAD two-line element set string \param tle_line_2 Second line of + *NORAD two-line element set string \return Processed TLE parameters \copyright + *GPLv2+ **/ -predict_orbital_elements_t* predict_parse_tle(const char *tle_line_1, const char *tle_line_2); +predict_orbital_elements_t * predict_parse_tle( + predict_orbital_elements_t * orbital_elements, + struct predict_sgp4 * sgp4, + struct predict_sdp4 * sdp4, + const char * tle_line_1, + const char * tle_line_2 ); /** * Reset memory allocated in orbital elements structure. * \param orbital_elements Orbit to reset **/ -void predict_destroy_orbital_elements(predict_orbital_elements_t *orbital_elements); +void predict_destroy_orbital_elements( + predict_orbital_elements_t * orbital_elements ); /** * Predicted orbital values for satellite at a given time. **/ -struct predict_position { - ///Timestamp for last call to orbit_predict - predict_julian_date_t time; - - ///Whether the orbit has decayed - bool decayed; - - ///ECI position in km - double position[3]; - ///ECI velocity in km/s - double velocity[3]; - - ///Latitude in radians, northing/easting - double latitude; - ///Longitude in radians, northing/easting - double longitude; - ///Altitude in km - double altitude; - ///Footprint diameter in km - double footprint; - ///Whether satellite is eclipsed by the earth - int eclipsed; - ///Eclipse depth - double eclipse_depth; - ///Orbital phase (mean anomaly) - double phase; - ///The current number of revolutions around Earth - long revolutions; - - ///Current inclination (from xinck within sgp4/sdp4) - double inclination; - ///Current right ascension of the ascending node (from xnodek within sgp4/sdp4) - double right_ascension; - ///Current argument of perigee (from omgadf within sgp4/sdp4) - double argument_of_perigee; +struct predict_position +{ + /// Timestamp for last call to orbit_predict + predict_julian_date_t time; + + /// Whether the orbit has decayed + bool decayed; + + /// ECI position in km + double position[ 3 ]; + /// ECI velocity in km/s + double velocity[ 3 ]; + + /// Latitude in radians, northing/easting + double latitude; + /// Longitude in radians, northing/easting + double longitude; + /// Altitude in km + double altitude; + /// Footprint diameter in km + double footprint; + /// Whether satellite is eclipsed by the earth + int32_t eclipsed; + /// Eclipse depth + double eclipse_depth; + /// Orbital phase (mean anomaly) + double phase; + /// The current number of revolutions around Earth + int64_t revolutions; + + /// Current inclination (from xinck within sgp4/sdp4) + double inclination; + /// Current right ascension of the ascending node (from xnodek within + /// sgp4/sdp4) + double right_ascension; + /// Current argument of perigee (from omgadf within sgp4/sdp4) + double argument_of_perigee; }; /** - * Main prediction function. Predict satellite orbit at given time. + * Main prediction function. Predict satellite orbit at given time. * \param orbital_elements Orbital elements * \param x Predicted orbit * \param time Julian day in UTC * \return 0 if everything went fine * \copyright GPLv2+ **/ -int predict_orbit(const predict_orbital_elements_t *orbital_elements, struct predict_position *x, predict_julian_date_t time); +int32_t predict_orbit( const predict_orbital_elements_t * orbital_elements, + struct predict_position * x, + predict_julian_date_t time ); /** * Find whether an orbit is geosynchronous. @@ -206,105 +418,120 @@ int predict_orbit(const predict_orbital_elements_t *orbital_elements, struct pre * \param orbital_elements Orbital elements * \return true if orbit is geosynchronous, false otherwise **/ -bool predict_is_geosynchronous(const predict_orbital_elements_t *orbital_elements); +bool predict_is_geosynchronous( + const predict_orbital_elements_t * orbital_elements ); -/** - * Get apogee of satellite orbit. +/** + * Get apogee of satellite orbit. * * \param x Orbital elements * \return Apogee of orbit * \copyright GPLv2+ **/ -double predict_apogee(const predict_orbital_elements_t *x); +double predict_apogee( const predict_orbital_elements_t * x ); /** - * Get perigee of satellite orbit. + * Get perigee of satellite orbit. * * \param x Orbital elements * \return Perigee of orbit * \copyright GPLv2+ **/ -double predict_perigee(const predict_orbital_elements_t *x); +double predict_perigee( const predict_orbital_elements_t * x ); /** - * Find whether an AOS can ever happen on the given latitude. + * Find whether an AOS can ever happen on the given latitude. * * \param x Orbital elements * \param latitude Latitude of ground station in radians * \return true if AOS can happen, otherwise false * \copyright GPLv2+ **/ -bool predict_aos_happens(const predict_orbital_elements_t *x, double latitude); +bool predict_aos_happens( const predict_orbital_elements_t * x, + double latitude ); /** * Observation point/ground station (QTH). **/ -typedef struct { - ///Observatory name - char name[128]; - ///Latitude (WGS84, radians) - double latitude; - ///Longitude (WGS84, radians) - double longitude; - ///Altitude (WGS84, meters) - double altitude; +typedef struct +{ + /// Observatory name + char name[ 128 ]; + /// Latitude (WGS84, radians) + double latitude; + /// Longitude (WGS84, radians) + double longitude; + /// Altitude (WGS84, meters) + double altitude; } predict_observer_t; /** - * Data relevant for a relative observation of an orbit or similar with respect to an observation point. - **/ -struct predict_observation { - ///UTC time - predict_julian_date_t time; - ///Azimuth angle (rad) - double azimuth; - ///Azimuth angle rate (rad/s) - double azimuth_rate; - ///Elevation angle (rad) - double elevation; - ///Elevation angle rate (rad/s) - double elevation_rate; - ///Range (km) - double range; - ///Range vector - double range_x, range_y, range_z; - ///Range velocity (km/s) - double range_rate; - ///Visibility status, whether satellite can be seen by optical means. - ///The satellite is defined to be visible if: - // - The satellite is in sunlight - // - The satellite is above the horizon - // - The sky is dark enough (sun elevation is below a fixed threshold) - bool visible; + * Data relevant for a relative observation of an orbit or similar with respect + *to an observation point. + **/ +struct predict_observation +{ + /// UTC time + predict_julian_date_t time; + /// Azimuth angle (rad) + double azimuth; + /// Azimuth angle rate (rad/s) + double azimuth_rate; + /// Elevation angle (rad) + double elevation; + /// Elevation angle rate (rad/s) + double elevation_rate; + /// Range (km) + double range; + /// Range vector + double range_x; + double range_y; + double range_z; + /// Range velocity (km/s) + double range_rate; + /// Visibility status, whether satellite can be seen by optical means. + /// The satellite is defined to be visible if: + // - The satellite is in sunlight + // - The satellite is above the horizon + // - The sky is dark enough (sun elevation is below a fixed threshold) + bool visible; }; /** * Create observation point (QTH). * + * \param observer Pointer to a static allocated predict_observer_t struct. * \param name Name of observation point * \param lat Latitude in radians (easting/northing) * \param lon Longitude in radians (easting/northing) * \param alt Altitude in meters * \return Allocated observation point **/ -predict_observer_t *predict_create_observer(const char *name, double lat, double lon, double alt); +predict_observer_t * predict_create_observer( predict_observer_t * observer, + const char * name, + double lat, + double lon, + double alt ); -/** +/** * Reset observer. * * \param obs Observer to be freed. **/ -void predict_destroy_observer(predict_observer_t *obs); +void predict_destroy_observer( predict_observer_t * obs ); -/** - * Find relative position of satellite with respect to an observer. Calculates range, azimuth, elevation and relative velocity. +/** + * Find relative position of satellite with respect to an observer. Calculates + *range, azimuth, elevation and relative velocity. * * \param observer Point of observation * \param orbit Satellite orbit - * \param obs Return of object for position of the satellite relative to the observer. - * \copyright GPLv2+ + * \param obs Return of object for position of the satellite relative to the + *observer. \copyright GPLv2+ **/ -void predict_observe_orbit(const predict_observer_t *observer, const struct predict_position *orbit, struct predict_observation *obs); +void predict_observe_orbit( const predict_observer_t * observer, + const struct predict_position * orbit, + struct predict_observation * obs ); /** * Estimate relative position of the moon. @@ -314,7 +541,9 @@ void predict_observe_orbit(const predict_observer_t *observer, const struct pred * \param obs Return object for position of the moon relative to the observer * \copyright GPLv2+ **/ -void predict_observe_moon(const predict_observer_t *observer, predict_julian_date_t time, struct predict_observation *obs); +void predict_observe_moon( const predict_observer_t * observer, + predict_julian_date_t time, + struct predict_observation * obs ); /** * Calculate right ascension of the moon. @@ -322,7 +551,7 @@ void predict_observe_moon(const predict_observer_t *observer, predict_julian_dat * \param time Time * \return RA in radians **/ -double predict_moon_ra(predict_julian_date_t time); +double predict_moon_ra( predict_julian_date_t time ); /** * Calculate declination of the moon. @@ -330,7 +559,7 @@ double predict_moon_ra(predict_julian_date_t time); * \param time Time * \return Declination in radians **/ -double predict_moon_declination(predict_julian_date_t time); +double predict_moon_declination( predict_julian_date_t time ); /** * Calculate the greenwich hour angle (longitude) of the moon. @@ -339,7 +568,7 @@ double predict_moon_declination(predict_julian_date_t time); * \return GHA in radians * \copyright GPLv2+ **/ -double predict_moon_gha(predict_julian_date_t time); +double predict_moon_gha( predict_julian_date_t time ); /** * Estimate relative position of the sun. @@ -349,7 +578,9 @@ double predict_moon_gha(predict_julian_date_t time); * \param obs Return object for position of the sun relative to the observer * \copyright GPLv2+ **/ -void predict_observe_sun(const predict_observer_t *observer, predict_julian_date_t time, struct predict_observation *obs); +void predict_observe_sun( const predict_observer_t * observer, + predict_julian_date_t time, + struct predict_observation * obs ); /** * Calculate right ascension of the sun. @@ -358,7 +589,7 @@ void predict_observe_sun(const predict_observer_t *observer, predict_julian_date * \param time Time of observation * \return RA in radians **/ -double predict_sun_ra(predict_julian_date_t time); +double predict_sun_ra( predict_julian_date_t time ); /** * Calculate declination of the sun. @@ -367,7 +598,7 @@ double predict_sun_ra(predict_julian_date_t time); * \param time Time of observation * \return Declination in radians **/ -double predict_sun_declination(predict_julian_date_t time); +double predict_sun_declination( predict_julian_date_t time ); /** * Calculate the greenwich hour angle (longitude) of the sun. @@ -376,10 +607,12 @@ double predict_sun_declination(predict_julian_date_t time); * \return GHA in radians * \copyright GPLv2+ **/ -double predict_sun_gha(predict_julian_date_t time); +double predict_sun_gha( predict_julian_date_t time ); -/** - * Find next acquisition of signal (AOS) of satellite (when the satellite rises above the horizon). Ignores previous AOS of current pass if the satellite is in range at the start time. +/** + * Find next acquisition of signal (AOS) of satellite (when the satellite rises + *above the horizon). Ignores previous AOS of current pass if the satellite is + *in range at the start time. * * \param observer Point of observation * \param orbital_elements Orbital elements @@ -387,10 +620,15 @@ double predict_sun_gha(predict_julian_date_t time); * \return Observation of the AOS * \copyright GPLv2+ **/ -struct predict_observation predict_next_aos(const predict_observer_t *observer, const predict_orbital_elements_t *orbital_elements, predict_julian_date_t start_time); +struct predict_observation predict_next_aos( + const predict_observer_t * observer, + const predict_orbital_elements_t * orbital_elements, + predict_julian_date_t start_time ); -/** - * Find next loss of signal (LOS) of satellite (when the satellite goes below the horizon). Finds LOS of the current pass if the satellite currently is in range, finds LOS of next pass if not. +/** + * Find next loss of signal (LOS) of satellite (when the satellite goes below + *the horizon). Finds LOS of the current pass if the satellite currently is in + *range, finds LOS of next pass if not. * * \param observer Point of observation * \param orbital_elements Orbital elements @@ -398,50 +636,65 @@ struct predict_observation predict_next_aos(const predict_observer_t *observer, * \return Observation of the LOS * \copyright GPLv2+ **/ -struct predict_observation predict_next_los(const predict_observer_t *observer, const predict_orbital_elements_t *orbital_elements, predict_julian_date_t start_time); +struct predict_observation predict_next_los( + const predict_observer_t * observer, + const predict_orbital_elements_t * orbital_elements, + predict_julian_date_t start_time ); /** * Find maximum elevation of next or current pass. * * \param observer Ground station * \param orbital_elements Orbital elements of satellite - * \param start_time Search time. If elevation is negative, max elevation is sought from the start_time and on. If elevation is positive, max elevation is searched for within the current pass - * \return Observed properties at maximum elevation + * \param start_time Search time. If elevation is negative, max elevation is + *sought from the start_time and on. If elevation is positive, max elevation is + *searched for within the current pass \return Observed properties at maximum + *elevation **/ -struct predict_observation predict_at_max_elevation(const predict_observer_t *observer, const predict_orbital_elements_t *orbital_elements, predict_julian_date_t start_time); +struct predict_observation predict_at_max_elevation( + const predict_observer_t * observer, + const predict_orbital_elements_t * orbital_elements, + predict_julian_date_t start_time ); /** - * Calculate doppler shift of a given downlink frequency with respect to an observer. + * Calculate doppler shift of a given downlink frequency with respect to an + *observer. * * \param observation Observation of a satellite orbit * \param downlink_frequency Downlink frequency of the satellite * \return The frequency difference from the original frequency * \copyright GPLv2+ **/ -double predict_doppler_shift(const struct predict_observation *observation, double downlink_frequency); +double predict_doppler_shift( const struct predict_observation * observation, + double downlink_frequency ); /** - * Calculate squint angle for satellite, i.e. angle between the satellite antenna and the QTH antenna. + * Calculate squint angle for satellite, i.e. angle between the satellite + *antenna and the QTH antenna. * * \param observer Point of observation * \param orbit Current state of satellite orbit - * \param alon Attitude longitude in radians (describes orientation of the satellite at apogee) - * \param alat Attidue latitude in radians (see above) - * \return Squint angle in radians. Will output nan if the satellite is not an SDP4 satellite - * \copyright GPLv2+ + * \param alon Attitude longitude in radians (describes orientation of the + *satellite at apogee) \param alat Attidue latitude in radians (see above) + * \return Squint angle in radians. Will output nan if the satellite is not an + *SDP4 satellite \copyright GPLv2+ **/ -double predict_squint_angle(const predict_observer_t *observer, const struct predict_position *orbit, double alon, double alat); +double predict_squint_angle( const predict_observer_t * observer, + const struct predict_position * orbit, + double alon, + double alat ); /*! * \brief Calculate refraction angle. * - * This function assumes atmospheric pressure of 101.0kPa and temperature 10deg celsius. + * This function assumes atmospheric pressure of 101.0kPa and temperature 10deg + * celsius. * * \param el True elevation angle (rad). * * \return Refraction angle (rad). */ -double predict_refraction(double el); +double predict_refraction( double el ); /*! * \brief Calculate refraction angle. @@ -454,18 +707,19 @@ double predict_refraction(double el); * * \return Refraction angle (rad). */ -double predict_refraction_ext(double el, double pressure, double temp); +double predict_refraction_ext( double el, double pressure, double temp ); /*! * \brief Calculate refraction angle from apparent elevation. * - * This function assumes atmospheric pressure of 101.0kPa and temperature 10deg celsius. + * This function assumes atmospheric pressure of 101.0kPa and temperature 10deg + * celsius. * * \param apparent_el Apparent elevation angle (rad). * * \return Refraction angle (rad). */ -double predict_refraction_from_apparent(double apparent_el); +double predict_refraction_from_apparent( double apparent_el ); /*! * \brief Calculate refraction angle from apparent elevation. @@ -478,7 +732,9 @@ double predict_refraction_from_apparent(double apparent_el); * * \return Refraction angle (rad). */ -double predict_refraction_from_apparent_ext(double apparent_el, double pressure, double temp); +double predict_refraction_from_apparent_ext( double apparent_el, + double pressure, + double temp ); /*! * \brief Calculate refraction rate of change. @@ -488,7 +744,7 @@ double predict_refraction_from_apparent_ext(double apparent_el, double pressure, * * \return Refraction rate of change (rad/s). */ -double predict_refraction_rate(double el, double el_rate); +double predict_refraction_rate( double el, double el_rate ); /*! * \brief Calculate refraction rate of change. @@ -502,7 +758,10 @@ double predict_refraction_rate(double el, double el_rate); * * \return Apparent elevation (rad). */ -double predict_refraction_rate_ext(double el, double el_rate, double pressure, double temp); +double predict_refraction_rate_ext( double el, + double el_rate, + double pressure, + double temp ); /*! * \brief Calculate apparent elevation from true elevation. @@ -511,7 +770,7 @@ double predict_refraction_rate_ext(double el, double el_rate, double pressure, d * * \return Apparent elevation (rad). */ -double predict_apparent_elevation(double el); +double predict_apparent_elevation( double el ); /*! * \brief Calculate apparent elevation from true elevation. @@ -524,7 +783,9 @@ double predict_apparent_elevation(double el); * * \return Apparent elevation (rad). */ -double predict_apparent_elevation_ext(double el, double pressure, double temp); +double predict_apparent_elevation_ext( double el, + double pressure, + double temp ); /*! * \brief Calculate apparent elevation rate. @@ -534,7 +795,7 @@ double predict_apparent_elevation_ext(double el, double pressure, double temp); * * \return Rate of change of apparent elevation (rad/s). */ -double predict_apparent_elevation_rate(double el, double el_rate); +double predict_apparent_elevation_rate( double el, double el_rate ); /*! * \brief Calculate apparent elevation rate. @@ -548,7 +809,10 @@ double predict_apparent_elevation_rate(double el, double el_rate); * * \return Rate of change of apparent elevation (rad/s). */ -double predict_apparent_elevation_rate_ext(double el, double el_rate, double pressure, double temp); +double predict_apparent_elevation_rate_ext( double el, + double el_rate, + double pressure, + double temp ); #ifdef __cplusplus } diff --git a/firmware/app/libs/libpredict/include/predict/sdp4.h b/firmware/app/libs/libpredict/include/predict/sdp4.h new file mode 100644 index 00000000..848d7c2a --- /dev/null +++ b/firmware/app/libs/libpredict/include/predict/sdp4.h @@ -0,0 +1,49 @@ +#ifndef SDP4_H_ +#define SDP4_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * Initialize SDP4 model parameters. + * + * \param orbital_elements Orbital elements + * \param m Struct to initialize + **/ +void sdp4_init( const predict_orbital_elements_t * orbital_elements, + struct predict_sdp4 * m ); + +/** + * Predict ECI position and velocity of deep-space orbit (period > 225 minutes) + *according to SDP4 model and the given orbital parameters. + * + * \param m SDP4 model parameters + * \param tsince Time since epoch of TLE in minutes + * \param output Modeled output parameters + * \copyright GPLv2+ + **/ +void sdp4_predict( const struct predict_sdp4 * m, + double tsince, + struct model_output * output ); + +/** + * Deep space perturbations. Original Deep() function. + * + * \param m SDP4 model parameters + * \param ientry Behavior flag. 1: Deep space secular effects. 2: lunar-solar + *periodics \param deep_arg Fixed deep perturbation parameters \param deep_dyn + *Output of deep space perturbations \copyright GPLv2+ + **/ +void sdp4_deep( const struct predict_sdp4 * m, + int ientry, + const deep_arg_fixed_t * deep_arg, + deep_arg_dynamic_t * deep_dyn ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/firmware/app/libs/libpredict/include/predict/sgp4.h b/firmware/app/libs/libpredict/include/predict/sgp4.h new file mode 100644 index 00000000..4f1feb2e --- /dev/null +++ b/firmware/app/libs/libpredict/include/predict/sgp4.h @@ -0,0 +1,37 @@ +#ifndef SGP4_H_ +#define SGP4_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/** + * Initialize SGP4 model parameters. + * + * \param orbital_elements Orbital elements + * \param m Struct to initialize + * \copyright GPLv2+ + **/ +void sgp4_init( const predict_orbital_elements_t * orbital_elements, + struct predict_sgp4 * m ); + +/** + * Predict ECI position and velocity of near-earth orbit (period < 225 minutes) + *according to SGP4 model and the given orbital parameters. + * + * \param m SGP4 model parameters + * \param tsince Time since epoch of TLE in minutes + * \param output Output of model + * \copyright GPLv2+ + **/ +void sgp4_predict( const struct predict_sgp4 * m, + double tsince, + struct model_output * output ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/firmware/app/libs/libpredict/include/predict/sun.h b/firmware/app/libs/libpredict/include/predict/sun.h new file mode 100644 index 00000000..c721f1bd --- /dev/null +++ b/firmware/app/libs/libpredict/include/predict/sun.h @@ -0,0 +1,14 @@ +#ifndef SUN_H_ +#define SUN_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +void sun_predict( double time, double position[ 3 ] ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/firmware/app/libs/libpredict/include/predict/unsorted.h b/firmware/app/libs/libpredict/include/predict/unsorted.h new file mode 100644 index 00000000..684864df --- /dev/null +++ b/firmware/app/libs/libpredict/include/predict/unsorted.h @@ -0,0 +1,277 @@ +#ifndef UNSORTED_H_ +#define UNSORTED_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#ifndef M_PI + #define M_PI 3.14159265358979323846 +#endif + +#define predictPRIME_ANGLE( angle ) \ + ( angle ) - 360.0 * floor( ( angle ) / 360.0 ) + +#define predictFIX_ANGLE( angle, limit ) \ + do \ + { \ + if( ( angle ) > ( limit ) ) \ + { \ + ( angle ) -= ( double ) 2 * M_PI; \ + } \ + } while( 0 ) + +#define predictDEG2RAD( x ) ( ( x ) * M_PI / 180.0 ) + +#define predictRAD2DEG( x ) ( ( x ) * 180.0 / M_PI ) + +/** + * This function reduces angles greater than two pi by subtracting two pi + * from the angle + * + * \copyright GPLv2+ + **/ +static inline double FixAngle( double x ) +{ + bool is_reduced = x < ( 2.0 * M_PI ); + double angle = x; + + while( !is_reduced ) + { + angle -= 2.0 * M_PI; + is_reduced = angle < ( 2.0 * M_PI ); + } + + return angle; +} + +/** + * Set three-element vector to specified components. + * + * \param v Output vector + * \param x x-component + * \param y y-component + * \param z z-component + **/ +void vec3_set( double v[ 3 ], double x, double y, double z ); + +/** + * Get length of vector. + * + * \param v Input vector + * \return Euclidean length + **/ +double vec3_length( const double v[ 3 ] ); + +/** + * Multiply vector by scalar. + * + * \param v Input vector. Overwritten by result + * \param a Scalar to be multiplied into vector + * \param r Resulting vector + **/ +void vec3_mul_scalar( const double v[ 3 ], double a, double r[ 3 ] ); + +/** + * Subtract a vector 2 from vector 1. + * + * \param v1 Vector 1 + * \param v2 Vector 2 + * \param r Resulting vector + **/ +void vec3_sub( const double v1[ 3 ], const double v2[ 3 ], double * r ); + +/** + * Dot product between two vectors. + * + * \param v Vector + * \param u Another vector + * \return Dot product + **/ +double vec3_dot( const double v[ 3 ], const double u[ 3 ] ); + +/** + * Geodetic position structure used by SGP4/SDP4 code. + **/ +typedef struct +{ + double lat; + double lon; + double alt; + double theta; +} geodetic_t; + +/** + * General three-dimensional vector structure used by SGP4/SDP4 code. + **/ +typedef struct +{ + double x; + double y; + double z; + double w; +} vector_t; + +/** + * This function returns a substring based on the starting + * and ending positions provided. Trims whitespaces. + * + * \param input_string Full input string + * \param buffer_length Length of output_buffer + * \param output_buffer Returned substring + * \param start Start position + * \param end End position + * \return Pointer to output_buffer + * \copyright GPLv2+ + **/ +char * SubString( const char * input_string, + int32_t buffer_length, + char * output_buffer, + int32_t start, + int32_t end ); + +/** + * Returns square of a double. + * + * \copyright GPLv2+ + **/ +double Sqr( double arg ); + +/** + * Returns mod 2PI of argument. + * + * \copyright GPLv2+ + **/ +double FMod2p( double x ); + +/* predict's old date/time management functions. */ + +/** + * Converts the satellite's position and velocity vectors from normalized values + *to km and km/sec. + * + * \copyright GPLv2+ + **/ +void Convert_Sat_State( double pos[ 3 ], double vel[ 3 ] ); + +/** + * The function Julian_Date_of_Year calculates the Julian Date of Day 0.0 of + *{year}. This function is used to calculate the Julian Date of any date by + *using Julian_Date_of_Year, DOY, and Fraction_of_Day. Astronomical Formulae for + *Calculators, Jean Meeus, pages 23-25. Calculate Julian Date of 0.0 Jan year. + * + * \copyright GPLv2+ + **/ +double Julian_Date_of_Year( double year ); + +/** + * The function Julian_Date_of_Epoch returns the Julian Date of an epoch + *specified in the format used in the NORAD two-line element sets. It has been + *modified to support dates beyond the year 1999 assuming that two-digit years + *in the range 00-56 correspond to 2000-2056. Until the two-line element set + *format is changed, it is only valid for dates through 2056 December 31. + *Modification to support Y2K. Valid 1957 through 2056. + * + * \copyright GPLv2+ + **/ +double Julian_Date_of_Epoch( double epoch ); + +/** + * Reference: The 1992 Astronomical Almanac, page B6. + * + * \copyright GPLv2+ + **/ +double ThetaG_JD( double jd ); + +/** + * Calculates the day number from m/d/y. Needed for orbit_decay. + * + * \copyright GPLv2+ + **/ +int64_t DayNum( int32_t month, int32_t day, int32_t year ); + +/** + * Procedure Calculate_LatLonAlt will calculate the geodetic position of an + *object given its ECI position pos and time. It is intended to be used to + *determine the ground track of a satellite. The calculations assume the earth + *to be an oblate spheroid as defined in WGS '72. Reference: The 1992 + *Astronomical Almanac, page K12. + * + * \copyright GPLv2+ + **/ +void Calculate_LatLonAlt( double time, + const double pos[ 3 ], + geodetic_t * geodetic ); + +/** + * The procedures Calculate_Obs and Calculate_RADec calculate + * the *topocentric* coordinates of the object with ECI position, + * {pos}, and velocity, {vel}, from location {geodetic} at {time}. + * The {obs_set} returned for Calculate_Obs consists of azimuth, + * elevation, range, and range rate (in that order) with units of + * radians, radians, kilometers, and kilometers/second, respectively. + * The WGS '72 geoid is used and the effect of atmospheric refraction + * (under standard temperature and pressure) is incorporated into the + * elevation calculation; the effect of atmospheric refraction on + * range and range rate has not yet been quantified. + * The {obs_set} for Calculate_RADec consists of right ascension and + * declination (in that order) in radians. Again, calculations are + * based on *topocentric* position using the WGS '72 geoid and + * incorporating atmospheric refraction. + * + * \copyright GPLv2+ + **/ +void Calculate_Obs( double time, + const double pos[ 3 ], + const double vel[ 3 ], + geodetic_t * geodetic, + vector_t * obs_set ); + +/** + * Reference: Methods of Orbit Determination by Pedro Ramon Escobal, pp. + *401-402 + * + * \copyright GPLv2+ + **/ +void Calculate_RADec( double time, + const double pos[ 3 ], + const double vel[ 3 ], + geodetic_t * geodetic, + vector_t * obs_set ); + +/** + * + * \copyright GPLv2+ + **/ +void Calculate_User_PosVel( double time, + geodetic_t * geodetic, + double obs_pos[ 3 ], + double obs_vel[ 3 ] ); + +/** + * Modified version of acos, where arguments above 1 or below -1 yield acos(-1 + *or +1). Used for guarding against floating point inaccuracies. + * + * \param arg Argument + * \return Arc cosine of the argument + **/ +double acos_( double arg ); + +/** + * Modified version of asin, where arguments above 1 or below -1 yield acos(-1 + *or +1). Used for guarding against floating point inaccuracies. + * + * \param arg Argument + * \return Arc sine of the argument + **/ +double asin_( double arg ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/firmware/app/libs/libpredict/src/.gitignore b/firmware/app/libs/libpredict/src/.gitignore deleted file mode 100644 index eb4414a0..00000000 --- a/firmware/app/libs/libpredict/src/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -predict.pc -libpredict.so* -libpredict.a diff --git a/firmware/app/libs/libpredict/src/Makefile b/firmware/app/libs/libpredict/src/Makefile index 16d55592..9ef28845 100644 --- a/firmware/app/libs/libpredict/src/Makefile +++ b/firmware/app/libs/libpredict/src/Makefile @@ -1,13 +1,16 @@ -ifndef BUILD_DIR - BUILD_DIR=$(CURDIR) -endif +BUILD_DIR ?= $(CURDIR) -CC=gcc -INC=../include/ -FLAGS=-fpic -std=gnu99 -Wall -pedantic -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -lm -I$(INC) +TOOLCHAIN_PREFIX ?= +CC_FLAGS_APPEND ?= + +CC := $(TOOLCHAIN_PREFIX)gcc +INC := ../include/ +FLAGS := -fpic -std=gnu99 -Wall -pedantic -Wshadow -Wpointer-arith -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -lm -I$(INC) -O3 + +FLAGS += $(CC_FLAGS_APPEND) .PHONY: all -all: $(BUILD_DIR)/julian_date.o $(BUILD_DIR)/moon.o $(BUILD_DIR)/observer.o $(BUILD_DIR)/orbit.o $(BUILD_DIR)/refraction.o $(BUILD_DIR)/sdp4.o $(BUILD_DIR)/sgp4.o $(BUILD_DIR)/sun.o $(BUILD_DIR)/unsorted.o $(BUILD_DIR)/version.o +all: $(BUILD_DIR)/julian_date.o $(BUILD_DIR)/moon.o $(BUILD_DIR)/observer.o $(BUILD_DIR)/orbit.o $(BUILD_DIR)/refraction.o $(BUILD_DIR)/sdp4.o $(BUILD_DIR)/sgp4.o $(BUILD_DIR)/sun.o $(BUILD_DIR)/unsorted.o $(BUILD_DIR)/julian_date.o: julian_date.c $(CC) $(FLAGS) -c $< -o $@ @@ -36,9 +39,6 @@ $(BUILD_DIR)/sun.o: sun.c $(BUILD_DIR)/unsorted.o: unsorted.c $(CC) $(FLAGS) -c $< -o $@ -$(BUILD_DIR)/version.o: version.c - $(CC) $(FLAGS) -c $< -o $@ - .PHONY: clean clean: rm $(BUILD_DIR)/*.o diff --git a/firmware/app/libs/libpredict/src/defs.h b/firmware/app/libs/libpredict/src/defs.h deleted file mode 100644 index fe967221..00000000 --- a/firmware/app/libs/libpredict/src/defs.h +++ /dev/null @@ -1,173 +0,0 @@ -#ifndef _PREDICT_DEFS_H_ -#define _PREDICT_DEFS_H_ - -#include - -/** \name Geosynchronous orbit definitions - * Requirements for an orbit to be called geosynchronous. - */ -///@{ -///lower mean motion for geosynchronous satellites -#define GEOSYNCHRONOUS_LOWER_MEAN_MOTION 0.9 -///upper mean motion for geosynchronous satellites -#define GEOSYNCHRONOUS_UPPER_MEAN_MOTION 1.1 -///upper eccentricity for geosynchronous satellites -#define GEOSYNCHRONOUS_ECCENTRICITY_THRESHOLD 0.2 -///upper inclination for geosynchronous satellites -#define GEOSYNCHRONOUS_INCLINATION_THRESHOLD_DEGREES 70 -///@} - -/** \name Mathematical constants - * Mathematical convenience constants used by sgp4/sdp4 and related routines. - */ -///@{ -/// pi -#define PI 3.14159265358979323846 -/// pi/2 -#define PI_HALF 1.57079632679489656 -/// 2*pi -#define TWO_PI 6.28318530717958623 -/// 3*pi/2 -#define THREE_PI_HALF 4.71238898038468967 -/// 2/3 -#define TWO_THIRD 6.6666666666666666E-1 -///@} - -/** \name Time constants - * Constants used for time conversions. - */ -///@{ -///Number of minutes per day, XMNPDA in spacetrack report #3 -#define MINUTES_PER_DAY 1.44E3 -///Number of seconds per day -#define SECONDS_PER_DAY 8.6400E4 -///Difference between libpredict's predict_julian_date_t and the julian time format used in some of the internal functions -#define JULIAN_TIME_DIFF 2444238.5 -///@} - -/** \name Physical properties - * General physical properties and definitions. - */ -///@{ -///J3 Harmonic (WGS '72), XJ3 in spacetrack report #3 -#define J3_HARMONIC_WGS72 -2.53881E-6 -///WGS 84 Earth radius km, XKMPER in spacetrack report #3 -#define EARTH_RADIUS_KM_WGS84 6.378137E3 -///Flattening factor -#define FLATTENING_FACTOR 3.35281066474748E-3 -///Earth rotations per siderial day -#define EARTH_ROTATIONS_PER_SIDERIAL_DAY 1.00273790934 -///Solar radius in kilometers (IAU 76) -#define SOLAR_RADIUS_KM 6.96000E5 -///Astronomical unit in kilometers (IAU 76) -#define ASTRONOMICAL_UNIT_KM 1.49597870691E8 -///Upper elevation threshold for nautical twilight -#define NAUTICAL_TWILIGHT_SUN_ELEVATION -12.0 -///Speed of light in vacuum -#define SPEED_OF_LIGHT 299792458.0 -///Angular velocity of Earth in radians per seconds -#define EARTH_ANGULAR_VELOCITY 7.292115E-5 -///@} - -/** \name Iteration constants - * Constants used in iteration functions like predict_max_elevation(), - * predict_next_aos() and predict_next_los(). - */ -///@{ -///Threshold used for fine-tuning of AOS/LOS -#define AOSLOS_HORIZON_THRESHOLD 0.3 -///Threshold used for comparing lower and upper brackets in find_max_elevation -#define MAXELE_TIME_EQUALITY_THRESHOLD FLT_EPSILON -///Maximum number of iterations in find_max_elevation -#define MAXELE_MAX_NUM_ITERATIONS 10000 -///@} - -/** \name General spacetrack report #3 constants - * These constants are also used outside of SGP4/SDP4 code. The - * constants/symbols are defined on page 76 to page 78 in the report. - */ -///@{ -///k_e = sqrt(Newton's universal gravitational * mass of the Earth), in units (earth radii per minutes)^3/2 -#define XKE 7.43669161E-2 -///Corresponds to 1/2 * J_2 * a_E^2. J_2 is the second gravitational zonal harmonic of Earth, a_E is the equatorial radius of Earth. -#define CK2 5.413079E-4 -///@} - -/** \name Specific spacetrack report #3 constants - * These constants are only used by SGP4/SDP4 code. The constants/symbols are - * defined on page 76 to page 78 in the report. - */ -///@{ -///Shorthand for 10^-6. -#define E6A 1.0E-6 -///Distance units / Earth radii. -#define AE 1.0 -///Corresponds to -3/8 * J_4 * a_E^4, where J_4 is the fourth gravitational zonal harmonic of Earth. -#define CK4 6.209887E-7 -///Parameter for SGP4/SGP8 density function. -#define S_DENSITY_PARAM 1.012229 -///Corresponds to (q_0 - s)^4 in units (earth radii)^4, where q_0 and s are parameters for the SGP4/SGP8 density function. -#define QOMS2T 1.880279E-09 -///@} - -/** \name Constants in deep space subroutines - * Not defined in spacetrack report #3. - * - * The constants might originally be defined in Hujsak (1979) and/or Hujsak - * and Hoots (1977), but this is unavailable on the Internet. Reiterated in F. - * R. Hoots, P. W. Schumacher and R. A. Glober, "A HISTORY OF ANALYTICAL - * ORBIT MODELING IN THE UNITED STATES SPACE SURVEILLANCE SYSTEM", 2004. Page - * numbers below refer to this article. - */ -///@{ -///Solar mean motion (n_s in units radians/minute, p. 29) -#define ZNS 1.19459E-5 -///Solar perturbation coefficient (C_s in units radians/minute, p. 29) -#define C1SS 2.9864797E-6 -///Solar eccentricity (e_s, p. 29) -#define ZES 1.675E-2 -///Lunar mean motion (n_m in units radians/minute, p. 29) -#define ZNL 1.5835218E-4 -///Lunar perturbation coefficient (C_m in units radians/minute, p. 29) -#define C1L 4.7968065E-7 -///Lunar eccentricity (e_m, p. 29) -#define ZEL 5.490E-2 -///Cosine of the solar inclination (not defined directly in the paper, but corresponds with cos(I_s) with I_s as the solar inclination on p. 29) -#define ZCOSIS 9.1744867E-1 -///Sine of the solar inclination (sin(I_s), I_s on p. 29. See comment above) -#define ZSINIS 3.9785416E-1 -///Corresponds to sin(\omega_s) (\omega_s defined on p. 29, no description. See comment above) -#define ZSINGS -9.8088458E-1 -///Corresponds to cos(\omega_s) (\omega_s defined on p. 29, no description. See comment above) -#define ZCOSGS 1.945905E-1 -///Constants for one-day resonance conditions, satellite-independent for 1-day period satellites (Initialization of resonance effects of Earth gravity, Q_22, Q_31 and Q_33, p. 31) -#define Q22 1.7891679E-6 -///See above -#define Q31 2.1460748E-6 -///See above -#define Q33 2.2123015E-7 -///Constants for secular update for resonance effects of Earth gravity (G_22, G_32, G_44, G_52 and G_54, p. 36) -#define G22 5.7686396 -///See above -#define G32 9.5240898E-1 -///See above -#define G44 1.8014998 -///See above -#define G52 1.0508330 -///See above -#define G54 4.4108898 -///Constants for 1/2-day resonance conditions, satellite-independent for 1/2-day period satellites (Initialization for resonance effects of Earth gravity, sqrt(C_ij^2 + S_ij^2) where ij = 22, 32, 44, 52 and 54, p. 32) -#define ROOT22 1.7891679E-6 -///See above -#define ROOT32 3.7393792E-7 -///See above -#define ROOT44 7.3636953E-9 -///See above -#define ROOT52 1.1428639E-7 -///See above -#define ROOT54 2.1765803E-9 -///The time-derivative of the Greenwich hour angle in radians per minute (\dot{\theta}, used on p. 36. Not directly defined in report, but values and naming are consistent with this) -#define THDT 4.3752691E-3 -///@} - -#endif diff --git a/firmware/app/libs/libpredict/src/julian_date.c b/firmware/app/libs/libpredict/src/julian_date.c index e0125b4f..9de3d54f 100644 --- a/firmware/app/libs/libpredict/src/julian_date.c +++ b/firmware/app/libs/libpredict/src/julian_date.c @@ -1,80 +1,50 @@ +/* + * This Julian Date implementation belong to philcrump's fork of libpredict, + * which is accessible in https:/\/github.com/philcrump/libpredict. + */ #include -#include -#include +#include -#include "defs.h" +#define SECONDS_IN_HOUR ( ( double ) 3600.0 ) +#define SECONDS_IN_DAY ( ( double ) 86400.0 ) +#define UNIX_EPOCH_IN_JULIAN ( ( double ) 2440587.5 ) -/** - * Create time_t in UTC from struct tm. - * - * \param timeinfo_utc Broken down time, assumed to be in UTC - * \return Time in UTC - **/ -time_t mktime_utc(const struct tm* timeinfo_utc) +predict_julian_date_t julian_from_timestamp( uint64_t timestamp ) { - time_t curr_time = time(NULL); - int timezone_diff = 0; //deviation of the current timezone from UTC in seconds - - //get UTC time, interpret resulting tm as a localtime - struct tm timeinfo_gmt; - timeinfo_gmt = *gmtime(&curr_time); - time_t time_gmt = mktime(&timeinfo_gmt); - - //get localtime, interpret resulting tm as localtime - struct tm timeinfo_local; - timeinfo_local = *localtime(&curr_time); - time_t time_local = mktime(&timeinfo_local); - - //find the time difference between the two interpretations - timezone_diff += difftime(time_local, time_gmt); - - //hack for preventing mktime from assuming localtime: add timezone difference to the input struct. - struct tm ret_timeinfo; - ret_timeinfo.tm_sec = timeinfo_utc->tm_sec + timezone_diff; - ret_timeinfo.tm_min = timeinfo_utc->tm_min; - ret_timeinfo.tm_hour = timeinfo_utc->tm_hour; - ret_timeinfo.tm_mday = timeinfo_utc->tm_mday; - ret_timeinfo.tm_mon = timeinfo_utc->tm_mon; - ret_timeinfo.tm_year = timeinfo_utc->tm_year; - ret_timeinfo.tm_isdst = timeinfo_utc->tm_isdst; - return mktime(&ret_timeinfo); + return ( ( double ) timestamp / SECONDS_IN_DAY ) + UNIX_EPOCH_IN_JULIAN; } -/** - * Helper function for getting the Julian day start date (1979-12-31 00:00 UTC) as time_t. - * - * \return Internally defined Julian start date (fixed) - **/ -time_t get_julian_start_day() +predict_julian_date_t julian_from_timestamp_ms( uint64_t timestamp_ms ) { - struct tm start_time; - start_time.tm_sec = 0; - start_time.tm_min = 0; - start_time.tm_hour = 0; - start_time.tm_mday = 31; - start_time.tm_mon = 11; - start_time.tm_year = 1979-1900; - start_time.tm_isdst = 0; - return mktime_utc(&start_time); + return ( ( double ) timestamp_ms / ( 1000 * SECONDS_IN_DAY ) ) + + UNIX_EPOCH_IN_JULIAN; } -predict_julian_date_t predict_to_julian(time_t input_time) +uint64_t timestamp_from_julian( predict_julian_date_t date ) { - //get number of seconds since 1979-12-31 00:00:00 UTC, convert to days - double seconds = difftime(input_time, get_julian_start_day()); - return seconds/SECONDS_PER_DAY; + uint64_t timestamp = 0; + double tmp; + + if( date > UNIX_EPOCH_IN_JULIAN ) + { + tmp = ( ( date - UNIX_EPOCH_IN_JULIAN ) * SECONDS_IN_DAY ); + timestamp = ( uint64_t ) tmp; + } + + return timestamp; } -time_t predict_from_julian(predict_julian_date_t date) +uint64_t timestamp_ms_from_julian( predict_julian_date_t date ) { - double seconds_since = date*SECONDS_PER_DAY; - time_t ret_time = get_julian_start_day(); - - //add number of seconds since julian start day to the julian start day, get current time_t - struct tm timeinfo; - timeinfo = *gmtime(&ret_time); - timeinfo.tm_sec += seconds_since; - ret_time = mktime_utc(&timeinfo); - return ret_time; + uint64_t timestamp = 0; + double tmp; + + if( date > UNIX_EPOCH_IN_JULIAN ) + { + tmp = ( ( date - UNIX_EPOCH_IN_JULIAN ) * ( 1000.0 * SECONDS_IN_DAY ) ); + timestamp = ( uint64_t ) tmp; + } + + return timestamp; } diff --git a/firmware/app/libs/libpredict/src/moon.c b/firmware/app/libs/libpredict/src/moon.c index b05ce597..1af577ea 100644 --- a/firmware/app/libs/libpredict/src/moon.c +++ b/firmware/app/libs/libpredict/src/moon.c @@ -1,52 +1,28 @@ -#include -#include "unsorted.h" #include #include -#include "defs.h" -#include "sun.h" - -/** - * This function reduces angles greater than two pi by subtracting two pi - * from the angle - * - * \copyright GPLv2+ - **/ -double FixAngle(double x) -{ - - while ( x > 2*M_PI ) - x-=2*M_PI; - return x; -} - -/** - * This function is used in the FindMoon() function. - * - * \copyright GPLv2+ - **/ -double PrimeAngle(double x) -{ - x=x-360.0*floor(x/360.0); - return x; -} +#include +#include +#include +#include /** * Output struct for predict_moon(). **/ -struct moon { - ///Julian day - double jd; - ///Related to ecliptic longitude - double lm; - ///Related to ecliptic latitude - double b; - ///Parallax-related - double p; - ///Related to siderial time - double teg; - ///Range approximation? - double dx; +struct moon +{ + /// Julian day + double jd; + /// Related to ecliptic longitude + double lm; + /// Related to ecliptic latitude + double b; + /// Parallax-related + double p; + /// Related to siderial time + double teg; + /// Range approximation? + double dx; }; /** @@ -56,143 +32,206 @@ struct moon { * \param moon Output struct * \copyright GPLv2+ **/ -void predict_moon(double time, struct moon *moon) +static void predict_moon( double time, struct moon * moon ) { - double jd, t, t2, t3, l1, m, teg, l, b, w1, w2, bt, p, lm, m1, d, ff, om, ss, ex; - - - jd = time + JULIAN_TIME_DIFF; - moon->jd = jd; - - t=(jd-2415020.0)/36525.0; - t2=t*t; - t3=t2*t; - l1=270.434164+481267.8831*t-0.001133*t2+0.0000019*t3; - m=358.475833+35999.0498*t-0.00015*t2-0.0000033*t3; - m1=296.104608+477198.8491*t+0.009192*t2+0.0000144*t3; - d=350.737486+445267.1142*t-0.001436*t2+0.0000019*t3; - ff=11.250889+483202.0251*t-0.003211*t2-0.0000003*t3; - om=259.183275-1934.142*t+0.002078*t2+0.0000022*t3; - om = om * M_PI/180.0; - - /* Additive terms */ - - l1=l1+0.000233*sin((51.2+20.2*t)*M_PI/180.0); - ss=0.003964*sin((346.56+132.87*t-0.0091731*t2)*M_PI/180.0); - l1=l1+ss+0.001964*sin(om); - m=m-0.001778*sin((51.2+20.2*t)*M_PI/180.0); - m1=m1+0.000817*sin((51.2+20.2*t)*M_PI/180.0); - m1=m1+ss+0.002541*sin(om); - d=d+0.002011*sin((51.2+20.2*t)*M_PI/180.0); - d=d+ss+0.001964*sin(om); - ff=ff+ss-0.024691*sin(om); - ff=ff-0.004328*sin(om+(275.05-2.3*t)*M_PI/180.0); - ex=1.0-0.002495*t-0.00000752*t2; - om=om*M_PI/180.0; - - l1=PrimeAngle(l1); - m=PrimeAngle(m); - m1=PrimeAngle(m1); - d=PrimeAngle(d); - ff=PrimeAngle(ff); - om=PrimeAngle(om); - - m=m*M_PI/180.0; - m1=m1*M_PI/180.0; - d=d*M_PI/180.0; - ff=ff*M_PI/180.0; - - /* Ecliptic Longitude */ - - l=l1+6.28875*sin(m1)+1.274018*sin(2.0*d-m1)+0.658309*sin(2.0*d); - l=l+0.213616*sin(2.0*m1)-ex*0.185596*sin(m)-0.114336*sin(2.0*ff); - l=l+0.058793*sin(2.0*d-2.0*m1)+ex*0.057212*sin(2.0*d-m-m1)+0.05332*sin(2.0*d+m1); - l=l+ex*0.045874*sin(2.0*d-m)+ex*0.041024*sin(m1-m)-0.034718*sin(d); - l=l-ex*0.030465*sin(m+m1)+0.015326*sin(2.0*d-2.0*ff)-0.012528*sin(2.0*ff+m1); - - l=l-0.01098*sin(2.0*ff-m1)+0.010674*sin(4.0*d-m1)+0.010034*sin(3.0*m1); - l=l+0.008548*sin(4.0*d-2.0*m1)-ex*0.00791*sin(m-m1+2.0*d)-ex*0.006783*sin(2.0*d+m); - - l=l+0.005162*sin(m1-d)+ex*0.005*sin(m+d)+ex*0.004049*sin(m1-m+2.0*d); - l=l+0.003996*sin(2.0*m1+2.0*d)+0.003862*sin(4.0*d)+0.003665*sin(2.0*d-3.0*m1); - - l=l+ex*0.002695*sin(2.0*m1-m)+0.002602*sin(m1-2.0*ff-2.0*d)+ex*0.002396*sin(2.0*d-m-2.0*m1); - - l=l-0.002349*sin(m1+d)+ex*ex*0.002249*sin(2.0*d-2.0*m)-ex*0.002125*sin(2.0*m1+m); - - l=l-ex*ex*0.002079*sin(2.0*m)+ex*ex*0.002059*sin(2.0*d-m1-2.0*m)-0.001773*sin(m1+2.0*d-2.0*ff); + double jd, t, t2, t3, l1, m, teg, l, b, w1, w2, bt, p, lm, m1, d, ff, om, + ss, ex; + + jd = time; + moon->jd = jd; + + t = ( jd - 2415020.0 ) / 36525.0; + t2 = t * t; + t3 = t2 * t; + l1 = 270.434164 + 481267.8831 * t - 0.001133 * t2 + 0.0000019 * t3; + m = 358.475833 + 35999.0498 * t - 0.00015 * t2 - 0.0000033 * t3; + m1 = 296.104608 + 477198.8491 * t + 0.009192 * t2 + 0.0000144 * t3; + d = 350.737486 + 445267.1142 * t - 0.001436 * t2 + 0.0000019 * t3; + ff = 11.250889 + 483202.0251 * t - 0.003211 * t2 - 0.0000003 * t3; + om = 259.183275 - 1934.142 * t + 0.002078 * t2 + 0.0000022 * t3; + om = om * M_PI / 180.0; + + /* Additive terms */ + + l1 = l1 + 0.000233 * sin( ( 51.2 + 20.2 * t ) * M_PI / 180.0 ); + ss = 0.003964 * + sin( ( 346.56 + 132.87 * t - 0.0091731 * t2 ) * M_PI / 180.0 ); + l1 = l1 + ss + 0.001964 * sin( om ); + m = m - 0.001778 * sin( ( 51.2 + 20.2 * t ) * M_PI / 180.0 ); + m1 = m1 + 0.000817 * sin( ( 51.2 + 20.2 * t ) * M_PI / 180.0 ); + m1 = m1 + ss + 0.002541 * sin( om ); + d = d + 0.002011 * sin( ( 51.2 + 20.2 * t ) * M_PI / 180.0 ); + d = d + ss + 0.001964 * sin( om ); + ff = ff + ss - 0.024691 * sin( om ); + ff = ff - 0.004328 * sin( om + ( 275.05 - 2.3 * t ) * M_PI / 180.0 ); + ex = 1.0 - 0.002495 * t - 0.00000752 * t2; + om = om * M_PI / 180.0; + + l1 = predictPRIME_ANGLE( l1 ); + m = predictPRIME_ANGLE( m ); + m1 = predictPRIME_ANGLE( m1 ); + d = predictPRIME_ANGLE( d ); + ff = predictPRIME_ANGLE( ff ); + om = predictPRIME_ANGLE( om ); + + m = m * M_PI / 180.0; + m1 = m1 * M_PI / 180.0; + d = d * M_PI / 180.0; + ff = ff * M_PI / 180.0; + + /* Ecliptic Longitude */ + + l = l1 + 6.28875 * sin( m1 ) + 1.274018 * sin( 2.0 * d - m1 ) + + 0.658309 * sin( 2.0 * d ); + l = l + 0.213616 * sin( 2.0 * m1 ) - ex * 0.185596 * sin( m ) - + 0.114336 * sin( 2.0 * ff ); + l = l + 0.058793 * sin( 2.0 * d - 2.0 * m1 ) + + ex * 0.057212 * sin( 2.0 * d - m - m1 ) + 0.05332 * sin( 2.0 * d + m1 ); + l = l + ex * 0.045874 * sin( 2.0 * d - m ) + ex * 0.041024 * sin( m1 - m ) - + 0.034718 * sin( d ); + l = l - ex * 0.030465 * sin( m + m1 ) + + 0.015326 * sin( 2.0 * d - 2.0 * ff ) - 0.012528 * sin( 2.0 * ff + m1 ); + + l = l - 0.01098 * sin( 2.0 * ff - m1 ) + 0.010674 * sin( 4.0 * d - m1 ) + + 0.010034 * sin( 3.0 * m1 ); + l = l + 0.008548 * sin( 4.0 * d - 2.0 * m1 ) - + ex * 0.00791 * sin( m - m1 + 2.0 * d ) - + ex * 0.006783 * sin( 2.0 * d + m ); + + l = l + 0.005162 * sin( m1 - d ) + ex * 0.005 * sin( m + d ) + + ex * 0.004049 * sin( m1 - m + 2.0 * d ); + l = l + 0.003996 * sin( 2.0 * m1 + 2.0 * d ) + 0.003862 * sin( 4.0 * d ) + + 0.003665 * sin( 2.0 * d - 3.0 * m1 ); + + l = l + ex * 0.002695 * sin( 2.0 * m1 - m ) + + 0.002602 * sin( m1 - 2.0 * ff - 2.0 * d ) + + ex * 0.002396 * sin( 2.0 * d - m - 2.0 * m1 ); + + l = l - 0.002349 * sin( m1 + d ) + + ex * ex * 0.002249 * sin( 2.0 * d - 2.0 * m ) - + ex * 0.002125 * sin( 2.0 * m1 + m ); + + l = l - ex * ex * 0.002079 * sin( 2.0 * m ) + + ex * ex * 0.002059 * sin( 2.0 * d - m1 - 2.0 * m ) - + 0.001773 * sin( m1 + 2.0 * d - 2.0 * ff ); + + l = l + ex * 0.00122 * sin( 4.0 * d - m - m1 ) - + 0.00111 * sin( 2.0 * m1 + 2.0 * ff ) + 0.000892 * sin( m1 - 3.0 * d ); + + l = l - ex * 0.000811 * sin( m + m1 + 2.0 * d ) + + ex * 0.000761 * sin( 4.0 * d - m - 2.0 * m1 ) + + ex * ex * .000717 * sin( m1 - 2.0 * m ); + + l = l + ex * ex * 0.000704 * sin( m1 - 2.0 * m - 2.0 * d ) + + ex * 0.000693 * sin( m - 2.0 * m1 + 2.0 * d ) + + ex * 0.000598 * sin( 2.0 * d - m - 2.0 * ff ) + + 0.00055 * sin( m1 + 4.0 * d ); + + l = l + 0.000538 * sin( 4.0 * m1 ) + ex * 0.000521 * sin( 4.0 * d - m ) + + 0.000486 * sin( 2.0 * m1 - d ); + + l = l - 0.001595 * sin( 2.0 * ff + 2.0 * d ); + + /* Ecliptic latitude */ + + b = 5.128189 * sin( ff ) + 0.280606 * sin( m1 + ff ) + + 0.277693 * sin( m1 - ff ) + 0.173238 * sin( 2.0 * d - ff ); + b = b + 0.055413 * sin( 2.0 * d + ff - m1 ) + + 0.046272 * sin( 2.0 * d - ff - m1 ) + 0.032573 * sin( 2.0 * d + ff ); + + b = b + 0.017198 * sin( 2.0 * m1 + ff ) + + 9.266999e-03 * sin( 2.0 * d + m1 - ff ) + + 0.008823 * sin( 2.0 * m1 - ff ); + b = b + ex * 0.008247 * sin( 2.0 * d - m - ff ) + + 0.004323 * sin( 2.0 * d - ff - 2.0 * m1 ) + + 0.0042 * sin( 2.0 * d + ff + m1 ); + + b = b + ex * 0.003372 * sin( ff - m - 2.0 * d ) + + ex * 0.002472 * sin( 2.0 * d + ff - m - m1 ) + + ex * 0.002222 * sin( 2.0 * d + ff - m ); + + b = b + 0.002072 * sin( 2.0 * d - ff - m - m1 ) + + ex * 0.001877 * sin( ff - m + m1 ) + + 0.001828 * sin( 4.0 * d - ff - m1 ); + + b = b - ex * 0.001803 * sin( ff + m ) - 0.00175 * sin( 3.0 * ff ) + + ex * 0.00157 * sin( m1 - m - ff ) - 0.001487 * sin( ff + d ) - + ex * 0.001481 * sin( ff + m + m1 ) + + ex * 0.001417 * sin( ff - m - m1 ) + ex * 0.00135 * sin( ff - m ) + + 0.00133 * sin( ff - d ); + + b = b + 0.001106 * sin( ff + 3.0 * m1 ) + 0.00102 * sin( 4.0 * d - ff ) + + 0.000833 * sin( ff + 4.0 * d - m1 ); + + b = b + 0.000781 * sin( m1 - 3.0 * ff ) + + 0.00067 * sin( ff + 4.0 * d - 2.0 * m1 ) + + 0.000606 * sin( 2.0 * d - 3.0 * ff ); + + b = b + 0.000597 * sin( 2.0 * d + 2.0 * m1 - ff ) + + ex * 0.000492 * sin( 2.0 * d + m1 - m - ff ) + + 0.00045 * sin( 2.0 * m1 - ff - 2.0 * d ); + + b = b + 0.000439 * sin( 3.0 * m1 - ff ) + + 0.000423 * sin( ff + 2.0 * d + 2.0 * m1 ) + + 0.000422 * sin( 2.0 * d - ff - 3.0 * m1 ); + + b = b - ex * 0.000367 * sin( m + ff + 2.0 * d - m1 ) - + ex * 0.000353 * sin( m + ff + 2.0 * d ) + + 0.000331 * sin( ff + 4.0 * d ); + + b = b + ex * 0.000317 * sin( 2.0 * d + ff - m + m1 ) + + ex * ex * 0.000306 * sin( 2.0 * d - 2.0 * m - ff ) - + 0.000283 * sin( m1 + 3.0 * ff ); + + w1 = 0.0004664 * cos( om * M_PI / 180.0 ); + w2 = 0.0000754 * cos( ( om + 275.05 - 2.3 * t ) * M_PI / 180.0 ); + bt = b * ( 1.0 - w1 - w2 ); + + /* Parallax calculations */ + + p = 0.950724 + 0.051818 * cos( m1 ) + 0.009531 * cos( 2.0 * d - m1 ) + + 0.007843 * cos( 2.0 * d ) + 0.002824 * cos( 2.0 * m1 ) + + 0.000857 * cos( 2.0 * d + m1 ) + ex * 0.000533 * cos( 2.0 * d - m ) + + ex * 0.000401 * cos( 2.0 * d - m - m1 ); - l=l+ex*0.00122*sin(4.0*d-m-m1)-0.00111*sin(2.0*m1+2.0*ff)+0.000892*sin(m1-3.0*d); + p = p + 0.000173 * cos( 3.0 * m1 ) + 0.000167 * cos( 4.0 * d - m1 ) - + ex * 0.000111 * cos( m ) + 0.000103 * cos( 4.0 * d - 2.0 * m1 ) - + 0.000084 * cos( 2.0 * m1 - 2.0 * d ) - + ex * 0.000083 * cos( 2.0 * d + m ) + + 0.000079 * cos( 2.0 * d + 2.0 * m1 ); - l=l-ex*0.000811*sin(m+m1+2.0*d)+ex*0.000761*sin(4.0*d-m-2.0*m1)+ex*ex*.000717*sin(m1-2.0*m); + p = p + 0.000072 * cos( 4.0 * d ) + + ex * 0.000064 * cos( 2.0 * d - m + m1 ) - + ex * 0.000063 * cos( 2.0 * d + m - m1 ); - l=l+ex*ex*0.000704*sin(m1-2.0*m-2.0*d)+ex*0.000693*sin(m-2.0*m1+2.0*d)+ex*0.000598*sin(2.0*d-m-2.0*ff)+0.00055*sin(m1+4.0*d); + p = p + ex * 0.000041 * cos( m + d ) + ex * 0.000035 * cos( 2.0 * m1 - m ) - + 0.000033 * cos( 3.0 * m1 - 2.0 * d ); - l=l+0.000538*sin(4.0*m1)+ex*0.000521*sin(4.0*d-m)+0.000486*sin(2.0*m1-d); + p = p - 0.00003 * cos( m1 + d ) - 0.000029 * cos( 2.0 * ff - 2.0 * d ) - + ex * 0.000029 * cos( 2.0 * m1 + m ); - l=l-0.001595*sin(2.0*ff+2.0*d); + p = p + ex * ex * 0.000026 * cos( 2.0 * d - 2.0 * m ) - + 0.000023 * cos( 2.0 * ff - 2.0 * d + m1 ) + + ex * 0.000019 * cos( 4.0 * d - m - m1 ); - /* Ecliptic latitude */ + b = bt * M_PI / 180.0; + lm = l * M_PI / 180.0; - b=5.128189*sin(ff)+0.280606*sin(m1+ff)+0.277693*sin(m1-ff)+0.173238*sin(2.0*d-ff); - b=b+0.055413*sin(2.0*d+ff-m1)+0.046272*sin(2.0*d-ff-m1)+0.032573*sin(2.0*d+ff); + /* Find siderial time in radians */ - b=b+0.017198*sin(2.0*m1+ff)+9.266999e-03*sin(2.0*d+m1-ff)+0.008823*sin(2.0*m1-ff); - b=b+ex*0.008247*sin(2.0*d-m-ff)+0.004323*sin(2.0*d-ff-2.0*m1)+0.0042*sin(2.0*d+ff+m1); + t = ( jd - 2451545.0 ) / 36525.0; + teg = 280.46061837 + 360.98564736629 * ( jd - 2451545.0 ) + + ( 0.000387933 * t - t * t / 38710000.0 ) * t; - b=b+ex*0.003372*sin(ff-m-2.0*d)+ex*0.002472*sin(2.0*d+ff-m-m1)+ex*0.002222*sin(2.0*d+ff-m); + while( teg > 360.0 ) + teg -= 360.0; - b=b+0.002072*sin(2.0*d-ff-m-m1)+ex*0.001877*sin(ff-m+m1)+0.001828*sin(4.0*d-ff-m1); - - b=b-ex*0.001803*sin(ff+m)-0.00175*sin(3.0*ff)+ex*0.00157*sin(m1-m-ff)-0.001487*sin(ff+d)-ex*0.001481*sin(ff+m+m1)+ex*0.001417*sin(ff-m-m1)+ex*0.00135*sin(ff-m)+0.00133*sin(ff-d); - - b=b+0.001106*sin(ff+3.0*m1)+0.00102*sin(4.0*d-ff)+0.000833*sin(ff+4.0*d-m1); - - b=b+0.000781*sin(m1-3.0*ff)+0.00067*sin(ff+4.0*d-2.0*m1)+0.000606*sin(2.0*d-3.0*ff); - - b=b+0.000597*sin(2.0*d+2.0*m1-ff)+ex*0.000492*sin(2.0*d+m1-m-ff)+0.00045*sin(2.0*m1-ff-2.0*d); - - b=b+0.000439*sin(3.0*m1-ff)+0.000423*sin(ff+2.0*d+2.0*m1)+0.000422*sin(2.0*d-ff-3.0*m1); - - b=b-ex*0.000367*sin(m+ff+2.0*d-m1)-ex*0.000353*sin(m+ff+2.0*d)+0.000331*sin(ff+4.0*d); - - b=b+ex*0.000317*sin(2.0*d+ff-m+m1)+ex*ex*0.000306*sin(2.0*d-2.0*m-ff)-0.000283*sin(m1+3.0*ff); - - w1=0.0004664*cos(om*M_PI/180.0); - w2=0.0000754*cos((om+275.05-2.3*t)*M_PI/180.0); - bt=b*(1.0-w1-w2); - - /* Parallax calculations */ - - p=0.950724+0.051818*cos(m1)+0.009531*cos(2.0*d-m1)+0.007843*cos(2.0*d)+0.002824*cos(2.0*m1)+0.000857*cos(2.0*d+m1)+ex*0.000533*cos(2.0*d-m)+ex*0.000401*cos(2.0*d-m-m1); - - p=p+0.000173*cos(3.0*m1)+0.000167*cos(4.0*d-m1)-ex*0.000111*cos(m)+0.000103*cos(4.0*d-2.0*m1)-0.000084*cos(2.0*m1-2.0*d)-ex*0.000083*cos(2.0*d+m)+0.000079*cos(2.0*d+2.0*m1); - - p=p+0.000072*cos(4.0*d)+ex*0.000064*cos(2.0*d-m+m1)-ex*0.000063*cos(2.0*d+m-m1); - - p=p+ex*0.000041*cos(m+d)+ex*0.000035*cos(2.0*m1-m)-0.000033*cos(3.0*m1-2.0*d); - - p=p-0.00003*cos(m1+d)-0.000029*cos(2.0*ff-2.0*d)-ex*0.000029*cos(2.0*m1+m); - - p=p+ex*ex*0.000026*cos(2.0*d-2.0*m)-0.000023*cos(2.0*ff-2.0*d+m1)+ex*0.000019*cos(4.0*d-m-m1); - - b=bt*M_PI/180.0; - lm=l*M_PI/180.0; - - /* Find siderial time in radians */ - - t=(jd-2451545.0)/36525.0; - teg=280.46061837+360.98564736629*(jd-2451545.0)+(0.000387933*t-t*t/38710000.0)*t; - - while (teg>360.0) - teg-=360.0; - - //output - moon->b = b; - moon->lm = lm; - moon->p = p; - moon->dx = 3.0/(M_PI*p); - moon->teg = teg; + // output + moon->b = b; + moon->lm = lm; + moon->p = p; + moon->dx = 3.0 / ( M_PI * p ); + moon->teg = teg; } /** @@ -203,86 +242,95 @@ void predict_moon(double time, struct moon *moon) * \param dec Declination * \copyright GPLv2+ **/ -void predict_moon_ra_dec(predict_julian_date_t time, double *ra, double *dec) +static void predict_moon_ra_dec( predict_julian_date_t time, + double * ra, + double * dec ) { - struct moon moon; - predict_moon(time, &moon); - - /* Semi-diameter calculation */ - /* sem=10800.0*asin(0.272488*p*M_PI/180.0)/pi; */ - /* Convert ecliptic coordinates to equatorial coordinates */ - - double z=(moon.jd-2415020.5)/365.2422; - double ob=23.452294-(0.46845*z+5.9e-07*z*z)/3600.0; - ob=ob*M_PI/180.0; - *dec=asin(sin(moon.b)*cos(ob)+cos(moon.b)*sin(ob)*sin(moon.lm)); - *ra=acos(cos(moon.b)*cos(moon.lm)/cos(*dec)); - - if (moon.lm > M_PI) - *ra = 2*M_PI - *ra; + struct moon moon; + predict_moon( time, &moon ); + + /* Semi-diameter calculation */ + /* sem=10800.0*asin(0.272488*p*M_PI/180.0)/pi; */ + /* Convert ecliptic coordinates to equatorial coordinates */ + + double z = ( moon.jd - 2415020.5 ) / 365.2422; + double ob = 23.452294 - ( 0.46845 * z + 5.9e-07 * z * z ) / 3600.0; + ob = ob * M_PI / 180.0; + *dec = asin( sin( moon.b ) * cos( ob ) + + cos( moon.b ) * sin( ob ) * sin( moon.lm ) ); + *ra = acos( cos( moon.b ) * cos( moon.lm ) / cos( *dec ) ); + + if( moon.lm > M_PI ) + *ra = 2 * M_PI - *ra; } -void predict_observe_moon(const predict_observer_t *observer, double time, struct predict_observation *obs) +void predict_observe_moon( const predict_observer_t * observer, + double time, + struct predict_observation * obs ) { - struct moon moon; - predict_moon(time, &moon); - - double ra, dec; - predict_moon_ra_dec(time, &ra, &dec); - - double n = observer->latitude; /* North latitude of tracking station */ - double e = observer->longitude; /* East longitude of tracking station */ - - - double th = FixAngle(moon.teg*M_PI/180.0 + e); - double h=th-ra; - - double az=atan2(sin(h),cos(h)*sin(n)-tan(dec)*cos(n))+M_PI; - double el=asin(sin(n)*sin(dec)+cos(n)*cos(dec)*cos(h)); - - /* Radial velocity approximation. This code was derived - from "Amateur Radio Software", by John Morris, GM4ANB, - published by the RSGB in 1985. */ - - double mm=FixAngle(1.319238+time*0.228027135); /* mean moon position */ - double t2=0.10976; - double t1=mm+t2*sin(mm); - double dv=0.01255*moon.dx*moon.dx*sin(t1)*(1.0+t2*cos(mm)); - dv=dv*4449.0; - t1=6378.0; - t2=384401.0; - double t3=t1*t2*(cos(dec)*cos(n)*sin(h)); - t3=t3/sqrt(t2*t2-t2*t1*sin(el)); - - double moon_dv=dv+t3*0.0753125; - - obs->time = time; - obs->azimuth = az; - obs->elevation = el; - obs->range = moon.dx; - obs->range_rate = moon_dv; + struct moon moon; + predict_moon( time, &moon ); + + double ra, dec; + predict_moon_ra_dec( time, &ra, &dec ); + + double n = observer->latitude; /* North latitude of tracking station */ + double e = observer->longitude; /* East longitude of tracking station */ + + double th = FixAngle( moon.teg * M_PI / 180.0 + e ); + double h = th - ra; + + double az = atan2( sin( h ), cos( h ) * sin( n ) - tan( dec ) * cos( n ) ) + + M_PI; + double el = asin( sin( n ) * sin( dec ) + + cos( n ) * cos( dec ) * cos( h ) ); + + /* Radial velocity approximation. This code was derived + from "Amateur Radio Software", by John Morris, GM4ANB, + published by the RSGB in 1985. */ + + double mm = FixAngle( 1.319238 + time * 0.228027135 ); /* mean moon position + */ + double t2 = 0.10976; + double t1 = mm + t2 * sin( mm ); + double dv = 0.01255 * moon.dx * moon.dx * sin( t1 ) * + ( 1.0 + t2 * cos( mm ) ); + dv = dv * 4449.0; + t1 = 6378.0; + t2 = 384401.0; + double t3 = t1 * t2 * ( cos( dec ) * cos( n ) * sin( h ) ); + t3 = t3 / sqrt( t2 * t2 - t2 * t1 * sin( el ) ); + + double moon_dv = dv + t3 * 0.0753125; + + obs->time = time; + obs->azimuth = az; + obs->elevation = el; + obs->range = moon.dx; + obs->range_rate = moon_dv; } -double predict_moon_ra(predict_julian_date_t time) +double predict_moon_ra( predict_julian_date_t time ) { - double ra, dec; - predict_moon_ra_dec(time, &ra, &dec); - return ra; + double ra, dec; + predict_moon_ra_dec( time, &ra, &dec ); + return ra; } -double predict_moon_declination(predict_julian_date_t time) +double predict_moon_declination( predict_julian_date_t time ) { - double ra, dec; - predict_moon_ra_dec(time, &ra, &dec); - return dec; + double ra, dec; + predict_moon_ra_dec( time, &ra, &dec ); + return dec; } -double predict_moon_gha(predict_julian_date_t time) +double predict_moon_gha( predict_julian_date_t time ) { - struct moon moon; - predict_moon(time, &moon); - double moon_gha=moon.teg-predict_moon_ra(time)*180.0/M_PI; + struct moon moon; + predict_moon( time, &moon ); + double moon_gha = moon.teg - predict_moon_ra( time ) * 180.0 / M_PI; - if (moon_gha<0.0) moon_gha+=360; - return moon_gha*M_PI/180.0; + if( moon_gha < 0.0 ) + moon_gha += 360; + return moon_gha * M_PI / 180.0; } diff --git a/firmware/app/libs/libpredict/src/observer.c b/firmware/app/libs/libpredict/src/observer.c index 79c87f98..2e0616a3 100644 --- a/firmware/app/libs/libpredict/src/observer.c +++ b/firmware/app/libs/libpredict/src/observer.c @@ -1,202 +1,254 @@ -#include -#include "unsorted.h" #include #include -#include "defs.h" -#include "sun.h" - -/* Static Allocated observer */ -static predict_observer_t observer; -void observer_calculate(const predict_observer_t *observer, double time, const double pos[3], const double vel[3], struct predict_observation *result); - -predict_observer_t *predict_create_observer(const char *name, double lat, double lon, double alt) -{ - predict_observer_t *obs = &observer; - - strncpy(obs->name, name, 128); - obs->name[127] = '\0'; - obs->latitude = lat; - obs->longitude = lon; - obs->altitude = alt; - - return obs; -} - -void predict_destroy_observer(predict_observer_t *obs) +#include +#include +#include +#include + +void observer_calculate( const predict_observer_t * observer, + double time, + const double pos[ 3 ], + const double vel[ 3 ], + struct predict_observation * result ); + +predict_observer_t * predict_create_observer( predict_observer_t * observer, + const char * name, + double lat, + double lon, + double alt ) { - if (obs == &observer) { - memset((void*)obs, 0, sizeof(predict_observer_t)); - } + predict_observer_t * obs = observer; + + if( obs != NULL ) + { + strncpy( obs->name, name, 128 ); + obs->name[ 127 ] = '\0'; + obs->latitude = lat; + obs->longitude = lon; + obs->altitude = alt; + } + + return obs; } - /** * \brief Calculates range, azimuth, elevation and relative velocity. * * Calculated range, azimuth, elevation and relative velocity from the * given observer position. **/ -void predict_observe_orbit(const predict_observer_t *observer, const struct predict_position *orbit, struct predict_observation *obs) +void predict_observe_orbit( const predict_observer_t * observer, + const struct predict_position * orbit, + struct predict_observation * obs ) { - if (obs == NULL) return; - - double julTime = orbit->time + JULIAN_TIME_DIFF; - - observer_calculate(observer, julTime, orbit->position, orbit->velocity, obs); - - // Calculate visibility status of the orbit: Orbit is visible if sun elevation is low enough and the orbit is above the horizon, but still in sunlight. - obs->visible = false; - struct predict_observation sun_obs; - predict_observe_sun(observer, orbit->time, &sun_obs); - if (!(orbit->eclipsed) && (sun_obs.elevation*180.0/M_PI < NAUTICAL_TWILIGHT_SUN_ELEVATION) && (obs->elevation*180.0/M_PI > 0)) { - obs->visible = true; - } - obs->time = orbit->time; + if( obs == NULL ) + return; + + double julTime = orbit->time; + + observer_calculate( observer, + julTime, + orbit->position, + orbit->velocity, + obs ); + + // Calculate visibility status of the orbit: Orbit is visible if sun + // elevation is low enough and the orbit is above the horizon, but still in + // sunlight. + obs->visible = false; + struct predict_observation sun_obs; + predict_observe_sun( observer, orbit->time, &sun_obs ); + if( !( orbit->eclipsed ) && + ( sun_obs.elevation * 180.0 / M_PI < + NAUTICAL_TWILIGHT_SUN_ELEVATION ) && + ( obs->elevation * 180.0 / M_PI > 0 ) ) + { + obs->visible = true; + } + obs->time = orbit->time; } -void observer_calculate(const predict_observer_t *observer, double time, const double pos[3], const double vel[3], struct predict_observation *result) +void observer_calculate( const predict_observer_t * observer, + double time, + const double pos[ 3 ], + const double vel[ 3 ], + struct predict_observation * result ) { - - /* The procedures Calculate_Obs and Calculate_RADec calculate */ - /* the *topocentric* coordinates of the object with ECI position, */ - /* {pos}, and velocity, {vel}, from location {geodetic} at {time}. */ - /* The {obs_set} returned for Calculate_Obs consists of azimuth, */ - /* elevation, range, and range rate (in that order) with units of */ - /* radians, radians, kilometers, and kilometers/second, respectively. */ - /* The WGS '72 geoid is used and the effect of atmospheric refraction */ - /* (under standard temperature and pressure) is incorporated into the */ - /* elevation calculation; the effect of atmospheric refraction on */ - /* range and range rate has not yet been quantified. */ - - /* The {obs_set} for Calculate_RADec consists of right ascension and */ - /* declination (in that order) in radians. Again, calculations are */ - /* based on *topocentric* position using the WGS '72 geoid and */ - /* incorporating atmospheric refraction. */ - - - double obs_pos[3]; - double obs_vel[3]; - double range[3]; - double rgvel[3]; - - geodetic_t geodetic; - geodetic.lat = observer->latitude; - geodetic.lon = observer->longitude; - geodetic.alt = observer->altitude / 1000.0; - geodetic.theta = 0.0; - Calculate_User_PosVel(time, &geodetic, obs_pos, obs_vel); - - vec3_sub(pos, obs_pos, range); - vec3_sub(vel, obs_vel, rgvel); - - double range_length = vec3_length(range); - double range_rate_length = vec3_dot(range, rgvel) / range_length; - - double theta_dot = 2*M_PI*EARTH_ROTATIONS_PER_SIDERIAL_DAY/SECONDS_PER_DAY; - double sin_lat = sin(geodetic.lat); - double cos_lat = cos(geodetic.lat); - double sin_theta = sin(geodetic.theta); - double cos_theta = cos(geodetic.theta); - - double top_s = sin_lat*cos_theta*range[0] + sin_lat*sin_theta*range[1] - cos_lat*range[2]; - double top_e = -sin_theta*range[0] + cos_theta*range[1]; - double top_z = cos_lat*cos_theta*range[0] + cos_lat*sin_theta*range[1] + sin_lat*range[2]; - - - double top_s_dot = sin_lat*(cos_theta*rgvel[0] - sin_theta*range[0]*theta_dot) + - sin_lat*(sin_theta*rgvel[1] + cos_theta*range[1]*theta_dot) - - cos_lat*rgvel[2]; - double top_e_dot = - (sin_theta*rgvel[0] + cos_theta*range[0]*theta_dot) + - (cos_theta*rgvel[1] - sin_theta*range[1]*theta_dot); - - double top_z_dot = cos_lat * ( cos_theta*(rgvel[0] + range[1]*theta_dot) + - sin_theta*(rgvel[1] - range[0]*theta_dot) ) + - sin_lat*rgvel[2]; - - // Azimut - double y = -top_e / top_s; - double az = atan(-top_e / top_s); - - if (top_s > 0.0) az = az + M_PI; - if (az < 0.0) az = az + 2*M_PI; - - // Azimut rate - double y_dot = - (top_e_dot*top_s - top_s_dot*top_e) / (top_s*top_s); - double az_dot = y_dot / (1 + y*y); - - // Elevation - double x = top_z / range_length; - double el = asin_(x); - - // Elevation rate - double x_dot = (top_z_dot*range_length - range_rate_length*top_z) / (range_length * range_length); - double el_dot = x_dot / sqrt( 1 - x*x ); - - result->azimuth = az; - result->azimuth_rate = az_dot; - result->elevation = el; - result->elevation_rate = el_dot; - result->range = range_length; - result->range_rate = range_rate_length; - result->range_x = range[0]; - result->range_y = range[1]; - result->range_z = range[2]; - + /* The procedures Calculate_Obs and Calculate_RADec calculate */ + /* the *topocentric* coordinates of the object with ECI position, */ + /* {pos}, and velocity, {vel}, from location {geodetic} at {time}. */ + /* The {obs_set} returned for Calculate_Obs consists of azimuth, */ + /* elevation, range, and range rate (in that order) with units of */ + /* radians, radians, kilometers, and kilometers/second, respectively. */ + /* The WGS '72 geoid is used and the effect of atmospheric refraction */ + /* (under standard temperature and pressure) is incorporated into the */ + /* elevation calculation; the effect of atmospheric refraction on */ + /* range and range rate has not yet been quantified. */ + + /* The {obs_set} for Calculate_RADec consists of right ascension and */ + /* declination (in that order) in radians. Again, calculations are */ + /* based on *topocentric* position using the WGS '72 geoid and */ + /* incorporating atmospheric refraction. */ + + double obs_pos[ 3 ]; + double obs_vel[ 3 ]; + double range[ 3 ]; + double rgvel[ 3 ]; + + geodetic_t geodetic; + geodetic.lat = observer->latitude; + geodetic.lon = observer->longitude; + geodetic.alt = observer->altitude / 1000.0; + geodetic.theta = 0.0; + Calculate_User_PosVel( time, &geodetic, obs_pos, obs_vel ); + + vec3_sub( pos, obs_pos, range ); + vec3_sub( vel, obs_vel, rgvel ); + + double range_length = vec3_length( range ); + double range_rate_length = vec3_dot( range, rgvel ) / range_length; + + double theta_dot = 2 * M_PI * EARTH_ROTATIONS_PER_SIDERIAL_DAY / + SECONDS_PER_DAY; + double sin_lat = sin( geodetic.lat ); + double cos_lat = cos( geodetic.lat ); + double sin_theta = sin( geodetic.theta ); + double cos_theta = cos( geodetic.theta ); + + double top_s = sin_lat * cos_theta * range[ 0 ] + + sin_lat * sin_theta * range[ 1 ] - cos_lat * range[ 2 ]; + double top_e = -sin_theta * range[ 0 ] + cos_theta * range[ 1 ]; + double top_z = cos_lat * cos_theta * range[ 0 ] + + cos_lat * sin_theta * range[ 1 ] + sin_lat * range[ 2 ]; + + double top_s_dot = sin_lat * ( cos_theta * rgvel[ 0 ] - + sin_theta * range[ 0 ] * theta_dot ) + + sin_lat * ( sin_theta * rgvel[ 1 ] + + cos_theta * range[ 1 ] * theta_dot ) - + cos_lat * rgvel[ 2 ]; + double top_e_dot = -( sin_theta * rgvel[ 0 ] + + cos_theta * range[ 0 ] * theta_dot ) + + ( cos_theta * rgvel[ 1 ] - + sin_theta * range[ 1 ] * theta_dot ); + + double top_z_dot = cos_lat * ( cos_theta * + ( rgvel[ 0 ] + range[ 1 ] * theta_dot ) + + sin_theta * ( rgvel[ 1 ] - + range[ 0 ] * theta_dot ) ) + + sin_lat * rgvel[ 2 ]; + + // Azimut + double y = -top_e / top_s; + double az = atan( -top_e / top_s ); + + if( top_s > 0.0 ) + az = az + M_PI; + if( az < 0.0 ) + az = az + 2 * M_PI; + + // Azimut rate + double y_dot = -( top_e_dot * top_s - top_s_dot * top_e ) / + ( top_s * top_s ); + double az_dot = y_dot / ( 1 + y * y ); + + // Elevation + double x = top_z / range_length; + double el = asin_( x ); + + // Elevation rate + double x_dot = ( top_z_dot * range_length - range_rate_length * top_z ) / + ( range_length * range_length ); + double el_dot = x_dot / sqrt( 1 - x * x ); + + result->azimuth = az; + result->azimuth_rate = az_dot; + result->elevation = el; + result->elevation_rate = el_dot; + result->range = range_length; + result->range_rate = range_rate_length; + result->range_x = range[ 0 ]; + result->range_y = range[ 1 ]; + result->range_z = range[ 2 ]; } -struct predict_observation predict_next_aos(const predict_observer_t *observer, const predict_orbital_elements_t *orbital_elements, double start_utc) +struct predict_observation predict_next_aos( + const predict_observer_t * observer, + const predict_orbital_elements_t * orbital_elements, + double start_utc ) { - double curr_time = start_utc; - struct predict_observation obs; - double time_step = 0; - - struct predict_position orbit; - predict_orbit(orbital_elements, &orbit, curr_time); - predict_observe_orbit(observer, &orbit, &obs); - - //check whether AOS can happen after specified start time - if (predict_aos_happens(orbital_elements, observer->latitude) && !predict_is_geosynchronous(orbital_elements) && !orbit.decayed) { - //TODO: Time steps have been found in FindAOS/LOS(). - //Might be based on some pre-existing source, root-finding techniques - //or something. Find them, and improve readability of the code and so that - //the mathematical stability of the iteration can be checked. - //Bisection method, Brent's algorithm? Given a coherent root finding algorithm, - //can rather have one function for iterating the orbit and then let get_next_aos/los - //specify bounding intervals for the root finding. - - //skip the rest of the pass if the satellite is currently in range, since we want the _next_ AOS. - if (obs.elevation > 0.0) { - struct predict_observation los = predict_next_los(observer, orbital_elements, curr_time); - curr_time = los.time; - curr_time += 1.0/(MINUTES_PER_DAY*1.0)*20; //skip 20 minutes. LOS might still be within the elevation threshold. (rough quickfix from predict) - predict_orbit(orbital_elements, &orbit, curr_time); - predict_observe_orbit(observer, &orbit, &obs); - } - - //iteration until the orbit is roughly in range again, before the satellite pass - while ((obs.elevation*180.0/M_PI < -1.0) || (obs.elevation_rate < 0)) { - time_step = 0.00035*(obs.elevation*180.0/M_PI*((orbit.altitude/8400.0)+0.46)-2.0); - curr_time -= time_step; - predict_orbit(orbital_elements, &orbit, curr_time); - predict_observe_orbit(observer, &orbit, &obs); - } - - //fine tune the results until the elevation is within a low enough threshold - while (fabs(obs.elevation*180/M_PI) > AOSLOS_HORIZON_THRESHOLD) { - time_step = obs.elevation*180.0/M_PI*sqrt(orbit.altitude)/530000.0; - curr_time -= time_step; - predict_orbit(orbital_elements, &orbit, curr_time); - predict_observe_orbit(observer, &orbit, &obs); - } - } - return obs; + double curr_time = start_utc; + struct predict_observation obs; + double time_step = 0; + + struct predict_position orbit; + predict_orbit( orbital_elements, &orbit, curr_time ); + predict_observe_orbit( observer, &orbit, &obs ); + + // check whether AOS can happen after specified start time + if( predict_aos_happens( orbital_elements, observer->latitude ) && + !predict_is_geosynchronous( orbital_elements ) && !orbit.decayed ) + { + // TODO: Time steps have been found in FindAOS/LOS(). + // Might be based on some pre-existing source, root-finding techniques + // or something. Find them, and improve readability of the code and so + // that the mathematical stability of the iteration can be checked. + // Bisection method, Brent's algorithm? Given a coherent root finding + // algorithm, can rather have one function for iterating the orbit and + // then let get_next_aos/los specify bounding intervals for the root + // finding. + + // skip the rest of the pass if the satellite is currently in range, + // since we want the _next_ AOS. + if( obs.elevation > 0.0 ) + { + struct predict_observation los = predict_next_los( observer, + orbital_elements, + curr_time ); + curr_time = los.time; + curr_time += 1.0 / ( MINUTES_PER_DAY * 1.0 ) * + 20; // skip 20 minutes. LOS might still be within the + // elevation threshold. (rough quickfix from + // predict) + predict_orbit( orbital_elements, &orbit, curr_time ); + predict_observe_orbit( observer, &orbit, &obs ); + } + + // iteration until the orbit is roughly in range again, before the + // satellite pass + while( ( obs.elevation * 180.0 / M_PI < -1.0 ) || + ( obs.elevation_rate < 0 ) ) + { + time_step = 0.00035 * ( obs.elevation * 180.0 / M_PI * + ( ( orbit.altitude / 8400.0 ) + 0.46 ) - + 2.0 ); + curr_time -= time_step; + predict_orbit( orbital_elements, &orbit, curr_time ); + predict_observe_orbit( observer, &orbit, &obs ); + } + + // fine tune the results until the elevation is within a low enough + // threshold + while( fabs( obs.elevation * 180 / M_PI ) > AOSLOS_HORIZON_THRESHOLD ) + { + time_step = obs.elevation * 180.0 / M_PI * sqrt( orbit.altitude ) / + 530000.0; + curr_time -= time_step; + predict_orbit( orbital_elements, &orbit, curr_time ); + predict_observe_orbit( observer, &orbit, &obs ); + } + } + return obs; } /** * Pass stepping direction used for pass stepping function below. **/ -enum step_pass_direction{POSITIVE_DIRECTION, NEGATIVE_DIRECTION}; +enum step_pass_direction +{ + POSITIVE_DIRECTION, + NEGATIVE_DIRECTION +}; /** * Rough stepping through a pass. Uses weird time steps from Predict. @@ -204,79 +256,108 @@ enum step_pass_direction{POSITIVE_DIRECTION, NEGATIVE_DIRECTION}; * \param observer Ground station * \param orbital_elements Orbital elements of satellite * \param curr_time Time from which to start stepping - * \param direction Either POSITIVE_DIRECTION (step from current time to pass end) or NEGATIVE_DIRECTION (step from current time to start of pass). In case of the former, the pass will be stepped until either elevation is negative or the derivative of the elevation is negative - * \return Time for when we have stepped out of the pass - * \copyright GPLv2+ + * \param direction Either POSITIVE_DIRECTION (step from current time to pass + *end) or NEGATIVE_DIRECTION (step from current time to start of pass). In case + *of the former, the pass will be stepped until either elevation is negative or + *the derivative of the elevation is negative \return Time for when we have + *stepped out of the pass \copyright GPLv2+ **/ -double step_pass(const predict_observer_t *observer, const predict_orbital_elements_t *orbital_elements, double curr_time, enum step_pass_direction direction) { - struct predict_position orbit; - struct predict_observation obs; - do { - predict_orbit(orbital_elements, &orbit, curr_time); - predict_observe_orbit(observer, &orbit, &obs); - - //weird time stepping from Predict, but which magically works - double time_step = cos(obs.elevation - 1.0)*sqrt(orbit.altitude)/25000.0; - if (((direction == POSITIVE_DIRECTION) && time_step < 0) || ((direction == NEGATIVE_DIRECTION) && time_step > 0)) { - time_step = -time_step; - } - - curr_time += time_step; - } while ((obs.elevation >= 0) || ((direction == POSITIVE_DIRECTION) && (obs.elevation_rate > 0.0))); - return curr_time; +static double step_pass( const predict_observer_t * observer, + const predict_orbital_elements_t * orbital_elements, + double curr_time, + enum step_pass_direction direction ) +{ + struct predict_position orbit; + struct predict_observation obs; + do + { + predict_orbit( orbital_elements, &orbit, curr_time ); + predict_observe_orbit( observer, &orbit, &obs ); + + // weird time stepping from Predict, but which magically works + double time_step = cos( obs.elevation - 1.0 ) * sqrt( orbit.altitude ) / + 25000.0; + if( ( ( direction == POSITIVE_DIRECTION ) && time_step < 0 ) || + ( ( direction == NEGATIVE_DIRECTION ) && time_step > 0 ) ) + { + time_step = -time_step; + } + + curr_time += time_step; + } while( ( obs.elevation >= 0 ) || ( ( direction == POSITIVE_DIRECTION ) && + ( obs.elevation_rate > 0.0 ) ) ); + return curr_time; } -struct predict_observation predict_next_los(const predict_observer_t *observer, const predict_orbital_elements_t *orbital_elements, double start_utc) +struct predict_observation predict_next_los( + const predict_observer_t * observer, + const predict_orbital_elements_t * orbital_elements, + double start_utc ) { - double curr_time = start_utc; - struct predict_observation obs; - double time_step = 0; - - struct predict_position orbit; - predict_orbit(orbital_elements, &orbit, curr_time); - predict_observe_orbit(observer, &orbit, &obs); - - //check whether AOS/LOS can happen after specified start time - if (predict_aos_happens(orbital_elements, observer->latitude) && !predict_is_geosynchronous(orbital_elements) && !orbit.decayed) { - //iteration algorithm from Predict, see comments in predict_next_aos(). - - //iterate until next satellite pass - if (obs.elevation < 0.0) { - struct predict_observation aos = predict_next_aos(observer, orbital_elements, curr_time); - curr_time = aos.time; - predict_orbit(orbital_elements, &orbit, curr_time); - predict_observe_orbit(observer, &orbit, &obs); - } - - //step through the pass - curr_time = step_pass(observer, orbital_elements, curr_time, POSITIVE_DIRECTION); - - //fine tune to elevation threshold - do { - time_step = obs.elevation*180.0/M_PI*sqrt(orbit.altitude)/502500.0; - curr_time += time_step; - predict_orbit(orbital_elements, &orbit, curr_time); - predict_observe_orbit(observer, &orbit, &obs); - } while (fabs(obs.elevation*180.0/M_PI) > AOSLOS_HORIZON_THRESHOLD); - } - return obs; + double curr_time = start_utc; + struct predict_observation obs; + double time_step = 0; + + struct predict_position orbit; + predict_orbit( orbital_elements, &orbit, curr_time ); + predict_observe_orbit( observer, &orbit, &obs ); + + // check whether AOS/LOS can happen after specified start time + if( predict_aos_happens( orbital_elements, observer->latitude ) && + !predict_is_geosynchronous( orbital_elements ) && !orbit.decayed ) + { + // iteration algorithm from Predict, see comments in predict_next_aos(). + + // iterate until next satellite pass + if( obs.elevation < 0.0 ) + { + struct predict_observation aos = predict_next_aos( observer, + orbital_elements, + curr_time ); + curr_time = aos.time; + predict_orbit( orbital_elements, &orbit, curr_time ); + predict_observe_orbit( observer, &orbit, &obs ); + } + + // step through the pass + curr_time = step_pass( observer, + orbital_elements, + curr_time, + POSITIVE_DIRECTION ); + + // fine tune to elevation threshold + do + { + time_step = obs.elevation * 180.0 / M_PI * sqrt( orbit.altitude ) / + 502500.0; + curr_time += time_step; + predict_orbit( orbital_elements, &orbit, curr_time ); + predict_observe_orbit( observer, &orbit, &obs ); + } while( fabs( obs.elevation * 180.0 / M_PI ) > + AOSLOS_HORIZON_THRESHOLD ); + } + return obs; } /** - * Convenience function for calculation of derivative of elevation at specific time. + * Convenience function for calculation of derivative of elevation at specific + *time. * * \param observer Ground station * \param orbital_elements Orbital elements for satellite * \param time Time * \return Derivative of elevation at input time **/ -double elevation_derivative(const predict_observer_t *observer, const predict_orbital_elements_t *orbital_elements, double time) +static double elevation_derivative( + const predict_observer_t * observer, + const predict_orbital_elements_t * orbital_elements, + double time ) { - struct predict_position orbit; - struct predict_observation observation; - predict_orbit(orbital_elements, &orbit, time); - predict_observe_orbit(observer, &orbit, &observation); - return observation.elevation_rate; + struct predict_position orbit; + struct predict_observation observation; + predict_orbit( orbital_elements, &orbit, time ); + predict_observe_orbit( observer, &orbit, &observation ); + return observation.elevation_rate; } /** @@ -286,89 +367,150 @@ double elevation_derivative(const predict_observer_t *observer, const predict_or * \param orbital_elements Orbital elements of satellite * \param lower_time Lower time bracket * \param upper_time Upper time bracket - * \return Observation of satellite for maximum elevation between lower and upper time brackets + * \return Observation of satellite for maximum elevation between lower and + *upper time brackets **/ -struct predict_observation find_max_elevation(const predict_observer_t *observer, const predict_orbital_elements_t *orbital_elements, double lower_time, double upper_time) +static struct predict_observation find_max_elevation( + const predict_observer_t * observer, + const predict_orbital_elements_t * orbital_elements, + double lower_time, + double upper_time ) { - double max_ele_time_candidate = (upper_time + lower_time)/2.0; - int iteration = 0; - while ((fabs(lower_time - upper_time) > MAXELE_TIME_EQUALITY_THRESHOLD) && (iteration < MAXELE_MAX_NUM_ITERATIONS)) { - max_ele_time_candidate = (upper_time + lower_time)/2.0; - - //calculate derivatives for lower, upper and candidate - double candidate_deriv = elevation_derivative(observer, orbital_elements, max_ele_time_candidate); - double lower_deriv = elevation_derivative(observer, orbital_elements, lower_time); - double upper_deriv = elevation_derivative(observer, orbital_elements, upper_time); - - //check whether derivative has changed sign - if (candidate_deriv*lower_deriv < 0) { - upper_time = max_ele_time_candidate; - } else if (candidate_deriv*upper_deriv < 0) { - lower_time = max_ele_time_candidate; - } else { - break; - } - iteration++; - } - - //prepare output - struct predict_position orbit; - struct predict_observation observation; - predict_orbit(orbital_elements, &orbit, max_ele_time_candidate); - predict_observe_orbit(observer, &orbit, &observation); - return observation; + double max_ele_time_candidate = ( upper_time + lower_time ) / 2.0; + int iteration = 0; + while( + ( fabs( lower_time - upper_time ) > MAXELE_TIME_EQUALITY_THRESHOLD ) && + ( iteration < MAXELE_MAX_NUM_ITERATIONS ) ) + { + max_ele_time_candidate = ( upper_time + lower_time ) / 2.0; + + // calculate derivatives for lower, upper and candidate + double candidate_deriv = elevation_derivative( observer, + orbital_elements, + max_ele_time_candidate ); + double lower_deriv = elevation_derivative( observer, + orbital_elements, + lower_time ); + double upper_deriv = elevation_derivative( observer, + orbital_elements, + upper_time ); + + // check whether derivative has changed sign + if( candidate_deriv * lower_deriv < 0 ) + { + upper_time = max_ele_time_candidate; + } + else if( candidate_deriv * upper_deriv < 0 ) + { + lower_time = max_ele_time_candidate; + } + else + { + break; + } + iteration++; + } + + // prepare output + struct predict_position orbit; + struct predict_observation observation; + predict_orbit( orbital_elements, &orbit, max_ele_time_candidate ); + predict_observe_orbit( observer, &orbit, &observation ); + return observation; } -struct predict_observation predict_at_max_elevation(const predict_observer_t *observer, const predict_orbital_elements_t *orbital_elements, predict_julian_date_t start_time) +struct predict_observation predict_at_max_elevation( + const predict_observer_t * observer, + const predict_orbital_elements_t * orbital_elements, + predict_julian_date_t start_time ) { - struct predict_observation ret_observation = {0}; - - if (predict_is_geosynchronous(orbital_elements)) { - return ret_observation; - } - - struct predict_position orbit; - struct predict_observation observation; - predict_orbit(orbital_elements, &orbit, start_time); - if (orbit.decayed) { - return ret_observation; - } - - predict_observe_orbit(observer, &orbit, &observation); - - //bracket the solution by approximate times for AOS and LOS of the current or next pass - double lower_time = start_time; - double upper_time = start_time; - if (observation.elevation < 0) { - struct predict_observation aos = predict_next_aos(observer, orbital_elements, start_time); - lower_time = aos.time; - } else { - lower_time = step_pass(observer, orbital_elements, lower_time, NEGATIVE_DIRECTION); - } - struct predict_observation los = predict_next_los(observer, orbital_elements, lower_time); - upper_time = los.time; - - //assume that we can only have two potential local maxima along the elevation curve, and be content with that. For most cases, we will only have one, unless it is a satellite in deep space with long passes and weird effects. - - //bracket by AOS/LOS - struct predict_observation candidate_center = find_max_elevation(observer, orbital_elements, lower_time, upper_time); - - //bracket by a combination of the found candidate above and either AOS or LOS (will thus cover solutions within [aos, candidate] and [candidate, los]) - struct predict_observation candidate_lower = find_max_elevation(observer, orbital_elements, candidate_center.time - MAXELE_TIME_EQUALITY_THRESHOLD, upper_time); - struct predict_observation candidate_upper = find_max_elevation(observer, orbital_elements, lower_time, candidate_center.time + MAXELE_TIME_EQUALITY_THRESHOLD); - - //return the best candidate - if ((candidate_center.elevation > candidate_lower.elevation) && (candidate_center.elevation > candidate_upper.elevation)) { - return candidate_center; - } else if (candidate_lower.elevation > candidate_upper.elevation) { - return candidate_lower; - } else { - return candidate_upper; - } + struct predict_observation ret_observation = { 0 }; + + if( predict_is_geosynchronous( orbital_elements ) ) + { + return ret_observation; + } + + struct predict_position orbit; + struct predict_observation observation; + predict_orbit( orbital_elements, &orbit, start_time ); + if( orbit.decayed ) + { + return ret_observation; + } + + predict_observe_orbit( observer, &orbit, &observation ); + + // bracket the solution by approximate times for AOS and LOS of the current + // or next pass + double lower_time = start_time; + double upper_time = start_time; + if( observation.elevation < 0 ) + { + struct predict_observation aos = predict_next_aos( observer, + orbital_elements, + start_time ); + lower_time = aos.time; + } + else + { + lower_time = step_pass( observer, + orbital_elements, + lower_time, + NEGATIVE_DIRECTION ); + } + struct predict_observation los = predict_next_los( observer, + orbital_elements, + lower_time ); + upper_time = los.time; + + // assume that we can only have two potential local maxima along the + // elevation curve, and be content with that. For most cases, we will only + // have one, unless it is a satellite in deep space with long passes and + // weird effects. + + // bracket by AOS/LOS + struct predict_observation + candidate_center = find_max_elevation( observer, + orbital_elements, + lower_time, + upper_time ); + + // bracket by a combination of the found candidate above and either AOS or + // LOS (will thus cover solutions within [aos, candidate] and [candidate, + // los]) + struct predict_observation candidate_lower = find_max_elevation( + observer, + orbital_elements, + candidate_center.time - MAXELE_TIME_EQUALITY_THRESHOLD, + upper_time ); + struct predict_observation candidate_upper = find_max_elevation( + observer, + orbital_elements, + lower_time, + candidate_center.time + MAXELE_TIME_EQUALITY_THRESHOLD ); + + // return the best candidate + if( ( candidate_center.elevation > candidate_lower.elevation ) && + ( candidate_center.elevation > candidate_upper.elevation ) ) + { + return candidate_center; + } + else if( candidate_lower.elevation > candidate_upper.elevation ) + { + return candidate_lower; + } + else + { + return candidate_upper; + } } -double predict_doppler_shift(const struct predict_observation *obs, double frequency) +double predict_doppler_shift( const struct predict_observation * obs, + double frequency ) { - double sat_range_rate = obs->range_rate*1000.0; //convert to m/s - return -frequency*sat_range_rate/SPEED_OF_LIGHT; //assumes that sat_range <<<<< speed of light, which is very ok + double sat_range_rate = obs->range_rate * 1000.0; // convert to m/s + return -frequency * sat_range_rate / + SPEED_OF_LIGHT; // assumes that sat_range <<<<< speed of light, which + // is very ok } diff --git a/firmware/app/libs/libpredict/src/orbit.c b/firmware/app/libs/libpredict/src/orbit.c index 0182971e..129140e8 100644 --- a/firmware/app/libs/libpredict/src/orbit.c +++ b/firmware/app/libs/libpredict/src/orbit.c @@ -1,295 +1,614 @@ #include +#include +#include #include +#include -#include "defs.h" -#include "unsorted.h" -#include "sdp4.h" -#include "sgp4.h" -#include "sun.h" +#include +#include +#include +#include +#include -/* Static Allocated orbital elements */ -static predict_orbital_elements_t elem; +static bool is_eclipsed( const double pos[ 3 ], + const double sol[ 3 ], + double * depth ); -bool is_eclipsed(const double pos[3], const double sol[3], double *depth); -bool predict_decayed(const predict_orbital_elements_t *orbital_elements, predict_julian_date_t time); +static bool predict_decayed( const predict_orbital_elements_t * orbital_elements, + predict_julian_date_t time ); -//length of buffer used for extracting subsets of TLE strings for parsing -#define SUBSTRING_BUFFER_LENGTH 50 +static int32_t parse_tle_field_i32( const char * tle_sub_string, + int32_t * param ); +static int32_t parse_tle_field_i64( const char * tle_sub_string, + int64_t * param ); +static int32_t parse_tle_field_f64( const char * tle_sub_string, + double * param ); -predict_orbital_elements_t* predict_parse_tle(const char *tle_line_1, const char *tle_line_2) -{ - double tempnum; - predict_orbital_elements_t *m = &elem; - - char substring_buffer[SUBSTRING_BUFFER_LENGTH]; - m->satellite_number = atol(SubString(tle_line_1,SUBSTRING_BUFFER_LENGTH,substring_buffer,2,6)); - m->element_number = atol(SubString(tle_line_1,SUBSTRING_BUFFER_LENGTH,substring_buffer,64,67)); - m->epoch_year = atoi(SubString(tle_line_1,SUBSTRING_BUFFER_LENGTH,substring_buffer,18,19)); - strncpy(m->designator, SubString(tle_line_1,SUBSTRING_BUFFER_LENGTH,substring_buffer,9,16),8); - m->epoch_day = atof(SubString(tle_line_1,SUBSTRING_BUFFER_LENGTH,substring_buffer,20,31)); - m->inclination = atof(SubString(tle_line_2,SUBSTRING_BUFFER_LENGTH,substring_buffer,8,15)); - m->right_ascension = atof(SubString(tle_line_2,SUBSTRING_BUFFER_LENGTH,substring_buffer,17,24)); - m->eccentricity = 1.0e-07*atof(SubString(tle_line_2,SUBSTRING_BUFFER_LENGTH,substring_buffer,26,32)); - m->argument_of_perigee = atof(SubString(tle_line_2,SUBSTRING_BUFFER_LENGTH,substring_buffer,34,41)); - m->mean_anomaly = atof(SubString(tle_line_2,SUBSTRING_BUFFER_LENGTH,substring_buffer,43,50)); - m->mean_motion = atof(SubString(tle_line_2,SUBSTRING_BUFFER_LENGTH,substring_buffer,52,62)); - m->derivative_mean_motion = atof(SubString(tle_line_1,SUBSTRING_BUFFER_LENGTH,substring_buffer,33,42)); - tempnum=1.0e-5*atof(SubString(tle_line_1,SUBSTRING_BUFFER_LENGTH,substring_buffer,44,49)); - m->second_derivative_mean_motion = tempnum/pow(10.0,(tle_line_1[51]-'0')); - tempnum=1.0e-5*atof(SubString(tle_line_1,SUBSTRING_BUFFER_LENGTH,substring_buffer,53,58)); - m->bstar_drag_term = tempnum/pow(10.0,(tle_line_1[60]-'0')); - m->revolutions_at_epoch = atof(SubString(tle_line_2,SUBSTRING_BUFFER_LENGTH,substring_buffer,63,67)); - - /* Period > 225 minutes is deep space */ - double ao, xnodp, dd1, dd2, delo, a1, del1, r1; - double temp = TWO_PI/MINUTES_PER_DAY/MINUTES_PER_DAY; - double xno = m->mean_motion*temp*MINUTES_PER_DAY; //from old TLE struct - dd1=(XKE/xno); - dd2=TWO_THIRD; - a1=pow(dd1,dd2); - r1=cos(m->inclination*M_PI/180.0); - dd1=(1.0-m->eccentricity*m->eccentricity); - temp=CK2*1.5f*(r1*r1*3.0-1.0)/pow(dd1,1.5); - del1=temp/(a1*a1); - ao=a1*(1.0-del1*(TWO_THIRD*.5+del1*(del1*1.654320987654321+1.0))); - delo=temp/(ao*ao); - xnodp=xno/(delo+1.0); - - /* Select a deep-space/near-earth ephemeris */ - if (TWO_PI/xnodp/MINUTES_PER_DAY >= 0.15625) { - m->ephemeris = EPHEMERIS_SDP4; - - // Get ptr to static allocated _sdp4 - m->ephemeris_data = sdp4_static_alloc(); - - if (m->ephemeris_data == NULL) { - predict_destroy_orbital_elements(m); - return NULL; - } - // Initialize ephemeris data structure - sdp4_init(m, (struct _sdp4*)m->ephemeris_data); - - } else { - m->ephemeris = EPHEMERIS_SGP4; - - // Get ptr to static allocated _sgp4 - m->ephemeris_data = sgp4_static_alloc(); - - if (m->ephemeris_data == NULL) { - predict_destroy_orbital_elements(m); - return NULL; - } - // Initialize ephemeris data structure - sgp4_init(m, (struct _sgp4*)m->ephemeris_data); - } - - return m; -} +// length of buffer used for extracting subsets of TLE strings for parsing +#define SUBSTRING_BUFFER_LENGTH 50 -void predict_destroy_orbital_elements(predict_orbital_elements_t *m) +predict_orbital_elements_t * predict_parse_tle( + predict_orbital_elements_t * orbital_elements, + struct predict_sgp4 * sgp4, + struct predict_sdp4 * sdp4, + const char * tle_line_1, + const char * tle_line_2 ) { - if (m == NULL) return; + double tempnum = 0.0; + int32_t err = 0; + predict_orbital_elements_t * m = NULL; - if (m->ephemeris_data != NULL) + if( ( orbital_elements != NULL ) && ( tle_line_1 != NULL ) && + ( tle_line_2 != NULL ) ) { - switch (m->ephemeris) + m = orbital_elements; + + char substring_buffer[ SUBSTRING_BUFFER_LENGTH ]; + err = parse_tle_field_i32( SubString( tle_line_1, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 2, + 6 ), + &m->satellite_number ); + if( err == 0 ) + { + err = parse_tle_field_i64( SubString( tle_line_1, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 64, + 67 ), + &m->element_number ); + } + + if( err == 0 ) + { + err = parse_tle_field_i32( SubString( tle_line_1, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 18, + 19 ), + &m->epoch_year ); + } + + if( err == 0 ) + { + ( void ) strncpy( m->designator, + SubString( tle_line_1, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 9, + 16 ), + 8 ); + } + + if( err == 0 ) + { + err = parse_tle_field_f64( SubString( tle_line_1, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 20, + 31 ), + &m->epoch_day ); + } + + if( err == 0 ) + { + err = parse_tle_field_f64( SubString( tle_line_2, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 8, + 15 ), + &m->inclination ); + } + + if( err == 0 ) + { + err = parse_tle_field_f64( SubString( tle_line_2, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 17, + 24 ), + &m->right_ascension ); + } + + if( err == 0 ) + { + err = parse_tle_field_f64( SubString( tle_line_2, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 26, + 32 ), + &m->eccentricity ); + m->eccentricity = m->eccentricity * 1.0e-07; + } + + if( err == 0 ) + { + err = parse_tle_field_f64( SubString( tle_line_2, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 34, + 41 ), + &m->argument_of_perigee ); + } + + if( err == 0 ) + { + err = parse_tle_field_f64( SubString( tle_line_2, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 43, + 50 ), + &m->mean_anomaly ); + } + + if( err == 0 ) + { + err = parse_tle_field_f64( SubString( tle_line_2, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 52, + 62 ), + &m->mean_motion ); + } + + if( err == 0 ) { - case EPHEMERIS_SDP4: - memset(m->ephemeris_data, 0, sizeof(struct _sdp4)); - break; - case EPHEMERIS_SGP4: - memset(m->ephemeris_data, 0, sizeof(struct _sgp4)); - break; - default: - break; + err = parse_tle_field_f64( SubString( tle_line_1, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 33, + 42 ), + &m->derivative_mean_motion ); } - } - memset((void*)m, 0, sizeof(predict_orbital_elements_t)); + if( err == 0 ) + { + err = 1.0e-5 * + parse_tle_field_f64( SubString( tle_line_1, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 44, + 49 ), + &tempnum ); + tempnum = 1.0e-5 * tempnum; + } + + if( err == 0 ) + { + m->second_derivative_mean_motion = tempnum / + pow( 10.0, + ( tle_line_1[ 51 ] - + '0' ) ); + + err = parse_tle_field_f64( SubString( tle_line_1, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 53, + 58 ), + &tempnum ); + tempnum = 1.0e-5 * tempnum; + } + + if( err == 0 ) + { + m->bstar_drag_term = tempnum / + pow( 10.0, ( tle_line_1[ 60 ] - '0' ) ); + + err = parse_tle_field_i32( SubString( tle_line_2, + SUBSTRING_BUFFER_LENGTH, + substring_buffer, + 63, + 67 ), + &m->revolutions_at_epoch ); + } + + if( err == 0 ) + { + /* Period > 225 minutes is deep space */ + double ao; + double xnodp; + double dd1; + double dd2; + double delo; + double a1; + double del1; + double r1; + double temp = TWO_PI / MINUTES_PER_DAY / MINUTES_PER_DAY; + double xno = m->mean_motion * temp * + MINUTES_PER_DAY; // from old TLE struct + dd1 = ( XKE / xno ); + dd2 = TWO_THIRD; + a1 = pow( dd1, dd2 ); + r1 = cos( m->inclination * M_PI / 180.0 ); + dd1 = ( 1.0 - ( m->eccentricity * m->eccentricity ) ); + temp = CK2 * 1.5f * ( ( r1 * r1 * 3.0 ) - 1.0 ) / pow( dd1, 1.5 ); + del1 = temp / ( a1 * a1 ); + ao = a1 * + ( 1.0 - ( del1 * ( ( TWO_THIRD * 0.5 ) + + ( del1 * ( ( del1 * 1.654320987654321 ) + + 1.0 ) ) ) ) ); + delo = temp / ( ao * ao ); + xnodp = xno / ( delo + 1.0 ); + + /* Select a deep-space/near-earth ephemeris */ + if( ( TWO_PI / xnodp / MINUTES_PER_DAY ) >= 0.15625 ) + { + m->ephemeris = EPHEMERIS_SDP4; + + m->ephemeris_data = sdp4; + + if( m->ephemeris_data == NULL ) + { + m = NULL; + } + else + { + // Initialize ephemeris data structure + sdp4_init( m, m->ephemeris_data ); + } + } + else + { + m->ephemeris = EPHEMERIS_SGP4; + + m->ephemeris_data = sgp4; + + if( m->ephemeris_data == NULL ) + { + m = NULL; + } + else + { + // Initialize ephemeris data structure + sgp4_init( m, m->ephemeris_data ); + } + } + } + else + { + m = NULL; + } + } + + return m; } -bool predict_is_geosynchronous(const predict_orbital_elements_t *m) +bool predict_is_geosynchronous( const predict_orbital_elements_t * m ) { - return (m->mean_motion >= GEOSYNCHRONOUS_LOWER_MEAN_MOTION) - && (m->mean_motion <= GEOSYNCHRONOUS_UPPER_MEAN_MOTION) - && (fabs(m->eccentricity) <= GEOSYNCHRONOUS_ECCENTRICITY_THRESHOLD) - && (fabs(m->inclination) <= GEOSYNCHRONOUS_INCLINATION_THRESHOLD_DEGREES); + return ( m->mean_motion >= GEOSYNCHRONOUS_LOWER_MEAN_MOTION ) && + ( m->mean_motion <= GEOSYNCHRONOUS_UPPER_MEAN_MOTION ) && + ( fabs( m->eccentricity ) <= + GEOSYNCHRONOUS_ECCENTRICITY_THRESHOLD ) && + ( fabs( m->inclination ) <= + GEOSYNCHRONOUS_INCLINATION_THRESHOLD_DEGREES ); } -double predict_apogee(const predict_orbital_elements_t *m) +double predict_apogee( const predict_orbital_elements_t * m ) { - double sma = 331.25*exp(log(1440.0/m->mean_motion)*(2.0/3.0)); - return sma*(1.0+m->eccentricity)-EARTH_RADIUS_KM_WGS84; + double sma = 331.25 * exp( log( 1440.0 / m->mean_motion ) * ( 2.0 / 3.0 ) ); + return sma * ( 1.0 + m->eccentricity ) - EARTH_RADIUS_KM_WGS84; } - -double predict_perigee(const predict_orbital_elements_t *m) + +double predict_perigee( const predict_orbital_elements_t * m ) { - double xno = m->mean_motion*TWO_PI/MINUTES_PER_DAY; - double a1=pow(XKE/xno,TWO_THIRD); - double cosio=cos(m->inclination*M_PI/180.0); - double theta2=cosio*cosio; - double x3thm1=3*theta2-1.0; - double eosq=m->eccentricity*m->eccentricity; - double betao2=1.0-eosq; - double betao=sqrt(betao2); - double del1=1.5*CK2*x3thm1/(a1*a1*betao*betao2); - double ao=a1*(1.0-del1*(0.5*TWO_THIRD+del1*(1.0+134.0/81.0*del1))); - double delo=1.5*CK2*x3thm1/(ao*ao*betao*betao2); - double aodp=ao/(1.0-delo); - - return (aodp*(1-m->eccentricity)-AE)*EARTH_RADIUS_KM_WGS84; + double xno = m->mean_motion * TWO_PI / MINUTES_PER_DAY; + double a1 = pow( XKE / xno, TWO_THIRD ); + double cosio = cos( m->inclination * M_PI / 180.0 ); + double theta2 = cosio * cosio; + double x3thm1 = ( 3.0 * theta2 ) - 1.0; + double eosq = m->eccentricity * m->eccentricity; + double betao2 = 1.0 - eosq; + double betao = sqrt( betao2 ); + double del1 = 1.5 * CK2 * x3thm1 / ( a1 * a1 * betao * betao2 ); + double ao = a1 * + ( 1.0 - + ( del1 * ( ( 0.5 * TWO_THIRD ) + + ( del1 * ( 1.0 + ( 134.0 / 81.0 * del1 ) ) ) ) ) ); + double delo = 1.5 * CK2 * x3thm1 / ( ao * ao * betao * betao2 ); + double aodp = ao / ( 1.0 - delo ); + + return ( aodp * ( 1.0 - m->eccentricity ) - AE ) * EARTH_RADIUS_KM_WGS84; } -bool predict_aos_happens(const predict_orbital_elements_t *m, double latitude) +bool predict_aos_happens( const predict_orbital_elements_t * m, + double latitude ) { - /* This function returns true if the satellite pointed to by - "x" can ever rise above the horizon of the ground station. */ + /* This function returns true if the satellite pointed to by + "x" can ever rise above the horizon of the ground station. */ - double lin, apogee; + bool retval; + double lin; + double apogee; - if (m->mean_motion==0.0) - return false; - else - { - lin = m->inclination; + if( m->mean_motion == 0.0 ) + { + retval = false; + } + else + { + lin = m->inclination; - if (lin >= 90.0) lin = 180.0-lin; + if( lin >= 90.0 ) + { + lin = 180.0 - lin; + } - apogee = predict_apogee(m); + apogee = predict_apogee( m ); - if ((acos(EARTH_RADIUS_KM_WGS84/(apogee+EARTH_RADIUS_KM_WGS84))+(lin*M_PI/180.0)) > fabs(latitude)) - return true; - else - return false; - } + if( ( acos( EARTH_RADIUS_KM_WGS84 / + ( apogee + EARTH_RADIUS_KM_WGS84 ) ) + + ( lin * M_PI / 180.0 ) ) > fabs( latitude ) ) + { + retval = true; + } + else + { + retval = false; + } + } + + return retval; } /* This is the stuff we need to do repetitively while tracking. */ /* This is the old Calc() function. */ -int predict_orbit(const predict_orbital_elements_t *orbital_elements, struct predict_position *m, double utc) +int32_t predict_orbit( const predict_orbital_elements_t * orbital_elements, + struct predict_position * m, + double utc ) { - /* Set time to now if now time is provided: */ - if (utc == 0) utc = predict_to_julian(time(NULL)); - - /* Satellite position and velocity vectors */ - vec3_set(m->position, 0, 0, 0); - vec3_set(m->velocity, 0, 0, 0); - - m->time = utc; - double julTime = utc + JULIAN_TIME_DIFF; - - /* Convert satellite's epoch time to Julian */ - /* and calculate time since epoch in minutes */ - double epoch = 1000.0*orbital_elements->epoch_year + orbital_elements->epoch_day; - double jul_epoch = Julian_Date_of_Epoch(epoch); - double tsince = (julTime - jul_epoch)*MINUTES_PER_DAY; - - /* Call NORAD routines according to deep-space flag. */ - struct model_output output; - switch (orbital_elements->ephemeris) { - case EPHEMERIS_SDP4: - sdp4_predict((struct _sdp4*)orbital_elements->ephemeris_data, tsince, &output); - break; - case EPHEMERIS_SGP4: - sgp4_predict((struct _sgp4*)orbital_elements->ephemeris_data, tsince, &output); - break; - default: - //Panic! - return -1; - } - m->position[0] = output.pos[0]; - m->position[1] = output.pos[1]; - m->position[2] = output.pos[2]; - m->velocity[0] = output.vel[0]; - m->velocity[1] = output.vel[1]; - m->velocity[2] = output.vel[2]; - m->phase = output.phase; - m->argument_of_perigee = output.omgadf; - m->inclination = output.xinck; - m->right_ascension = output.xnodek; - - /* TODO: Remove? Scale position and velocity vectors to km and km/sec */ - Convert_Sat_State(m->position, m->velocity); - - /* Calculate satellite Lat North, Lon East and Alt. */ - geodetic_t sat_geodetic; - Calculate_LatLonAlt(utc, m->position, &sat_geodetic); - - m->latitude = sat_geodetic.lat; - m->longitude = sat_geodetic.lon; - m->altitude = sat_geodetic.alt; - - // Calculate solar position - double solar_vector[3]; - sun_predict(m->time, solar_vector); - - // Find eclipse depth and if sat is eclipsed - m->eclipsed = is_eclipsed(m->position, solar_vector, &m->eclipse_depth); - - // Calculate footprint - m->footprint = 2.0*EARTH_RADIUS_KM_WGS84*acos(EARTH_RADIUS_KM_WGS84/(EARTH_RADIUS_KM_WGS84 + m->altitude)); - - // Calculate current number of revolutions around Earth - double temp = TWO_PI/MINUTES_PER_DAY/MINUTES_PER_DAY; - double age = julTime - jul_epoch; - double xno = orbital_elements->mean_motion*temp*MINUTES_PER_DAY; - double xmo = orbital_elements->mean_anomaly * M_PI / 180.0; - m->revolutions = (long)floor((xno*MINUTES_PER_DAY/(M_PI*2.0) + age*orbital_elements->bstar_drag_term)*age + xmo/(2.0*M_PI)) + orbital_elements->revolutions_at_epoch; - - //calculate whether orbit is decayed - m->decayed = predict_decayed(orbital_elements, utc); - - return 0; + int32_t err = 0; + + /* Satellite position and velocity vectors */ + vec3_set( m->position, 0, 0, 0 ); + vec3_set( m->velocity, 0, 0, 0 ); + + m->time = utc; + double julTime = utc; + + /* Convert satellite's epoch time to Julian */ + /* and calculate time since epoch in minutes */ + double epoch = ( 1000.0 * orbital_elements->epoch_year ) + + orbital_elements->epoch_day; + double jul_epoch = Julian_Date_of_Epoch( epoch ); + double tsince = ( julTime - jul_epoch ) * MINUTES_PER_DAY; + + /* Call NORAD routines according to deep-space flag. */ + struct model_output output; + switch( orbital_elements->ephemeris ) + { + case EPHEMERIS_SDP4: + sdp4_predict( orbital_elements->ephemeris_data, tsince, &output ); + break; + case EPHEMERIS_SGP4: + sgp4_predict( orbital_elements->ephemeris_data, tsince, &output ); + break; + default: + err = -1; + break; + } + + if( err == 0 ) + { + m->position[ 0 ] = output.pos[ 0 ]; + m->position[ 1 ] = output.pos[ 1 ]; + m->position[ 2 ] = output.pos[ 2 ]; + m->velocity[ 0 ] = output.vel[ 0 ]; + m->velocity[ 1 ] = output.vel[ 1 ]; + m->velocity[ 2 ] = output.vel[ 2 ]; + m->phase = output.phase; + m->argument_of_perigee = output.omgadf; + m->inclination = output.xinck; + m->right_ascension = output.xnodek; + + /* TODO: Remove? Scale position and velocity vectors to km and km/sec */ + Convert_Sat_State( m->position, m->velocity ); + + /* Calculate satellite Lat North, Lon East and Alt. */ + geodetic_t sat_geodetic; + Calculate_LatLonAlt( utc, m->position, &sat_geodetic ); + + m->latitude = sat_geodetic.lat; + m->longitude = sat_geodetic.lon; + m->altitude = sat_geodetic.alt; + + // Calculate solar position + double solar_vector[ 3 ]; + sun_predict( m->time, solar_vector ); + + // Find eclipse depth and if sat is eclipsed + m->eclipsed = is_eclipsed( m->position, + solar_vector, + &m->eclipse_depth ); + + // Calculate footprint + m->footprint = 2.0 * EARTH_RADIUS_KM_WGS84 * + acos( EARTH_RADIUS_KM_WGS84 / + ( EARTH_RADIUS_KM_WGS84 + m->altitude ) ); + + // Calculate current number of revolutions around Earth + double temp = TWO_PI / MINUTES_PER_DAY / MINUTES_PER_DAY; + double age = julTime - jul_epoch; + double xno = orbital_elements->mean_motion * temp * MINUTES_PER_DAY; + double xmo = orbital_elements->mean_anomaly * M_PI / 180.0; + m->revolutions = ( int64_t ) floor( + ( ( ( xno * MINUTES_PER_DAY / ( M_PI * 2.0 ) ) + + ( age * orbital_elements->bstar_drag_term ) ) * + age ) + + ( xmo / ( 2.0 * M_PI ) ) ) + + orbital_elements->revolutions_at_epoch; + + // calculate whether orbit is decayed + m->decayed = predict_decayed( orbital_elements, utc ); + } + + return err; } -bool predict_decayed(const predict_orbital_elements_t *orbital_elements, predict_julian_date_t time) +static bool predict_decayed( const predict_orbital_elements_t * orbital_elements, + predict_julian_date_t time ) { - double satepoch; - satepoch=DayNum(1,0,orbital_elements->epoch_year)+orbital_elements->epoch_day; - - bool has_decayed = false; - if (satepoch + ((16.666666 - orbital_elements->mean_motion)/(10.0*fabs(orbital_elements->derivative_mean_motion))) < time) - { - has_decayed = true; - } - return has_decayed; + double satepoch; + satepoch = DayNum( 1, 0, orbital_elements->epoch_year ) + + orbital_elements->epoch_day; + + bool has_decayed = false; + if( satepoch + + ( ( 16.666666 - orbital_elements->mean_motion ) / + ( 10.0 * fabs( orbital_elements->derivative_mean_motion ) ) ) < + time ) + { + has_decayed = true; + } + return has_decayed; } - /* Calculates if a position is eclipsed. */ -bool is_eclipsed(const double pos[3], const double sol[3], double *depth) +/* Calculates if a position is eclipsed. */ +static bool is_eclipsed( const double pos[ 3 ], + const double sol[ 3 ], + double * depth ) { - double Rho[3], earth[3]; - - /* Determine partial eclipse */ - double sd_earth = asin_(EARTH_RADIUS_KM_WGS84 / vec3_length(pos)); - vec3_sub(sol, pos, Rho); - double sd_sun = asin_(SOLAR_RADIUS_KM / vec3_length(Rho)); - vec3_mul_scalar(pos, -1, earth); - - double delta = acos_( vec3_dot(sol, earth) / vec3_length(sol) / vec3_length(earth) ); - *depth = sd_earth - sd_sun - delta; - - if (sd_earth < sd_sun) return false; - else if (*depth >= 0) return true; - else return false; + bool retval; + double Rho[ 3 ]; + double earth[ 3 ]; + + /* Determine partial eclipse */ + double sd_earth = asin_( EARTH_RADIUS_KM_WGS84 / vec3_length( pos ) ); + vec3_sub( sol, pos, Rho ); + double sd_sun = asin_( SOLAR_RADIUS_KM / vec3_length( Rho ) ); + vec3_mul_scalar( pos, -1, earth ); + + double delta = acos_( vec3_dot( sol, earth ) / vec3_length( sol ) / + vec3_length( earth ) ); + *depth = sd_earth - sd_sun - delta; + + if( sd_earth < sd_sun ) + { + retval = false; + } + else if( *depth >= 0 ) + { + retval = true; + } + else + { + retval = false; + } + + return retval; +} + +double predict_squint_angle( const predict_observer_t * observer, + const struct predict_position * orbit, + double alon, + double alat ) +{ + double bx = cos( alat ) * cos( alon + orbit->argument_of_perigee ); + double by = cos( alat ) * sin( alon + orbit->argument_of_perigee ); + double bz = sin( alat ); + + double cx = bx; + double cy = ( by * cos( orbit->inclination ) ) - + ( bz * sin( orbit->inclination ) ); + double cz = ( by * sin( orbit->inclination ) ) + + ( bz * cos( orbit->inclination ) ); + double ax = ( cx * cos( orbit->right_ascension ) ) - + ( cy * sin( orbit->right_ascension ) ); + double ay = ( cx * sin( orbit->right_ascension ) ) + + ( cy * cos( orbit->right_ascension ) ); + double az = cz; + + struct predict_observation obs; + predict_observe_orbit( observer, orbit, &obs ); + double squint = acos( -( ( ax * obs.range_x ) + ( ay * obs.range_y ) + + ( az * obs.range_z ) ) / + obs.range ); + + return squint; } -double predict_squint_angle(const predict_observer_t *observer, const struct predict_position *orbit, double alon, double alat) +static int32_t parse_tle_field_i32( const char * tle_sub_string, + int32_t * param ) { - double bx = cos(alat)*cos(alon + orbit->argument_of_perigee); - double by = cos(alat)*sin(alon + orbit->argument_of_perigee); - double bz = sin(alat); - - double cx = bx; - double cy = by*cos(orbit->inclination) - bz*sin(orbit->inclination); - double cz = by*sin(orbit->inclination) + bz*cos(orbit->inclination); - double ax = cx*cos(orbit->right_ascension) - cy*sin(orbit->right_ascension); - double ay = cx*sin(orbit->right_ascension) + cy*cos(orbit->right_ascension); - double az = cz; - - struct predict_observation obs; - predict_observe_orbit(observer, orbit, &obs); - double squint = acos(-(ax*obs.range_x + ay*obs.range_y + az*obs.range_z)/obs.range); - - return squint; + int32_t err = 0; + char * end_ptr = NULL; + + errno = 0; + int64_t tmp = ( int64_t ) strtoll( tle_sub_string, &end_ptr, 10 ); + + if (errno != 0) + { + err = -1; + } + + if( end_ptr == tle_sub_string ) + { + err = -1; + } + + if( ( tmp > INT32_MAX ) || ( tmp < INT32_MIN ) ) + { + err = -1; + } + + if( err == 0 ) + { + *param = ( int32_t ) tmp; + } + + return err; +} + +static int32_t parse_tle_field_i64( const char * tle_sub_string, + int64_t * param ) +{ + int32_t err = 0; + char * end_ptr = NULL; + + errno = 0; + int64_t tmp = ( int64_t ) strtoll( tle_sub_string, &end_ptr, 10 ); + + if (errno != 0) + { + err = -1; + } + + if( end_ptr == tle_sub_string ) + { + err = -1; + } + + if( err == 0 ) + { + *param = ( int64_t ) tmp; + } + + return err; +} + +static int32_t parse_tle_field_f64( const char * tle_sub_string, + double * param ) +{ + int32_t err = 0; + char * end_ptr = NULL; + + errno = 0; + double tmp = ( double ) strtod( tle_sub_string, &end_ptr ); + + if (errno != 0) + { + err = -1; + } + + if( end_ptr == tle_sub_string ) + { + err = -1; + } + + if( err == 0 ) + { + *param = tmp; + } + + return err; } diff --git a/firmware/app/libs/libpredict/src/predict.pc.in b/firmware/app/libs/libpredict/src/predict.pc.in deleted file mode 100644 index 8040141f..00000000 --- a/firmware/app/libs/libpredict/src/predict.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=@CMAKE_INSTALL_PREFIX@ -exec_prefix=${prefix} -libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ -includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ - -Name: predict -Description: A satellite orbit prediction library -Version: @PROJECT_VERSION@ -Cflags: -I${includedir} -Libs: -L${libdir} -lpredict diff --git a/firmware/app/libs/libpredict/src/refraction.c b/firmware/app/libs/libpredict/src/refraction.c index 24a6f445..ce212c66 100644 --- a/firmware/app/libs/libpredict/src/refraction.c +++ b/firmware/app/libs/libpredict/src/refraction.c @@ -1,70 +1,84 @@ -#include #include +#include /* Corrections for atmospheric refraction */ /* Reference: Astronomical Algorithms by Jean Meeus, pp. 101-104 */ /* http://en.wikipedia.org/wiki/Atmospheric_refraction */ -#define A (1.02*M_PI/180.0) -#define B (10.3*M_PI/180.0) -#define C (5.11*M_PI/180.0) +#define A ( 1.02 * M_PI / 180.0 ) +#define B ( 10.3 * M_PI / 180.0 ) +#define C ( 5.11 * M_PI / 180.0 ) -double predict_refraction(double el) +double predict_refraction( double el ) { - return A / tan( el + B / ( el + C ) ); + return A / tan( el + B / ( el + C ) ); } -double predict_refraction_ext(double el, double pressure, double temp) +double predict_refraction_ext( double el, double pressure, double temp ) { - double x = 283*pressure / (101 * (273 + temp)); - return x * predict_refraction(el); + double x = 283 * pressure / ( 101 * ( 273 + temp ) ); + return x * predict_refraction( el ); } -double predict_refraction_from_apparent(double apparent_el) +double predict_refraction_from_apparent( double apparent_el ) { - return 1.0 / tan( apparent_el + 7.31*M_PI/180.0 / (apparent_el + 4.4*M_PI/180.0)); + return 1.0 / tan( apparent_el + 7.31 * M_PI / 180.0 / + ( apparent_el + 4.4 * M_PI / 180.0 ) ); } -double predict_refraction_from_apparent_ext(double apparent_el, double pressure, double temp) +double predict_refraction_from_apparent_ext( double apparent_el, + double pressure, + double temp ) { - double x = 283*pressure / (101 * (273 + temp)); - return x / tan( apparent_el + 7.31*M_PI/180.0 / (apparent_el + 4.4*M_PI/180.0)); + double x = 283 * pressure / ( 101 * ( 273 + temp ) ); + return x / tan( apparent_el + 7.31 * M_PI / 180.0 / + ( apparent_el + 4.4 * M_PI / 180.0 ) ); } -double predict_refraction_rate(double el, double el_rate) +double predict_refraction_rate( double el, double el_rate ) { - double u0 = el + C; - double u1 = sin(el + B / (el + C)); - return A * el_rate * (B / (u0*u0) - 1.0) / (u1*u1); + double u0 = el + C; + double u1 = sin( el + B / ( el + C ) ); + return A * el_rate * ( B / ( u0 * u0 ) - 1.0 ) / ( u1 * u1 ); } -double predict_refraction_rate_ext(double el, double el_rate, double pressure, double temp) +double predict_refraction_rate_ext( double el, + double el_rate, + double pressure, + double temp ) { - double x = 283*pressure / (101 * (273 + temp)); - return x * predict_refraction_rate(el, el_rate); + double x = 283 * pressure / ( 101 * ( 273 + temp ) ); + return x * predict_refraction_rate( el, el_rate ); } -double predict_apparent_elevation(double el) +double predict_apparent_elevation( double el ) { - double apparent = el + predict_refraction(el); - if (apparent >= 0.0) return apparent; - else return el; + double apparent = el + predict_refraction( el ); + if( apparent >= 0.0 ) + return apparent; + else + return el; } -double predict_apparent_elevation_ext(double el, double pressure, double temp) +double predict_apparent_elevation_ext( double el, double pressure, double temp ) { - double apparent = el + predict_refraction_ext(el, pressure, temp); - if (apparent >= 0.0) return apparent; - else return el; + double apparent = el + predict_refraction_ext( el, pressure, temp ); + if( apparent >= 0.0 ) + return apparent; + else + return el; } -double predict_apparent_elevation_rate(double el, double el_rate) +double predict_apparent_elevation_rate( double el, double el_rate ) { - return el_rate * (1 + predict_refraction_rate(el, el_rate)); + return el_rate * ( 1 + predict_refraction_rate( el, el_rate ) ); } -double predict_apparent_elevation_rate_ext(double el, double el_rate, double pressure, double temp) +double predict_apparent_elevation_rate_ext( double el, + double el_rate, + double pressure, + double temp ) { - return el_rate * (1 + predict_refraction_rate_ext(el, el_rate, pressure, temp)); + return el_rate * + ( 1 + predict_refraction_rate_ext( el, el_rate, pressure, temp ) ); } - diff --git a/firmware/app/libs/libpredict/src/sdp4.c b/firmware/app/libs/libpredict/src/sdp4.c index fb51259c..0040210b 100644 --- a/firmware/app/libs/libpredict/src/sdp4.c +++ b/firmware/app/libs/libpredict/src/sdp4.c @@ -1,17 +1,13 @@ -#include "sdp4.h" - #include #include -#include "defs.h" -#include "unsorted.h" - -/* Static Allocated sdp4 struct */ -static struct _sdp4 sdp4_; +#include +#include +#include /// Entry points of deep() -#define DPSecular 1 -#define DPPeriodic 2 +#define DPSecular 1 +#define DPPeriodic 2 /** * Initialize the fixed part of deep_arg. @@ -21,7 +17,9 @@ static struct _sdp4 sdp4_; * \param deep_arg Fixed part of deep_arg * \copyright GPLv2+ **/ -void sdp4_deep_initialize(const predict_orbital_elements_t *tle, struct _sdp4 *m, deep_arg_fixed_t *deep_arg); +void sdp4_deep_initialize( const predict_orbital_elements_t * tle, + struct predict_sdp4 * m, + deep_arg_fixed_t * deep_arg ); /** * Initialize the dynamic part of deep_arg. @@ -30,247 +28,270 @@ void sdp4_deep_initialize(const predict_orbital_elements_t *tle, struct _sdp4 *m * \param deep_dyn Dynamic part of deep_arg * \copyright GPLv2+ **/ -void deep_arg_dynamic_init(const struct _sdp4 *m, deep_arg_dynamic_t *deep_dyn); +void deep_arg_dynamic_init( const struct predict_sdp4 * m, + deep_arg_dynamic_t * deep_dyn ); -struct _sdp4 *sdp4_static_alloc(void) +void sdp4_init( const predict_orbital_elements_t * tle, + struct predict_sdp4 * m ) { - return &sdp4_; + m->lunarTermsDone = 0; + m->resonanceFlag = 0; + m->synchronousFlag = 0; + + // Calculate old TLE field values as used in the original sdp4 + double temp_tle = TWO_PI / MINUTES_PER_DAY / MINUTES_PER_DAY; + m->xnodeo = tle->right_ascension * M_PI / 180.0; + m->omegao = tle->argument_of_perigee * M_PI / 180.0; + m->xmo = tle->mean_anomaly * M_PI / 180.0; + m->xincl = tle->inclination * M_PI / 180.0; + m->eo = tle->eccentricity; + m->xno = tle->mean_motion * temp_tle * MINUTES_PER_DAY; + m->bstar = tle->bstar_drag_term / AE; + m->epoch = 1000.0 * tle->epoch_year + tle->epoch_day; + + /* Recover original mean motion (xnodp) and */ + /* semimajor axis (aodp) from input elements. */ + double temp1, temp2, temp3, theta4, a1, a3ovk2, ao, c2, coef, coef1, x1m5th, + xhdot1, del1, delo, eeta, eta, etasq, perigee, psisq, tsi, qoms24, s4, + pinvsq; + + a1 = pow( XKE / m->xno, TWO_THIRD ); + m->deep_arg.cosio = cos( m->xincl ); + m->deep_arg.theta2 = m->deep_arg.cosio * m->deep_arg.cosio; + m->x3thm1 = 3 * m->deep_arg.theta2 - 1; + m->deep_arg.eosq = m->eo * m->eo; + m->deep_arg.betao2 = 1 - m->deep_arg.eosq; + m->deep_arg.betao = sqrt( m->deep_arg.betao2 ); + del1 = 1.5 * CK2 * m->x3thm1 / + ( a1 * a1 * m->deep_arg.betao * m->deep_arg.betao2 ); + ao = a1 * ( 1 - del1 * ( 0.5 * TWO_THIRD + + del1 * ( 1 + ( double ) 134 / 81 * del1 ) ) ); + delo = 1.5 * CK2 * m->x3thm1 / + ( ao * ao * m->deep_arg.betao * m->deep_arg.betao2 ); + m->deep_arg.xnodp = m->xno / ( 1 + delo ); + m->deep_arg.aodp = ao / ( 1 - delo ); + + /* For perigee below 156 km, the values */ + /* of s and qoms2t are altered. */ + + s4 = S_DENSITY_PARAM; + qoms24 = QOMS2T; + perigee = ( m->deep_arg.aodp * ( 1 - m->eo ) - AE ) * EARTH_RADIUS_KM_WGS84; + + if( perigee < 156.0 ) + { + if( perigee <= 98.0 ) + s4 = 20.0; + else + s4 = perigee - 78.0; + + qoms24 = pow( ( 120 - s4 ) * AE / EARTH_RADIUS_KM_WGS84, 4 ); + s4 = s4 / EARTH_RADIUS_KM_WGS84 + AE; + } + + pinvsq = 1 / ( m->deep_arg.aodp * m->deep_arg.aodp * m->deep_arg.betao2 * + m->deep_arg.betao2 ); + m->deep_arg.sing = sin( m->omegao ); + m->deep_arg.cosg = cos( m->omegao ); + tsi = 1 / ( m->deep_arg.aodp - s4 ); + eta = m->deep_arg.aodp * m->eo * tsi; + etasq = eta * eta; + eeta = m->eo * eta; + psisq = fabs( 1 - etasq ); + coef = qoms24 * pow( tsi, 4 ); + coef1 = coef / pow( psisq, 3.5 ); + c2 = coef1 * m->deep_arg.xnodp * + ( m->deep_arg.aodp * ( 1 + 1.5 * etasq + eeta * ( 4 + etasq ) ) + + 0.75 * CK2 * tsi / psisq * m->x3thm1 * + ( 8 + 3 * etasq * ( 8 + etasq ) ) ); + m->c1 = m->bstar * c2; + m->deep_arg.sinio = sin( m->xincl ); + a3ovk2 = -J3_HARMONIC_WGS72 / CK2 * pow( AE, 3 ); + m->x1mth2 = 1 - m->deep_arg.theta2; + m->c4 = 2 * m->deep_arg.xnodp * coef1 * m->deep_arg.aodp * + m->deep_arg.betao2 * + ( eta * ( 2 + 0.5 * etasq ) + m->eo * ( 0.5 + 2 * etasq ) - + 2 * CK2 * tsi / ( m->deep_arg.aodp * psisq ) * + ( -3 * m->x3thm1 * + ( 1 - 2 * eeta + etasq * ( 1.5 - 0.5 * eeta ) ) + + 0.75 * m->x1mth2 * ( 2 * etasq - eeta * ( 1 + etasq ) ) * + cos( 2 * m->omegao ) ) ); + theta4 = m->deep_arg.theta2 * m->deep_arg.theta2; + temp1 = 3 * CK2 * pinvsq * m->deep_arg.xnodp; + temp2 = temp1 * CK2 * pinvsq; + temp3 = 1.25 * CK4 * pinvsq * pinvsq * m->deep_arg.xnodp; + m->deep_arg.xmdot = m->deep_arg.xnodp + + 0.5 * temp1 * m->deep_arg.betao * m->x3thm1 + + 0.0625 * temp2 * m->deep_arg.betao * + ( 13 - 78 * m->deep_arg.theta2 + 137 * theta4 ); + x1m5th = 1 - 5 * m->deep_arg.theta2; + m->deep_arg.omgdot = -0.5 * temp1 * x1m5th + + 0.0625 * temp2 * + ( 7 - 114 * m->deep_arg.theta2 + 395 * theta4 ) + + temp3 * ( 3 - 36 * m->deep_arg.theta2 + 49 * theta4 ); + xhdot1 = -temp1 * m->deep_arg.cosio; + m->deep_arg.xnodot = xhdot1 + + ( 0.5 * temp2 * ( 4 - 19 * m->deep_arg.theta2 ) + + 2 * temp3 * ( 3 - 7 * m->deep_arg.theta2 ) ) * + m->deep_arg.cosio; + m->xnodcf = 3.5 * m->deep_arg.betao2 * xhdot1 * m->c1; + m->t2cof = 1.5 * m->c1; + m->xlcof = 0.125 * a3ovk2 * m->deep_arg.sinio * + ( 3 + 5 * m->deep_arg.cosio ) / ( 1 + m->deep_arg.cosio ); + m->aycof = 0.25 * a3ovk2 * m->deep_arg.sinio; + m->x7thm1 = 7 * m->deep_arg.theta2 - 1; + + /* initialize Deep() */ + sdp4_deep_initialize( tle, m, &( m->deep_arg ) ); } -void sdp4_init(const predict_orbital_elements_t *tle, struct _sdp4 *m) +void sdp4_predict( const struct predict_sdp4 * m, + double tsince, + struct model_output * output ) { - m->lunarTermsDone = 0; - m->resonanceFlag = 0; - m->synchronousFlag = 0; - - //Calculate old TLE field values as used in the original sdp4 - double temp_tle = TWO_PI/MINUTES_PER_DAY/MINUTES_PER_DAY; - m->xnodeo = tle->right_ascension * M_PI / 180.0; - m->omegao = tle->argument_of_perigee * M_PI / 180.0; - m->xmo = tle->mean_anomaly * M_PI / 180.0; - m->xincl = tle->inclination * M_PI / 180.0; - m->eo = tle->eccentricity; - m->xno = tle->mean_motion*temp_tle*MINUTES_PER_DAY; - m->bstar = tle->bstar_drag_term / AE; - m->epoch = 1000.0*tle->epoch_year + tle->epoch_day; - - /* Recover original mean motion (xnodp) and */ - /* semimajor axis (aodp) from input elements. */ - double temp1, temp2, temp3, theta4, a1, a3ovk2, ao, c2, coef, coef1, x1m5th, xhdot1, del1, delo, eeta, eta, etasq, perigee, psisq, tsi, qoms24, s4, pinvsq; - - a1=pow(XKE/m->xno,TWO_THIRD); - m->deep_arg.cosio=cos(m->xincl); - m->deep_arg.theta2=m->deep_arg.cosio*m->deep_arg.cosio; - m->x3thm1=3*m->deep_arg.theta2-1; - m->deep_arg.eosq=m->eo*m->eo; - m->deep_arg.betao2=1-m->deep_arg.eosq; - m->deep_arg.betao=sqrt(m->deep_arg.betao2); - del1=1.5*CK2*m->x3thm1/(a1*a1*m->deep_arg.betao*m->deep_arg.betao2); - ao=a1*(1-del1*(0.5*TWO_THIRD+del1*(1+134/81*del1))); - delo=1.5*CK2*m->x3thm1/(ao*ao*m->deep_arg.betao*m->deep_arg.betao2); - m->deep_arg.xnodp=m->xno/(1+delo); - m->deep_arg.aodp=ao/(1-delo); - - /* For perigee below 156 km, the values */ - /* of s and qoms2t are altered. */ - - s4=S_DENSITY_PARAM; - qoms24=QOMS2T; - perigee=(m->deep_arg.aodp*(1-m->eo)-AE)*EARTH_RADIUS_KM_WGS84; - - if (perigee<156.0) - { - if (perigee<=98.0) - s4=20.0; - else - s4=perigee-78.0; - - qoms24=pow((120-s4)*AE/EARTH_RADIUS_KM_WGS84,4); - s4=s4/EARTH_RADIUS_KM_WGS84+AE; - } - - pinvsq=1/(m->deep_arg.aodp*m->deep_arg.aodp*m->deep_arg.betao2*m->deep_arg.betao2); - m->deep_arg.sing=sin(m->omegao); - m->deep_arg.cosg=cos(m->omegao); - tsi=1/(m->deep_arg.aodp-s4); - eta=m->deep_arg.aodp*m->eo*tsi; - etasq=eta*eta; - eeta=m->eo*eta; - psisq=fabs(1-etasq); - coef=qoms24*pow(tsi,4); - coef1=coef/pow(psisq,3.5); - c2=coef1*m->deep_arg.xnodp*(m->deep_arg.aodp*(1+1.5*etasq+eeta*(4+etasq))+0.75*CK2*tsi/psisq*m->x3thm1*(8+3*etasq*(8+etasq))); - m->c1=m->bstar*c2; - m->deep_arg.sinio=sin(m->xincl); - a3ovk2=-J3_HARMONIC_WGS72/CK2*pow(AE,3); - m->x1mth2=1-m->deep_arg.theta2; - m->c4=2*m->deep_arg.xnodp*coef1*m->deep_arg.aodp*m->deep_arg.betao2*(eta*(2+0.5*etasq)+m->eo*(0.5+2*etasq)-2*CK2*tsi/(m->deep_arg.aodp*psisq)*(-3*m->x3thm1*(1-2*eeta+etasq*(1.5-0.5*eeta))+0.75*m->x1mth2*(2*etasq-eeta*(1+etasq))*cos(2*m->omegao))); - theta4=m->deep_arg.theta2*m->deep_arg.theta2; - temp1=3*CK2*pinvsq*m->deep_arg.xnodp; - temp2=temp1*CK2*pinvsq; - temp3=1.25*CK4*pinvsq*pinvsq*m->deep_arg.xnodp; - m->deep_arg.xmdot=m->deep_arg.xnodp+0.5*temp1*m->deep_arg.betao*m->x3thm1+0.0625*temp2*m->deep_arg.betao*(13-78*m->deep_arg.theta2+137*theta4); - x1m5th=1-5*m->deep_arg.theta2; - m->deep_arg.omgdot=-0.5*temp1*x1m5th+0.0625*temp2*(7-114*m->deep_arg.theta2+395*theta4)+temp3*(3-36*m->deep_arg.theta2+49*theta4); - xhdot1=-temp1*m->deep_arg.cosio; - m->deep_arg.xnodot=xhdot1+(0.5*temp2*(4-19*m->deep_arg.theta2)+2*temp3*(3-7*m->deep_arg.theta2))*m->deep_arg.cosio; - m->xnodcf=3.5*m->deep_arg.betao2*xhdot1*m->c1; - m->t2cof=1.5*m->c1; - m->xlcof=0.125*a3ovk2*m->deep_arg.sinio*(3+5*m->deep_arg.cosio)/(1+m->deep_arg.cosio); - m->aycof=0.25*a3ovk2*m->deep_arg.sinio; - m->x7thm1=7*m->deep_arg.theta2-1; - - /* initialize Deep() */ - sdp4_deep_initialize(tle, m, &(m->deep_arg)); -} - -void sdp4_predict(const struct _sdp4 *m, double tsince, struct model_output *output) -{ - - int i; - double a, axn, ayn, aynl, beta, betal, capu, cos2u, cosepw, cosik, - cosnok, cosu, cosuk, ecose, elsq, epw, esine, pl, - rdot, - rdotk, rfdot, rfdotk, rk, sin2u, sinepw, sinik, sinnok, sinu, - sinuk, tempe, templ, tsq, u, uk, ux, uy, uz, vx, vy, vz, xl, - xlt, xmam, xmdf, xmx, xmy, xnoddf, xll, - r, - temp, tempa, temp1, - temp2, temp3, temp4, temp5, temp6; - double xnodek, xinck; - - /* Initialize dynamic part of deep_arg */ - deep_arg_dynamic_t deep_dyn; - deep_arg_dynamic_init(m, &deep_dyn); - - /* Update for secular gravity and atmospheric drag */ - xmdf=m->xmo+m->deep_arg.xmdot*tsince; - deep_dyn.omgadf=m->omegao+m->deep_arg.omgdot*tsince; - xnoddf=m->xnodeo+m->deep_arg.xnodot*tsince; - tsq=tsince*tsince; - deep_dyn.xnode=xnoddf+m->xnodcf*tsq; - tempa=1-m->c1*tsince; - tempe=m->bstar*m->c4*tsince; - templ=m->t2cof*tsq; - deep_dyn.xn=m->deep_arg.xnodp; - - /* Update for deep-space secular effects */ - deep_dyn.xll=xmdf; - deep_dyn.t=tsince; - - sdp4_deep(m, DPSecular, &m->deep_arg, &deep_dyn); - - xmdf=deep_dyn.xll; - a=pow(XKE/deep_dyn.xn,TWO_THIRD)*tempa*tempa; - deep_dyn.em=deep_dyn.em-tempe; - xmam=xmdf+m->deep_arg.xnodp*templ; - - /* Update for deep-space periodic effects */ - deep_dyn.xll=xmam; - - sdp4_deep(m, DPPeriodic,&m->deep_arg, &deep_dyn); - - xmam=deep_dyn.xll; - xl=xmam+deep_dyn.omgadf+deep_dyn.xnode; - beta=sqrt(1-deep_dyn.em*deep_dyn.em); - deep_dyn.xn=XKE/pow(a,1.5); - - /* Long period periodics */ - axn=deep_dyn.em*cos(deep_dyn.omgadf); - temp=1/(a*beta*beta); - xll=temp*m->xlcof*axn; - aynl=temp*m->aycof; - xlt=xl+xll; - ayn=deep_dyn.em*sin(deep_dyn.omgadf)+aynl; - - /* Solve Kepler's Equation */ - capu=FMod2p(xlt-deep_dyn.xnode); - temp2=capu; - i=0; - - do - { - sinepw=sin(temp2); - cosepw=cos(temp2); - temp3=axn*sinepw; - temp4=ayn*cosepw; - temp5=axn*cosepw; - temp6=ayn*sinepw; - epw=(capu-temp4+temp3-temp2)/(1-temp5-temp6)+temp2; - - if (fabs(epw-temp2)<=E6A) - break; - - temp2=epw; - - } while (i++<10); - - /* Short period preliminary quantities */ - ecose=temp5+temp6; - esine=temp3-temp4; - elsq=axn*axn+ayn*ayn; - temp=1-elsq; - pl=a*temp; - r=a*(1-ecose); - temp1=1/r; - rdot=XKE*sqrt(a)*esine*temp1; - rfdot=XKE*sqrt(pl)*temp1; - temp2=a*temp1; - betal=sqrt(temp); - temp3=1/(1+betal); - cosu=temp2*(cosepw-axn+ayn*esine*temp3); - sinu=temp2*(sinepw-ayn-axn*esine*temp3); - u=atan2(sinu,cosu); - sin2u=2*sinu*cosu; - cos2u=2*cosu*cosu-1; - temp=1/pl; - temp1=CK2*temp; - temp2=temp1*temp; - - /* Update for short periodics */ - rk=r*(1-1.5*temp2*betal*m->x3thm1)+0.5*temp1*m->x1mth2*cos2u; - uk=u-0.25*temp2*m->x7thm1*sin2u; - xnodek=deep_dyn.xnode+1.5*temp2*m->deep_arg.cosio*sin2u; - xinck=deep_dyn.xinc+1.5*temp2*m->deep_arg.cosio*m->deep_arg.sinio*cos2u; - rdotk=rdot-deep_dyn.xn*temp1*m->x1mth2*sin2u; - rfdotk=rfdot+deep_dyn.xn*temp1*(m->x1mth2*cos2u+1.5*m->x3thm1); - - /* Orientation vectors */ - sinuk=sin(uk); - cosuk=cos(uk); - sinik=sin(xinck); - cosik=cos(xinck); - sinnok=sin(xnodek); - cosnok=cos(xnodek); - xmx=-sinnok*cosik; - xmy=cosnok*cosik; - ux=xmx*sinuk+cosnok*cosuk; - uy=xmy*sinuk+sinnok*cosuk; - uz=sinik*sinuk; - vx=xmx*cosuk-cosnok*sinuk; - vy=xmy*cosuk-sinnok*sinuk; - vz=sinik*cosuk; - - /* Position and velocity */ - output->pos[0] = rk*ux; - output->pos[1] = rk*uy; - output->pos[2] = rk*uz; - output->vel[0] = rdotk*ux+rfdotk*vx; - output->vel[1] = rdotk*uy+rfdotk*vy; - output->vel[2] = rdotk*uz+rfdotk*vz; - - /* Phase in radians */ - double phase=xlt-deep_dyn.xnode-deep_dyn.omgadf+TWO_PI; - - if (phase<0.0) - phase+=TWO_PI; - - phase=FMod2p(phase); - output->phase = phase; - - output->omgadf = deep_dyn.omgadf; - output->xnodek = xnodek; - output->xinck = xinck; + int i; + double a, axn, ayn, aynl, beta, betal, capu, cos2u, cosepw, cosik, cosnok, + cosu, cosuk, ecose, elsq, epw, esine, pl, rdot, rdotk, rfdot, rfdotk, + rk, sin2u, sinepw, sinik, sinnok, sinu, sinuk, tempe, templ, tsq, u, uk, + ux, uy, uz, vx, vy, vz, xl, xlt, xmam, xmdf, xmx, xmy, xnoddf, xll, r, + temp, tempa, temp1, temp2, temp3, temp4, temp5, temp6; + double xnodek, xinck; + + /* Initialize dynamic part of deep_arg */ + deep_arg_dynamic_t deep_dyn; + deep_arg_dynamic_init( m, &deep_dyn ); + + /* Update for secular gravity and atmospheric drag */ + xmdf = m->xmo + m->deep_arg.xmdot * tsince; + deep_dyn.omgadf = m->omegao + m->deep_arg.omgdot * tsince; + xnoddf = m->xnodeo + m->deep_arg.xnodot * tsince; + tsq = tsince * tsince; + deep_dyn.xnode = xnoddf + m->xnodcf * tsq; + tempa = 1 - m->c1 * tsince; + tempe = m->bstar * m->c4 * tsince; + templ = m->t2cof * tsq; + deep_dyn.xn = m->deep_arg.xnodp; + + /* Update for deep-space secular effects */ + deep_dyn.xll = xmdf; + deep_dyn.t = tsince; + + sdp4_deep( m, DPSecular, &m->deep_arg, &deep_dyn ); + + xmdf = deep_dyn.xll; + a = pow( XKE / deep_dyn.xn, TWO_THIRD ) * tempa * tempa; + deep_dyn.em = deep_dyn.em - tempe; + xmam = xmdf + m->deep_arg.xnodp * templ; + + /* Update for deep-space periodic effects */ + deep_dyn.xll = xmam; + + sdp4_deep( m, DPPeriodic, &m->deep_arg, &deep_dyn ); + + xmam = deep_dyn.xll; + xl = xmam + deep_dyn.omgadf + deep_dyn.xnode; + beta = sqrt( 1 - deep_dyn.em * deep_dyn.em ); + deep_dyn.xn = XKE / pow( a, 1.5 ); + + /* Long period periodics */ + axn = deep_dyn.em * cos( deep_dyn.omgadf ); + temp = 1 / ( a * beta * beta ); + xll = temp * m->xlcof * axn; + aynl = temp * m->aycof; + xlt = xl + xll; + ayn = deep_dyn.em * sin( deep_dyn.omgadf ) + aynl; + + /* Solve Kepler's Equation */ + capu = FMod2p( xlt - deep_dyn.xnode ); + temp2 = capu; + i = 0; + + do + { + sinepw = sin( temp2 ); + cosepw = cos( temp2 ); + temp3 = axn * sinepw; + temp4 = ayn * cosepw; + temp5 = axn * cosepw; + temp6 = ayn * sinepw; + epw = ( capu - temp4 + temp3 - temp2 ) / ( 1 - temp5 - temp6 ) + temp2; + + if( fabs( epw - temp2 ) <= E6A ) + break; + + temp2 = epw; + + } while( i++ < 10 ); + + /* Short period preliminary quantities */ + ecose = temp5 + temp6; + esine = temp3 - temp4; + elsq = axn * axn + ayn * ayn; + temp = 1 - elsq; + pl = a * temp; + r = a * ( 1 - ecose ); + temp1 = 1 / r; + rdot = XKE * sqrt( a ) * esine * temp1; + rfdot = XKE * sqrt( pl ) * temp1; + temp2 = a * temp1; + betal = sqrt( temp ); + temp3 = 1 / ( 1 + betal ); + cosu = temp2 * ( cosepw - axn + ayn * esine * temp3 ); + sinu = temp2 * ( sinepw - ayn - axn * esine * temp3 ); + u = atan2( sinu, cosu ); + sin2u = 2 * sinu * cosu; + cos2u = 2 * cosu * cosu - 1; + temp = 1 / pl; + temp1 = CK2 * temp; + temp2 = temp1 * temp; + + /* Update for short periodics */ + rk = r * ( 1 - 1.5 * temp2 * betal * m->x3thm1 ) + + 0.5 * temp1 * m->x1mth2 * cos2u; + uk = u - 0.25 * temp2 * m->x7thm1 * sin2u; + xnodek = deep_dyn.xnode + 1.5 * temp2 * m->deep_arg.cosio * sin2u; + xinck = deep_dyn.xinc + + 1.5 * temp2 * m->deep_arg.cosio * m->deep_arg.sinio * cos2u; + rdotk = rdot - deep_dyn.xn * temp1 * m->x1mth2 * sin2u; + rfdotk = rfdot + + deep_dyn.xn * temp1 * ( m->x1mth2 * cos2u + 1.5 * m->x3thm1 ); + + /* Orientation vectors */ + sinuk = sin( uk ); + cosuk = cos( uk ); + sinik = sin( xinck ); + cosik = cos( xinck ); + sinnok = sin( xnodek ); + cosnok = cos( xnodek ); + xmx = -sinnok * cosik; + xmy = cosnok * cosik; + ux = xmx * sinuk + cosnok * cosuk; + uy = xmy * sinuk + sinnok * cosuk; + uz = sinik * sinuk; + vx = xmx * cosuk - cosnok * sinuk; + vy = xmy * cosuk - sinnok * sinuk; + vz = sinik * cosuk; + + /* Position and velocity */ + output->pos[ 0 ] = rk * ux; + output->pos[ 1 ] = rk * uy; + output->pos[ 2 ] = rk * uz; + output->vel[ 0 ] = rdotk * ux + rfdotk * vx; + output->vel[ 1 ] = rdotk * uy + rfdotk * vy; + output->vel[ 2 ] = rdotk * uz + rfdotk * vz; + + /* Phase in radians */ + double phase = xlt - deep_dyn.xnode - deep_dyn.omgadf + TWO_PI; + + if( phase < 0.0 ) + phase += TWO_PI; + + phase = FMod2p( phase ); + output->phase = phase; + + output->omgadf = deep_dyn.omgadf; + output->xnodek = xnodek; + output->xinck = xinck; } /** @@ -285,546 +306,625 @@ void sdp4_predict(const struct _sdp4 *m, double tsince, struct model_output *out * \param deep_arg Deep arg * \copyright GPLv2+ **/ -double ThetaG(double epoch, deep_arg_fixed_t *deep_arg) +static double ThetaG( double epoch, deep_arg_fixed_t * deep_arg ) { - double year, day, UT, jd, TU, GMST, ThetaG; - - /* Modification to support Y2K */ - /* Valid 1957 through 2056 */ - - day=modf(epoch*1E-3,&year)*1E3; - - if (year<57) - year+=2000; - else - year+=1900; - - UT=modf(day,&day); - jd=Julian_Date_of_Year(year)+day; - TU=(jd-2451545.0)/36525; - GMST=24110.54841+TU*(8640184.812866+TU*(0.093104-TU*6.2E-6)); - GMST=fmod(GMST+SECONDS_PER_DAY*EARTH_ROTATIONS_PER_SIDERIAL_DAY*UT,SECONDS_PER_DAY); - ThetaG = 2*M_PI*GMST/SECONDS_PER_DAY; - deep_arg->ds50=jd-2433281.5+UT; - ThetaG=FMod2p(6.3003880987*deep_arg->ds50+1.72944494); - - return ThetaG; + double year, day, UT, jd, TU, GMST, ThetaG; + + /* Modification to support Y2K */ + /* Valid 1957 through 2056 */ + + day = modf( epoch * 1E-3, &year ) * 1E3; + + if( year < 57 ) + year += 2000; + else + year += 1900; + + UT = modf( day, &day ); + jd = Julian_Date_of_Year( year ) + day; + TU = ( jd - 2451545.0 ) / 36525; + GMST = 24110.54841 + + TU * ( 8640184.812866 + TU * ( 0.093104 - TU * 6.2E-6 ) ); + GMST = fmod( GMST + SECONDS_PER_DAY * EARTH_ROTATIONS_PER_SIDERIAL_DAY * UT, + SECONDS_PER_DAY ); + ThetaG = 2 * M_PI * GMST / SECONDS_PER_DAY; + deep_arg->ds50 = jd - 2433281.5 + UT; + ThetaG = FMod2p( 6.3003880987 * deep_arg->ds50 + 1.72944494 ); + + return ThetaG; } -void sdp4_deep_initialize(const predict_orbital_elements_t *tle, struct _sdp4 *m, deep_arg_fixed_t *deep_arg) +void sdp4_deep_initialize( const predict_orbital_elements_t * tle, + struct predict_sdp4 * m, + deep_arg_fixed_t * deep_arg ) { - double a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, ainv2, aqnv, - sgh, sini2, sh, si, day, bfact, c, - cc, cosq, ctem, f322, zx, zy, eoc, eq, - f220, f221, f311, f321, f330, f441, f442, f522, f523, - f542, f543, g200, g201, g211, s1, s2, s3, s4, s5, s6, s7, - se, g300, g310, g322, g410, g422, g520, g521, g532, - g533, gam, sinq, sl, stem, temp, temp1, x1, - x2, x3, x4, x5, x6, x7, x8, xmao, - xno2, xnodce, xnoi, xpidot, z1, z11, z12, z13, z2, - z21, z22, z23, z3, z31, z32, z33, ze, zn, zsing, - zsinh, zsini, zcosg, zcosh, zcosi; - - /* Entrance for deep space initialization */ - m->thgr=ThetaG(m->epoch,deep_arg); - eq=m->eo; - m->xnq=deep_arg->xnodp; - aqnv=1/deep_arg->aodp; - m->xqncl=m->xincl; - xmao=m->xmo; - xpidot=deep_arg->omgdot+deep_arg->xnodot; - sinq=sin(m->xnodeo); - cosq=cos(m->xnodeo); - m->omegaq=m->omegao; - - /* Initialize lunar solar terms */ - day=deep_arg->ds50+18261.5; /* Days since 1900 Jan 0.5 */ - - m->preep=day; - xnodce=4.5236020-9.2422029E-4*day; - stem=sin(xnodce); - ctem=cos(xnodce); - m->zcosil=0.91375164-0.03568096*ctem; - m->zsinil=sqrt(1-m->zcosil*m->zcosil); - m->zsinhl=0.089683511*stem/m->zsinil; - m->zcoshl=sqrt(1-m->zsinhl*m->zsinhl); - c=4.7199672+0.22997150*day; - gam=5.8351514+0.0019443680*day; - m->zmol=FMod2p(c-gam); - zx=0.39785416*stem/m->zsinil; - zy=m->zcoshl*ctem+0.91744867*m->zsinhl*stem; - zx=atan2(zx,zy); - zx=gam+zx-xnodce; - m->zcosgl=cos(zx); - m->zsingl=sin(zx); - m->zmos=6.2565837+0.017201977*day; - m->zmos=FMod2p(m->zmos); - - /* Do solar terms */ - zcosg=ZCOSGS; - zsing=ZSINGS; - zcosi=ZCOSIS; - zsini=ZSINIS; - zcosh=cosq; - zsinh= sinq; - cc=C1SS; - zn=ZNS; - ze=ZES; - /* zmo=m->zmos; */ - xnoi=1/m->xnq; - - /* Loop breaks when Solar terms are done a second */ - /* time, after Lunar terms are initialized */ - - for (;;) - { - /* Solar terms done again after Lunar terms are done */ - a1=zcosg*zcosh+zsing*zcosi*zsinh; - a3=-zsing*zcosh+zcosg*zcosi*zsinh; - a7=-zcosg*zsinh+zsing*zcosi*zcosh; - a8=zsing*zsini; - a9=zsing*zsinh+zcosg*zcosi*zcosh; - a10=zcosg*zsini; - a2=deep_arg->cosio*a7+deep_arg->sinio*a8; - a4=deep_arg->cosio*a9+deep_arg->sinio*a10; - a5=-deep_arg->sinio*a7+deep_arg->cosio*a8; - a6=-deep_arg->sinio*a9+deep_arg->cosio*a10; - x1=a1*deep_arg->cosg+a2*deep_arg->sing; - x2=a3*deep_arg->cosg+a4*deep_arg->sing; - x3=-a1*deep_arg->sing+a2*deep_arg->cosg; - x4=-a3*deep_arg->sing+a4*deep_arg->cosg; - x5=a5*deep_arg->sing; - x6=a6*deep_arg->sing; - x7=a5*deep_arg->cosg; - x8=a6*deep_arg->cosg; - z31=12*x1*x1-3*x3*x3; - z32=24*x1*x2-6*x3*x4; - z33=12*x2*x2-3*x4*x4; - z1=3*(a1*a1+a2*a2)+z31*deep_arg->eosq; - z2=6*(a1*a3+a2*a4)+z32*deep_arg->eosq; - z3=3*(a3*a3+a4*a4)+z33*deep_arg->eosq; - z11=-6*a1*a5+deep_arg->eosq*(-24*x1*x7-6*x3*x5); - z12=-6*(a1*a6+a3*a5)+deep_arg->eosq*(-24*(x2*x7+x1*x8)-6*(x3*x6+x4*x5)); - z13=-6*a3*a6+deep_arg->eosq*(-24*x2*x8-6*x4*x6); - z21=6*a2*a5+deep_arg->eosq*(24*x1*x5-6*x3*x7); - z22=6*(a4*a5+a2*a6)+deep_arg->eosq*(24*(x2*x5+x1*x6)-6*(x4*x7+x3*x8)); - z23=6*a4*a6+deep_arg->eosq*(24*x2*x6-6*x4*x8); - z1=z1+z1+deep_arg->betao2*z31; - z2=z2+z2+deep_arg->betao2*z32; - z3=z3+z3+deep_arg->betao2*z33; - s3=cc*xnoi; - s2=-0.5*s3/deep_arg->betao; - s4=s3*deep_arg->betao; - s1=-15*eq*s4; - s5=x1*x3+x2*x4; - s6=x2*x3+x1*x4; - s7=x2*x4-x1*x3; - se=s1*zn*s5; - si=s2*zn*(z11+z13); - sl=-zn*s3*(z1+z3-14-6*deep_arg->eosq); - sgh=s4*zn*(z31+z33-6); - sh=-zn*s2*(z21+z23); - - if (m->xqncl<5.2359877E-2) - sh=0; - - m->ee2=2*s1*s6; - m->e3=2*s1*s7; - m->xi2=2*s2*z12; - m->xi3=2*s2*(z13-z11); - m->xl2=-2*s3*z2; - m->xl3=-2*s3*(z3-z1); - m->xl4=-2*s3*(-21-9*deep_arg->eosq)*ze; - m->xgh2=2*s4*z32; - m->xgh3=2*s4*(z33-z31); - m->xgh4=-18*s4*ze; - m->xh2=-2*s2*z22; - m->xh3=-2*s2*(z23-z21); - - //Skip lunar terms? - if (m->lunarTermsDone) { - break; - } - - /* Do lunar terms */ - m->sse=se; - m->ssi=si; - m->ssl=sl; - m->ssh=sh/deep_arg->sinio; - m->ssg=sgh-deep_arg->cosio*m->ssh; - m->se2=m->ee2; - m->si2=m->xi2; - m->sl2=m->xl2; - m->sgh2=m->xgh2; - m->sh2=m->xh2; - m->se3=m->e3; - m->si3=m->xi3; - m->sl3=m->xl3; - m->sgh3=m->xgh3; - m->sh3=m->xh3; - m->sl4=m->xl4; - m->sgh4=m->xgh4; - zcosg=m->zcosgl; - zsing=m->zsingl; - zcosi=m->zcosil; - zsini=m->zsinil; - zcosh=m->zcoshl*cosq+m->zsinhl*sinq; - zsinh=sinq*m->zcoshl-cosq*m->zsinhl; - zn=ZNL; - cc=C1L; - ze=ZEL; - /* zmo=m->zmol; */ - //Set lunarTermsDone flag: - m->lunarTermsDone = true; - } - - m->sse=m->sse+se; - m->ssi=m->ssi+si; - m->ssl=m->ssl+sl; - m->ssg=m->ssg+sgh-deep_arg->cosio/deep_arg->sinio*sh; - m->ssh=m->ssh+sh/deep_arg->sinio; - - /* Geopotential resonance initialization for 12 hour orbits */ - m->resonanceFlag = 0; - m->synchronousFlag = 0; - - if (!((m->xnq<0.0052359877) && (m->xnq>0.0034906585))) - { - if ((m->xnq<0.00826) || (m->xnq>0.00924)) - return; - - if (eq<0.5) - return; - - m->resonanceFlag = 1; - eoc=eq*deep_arg->eosq; - g201=-0.306-(eq-0.64)*0.440; - - if (eq<=0.65) - { - g211=3.616-13.247*eq+16.290*deep_arg->eosq; - g310=-19.302+117.390*eq-228.419*deep_arg->eosq+156.591*eoc; - g322=-18.9068+109.7927*eq-214.6334*deep_arg->eosq+146.5816*eoc; - g410=-41.122+242.694*eq-471.094*deep_arg->eosq+313.953*eoc; - g422=-146.407+841.880*eq-1629.014*deep_arg->eosq+1083.435 * eoc; - g520=-532.114+3017.977*eq-5740*deep_arg->eosq+3708.276*eoc; - } - - else - { - g211=-72.099+331.819*eq-508.738*deep_arg->eosq+266.724*eoc; - g310=-346.844+1582.851*eq-2415.925*deep_arg->eosq+1246.113*eoc; - g322=-342.585+1554.908*eq-2366.899*deep_arg->eosq+1215.972*eoc; - g410=-1052.797+4758.686*eq-7193.992*deep_arg->eosq+3651.957*eoc; - g422=-3581.69+16178.11*eq-24462.77*deep_arg->eosq+12422.52*eoc; - - if (eq<=0.715) - g520=1464.74-4664.75*eq+3763.64*deep_arg->eosq; - - else - g520=-5149.66+29936.92*eq-54087.36*deep_arg->eosq+31324.56*eoc; - } - - if (eq<0.7) - { - g533=-919.2277+4988.61*eq-9064.77*deep_arg->eosq+5542.21*eoc; - g521=-822.71072+4568.6173*eq-8491.4146*deep_arg->eosq+5337.524*eoc; - g532=-853.666+4690.25*eq-8624.77*deep_arg->eosq+5341.4*eoc; - } - - else - { - g533=-37995.78+161616.52*eq-229838.2*deep_arg->eosq+109377.94*eoc; - g521 =-51752.104+218913.95*eq-309468.16*deep_arg->eosq+146349.42*eoc; - g532 =-40023.88+170470.89*eq-242699.48*deep_arg->eosq+115605.82*eoc; - } - - sini2=deep_arg->sinio*deep_arg->sinio; - f220=0.75*(1+2*deep_arg->cosio+deep_arg->theta2); - f221=1.5*sini2; - f321=1.875*deep_arg->sinio*(1-2*deep_arg->cosio-3*deep_arg->theta2); - f322=-1.875*deep_arg->sinio*(1+2*deep_arg->cosio-3*deep_arg->theta2); - f441=35*sini2*f220; - f442=39.3750*sini2*sini2; - f522=9.84375*deep_arg->sinio*(sini2*(1-2*deep_arg->cosio-5*deep_arg->theta2)+0.33333333*(-2+4*deep_arg->cosio+6*deep_arg->theta2)); - f523=deep_arg->sinio*(4.92187512*sini2*(-2-4*deep_arg->cosio+10*deep_arg->theta2)+6.56250012*(1+2*deep_arg->cosio-3*deep_arg->theta2)); - f542=29.53125*deep_arg->sinio*(2-8*deep_arg->cosio+deep_arg->theta2*(-12+8*deep_arg->cosio+10*deep_arg->theta2)); - f543=29.53125*deep_arg->sinio*(-2-8*deep_arg->cosio+deep_arg->theta2*(12+8*deep_arg->cosio-10*deep_arg->theta2)); - xno2=m->xnq*m->xnq; - ainv2=aqnv*aqnv; - temp1=3*xno2*ainv2; - temp=temp1*ROOT22; - m->d2201=temp*f220*g201; - m->d2211=temp*f221*g211; - temp1=temp1*aqnv; - temp=temp1*ROOT32; - m->d3210=temp*f321*g310; - m->d3222=temp*f322*g322; - temp1=temp1*aqnv; - temp=2*temp1*ROOT44; - m->d4410=temp*f441*g410; - m->d4422=temp*f442*g422; - temp1=temp1*aqnv; - temp=temp1*ROOT52; - m->d5220=temp*f522*g520; - m->d5232=temp*f523*g532; - temp=2*temp1*ROOT54; - m->d5421=temp*f542*g521; - m->d5433=temp*f543*g533; - m->xlamo=xmao+m->xnodeo+m->xnodeo-m->thgr-m->thgr; - bfact=deep_arg->xmdot+deep_arg->xnodot+deep_arg->xnodot-THDT-THDT; - bfact=bfact+m->ssl+m->ssh+m->ssh; - } - - else - { - m->resonanceFlag = 1; - m->synchronousFlag = 1; - - /* Synchronous resonance terms initialization */ - g200=1+deep_arg->eosq*(-2.5+0.8125*deep_arg->eosq); - g310=1+2*deep_arg->eosq; - g300=1+deep_arg->eosq*(-6+6.60937*deep_arg->eosq); - f220=0.75*(1+deep_arg->cosio)*(1+deep_arg->cosio); - f311=0.9375*deep_arg->sinio*deep_arg->sinio*(1+3*deep_arg->cosio)-0.75*(1+deep_arg->cosio); - f330=1+deep_arg->cosio; - f330=1.875*f330*f330*f330; - m->del1=3*m->xnq*m->xnq*aqnv*aqnv; - m->del2=2*m->del1*f220*g200*Q22; - m->del3=3*m->del1*f330*g300*Q33*aqnv; - m->del1=m->del1*f311*g310*Q31*aqnv; - m->fasx2=0.13130908; - m->fasx4=2.8843198; - m->fasx6=0.37448087; - m->xlamo=xmao+m->xnodeo+m->omegao-m->thgr; - bfact=deep_arg->xmdot+xpidot-THDT; - bfact=bfact+m->ssl+m->ssg+m->ssh; - } - - m->xfact=bfact-m->xnq; - - /* Initialize integrator */ - m->stepp=720; - m->stepn=-720; - m->step2=259200; - - return; + double a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, ainv2, aqnv, sgh, sini2, sh, + si, day, bfact, c, cc, cosq, ctem, f322, zx, zy, eoc, eq, f220, f221, + f311, f321, f330, f441, f442, f522, f523, f542, f543, g200, g201, g211, + s1, s2, s3, s4, s5, s6, s7, se, g300, g310, g322, g410, g422, g520, + g521, g532, g533, gam, sinq, sl, stem, temp, temp1, x1, x2, x3, x4, x5, + x6, x7, x8, xmao, xno2, xnodce, xnoi, xpidot, z1, z11, z12, z13, z2, + z21, z22, z23, z3, z31, z32, z33, ze, zn, zsing, zsinh, zsini, zcosg, + zcosh, zcosi; + + /* Entrance for deep space initialization */ + m->thgr = ThetaG( m->epoch, deep_arg ); + eq = m->eo; + m->xnq = deep_arg->xnodp; + aqnv = 1 / deep_arg->aodp; + m->xqncl = m->xincl; + xmao = m->xmo; + xpidot = deep_arg->omgdot + deep_arg->xnodot; + sinq = sin( m->xnodeo ); + cosq = cos( m->xnodeo ); + m->omegaq = m->omegao; + + /* Initialize lunar solar terms */ + day = deep_arg->ds50 + 18261.5; /* Days since 1900 Jan 0.5 */ + + m->preep = day; + xnodce = 4.5236020 - 9.2422029E-4 * day; + stem = sin( xnodce ); + ctem = cos( xnodce ); + m->zcosil = 0.91375164 - 0.03568096 * ctem; + m->zsinil = sqrt( 1 - m->zcosil * m->zcosil ); + m->zsinhl = 0.089683511 * stem / m->zsinil; + m->zcoshl = sqrt( 1 - m->zsinhl * m->zsinhl ); + c = 4.7199672 + 0.22997150 * day; + gam = 5.8351514 + 0.0019443680 * day; + m->zmol = FMod2p( c - gam ); + zx = 0.39785416 * stem / m->zsinil; + zy = m->zcoshl * ctem + 0.91744867 * m->zsinhl * stem; + zx = atan2( zx, zy ); + zx = gam + zx - xnodce; + m->zcosgl = cos( zx ); + m->zsingl = sin( zx ); + m->zmos = 6.2565837 + 0.017201977 * day; + m->zmos = FMod2p( m->zmos ); + + /* Do solar terms */ + zcosg = ZCOSGS; + zsing = ZSINGS; + zcosi = ZCOSIS; + zsini = ZSINIS; + zcosh = cosq; + zsinh = sinq; + cc = C1SS; + zn = ZNS; + ze = ZES; + /* zmo=m->zmos; */ + xnoi = 1 / m->xnq; + + /* Loop breaks when Solar terms are done a second */ + /* time, after Lunar terms are initialized */ + + for( ;; ) + { + /* Solar terms done again after Lunar terms are done */ + a1 = zcosg * zcosh + zsing * zcosi * zsinh; + a3 = -zsing * zcosh + zcosg * zcosi * zsinh; + a7 = -zcosg * zsinh + zsing * zcosi * zcosh; + a8 = zsing * zsini; + a9 = zsing * zsinh + zcosg * zcosi * zcosh; + a10 = zcosg * zsini; + a2 = deep_arg->cosio * a7 + deep_arg->sinio * a8; + a4 = deep_arg->cosio * a9 + deep_arg->sinio * a10; + a5 = -deep_arg->sinio * a7 + deep_arg->cosio * a8; + a6 = -deep_arg->sinio * a9 + deep_arg->cosio * a10; + x1 = a1 * deep_arg->cosg + a2 * deep_arg->sing; + x2 = a3 * deep_arg->cosg + a4 * deep_arg->sing; + x3 = -a1 * deep_arg->sing + a2 * deep_arg->cosg; + x4 = -a3 * deep_arg->sing + a4 * deep_arg->cosg; + x5 = a5 * deep_arg->sing; + x6 = a6 * deep_arg->sing; + x7 = a5 * deep_arg->cosg; + x8 = a6 * deep_arg->cosg; + z31 = 12 * x1 * x1 - 3 * x3 * x3; + z32 = 24 * x1 * x2 - 6 * x3 * x4; + z33 = 12 * x2 * x2 - 3 * x4 * x4; + z1 = 3 * ( a1 * a1 + a2 * a2 ) + z31 * deep_arg->eosq; + z2 = 6 * ( a1 * a3 + a2 * a4 ) + z32 * deep_arg->eosq; + z3 = 3 * ( a3 * a3 + a4 * a4 ) + z33 * deep_arg->eosq; + z11 = -6 * a1 * a5 + deep_arg->eosq * ( -24 * x1 * x7 - 6 * x3 * x5 ); + z12 = -6 * ( a1 * a6 + a3 * a5 ) + + deep_arg->eosq * + ( -24 * ( x2 * x7 + x1 * x8 ) - 6 * ( x3 * x6 + x4 * x5 ) ); + z13 = -6 * a3 * a6 + deep_arg->eosq * ( -24 * x2 * x8 - 6 * x4 * x6 ); + z21 = 6 * a2 * a5 + deep_arg->eosq * ( 24 * x1 * x5 - 6 * x3 * x7 ); + z22 = 6 * ( a4 * a5 + a2 * a6 ) + + deep_arg->eosq * + ( 24 * ( x2 * x5 + x1 * x6 ) - 6 * ( x4 * x7 + x3 * x8 ) ); + z23 = 6 * a4 * a6 + deep_arg->eosq * ( 24 * x2 * x6 - 6 * x4 * x8 ); + z1 = z1 + z1 + deep_arg->betao2 * z31; + z2 = z2 + z2 + deep_arg->betao2 * z32; + z3 = z3 + z3 + deep_arg->betao2 * z33; + s3 = cc * xnoi; + s2 = -0.5 * s3 / deep_arg->betao; + s4 = s3 * deep_arg->betao; + s1 = -15 * eq * s4; + s5 = x1 * x3 + x2 * x4; + s6 = x2 * x3 + x1 * x4; + s7 = x2 * x4 - x1 * x3; + se = s1 * zn * s5; + si = s2 * zn * ( z11 + z13 ); + sl = -zn * s3 * ( z1 + z3 - 14 - 6 * deep_arg->eosq ); + sgh = s4 * zn * ( z31 + z33 - 6 ); + sh = -zn * s2 * ( z21 + z23 ); + + if( m->xqncl < 5.2359877E-2 ) + sh = 0; + + m->ee2 = 2 * s1 * s6; + m->e3 = 2 * s1 * s7; + m->xi2 = 2 * s2 * z12; + m->xi3 = 2 * s2 * ( z13 - z11 ); + m->xl2 = -2 * s3 * z2; + m->xl3 = -2 * s3 * ( z3 - z1 ); + m->xl4 = -2 * s3 * ( -21 - 9 * deep_arg->eosq ) * ze; + m->xgh2 = 2 * s4 * z32; + m->xgh3 = 2 * s4 * ( z33 - z31 ); + m->xgh4 = -18 * s4 * ze; + m->xh2 = -2 * s2 * z22; + m->xh3 = -2 * s2 * ( z23 - z21 ); + + // Skip lunar terms? + if( m->lunarTermsDone ) + { + break; + } + + /* Do lunar terms */ + m->sse = se; + m->ssi = si; + m->ssl = sl; + m->ssh = sh / deep_arg->sinio; + m->ssg = sgh - deep_arg->cosio * m->ssh; + m->se2 = m->ee2; + m->si2 = m->xi2; + m->sl2 = m->xl2; + m->sgh2 = m->xgh2; + m->sh2 = m->xh2; + m->se3 = m->e3; + m->si3 = m->xi3; + m->sl3 = m->xl3; + m->sgh3 = m->xgh3; + m->sh3 = m->xh3; + m->sl4 = m->xl4; + m->sgh4 = m->xgh4; + zcosg = m->zcosgl; + zsing = m->zsingl; + zcosi = m->zcosil; + zsini = m->zsinil; + zcosh = m->zcoshl * cosq + m->zsinhl * sinq; + zsinh = sinq * m->zcoshl - cosq * m->zsinhl; + zn = ZNL; + cc = C1L; + ze = ZEL; + /* zmo=m->zmol; */ + // Set lunarTermsDone flag: + m->lunarTermsDone = true; + } + + m->sse = m->sse + se; + m->ssi = m->ssi + si; + m->ssl = m->ssl + sl; + m->ssg = m->ssg + sgh - deep_arg->cosio / deep_arg->sinio * sh; + m->ssh = m->ssh + sh / deep_arg->sinio; + + /* Geopotential resonance initialization for 12 hour orbits */ + m->resonanceFlag = 0; + m->synchronousFlag = 0; + + if( !( ( m->xnq < 0.0052359877 ) && ( m->xnq > 0.0034906585 ) ) ) + { + if( ( m->xnq < 0.00826 ) || ( m->xnq > 0.00924 ) ) + return; + + if( eq < 0.5 ) + return; + + m->resonanceFlag = 1; + eoc = eq * deep_arg->eosq; + g201 = -0.306 - ( eq - 0.64 ) * 0.440; + + if( eq <= 0.65 ) + { + g211 = 3.616 - 13.247 * eq + 16.290 * deep_arg->eosq; + g310 = -19.302 + 117.390 * eq - 228.419 * deep_arg->eosq + + 156.591 * eoc; + g322 = -18.9068 + 109.7927 * eq - 214.6334 * deep_arg->eosq + + 146.5816 * eoc; + g410 = -41.122 + 242.694 * eq - 471.094 * deep_arg->eosq + + 313.953 * eoc; + g422 = -146.407 + 841.880 * eq - 1629.014 * deep_arg->eosq + + 1083.435 * eoc; + g520 = -532.114 + 3017.977 * eq - 5740 * deep_arg->eosq + + 3708.276 * eoc; + } + + else + { + g211 = -72.099 + 331.819 * eq - 508.738 * deep_arg->eosq + + 266.724 * eoc; + g310 = -346.844 + 1582.851 * eq - 2415.925 * deep_arg->eosq + + 1246.113 * eoc; + g322 = -342.585 + 1554.908 * eq - 2366.899 * deep_arg->eosq + + 1215.972 * eoc; + g410 = -1052.797 + 4758.686 * eq - 7193.992 * deep_arg->eosq + + 3651.957 * eoc; + g422 = -3581.69 + 16178.11 * eq - 24462.77 * deep_arg->eosq + + 12422.52 * eoc; + + if( eq <= 0.715 ) + g520 = 1464.74 - 4664.75 * eq + 3763.64 * deep_arg->eosq; + + else + g520 = -5149.66 + 29936.92 * eq - 54087.36 * deep_arg->eosq + + 31324.56 * eoc; + } + + if( eq < 0.7 ) + { + g533 = -919.2277 + 4988.61 * eq - 9064.77 * deep_arg->eosq + + 5542.21 * eoc; + g521 = -822.71072 + 4568.6173 * eq - 8491.4146 * deep_arg->eosq + + 5337.524 * eoc; + g532 = -853.666 + 4690.25 * eq - 8624.77 * deep_arg->eosq + + 5341.4 * eoc; + } + + else + { + g533 = -37995.78 + 161616.52 * eq - 229838.2 * deep_arg->eosq + + 109377.94 * eoc; + g521 = -51752.104 + 218913.95 * eq - 309468.16 * deep_arg->eosq + + 146349.42 * eoc; + g532 = -40023.88 + 170470.89 * eq - 242699.48 * deep_arg->eosq + + 115605.82 * eoc; + } + + sini2 = deep_arg->sinio * deep_arg->sinio; + f220 = 0.75 * ( 1 + 2 * deep_arg->cosio + deep_arg->theta2 ); + f221 = 1.5 * sini2; + f321 = 1.875 * deep_arg->sinio * + ( 1 - 2 * deep_arg->cosio - 3 * deep_arg->theta2 ); + f322 = -1.875 * deep_arg->sinio * + ( 1 + 2 * deep_arg->cosio - 3 * deep_arg->theta2 ); + f441 = 35 * sini2 * f220; + f442 = 39.3750 * sini2 * sini2; + f522 = 9.84375 * deep_arg->sinio * + ( sini2 * ( 1 - 2 * deep_arg->cosio - 5 * deep_arg->theta2 ) + + 0.33333333 * + ( -2 + 4 * deep_arg->cosio + 6 * deep_arg->theta2 ) ); + f523 = deep_arg->sinio * + ( 4.92187512 * sini2 * + ( -2 - 4 * deep_arg->cosio + 10 * deep_arg->theta2 ) + + 6.56250012 * + ( 1 + 2 * deep_arg->cosio - 3 * deep_arg->theta2 ) ); + f542 = 29.53125 * deep_arg->sinio * + ( 2 - 8 * deep_arg->cosio + + deep_arg->theta2 * + ( -12 + 8 * deep_arg->cosio + 10 * deep_arg->theta2 ) ); + f543 = 29.53125 * deep_arg->sinio * + ( -2 - 8 * deep_arg->cosio + + deep_arg->theta2 * + ( 12 + 8 * deep_arg->cosio - 10 * deep_arg->theta2 ) ); + xno2 = m->xnq * m->xnq; + ainv2 = aqnv * aqnv; + temp1 = 3 * xno2 * ainv2; + temp = temp1 * ROOT22; + m->d2201 = temp * f220 * g201; + m->d2211 = temp * f221 * g211; + temp1 = temp1 * aqnv; + temp = temp1 * ROOT32; + m->d3210 = temp * f321 * g310; + m->d3222 = temp * f322 * g322; + temp1 = temp1 * aqnv; + temp = 2 * temp1 * ROOT44; + m->d4410 = temp * f441 * g410; + m->d4422 = temp * f442 * g422; + temp1 = temp1 * aqnv; + temp = temp1 * ROOT52; + m->d5220 = temp * f522 * g520; + m->d5232 = temp * f523 * g532; + temp = 2 * temp1 * ROOT54; + m->d5421 = temp * f542 * g521; + m->d5433 = temp * f543 * g533; + m->xlamo = xmao + m->xnodeo + m->xnodeo - m->thgr - m->thgr; + bfact = deep_arg->xmdot + deep_arg->xnodot + deep_arg->xnodot - THDT - + THDT; + bfact = bfact + m->ssl + m->ssh + m->ssh; + } + + else + { + m->resonanceFlag = 1; + m->synchronousFlag = 1; + + /* Synchronous resonance terms initialization */ + g200 = 1 + deep_arg->eosq * ( -2.5 + 0.8125 * deep_arg->eosq ); + g310 = 1 + 2 * deep_arg->eosq; + g300 = 1 + deep_arg->eosq * ( -6 + 6.60937 * deep_arg->eosq ); + f220 = 0.75 * ( 1 + deep_arg->cosio ) * ( 1 + deep_arg->cosio ); + f311 = 0.9375 * deep_arg->sinio * deep_arg->sinio * + ( 1 + 3 * deep_arg->cosio ) - + 0.75 * ( 1 + deep_arg->cosio ); + f330 = 1 + deep_arg->cosio; + f330 = 1.875 * f330 * f330 * f330; + m->del1 = 3 * m->xnq * m->xnq * aqnv * aqnv; + m->del2 = 2 * m->del1 * f220 * g200 * Q22; + m->del3 = 3 * m->del1 * f330 * g300 * Q33 * aqnv; + m->del1 = m->del1 * f311 * g310 * Q31 * aqnv; + m->fasx2 = 0.13130908; + m->fasx4 = 2.8843198; + m->fasx6 = 0.37448087; + m->xlamo = xmao + m->xnodeo + m->omegao - m->thgr; + bfact = deep_arg->xmdot + xpidot - THDT; + bfact = bfact + m->ssl + m->ssg + m->ssh; + } + + m->xfact = bfact - m->xnq; + + /* Initialize integrator */ + m->stepp = 720; + m->stepn = -720; + m->step2 = 259200; + + return; } -void deep_arg_dynamic_init(const struct _sdp4 *m, deep_arg_dynamic_t *deep_dyn){ - deep_dyn->savtsn=1E20; - deep_dyn->loopFlag = 0; - deep_dyn->epochRestartFlag = 0; - deep_dyn->xli=m->xlamo; - deep_dyn->xni=m->xnq; - deep_dyn->atime=0; +void deep_arg_dynamic_init( const struct predict_sdp4 * m, + deep_arg_dynamic_t * deep_dyn ) +{ + deep_dyn->savtsn = 1E20; + deep_dyn->loopFlag = 0; + deep_dyn->epochRestartFlag = 0; + deep_dyn->xli = m->xlamo; + deep_dyn->xni = m->xnq; + deep_dyn->atime = 0; } -void sdp4_deep(const struct _sdp4 *m, int ientry, const deep_arg_fixed_t * deep_arg, deep_arg_dynamic_t *deep_dyn) +void sdp4_deep( const struct predict_sdp4 * m, + int ientry, + const deep_arg_fixed_t * deep_arg, + deep_arg_dynamic_t * deep_dyn ) { - /* This function is used by SDP4 to add lunar and solar */ - /* perturbation effects to deep-space orbit objects. */ - - double alfdp, - sinis, sinok, sil, betdp, dalf, cosis, cosok, dbet, dls, f2, - f3, xnoh, pgh, ph, sel, ses, xls, sinzf, sis, sll, sls, temp, - x2li, x2omi, xl, xldot, xnddt, - xndot, xomi, zf, zm, - delt=0, ft=0; - - - switch (ientry) - { - - case DPSecular: /* Entrance for deep space secular effects */ - - deep_dyn->xll=deep_dyn->xll+m->ssl*deep_dyn->t; - deep_dyn->omgadf=deep_dyn->omgadf+m->ssg*deep_dyn->t; - deep_dyn->xnode=deep_dyn->xnode+m->ssh*deep_dyn->t; - deep_dyn->em=m->eo+m->sse*deep_dyn->t; - deep_dyn->xinc=m->xincl+m->ssi*deep_dyn->t; - - if (deep_dyn->xinc<0) - { - deep_dyn->xinc=-deep_dyn->xinc; - deep_dyn->xnode=deep_dyn->xnode+PI; - deep_dyn->omgadf=deep_dyn->omgadf-PI; - } - - if (!m->resonanceFlag) { - return; - } - - do - { - if ((deep_dyn->atime==0) || ((deep_dyn->t>=0) && (deep_dyn->atime<0)) || ((deep_dyn->t<0) && (deep_dyn->atime>=0))) - { - /* Epoch restart */ - - if (deep_dyn->t>=0) - delt=m->stepp; - else - delt=m->stepn; - - deep_dyn->atime=0; - deep_dyn->xni=m->xnq; - deep_dyn->xli=m->xlamo; - } - - else - { - if (fabs(deep_dyn->t)>=fabs(deep_dyn->atime)) - { - if (deep_dyn->t>0) - delt=m->stepp; - else - delt=m->stepn; - } - } - - do - { - if (fabs(deep_dyn->t-deep_dyn->atime)>=m->stepp) - { - deep_dyn->loopFlag = 1; - deep_dyn->epochRestartFlag = 0; - } - - else - { - ft=deep_dyn->t-deep_dyn->atime; - deep_dyn->loopFlag = 0; - } - - if (fabs(deep_dyn->t)atime)) - { - if (deep_dyn->t>=0) - delt=m->stepn; - else - delt=m->stepp; - - deep_dyn->loopFlag = 1; - deep_dyn->epochRestartFlag = 1; - } - - /* Dot terms calculated */ - if (m->synchronousFlag) { - xndot=m->del1*sin(deep_dyn->xli-m->fasx2)+m->del2*sin(2*(deep_dyn->xli-m->fasx4))+m->del3*sin(3*(deep_dyn->xli-m->fasx6)); - xnddt=m->del1*cos(deep_dyn->xli-m->fasx2)+2*m->del2*cos(2*(deep_dyn->xli-m->fasx4))+3*m->del3*cos(3*(deep_dyn->xli-m->fasx6)); - } - - else - { - xomi=m->omegaq+deep_arg->omgdot*deep_dyn->atime; - x2omi=xomi+xomi; - x2li=deep_dyn->xli+deep_dyn->xli; - xndot=m->d2201*sin(x2omi+deep_dyn->xli-G22)+m->d2211*sin(deep_dyn->xli-G22)+m->d3210*sin(xomi+deep_dyn->xli-G32)+m->d3222*sin(-xomi+deep_dyn->xli-G32)+m->d4410*sin(x2omi+x2li-G44)+m->d4422*sin(x2li-G44)+m->d5220*sin(xomi+deep_dyn->xli-G52)+m->d5232*sin(-xomi+deep_dyn->xli-G52)+m->d5421*sin(xomi+x2li-G54)+m->d5433*sin(-xomi+x2li-G54); - xnddt=m->d2201*cos(x2omi+deep_dyn->xli-G22)+m->d2211*cos(deep_dyn->xli-G22)+m->d3210*cos(xomi+deep_dyn->xli-G32)+m->d3222*cos(-xomi+deep_dyn->xli-G32)+m->d5220*cos(xomi+deep_dyn->xli-G52)+m->d5232*cos(-xomi+deep_dyn->xli-G52)+2*(m->d4410*cos(x2omi+x2li-G44)+m->d4422*cos(x2li-G44)+m->d5421*cos(xomi+x2li-G54)+m->d5433*cos(-xomi+x2li-G54)); - } - - xldot=deep_dyn->xni+m->xfact; - xnddt=xnddt*xldot; - - if (deep_dyn->loopFlag) { - deep_dyn->xli=deep_dyn->xli+xldot*delt+xndot*m->step2; - deep_dyn->xni=deep_dyn->xni+xndot*delt+xnddt*m->step2; - deep_dyn->atime=deep_dyn->atime+delt; - } - } while (deep_dyn->loopFlag && !deep_dyn->epochRestartFlag); - } while (deep_dyn->loopFlag && deep_dyn->epochRestartFlag); - - deep_dyn->xn=deep_dyn->xni+xndot*ft+xnddt*ft*ft*0.5; - xl=deep_dyn->xli+xldot*ft+xndot*ft*ft*0.5; - temp=-deep_dyn->xnode+m->thgr+deep_dyn->t*THDT; - - if (!m->synchronousFlag) { - deep_dyn->xll=xl+temp+temp; - }else{ - deep_dyn->xll=xl-deep_dyn->omgadf+temp; - } - - return; - - case DPPeriodic: /* Entrance for lunar-solar periodics */ - sinis=sin(deep_dyn->xinc); - cosis=cos(deep_dyn->xinc); - - if (fabs(deep_dyn->savtsn-deep_dyn->t)>=30) - { - deep_dyn->savtsn=deep_dyn->t; - zm=m->zmos+ZNS*deep_dyn->t; - zf=zm+2*ZES*sin(zm); - sinzf=sin(zf); - f2=0.5*sinzf*sinzf-0.25; - f3=-0.5*sinzf*cos(zf); - ses=m->se2*f2+m->se3*f3; - sis=m->si2*f2+m->si3*f3; - sls=m->sl2*f2+m->sl3*f3+m->sl4*sinzf; - deep_dyn->sghs=m->sgh2*f2+m->sgh3*f3+m->sgh4*sinzf; - deep_dyn->shs=m->sh2*f2+m->sh3*f3; - zm=m->zmol+ZNL*deep_dyn->t; - zf=zm+2*ZEL*sin(zm); - sinzf=sin(zf); - f2=0.5*sinzf*sinzf-0.25; - f3=-0.5*sinzf*cos(zf); - sel=m->ee2*f2+m->e3*f3; - sil=m->xi2*f2+m->xi3*f3; - sll=m->xl2*f2+m->xl3*f3+m->xl4*sinzf; - deep_dyn->sghl=m->xgh2*f2+m->xgh3*f3+m->xgh4*sinzf; - deep_dyn->sh1=m->xh2*f2+m->xh3*f3; - deep_dyn->pe=ses+sel; - deep_dyn->pinc=sis+sil; - deep_dyn->pl=sls+sll; - } - - pgh=deep_dyn->sghs+deep_dyn->sghl; - ph=deep_dyn->shs+deep_dyn->sh1; - deep_dyn->xinc=deep_dyn->xinc+deep_dyn->pinc; - deep_dyn->em=deep_dyn->em+deep_dyn->pe; - - if (m->xqncl>=0.2) - { - /* Apply periodics directly */ - ph=ph/deep_arg->sinio; - pgh=pgh-deep_arg->cosio*ph; - deep_dyn->omgadf=deep_dyn->omgadf+pgh; - deep_dyn->xnode=deep_dyn->xnode+ph; - deep_dyn->xll=deep_dyn->xll+deep_dyn->pl; - } - - else - { - /* Apply periodics with Lyddane modification */ - sinok=sin(deep_dyn->xnode); - cosok=cos(deep_dyn->xnode); - alfdp=sinis*sinok; - betdp=sinis*cosok; - dalf=ph*cosok+deep_dyn->pinc*cosis*sinok; - dbet=-ph*sinok+deep_dyn->pinc*cosis*cosok; - alfdp=alfdp+dalf; - betdp=betdp+dbet; - deep_dyn->xnode=FMod2p(deep_dyn->xnode); - xls=deep_dyn->xll+deep_dyn->omgadf+cosis*deep_dyn->xnode; - dls=deep_dyn->pl+pgh-deep_dyn->pinc*deep_dyn->xnode*sinis; - xls=xls+dls; - xnoh=deep_dyn->xnode; - deep_dyn->xnode=atan2(alfdp,betdp); - - /* This is a patch to Lyddane modification */ - /* suggested by Rob Matson. */ - - if (fabs(xnoh-deep_dyn->xnode)>PI) - { - if (deep_dyn->xnodexnode+=TWO_PI; - else - deep_dyn->xnode-=TWO_PI; - } - - deep_dyn->xll=deep_dyn->xll+deep_dyn->pl; - deep_dyn->omgadf=xls-deep_dyn->xll-cos(deep_dyn->xinc)*deep_dyn->xnode; - } - return; - } + /* This function is used by SDP4 to add lunar and solar */ + /* perturbation effects to deep-space orbit objects. */ + + double alfdp, sinis, sinok, sil, betdp, dalf, cosis, cosok, dbet, dls, f2, + f3, xnoh, pgh, ph, sel, ses, xls, sinzf, sis, sll, sls, temp, x2li, + x2omi, xl, xldot, xnddt, xndot, xomi, zf, zm, delt = 0, ft = 0; + + switch( ientry ) + { + case DPSecular: /* Entrance for deep space secular effects */ + + deep_dyn->xll = deep_dyn->xll + m->ssl * deep_dyn->t; + deep_dyn->omgadf = deep_dyn->omgadf + m->ssg * deep_dyn->t; + deep_dyn->xnode = deep_dyn->xnode + m->ssh * deep_dyn->t; + deep_dyn->em = m->eo + m->sse * deep_dyn->t; + deep_dyn->xinc = m->xincl + m->ssi * deep_dyn->t; + + if( deep_dyn->xinc < 0 ) + { + deep_dyn->xinc = -deep_dyn->xinc; + deep_dyn->xnode = deep_dyn->xnode + PI; + deep_dyn->omgadf = deep_dyn->omgadf - PI; + } + + if( !m->resonanceFlag ) + { + return; + } + + do + { + if( ( deep_dyn->atime == 0 ) || + ( ( deep_dyn->t >= 0 ) && ( deep_dyn->atime < 0 ) ) || + ( ( deep_dyn->t < 0 ) && ( deep_dyn->atime >= 0 ) ) ) + { + /* Epoch restart */ + + if( deep_dyn->t >= 0 ) + delt = m->stepp; + else + delt = m->stepn; + + deep_dyn->atime = 0; + deep_dyn->xni = m->xnq; + deep_dyn->xli = m->xlamo; + } + + else + { + if( fabs( deep_dyn->t ) >= fabs( deep_dyn->atime ) ) + { + if( deep_dyn->t > 0 ) + delt = m->stepp; + else + delt = m->stepn; + } + } + + do + { + if( fabs( deep_dyn->t - deep_dyn->atime ) >= m->stepp ) + { + deep_dyn->loopFlag = 1; + deep_dyn->epochRestartFlag = 0; + } + + else + { + ft = deep_dyn->t - deep_dyn->atime; + deep_dyn->loopFlag = 0; + } + + if( fabs( deep_dyn->t ) < fabs( deep_dyn->atime ) ) + { + if( deep_dyn->t >= 0 ) + delt = m->stepn; + else + delt = m->stepp; + + deep_dyn->loopFlag = 1; + deep_dyn->epochRestartFlag = 1; + } + + /* Dot terms calculated */ + if( m->synchronousFlag ) + { + xndot = m->del1 * sin( deep_dyn->xli - m->fasx2 ) + + m->del2 * + sin( 2 * ( deep_dyn->xli - m->fasx4 ) ) + + m->del3 * + sin( 3 * ( deep_dyn->xli - m->fasx6 ) ); + xnddt = m->del1 * cos( deep_dyn->xli - m->fasx2 ) + + 2 * m->del2 * + cos( 2 * ( deep_dyn->xli - m->fasx4 ) ) + + 3 * m->del3 * + cos( 3 * ( deep_dyn->xli - m->fasx6 ) ); + } + + else + { + xomi = m->omegaq + deep_arg->omgdot * deep_dyn->atime; + x2omi = xomi + xomi; + x2li = deep_dyn->xli + deep_dyn->xli; + xndot = m->d2201 * sin( x2omi + deep_dyn->xli - G22 ) + + m->d2211 * sin( deep_dyn->xli - G22 ) + + m->d3210 * sin( xomi + deep_dyn->xli - G32 ) + + m->d3222 * sin( -xomi + deep_dyn->xli - G32 ) + + m->d4410 * sin( x2omi + x2li - G44 ) + + m->d4422 * sin( x2li - G44 ) + + m->d5220 * sin( xomi + deep_dyn->xli - G52 ) + + m->d5232 * sin( -xomi + deep_dyn->xli - G52 ) + + m->d5421 * sin( xomi + x2li - G54 ) + + m->d5433 * sin( -xomi + x2li - G54 ); + xnddt = m->d2201 * cos( x2omi + deep_dyn->xli - G22 ) + + m->d2211 * cos( deep_dyn->xli - G22 ) + + m->d3210 * cos( xomi + deep_dyn->xli - G32 ) + + m->d3222 * cos( -xomi + deep_dyn->xli - G32 ) + + m->d5220 * cos( xomi + deep_dyn->xli - G52 ) + + m->d5232 * cos( -xomi + deep_dyn->xli - G52 ) + + 2 * ( m->d4410 * cos( x2omi + x2li - G44 ) + + m->d4422 * cos( x2li - G44 ) + + m->d5421 * cos( xomi + x2li - G54 ) + + m->d5433 * cos( -xomi + x2li - G54 ) ); + } + + xldot = deep_dyn->xni + m->xfact; + xnddt = xnddt * xldot; + + if( deep_dyn->loopFlag ) + { + deep_dyn->xli = deep_dyn->xli + xldot * delt + + xndot * m->step2; + deep_dyn->xni = deep_dyn->xni + xndot * delt + + xnddt * m->step2; + deep_dyn->atime = deep_dyn->atime + delt; + } + } while( deep_dyn->loopFlag && !deep_dyn->epochRestartFlag ); + } while( deep_dyn->loopFlag && deep_dyn->epochRestartFlag ); + + deep_dyn->xn = deep_dyn->xni + xndot * ft + xnddt * ft * ft * 0.5; + xl = deep_dyn->xli + xldot * ft + xndot * ft * ft * 0.5; + temp = -deep_dyn->xnode + m->thgr + deep_dyn->t * THDT; + + if( !m->synchronousFlag ) + { + deep_dyn->xll = xl + temp + temp; + } + else + { + deep_dyn->xll = xl - deep_dyn->omgadf + temp; + } + + return; + + case DPPeriodic: /* Entrance for lunar-solar periodics */ + sinis = sin( deep_dyn->xinc ); + cosis = cos( deep_dyn->xinc ); + + if( fabs( deep_dyn->savtsn - deep_dyn->t ) >= 30 ) + { + deep_dyn->savtsn = deep_dyn->t; + zm = m->zmos + ZNS * deep_dyn->t; + zf = zm + 2 * ZES * sin( zm ); + sinzf = sin( zf ); + f2 = 0.5 * sinzf * sinzf - 0.25; + f3 = -0.5 * sinzf * cos( zf ); + ses = m->se2 * f2 + m->se3 * f3; + sis = m->si2 * f2 + m->si3 * f3; + sls = m->sl2 * f2 + m->sl3 * f3 + m->sl4 * sinzf; + deep_dyn->sghs = m->sgh2 * f2 + m->sgh3 * f3 + m->sgh4 * sinzf; + deep_dyn->shs = m->sh2 * f2 + m->sh3 * f3; + zm = m->zmol + ZNL * deep_dyn->t; + zf = zm + 2 * ZEL * sin( zm ); + sinzf = sin( zf ); + f2 = 0.5 * sinzf * sinzf - 0.25; + f3 = -0.5 * sinzf * cos( zf ); + sel = m->ee2 * f2 + m->e3 * f3; + sil = m->xi2 * f2 + m->xi3 * f3; + sll = m->xl2 * f2 + m->xl3 * f3 + m->xl4 * sinzf; + deep_dyn->sghl = m->xgh2 * f2 + m->xgh3 * f3 + m->xgh4 * sinzf; + deep_dyn->sh1 = m->xh2 * f2 + m->xh3 * f3; + deep_dyn->pe = ses + sel; + deep_dyn->pinc = sis + sil; + deep_dyn->pl = sls + sll; + } + + pgh = deep_dyn->sghs + deep_dyn->sghl; + ph = deep_dyn->shs + deep_dyn->sh1; + deep_dyn->xinc = deep_dyn->xinc + deep_dyn->pinc; + deep_dyn->em = deep_dyn->em + deep_dyn->pe; + + if( m->xqncl >= 0.2 ) + { + /* Apply periodics directly */ + ph = ph / deep_arg->sinio; + pgh = pgh - deep_arg->cosio * ph; + deep_dyn->omgadf = deep_dyn->omgadf + pgh; + deep_dyn->xnode = deep_dyn->xnode + ph; + deep_dyn->xll = deep_dyn->xll + deep_dyn->pl; + } + + else + { + /* Apply periodics with Lyddane modification */ + sinok = sin( deep_dyn->xnode ); + cosok = cos( deep_dyn->xnode ); + alfdp = sinis * sinok; + betdp = sinis * cosok; + dalf = ph * cosok + deep_dyn->pinc * cosis * sinok; + dbet = -ph * sinok + deep_dyn->pinc * cosis * cosok; + alfdp = alfdp + dalf; + betdp = betdp + dbet; + deep_dyn->xnode = FMod2p( deep_dyn->xnode ); + xls = deep_dyn->xll + deep_dyn->omgadf + + cosis * deep_dyn->xnode; + dls = deep_dyn->pl + pgh - + deep_dyn->pinc * deep_dyn->xnode * sinis; + xls = xls + dls; + xnoh = deep_dyn->xnode; + deep_dyn->xnode = atan2( alfdp, betdp ); + + /* This is a patch to Lyddane modification */ + /* suggested by Rob Matson. */ + + if( fabs( xnoh - deep_dyn->xnode ) > PI ) + { + if( deep_dyn->xnode < xnoh ) + deep_dyn->xnode += TWO_PI; + else + deep_dyn->xnode -= TWO_PI; + } + + deep_dyn->xll = deep_dyn->xll + deep_dyn->pl; + deep_dyn->omgadf = xls - deep_dyn->xll - + cos( deep_dyn->xinc ) * deep_dyn->xnode; + } + return; + } } - diff --git a/firmware/app/libs/libpredict/src/sdp4.h b/firmware/app/libs/libpredict/src/sdp4.h deleted file mode 100644 index 6deb44d7..00000000 --- a/firmware/app/libs/libpredict/src/sdp4.h +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef _SDP4_H_ -#define _SDP4_H_ - -#include - -struct model_output { - double xinck; //inclination? - double omgadf; //argument of perigee? - double xnodek; //RAAN? - - double pos[3]; - double vel[3]; - - double phase; -}; - -/** - * Parameters for deep space perturbations - **/ -typedef struct { - /* Used by dpinit part of Deep() */ - double eosq, sinio, cosio, betao, aodp, theta2, - sing, cosg, betao2, xmdot, omgdot, xnodot, xnodp; - - /* Used by thetg and Deep() */ - double ds50; -} deep_arg_fixed_t; - -/** - * Output from deep space perturbations. - **/ -typedef struct { - /* Moved from deep_arg_t. */ - /* Used by dpsec and dpper parts of Deep() */ - double xll, omgadf, xnode, em, xinc, xn, t; - - /* Previously a part of _sdp4, moved here. */ - double pl, pinc, pe, sh1, sghl, shs, savtsn, atime, xni, xli, sghs; - ///Do loop flag: - int loopFlag; - ///Epoch restart flag: - int epochRestartFlag; -} deep_arg_dynamic_t; - - -/** - * Parameters relevant for SDP4 (simplified deep space perturbations) orbital model. - **/ -struct _sdp4 { - - ///Lunar terms done? - int lunarTermsDone; - ///Resonance flag: - int resonanceFlag; - ///Synchronous flag: - int synchronousFlag; - - - ///Static variables from SDP4(): - double x3thm1, c1, x1mth2, c4, xnodcf, t2cof, xlcof, - aycof, x7thm1; - deep_arg_fixed_t deep_arg; - - ///Static variables from Deep(): - double thgr, xnq, xqncl, omegaq, zmol, zmos, ee2, e3, - xi2, xl2, xl3, xl4, xgh2, xgh3, xgh4, xh2, xh3, sse, ssi, ssg, xi3, - se2, si2, sl2, sgh2, sh2, se3, si3, sl3, sgh3, sh3, sl4, sgh4, ssl, - ssh, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433, del1, - del2, del3, fasx2, fasx4, fasx6, xlamo, xfact, stepp, - stepn, step2, preep, d2201, d2211, - zsingl, zcosgl, zsinhl, zcoshl, zsinil, zcosil; - - //converted fields from predict_orbital_elements_t. - double xnodeo; - double omegao; - double xmo; - double xincl; - double eo; - double xno; - double bstar; - double epoch; -}; - -/** - * Initialize SDP4 model parameters. - * - * \param orbital_elements Orbital elements - * \param m Struct to initialize - **/ -void sdp4_init(const predict_orbital_elements_t *orbital_elements, struct _sdp4 *m); - -/** - * Predict ECI position and velocity of deep-space orbit (period > 225 minutes) according to SDP4 model and the given orbital parameters. - * - * \param m SDP4 model parameters - * \param tsince Time since epoch of TLE in minutes - * \param output Modeled output parameters - * \copyright GPLv2+ - **/ -void sdp4_predict(const struct _sdp4 *m, double tsince, struct model_output *output); - -/** - * Deep space perturbations. Original Deep() function. - * - * \param m SDP4 model parameters - * \param ientry Behavior flag. 1: Deep space secular effects. 2: lunar-solar periodics - * \param deep_arg Fixed deep perturbation parameters - * \param deep_dyn Output of deep space perturbations - * \copyright GPLv2+ - **/ -void sdp4_deep(const struct _sdp4 *m, int ientry, const deep_arg_fixed_t * deep_arg, deep_arg_dynamic_t *deep_dyn); - -/** - * Returns ptr to static allocated _sdp4 struct - **/ -struct _sdp4 *sdp4_static_alloc(void); - - -#endif // ifndef _SDP4_H_ diff --git a/firmware/app/libs/libpredict/src/sgp4.c b/firmware/app/libs/libpredict/src/sgp4.c index b2dcf40f..5a662a5d 100644 --- a/firmware/app/libs/libpredict/src/sgp4.c +++ b/firmware/app/libs/libpredict/src/sgp4.c @@ -1,268 +1,392 @@ -#include "sgp4.h" +#include +#include +#include -#include "defs.h" -#include "unsorted.h" - -/* Static Allocated sgp4 struct */ -static struct _sgp4 sgp4_; - -struct _sgp4 *sgp4_static_alloc(void) -{ - return &sgp4_; -} - -void sgp4_init(const predict_orbital_elements_t *orbital_elements, struct _sgp4 *m) +void sgp4_init( const predict_orbital_elements_t * orbital_elements, + struct predict_sgp4 * m ) { - m->simpleFlag = 0; - - //Calculate old TLE field values as used in the original sgp4 - double temp_tle = TWO_PI/MINUTES_PER_DAY/MINUTES_PER_DAY; - m->bstar = orbital_elements->bstar_drag_term / AE; - m->xincl = orbital_elements->inclination * M_PI / 180.0; - m->xnodeo = orbital_elements->right_ascension * M_PI / 180.0; - m->eo = orbital_elements->eccentricity; - m->omegao = orbital_elements->argument_of_perigee * M_PI / 180.0; - m->xmo = orbital_elements->mean_anomaly * M_PI / 180.0; - m->xno = orbital_elements->mean_motion*temp_tle*MINUTES_PER_DAY; - - double x1m5th, xhdot1, - a1, a3ovk2, ao, - betao, betao2, c1sq, c2, c3, coef, coef1, del1, delo, eeta, eosq, - etasq, perigee, pinvsq, psisq, qoms24, s4, temp, temp1, temp2, - temp3, theta2, theta4, tsi; - - /* Recover original mean motion (m->xnodp) and */ - /* semimajor axis (m->aodp) from input elements. */ - - a1=pow(XKE/m->xno,TWO_THIRD); - m->cosio=cos(m->xincl); - theta2=m->cosio*m->cosio; - m->x3thm1=3*theta2-1.0; - eosq=m->eo*m->eo; - betao2=1.0-eosq; - betao=sqrt(betao2); - del1=1.5*CK2*m->x3thm1/(a1*a1*betao*betao2); - ao=a1*(1.0-del1*(0.5*TWO_THIRD+del1*(1.0+134.0/81.0*del1))); - delo=1.5*CK2*m->x3thm1/(ao*ao*betao*betao2); - m->xnodp=m->xno/(1.0+delo); - m->aodp=ao/(1.0-delo); - - /* For perigee less than 220 kilometers, the "simple" */ - /* flag is set and the equations are truncated to linear */ - /* variation in sqrt a and quadratic variation in mean */ - /* anomaly. Also, the c3 term, the delta omega term, and */ - /* the delta m term are dropped. */ - - if ((m->aodp*(1-m->eo)/AE)<(220/EARTH_RADIUS_KM_WGS84+AE)) - m->simpleFlag = true; - else - m->simpleFlag = false; - - /* For perigees below 156 km, the */ - /* values of s and qoms2t are altered. */ - - s4=S_DENSITY_PARAM; - qoms24=QOMS2T; - perigee=(m->aodp*(1-m->eo)-AE)*EARTH_RADIUS_KM_WGS84; - - if (perigee<156.0) - { - if (perigee<=98.0) - s4=20; - else - s4=perigee-78.0; - - qoms24=pow((120-s4)*AE/EARTH_RADIUS_KM_WGS84,4); - s4=s4/EARTH_RADIUS_KM_WGS84+AE; - } - - pinvsq=1/(m->aodp*m->aodp*betao2*betao2); - tsi=1/(m->aodp-s4); - m->eta=m->aodp*m->eo*tsi; - etasq=m->eta*m->eta; - eeta=m->eo*m->eta; - psisq=fabs(1-etasq); - coef=qoms24*pow(tsi,4); - coef1=coef/pow(psisq,3.5); - c2=coef1*m->xnodp*(m->aodp*(1+1.5*etasq+eeta*(4+etasq))+0.75*CK2*tsi/psisq*m->x3thm1*(8+3*etasq*(8+etasq))); - m->c1=m->bstar*c2; - m->sinio=sin(m->xincl); - a3ovk2=-J3_HARMONIC_WGS72/CK2*pow(AE,3); - c3=coef*tsi*a3ovk2*m->xnodp*AE*m->sinio/m->eo; - m->x1mth2=1-theta2; - - m->c4=2*m->xnodp*coef1*m->aodp*betao2*(m->eta*(2+0.5*etasq)+m->eo*(0.5+2*etasq)-2*CK2*tsi/(m->aodp*psisq)*(-3*m->x3thm1*(1-2*eeta+etasq*(1.5-0.5*eeta))+0.75*m->x1mth2*(2*etasq-eeta*(1+etasq))*cos(2*m->omegao))); - m->c5=2*coef1*m->aodp*betao2*(1+2.75*(etasq+eeta)+eeta*etasq); - - theta4=theta2*theta2; - temp1=3*CK2*pinvsq*m->xnodp; - temp2=temp1*CK2*pinvsq; - temp3=1.25*CK4*pinvsq*pinvsq*m->xnodp; - m->xmdot=m->xnodp+0.5*temp1*betao*m->x3thm1+0.0625*temp2*betao*(13-78*theta2+137*theta4); - x1m5th=1-5*theta2; - m->omgdot=-0.5*temp1*x1m5th+0.0625*temp2*(7-114*theta2+395*theta4)+temp3*(3-36*theta2+49*theta4); - xhdot1=-temp1*m->cosio; - m->xnodot=xhdot1+(0.5*temp2*(4-19*theta2)+2*temp3*(3-7*theta2))*m->cosio; - m->omgcof=m->bstar*c3*cos(m->omegao); - m->xmcof=-TWO_THIRD*coef*m->bstar*AE/eeta; - m->xnodcf=3.5*betao2*xhdot1*m->c1; - m->t2cof=1.5*m->c1; - m->xlcof=0.125*a3ovk2*m->sinio*(3+5*m->cosio)/(1+m->cosio); - m->aycof=0.25*a3ovk2*m->sinio; - m->delmo=pow(1+m->eta*cos(m->xmo),3); - m->sinmo=sin(m->xmo); - m->x7thm1=7*theta2-1; - - if (!m->simpleFlag) { - c1sq=m->c1*m->c1; - m->d2=4*m->aodp*tsi*c1sq; - temp=m->d2*tsi*m->c1/3; - m->d3=(17*m->aodp+s4)*temp; - m->d4=0.5*temp*m->aodp*tsi*(221*m->aodp+31*s4)*m->c1; - m->t3cof=m->d2+2*c1sq; - m->t4cof=0.25*(3*m->d3+m->c1*(12*m->d2+10*c1sq)); - m->t5cof=0.2*(3*m->d4+12*m->c1*m->d3+6*m->d2*m->d2+15*c1sq*(2*m->d2+c1sq)); - } + m->simpleFlag = 0; + + // Calculate old TLE field values as used in the original sgp4 + double temp_tle = TWO_PI / MINUTES_PER_DAY / MINUTES_PER_DAY; + m->bstar = orbital_elements->bstar_drag_term / AE; + m->xincl = orbital_elements->inclination * M_PI / 180.0; + m->xnodeo = orbital_elements->right_ascension * M_PI / 180.0; + m->eo = orbital_elements->eccentricity; + m->omegao = orbital_elements->argument_of_perigee * M_PI / 180.0; + m->xmo = orbital_elements->mean_anomaly * M_PI / 180.0; + m->xno = orbital_elements->mean_motion * temp_tle * MINUTES_PER_DAY; + + double x1m5th; + double xhdot1; + double a1; + double a3ovk2; + double ao; + double betao; + double betao2; + double c1sq; + double c2; + double c3; + double coef; + double coef1; + double del1; + double delo; + double eeta; + double eosq; + double etasq; + double perigee; + double pinvsq; + double psisq; + double qoms24; + double s4; + double temp; + double temp1; + double temp2; + double temp3; + double theta2; + double theta4; + double tsi; + + /* Recover original mean motion (m->xnodp) and */ + /* semimajor axis (m->aodp) from input elements. */ + + a1 = pow( XKE / m->xno, TWO_THIRD ); + m->cosio = cos( m->xincl ); + theta2 = m->cosio * m->cosio; + m->x3thm1 = ( 3.0 * theta2 ) - 1.0; + eosq = m->eo * m->eo; + betao2 = 1.0 - eosq; + betao = sqrt( betao2 ); + del1 = 1.5 * CK2 * m->x3thm1 / ( a1 * a1 * betao * betao2 ); + ao = a1 * + ( 1.0 - ( del1 * ( ( 0.5 * TWO_THIRD ) + + ( del1 * ( 1.0 + ( 134.0 / 81.0 * del1 ) ) ) ) ) ); + delo = 1.5 * CK2 * m->x3thm1 / ( ao * ao * betao * betao2 ); + m->xnodp = m->xno / ( 1.0 + delo ); + m->aodp = ao / ( 1.0 - delo ); + + /* For perigee less than 220 kilometers, the "simple" */ + /* flag is set and the equations are truncated to linear */ + /* variation in sqrt a and quadratic variation in mean */ + /* anomaly. Also, the c3 term, the delta omega term, and */ + /* the delta m term are dropped. */ + + if( ( m->aodp * ( 1.0 - m->eo ) / AE ) < + ( ( 220.0 / EARTH_RADIUS_KM_WGS84 ) + AE ) ) + { + m->simpleFlag = true; + } + else + { + m->simpleFlag = false; + } + + /* For perigees below 156 km, the */ + /* values of s and qoms2t are altered. */ + + s4 = S_DENSITY_PARAM; + qoms24 = QOMS2T; + perigee = ( m->aodp * ( 1 - m->eo ) - AE ) * EARTH_RADIUS_KM_WGS84; + + if( perigee < 156.0 ) + { + if( perigee <= 98.0 ) + { + s4 = 20.0; + } + else + { + s4 = perigee - 78.0; + } + + qoms24 = pow( ( 120.0 - s4 ) * AE / EARTH_RADIUS_KM_WGS84, 4.0 ); + s4 = ( s4 / EARTH_RADIUS_KM_WGS84 ) + AE; + } + + pinvsq = 1 / ( m->aodp * m->aodp * betao2 * betao2 ); + tsi = 1 / ( m->aodp - s4 ); + m->eta = m->aodp * m->eo * tsi; + etasq = m->eta * m->eta; + eeta = m->eo * m->eta; + psisq = fabs( 1.0 - etasq ); + coef = qoms24 * pow( tsi, 4 ); + coef1 = coef / pow( psisq, 3.5 ); + c2 = coef1 * m->xnodp * + ( ( m->aodp * + ( 1.0 + ( 1.5 * etasq ) + ( eeta * ( 4.0 + etasq ) ) ) ) + + ( 0.75 * CK2 * tsi / psisq * m->x3thm1 * + ( 8.0 + ( 3.0 * etasq * ( 8.0 + etasq ) ) ) ) ); + m->c1 = m->bstar * c2; + m->sinio = sin( m->xincl ); + a3ovk2 = -J3_HARMONIC_WGS72 / CK2 * pow( AE, 3 ); + c3 = coef * tsi * a3ovk2 * m->xnodp * AE * m->sinio / m->eo; + m->x1mth2 = 1.0 - theta2; + + m->c4 = 2.0 * m->xnodp * coef1 * m->aodp * betao2 * + ( ( m->eta * ( 2.0 + ( 0.5 * etasq ) ) ) + + ( m->eo * ( 0.5 + ( 2.0 * etasq ) ) ) - + ( 2.0 * CK2 * tsi / ( m->aodp * psisq ) ) * + ( -3.0 * m->x3thm1 * + ( 1.0 - ( 2.0 * eeta ) + + ( etasq * ( 1.5 - ( 0.5 * eeta ) ) ) ) + + ( 0.75 * m->x1mth2 * + ( ( 2.0 * etasq ) - ( eeta * ( 1.0 + etasq ) ) ) * + cos( 2.0 * m->omegao ) ) ) ); + m->c5 = 2.0 * coef1 * m->aodp * betao2 * + ( 1.0 + ( 2.75 * ( etasq + eeta ) ) + ( eeta * etasq ) ); + + theta4 = theta2 * theta2; + temp1 = 3.0 * CK2 * pinvsq * m->xnodp; + temp2 = temp1 * CK2 * pinvsq; + temp3 = 1.25 * CK4 * pinvsq * pinvsq * m->xnodp; + m->xmdot = m->xnodp + ( 0.5 * temp1 * betao * m->x3thm1 ) + + ( 0.0625 * temp2 * betao * + ( 13.0 - ( 78.0 * theta2 ) + ( 137.0 * theta4 ) ) ); + x1m5th = 1.0 - ( 5.0 * theta2 ); + m->omgdot = ( -0.5 * temp1 * x1m5th ) + + ( 0.0625 * temp2 * + ( 7.0 - ( 114.0 * theta2 ) + ( 395.0 * theta4 ) ) ) + + ( temp3 * ( 3.0 - ( 36.0 * theta2 ) + ( 49.0 * theta4 ) ) ); + xhdot1 = -temp1 * m->cosio; + m->xnodot = xhdot1 + ( ( 0.5 * temp2 * ( 4.0 - ( 19.0 * theta2 ) ) + + ( 2.0 * temp3 * ( 3.0 - ( 7.0 * theta2 ) ) ) ) * + m->cosio ); + m->omgcof = m->bstar * c3 * cos( m->omegao ); + m->xmcof = -TWO_THIRD * coef * m->bstar * AE / eeta; + m->xnodcf = 3.5 * betao2 * xhdot1 * m->c1; + m->t2cof = 1.5 * m->c1; + m->xlcof = 0.125 * a3ovk2 * m->sinio * ( 3.0 + ( 5.0 * m->cosio ) ) / + ( 1.0 + m->cosio ); + m->aycof = 0.25 * a3ovk2 * m->sinio; + m->delmo = pow( 1.0 + ( m->eta * cos( m->xmo ) ), 3 ); + m->sinmo = sin( m->xmo ); + m->x7thm1 = ( 7.0 * theta2 ) - 1.0; + + if( !m->simpleFlag ) + { + c1sq = m->c1 * m->c1; + m->d2 = 4.0 * m->aodp * tsi * c1sq; + temp = m->d2 * tsi * m->c1 / 3.0; + m->d3 = ( ( 17.0 * m->aodp ) + s4 ) * temp; + m->d4 = 0.5 * temp * m->aodp * tsi * + ( ( 221.0 * m->aodp ) + ( 31.0 * s4 ) ) * m->c1; + m->t3cof = m->d2 + ( 2.0 * c1sq ); + m->t4cof = 0.25 * ( ( 3.0 * m->d3 ) + ( m->c1 * ( ( 12.0 * m->d2 ) + + ( 10.0 * c1sq ) ) ) ); + m->t5cof = 0.2 * ( ( 3.0 * m->d4 ) + ( 12.0 * m->c1 * m->d3 ) + + ( 6.0 * m->d2 * m->d2 ) + + ( 15.0 * c1sq * ( ( 2.0 * m->d2 ) + c1sq ) ) ); + } } -void sgp4_predict(const struct _sgp4 *m, double tsince, struct model_output *output) +void sgp4_predict( const struct predict_sgp4 * m, + double tsince, + struct model_output * output ) { - double cosuk, sinuk, rfdotk, vx, vy, vz, ux, uy, uz, xmy, xmx, cosnok, - sinnok, cosik, sinik, rdotk, xinck, xnodek, uk, rk, cos2u, sin2u, - u, sinu, cosu, betal, rfdot, rdot, r, pl, elsq, esine, ecose, epw, - cosepw, tfour, sinepw, capu, ayn, xlt, aynl, xll, - axn, xn, beta, xl, e, a, tcube, delm, delomg, templ, tempe, tempa, - xnode, tsq, xmp, omega, xnoddf, omgadf, xmdf, temp, temp1, temp2, - temp3, temp4, temp5, temp6; - - int i; - - /* Update for secular gravity and atmospheric drag. */ - xmdf=m->xmo+m->xmdot*tsince; - omgadf=m->omegao+m->omgdot*tsince; - xnoddf=m->xnodeo+m->xnodot*tsince; - omega=omgadf; - xmp=xmdf; - tsq=tsince*tsince; - xnode=xnoddf+m->xnodcf*tsq; - tempa=1-m->c1*tsince; - tempe=m->bstar*m->c4*tsince; - templ=m->t2cof*tsq; - - if (!m->simpleFlag) { - - delomg=m->omgcof*tsince; - delm=m->xmcof*(pow(1+m->eta*cos(xmdf),3)-m->delmo); - temp=delomg+delm; - xmp=xmdf+temp; - omega=omgadf-temp; - tcube=tsq*tsince; - tfour=tsince*tcube; - tempa=tempa-m->d2*tsq-m->d3*tcube-m->d4*tfour; - tempe=tempe+m->bstar*m->c5*(sin(xmp)-m->sinmo); - templ=templ+m->t3cof*tcube+tfour*(m->t4cof+tsince*m->t5cof); - } - - a=m->aodp*pow(tempa,2); - e=m->eo-tempe; - xl=xmp+omega+xnode+m->xnodp*templ; - beta=sqrt(1-e*e); - xn=XKE/pow(a,1.5); - - /* Long period periodics */ - axn=e*cos(omega); - temp=1/(a*beta*beta); - xll=temp*m->xlcof*axn; - aynl=temp*m->aycof; - xlt=xl+xll; - ayn=e*sin(omega)+aynl; - - /* Solve Kepler's Equation */ - capu=FMod2p(xlt-xnode); - temp2=capu; - i=0; - - do - { - sinepw=sin(temp2); - cosepw=cos(temp2); - temp3=axn*sinepw; - temp4=ayn*cosepw; - temp5=axn*cosepw; - temp6=ayn*sinepw; - epw=(capu-temp4+temp3-temp2)/(1-temp5-temp6)+temp2; - - if (fabs(epw-temp2)<= E6A) - break; - - temp2=epw; - - } while (i++<10); - - /* Short period preliminary quantities */ - ecose=temp5+temp6; - esine=temp3-temp4; - elsq=axn*axn+ayn*ayn; - temp=1-elsq; - pl=a*temp; - r=a*(1-ecose); - temp1=1/r; - rdot=XKE*sqrt(a)*esine*temp1; - rfdot=XKE*sqrt(pl)*temp1; - temp2=a*temp1; - betal=sqrt(temp); - temp3=1/(1+betal); - cosu=temp2*(cosepw-axn+ayn*esine*temp3); - sinu=temp2*(sinepw-ayn-axn*esine*temp3); - u=atan2(sinu,cosu); - sin2u=2*sinu*cosu; - cos2u=2*cosu*cosu-1; - temp=1/pl; - temp1=CK2*temp; - temp2=temp1*temp; - - /* Update for short periodics */ - rk=r*(1-1.5*temp2*betal*m->x3thm1)+0.5*temp1*m->x1mth2*cos2u; - uk=u-0.25*temp2*m->x7thm1*sin2u; - xnodek=xnode+1.5*temp2*m->cosio*sin2u; - xinck=m->xincl+1.5*temp2*m->cosio*m->sinio*cos2u; - rdotk=rdot-xn*temp1*m->x1mth2*sin2u; - rfdotk=rfdot+xn*temp1*(m->x1mth2*cos2u+1.5*m->x3thm1); - - /* Orientation vectors */ - sinuk=sin(uk); - cosuk=cos(uk); - sinik=sin(xinck); - cosik=cos(xinck); - sinnok=sin(xnodek); - cosnok=cos(xnodek); - xmx=-sinnok*cosik; - xmy=cosnok*cosik; - ux=xmx*sinuk+cosnok*cosuk; - uy=xmy*sinuk+sinnok*cosuk; - uz=sinik*sinuk; - vx=xmx*cosuk-cosnok*sinuk; - vy=xmy*cosuk-sinnok*sinuk; - vz=sinik*cosuk; - - /* Position and velocity */ - output->pos[0] = rk*ux; - output->pos[1] = rk*uy; - output->pos[2] = rk*uz; - output->vel[0] = rdotk*ux+rfdotk*vx; - output->vel[1] = rdotk*uy+rfdotk*vy; - output->vel[2] = rdotk*uz+rfdotk*vz; - - /* Phase in radians */ - output->phase=xlt-xnode-omgadf+TWO_PI; - - if (output->phase<0.0) - output->phase+=TWO_PI; - - output->phase=FMod2p(output->phase); - - output->xinck = xinck; - output->omgadf = omgadf; - output->xnodek = xnodek; - + double cosuk; + double sinuk; + double rfdotk; + double vx; + double vy; + double vz; + double ux; + double uy; + double uz; + double xmy; + double xmx; + double cosnok; + double sinnok; + double cosik; + double sinik; + double rdotk; + double xinck; + double xnodek; + double uk; + double rk; + double cos2u; + double sin2u; + double u; + double sinu; + double cosu; + double betal; + double rfdot; + double rdot; + double r; + double pl; + double elsq; + double esine; + double ecose; + double epw; + double cosepw; + double tfour; + double sinepw; + double capu; + double ayn; + double xlt; + double aynl; + double xll; + double axn; + double xn; + double beta; + double xl; + double e; + double a; + double tcube; + double delm; + double delomg; + double templ; + double tempe; + double tempa; + double xnode; + double tsq; + double xmp; + double omega; + double xnoddf; + double omgadf; + double xmdf; + double temp; + double temp1; + double temp2; + double temp3; + double temp4; + double temp5; + double temp6; + + int32_t i; + + /* Update for secular gravity and atmospheric drag. */ + xmdf = m->xmo + ( m->xmdot * tsince ); + omgadf = m->omegao + ( m->omgdot * tsince ); + xnoddf = m->xnodeo + ( m->xnodot * tsince ); + omega = omgadf; + xmp = xmdf; + tsq = tsince * tsince; + xnode = xnoddf + ( m->xnodcf * tsq ); + tempa = 1 - ( m->c1 * tsince ); + tempe = m->bstar * m->c4 * tsince; + templ = m->t2cof * tsq; + + if( !m->simpleFlag ) + { + delomg = m->omgcof * tsince; + delm = m->xmcof * ( pow( 1 + ( m->eta * cos( xmdf ) ), 3 ) - m->delmo ); + temp = delomg + delm; + xmp = xmdf + temp; + omega = omgadf - temp; + tcube = tsq * tsince; + tfour = tsince * tcube; + tempa = tempa - ( m->d2 * tsq ) - ( m->d3 * tcube ) - ( m->d4 * tfour ); + tempe = tempe + ( m->bstar * m->c5 * ( sin( xmp ) - m->sinmo ) ); + templ = templ + ( m->t3cof * tcube ) + + ( tfour * ( m->t4cof + ( tsince * m->t5cof ) ) ); + } + + a = m->aodp * pow( tempa, 2 ); + e = m->eo - tempe; + xl = xmp + omega + xnode + ( m->xnodp * templ ); + beta = sqrt( 1.0 - ( e * e ) ); + xn = XKE / pow( a, 1.5 ); + + /* Long period periodics */ + axn = e * cos( omega ); + temp = 1.0 / ( a * beta * beta ); + xll = temp * m->xlcof * axn; + aynl = temp * m->aycof; + xlt = xl + xll; + ayn = e * sin( omega ) + aynl; + + /* Solve Kepler's Equation */ + capu = FMod2p( xlt - xnode ); + temp2 = capu; + i = 0; + + do + { + sinepw = sin( temp2 ); + cosepw = cos( temp2 ); + temp3 = axn * sinepw; + temp4 = ayn * cosepw; + temp5 = axn * cosepw; + temp6 = ayn * sinepw; + epw = ( capu - temp4 + temp3 - temp2 ) / ( 1.0 - temp5 - temp6 ) + + temp2; + + if( fabs( epw - temp2 ) <= E6A ) + { + break; + } + + temp2 = epw; + + } while( i++ < 10 ); + + /* Short period preliminary quantities */ + ecose = temp5 + temp6; + esine = temp3 - temp4; + elsq = ( axn * axn ) + ( ayn * ayn ); + temp = 1.0 - elsq; + pl = a * temp; + r = a * ( 1.0 - ecose ); + temp1 = 1.0 / r; + rdot = XKE * sqrt( a ) * esine * temp1; + rfdot = XKE * sqrt( pl ) * temp1; + temp2 = a * temp1; + betal = sqrt( temp ); + temp3 = 1.0 / ( 1.0 + betal ); + cosu = temp2 * ( cosepw - axn + ( ayn * esine * temp3 ) ); + sinu = temp2 * ( sinepw - ayn - ( axn * esine * temp3 ) ); + u = atan2( sinu, cosu ); + sin2u = 2.0 * sinu * cosu; + cos2u = ( 2.0 * cosu * cosu ) - 1.0; + temp = 1.0 / pl; + temp1 = CK2 * temp; + temp2 = temp1 * temp; + + /* Update for short periodics */ + rk = ( r * ( 1.0 - ( 1.5 * temp2 * betal * m->x3thm1 ) ) ) + + ( 0.5 * temp1 * m->x1mth2 * cos2u ); + uk = u - ( 0.25 * temp2 * m->x7thm1 * sin2u ); + xnodek = xnode + ( 1.5 * temp2 * m->cosio * sin2u ); + xinck = m->xincl + ( 1.5 * temp2 * m->cosio * m->sinio * cos2u ); + rdotk = rdot - ( xn * temp1 * m->x1mth2 * sin2u ); + rfdotk = rfdot + + ( xn * temp1 * ( ( m->x1mth2 * cos2u ) + ( 1.5 * m->x3thm1 ) ) ); + + /* Orientation vectors */ + sinuk = sin( uk ); + cosuk = cos( uk ); + sinik = sin( xinck ); + cosik = cos( xinck ); + sinnok = sin( xnodek ); + cosnok = cos( xnodek ); + xmx = -sinnok * cosik; + xmy = cosnok * cosik; + ux = ( xmx * sinuk ) + ( cosnok * cosuk ); + uy = ( xmy * sinuk ) + ( sinnok * cosuk ); + uz = sinik * sinuk; + vx = ( xmx * cosuk ) - ( cosnok * sinuk ); + vy = ( xmy * cosuk ) - ( sinnok * sinuk ); + vz = sinik * cosuk; + + /* Position and velocity */ + output->pos[ 0 ] = rk * ux; + output->pos[ 1 ] = rk * uy; + output->pos[ 2 ] = rk * uz; + output->vel[ 0 ] = ( rdotk * ux ) + ( rfdotk * vx ); + output->vel[ 1 ] = ( rdotk * uy ) + ( rfdotk * vy ); + output->vel[ 2 ] = ( rdotk * uz ) + ( rfdotk * vz ); + + /* Phase in radians */ + output->phase = xlt - xnode - omgadf + TWO_PI; + + if( output->phase < 0.0 ) + { + output->phase += TWO_PI; + } + + output->phase = FMod2p( output->phase ); + + output->xinck = xinck; + output->omgadf = omgadf; + output->xnodek = xnodek; } diff --git a/firmware/app/libs/libpredict/src/sgp4.h b/firmware/app/libs/libpredict/src/sgp4.h deleted file mode 100644 index ffaa0abe..00000000 --- a/firmware/app/libs/libpredict/src/sgp4.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef SGP4_H_ -#define SGP4_H_ - -#include -#include "sdp4.h" - -/** - * Parameters relevant for SGP4 (simplified general perturbations) orbital model. - **/ -struct _sgp4 { - - ///Simple flag - int simpleFlag; - - ///Static variables from original SGP4() (time-independent, and might probably have physical meaningfulness) - double aodp, aycof, c1, c4, c5, cosio, d2, d3, d4, delmo, - omgcof, eta, omgdot, sinio, xnodp, sinmo, t2cof, t3cof, t4cof, - t5cof, x1mth2, x3thm1, x7thm1, xmcof, xmdot, xnodcf, xnodot, xlcof; - - //tle fields copied (and converted) from predict_orbital_t. The fields above are TLE-dependent anyway, and interrelated with the values below. - double bstar; - double xincl; - double xnodeo; - double eo; - double omegao; - double xmo; - double xno; -}; - -/** - * Initialize SGP4 model parameters. - * - * \param orbital_elements Orbital elements - * \param m Struct to initialize - * \copyright GPLv2+ - **/ -void sgp4_init(const predict_orbital_elements_t *orbital_elements, struct _sgp4 *m); - -/** - * Predict ECI position and velocity of near-earth orbit (period < 225 minutes) according to SGP4 model and the given orbital parameters. - * - * \param m SGP4 model parameters - * \param tsince Time since epoch of TLE in minutes - * \param output Output of model - * \copyright GPLv2+ - **/ -void sgp4_predict(const struct _sgp4 *m, double tsince, struct model_output *output); - -/** - * Returns ptr to static allocated _sgp4 struct - **/ -struct _sgp4 *sgp4_static_alloc(void); - -#endif diff --git a/firmware/app/libs/libpredict/src/sun.c b/firmware/app/libs/libpredict/src/sun.c index 42eff422..6502969e 100644 --- a/firmware/app/libs/libpredict/src/sun.c +++ b/firmware/app/libs/libpredict/src/sun.c @@ -1,98 +1,101 @@ -#include "sun.h" -#include "unsorted.h" -#include "defs.h" +#include +#include +#include +#include /** - * The function Delta_ET has been added to allow calculations on the position of the sun. It provides the difference between UT (approximately the same as UTC) and ET (now referred to as TDT). This function is based on a least squares fit of data from 1950 to 1991 and will need to be updated periodically. Values determined using data from 1950-1991 in the 1990 Astronomical Almanac. See DELTA_ET.WQ1 for details. + * The function Delta_ET has been added to allow calculations on the position of + *the sun. It provides the difference between UT (approximately the same as + *UTC) and ET (now referred to as TDT). This function is based on a least + *squares fit of data from 1950 to 1991 and will need to be updated + *periodically. Values determined using data from 1950-1991 in the 1990 + *Astronomical Almanac. See DELTA_ET.WQ1 for details. * * \copyright GPLv2+ **/ -double Delta_ET(double year) +static double Delta_ET( double year ) { - double delta_et; + double delta_et; - delta_et=26.465+0.747622*(year-1950)+1.886913*sin(2*M_PI*(year-1975)/33); + delta_et = 26.465 + ( 0.747622 * ( year - 1950.0 ) ) + + ( 1.886913 * sin( 2.0 * M_PI * ( year - 1975.0 ) / 33.0 ) ); - return delta_et; + return delta_et; } -/** - * Returns angle in radians from argument in degrees. - * - * \copyright GPLv2+ - **/ -double Radians(double arg) +void sun_predict( double time, double position[ 3 ] ) { - /* Returns angle in radians from argument in degrees */ - return (arg*M_PI/180.0); + double jul_utc = time; + double mjd = jul_utc - 2415020.0; + double year = 1900.0 + ( mjd / 365.25 ); + double T = ( mjd + ( Delta_ET( year ) / SECONDS_PER_DAY ) ) / 36525.0; + double M = predictDEG2RAD( + fmod( 358.47583 + fmod( 35999.04975 * T, 360.0 ) - + ( 0.000150 + ( 0.0000033 * T ) ) * Sqr( T ), + 360.0 ) ); + double L = predictDEG2RAD( + fmod( 279.69668 + fmod( 36000.76892 * T, 360.0 ) + + ( 0.0003025 * Sqr( T ) ), + 360.0 ) ); + double e = 0.01675104 - ( ( 0.0000418 + ( 0.000000126 * T ) ) * T ); + double C = predictDEG2RAD( + ( ( 1.919460 - ( ( 0.004789 + ( 0.000014 * T ) ) * T ) ) * sin( M ) ) + + ( ( 0.020094 - ( 0.000100 * T ) ) * sin( 2.0 * M ) ) + + ( 0.000293 * sin( 3.0 * M ) ) ); + double O = predictDEG2RAD( + fmod( 259.18 - ( 1934.142 * T ), 360.0 ) ); + double Lsa = fmod( L + C - + predictDEG2RAD( 0.00569 - + ( 0.00479 * sin( O ) ) ), + 2 * M_PI ); + double nu = fmod( M + C, 2 * M_PI ); + double R = 1.0000002 * ( 1.0 - Sqr( e ) ) / ( 1.0 + ( e * cos( nu ) ) ); + double eps = predictDEG2RAD( + 23.452294 - + ( ( 0.0130125 + ( 0.00000164 - ( 0.000000503 * T ) ) * T ) * T ) + + ( 0.00256 * cos( O ) ) ); + R = ASTRONOMICAL_UNIT_KM * R; + + position[ 0 ] = R * cos( Lsa ); + position[ 1 ] = R * sin( Lsa ) * cos( eps ); + position[ 2 ] = R * sin( Lsa ) * sin( eps ); } -/** - * Returns angle in degrees from argument in radians. - * - * \copyright GPLv2+ - **/ -double Degrees(double arg) +void predict_observe_sun( const predict_observer_t * observer, + double time, + struct predict_observation * obs ) { - /* Returns angle in degrees from argument in radians */ - return (arg*180.0/M_PI); -} - -void sun_predict(double time, double position[3]) -{ - double jul_utc = time + JULIAN_TIME_DIFF; - double mjd = jul_utc - 2415020.0; - double year = 1900 + mjd / 365.25; - double T = (mjd + Delta_ET(year) / SECONDS_PER_DAY) / 36525.0; - double M = Radians(fmod(358.47583+fmod(35999.04975*T,360.0)-(0.000150+0.0000033*T)*Sqr(T),360.0)); - double L = Radians(fmod(279.69668+fmod(36000.76892*T,360.0)+0.0003025*Sqr(T),360.0)); - double e = 0.01675104-(0.0000418+0.000000126*T)*T; - double C = Radians((1.919460-(0.004789+0.000014*T)*T)*sin(M)+(0.020094-0.000100*T)*sin(2*M)+0.000293*sin(3*M)); - double O = Radians(fmod(259.18-1934.142*T,360.0)); - double Lsa = fmod(L+C-Radians(0.00569-0.00479*sin(O)), 2*M_PI); - double nu = fmod(M+C, 2*M_PI); - double R = 1.0000002*(1.0-Sqr(e))/(1.0+e*cos(nu)); - double eps = Radians(23.452294-(0.0130125+(0.00000164-0.000000503*T)*T)*T+0.00256*cos(O)); - R = ASTRONOMICAL_UNIT_KM*R; - - position[0] = R*cos(Lsa); - position[1] = R*sin(Lsa)*cos(eps); - position[2] = R*sin(Lsa)*sin(eps); -} - -void predict_observe_sun(const predict_observer_t *observer, double time, struct predict_observation *obs) -{ - - // Find sun position - double solar_vector[3]; - sun_predict(time, solar_vector); + // Find sun position + double solar_vector[ 3 ]; + sun_predict( time, solar_vector ); - /* Zero vector for initializations */ - double zero_vector[3] = {0,0,0}; + /* Zero vector for initializations */ + double zero_vector[ 3 ] = { 0, 0, 0 }; - /* Solar observed azimuth and elevation vector */ - vector_t solar_set; + /* Solar observed azimuth and elevation vector */ + vector_t solar_set; - geodetic_t geodetic; - geodetic.lat = observer->latitude; - geodetic.lon = observer->longitude; - geodetic.alt = observer->altitude / 1000.0; - geodetic.theta = 0.0; + geodetic_t geodetic; + geodetic.lat = observer->latitude; + geodetic.lon = observer->longitude; + geodetic.alt = observer->altitude / 1000.0; + geodetic.theta = 0.0; - double jul_utc = time + JULIAN_TIME_DIFF; - Calculate_Obs(jul_utc, solar_vector, zero_vector, &geodetic, &solar_set); + double jul_utc = time; + Calculate_Obs( jul_utc, solar_vector, zero_vector, &geodetic, &solar_set ); - double sun_azi = solar_set.x; - double sun_ele = solar_set.y; + double sun_azi = solar_set.x; + double sun_ele = solar_set.y; - double sun_range = 1.0+((solar_set.z-ASTRONOMICAL_UNIT_KM)/ASTRONOMICAL_UNIT_KM); - double sun_range_rate = 1000.0*solar_set.w; + double sun_range = 1.0 + ( ( solar_set.z - ASTRONOMICAL_UNIT_KM ) / + ASTRONOMICAL_UNIT_KM ); + double sun_range_rate = 1000.0 * solar_set.w; - obs->time = time; - obs->azimuth = sun_azi; - obs->elevation = sun_ele; - obs->range = sun_range; - obs->range_rate = sun_range_rate; + obs->time = time; + obs->azimuth = sun_azi; + obs->elevation = sun_ele; + obs->range = sun_range; + obs->range_rate = sun_range_rate; } /** @@ -103,57 +106,61 @@ void predict_observe_sun(const predict_observer_t *observer, double time, struct * \param dec Declination * \copyright GPLv2+ **/ -void predict_sun_ra_dec(predict_julian_date_t time, double *ra, double *dec) +static void predict_sun_ra_dec( predict_julian_date_t time, + double * ra, + double * dec ) { - //predict absolute position of the sun - double solar_vector[3]; - sun_predict(time, solar_vector); - - //prepare for radec calculation - double jul_utc = time + JULIAN_TIME_DIFF; - double zero_vector[3] = {0,0,0}; - vector_t solar_rad; - - //for some reason, RADec requires QTH coordinates, though - //the properties to be calculated are observer-independent. - //Pick some coordinates, will be correct anyway. - geodetic_t geodetic; - geodetic.lat = 10; - geodetic.lon = 10; - geodetic.alt = 10 / 1000.0; - geodetic.theta = 0.0; - - //calculate right ascension/declination - Calculate_RADec(jul_utc, solar_vector, zero_vector, &geodetic, &solar_rad); - *ra = solar_rad.x; - *dec = solar_rad.y; + // predict absolute position of the sun + double solar_vector[ 3 ]; + sun_predict( time, solar_vector ); + + // prepare for radec calculation + double jul_utc = time; + double zero_vector[ 3 ] = { 0, 0, 0 }; + vector_t solar_rad; + + // for some reason, RADec requires QTH coordinates, though + // the properties to be calculated are observer-independent. + // Pick some coordinates, will be correct anyway. + geodetic_t geodetic; + geodetic.lat = 10; + geodetic.lon = 10; + geodetic.alt = 10 / 1000.0; + geodetic.theta = 0.0; + + // calculate right ascension/declination + Calculate_RADec( jul_utc, solar_vector, zero_vector, &geodetic, &solar_rad ); + *ra = solar_rad.x; + *dec = solar_rad.y; } -double predict_sun_ra(predict_julian_date_t time) +double predict_sun_ra( predict_julian_date_t time ) { - double ra, dec; - predict_sun_ra_dec(time, &ra, &dec); - return ra; + double ra; + double dec; + predict_sun_ra_dec( time, &ra, &dec ); + return ra; } -double predict_sun_declination(predict_julian_date_t time) +double predict_sun_declination( predict_julian_date_t time ) { - double ra, dec; - predict_sun_ra_dec(time, &ra, &dec); - return dec; + double ra; + double dec; + predict_sun_ra_dec( time, &ra, &dec ); + return dec; } -double predict_sun_gha(predict_julian_date_t time) +double predict_sun_gha( predict_julian_date_t time ) { - //predict absolute position of sun - double solar_vector[3]; - sun_predict(time, solar_vector); + // predict absolute position of sun + double solar_vector[ 3 ]; + sun_predict( time, solar_vector ); - //convert to lat/lon/alt - geodetic_t solar_latlonalt; - Calculate_LatLonAlt(time, solar_vector, &solar_latlonalt); + // convert to lat/lon/alt + geodetic_t solar_latlonalt; + Calculate_LatLonAlt( time, solar_vector, &solar_latlonalt ); - //return longitude as the GHA - double sun_lon = 360.0-Degrees(solar_latlonalt.lon); - return sun_lon*M_PI/180.0; + // return longitude as the GHA + double sun_lon = 360.0 - predictRAD2DEG( solar_latlonalt.lon ); + return sun_lon * M_PI / 180.0; } diff --git a/firmware/app/libs/libpredict/src/sun.h b/firmware/app/libs/libpredict/src/sun.h deleted file mode 100644 index 34b88a2d..00000000 --- a/firmware/app/libs/libpredict/src/sun.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef _SUN_H_ -#define _SUN_H_ - -void sun_predict(double time, double position[3]); - -#endif diff --git a/firmware/app/libs/libpredict/src/unsorted.c b/firmware/app/libs/libpredict/src/unsorted.c index 0a3c61bc..641dd044 100644 --- a/firmware/app/libs/libpredict/src/unsorted.c +++ b/firmware/app/libs/libpredict/src/unsorted.c @@ -1,347 +1,444 @@ -#include "unsorted.h" +#include +#include -#include "defs.h" +#include +#include -void vec3_set(double v[3], double x, double y, double z) +void vec3_set( double v[ 3 ], double x, double y, double z ) { - v[0] = x; - v[1] = y; - v[2] = z; + v[ 0 ] = x; + v[ 1 ] = y; + v[ 2 ] = z; } -double vec3_length(const double v[3]) +double vec3_length( const double v[ 3 ] ) { - return sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); + return sqrt( ( v[ 0 ] * v[ 0 ] ) + ( v[ 1 ] * v[ 1 ] ) + + ( v[ 2 ] * v[ 2 ] ) ); } -double vec3_dot(const double v[3], const double u[3]) +double vec3_dot( const double v[ 3 ], const double u[ 3 ] ) { - return (v[0]*u[0] + v[1]*u[1] + v[2]*u[2]); + return ( ( v[ 0 ] * u[ 0 ] ) + ( v[ 1 ] * u[ 1 ] ) + ( v[ 2 ] * u[ 2 ] ) ); } -void vec3_mul_scalar(const double v[3], double a, double r[3]) +void vec3_mul_scalar( const double v[ 3 ], double a, double r[ 3 ] ) { - r[0] = v[0]*a; - r[1] = v[1]*a; - r[2] = v[2]*a; + r[ 0 ] = v[ 0 ] * a; + r[ 1 ] = v[ 1 ] * a; + r[ 2 ] = v[ 2 ] * a; } -void vec3_sub(const double v1[3], const double v2[3], double *r) +void vec3_sub( const double v1[ 3 ], const double v2[ 3 ], double * r ) { - r[0] = v1[0] - v2[0]; - r[1] = v1[1] - v2[1]; - r[2] = v1[2] - v2[2]; + r[ 0 ] = v1[ 0 ] - v2[ 0 ]; + r[ 1 ] = v1[ 1 ] - v2[ 1 ]; + r[ 2 ] = v1[ 2 ] - v2[ 2 ]; } -double Sqr(double arg) +double Sqr( double arg ) { - /* Returns square of a double */ - return (arg*arg); + /* Returns square of a double */ + return ( arg * arg ); } -double FMod2p(double x) +double FMod2p( double x ) { - /* Returns mod 2PI of argument */ + /* Returns mod 2PI of argument */ + double ret_val = fmod( x, ( double ) 2 * ( double ) M_PI ); - double ret_val = fmod(x, 2*M_PI); + if( ret_val < 0.0 ) + { + ret_val += ( ( double ) 2 * ( double ) M_PI ); + } - if (ret_val < 0.0) - ret_val += (2*M_PI); - - return ret_val; + return ret_val; } -void Convert_Sat_State(double pos[3], double vel[3]) +void Convert_Sat_State( double pos[ 3 ], double vel[ 3 ] ) { - /* Converts the satellite's position and velocity */ - /* vectors from normalized values to km and km/sec */ + /* Converts the satellite's position and velocity */ + /* vectors from normalized values to km and km/sec */ - vec3_mul_scalar(pos, EARTH_RADIUS_KM_WGS84, pos); - vec3_mul_scalar(vel, EARTH_RADIUS_KM_WGS84*MINUTES_PER_DAY/SECONDS_PER_DAY, vel); + vec3_mul_scalar( pos, EARTH_RADIUS_KM_WGS84, pos ); + vec3_mul_scalar( vel, + EARTH_RADIUS_KM_WGS84 * MINUTES_PER_DAY / SECONDS_PER_DAY, + vel ); } -double Julian_Date_of_Year(double year) +double Julian_Date_of_Year( double year ) { - /* The function Julian_Date_of_Year calculates the Julian Date */ - /* of Day 0.0 of {year}. This function is used to calculate the */ - /* Julian Date of any date by using Julian_Date_of_Year, DOY, */ - /* and Fraction_of_Day. */ - - /* Astronomical Formulae for Calculators, Jean Meeus, */ - /* pages 23-25. Calculate Julian Date of 0.0 Jan year */ - - long A, B, i; - double jdoy; - - year=year-1; - i=year/100; - A=i; - i=A/4; - B=2-A+i; - i=365.25*year; - i+=30.6001*14; - jdoy=i+1720994.5+B; - - return jdoy; + /* The function Julian_Date_of_Year calculates the Julian Date */ + /* of Day 0.0 of {year}. This function is used to calculate the */ + /* Julian Date of any date by using Julian_Date_of_Year, DOY, */ + /* and Fraction_of_Day. */ + + /* Astronomical Formulae for Calculators, Jean Meeus, */ + /* pages 23-25. Calculate Julian Date of 0.0 Jan year */ + + double y = year; + double jdoy = ( 30.6001 * 14.0 ); + + int64_t A; + int64_t B; + int64_t i; + + y--; + i = ( int64_t ) y / 100.0; + A = i; + i = A / ( int64_t ) 4; + B = ( int64_t ) 2 - A + i; + i = ( int64_t ) ( 365.25 * y ); + i += ( int64_t ) jdoy; + jdoy = ( double ) i + ( double ) 1720994.5 + ( double ) B; + + return jdoy; } -double Julian_Date_of_Epoch(double epoch) -{ - /* The function Julian_Date_of_Epoch returns the Julian Date of */ - /* an epoch specified in the format used in the NORAD two-line */ - /* element sets. It has been modified to support dates beyond */ - /* the year 1999 assuming that two-digit years in the range 00-56 */ - /* correspond to 2000-2056. Until the two-line element set format */ - /* is changed, it is only valid for dates through 2056 December 31. */ - - double year, day; - - /* Modification to support Y2K */ - /* Valid 1957 through 2056 */ - - day=modf(epoch*1E-3, &year)*1E3; - - if (year<57) - year=year+2000; - else - year=year+1900; - - return (Julian_Date_of_Year(year)+day); +double Julian_Date_of_Epoch( double epoch ) +{ + /* The function Julian_Date_of_Epoch returns the Julian Date of */ + /* an epoch specified in the format used in the NORAD two-line */ + /* element sets. It has been modified to support dates beyond */ + /* the year 1999 assuming that two-digit years in the range 00-56 */ + /* correspond to 2000-2056. Until the two-line element set format */ + /* is changed, it is only valid for dates through 2056 December 31. */ + + double year; + double day; + + /* Modification to support Y2K */ + /* Valid 1957 through 2056 */ + + day = modf( epoch * 1E-3, &year ) * 1E3; + + if( year < 57.0 ) + { + year += ( double ) 2000.0; + } + else + { + year += ( double ) 1900.0; + } + + return ( Julian_Date_of_Year( year ) + day ); } -double ThetaG_JD(double jd) +double ThetaG_JD( double jd ) { - /* Reference: The 1992 Astronomical Almanac, page B6. */ - - double UT, TU, GMST; - - double dummy; - UT=modf(jd+0.5, &dummy); - jd = jd - UT; - TU=(jd-2451545.0)/36525; - GMST=24110.54841+TU*(8640184.812866+TU*(0.093104-TU*6.2E-6)); - GMST=fmod(GMST+SECONDS_PER_DAY*EARTH_ROTATIONS_PER_SIDERIAL_DAY*UT,SECONDS_PER_DAY); - - return (2*M_PI*GMST/SECONDS_PER_DAY); + /* Reference: The 1992 Astronomical Almanac, page B6. */ + + double UT; + double TU; + double GMST; + double j = jd; + + double dummy; + UT = modf( j + 0.5, &dummy ); + j -= UT; + TU = ( j - 2451545.0 ) / 36525.0; + GMST = 24110.54841 + ( TU * ( 8640184.812866 + + ( TU * ( 0.093104 - ( TU * 6.2E-6 ) ) ) ) ); + GMST = fmod( GMST + ( SECONDS_PER_DAY * EARTH_ROTATIONS_PER_SIDERIAL_DAY * + UT ), + SECONDS_PER_DAY ); + + return ( 2 * M_PI * GMST / SECONDS_PER_DAY ); } -void Calculate_User_PosVel(double time, geodetic_t *geodetic, double obs_pos[3], double obs_vel[3]) +void Calculate_User_PosVel( double time, + geodetic_t * geodetic, + double obs_pos[ 3 ], + double obs_vel[ 3 ] ) { - /* Calculate_User_PosVel() passes the user's geodetic position - and the time of interest and returns the ECI position and - velocity of the observer. The velocity calculation assumes - the geodetic position is stationary relative to the earth's - surface. */ - - /* Reference: The 1992 Astronomical Almanac, page K11. */ - - double c, sq, achcp; - - geodetic->theta=FMod2p(ThetaG_JD(time)+geodetic->lon); /* LMST */ - c=1/sqrt(1+FLATTENING_FACTOR*(FLATTENING_FACTOR-2)*Sqr(sin(geodetic->lat))); - sq=Sqr(1-FLATTENING_FACTOR)*c; - achcp=(EARTH_RADIUS_KM_WGS84*c+geodetic->alt)*cos(geodetic->lat); - obs_pos[0] = (achcp*cos(geodetic->theta)); /* kilometers */ - obs_pos[1] = (achcp*sin(geodetic->theta)); - obs_pos[2] = ((EARTH_RADIUS_KM_WGS84*sq+geodetic->alt)*sin(geodetic->lat)); - obs_vel[0] = (-EARTH_ANGULAR_VELOCITY*obs_pos[1]); /* kilometers/second */ - obs_vel[1] = (EARTH_ANGULAR_VELOCITY*obs_pos[0]); - obs_vel[2] = (0); + /* Calculate_User_PosVel() passes the user's geodetic position + and the time of interest and returns the ECI position and + velocity of the observer. The velocity calculation assumes + the geodetic position is stationary relative to the earth's + surface. */ + + /* Reference: The 1992 Astronomical Almanac, page K11. */ + + double c; + double sq; + double achcp; + + geodetic->theta = FMod2p( ThetaG_JD( time ) + geodetic->lon ); /* LMST */ + c = 1 / sqrt( 1 + FLATTENING_FACTOR * ( FLATTENING_FACTOR - 2 ) * + Sqr( sin( geodetic->lat ) ) ); + sq = Sqr( 1 - FLATTENING_FACTOR ) * c; + achcp = ( ( EARTH_RADIUS_KM_WGS84 * c ) + geodetic->alt ) * + cos( geodetic->lat ); + obs_pos[ 0 ] = ( achcp * cos( geodetic->theta ) ); /* kilometers */ + obs_pos[ 1 ] = ( achcp * sin( geodetic->theta ) ); + obs_pos[ 2 ] = ( ( ( EARTH_RADIUS_KM_WGS84 * sq ) + geodetic->alt ) * + sin( geodetic->lat ) ); + obs_vel[ 0 ] = ( -EARTH_ANGULAR_VELOCITY * + obs_pos[ 1 ] ); /* kilometers/second + */ + obs_vel[ 1 ] = ( EARTH_ANGULAR_VELOCITY * obs_pos[ 0 ] ); + obs_vel[ 2 ] = ( 0 ); } -long DayNum(int m, int d, int y) +int64_t DayNum( int32_t m, int32_t d, int32_t y ) { - - long dn; - double mm, yy; - - if (m<3) { - y--; - m+=12; - } - - if (y<57) - y+=100; - - yy=(double)y; - mm=(double)m; - dn=(long)(floor(365.25*(yy-80.0))-floor(19.0+yy/100.0)+floor(4.75+yy/400.0)-16.0); - dn+=d+30*m+(long)floor(0.6*mm-0.3); - return dn; + int64_t dn; + double mm; + double yy; + + int32_t year = y; + int32_t month = m; + + if( month < 3 ) + { + year -= 1; + month += 12; + } + + if( year < 57 ) + { + year += 100; + } + + yy = ( double ) year; + mm = ( double ) month; + dn = ( floor( 365.25 * ( yy - 80.0 ) ) - floor( 19.0 + ( yy / 100.0 ) ) + + floor( 4.75 + ( yy / 400.0 ) ) - 16.0 ); + dn += ( int64_t ) d + ( 30 * ( int64_t ) m ) + + ( int64_t ) floor( ( 0.6 * mm ) - 0.3 ); + return dn; } - -void Calculate_LatLonAlt(double time, const double pos[3], geodetic_t *geodetic) +void Calculate_LatLonAlt( double time, + const double pos[ 3 ], + geodetic_t * geodetic ) { - /* Procedure Calculate_LatLonAlt will calculate the geodetic */ - /* position of an object given its ECI position pos and time. */ - /* It is intended to be used to determine the ground track of */ - /* a satellite. The calculations assume the earth to be an */ - /* oblate spheroid as defined in WGS '72. */ - - /* Reference: The 1992 Astronomical Almanac, page K12. */ - - double r, e2, phi, c; - - //Convert to julian time: - time += JULIAN_TIME_DIFF; - - geodetic->theta = atan2(pos[1], pos[0]); /* radians */ - geodetic->lon = FMod2p(geodetic->theta-ThetaG_JD(time)); /* radians */ - r = sqrt(Sqr(pos[0])+Sqr(pos[1])); - e2 = FLATTENING_FACTOR*(2-FLATTENING_FACTOR); - geodetic->lat=atan2(pos[2],r); /* radians */ - - do - { - phi=geodetic->lat; - c=1/sqrt(1-e2*Sqr(sin(phi))); - geodetic->lat=atan2(pos[2]+EARTH_RADIUS_KM_WGS84*c*e2*sin(phi),r); - - } while (fabs(geodetic->lat-phi)>=1E-10); - - geodetic->alt=r/cos(geodetic->lat)-EARTH_RADIUS_KM_WGS84*c; /* kilometers */ - - if (geodetic->lat>PI_HALF) - geodetic->lat-= 2*M_PI; - - if (geodetic->lon>M_PI) - geodetic->lat-= 2*M_PI; + /* Procedure Calculate_LatLonAlt will calculate the geodetic */ + /* position of an object given its ECI position pos and time. */ + /* It is intended to be used to determine the ground track of */ + /* a satellite. The calculations assume the earth to be an */ + /* oblate spheroid as defined in WGS '72. */ + + /* Reference: The 1992 Astronomical Almanac, page K12. */ + + double r; + double e2; + double phi; + double c; + + double t = time; + + geodetic->theta = atan2( pos[ 1 ], pos[ 0 ] ); /* radians */ + geodetic->lon = FMod2p( geodetic->theta - ThetaG_JD( t ) ); /* radians */ + r = sqrt( Sqr( pos[ 0 ] ) + Sqr( pos[ 1 ] ) ); + e2 = FLATTENING_FACTOR * ( 2.0 - FLATTENING_FACTOR ); + geodetic->lat = atan2( pos[ 2 ], r ); /* radians */ + + do + { + phi = geodetic->lat; + c = 1.0 / sqrt( 1.0 - ( e2 * Sqr( sin( phi ) ) ) ); + geodetic->lat = atan2( pos[ 2 ] + ( EARTH_RADIUS_KM_WGS84 * c * e2 * + sin( phi ) ), + r ); + + } while( fabs( geodetic->lat - phi ) >= 1E-10 ); + + geodetic->alt = r / cos( geodetic->lat ) - + ( EARTH_RADIUS_KM_WGS84 * c ); /* kilometers */ + + predictFIX_ANGLE( geodetic->lat, PI_HALF ); + predictFIX_ANGLE( geodetic->lon, M_PI ); } -void Calculate_Obs(double time, const double pos[3], const double vel[3], geodetic_t *geodetic, vector_t *obs_set) +void Calculate_Obs( double time, + const double pos[ 3 ], + const double vel[ 3 ], + geodetic_t * geodetic, + vector_t * obs_set ) { - /* The procedures Calculate_Obs and Calculate_RADec calculate */ - /* the *topocentric* coordinates of the object with ECI position, */ - /* {pos}, and velocity, {vel}, from location {geodetic} at {time}. */ - /* The {obs_set} returned for Calculate_Obs consists of azimuth, */ - /* elevation, range, and range rate (in that order) with units of */ - /* radians, radians, kilometers, and kilometers/second, respectively. */ - /* The WGS '72 geoid is used and the effect of atmospheric refraction */ - /* (under standard temperature and pressure) is incorporated into the */ - /* elevation calculation; the effect of atmospheric refraction on */ - /* range and range rate has not yet been quantified. */ - - /* The {obs_set} for Calculate_RADec consists of right ascension and */ - /* declination (in that order) in radians. Again, calculations are */ - /* based on *topocentric* position using the WGS '72 geoid and */ - /* incorporating atmospheric refraction. */ - - double sin_lat, cos_lat, sin_theta, cos_theta, el, azim, top_s, top_e, top_z; - - double obs_pos[3]; - double obs_vel[3]; - double range[3]; - double rgvel[3]; - - Calculate_User_PosVel(time, geodetic, obs_pos, obs_vel); - - vec3_sub(pos, obs_pos, range); - vec3_sub(vel, obs_vel, rgvel); - - double range_length = vec3_length(range); - - sin_lat=sin(geodetic->lat); - cos_lat=cos(geodetic->lat); - sin_theta=sin(geodetic->theta); - cos_theta=cos(geodetic->theta); - top_s=sin_lat*cos_theta*range[0]+sin_lat*sin_theta*range[1]-cos_lat*range[2]; - top_e=-sin_theta*range[0]+cos_theta*range[1]; - top_z=cos_lat*cos_theta*range[0]+cos_lat*sin_theta*range[1]+sin_lat*range[2]; - azim=atan(-top_e/top_s); /* Azimuth */ - - if (top_s>0.0) - azim=azim+PI; - - if (azim<0.0) - azim = azim + 2*M_PI; - - el=asin_(top_z/range_length); - obs_set->x=azim; /* Azimuth (radians) */ - obs_set->y=el; /* Elevation (radians) */ - obs_set->z=range_length; /* Range (kilometers) */ - - /* Range Rate (kilometers/second) */ - obs_set->w = vec3_dot(range, rgvel)/vec3_length(range); - obs_set->y=el; - - /**** End bypass ****/ - - if (obs_set->y<0.0) - obs_set->y=el; /* Reset to true elevation */ + /* The procedures Calculate_Obs and Calculate_RADec calculate */ + /* the *topocentric* coordinates of the object with ECI position, */ + /* {pos}, and velocity, {vel}, from location {geodetic} at {time}. */ + /* The {obs_set} returned for Calculate_Obs consists of azimuth, */ + /* elevation, range, and range rate (in that order) with units of */ + /* radians, radians, kilometers, and kilometers/second, respectively. */ + /* The WGS '72 geoid is used and the effect of atmospheric refraction */ + /* (under standard temperature and pressure) is incorporated into the */ + /* elevation calculation; the effect of atmospheric refraction on */ + /* range and range rate has not yet been quantified. */ + + /* The {obs_set} for Calculate_RADec consists of right ascension and */ + /* declination (in that order) in radians. Again, calculations are */ + /* based on *topocentric* position using the WGS '72 geoid and */ + /* incorporating atmospheric refraction. */ + + double sin_lat; + double cos_lat; + double sin_theta; + double cos_theta; + double el; + double azim; + double top_s; + double top_e; + double top_z; + + double obs_pos[ 3 ]; + double obs_vel[ 3 ]; + double range[ 3 ]; + double rgvel[ 3 ]; + + Calculate_User_PosVel( time, geodetic, obs_pos, obs_vel ); + + vec3_sub( pos, obs_pos, range ); + vec3_sub( vel, obs_vel, rgvel ); + + double range_length = vec3_length( range ); + + sin_lat = sin( geodetic->lat ); + cos_lat = cos( geodetic->lat ); + sin_theta = sin( geodetic->theta ); + cos_theta = cos( geodetic->theta ); + top_s = ( sin_lat * cos_theta * range[ 0 ] ) + + ( sin_lat * sin_theta * range[ 1 ] ) - ( cos_lat * range[ 2 ] ); + top_e = ( -sin_theta * range[ 0 ] ) + ( cos_theta * range[ 1 ] ); + top_z = ( cos_lat * cos_theta * range[ 0 ] ) + + ( cos_lat * sin_theta * range[ 1 ] ) + ( sin_lat * range[ 2 ] ); + azim = atan( -top_e / top_s ); /* Azimuth */ + + if( top_s > 0.0 ) + { + azim = azim + PI; + } + + if( azim < 0.0 ) + { + azim = azim + ( 2.0 * M_PI ); + } + + el = asin_( top_z / range_length ); + obs_set->x = azim; /* Azimuth (radians) */ + obs_set->y = el; /* Elevation (radians) */ + obs_set->z = range_length; /* Range (kilometers) */ + + /* Range Rate (kilometers/second) */ + obs_set->w = vec3_dot( range, rgvel ) / vec3_length( range ); + obs_set->y = el; + + /**** End bypass ****/ + + if( obs_set->y < 0.0 ) + { + obs_set->y = el; /* Reset to true elevation */ + } } -void Calculate_RADec(double time, const double pos[3], const double vel[3], geodetic_t *geodetic, vector_t *obs_set) +void Calculate_RADec( double time, + const double pos[ 3 ], + const double vel[ 3 ], + geodetic_t * geodetic, + vector_t * obs_set ) { - /* Reference: Methods of Orbit Determination by */ - /* Pedro Ramon Escobal, pp. 401-402 */ - - double phi, theta, sin_theta, cos_theta, sin_phi, cos_phi, az, el, - Lxh, Lyh, Lzh, Sx, Ex, Zx, Sy, Ey, Zy, Sz, Ez, Zz, Lx, Ly, - Lz, cos_delta, sin_alpha, cos_alpha; - - Calculate_Obs(time,pos,vel,geodetic,obs_set); - - az=obs_set->x; - el=obs_set->y; - phi=geodetic->lat; - theta=FMod2p(ThetaG_JD(time)+geodetic->lon); - sin_theta=sin(theta); - cos_theta=cos(theta); - sin_phi=sin(phi); - cos_phi=cos(phi); - Lxh=-cos(az)*cos(el); - Lyh=sin(az)*cos(el); - Lzh=sin(el); - Sx=sin_phi*cos_theta; - Ex=-sin_theta; - Zx=cos_theta*cos_phi; - Sy=sin_phi*sin_theta; - Ey=cos_theta; - Zy=sin_theta*cos_phi; - Sz=-cos_phi; - Ez=0.0; - Zz=sin_phi; - Lx=Sx*Lxh+Ex*Lyh+Zx*Lzh; - Ly=Sy*Lxh+Ey*Lyh+Zy*Lzh; - Lz=Sz*Lxh+Ez*Lyh+Zz*Lzh; - obs_set->y=asin_(Lz); /* Declination (radians) */ - cos_delta=sqrt(1.0-Sqr(Lz)); - sin_alpha=Ly/cos_delta; - cos_alpha=Lx/cos_delta; - obs_set->x=atan2(sin_alpha,cos_alpha); /* Right Ascension (radians) */ - obs_set->x=FMod2p(obs_set->x); + /* Reference: Methods of Orbit Determination by */ + /* Pedro Ramon Escobal, pp. 401-402 */ + + double phi; + double theta; + double sin_theta; + double cos_theta; + double sin_phi; + double cos_phi; + double az; + double el; + double Lxh; + double Lyh; + double Lzh; + double Sx; + double Ex; + double Zx; + double Sy; + double Ey; + double Zy; + double Sz; + double Ez; + double Zz; + double Lx; + double Ly; + double Lz; + double cos_delta; + double sin_alpha; + double cos_alpha; + + Calculate_Obs( time, pos, vel, geodetic, obs_set ); + + az = obs_set->x; + el = obs_set->y; + phi = geodetic->lat; + theta = FMod2p( ThetaG_JD( time ) + geodetic->lon ); + sin_theta = sin( theta ); + cos_theta = cos( theta ); + sin_phi = sin( phi ); + cos_phi = cos( phi ); + Lxh = -cos( az ) * cos( el ); + Lyh = sin( az ) * cos( el ); + Lzh = sin( el ); + Sx = sin_phi * cos_theta; + Ex = -sin_theta; + Zx = cos_theta * cos_phi; + Sy = sin_phi * sin_theta; + Ey = cos_theta; + Zy = sin_theta * cos_phi; + Sz = -cos_phi; + Ez = 0.0; + Zz = sin_phi; + Lx = ( Sx * Lxh ) + ( Ex * Lyh ) + ( Zx * Lzh ); + Ly = ( Sy * Lxh ) + ( Ey * Lyh ) + ( Zy * Lzh ); + Lz = ( Sz * Lxh ) + ( Ez * Lyh ) + ( Zz * Lzh ); + obs_set->y = asin_( Lz ); /* Declination (radians) */ + cos_delta = sqrt( 1.0 - Sqr( Lz ) ); + sin_alpha = Ly / cos_delta; + cos_alpha = Lx / cos_delta; + obs_set->x = atan2( sin_alpha, cos_alpha ); /* Right Ascension (radians) */ + obs_set->x = FMod2p( obs_set->x ); } /* .... SGP4/SDP4 functions end .... */ -char *SubString(const char *string, int buffer_length, char *output_buffer, int start, int end) +char * SubString( const char * string, + int32_t buffer_length, + char * output_buffer, + int32_t start, + int32_t end ) { - - unsigned x, y; - - if ((end >= start) && (buffer_length > end - start + 2)) - { - for (x=start, y=0; x<=end && string[x]!=0; x++) - if (string[x]!=' ') - { - output_buffer[y] = string[x]; - y++; - } - - output_buffer[y]=0; - return output_buffer; - } - else - return NULL; + int32_t x; + int32_t y = 0; + char * retp = NULL; + + if( ( end >= start ) && + ( buffer_length > ( end - start + ( int32_t ) 2 ) ) ) + { + for( x = start; ( x <= end ) && ( string[ x ] != '\0' ); x++ ) + { + if( string[ x ] != ' ' ) + { + output_buffer[ y ] = string[ x ]; + y++; + } + } + + output_buffer[ y ] = 0; + retp = output_buffer; + } + + return retp; } -double acos_(double arg) +double acos_( double arg ) { - return acos(arg < -1.0 ? -1.0 : (arg > 1.0 ? 1.0 : arg)); + return acos( ( arg < -1.0 ) ? -1.0 : ( ( arg > 1.0 ) ? 1.0 : arg ) ); } -double asin_(double arg) +double asin_( double arg ) { - return asin(arg < -1.0 ? -1.0 : (arg > 1.0 ? 1.0 : arg)); + return asin( ( arg < -1.0 ) ? -1.0 : ( ( arg > 1.0 ) ? 1.0 : arg ) ); } diff --git a/firmware/app/libs/libpredict/src/unsorted.h b/firmware/app/libs/libpredict/src/unsorted.h deleted file mode 100644 index 31d06dca..00000000 --- a/firmware/app/libs/libpredict/src/unsorted.h +++ /dev/null @@ -1,196 +0,0 @@ -#ifndef UNSORTED_H_ -#define UNSORTED_H_ - -#include -#include -#include -#include -#include -/* #include */ -#include -/* #include */ - -/** - * Set three-element vector to specified components. - * - * \param v Output vector - * \param x x-component - * \param y y-component - * \param z z-component - **/ -void vec3_set(double v[3], double x, double y, double z); - -/** - * Get length of vector. - * - * \param v Input vector - * \return Euclidean length - **/ -double vec3_length(const double v[3]); - -/** - * Multiply vector by scalar. - * - * \param v Input vector. Overwritten by result - * \param a Scalar to be multiplied into vector - * \param r Resulting vector - **/ -void vec3_mul_scalar(const double v[3], double a, double r[3]); - -/** - * Subtract a vector 2 from vector 1. - * - * \param v1 Vector 1 - * \param v2 Vector 2 - * \param r Resulting vector - **/ -void vec3_sub(const double v1[3], const double v2[3], double *r); - -/** - * Dot product between two vectors. - * - * \param v Vector - * \param u Another vector - * \return Dot product - **/ -double vec3_dot(const double v[3], const double u[3]); - -/** - * Geodetic position structure used by SGP4/SDP4 code. - **/ -typedef struct { - double lat, lon, alt, theta; - } geodetic_t; - -/** - * General three-dimensional vector structure used by SGP4/SDP4 code. - **/ -typedef struct { - double x, y, z, w; - } vector_t; - -/** - * This function returns a substring based on the starting - * and ending positions provided. Trims whitespaces. - * - * \param input_string Full input string - * \param buffer_length Length of output_buffer - * \param output_buffer Returned substring - * \param start Start position - * \param end End position - * \return Pointer to output_buffer - * \copyright GPLv2+ - **/ -char *SubString(const char *input_string, int buffer_length, char *output_buffer, int start, int end); - -/** - * Returns square of a double. - * - * \copyright GPLv2+ - **/ -double Sqr(double arg); - -/** - * Returns mod 2PI of argument. - * - * \copyright GPLv2+ - **/ -double FMod2p(double x); - -/* predict's old date/time management functions. */ - -/** - * Converts the satellite's position and velocity vectors from normalized values to km and km/sec. - * - * \copyright GPLv2+ - **/ -void Convert_Sat_State(double pos[3], double vel[3]); - -/** - * The function Julian_Date_of_Year calculates the Julian Date of Day 0.0 of {year}. This function is used to calculate the Julian Date of any date by using Julian_Date_of_Year, DOY, and Fraction_of_Day. Astronomical Formulae for Calculators, Jean Meeus, pages 23-25. Calculate Julian Date of 0.0 Jan year. - * - * \copyright GPLv2+ - **/ -double Julian_Date_of_Year(double year); - -/** - * The function Julian_Date_of_Epoch returns the Julian Date of an epoch specified in the format used in the NORAD two-line element sets. It has been modified to support dates beyond the year 1999 assuming that two-digit years in the range 00-56 correspond to 2000-2056. Until the two-line element set format is changed, it is only valid for dates through 2056 December 31. Modification to support Y2K. Valid 1957 through 2056. - * - * \copyright GPLv2+ - **/ -double Julian_Date_of_Epoch(double epoch); - -/** - * Reference: The 1992 Astronomical Almanac, page B6. - * - * \copyright GPLv2+ - **/ -double ThetaG_JD(double jd); - -/** - * Calculates the day number from m/d/y. Needed for orbit_decay. - * - * \copyright GPLv2+ - **/ -long DayNum(int month, int day, int year); - -/** - * Procedure Calculate_LatLonAlt will calculate the geodetic position of an object given its ECI position pos and time. It is intended to be used to determine the ground track of a satellite. The calculations assume the earth to be an oblate spheroid as defined in WGS '72. Reference: The 1992 Astronomical Almanac, page K12. - * - * \copyright GPLv2+ - **/ -void Calculate_LatLonAlt(double time, const double pos[3], geodetic_t *geodetic); - -/** - * The procedures Calculate_Obs and Calculate_RADec calculate - * the *topocentric* coordinates of the object with ECI position, - * {pos}, and velocity, {vel}, from location {geodetic} at {time}. - * The {obs_set} returned for Calculate_Obs consists of azimuth, - * elevation, range, and range rate (in that order) with units of - * radians, radians, kilometers, and kilometers/second, respectively. - * The WGS '72 geoid is used and the effect of atmospheric refraction - * (under standard temperature and pressure) is incorporated into the - * elevation calculation; the effect of atmospheric refraction on - * range and range rate has not yet been quantified. - * The {obs_set} for Calculate_RADec consists of right ascension and - * declination (in that order) in radians. Again, calculations are - * based on *topocentric* position using the WGS '72 geoid and - * incorporating atmospheric refraction. - * - * \copyright GPLv2+ - **/ -void Calculate_Obs(double time, const double pos[3], const double vel[3], geodetic_t *geodetic, vector_t *obs_set); - -/** - * Reference: Methods of Orbit Determination by Pedro Ramon Escobal, pp. 401-402 - * - * \copyright GPLv2+ - **/ -void Calculate_RADec(double time, const double pos[3], const double vel[3], geodetic_t *geodetic, vector_t *obs_set); - -/** - * - * \copyright GPLv2+ - **/ -void Calculate_User_PosVel(double time, geodetic_t *geodetic, double obs_pos[3], double obs_vel[3]); - -/** - * Modified version of acos, where arguments above 1 or below -1 yield acos(-1 or +1). - * Used for guarding against floating point inaccuracies. - * - * \param arg Argument - * \return Arc cosine of the argument - **/ -double acos_(double arg); - -/** - * Modified version of asin, where arguments above 1 or below -1 yield acos(-1 or +1). - * Used for guarding against floating point inaccuracies. - * - * \param arg Argument - * \return Arc sine of the argument - **/ -double asin_(double arg); - - -#endif diff --git a/firmware/app/libs/libpredict/src/version.c b/firmware/app/libs/libpredict/src/version.c deleted file mode 100644 index 03d5212b..00000000 --- a/firmware/app/libs/libpredict/src/version.c +++ /dev/null @@ -1,26 +0,0 @@ -#include - -int predict_version_major() -{ - return PREDICT_VERSION_MAJOR; -} - -int predict_version_minor() -{ - return PREDICT_VERSION_MINOR; -} - -int predict_version_patch() -{ - return PREDICT_VERSION_PATCH; -} - -int predict_version() -{ - return PREDICT_VERSION; -} - -char *predict_version_string() -{ - return PREDICT_VERSION_STRING; -} diff --git a/firmware/app/libs/libpredict/tests/CMakeLists.txt b/firmware/app/libs/libpredict/tests/CMakeLists.txt deleted file mode 100644 index 580faa2d..00000000 --- a/firmware/app/libs/libpredict/tests/CMakeLists.txt +++ /dev/null @@ -1,63 +0,0 @@ -link_directories(${LIBPREDICT_LIBRARY_DIR}) - -add_executable(dummy-t dummy-t.c) -add_test(NAME dummy COMMAND dummy-t) - -add_executable(link-t link-t.c) -target_link_libraries(link-t predict) -add_test(NAME link COMMAND link-t) - -#test against satellite data -add_executable(orbit-t orbit-t.cpp testcase_reader.cpp) -target_link_libraries(orbit-t predict) -file(GLOB files "${LIBPREDICT_TEST_DATA_DIR}/sat_*.test") -foreach(file ${files}) - get_filename_component(testname ${file} NAME_WE) - add_test(NAME ${testname} COMMAND orbit-t ${file}) -endforeach() - -#test aos/los on satellite data -add_executable(aoslos-t aoslos-t.cpp testcase_reader.cpp) -target_link_libraries(aoslos-t predict) -file(GLOB files "${LIBPREDICT_TEST_DATA_DIR}/sat_*.test") -foreach(file ${files}) - get_filename_component(testname ${file} NAME_WE) - add_test(NAME aoslos-${testname} COMMAND aoslos-t ${file}) -endforeach() - -#test against sun data -add_executable(sun-t sun-t.cpp testcase_reader.cpp) -target_link_libraries(sun-t predict) -file(GLOB files "${LIBPREDICT_TEST_DATA_DIR}/sun_*.test") -foreach(file ${files}) - get_filename_component(testname ${file} NAME_WE) - add_test(NAME ${testname} COMMAND sun-t ${file}) -endforeach() - -#test against moon data -add_executable(moon-t moon-t.cpp testcase_reader.cpp) -target_link_libraries(moon-t predict) -file(GLOB files "${LIBPREDICT_TEST_DATA_DIR}/moon_*.test") -foreach(file ${files}) - get_filename_component(testname ${file} NAME_WE) - add_test(NAME ${testname} COMMAND moon-t ${file}) -endforeach() - -#test max elevation function -add_executable(maxelevation-t maxelevation-t.cpp testcase_reader.cpp) -target_link_libraries(maxelevation-t predict) -file(GLOB files "${LIBPREDICT_TEST_DATA_DIR}/sat_*.test") -foreach(file ${files}) - get_filename_component(testname ${file} NAME_WE) - add_test(NAME maxelevation-${testname} COMMAND maxelevation-t ${file}) -endforeach() - -#test predict_is_geostationary -add_executable(geostationary-t geostationary-t.cpp testcase_reader.cpp) -target_link_libraries(geostationary-t predict) -file(GLOB files "${LIBPREDICT_TEST_DATA_DIR}/sat_*.test") -add_test(NAME geostationary-celestrak-geostationary COMMAND geostationary-t ${LIBPREDICT_TEST_DATA_DIR}/geostationary.tle) -add_test(NAME geostationary-all-tles COMMAND geostationary-t ${LIBPREDICT_TEST_DATA_DIR}/large-tle-collection.tle ${LIBPREDICT_TEST_DATA_DIR}/geosynchronous_satellite_numbers.dat) -foreach(file ${files}) - get_filename_component(testname ${file} NAME_WE) -endforeach() diff --git a/firmware/app/libs/libpredict/tests/aoslos-t.cpp b/firmware/app/libs/libpredict/tests/aoslos-t.cpp deleted file mode 100644 index 1a69a038..00000000 --- a/firmware/app/libs/libpredict/tests/aoslos-t.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "testcase_reader.h" -#include -using namespace std; - -int runtest(const char *filename); - -int main(int argc, char **argv) -{ - // Check arguments - if (argc < 2) { - cout << "Usage: " << argv[0] << " " << endl; - return -1; - } - - // Test all provided test files - int retval = 0; - for (int i = 1; i < argc; ++i) { - if (runtest(argv[i])) { - cout << argv[i] << ": failed" << endl; - retval = -1; - } else { - cout << argv[i] << ": OK" << endl; - } - } - - return retval; -} - -/** - * Predict AOS/LOS for several passes after the start time, and check that the times are consistent with each other, that elevation is non-zero in the center - * and that the elevation rates are correct at each point. - * - * \param orbital_elements Orbital elements - * \param observer Observer - * \param start_time Start time - * \return 0 on success, -1 on failure - **/ -int aoslos_timepoint_consistency_test(predict_orbital_elements_t *orbital_elements, predict_observer_t *observer, double start_time); - -int runtest(const char *filename) -{ - // Load testcase - TestCaseReader testcase; - testcase.loadFromFile(filename); - if (!(testcase.containsValidData() && (testcase.containsValidQth()) && (testcase.containsValidTLE()))) { - fprintf(stderr, "Failed to load testfile: %s\n", filename); - return -1; - } - - // Get TLE - char *tle[2]; - testcase.getTLE(tle); - - // Create orbit object - predict_orbital_elements_t *orbital_elements = predict_parse_tle(tle[0], tle[1]); - - // Create observer object - predict_observer_t *obs = predict_create_observer("test", testcase.latitude()*M_PI/180.0, testcase.longitude()*M_PI/180.0, testcase.altitude()); - if (!obs) { - fprintf(stderr, "Failed to initialize observer!"); - return -1; - } - - // Use first available time as start time for AOS/LOS finding - double start_time = predict_to_julian(testcase.data()[0][0]); - - //check whether the pass makes sense wrt elevation and/or elevation rate at start, end and middle of pass - if (aoslos_timepoint_consistency_test(orbital_elements, obs, start_time) != 0) { - return -1; - } - - return 0; -} - -//The tolerance used for fine-tuning the elevations in the aoslos-functions -#define ELEVATION_ZERO_TOLERANCE 0.3 - -//Expected time between two passes should at least be 20 minutes -#define PASS_TIME_THRESH (20.0/(24*60)) - -int aoslos_timepoint_consistency_test(predict_orbital_elements_t *orbital_elements, predict_observer_t *observer, double start_time) -{ - if (predict_is_geosynchronous(orbital_elements)) { - return 0; - } - - struct predict_observation aos, los; - aos = predict_next_aos(observer, orbital_elements, start_time); - double aos_time = aos.time; - los = predict_next_los(observer, orbital_elements, aos_time); - double los_time = los.time; - - struct predict_position orbit; - struct predict_observation observation; - - const int NUM_PASSES = 10; - for (int i=0; i < NUM_PASSES; i++) { - if (los_time <= aos_time) { - fprintf(stderr, "los time not strictly larger than aos time: %f %f\n", aos_time, los_time); - return -1; - } - - predict_orbit(orbital_elements, &orbit, aos_time); - predict_observe_orbit(observer, &orbit, &observation); - double elevation_rate_aos = observation.elevation_rate; - - predict_orbit(orbital_elements, &orbit, los_time); - predict_observe_orbit(observer, &orbit, &observation); - double elevation_rate_los = observation.elevation_rate; - - if ((elevation_rate_aos <= 0) || (elevation_rate_los >= 0)) { - fprintf(stderr, "Elevation rates do not have correct signs for aos and los times: %f (%f) %f (%f)\n", elevation_rate_aos, aos_time, elevation_rate_los, los_time); - return -1; - } - - double midpass = (los_time - aos_time)/2.0 + aos_time; - predict_orbit(orbital_elements, &orbit, midpass); - predict_observe_orbit(observer, &orbit, &observation); - - if (observation.elevation <= 0.0) { - fprintf(stderr, "Elevation is negative during the middle of a pass: %f %f %f\n", aos_time, midpass, los_time); - return -1; - } - - double prev_los_time = los_time; - double prev_aos_time = aos_time; - struct predict_observation aos, los; - aos = predict_next_aos(observer, orbital_elements, los_time); - aos_time = aos.time; - los = predict_next_los(observer, orbital_elements, aos_time); - los_time = los.time; - - if (!((los_time > aos_time) && (los_time > prev_los_time) && (los_time > prev_aos_time) && (aos_time > prev_los_time))) { - fprintf(stderr, "New AOS/LOS not strictly larger than previous AOS/LOS\n"); - return -1; - } - - if ((aos_time - prev_los_time) < PASS_TIME_THRESH) { - fprintf(stderr, "Time between passes not significantly different: %f minutes\n", (aos_time - prev_los_time)*24*60); - return -1; - } - - //check that time between LOS time and next AOS time produces negative elevations - double timestep = 1.0/(24.0*50); - double curr_time = prev_los_time + timestep; - while (curr_time < aos_time - timestep) { - predict_orbit(orbital_elements, &orbit, curr_time); - predict_observe_orbit(observer, &orbit, &observation); - if (observation.elevation*180.0/M_PI >= ELEVATION_ZERO_TOLERANCE) { - fprintf(stderr, "AOS/LOS failed consistency check between two passes: %f %f %f %f\n", curr_time, observation.elevation, prev_los_time, aos_time); - return -1; - } - curr_time += timestep; - } - } - - return 0; -} diff --git a/firmware/app/libs/libpredict/tests/data-generator/generate_predict_testcases.sh b/firmware/app/libs/libpredict/tests/data-generator/generate_predict_testcases.sh deleted file mode 100755 index 66f482b8..00000000 --- a/firmware/app/libs/libpredict/tests/data-generator/generate_predict_testcases.sh +++ /dev/null @@ -1,221 +0,0 @@ -#!/bin/bash - -## Master file for generating test data from predict for use in validating libpredict's API functions. -## Uses the UDP server functionality in predict for generating data. -## Will compile an UDP client and use this for communicating. -## -## See list at the bottom of this file for files that are generated. -## -## Note that the granularity of the time is accurate to a second, while the obtained data can be -## anywhere from the obtained timestamp up till the next second. predict also uses only two decimals in -## the output. -## -## Also note that due to internal restrictions in predict, TLE files should be restricted to 24 satellites, as -## there otherwise could be undefined behavior in the UDP calls to the predict server. - - -# Generate QTH lines for testcase file from predict QTH file. -function get_qth_string(){ - qth_file="$1" - echo "[qth]" - echo "lat=$(sed '2!d' $qth_file | sed -rn 's/\s//p')" - lon=$(sed '3!d' $qth_file | sed -rn 's/\s//p') - - #convert longitude from N/W to N/E - lon=$(echo "-1*$lon" | bc) - - echo "lon=$lon" - echo "alt=$(sed '4!d' $qth_file | sed -rn 's/\s//p')" -} - -# Generate testcase data for a given satellite -# Usage: generate_satellite_testcase TLE_file QTH_file satellite_name start_time track_time output_filename -# \param TLE_file File containing TLE data (should not contain more than approx. 20 satellites due to internal restrictions in predict) -# \param QTH_file File containing the QTH -# \param satellite_name Name of satellite that is to be tracked (will use corresponding satellite in the TLE file) -# \param start_time Start time in format e.g. 2015-09-21 11:00 -# \param track_time Total tracked time in number of seconds from the start time -function generate_satellite_testcase(){ - tle_file="$1" - qth_file="$2" - db_file="$3" - satellite_name="$4" - start_time="$5" - tot_secs="$6" - testcase_filename="../data/sat_${satellite_name}_$(echo $start_time | sed -r 's/[-|_|:| ]//g').test" - - #move db file where predict can find it - mkdir -p .predict - cp $db_file .predict/predict.db - prevhome="$HOME" - HOME="." - - #parse tle and qth information into testcase file - echo "[tle]" > $testcase_filename - grep -A 2 "$satellite_name" $tle_file | tail -2 >> $testcase_filename - - echo "" >> $testcase_filename - echo "$(get_qth_string $qth_file)" >> $testcase_filename - - echo "freq=0" >> $testcase_filename - - #parse alat, alon into testcase file - alatalon=$(echo $(grep "$satellite_name" "$db_file" -A 2 | sed '3!d' | sed -rn 's/(.*)/\1/p')) - if [ -z "$alatalon" ]; then - alatalon="No alat, alon" #in case there was no entry for the satellite in the .db file - fi - alatalon=$(echo $alatalon | sed -r 's/, alon/, No alon/g') - echo "alat=$(echo $alatalon | sed -r 's/(.*), .*/\1/g')" >> $testcase_filename - echo "alon=$(echo $alatalon | sed -r 's/.*, (.*)/\1/g')" >> $testcase_filename - - #predict orbit - echo "" >> $testcase_filename - echo "[data]" >> $testcase_filename - faketime "$start_time" predict -t $tle_file -q $qth_file -s & - steps=$(seq 1 $tot_secs) - for timestemp in $steps; do - sleep 1 - predict_response=($(./predict_client "GET_SAT $satellite_name")) - echo ${predict_response[@]} >> "test_file.dat" - time=$(./predict_client "GET_TIME") - doppler_shift=($(./predict_client "GET_DOPPLER $satellite_name")) - satname=${predict_response[0]} - lon=$(echo "360-${predict_response[1]}" | bc) #convert to N/E - lat=${predict_response[2]} - az=${predict_response[3]} - el=${predict_response[4]} - aostime=${predict_response[5]} - footprint=${predict_response[6]} - range=${predict_response[7]} - alt=${predict_response[8]} - vel=${predict_response[9]} - revolutions=${predict_response[10]} - visibility=${predict_response[11]} - - case $visibility in - N) - visibility="0" - ;; - D) - visibility="1" - ;; - V) - visibility="2" - ;; - esac - - phase=${predict_response[12]} - eclipse_depth=${predict_response[13]} - squint=${predict_response[14]} - echo "$time,$lat,$lon,$alt,$az,$el,$doppler_shift,$squint,$phase,$revolutions,$footprint,$range,$vel,$visibility,$eclipse_depth" >> $testcase_filename - done - killall predict - sleep 1 - HOME="$prevhome" -} - -# Generate testcase data for sun tracking. -# Usage: generate_sun_testcase start_time track_time QTH_file output_filename -# \param start_time Start time in format e.g. 2015-09-21 11:00 -# \param track_time Total tracked time in number of seconds from the start time -# \param QTH_file File containing the QTH -function generate_sun_testcase(){ - start_time="$1" - tot_secs="$2" - qth_file="$3" - testcase_filename="../data/sun_$(echo $start_time | sed -r 's/[-|_|:| ]//g').test" - - #parse qth information into testcase file - echo "$(get_qth_string $qth_file)" >> $testcase_filename - - faketime "$start_time" predict -q $qth_file -s & - - echo "" >> $testcase_filename - echo "[data]" >> $testcase_filename - steps=$(seq 1 $tot_secs) - for timestemp in $steps; do - sleep 1 - predict_response=($(./predict_client "GET_SUN")) - time=$(./predict_client "GET_TIME") - az=${predict_response[0]} - el=${predict_response[1]} - dec=${predict_response[2]} - gha=${predict_response[3]} - ra=${predict_response[4]} - echo $time,$az,$el,$dec,$gha,$ra >> $testcase_filename - done - killall predict - sleep 1 -} - -# Generate testcase data for moon tracking. -# Usage: generate_moon_testcase start_time track_time QTH_file output_filename -# \param start_time Start time in format e.g. 2015-09-21 11:00 -# \param track_time Total tracked time in number of seconds from the start time -# \param QTH_file File containing the QTH -function generate_moon_testcase(){ - start_time="$1" - tot_secs="$2" - qth_file="$3" - testcase_filename="../data/moon_$(echo $start_time | sed -r 's/[-|_|:| ]//g').test" - - #parse qth information into testcase file - echo "$(get_qth_string $qth_file)" >> $testcase_filename - - faketime "$start_time" predict -q $qth_file -s & - - echo "" >> $testcase_filename - echo "[data]" >> $testcase_filename - steps=$(seq 1 $tot_secs) - for timestemp in $steps; do - sleep 1 - predict_response=($(./predict_client "GET_MOON")) - time=$(./predict_client "GET_TIME") - az=${predict_response[0]} - el=${predict_response[1]} - dec=${predict_response[2]} - gha=${predict_response[3]} - ra=${predict_response[4]} - echo $time,$az,$el,$dec,$gha,$ra >> $testcase_filename - done - killall predict - sleep 1 -} - -killall predict - -#compile and prepare UDP client -gcc -o predict_client predict_client.c - -#Elliptic orbit -#Is SDP4, has defined alon, alat in .db-file for squint angle calc -generate_satellite_testcase "testcase.tle" "testcase.qth" "testcase.db" "MOLNIYA_1-29" "2015-09-26 18:00" "20" - -#Geostationary -#Is SDP4, has defined alon, alat in .db-file for squint angle calc -generate_satellite_testcase "testcase.tle" "testcase.qth" "testcase.db" "THOR_III" "2015-09-26 18:00" "20" - -#Sun-synchronous -generate_satellite_testcase "testcase.tle" "testcase.qth" "testcase.db" "HINODE" "2015-09-26 18:00" "20" - -#Frozen orbit -generate_satellite_testcase "testcase.tle" "testcase.qth" "testcase.db" "ERS-1" "2015-09-26 18:00" "20" - -#High Earth Orbit -generate_satellite_testcase "testcase.tle" "testcase.qth" "testcase.db" "VELA-1" "2015-09-26 18:00" "20" - -#Medium Earth Orbit -#Is SDP4, has defined alon, alat in .db-file for squint angle calc -generate_satellite_testcase "testcase.tle" "testcase.qth" "testcase.db" "GPS_BIIA-10" "2015-09-26 18:00" "20" - -#Tundra orbit -generate_satellite_testcase "testcase.tle" "testcase.qth" "testcase.db" "SIRIUS-1" "2015-09-26 18:00" "20" - -#Low Earth Orbit -generate_satellite_testcase "testcase.tle" "testcase.qth" "testcase.db" "ISS" "2015-09-26 18:00" "20" - -#sun and moon -generate_sun_testcase "2015-09-20 19:33" "20" "testcase.qth" -generate_sun_testcase "2015-09-21 06:00" "20" "testcase.qth" -generate_moon_testcase "2015-09-20 10:00" "20" "testcase.qth" -generate_moon_testcase "2015-09-20 16:00" "20" "testcase.qth" diff --git a/firmware/app/libs/libpredict/tests/data-generator/predict_client.c b/firmware/app/libs/libpredict/tests/data-generator/predict_client.c deleted file mode 100644 index 20468ad9..00000000 --- a/firmware/app/libs/libpredict/tests/data-generator/predict_client.c +++ /dev/null @@ -1,224 +0,0 @@ -/**************************************************************************** -* * -* This program is a template that can used for building client programs * -* for PREDICT. This program functions by sending a data request to the * -* server (the machine on which PREDICT is running in server mode), and * -* retrieves the response from the server. Some parsing is required to * -* extract information from PREDICT's response and fill variables as * -* needed. Examples of how this is done are shown in this sample program. * -* * -* This program defaults to "localhost" as the name of machine on which * -* PREDICT is running in server mode. * -* * -***************************************************************************** -* * -* This program was originally written by Ivan Galysh, KD4HBO, 24-Jan-2000 * -* and has been modified extensively since. Most recently, Bent Bagger, * -* OZ6BL, provided a patch to detect the absence of a PREDICT server, * -* and print an error message to that effect. * -* * -* Last modified on 30-March-2003 * -* * -***************************************************************************** -* * -* This program is free software; you can redistribute it and/or modify it * -* under the terms of the GNU General Public License as published by the * -* Free Software Foundation; either version 2 of the License or any later * -* version. * -* * -* This program is distributed in the hope that it will useful, but WITHOUT * -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * -* for more details. * -* * -*****************************************************************************/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MAX_BYTES 625 -char string[MAX_BYTES]; - -void handler() -{ - /* This is a function that is called when the response function - times out. This is in case the server fails to respond. */ - - signal(SIGALRM,handler); -} - -int connectsock(char *host, char *service, char *protocol) -{ - /* This function is used to connect to the server. "host" is the - name of the computer on which PREDICT is running in server mode. - "service" is the name of the socket port. "protocol" is the - socket protocol. It should be set to UDP. */ - - struct hostent *phe; - struct servent *pse; - struct protoent *ppe; - struct sockaddr_in sin; - - int s, type; - - bzero((char *)&sin,sizeof(struct sockaddr_in)); - sin.sin_family=AF_INET; - - if ((pse=getservbyname(service,protocol))) - sin.sin_port=pse->s_port; - - else if ((sin.sin_port=htons((unsigned short)atoi(service)))==0) - { - printf("Can't get services\n"); - return -1; - } - - if ((phe=gethostbyname(host))) - bcopy(phe->h_addr,(char *)&sin.sin_addr,phe->h_length); - - else if ((sin.sin_addr.s_addr=inet_addr(host))==INADDR_NONE) - { - printf("Can't get host: \"%s\".\n",host); - return -1; - } - - if ((ppe=getprotobyname(protocol))==0) - return -1; - - if (strcmp(protocol,"udp")==0) - type=SOCK_DGRAM; - else - type=SOCK_STREAM; - - s=socket(PF_INET,type,ppe->p_proto); - - if (s<0) - { - printf("Can't get socket.\n"); - return -1; - } - - if (connect(s,(struct sockaddr *)&sin,sizeof(sin))<0) - { - printf("Can't connect to socket.\n"); - return -1; - } - - return s; -} - -void get_response(int sock, char *buf) -{ - /* This function gets a response from the - server in the form of a character string. */ - - int n; - - n=read(sock,buf,MAX_BYTES); - - if (n<0) - { - if (errno==EINTR) - return; - - if (errno==ECONNREFUSED) - { - fprintf(stderr, "Connection refused - PREDICT server not running\n"); - exit (1); - } - } - - buf[n]='\0'; -} - -char *send_command(host, command) -char *host, *command; -{ - int sk; - - /* This function sends "command" to PREDICT running on - machine "host", and returns the result of the command - as a pointer to a character string. */ - - /* Open a network socket */ - sk=connectsock(host,"predict","udp"); - - if (sk<0) - exit(-1); - - /* Build a command buffer */ - sprintf(string,"%s\n",command); - - /* Send the command to the server */ - write(sk,command,strlen(string)); - - /* clear string[] so it can be re-used for the response */ - string[0]=0; - - /* Get the response */ - get_response(sk,string); - - /* Close the connection */ - close(sk); - - return string; -} - -void send_command2(host, command) -char *host, *command; -{ - int sk; - - /* This function sends "command" to PREDICT running on - machine "host", and displays the result of the command - on the screen as text. It reads the data sent back - from PREDICT until an EOF marker (^Z) is received. */ - - /* Open a network socket */ - sk=connectsock(host,"predict","udp"); - - if (sk<0) - exit(-1); - - /* Build a command buffer */ - sprintf(string,"%s\n",command); - - /* Send the command to the server */ - write(sk,command,strlen(string)); - - /* clear string[] so it can be re-used for the response */ - string[0]=0; - - /* Read and display the response until a ^Z is received */ - get_response(sk,string); - - while (string[0]!=26) /* Control Z */ - { - printf("%s",string); - string[0]=0; - get_response(sk,string); - } - - printf("\n"); - - /* Close the connection */ - close(sk); -} - -int main(int argc, char *argv[]) -{ - char result[MAX_BYTES]; - strcpy(result, send_command("localhost",argv[1])); - printf("%s", result); - return 0; -} diff --git a/firmware/app/libs/libpredict/tests/data-generator/prepare_geosynchronous_testcase_data.sh b/firmware/app/libs/libpredict/tests/data-generator/prepare_geosynchronous_testcase_data.sh deleted file mode 100755 index d7d999bd..00000000 --- a/firmware/app/libs/libpredict/tests/data-generator/prepare_geosynchronous_testcase_data.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash - -#Obtain TLE-s containing both geosynchronous and non-geosynchronous objects, -#and a list over satellite numbers that should correspond to geosynchronous objects. - -#Script was tailored specifically for obtaining list over geostationary satellite -#numbers and TLEs at 2017-04-29. Will need tweaking when running this script far into the future, -#as URLs might change and the PDF containing recent orbit classification has to be re-obtained from -#some source. - -#celestrak TLEs -wget https://www.celestrak.com/NORAD/elements/tle-new.txt -wget https://www.celestrak.com/NORAD/elements/weather.txt -wget https://www.celestrak.com/NORAD/elements/noaa.txt -wget https://www.celestrak.com/NORAD/elements/goes.txt -wget https://www.celestrak.com/NORAD/elements/resource.txt -wget https://www.celestrak.com/NORAD/elements/sarsat.txt -wget https://www.celestrak.com/NORAD/elements/dmc.txt -wget https://www.celestrak.com/NORAD/elements/tdrss.txt -wget https://www.celestrak.com/NORAD/elements/argos.txt -wget https://www.celestrak.com/NORAD/elements/geo.txt -wget https://www.celestrak.com/NORAD/elements/intelsat.txt -wget https://www.celestrak.com/NORAD/elements/ses.txt -wget https://www.celestrak.com/NORAD/elements/iridium-NEXT.txt -wget https://www.celestrak.com/NORAD/elements/iridium.txt -wget https://www.celestrak.com/NORAD/elements/orbcomm.txt -wget https://www.celestrak.com/NORAD/elements/globalstar.txt -wget https://www.celestrak.com/NORAD/elements/amateur.txt -wget https://www.celestrak.com/NORAD/elements/x-comm.txt -wget https://www.celestrak.com/NORAD/elements/other-comm.txt -wget https://www.celestrak.com/NORAD/elements/molniya.txt -wget https://www.celestrak.com/NORAD/elements/raduga.txt -wget https://www.celestrak.com/NORAD/elements/gorizont.txt -wget https://www.celestrak.com/NORAD/elements/gps-ops.txt -wget https://www.celestrak.com/NORAD/elements/glo-ops.txt -wget https://www.celestrak.com/NORAD/elements/beidou.txt -wget https://www.celestrak.com/NORAD/elements/galileo.txt -wget https://www.celestrak.com/NORAD/elements/sbas.txt -wget https://www.celestrak.com/NORAD/elements/nnss.txt -wget https://www.celestrak.com/NORAD/elements/musson.txt -wget https://www.celestrak.com/NORAD/elements/science.txt -wget https://www.celestrak.com/NORAD/elements/geodetic.txt -wget https://www.celestrak.com/NORAD/elements/education.txt -wget https://www.celestrak.com/NORAD/elements/engineering.txt -wget https://www.celestrak.com/NORAD/elements/radar.txt -wget https://www.celestrak.com/NORAD/elements/military.txt -wget https://www.celestrak.com/NORAD/elements/cubesat.txt -wget https://www.celestrak.com/NORAD/elements/other.txt - -mkdir -p tles -mv *.txt tles/ - -#geostationary satellites, as defined by celestrak.com -cp tles/geo.txt ../data/geostationary.tle - -#all acquired TLEs from above -cat tles/*.txt > ../data/large-tle-collection.tle - -#Obtain list over geostationary satellites, approximately up to date at time of acquisition. Will probably not -#contain geosynchronous satellites in general, or inactive satellites in geosynchronous orbits. -#URL might be exact in the future and the format might change, this is kept here for future reference. -wget http://www.satellite-calculations.com/Satellite/satellitelist.php -O satlist.html -html2text satlist.html | sed -r 's/\|/ /g' | awk '{print $3}' | sed -rn 's/^([0-9]+)$/\1/p' > ../data/geosynchronous_satellite_numbers.dat - -#obtain list of geosynchronous objects from ESA geosynchronous classifiction report ("Classification of geosynchronous objects", ESA. Issued regularly) -#List is up to date at 2017-01-01 (issue 19). Will not contain later launches or orbital changes. -#PDF file is not included in the repository, will have to be downloaded manually. -pdftotext -f 42 -l 150 ESA_GEO_Classification_Report_issue_19.pdf - | sed -rn 's/^([0-9]+)$/\1/p' >> ../data/geosynchronous_satellite_numbers.dat diff --git a/firmware/app/libs/libpredict/tests/data-generator/testcase.db b/firmware/app/libs/libpredict/tests/data-generator/testcase.db deleted file mode 100644 index de3987b9..00000000 --- a/firmware/app/libs/libpredict/tests/data-generator/testcase.db +++ /dev/null @@ -1,72 +0,0 @@ -MOLNIYA_1-29 -07780 -0, 0 -Mode A Transponder -0, 0 -0, 0 -No weekly schedule -No orbital schedule -end -THOR_III -25358 -50, 90 -Mode A Transponder -0, 0 -0, 0 -No weekly schedule -No orbital schedule -end -HINODE -29479 -No alat, alon -Mode A Transponder -0, 0 -0, 0 -No weekly schedule -No orbital schedule -end -ERS-1 -21574 -No alat, alon -Mode A Transponder -0, 0 -0, 0 -No weekly schedule -No orbital schedule -end -VELA-1 -00692 -No alat, alon -Mode A Transponder -0, 0 -0, 0 -No weekly schedule -No orbital schedule -end -GPS_BIAA-10 -20959 -180, 10 -Mode A Transponder -0, 0 -0, 0 -No weekly schedule -No orbital schedule -end -SIRIUS-1 -26390 -No alat, alon -Mode A Transponder -0, 0 -0, 0 -No weekly schedule -No orbital schedule -end -ISS -25544 -No alat, alon -Mode A Transponder -0, 0 -0, 0 -No weekly schedule -No orbital schedule -end diff --git a/firmware/app/libs/libpredict/tests/data-generator/testcase.qth b/firmware/app/libs/libpredict/tests/data-generator/testcase.qth deleted file mode 100644 index 078965b6..00000000 --- a/firmware/app/libs/libpredict/tests/data-generator/testcase.qth +++ /dev/null @@ -1,4 +0,0 @@ -q - 63.9 - -10.9 - 0 diff --git a/firmware/app/libs/libpredict/tests/data-generator/testcase.tle b/firmware/app/libs/libpredict/tests/data-generator/testcase.tle deleted file mode 100644 index 14d11e72..00000000 --- a/firmware/app/libs/libpredict/tests/data-generator/testcase.tle +++ /dev/null @@ -1,24 +0,0 @@ -MOLNIYA_1-29 -1 07780U 75036A 15268.44024861 .00000357 00000-0 -30994-3 0 9998 -2 07780 61.6281 228.0088 7320994 263.7628 16.5221 2.00561847296359 -THOR_III -1 25358U 98035A 15268.24841071 -.00000057 00000-0 00000+0 0 9999 -2 25358 4.3158 63.1329 0002182 131.4584 254.3027 1.00273084 63433 -HINODE -1 29479U 06041A 15269.11672282 .00000318 00000-0 69027-4 0 9994 -2 29479 98.1514 267.8479 0018201 43.1347 317.1278 14.64523079481168 -ERS-1 -1 21574U 91050A 15268.99630557 .00000263 00000-0 10150-3 0 9991 -2 21574 98.3773 218.1360 0034080 40.2399 0.7933 14.37359081267054 -VELA-1 -1 00692U 63039C 15270.70453905 -.00001516 00000-0 00000+0 0 9999 -2 00692 35.8806 1.0617 5492959 190.0635 359.6944 0.22560069 41927 -GPS_BIIA-10 -1 20959U 90103A 15268.04814446 -.00000015 00000-0 00000+0 0 9997 -2 20959 54.2521 190.2003 0113059 6.2850 353.8618 2.00562036181841 -SIRIUS-1 -1 26390U 00035A 15263.05767392 .00000057 00000-0 00000+0 0 9995 -2 26390 59.7673 235.4685 2643498 268.8985 140.1391 1.00280878 55759 -ISS -1 25544U 98067A 15268.21313216 .00005785 00000-0 94507-4 0 9995 -2 25544 51.6463 304.6860 0005196 319.3549 152.0018 15.54144244963604 diff --git a/firmware/app/libs/libpredict/tests/data/geostationary.tle b/firmware/app/libs/libpredict/tests/data/geostationary.tle deleted file mode 100644 index 1cc1b273..00000000 --- a/firmware/app/libs/libpredict/tests/data/geostationary.tle +++ /dev/null @@ -1,1323 +0,0 @@ -TDRS 3 -1 19548U 88091B 17117.43482086 -.00000309 00000-0 00000-0 0 9998 -2 19548 14.4377 8.4853 0038291 314.2229 347.1134 1.00274614 91894 -SKYNET 4C -1 20776U 90079A 17117.35448114 .00000118 00000-0 00000-0 0 9994 -2 20776 13.8074 16.6196 0002327 1.9377 358.0135 1.00274747 97459 -TDRS 5 -1 21639U 91054B 17117.70188633 .00000077 00000-0 00000-0 0 9997 -2 21639 14.3454 21.9512 0025210 344.6898 294.5266 1.00262986 94243 -TDRS 6 -1 22314U 93003B 17117.43419350 -.00000301 00000-0 00000-0 0 9998 -2 22314 13.8692 24.8717 0006388 315.6641 345.3318 1.00265130 88970 -INTELSAT 701 (IS-701) -1 22871U 93066A 17117.84915325 -.00000228 00000-0 00000-0 0 9991 -2 22871 4.1027 67.2656 0003830 326.2480 98.6790 1.00270267 85958 -ASTRA 1D -1 23331U 94070A 17117.94887056 -.00000297 00000-0 00000-0 0 9995 -2 23331 7.4884 49.6425 0003975 337.7411 123.0119 1.00270333 82821 -BRASILSAT B2 -1 23536U 95016A 17117.25374222 -.00000287 00000-0 00000-0 0 9992 -2 23536 7.1112 51.5320 0001897 343.0176 204.2203 1.00270849 80842 -AMSC 1 -1 23553U 95019A 17116.80157384 -.00000121 00000-0 00000-0 0 9999 -2 23553 10.0205 40.3317 0005329 345.7280 14.1729 1.00273269 80703 -TDRS 7 -1 23613U 95035B 17117.68131510 -.00000210 00000-0 00000-0 0 9993 -2 23613 14.9559 15.6529 0032064 358.5136 171.6632 1.00276770 79680 -ECHOSTAR 1 -1 23754U 95073A 17117.51259294 -.00000252 00000-0 00000-0 0 9999 -2 23754 0.7063 90.2833 0002531 293.7045 298.9798 1.00272672 18946 -INMARSAT 3-F1 -1 23839U 96020A 17117.92549392 -.00000004 00000-0 00000-0 0 9997 -2 23839 3.8911 67.7201 0006122 329.3836 216.6400 1.00273042 76851 -ASTRA 1F -1 23842U 96021A 17117.93035581 .00000126 00000-0 00000-0 0 9997 -2 23842 0.0435 4.9337 0003647 27.4447 202.9405 1.00272640 18886 -MSAT M1 -1 23846U 96022A 17116.83767356 -.00000091 00000-0 00000-0 0 9994 -2 23846 7.6767 49.1832 0005486 347.5035 12.3856 1.00272650 76949 -INMARSAT 3-F2 -1 24307U 96053A 17117.26168468 -.00000134 00000-0 00000-0 0 9996 -2 24307 2.5253 77.9378 0006520 302.6379 273.5684 1.00272241 75555 -AMC-1 (GE-1) -1 24315U 96054A 17116.99830703 .00000049 00000-0 00000-0 0 9997 -2 24315 1.4627 85.2444 0002541 312.9431 47.2340 1.00272459 12855 -AFRICASAT-2 (MEASAT-2) -1 24653U 96063B 17117.66310705 -.00000236 00000-0 00000-0 0 9991 -2 24653 7.4101 50.0650 0006306 192.5242 359.9637 1.00272436 74885 -EUTELSAT 48A -1 24665U 96067A 17113.99054804 .00000111 00000-0 00000-0 0 9996 -2 24665 6.2716 55.4586 0005034 330.9125 230.6826 1.00273660 75177 -INMARSAT 3-F3 -1 24674U 96070A 17117.63968044 .00000026 00000-0 00000-0 0 9990 -2 24674 3.3351 71.9923 0005920 325.4929 226.7369 1.00269553 74503 -AMC-2 (GE-2) -1 24713U 97002A 17117.46282128 -.00000220 00000-0 00000-0 0 9990 -2 24713 4.2449 66.1892 0004965 329.2587 261.9464 1.00273046 74112 -INTELSAT 26 (IS-26) -1 24732U 97007A 17117.80741380 -.00000006 00000-0 00000-0 0 9996 -2 24732 7.3857 50.3876 0005476 3.0506 157.4337 1.00270756 39274 -GALAXY 25 (G-25) -1 24812U 97026A 17116.66187462 -.00000173 00000-0 00000-0 0 9999 -2 24812 0.0451 90.3866 0003544 305.2334 324.4126 1.00273150 72894 -ABS-3 -1 24901U 97042A 17117.80488368 -.00000204 00000-0 00000-0 0 9997 -2 24901 4.7987 63.5399 0008362 325.4649 202.2346 1.00272611 72086 -INTELSAT 5 (IS-5) -1 24916U 97046A 17117.16364104 -.00000150 00000-0 00000-0 0 9997 -2 24916 3.4490 71.3292 0003546 321.5620 38.3528 1.00271601 72157 -AMC-3 (GE-3) -1 24936U 97050A 17117.53155150 -.00000271 00000-0 00000-0 0 9998 -2 24936 0.2740 91.5953 0002576 307.6319 295.8336 1.00270355 71973 -NSS-5 -1 24957U 97053A 17117.93035581 .00000098 00000-0 00000-0 0 9999 -2 24957 3.7438 69.5263 0003313 320.8842 211.1239 1.00268268 71710 -ECHOSTAR 3 -1 25004U 97059A 17117.79502708 -.00000294 00000-0 00000-0 0 9992 -2 25004 2.0546 80.3892 0001312 283.8269 76.1678 1.00270852 71597 -JCSAT-1B -1 25067U 97075A 17117.65636578 -.00000217 00000-0 00000-0 0 9992 -2 25067 5.4745 59.2190 0003990 310.3321 232.5496 1.00271491 73890 -ASTRA 1G -1 25071U 97076A 17117.93035581 .00000095 00000-0 00000-0 0 9999 -2 25071 2.2219 78.5414 0003243 316.9076 206.6691 1.00273085 71099 -BRASILSAT B3 -1 25152U 98006A 17116.76880240 -.00000291 00000-0 00000-0 0 9992 -2 25152 3.9372 68.5992 0003547 324.7262 35.1876 1.00274450 10043 -INMARSAT 3-F5 -1 25153U 98006B 17117.58053549 -.00000298 00000-0 00000-0 0 9995 -2 25153 2.4767 74.2479 0004250 318.8801 337.6097 1.00274335 70420 -NSS-806 -1 25239U 98014A 17117.49771485 -.00000291 00000-0 00000-0 0 9998 -2 25239 0.0667 43.3045 0004164 347.0110 317.0595 1.00272070 13836 -CHINASAT 5A (ZX 5A) -1 25354U 98033A 17117.91114970 -.00000366 00000-0 00000-0 0 9997 -2 25354 1.1354 87.3456 0002396 252.4935 329.7335 1.00267159 73775 -THOR III -1 25358U 98035A 17117.57728456 -.00000053 00000-0 00000-0 0 9998 -2 25358 5.3412 59.3790 0002298 330.8240 29.0523 1.00272039 69385 -INTELSAT 805 (IS-805) -1 25371U 98037A 17117.77637519 -.00000044 00000-0 00000-0 0 9996 -2 25371 0.0085 83.9267 0003083 318.9617 261.5410 1.00270643 69082 -ASTRA 2A -1 25462U 98050A 17117.86998072 -.00000372 00000-0 00000-0 0 9990 -2 25462 0.0587 250.0045 0001821 114.1770 278.5134 1.00266930 12886 -AFRISTAR -1 25515U 98063A 17117.72039122 .00000114 00000-0 00000-0 0 9993 -2 25515 3.2049 69.8252 0004257 323.8405 102.5370 1.00272987 67482 -JCSAT-4A -1 25630U 99006A 17116.84702260 -.00000165 00000-0 00000-0 0 9998 -2 25630 2.1908 80.2430 0001676 325.9206 195.7184 1.00269989 17133 -SKYNET 4E -1 25639U 99009B 17116.98035801 .00000014 00000-0 00000-0 0 9997 -2 25639 10.0900 28.9973 0002841 5.3789 179.6513 1.00273014 66543 -ASIASAT 3S -1 25657U 99013A 17117.84214854 -.00000248 00000-0 00000-0 0 9995 -2 25657 2.4061 78.4567 0003334 319.0948 267.6850 1.00270524 66359 -NIMIQ 1 -1 25740U 99027A 17117.48989917 -.00000210 00000-0 00000-0 0 9991 -2 25740 0.0077 263.8005 0005794 127.1301 274.5873 1.00272613 65737 -ASTRA 1H -1 25785U 99033A 17117.93035581 .00000127 00000-0 00000-0 0 9992 -2 25785 3.7288 69.6845 0002700 318.4700 206.3377 1.00271741 17950 -TELKOM 1 -1 25880U 99042A 17117.83243694 -.00000357 00000-0 00000-0 0 9999 -2 25880 0.0410 104.0944 0001395 320.7406 198.8135 1.00265354 64924 -ABS-7 -1 25894U 99046A 17117.91197160 -.00000375 00000-0 00000-0 0 9993 -2 25894 0.0107 248.3542 0002385 163.2774 248.8804 1.00270507 63661 -ABS-6 -1 25924U 99053A 17116.96068447 -.00000131 00000-0 00000-0 0 9994 -2 25924 0.0242 86.2938 0003232 337.8423 295.9057 1.00270899 64416 -TELSTAR 12 (ORION 2) -1 25949U 99059A 17117.38035667 -.00000073 00000-0 00000-0 0 9997 -2 25949 0.8286 88.8282 0002792 297.9184 216.5534 1.00270883 64062 -AMC-4 (GE-4) -1 25954U 99060A 17116.58960841 -.00000283 00000-0 00000-0 0 9990 -2 25954 0.0747 83.6143 0002314 346.5514 289.8681 1.00272694 10260 -GALAXY 11 (G-11) -1 26038U 99071A 17117.93035581 .00000124 00000-0 00000-0 0 9993 -2 26038 0.0073 290.7859 0001167 42.6936 262.4449 1.00271306 63646 -HISPASAT 1C -1 26071U 00007A 17117.51230095 -.00000224 00000-0 00000-0 0 9994 -2 26071 0.4599 88.5486 0009069 305.5308 282.2854 1.00269688 63169 -SUPERBIRD-B2 -1 26095U 00012A 17117.82820889 -.00000106 00000-0 00000-0 0 9995 -2 26095 0.2942 94.8317 0003273 303.0241 278.2461 1.00271995 11726 -ASIASTAR -1 26107U 00016A 17117.85404823 -.00000344 00000-0 00000-0 0 9996 -2 26107 1.5700 81.9783 0003796 314.6700 231.8181 1.00270047 62466 -EUTELSAT 16C -1 26243U 00019A 17117.80715095 .00000081 00000-0 00000-0 0 9998 -2 26243 4.1728 66.5666 0002854 330.5413 123.9513 1.00274944 62287 -EUTELSAT 80A -1 26369U 00028A 17117.86096794 -.00000153 00000-0 00000-0 0 9992 -2 26369 0.9102 84.9793 0005368 347.4285 174.0633 1.00270144 61971 -TDRS 8 -1 26388U 00034A 17117.31061349 -.00000232 00000-0 00000-0 0 9996 -2 26388 7.4099 56.2608 0004718 257.7593 102.0921 1.00263738 61713 -ECHOSTAR 6 -1 26402U 00038A 17117.46460757 -.00000157 00000-0 00000-0 0 9995 -2 26402 4.0907 67.3481 0003248 325.4717 253.8669 1.00271136 61479 -INTELSAT 9 (IS-9) -1 26451U 00043A 17117.94657378 -.00000282 00000-0 00000-0 0 9994 -2 26451 3.4365 71.5444 0002688 315.4717 126.7630 1.00272717 10685 -BRASILSAT B4 -1 26469U 00046A 17116.89564228 -.00000179 00000-0 00000-0 0 9995 -2 26469 1.5554 85.3555 0003117 314.4699 45.6975 1.00272426 61498 -NILESAT 102 -1 26470U 00046B 17117.93470049 -.00000071 00000-0 00000-0 0 9991 -2 26470 1.5766 83.7989 0004305 308.1969 153.6027 1.00271977 11738 -ASTRA 2B -1 26494U 00054A 17117.87757578 .00000108 00000-0 00000-0 0 9994 -2 26494 2.1096 79.1778 0005202 329.6321 142.5842 1.00274614 13420 -AMC-7 (GE-7) -1 26495U 00054B 17116.77791431 .00000077 00000-0 00000-0 0 9994 -2 26495 0.0432 82.2799 0001120 288.8817 348.8496 1.00272717 60779 -NSS-11 (AAP-1) -1 26554U 00059A 17117.90604911 -.00000358 00000-0 00000-0 0 9990 -2 26554 0.0063 85.5734 0001949 322.2868 242.5888 1.00271778 7848 -N-SAT-110 (JCSAT-110) -1 26559U 00060A 17117.91248865 -.00000364 00000-0 00000-0 0 9997 -2 26559 0.0368 87.6857 0000970 3.3095 203.6529 1.00271882 7815 -AMC-6 (GE-6) -1 26580U 00067A 17117.50743608 -.00000285 00000-0 00000-0 0 9990 -2 26580 0.0218 356.4381 0001281 14.5567 320.3637 1.00271374 60515 -INTELSAT 12 (IS-12) -1 26590U 00068A 17117.93035581 .00000124 00000-0 00000-0 0 9994 -2 26590 0.3782 93.3320 0001540 294.8926 207.7699 1.00272133 18259 -INTELSAT 1R (IS-1R) -1 26608U 00072A 17117.52112888 .00000111 00000-0 00000-0 0 9996 -2 26608 0.2105 89.2644 0001663 269.6291 247.5204 1.00009937 60184 -ANIK F1 -1 26624U 00076A 17116.70124283 -.00000085 00000-0 00000-0 0 9990 -2 26624 0.0398 103.7159 0001422 334.6556 281.6533 1.00271966 60252 -ASTRA 2D -1 26638U 00081A 17117.43027749 .00000038 00000-0 00000-0 0 9998 -2 26638 3.5537 70.2649 0001966 323.7234 36.1874 1.00271905 19446 -AMC-8 (GE-8) -1 26639U 00081B 17117.51147722 .00000092 00000-0 00000-0 0 9992 -2 26639 0.0332 80.0772 0003191 325.6418 215.1011 1.00272006 59882 -SKYNET 4F -1 26695U 01005B 17117.06777510 -.00000256 00000-0 00000-0 0 9998 -2 26695 8.8418 37.0007 0002772 341.0792 187.5842 1.00271851 59408 -EUTELSAT 33C -1 26719U 01011A 17117.93521792 .00000142 00000-0 00000-0 0 9990 -2 26719 0.0726 27.6068 0004605 2.0993 196.1408 1.00273062 59081 -INTELSAT 10 (IS-10) -1 26766U 01019A 17117.93035581 .00000114 00000-0 00000-0 0 9995 -2 26766 1.4127 85.3638 0002139 290.5843 222.5639 1.00272879 12179 -INTELSAT 901 (IS-901) -1 26824U 01024A 17117.90090181 -.00000154 00000-0 00000-0 0 9995 -2 26824 0.0135 285.3709 0002681 101.3989 135.6098 1.00272019 58237 -ASTRA 2C -1 26853U 01025A 17117.92641178 .00000033 00000-0 00000-0 0 9993 -2 26853 0.2935 90.6741 0002799 300.6764 218.5592 1.00273170 11594 -ARTEMIS -1 26863U 01029A 17117.89753111 -.00000378 00000-0 00000-0 0 9998 -2 26863 12.6809 33.5825 0001767 26.6924 241.9256 1.00272512 10683 -INTELSAT 902 (IS-902) -1 26900U 01039A 17117.92594959 .00000019 00000-0 00000-0 0 9999 -2 26900 0.0099 278.1849 0002976 119.6629 213.5763 1.00272569 57252 -EUTELSAT 12 WEST B -1 26927U 01042A 17117.91873723 -.00000114 00000-0 00000-0 0 9997 -2 26927 0.0595 38.9647 0005840 347.7510 147.6130 1.00270791 57054 -DIRECTV 4S -1 26985U 01052A 17117.42410554 -.00000125 00000-0 00000-0 0 9999 -2 26985 0.0057 281.5796 0002007 119.7179 225.7744 1.00270575 56522 -INSAT-3C -1 27298U 02002A 17117.91937221 -.00000271 00000-0 00000-0 0 9994 -2 27298 0.5182 91.6118 0004690 231.6543 317.2944 1.00269922 55949 -ECHOSTAR 7 -1 27378U 02006A 17117.43382691 -.00000012 00000-0 00000-0 0 9992 -2 27378 0.0601 83.5006 0001324 277.2206 252.2488 1.00270465 17187 -INTELSAT 904 (IS-904) -1 27380U 02007A 17117.93035581 .00000123 00000-0 00000-0 0 9996 -2 27380 0.0464 91.3410 0002721 359.5396 145.2385 1.00272625 18301 -TDRS 9 -1 27389U 02011A 17117.92058000 -.00000110 00000-0 00000-0 0 9997 -2 27389 5.1478 79.6916 0020420 251.2959 204.2960 1.00273147 56981 -JCSAT 2A -1 27399U 02015A 17117.90172552 -.00000319 00000-0 00000-0 0 9990 -2 27399 0.3725 92.7624 0000877 186.2937 37.6472 1.00275290 55439 -ASTRA 3A -1 27400U 02015B 17116.72497990 -.00000289 00000-0 00000-0 0 9994 -2 27400 3.7174 69.0026 0002702 335.9286 23.9999 1.00272628 55253 -INTELSAT 903 (IS-903) -1 27403U 02016A 17117.74532738 -.00000251 00000-0 00000-0 0 9990 -2 27403 0.0199 275.9980 0002885 121.1229 52.6235 1.00271935 12204 -NSS-7 -1 27414U 02019A 17117.68738644 -.00000167 00000-0 00000-0 0 9998 -2 27414 1.7911 83.2758 0002707 321.2122 38.8366 1.00272050 55091 -DIRECTV 5 (TEMPO 1) -1 27426U 02023A 17116.70904308 -.00000066 00000-0 00000-0 0 9998 -2 27426 0.0192 253.0937 0003274 147.2819 319.6487 1.00270450 54862 -INTELSAT 905 (IS-905) -1 27438U 02027A 17117.87674363 -.00000197 00000-0 00000-0 0 9994 -2 27438 0.0111 253.4625 0002843 117.2349 136.4867 1.00271456 17919 -EXPRESS-A4 -1 27441U 02029A 17117.90296847 -.00000259 00000-0 00000-0 0 9990 -2 27441 5.9779 56.8288 0002262 23.3526 246.1482 1.00265198 54500 -GALAXY 3C (G-3C) -1 27445U 02030A 17116.66721878 -.00000161 00000-0 00000-0 0 9997 -2 27445 0.0185 287.7924 0001743 51.7560 20.4537 1.00271418 13106 -EUTELSAT 5 WEST A -1 27460U 02035A 17117.41519679 -.00000054 00000-0 00000-0 0 9998 -2 27460 0.0541 48.4484 0005148 343.4483 328.1425 1.00271934 54168 -N-STAR C -1 27461U 02035B 17117.77656080 -.00000320 00000-0 00000-0 0 9992 -2 27461 4.5396 65.0686 0004106 322.8350 243.5936 1.00274166 54260 -ECHOSTAR 8 -1 27501U 02039A 17117.71514125 -.00000236 00000-0 00000-0 0 9994 -2 27501 0.9886 88.6082 0011140 347.6384 317.9643 1.00186446 53812 -EUTELSAT 36 WEST A -1 27508U 02040A 17116.50367880 -.00000255 00000-0 00000-0 0 9994 -2 27508 0.0716 353.5647 0006501 32.2253 334.2515 1.00272471 53724 -METEOSAT-8 (MSG-1) -1 27509U 02040B 17117.67664500 .00000131 00000-0 00000-0 0 9995 -2 27509 4.7557 58.5253 0000941 266.9424 175.5485 1.00262079 53794 -INTELSAT 906 (IS-906) -1 27513U 02041A 17117.80674681 .00000001 00000-0 00000-0 0 9993 -2 27513 0.0235 268.9750 0002993 131.2485 170.3374 1.00273219 53574 -KODAMA (DRTS) -1 27516U 02042B 17117.80227965 -.00000250 00000-0 00000-0 0 9993 -2 27516 4.9535 62.3425 0003255 340.1842 193.0170 1.00271423 12440 -KALPANA-1 (METSAT 1) -1 27525U 02043A 17117.35141353 -.00000087 00000-0 00000-0 0 9998 -2 27525 6.2678 55.5575 0013379 237.2420 122.5229 1.00273567 53593 -HISPASAT 1D -1 27528U 02044A 17117.87665264 -.00000229 00000-0 00000-0 0 9999 -2 27528 0.0332 353.8021 0004800 25.2114 122.6347 1.00272121 9351 -TDRS 10 -1 27566U 02055A 17117.04900725 .00000070 00000-0 00000-0 0 9999 -2 27566 4.9483 58.6279 0009378 246.4828 113.3121 1.00271717 52762 -NSS-6 -1 27603U 02057A 17117.91091101 -.00000283 00000-0 00000-0 0 9995 -2 27603 0.0468 87.4320 0001344 282.6637 268.9063 1.00270011 52630 -NIMIQ 2 -1 27632U 02062A 17116.67575144 -.00000223 00000-0 00000-0 0 9993 -2 27632 1.8893 82.1930 0003745 249.6130 110.4679 0.99547659 52401 -INTELSAT 907 (IS-907) -1 27683U 03007A 17117.47743308 -.00000214 00000-0 00000-0 0 9997 -2 27683 0.0112 258.5995 0002868 144.7855 316.6455 1.00270988 51981 -GALAXY 12 (G-12) -1 27715U 03013B 17117.47480003 .00000047 00000-0 00000-0 0 9993 -2 27715 0.0610 89.8594 0001695 307.5230 220.1919 1.00271940 18675 -ASIASAT 4 -1 27718U 03014A 17117.82757797 -.00000373 00000-0 00000-0 0 9996 -2 27718 0.0477 98.6673 0000257 311.0494 226.2992 1.00268620 51452 -HELLAS-SAT 2 -1 27811U 03020A 17117.93521792 .00000139 00000-0 00000-0 0 9992 -2 27811 0.0425 86.6161 0003703 305.9869 199.1440 1.00271488 9393 -AMC-9 (GE-12) -1 27820U 03024A 17117.50551885 -.00000227 00000-0 00000-0 0 9994 -2 27820 0.0235 292.0436 0002626 94.1854 288.4387 1.00270023 50914 -THURAYA-2 -1 27825U 03026A 17117.51764172 .00000119 00000-0 00000-0 0 9996 -2 27825 4.8746 28.9310 0004609 356.0434 61.0687 1.00274042 50881 -OPTUS C1 -1 27831U 03028B 17117.76236484 -.00000160 00000-0 00000-0 0 9999 -2 27831 0.0310 190.7453 0002386 221.6695 233.9786 1.00271337 19592 -ECHOSTAR 12 (RAINBOW 1) -1 27852U 03033A 17117.94904992 -.00000295 00000-0 00000-0 0 9993 -2 27852 0.0032 48.2035 0000939 331.7742 116.6164 1.00270169 50524 -GALAXY 23 (G-23) -1 27854U 03034A 17117.38108368 .00000001 00000-0 00000-0 0 9991 -2 27854 0.0204 134.0337 0002988 259.8204 197.8948 1.00271212 50278 -EUTELSAT 33A -1 27948U 03043A 17117.87271644 .00000140 00000-0 00000-0 0 9991 -2 27948 2.2720 78.4586 0002148 231.0387 251.5634 1.00271428 12017 -GALAXY 13 (HORIZONS-1) -1 27954U 03044A 17117.43868888 .00000036 00000-0 00000-0 0 9997 -2 27954 0.0500 96.9803 0000764 318.8048 190.7435 1.00271160 49693 -ZHONGXING-20 -1 28082U 03052A 17117.46768166 -.00000336 00000-0 00000-0 0 9994 -2 28082 3.4072 71.5319 0003959 304.3480 111.4306 1.00270634 49295 -YAMAL 202 -1 28089U 03053A 17117.93035581 .00000106 00000-0 00000-0 0 9996 -2 28089 0.0634 83.2940 0003496 309.6706 207.0284 1.00274806 49218 -EXPRESS-AM22 (SESAT 2) -1 28134U 03060A 17117.91577310 -.00000150 00000-0 00000-0 0 9994 -2 28134 0.3458 90.5762 0000094 209.0401 326.2422 1.00271102 48814 -AMC-10 (GE-10) -1 28154U 04003A 17117.70168354 .00000076 00000-0 00000-0 0 9991 -2 28154 0.0151 288.3657 0002624 135.1563 269.9492 1.00272473 48465 -ABS-4 (MOBISAT-1) -1 28184U 04007A 17117.81160571 .00000028 00000-0 00000-0 0 9990 -2 28184 0.0230 275.3988 0001871 120.7392 172.9886 1.00272530 18878 -EUTELSAT 7A -1 28187U 04008A 17117.88243532 .00000034 00000-0 00000-0 0 9997 -2 28187 0.0702 1.5133 0003087 52.0990 127.1030 1.00270214 47926 -DIRECTV 7S -1 28238U 04016A 17117.43382691 -.00000010 00000-0 00000-0 0 9999 -2 28238 0.0321 47.4470 0002723 349.4632 215.8149 1.00269925 47603 -AMC-11 (GE-11) -1 28252U 04017A 17117.63471220 .00000057 00000-0 00000-0 0 9995 -2 28252 0.0236 329.2628 0002593 72.5884 271.4431 1.00271585 47234 -INTELSAT 10-02 -1 28358U 04022A 17117.81437965 -.00000024 00000-0 00000-0 0 9991 -2 28358 0.0153 175.9473 0000462 116.6379 215.5888 1.00271268 47182 -APSTAR 5 (TELSTAR 18) -1 28364U 04024A 17117.80604922 -.00000307 00000-0 00000-0 0 9992 -2 28364 0.0371 100.1185 0003166 303.6607 240.3729 1.00272600 47155 -ANIK F2 -1 28378U 04027A 17117.50219032 -.00000062 00000-0 00000-0 0 9999 -2 28378 0.0255 347.1699 0000396 260.3333 37.8886 1.00271537 7822 -AMAZONAS 1 -1 28393U 04031A 17117.29146619 -.00000256 00000-0 00000-0 0 9992 -2 28393 1.6466 83.9017 0004038 320.7703 239.5517 1.00271648 46602 -AMC-15 -1 28446U 04041A 17117.41694934 -.00000100 00000-0 00000-0 0 9992 -2 28446 0.0788 70.8686 0001712 306.8840 242.8742 1.00271398 45913 -AMC-16 -1 28472U 04048A 17117.48285421 -.00000218 00000-0 00000-0 0 9992 -2 28472 0.0219 341.5826 0002794 75.7071 247.2063 1.00272091 45347 -NSS-10 (AMC-12) -1 28526U 05003A 17117.73270097 -.00000263 00000-0 00000-0 0 9995 -2 28526 0.0223 307.8152 0002611 84.6656 49.7424 1.00270331 44851 -XTAR-EUR -1 28542U 05005A 17117.32091317 .00000139 00000-0 00000-0 0 9997 -2 28542 0.0388 84.7742 0002643 305.5684 329.6808 1.00271994 44748 -XM-3 (RHYTHM) -1 28626U 05008A 17117.47436293 -.00000217 00000-0 00000-0 0 9993 -2 28626 0.0450 66.9409 0000346 174.8171 59.5523 1.00270635 44596 -INMARSAT 4-F1 -1 28628U 05009A 17117.03392840 -.00000272 00000-0 00000-0 0 9998 -2 28628 2.8709 11.2869 0002823 29.9554 329.6820 1.00271451 44201 -APSTAR 6 -1 28638U 05012A 17117.90572722 -.00000331 00000-0 00000-0 0 9994 -2 28638 0.0064 151.8062 0002354 263.8070 260.5354 1.00271747 68943 -SPACEWAY 1 -1 28644U 05015A 17117.35305598 -.00000114 00000-0 00000-0 0 9997 -2 28644 0.0080 201.0782 0000376 66.0325 332.6012 1.00272836 13125 -DIRECTV 8 -1 28659U 05019A 17116.68338213 -.00000126 00000-0 00000-0 0 9995 -2 28659 0.0111 265.2696 0003143 133.0633 321.6895 1.00269929 43673 -GALAXY 28 (G-28) -1 28702U 05022A 17117.43521699 -.00000197 00000-0 00000-0 0 9992 -2 28702 0.0061 191.6243 0001605 202.3874 249.2715 1.00270588 18642 -EXPRESS-AM3 -1 28707U 05023A 17117.98029328 -.00000335 00000-0 00000-0 0 9994 -2 28707 0.0018 157.7792 0001205 255.5365 258.7300 1.00269697 43385 -THAICOM 4 -1 28786U 05028A 17117.91212845 -.00000376 00000-0 00000-0 0 9992 -2 28786 0.0117 274.7736 0001953 112.0065 277.1460 1.00268213 18819 -GALAXY 14 (G-14) -1 28790U 05030A 17117.43868888 .00000025 00000-0 00000-0 0 9991 -2 28790 0.0109 236.7748 0002121 141.2559 230.5041 1.00272833 42836 -ANIK F1R -1 28868U 05036A 17117.04493699 -.00000085 00000-0 00000-0 0 9991 -2 28868 0.0562 71.6647 0002884 323.4250 89.0143 1.00271681 13048 -GALAXY 15 (G-15) -1 28884U 05041A 17117.63438270 .00000066 00000-0 00000-0 0 9992 -2 28884 0.0250 92.8477 0001657 315.0810 263.2601 1.00273269 42155 -SYRACUSE 3A -1 28885U 05041B 17117.90644469 .00000116 00000-0 00000-0 0 9998 -2 28885 0.0146 316.4540 0003003 82.3296 190.5886 1.00272428 42293 -INMARSAT 4-F2 -1 28899U 05044A 17117.25403834 -.00000001 00000-0 00000-0 0 9997 -2 28899 2.5645 11.1945 0002504 28.9255 330.6550 1.00272957 42059 -TELKOM 2 -1 28902U 05046A 17112.60952086 -.00000371 00000-0 00000-0 0 9996 -2 28902 0.0266 242.9679 0000869 181.3340 123.8784 1.00267947 41722 -SPACEWAY 2 -1 28903U 05046B 17117.42410554 -.00000138 00000-0 00000-0 0 9992 -2 28903 0.0049 70.7398 0000043 13.8276 184.6348 1.00271174 17875 -INSAT-4A -1 28911U 05049A 17116.17395585 -.00000175 00000-0 00000-0 0 9992 -2 28911 0.1043 94.1062 0003408 233.5604 32.3220 1.00271444 41618 -METEOSAT-9 (MSG-2) -1 28912U 05049B 17117.16504358 .00000051 00000-0 00000-0 0 9995 -2 28912 2.1048 70.8043 0000560 129.4061 83.7904 1.00269537 41600 -EUTELSAT 172A (GE-23) -1 28924U 05052A 17117.76842414 -.00000019 00000-0 00000-0 0 9991 -2 28924 0.0703 10.8219 0005754 25.2854 268.4485 1.00271679 41516 -ECHOSTAR 10 -1 28935U 06003A 17117.42896751 -.00000067 00000-0 00000-0 0 9999 -2 28935 0.0615 74.0173 0001548 346.7063 199.1105 1.00270856 41011 -HIMAWARI-7 (MTSAT-2) -1 28937U 06004A 17117.84214854 -.00000255 00000-0 00000-0 0 9995 -2 28937 0.0692 92.9658 0003474 306.2616 264.9760 1.00274084 41015 -SPAINSAT -1 28945U 06007A 17117.48431187 -.00000228 00000-0 00000-0 0 9997 -2 28945 0.0173 210.3523 0002243 182.6197 327.0499 1.00271268 40760 -EUTELSAT HOT BIRD 13E -1 28946U 06007B 17117.36526661 .00000075 00000-0 00000-0 0 9996 -2 28946 0.0601 261.0072 0002876 185.4509 273.5828 1.00269346 40832 -JCSAT-5A -1 29045U 06010A 17117.81793146 -.00000341 00000-0 00000-0 0 9992 -2 29045 0.0107 273.1860 0001857 152.7965 216.5010 1.00270140 40311 -ASTRA 1KR -1 29055U 06012A 17117.83105093 .00000107 00000-0 00000-0 0 9994 -2 29055 0.0466 276.8626 0001146 45.2221 212.2600 1.00270484 12264 -GOES 13 -1 29155U 06018A 17116.61117068 -.00000261 00000-0 00000-0 0 9993 -2 29155 0.2882 273.0145 0004779 151.5840 295.4602 1.00276158 9925 -EUTELSAT 113 WEST A -1 29162U 06020A 17116.71700910 -.00000048 00000-0 00000-0 0 9992 -2 29162 0.0112 330.6056 0002968 71.1814 318.2445 1.00272935 40006 -THAICOM 5 -1 29163U 06020B 17117.91577310 -.00000134 00000-0 00000-0 0 9998 -2 29163 0.0284 271.5765 0003396 102.7062 249.9736 1.00270607 40039 -GALAXY 16 (G-16) -1 29236U 06023A 17117.37549479 -.00000139 00000-0 00000-0 0 9992 -2 29236 0.0137 249.4336 0002744 159.5844 202.7179 1.00273983 39765 -EUTELSAT HOT BIRD 13B -1 29270U 06032A 17117.87757578 .00000073 00000-0 00000-0 0 9992 -2 29270 0.0853 323.7507 0005202 55.9991 165.2138 1.00269811 13864 -JCSAT-3A -1 29272U 06033A 17117.92285122 -.00000358 00000-0 00000-0 0 9999 -2 29272 0.0152 267.6496 0001703 146.7151 261.9523 1.00268065 14278 -SYRACUSE 3B -1 29273U 06033B 17117.95206821 -.00000057 00000-0 00000-0 0 9998 -2 29273 0.0117 305.8412 0004801 73.2201 174.6100 1.00272538 39251 -KOREASAT 5 (MUGUNGWHA 5) -1 29349U 06034A 17117.83243694 -.00000371 00000-0 00000-0 0 9998 -2 29349 0.0159 73.3539 0000675 38.0463 157.3403 1.00270107 7857 -ZHONGXING-22A -1 29398U 06038A 17117.90552795 -.00000330 00000-0 00000-0 0 9994 -2 29398 5.7030 58.0665 0001808 254.5274 331.2123 1.00269188 38948 -DIRECTV 9S -1 29494U 06043A 17117.42410554 -.00000126 00000-0 00000-0 0 9993 -2 29494 0.0134 226.1841 0003130 166.9350 234.0600 1.00272237 17938 -OPTUS D1 -1 29495U 06043B 17117.72549699 -.00000123 00000-0 00000-0 0 9997 -2 29495 0.0559 82.6865 0003257 310.8258 243.5612 1.00271121 38659 -XM-4 (BLUES) -1 29520U 06049A 17117.43382691 -.00000035 00000-0 00000-0 0 9999 -2 29520 0.0031 28.1297 0000042 71.0407 157.3869 1.00271409 38529 -BADR-4 -1 29526U 06051A 17117.87271644 .00000131 00000-0 00000-0 0 9997 -2 29526 0.0517 336.9457 0005039 20.5747 198.6813 1.00271332 17843 -FENGYUN 2D -1 29640U 06053A 17117.90188513 -.00000371 00000-0 10000-3 0 9993 -2 29640 4.3605 64.6207 0004790 342.3052 257.6462 1.00276521 38091 -WILDBLUE-1 -1 29643U 06054A 17117.50219032 -.00000061 00000-0 00000-0 0 9996 -2 29643 0.0414 97.9911 0001463 294.5324 252.7651 1.00271160 20338 -AMC-18 -1 29644U 06054B 17117.42896751 -.00000101 00000-0 00000-0 0 9992 -2 29644 0.0132 78.3974 0002385 317.0840 229.5778 1.00269595 38123 -MEASAT-3 -1 29648U 06056A 17117.80227965 -.00000255 00000-0 00000-0 0 9995 -2 29648 0.0631 111.3791 0002369 340.0316 144.9012 1.00271711 16997 -INSAT-4B -1 30793U 07007A 17117.91091101 -.00000272 00000-0 00000-0 0 9997 -2 30793 0.0102 238.0917 0006804 182.6519 216.7794 1.00273110 8747 -SKYNET 5A -1 30794U 07007B 17117.79952494 -.00000285 00000-0 00000-0 0 9999 -2 30794 0.0706 15.9449 0003541 24.0039 199.0655 1.00272385 37239 -ANIK F3 -1 31102U 07009A 17117.38881730 -.00000013 00000-0 00000-0 0 9993 -2 31102 0.0113 269.6619 0001772 130.0690 197.1072 1.00273748 36861 -ASTRA 1L -1 31306U 07016A 17117.87757578 .00000106 00000-0 00000-0 0 9995 -2 31306 0.0648 307.2017 0003507 42.3918 201.5543 1.00269925 11618 -GALAXY 17 (G-17) -1 31307U 07016B 17117.45037390 -.00000186 00000-0 00000-0 0 9992 -2 31307 0.0491 57.1226 0003199 345.3070 244.3425 1.00272232 36481 -ZHONGXING-6B -1 31800U 07031A 17117.91197160 -.00000375 00000-0 00000-0 0 9990 -2 31800 0.0154 291.8261 0002141 84.2496 283.8270 1.00272103 35974 -DIRECTV 10 -1 31862U 07032A 17116.68879987 -.00000114 00000-0 00000-0 0 9997 -2 31862 0.0137 292.6008 0000413 351.9429 75.4605 1.00273325 12161 -SPACEWAY 3 -1 32018U 07036A 17117.37549479 -.00000163 00000-0 00000-0 0 9996 -2 32018 0.0452 73.0857 0000335 196.3082 346.3893 1.00271258 13126 -BSAT-3A -1 32019U 07036B 17117.09682664 -.00000362 00000-0 00000-0 0 9991 -2 32019 0.0374 193.0130 0000772 61.0105 105.9763 1.00270919 17038 -INSAT-4CR -1 32050U 07037A 17117.90644390 .00000112 00000-0 00000-0 0 9993 -2 32050 0.0822 94.4984 0003071 282.0344 213.7044 1.00273401 17935 -OPTUS D2 -1 32252U 07044A 17117.84198639 -.00000196 00000-0 00000-0 0 9991 -2 32252 0.0450 83.1917 0003434 311.3426 276.6057 1.00271653 35116 -INTELSAT 11 (IS-11) -1 32253U 07044B 17117.65367050 -.00000281 00000-0 00000-0 0 9991 -2 32253 0.0345 130.9941 0001493 256.5767 20.6001 1.00273233 35133 -STAR ONE C1 -1 32293U 07056A 17116.58402931 -.00000287 00000-0 00000-0 0 9993 -2 32293 0.0333 89.4449 0002673 317.0484 313.5379 1.00272180 18318 -SKYNET 5B -1 32294U 07056B 17117.87271644 .00000129 00000-0 00000-0 0 9996 -2 32294 0.0693 1.4218 0003641 32.0755 161.8121 1.00271567 34750 -ASTRA 4A (SIRIUS 4) -1 32299U 07057A 17117.88243532 .00000019 00000-0 00000-0 0 9996 -2 32299 0.0186 62.3217 0002505 324.2792 151.9313 1.00268930 18241 -HORIZONS-2 -1 32388U 07063B 17117.80488368 -.00000195 00000-0 00000-0 0 9998 -2 32388 0.0119 290.0196 0002884 106.1771 194.3778 1.00270749 34397 -THURAYA-3 -1 32404U 08001A 17117.90604911 -.00000319 00000-0 00000-0 0 9993 -2 32404 4.0792 353.2407 0004382 32.7683 254.7415 1.00272108 34058 -EXPRESS-AM33 -1 32478U 08003A 17117.91091100 -.00000294 00000-0 00000-0 0 9999 -2 32478 0.0102 294.7657 0000819 170.9054 174.8209 1.00270238 34150 -THOR 5 -1 32487U 08006A 17117.88730039 -.00000022 00000-0 00000-0 0 9998 -2 32487 0.0160 246.7298 0002401 149.3993 138.6041 1.00270712 33847 -KIZUNA (WINDS) -1 32500U 08007A 17117.90533324 -.00000271 00000-0 00000-0 0 9992 -2 32500 0.7277 90.4811 0002917 317.8243 276.6776 1.00272422 33439 -AMC-14 -1 32708U 08011A 17117.16471829 .00000093 00000-0 00000-0 0 9997 -2 32708 19.0270 63.6120 0041593 354.6375 234.3843 1.00276074 34623 -DIRECTV 11 -1 32729U 08013A 17117.42410554 -.00000138 00000-0 00000-0 0 9990 -2 32729 0.0038 299.0058 0000098 75.2139 254.8818 1.00271660 33468 -ICO G1 -1 32763U 08016A 17117.46492965 -.00000187 00000-0 00000-0 0 9995 -2 32763 3.8597 354.3737 0003236 44.7954 250.9892 1.00273047 33111 -VINASAT-1 -1 32767U 08018A 17117.03573191 -.00000340 00000-0 00000-0 0 9996 -2 32767 0.0028 292.5882 0001442 113.5214 313.9022 1.00271211 33158 -STAR ONE C2 -1 32768U 08018B 17116.59793540 -.00000275 00000-0 00000-0 0 9996 -2 32768 0.0606 113.4158 0003130 331.3196 275.3092 1.00271166 33217 -TIANLIAN 1-01 -1 32779U 08019A 17117.86096794 -.00000150 00000-0 10000-3 0 9993 -2 32779 2.6970 76.3341 0034842 233.7714 295.9543 1.00270881 33006 -AMOS-3 -1 32794U 08022A 17117.96761240 -.00000049 00000-0 00000-0 0 9993 -2 32794 0.0155 234.8143 0002036 123.3092 202.2394 1.00270513 48917 -GALAXY 18 (G-18) -1 32951U 08024A 17116.74457174 .00000014 00000-0 00000-0 0 9994 -2 32951 0.0140 219.4846 0003215 187.1833 313.3589 1.00271659 32618 -CHINASAT 9 (ZX 9) -1 33051U 08028A 17117.97324649 -.00000261 00000-0 00000-0 0 9991 -2 33051 0.0047 285.5177 0003738 111.7774 261.4213 1.00271797 32546 -SKYNET 5C -1 33055U 08030A 17117.90377468 -.00000153 00000-0 00000-0 0 9998 -2 33055 0.0658 1.4967 0003395 52.2411 109.8755 1.00270172 32504 -TURKSAT 3A -1 33056U 08030B 17117.93521792 .00000132 00000-0 00000-0 0 9999 -2 33056 0.0666 84.4947 0004842 320.2943 190.0067 1.00274651 18899 -INTELSAT 25 (IS-25) -1 33153U 08034A 17117.48848125 -.00000236 00000-0 00000-0 0 9999 -2 33153 0.0046 230.1087 0002637 145.1540 344.7532 1.00270445 32170 -BADR-6 -1 33154U 08034B 17117.73656907 .00000132 00000-0 00000-0 0 9997 -2 33154 0.0600 40.1248 0005610 3.9615 103.0181 1.00275592 32290 -ECHOSTAR 11 -1 33207U 08035A 17116.70871715 -.00000067 00000-0 00000-0 0 9997 -2 33207 0.0522 80.5222 0002800 325.2483 314.2613 1.00271502 17783 -SUPERBIRD-C2 -1 33274U 08038A 17117.84214854 -.00000264 00000-0 00000-0 0 9994 -2 33274 0.0127 280.6787 0000851 99.0281 283.4318 1.00273085 72264 -AMC-21 -1 33275U 08038B 17117.43868888 .00000024 00000-0 00000-0 0 9995 -2 33275 0.0631 75.9926 0002536 332.5006 200.1490 1.00270678 32029 -INMARSAT 4-F3 -1 33278U 08039A 17117.42410554 -.00000151 00000-0 00000-0 0 9993 -2 33278 3.0225 0.9699 0002772 39.4011 229.9191 1.00272916 31797 -NIMIQ 4 -1 33373U 08044A 17117.50551885 -.00000232 00000-0 00000-0 0 9997 -2 33373 0.0217 277.7598 0002327 122.9872 274.8937 1.00269859 31500 -GALAXY 19 (G-19) -1 33376U 08045A 17116.67266587 -.00000149 00000-0 00000-0 0 9997 -2 33376 0.0117 257.7656 0002598 137.0528 325.2075 1.00269365 31483 -VENESAT-1 -1 33414U 08055A 17117.49768817 -.00000250 00000-0 00000-0 0 9998 -2 33414 0.0190 265.8945 0001514 151.7876 259.1381 1.00272877 31212 -ASTRA 1M -1 33436U 08057A 17117.87757578 .00000107 00000-0 00000-0 0 9998 -2 33436 0.0084 236.1458 0003096 214.5664 100.4560 1.00274229 12284 -CIEL-2 -1 33453U 08063A 17117.45309159 .00000046 00000-0 00000-0 0 9998 -2 33453 0.0342 99.5233 0002719 298.0751 212.2897 1.00271967 30693 -EUTELSAT HOT BIRD 13C -1 33459U 08065A 17117.36532475 .00000074 00000-0 00000-0 0 9996 -2 33459 0.0529 327.2582 0005238 87.9989 304.8003 1.00269480 13911 -EUTELSAT 48D -1 33460U 08065B 17117.90644359 .00000111 00000-0 00000-0 0 9995 -2 33460 0.0689 52.8634 0001497 344.9353 192.6858 1.00269366 30567 -FENGYUN 2E -1 33463U 08066A 17117.86649177 -.00000218 00000-0 00000-0 0 9996 -2 33463 2.0878 66.6220 0003340 220.4014 328.0984 1.00269577 30623 -EXPRESS-AM44 -1 33595U 09007A 17117.60674503 -.00000101 00000-0 00000-0 0 9992 -2 33595 0.0039 303.3145 0001238 159.7809 320.1259 1.00272521 30095 -NSS-9 -1 33749U 09008A 17117.66734164 .00000059 00000-0 00000-0 0 9991 -2 33749 0.0188 55.3374 0001884 333.7401 250.0431 1.00270547 30053 -EUTELSAT 33E -1 33750U 09008B 17117.93521792 .00000142 00000-0 00000-0 0 9997 -2 33750 0.0623 68.7867 0001587 324.4533 192.6223 1.00272907 29990 -TELSTAR 11N -1 34111U 09009A 17117.72585248 -.00000263 00000-0 00000-0 0 9998 -2 34111 0.0148 260.4364 0002369 113.1434 66.0677 1.00269133 12771 -EUTELSAT 10A -1 34710U 09016A 17117.88243532 .00000055 00000-0 00000-0 0 9993 -2 34710 0.0690 10.5032 0005323 25.7183 147.4880 1.00272154 7799 -SES-7 (PROTOSTAR 2) -1 34941U 09027A 17117.90604911 -.00000358 00000-0 00000-0 0 9993 -2 34941 0.0620 78.3407 0001694 224.2225 347.9624 1.00271474 29179 -MEASAT-3A -1 35362U 09032A 17117.14778016 -.00000253 00000-0 00000-0 0 9995 -2 35362 0.0304 214.6134 0000072 255.9562 249.4394 1.00269246 28771 -GOES 14 -1 35491U 09033A 17116.69224996 -.00000105 00000-0 00000-0 0 9997 -2 35491 0.1660 103.8623 0004668 130.2036 125.8996 1.00271284 28688 -SIRIUS FM-5 -1 35493U 09034A 17117.48990042 -.00000212 00000-0 00000-0 0 9999 -2 35493 0.0137 277.4101 0001070 63.8866 324.5728 1.00268563 28501 -TERRESTAR-1 -1 35496U 09035A 17116.66440281 -.00000070 00000-0 00000-0 0 9999 -2 35496 2.9355 343.4206 0003037 52.3565 307.2458 1.00272152 28700 -ASIASAT 5 -1 35696U 09042A 17117.97022532 -.00000321 00000-0 00000-0 0 9998 -2 35696 0.0041 243.9910 0001381 126.5521 295.3830 1.00271634 28205 -JCSAT-RA (JCSAT-12) -1 35755U 09044A 17117.04681684 -.00000357 00000-0 00000-0 0 9992 -2 35755 0.0660 64.2889 0000742 358.6905 297.0366 1.00270836 28151 -OPTUS D3 -1 35756U 09044B 17117.76236484 -.00000160 00000-0 00000-0 0 9998 -2 35756 0.0504 41.6616 0004002 343.4132 261.3023 1.00270896 28108 -PALAPA D -1 35812U 09046A 17117.08831145 -.00000370 00000-0 00000-0 0 9996 -2 35812 0.0175 316.1497 0001952 115.7115 288.1684 1.00272761 28219 -NIMIQ 5 -1 35873U 09050A 17117.52575233 -.00000269 00000-0 00000-0 0 9997 -2 35873 0.0517 89.3804 0001855 304.0795 298.8058 1.00270995 27899 -AMAZONAS 2 -1 35942U 09054A 17117.94904992 -.00000295 00000-0 00000-0 0 9991 -2 35942 0.0573 106.6638 0003096 331.7094 58.4163 1.00271569 27732 -COMSATBW-1 -1 35943U 09054B 17117.92549392 .00000011 00000-0 00000-0 0 9994 -2 35943 0.0569 80.7719 0002429 325.3108 206.1675 1.00270661 27848 -NSS-12 -1 36032U 09058A 17117.24337260 .00000059 00000-0 00000-0 0 9994 -2 36032 0.0444 79.1380 0002824 327.4447 313.4490 1.00273282 27483 -THOR 6 -1 36033U 09058B 17117.88730039 -.00000023 00000-0 00000-0 0 9998 -2 36033 0.0279 137.2384 0001915 285.2981 112.1018 1.00272109 27571 -INTELSAT 14 (IS-14) -1 36097U 09064A 17116.52862781 -.00000284 00000-0 00000-0 0 9994 -2 36097 0.0184 268.3720 0002200 122.4376 329.2124 1.00272664 27232 -EUTELSAT 36B -1 36101U 09065A 17117.93521792 .00000142 00000-0 00000-0 0 9993 -2 36101 0.0699 10.5563 0004447 29.0687 189.0472 1.00271731 27268 -INTELSAT 15 (IS-15) -1 36106U 09067A 17117.91577310 -.00000199 00000-0 00000-0 0 9998 -2 36106 0.0081 295.5587 0002095 84.5430 250.8097 1.00272075 7842 -DIRECTV 12 -1 36131U 09075A 17117.43745505 -.00000115 00000-0 00000-0 0 9993 -2 36131 0.0088 230.3254 0000208 100.9137 299.0622 1.00271978 13135 -BEIDOU G1 -1 36287U 10001A 17117.80604922 -.00000298 00000-0 00000-0 0 9996 -2 36287 1.4997 356.9041 0001858 169.8506 119.4197 1.00275049 26708 -RADUGA-1M 2 -1 36358U 10002A 17117.91577310 -.00000197 00000-0 00000-0 0 9996 -2 36358 0.0265 259.9308 0002762 176.8821 193.9495 1.00272745 16641 -SDO -1 36395U 10005A 17117.15685212 -.00000038 00000-0 00000-0 0 9991 -2 36395 28.7064 141.3349 0000822 160.5379 228.1754 1.00273335 26598 -INTELSAT 16 (IS-16) -1 36397U 10006A 17117.50257694 -.00000297 00000-0 00000-0 0 9999 -2 36397 0.0407 74.1133 0001438 320.2455 304.1440 1.00270075 26261 -GOES 15 -1 36411U 10008A 17116.77924873 .00000079 00000-0 00000-0 0 9993 -2 36411 0.1007 105.4333 0002141 51.6756 202.9092 1.00273183 26212 -ECHOSTAR 14 -1 36499U 10010A 17117.43382691 -.00000011 00000-0 00000-0 0 9999 -2 36499 0.0075 247.9280 0002691 143.7121 221.2482 1.00270298 26068 -SES-1 -1 36516U 10016A 17117.42410554 -.00000126 00000-0 00000-0 0 9991 -2 36516 0.0278 18.1781 0002366 20.7458 228.3562 1.00270095 25660 -ASTRA 3B -1 36581U 10021A 17117.87271644 .00000124 00000-0 00000-0 0 9990 -2 36581 0.0432 330.2361 0002689 69.1047 154.3873 1.00274085 25414 -COMSATBW-2 -1 36582U 10021B 17117.87757578 .00000075 00000-0 00000-0 0 9991 -2 36582 0.0510 276.3921 0001891 131.8986 136.9064 1.00267423 25514 -BEIDOU G3 -1 36590U 10024A 17117.67045698 -.00000368 00000-0 00000-0 0 9990 -2 36590 1.3180 18.5970 0006088 326.0782 222.9550 1.00277245 25312 -BADR-5 -1 36592U 10025A 17117.87271644 .00000132 00000-0 00000-0 0 9995 -2 36592 0.0123 239.2096 0000973 198.6999 118.3271 1.00274636 19758 -COMS 1 -1 36744U 10032A 17117.92285057 -.00000358 00000-0 00000-0 0 9992 -2 36744 0.0164 339.3925 0000715 58.1991 278.9481 1.00270053 17620 -ARABSAT-5A -1 36745U 10032B 17117.87271644 .00000140 00000-0 00000-0 0 9992 -2 36745 0.0584 18.9464 0003442 17.8345 163.9159 1.00271928 25187 -ECHOSTAR 15 -1 36792U 10034A 17117.94904992 -.00000295 00000-0 00000-0 0 9995 -2 36792 0.0056 53.3360 0002283 353.0150 89.7709 1.00273189 24919 -NILESAT 201 -1 36830U 10037A 17117.93951064 -.00000071 00000-0 00000-0 0 9994 -2 36830 0.0583 144.6297 0005672 263.4862 139.2100 1.00271361 24904 -RASCOM-QAF 1R -1 36831U 10037B 17117.39331280 .00000006 00000-0 00000-0 0 9994 -2 36831 0.0111 350.6026 0004788 41.6602 327.7746 1.00272046 24840 -CHINASAT 6A (ZX 6A) -1 37150U 10042A 17117.91114970 -.00000367 00000-0 00000-0 0 9999 -2 37150 0.0581 106.1080 0001184 67.0333 136.0136 1.00270307 24437 -QZS-1 (MICHIBIKI) -1 37158U 10045A 17115.76142302 -.00000112 00000-0 00000-0 0 9999 -2 37158 40.8186 160.0853 0750436 269.9548 192.8060 1.00297829 24239 -XM-5 -1 37185U 10053A 17117.46953410 -.00000216 00000-0 00000-0 0 9992 -2 37185 0.0117 256.8702 0001078 78.1805 324.4069 1.00268665 24020 -BSAT-3B -1 37207U 10056B 17117.89503390 -.00000364 00000-0 00000-0 0 9999 -2 37207 0.0454 341.8804 0003663 6.9486 299.3078 1.00270205 18793 -BEIDOU G4 -1 37210U 10057A 17117.76246394 -.00000124 00000-0 00000-0 0 9992 -2 37210 0.9656 54.3339 0003841 172.9399 63.1553 1.00271291 23825 -SKYTERRA 1 -1 37218U 10061A 17116.60056793 -.00000132 00000-0 00000-0 0 9998 -2 37218 3.2871 330.0501 0002233 147.5523 212.0774 1.00271870 23737 -ZHONGXING-20A -1 37234U 10064A 17117.87039238 -.00000350 00000-0 00000-0 0 9996 -2 37234 0.0620 95.7045 0004322 289.9676 273.7816 1.00272884 23569 -HYLAS 1 -1 37237U 10065A 17117.83369663 -.00000247 00000-0 00000-0 0 9999 -2 37237 0.0472 45.2672 0001425 331.7377 105.5945 1.00269992 23525 -INTELSAT 17 (IS-17) -1 37238U 10065B 17117.92063499 -.00000015 00000-0 00000-0 0 9991 -2 37238 0.0120 197.5351 0002594 199.8870 216.0897 1.00272484 19967 -EUTELSAT KA-SAT 9A -1 37258U 10069A 17117.37622919 .00000049 00000-0 00000-0 0 9990 -2 37258 0.0367 283.7356 0001491 142.3790 293.9091 1.00267329 10585 -HISPASAT 1E -1 37264U 10070A 17117.87665264 -.00000229 00000-0 00000-0 0 9995 -2 37264 0.0525 96.3906 0003136 325.4404 79.8470 1.00272804 19722 -KOREASAT 6 -1 37265U 10070B 17117.91197160 -.00000375 00000-0 00000-0 0 9998 -2 37265 0.0170 279.1405 0001646 104.2323 276.9987 1.00268575 23314 -ELEKTRO-L 1 (GOMS 2) -1 37344U 11001A 17116.72182454 -.00000262 00000-0 00000-0 0 9994 -2 37344 2.3349 78.1422 0004268 279.1164 80.8735 1.00219570 22996 -BEIDOU IGSO 3 -1 37384U 11013A 17117.78745964 -.00000184 00000-0 10000-3 0 9996 -2 37384 57.7663 73.4599 0027726 212.8974 334.3089 1.00276456 22213 -INTELSAT NEW DAWN -1 37392U 11016A 17117.93521792 .00000142 00000-0 00000-0 0 9995 -2 37392 0.0117 205.6738 0000543 216.8099 163.1012 1.00271560 19830 -YAHSAT 1A -1 37393U 11016B 17117.93119845 .00000088 00000-0 00000-0 0 9997 -2 37393 0.0179 259.9300 0001479 127.4595 216.4307 1.00271346 8944 -TELSTAR 14R -1 37602U 11021A 17117.50743608 -.00000292 00000-0 00000-0 0 9997 -2 37602 0.0459 59.7302 0001570 298.7625 336.8587 1.00272032 22388 -GSAT-8 -1 37605U 11022A 17117.93073531 .00000072 00000-0 00000-0 0 9994 -2 37605 0.0108 283.1636 0005146 27.0154 296.0193 1.00271518 19753 -ST-2 -1 37606U 11022B 17117.91091101 -.00000224 00000-0 00000-0 0 9996 -2 37606 0.0101 261.5616 0001301 132.3951 238.0288 1.00267464 21804 -CHINASAT 10 (ZX 10) -1 37677U 11026A 17117.97787924 -.00000365 00000-0 00000-0 0 9995 -2 37677 0.0564 272.7688 0001725 241.5890 164.3047 1.00267633 21502 -TIANLIAN 1-02 -1 37737U 11032A 17117.61309976 .00000019 00000-0 00000-0 0 9992 -2 37737 2.4866 77.5850 0006484 221.9875 313.7441 1.00275906 21256 -GSAT-12 -1 37746U 11034A 17117.72217826 -.00000178 00000-0 00000-0 0 9995 -2 37746 0.0901 272.8214 0006239 174.9296 111.1204 1.00271717 21495 -SES-3 -1 37748U 11035A 17117.43745505 -.00000114 00000-0 00000-0 0 9996 -2 37748 0.0177 302.7166 0002682 50.7149 276.6645 1.00271757 21149 -ASTRA 1N -1 37775U 11041A 17117.87757578 .00000107 00000-0 00000-0 0 9995 -2 37775 0.0554 18.0423 0005350 27.9821 145.1783 1.00274721 11077 -BSAT-3C (JCSAT-110R) -1 37776U 11041B 17117.89503576 -.00000364 00000-0 00000-0 0 9991 -2 37776 0.0576 84.0912 0000217 190.2485 13.8797 1.00266863 17031 -PAKSAT-1R -1 37779U 11042A 17117.93521792 .00000140 00000-0 00000-0 0 9991 -2 37779 0.0629 73.4343 0004076 308.4154 208.9378 1.00274117 21012 -CHINASAT 1A (ZX 1A) -1 37804U 11047A 17117.87039470 -.00000350 00000-0 00000-0 0 9999 -2 37804 0.0273 272.1799 0000913 65.3862 321.7566 1.00275859 20612 -COSMOS 2473 -1 37806U 11048A 17117.60743946 -.00000120 00000-0 00000-0 0 9998 -2 37806 0.0669 95.8155 0002864 339.6820 345.4748 1.00272194 20600 -SES-2 -1 37809U 11049A 17117.48990098 -.00000208 00000-0 00000-0 0 9997 -2 37809 0.0141 328.8399 0002340 44.5301 291.6604 1.00272640 20555 -ARABSAT-5C -1 37810U 11049B 17117.87757578 .00000110 00000-0 00000-0 0 9997 -2 37810 0.0669 4.1487 0002727 25.0467 162.7740 1.00269352 20599 -EUTELSAT 7 WEST A -1 37816U 11051A 17117.42128247 -.00000072 00000-0 00000-0 0 9990 -2 37816 0.0694 31.1553 0001349 108.6052 220.2572 1.00270407 20444 -QUETZSAT 1 -1 37826U 11054A 17117.51879441 -.00000253 00000-0 00000-0 0 9994 -2 37826 0.0219 327.2838 0002403 88.7113 269.4509 1.00269735 20628 -INTELSAT 18 (IS-18) -1 37834U 11056A 17117.53193792 .00000041 00000-0 00000-0 0 9999 -2 37834 0.0068 229.8026 0002114 179.8429 177.5687 1.00272990 20382 -EUTELSAT 16A -1 37836U 11057A 17117.14074610 .00000092 00000-0 00000-0 0 9992 -2 37836 0.0699 355.7484 0004693 50.2941 235.9497 1.00274120 20314 -VIASAT-1 -1 37843U 11059A 17117.43382691 -.00000035 00000-0 00000-0 0 9993 -2 37843 0.0188 251.6787 0002343 138.8216 226.1763 1.00269094 13867 -ASIASAT 7 -1 37933U 11069A 17117.89641398 -.00000347 00000-0 00000-0 0 9992 -2 37933 0.0094 244.0736 0001486 113.0125 287.1521 1.00268057 11397 -LUCH 5A -1 37951U 11074B 17117.77595258 -.00000056 00000-0 00000-0 0 9995 -2 37951 1.5532 186.1735 0004021 190.4387 285.6345 1.00273438 19723 -NIGCOMSAT 1R -1 38014U 11077A 17117.93521792 .00000131 00000-0 00000-0 0 9992 -2 38014 0.0555 68.5274 0000317 264.1502 262.6266 1.00274849 19494 -FENGYUN 2F -1 38049U 12002A 17117.73436551 -.00000369 00000-0 00000-0 0 9999 -2 38049 1.6134 77.9514 0002913 170.6678 343.7793 1.00276058 19425 -SES-4 -1 38087U 12007A 17116.07248362 -.00000178 00000-0 00000-0 0 9991 -2 38087 0.0263 350.4261 0002489 35.4688 192.4674 1.00272096 19007 -BEIDOU G5 -1 38091U 12008A 17117.92856885 .00000044 00000-0 00000-0 0 9998 -2 38091 2.1332 55.6291 0002532 232.8854 320.5169 1.00269735 19016 -INTELSAT 22 (IS-22) -1 38098U 12011A 17117.20149384 -.00000070 00000-0 00000-0 0 9999 -2 38098 0.0272 356.9410 0001823 55.0491 308.0346 1.00270100 18371 -APSTAR 7 -1 38107U 12013A 17116.84702259 -.00000113 00000-0 00000-0 0 9995 -2 38107 0.0320 125.7547 0002588 267.8390 202.8751 1.00272168 18691 -YAHSAT 1B -1 38245U 12016A 17117.26938155 .00000114 00000-0 00000-0 0 9994 -2 38245 0.0031 214.7897 0001569 173.0469 332.1800 1.00270865 12163 -JCSAT-13 -1 38331U 12023A 17117.05777120 -.00000368 00000-0 00000-0 0 9990 -2 38331 0.0129 258.0570 0001334 147.6302 314.3237 1.00267968 18060 -VINASAT-2 -1 38332U 12023B 17117.64007542 -.00000342 00000-0 00000-0 0 9992 -2 38332 0.0110 282.0783 0001992 130.7094 165.2828 1.00269450 18141 -NIMIQ 6 -1 38342U 12026A 17116.65634662 -.00000184 00000-0 00000-0 0 9999 -2 38342 0.0392 68.8520 0002575 326.3621 324.8119 1.00271529 16964 -CHINASAT 2A (ZX 2A) -1 38352U 12028A 17117.79735200 -.00000306 00000-0 00000-0 0 9994 -2 38352 0.0255 274.6431 0004263 81.4650 245.1493 1.00273607 17913 -INTELSAT 19 (IS-19) -1 38356U 12030A 17116.94139020 -.00000067 00000-0 00000-0 0 9999 -2 38356 0.0243 350.4509 0003266 51.9359 317.6470 1.00273890 17007 -ECHOSTAR 17 -1 38551U 12035A 17116.70064796 -.00000086 00000-0 00000-0 0 9993 -2 38551 0.0215 243.8276 0001996 148.0054 328.1791 1.00269580 17607 -METEOSAT-10 (MSG-3) -1 38552U 12035B 17117.40141041 -.00000016 00000-0 00000-0 0 9994 -2 38552 0.8005 51.9205 0000232 155.6438 152.4418 1.00277252 17424 -SES-5 -1 38652U 12036A 17116.07316208 .00000024 00000-0 00000-0 0 9995 -2 38652 0.0345 265.9011 0001928 133.9601 205.7209 1.00272673 17589 -TIANLIAN 1-03 -1 38730U 12040A 17117.37165398 .00000061 00000-0 00000-0 0 9994 -2 38730 0.0210 228.2696 0002588 201.3366 290.4296 1.00275726 15250 -INTELSAT 20 (IS-20) -1 38740U 12043A 17117.21132225 -.00000036 00000-0 00000-0 0 9997 -2 38740 0.0181 201.9596 0000365 354.5412 163.4981 1.00270108 17306 -HYLAS 2 -1 38741U 12043B 17117.31530424 .00000142 00000-0 00000-0 0 9999 -2 38741 0.0358 85.5005 0001540 303.3196 331.1965 1.00270951 17303 -INTELSAT 21 (IS-21) -1 38749U 12045A 17116.56463404 -.00000295 00000-0 00000-0 0 9998 -2 38749 0.0181 245.8931 0001867 145.4303 328.6878 1.00268873 17080 -ASTRA 2F -1 38778U 12051A 17117.32303741 .00000138 00000-0 00000-0 0 9994 -2 38778 0.0603 237.7861 0000791 5.2545 116.9595 1.00273058 7702 -GSAT-10 -1 38779U 12051B 17117.17132557 -.00000177 00000-0 00000-0 0 9997 -2 38779 0.0837 96.3840 0002273 318.9132 304.7324 1.00272366 16653 -INTELSAT 23 (IS-23) -1 38867U 12057A 17117.54805843 -.00000297 00000-0 00000-0 0 9990 -2 38867 0.0071 228.1720 0001560 160.0413 331.8029 1.00271038 16545 -BEIDOU G6 -1 38953U 12059A 17116.84216362 -.00000186 00000-0 10000-3 0 9993 -2 38953 1.5498 79.9483 0003323 181.2375 341.0710 1.00273276 16578 -LUCH 5B -1 38977U 12061A 17117.81477027 -.00000141 00000-0 00000-0 0 9994 -2 38977 3.4436 74.8585 0003385 316.8276 101.3060 1.00272803 16714 -YAMAL 300K -1 38978U 12061B 17117.66734164 .00000058 00000-0 00000-0 0 9992 -2 38978 0.0013 65.8483 0001186 158.6029 54.5753 1.00270004 16406 -STAR ONE C3 -1 38991U 12062A 17117.51230095 -.00000261 00000-0 00000-0 0 9993 -2 38991 0.0632 86.5787 0001403 291.9084 306.6125 1.00273422 16309 -EUTELSAT 21B -1 38992U 12062B 17117.34139536 .00000118 00000-0 00000-0 0 9993 -2 38992 0.0699 357.3051 0002481 57.2231 305.5028 1.00274556 16398 -ECHOSTAR 16 -1 39008U 12065A 17117.57160113 -.00000294 00000-0 00000-0 0 9991 -2 39008 0.0165 244.8235 0002036 147.0914 328.0975 1.00269141 16161 -CHINASAT 12 (ZX 12) -1 39017U 12067A 17117.75576133 -.00000219 00000-0 00000-0 0 9993 -2 39017 0.0142 289.9655 0002655 105.8268 179.6945 1.00269482 16045 -EUTELSAT 70B -1 39020U 12069A 17117.20584515 -.00000056 00000-0 00000-0 0 9991 -2 39020 0.0649 6.7979 0001899 50.2833 302.9452 1.00270932 16041 -YAMAL 402 -1 39022U 12070A 17117.16024598 .00000074 00000-0 10000-3 0 9993 -2 39022 0.0280 253.8595 0002296 162.7652 271.3062 1.00273295 16123 -SKYNET 5D -1 39034U 12075A 17117.93119845 .00000085 00000-0 00000-0 0 9994 -2 39034 0.0737 352.5704 0003301 43.2148 208.3101 1.00273364 15707 -MEXSAT 3 -1 39035U 12075B 17116.72193635 -.00000037 00000-0 00000-0 0 9998 -2 39035 0.0203 201.5722 0001203 185.8867 332.5563 1.00275171 15709 -TDRS 11 -1 39070U 13004A 17116.79061433 .00000074 00000-0 00000-0 0 9997 -2 39070 5.4615 328.7166 0009629 304.9713 54.7219 1.00268414 13220 -AMAZONAS 3 -1 39078U 13006A 17117.57030832 -.00000294 00000-0 00000-0 0 9998 -2 39078 0.0232 210.7990 0001017 170.7766 338.4364 1.00266020 11423 -AZERSPACE 1 -1 39079U 13006B 17117.27380132 .00000121 00000-0 00000-0 0 9995 -2 39079 0.0085 224.3879 0002026 199.2180 296.4148 1.00271387 15344 -EUTELSAT 117 WEST A -1 39122U 13012A 17116.72757230 -.00000024 00000-0 00000-0 0 9990 -2 39122 0.0082 293.0210 0002872 90.1407 336.8602 1.00271865 14986 -ANIK G1 -1 39127U 13014A 17116.70111460 -.00000085 00000-0 00000-0 0 9991 -2 39127 0.0128 268.8176 0001685 70.5411 20.6435 1.00271429 14798 -CHINASAT 11 (ZX 11) -1 39157U 13020A 17117.83729890 -.00000304 00000-0 00000-0 0 9992 -2 39157 0.0082 184.5590 0002293 122.6127 308.2587 1.00271445 14682 -EUTELSAT 7B -1 39163U 13022A 17117.38183232 .00000036 00000-0 00000-0 0 9996 -2 39163 0.0504 21.9676 0004772 349.0419 349.0090 1.00270125 14530 -SES-6 -1 39172U 13026A 17117.20327191 -.00000273 00000-0 00000-0 0 9999 -2 39172 0.0640 66.7789 0001644 342.8966 198.4033 1.00272157 14255 -IRNSS-1A -1 39199U 13034A 17117.56962913 .00000120 00000-0 00000-0 0 9993 -2 39199 28.7377 115.9038 0020747 189.5995 170.3742 1.00274229 13904 -ALPHASAT -1 39215U 13038A 17117.41305156 .00000126 00000-0 00000-0 0 9996 -2 39215 1.6566 29.6853 0001710 353.9133 5.5184 1.00270017 10580 -INSAT-3D -1 39216U 13038B 17117.17372789 -.00000169 00000-0 00000-0 0 9994 -2 39216 0.0454 86.7516 0001079 259.4051 13.8486 1.00274076 13654 -EUTELSAT 25B -1 39233U 13044A 17117.33066672 .00000131 00000-0 00000-0 0 9997 -2 39233 0.0650 50.4334 0001680 337.4043 332.1794 1.00272127 13174 -GSAT-7 -1 39234U 13044B 17116.19881661 -.00000088 00000-0 00000-0 0 9996 -2 39234 0.1051 98.1590 0002381 211.2129 50.6164 1.00272181 11886 -AMOS-4 -1 39237U 13045A 17117.22122427 -.00000004 00000-0 00000-0 0 9991 -2 39237 0.0467 110.7753 0001601 260.4183 348.8183 1.00271512 13490 -ASTRA 2E -1 39285U 13056A 17117.32231868 .00000138 00000-0 00000-0 0 9994 -2 39285 0.0782 50.0304 0002434 345.7492 324.2448 1.00272380 13009 -SIRIUS FM-6 -1 39360U 13058A 17116.72558332 -.00000027 00000-0 00000-0 0 9999 -2 39360 0.0061 263.1140 0000899 295.4476 161.4352 1.00269316 12878 -RADUGA-1M 3 -1 39375U 13062A 17117.92063499 -.00000052 00000-0 00000-0 0 9996 -2 39375 0.0052 229.1858 0002841 203.8969 184.4430 1.00272377 12661 -SES-8 -1 39460U 13071A 17116.14083076 -.00000279 00000-0 00000-0 0 9998 -2 39460 0.0201 267.7730 0002484 145.8360 306.4233 1.00268061 11045 -INMARSAT 5-F1 -1 39476U 13073A 17117.75465862 .00000015 00000-0 00000-0 0 9999 -2 39476 0.0142 258.5341 0000381 50.2184 241.4462 1.00270660 12130 -TKSAT-1 (TUPAC KATARI) -1 39481U 13075A 17117.48990183 -.00000207 00000-0 00000-0 0 9990 -2 39481 0.0155 74.9497 0002566 287.8256 302.0727 1.00271282 12372 -EXPRESS-AM5 -1 39487U 13077A 17117.23484271 -.00000292 00000-0 00000-0 0 9991 -2 39487 0.0173 321.1911 0000715 339.7770 139.0540 1.00272139 12900 -GSAT-14 -1 39498U 14001A 17116.19901211 -.00000088 00000-0 00000-0 0 9996 -2 39498 0.0776 270.5701 0004142 146.8407 302.6386 1.00272992 12090 -THAICOM 6 -1 39500U 14002A 17117.91577310 -.00000135 00000-0 00000-0 0 9994 -2 39500 0.0777 112.3510 0002332 331.0864 180.8359 1.00272357 11988 -TDRS 12 -1 39504U 14004A 17117.44786351 -.00000289 00000-0 00000-0 0 9995 -2 39504 6.0328 336.1590 0002577 40.5444 319.2879 1.00273341 10811 -ABS-2 -1 39508U 14006A 17117.19366995 -.00000099 00000-0 00000-0 0 9990 -2 39508 0.0316 71.7322 0003321 325.9744 322.3250 1.00273381 11859 -ATHENA-FIDUS -1 39509U 14006B 17117.29651905 .00000142 00000-0 00000-0 0 9998 -2 39509 0.0155 293.1760 0001216 102.3867 324.4536 1.00273106 11610 -TURKSAT 4A -1 39522U 14007A 17117.28486032 .00000134 00000-0 00000-0 0 9991 -2 39522 0.0276 270.9949 0002231 64.7257 24.2772 1.00270986 11534 -EXPRESS-AT1 -1 39612U 14010A 17117.57341089 .00000066 00000-0 00000-0 0 9993 -2 39612 0.0128 314.6617 0000418 181.6479 341.8679 1.00272751 11589 -EXPRESS-AT2 -1 39613U 14010B 17117.66619015 -.00000294 00000-0 00000-0 0 9995 -2 39613 0.0143 314.7677 0000300 306.2754 334.4739 1.00271132 11414 -AMAZONAS 4A -1 39616U 14011A 17117.57011408 -.00000295 00000-0 00000-0 0 9992 -2 39616 0.0865 75.8825 0005333 323.8685 320.2958 1.00271635 11231 -ASTRA 5B -1 39617U 14011B 17117.06942167 .00000143 00000-0 00000-0 0 9993 -2 39617 0.0498 315.1147 0002975 88.3285 228.3291 1.00275404 11392 -IRNSS-1B -1 39635U 14017A 17113.08129908 .00000063 00000-0 00000-0 0 9998 -2 39635 29.1906 295.7644 0019205 177.1796 182.7814 1.00278970 11295 -LUCH 5V -1 39727U 14023A 17117.91091100 -.00000285 00000-0 00000-0 0 9992 -2 39727 2.8046 299.0420 0002860 98.0777 241.5887 1.00268912529055 -KAZSAT-3 -1 39728U 14023B 17117.23911005 .00000048 00000-0 00000-0 0 9999 -2 39728 0.0123 272.7284 0001094 189.5235 257.7604 1.00272744 8989 -EUTELSAT 3B -1 39773U 14030A 17117.88243532 .00000007 00000-0 00000-0 0 9996 -2 39773 0.0799 324.9493 0001515 68.6682 143.2054 1.00271592 10612 -ASIASAT 8 -1 40107U 14046A 17117.41199892 -.00000045 00000-0 00000-0 0 9997 -2 40107 0.0024 76.2848 0000051 264.7857 18.9372 1.00272372 68693 -ASIASAT 6 -1 40141U 14052A 17117.91212845 -.00000375 00000-0 00000-0 0 9997 -2 40141 0.0105 217.3390 0000580 190.6922 256.3209 1.00269771 9598 -OPTUS 10 -1 40146U 14054A 17115.94963136 -.00000084 00000-0 00000-0 0 9998 -2 40146 0.1044 3.8346 0001507 26.0638 330.1195 1.00271492 9645 -MEASAT-3B -1 40147U 14054B 17116.15055614 -.00000252 00000-0 00000-0 0 9993 -2 40147 0.0381 27.5678 0002708 15.8995 316.5632 1.00269817 9435 -LUCH (OLYMP) -1 40258U 14058A 17117.83797624 .00000054 00000-0 00000-0 0 9999 -2 40258 0.0087 189.0678 0000499 215.2963 123.2120 1.00269973 9473 -HIMAWARI-8 -1 40267U 14060A 17117.01160997 -.00000288 00000-0 00000-0 0 9999 -2 40267 0.0115 305.2623 0000585 134.1294 280.6233 1.00269483 9298 -IRNSS-1C -1 40269U 14061A 17117.86747072 -.00000176 00000-0 00000-0 0 9996 -2 40269 3.1158 251.3666 0018891 8.4350 351.5616 1.00273379 9353 -INTELSAT 30 (IS-30) -1 40271U 14062A 17116.40940988 -.00000160 00000-0 00000-0 0 9993 -2 40271 0.0118 251.6237 0000981 220.4768 154.8191 1.00268509 9211 -ARSAT 1 -1 40272U 14062B 17117.53648071 -.00000272 00000-0 00000-0 0 9991 -2 40272 0.0107 186.5942 0000923 198.5210 311.9545 1.00271595 9412 -EXPRESS-AM6 -1 40277U 14064A 17117.65882578 .00000085 00000-0 00000-0 0 9994 -2 40277 0.0138 313.5286 0000453 133.7726 58.7090 1.00271456 9209 -GSAT-16 -1 40332U 14078A 17117.24884318 .00000073 00000-0 00000-0 0 9997 -2 40332 0.0956 88.4139 0006072 344.9104 286.7505 1.00272630 8661 -DIRECTV 14 -1 40333U 14078B 17117.42375833 -.00000137 00000-0 00000-0 0 9997 -2 40333 0.0136 264.8062 0000571 35.9934 328.1253 1.00271206 8695 -YAMAL 401 -1 40345U 14082A 17117.91091100 -.00000241 00000-0 00000-0 0 9997 -2 40345 0.0654 76.3877 0001419 19.5531 177.9986 1.00270015 8944 -ASTRA 2G -1 40364U 14089A 17117.32319888 .00000138 00000-0 00000-0 0 9990 -2 40364 0.0234 33.5213 0004638 8.8669 317.6476 1.00270810 8509 -FENGYUN 2G -1 40367U 14090A 17117.85407676 -.00000343 00000-0 00000-0 0 9995 -2 40367 0.5380 260.1505 0003624 324.6317 43.1079 1.00281078 8579 -INMARSAT 5-F2 -1 40384U 15005A 17117.21518361 -.00000297 00000-0 00000-0 0 9993 -2 40384 0.0203 252.2432 0000197 45.7643 299.8340 1.00269286 8201 -ABS-3A -1 40424U 15010A 17116.41198922 -.00000036 00000-0 00000-0 0 9993 -2 40424 0.0116 264.8307 0001947 55.9449 39.2196 1.00271079 7948 -EUTELSAT 115 WEST B -1 40425U 15010B 17116.72223496 -.00000036 00000-0 00000-0 0 9993 -2 40425 0.0186 95.2337 0000331 315.1453 309.6327 1.00272873 7939 -EXPRESS-AM7 -1 40505U 15012A 17117.16960516 .00000138 00000-0 00000-0 0 9996 -2 40505 0.0064 344.5860 0002487 34.1261 297.7362 1.00275825 7883 -IRNSS-1D -1 40547U 15018A 17116.91366651 -.00000329 00000-0 00000-0 0 9993 -2 40547 29.1719 295.8388 0019995 179.2718 180.6576 1.00269953 7524 -BEIDOU I1-S -1 40549U 15019A 17117.96584828 -.00000147 00000-0 00000-0 0 9998 -2 40549 54.4435 334.3431 0039420 181.7011 138.7710 1.00252691 7614 -THOR 7 -1 40613U 15022A 17117.40307496 -.00000021 00000-0 00000-0 0 9998 -2 40613 0.0383 105.6479 0002517 286.2239 328.1514 1.00271187 7366 -TURKMENALEM52E/MONACOSAT -1 40617U 15023A 17117.25711709 .00000091 00000-0 00000-0 0 9998 -2 40617 0.0175 325.9433 0002715 75.9132 318.1724 1.00273623 7371 -DIRECTV 15 -1 40663U 15026A 17116.68859506 -.00000114 00000-0 00000-0 0 9993 -2 40663 0.0207 127.5812 0000319 38.2844 194.1441 1.00269867 7064 -SKY MEXICO-1 -1 40664U 15026B 17116.62225059 -.00000245 00000-0 00000-0 0 9993 -2 40664 0.0205 247.0234 0001864 144.9356 328.0523 1.00270836 7087 -METEOSAT-11 (MSG-4) -1 40732U 15034A 17117.08970345 -.00000040 00000-0 00000-0 0 9997 -2 40732 1.9114 243.9311 0000818 126.2920 233.7403 1.00272959 6571 -STAR ONE C4 -1 40733U 15034B 17116.59788324 -.00000275 00000-0 00000-0 0 9997 -2 40733 0.0593 67.9083 0002756 322.8663 329.2505 1.00271429 6568 -INTELSAT 34 (IS-34) -1 40874U 15039A 17116.55763949 -.00000296 00000-0 00000-0 0 9993 -2 40874 0.0208 264.9248 0000929 306.7335 148.3451 1.00270112 6205 -EUTELSAT 8 WEST B -1 40875U 15039B 17117.42345163 -.00000078 00000-0 00000-0 0 9993 -2 40875 0.0691 10.4219 0003326 15.9044 333.6986 1.00272433 6226 -GSAT-6 -1 40880U 15041A 17117.17108562 -.00000177 00000-0 00000-0 0 9994 -2 40880 0.0407 117.2808 0006897 171.9963 70.6569 1.00272283 6189 -INMARSAT 5-F3 -1 40882U 15042A 17116.90362900 .00000038 00000-0 00000-0 0 9990 -2 40882 0.0217 254.3450 0000531 286.8364 178.8185 1.00266924 6096 -TJS-1 -1 40892U 15046A 17117.76234197 -.00000169 00000-0 00000-0 0 9992 -2 40892 0.0645 275.9785 0007248 110.7787 258.6129 1.00272774 6082 -EXPRESS-AM8 -1 40895U 15048A 17117.36575874 -.00000123 00000-0 00000-0 0 9993 -2 40895 0.0111 312.0010 0000876 151.7155 229.5053 1.00271905 5909 -BEIDOU I2-S -1 40938U 15053A 17117.98638063 -.00000149 00000-0 00000-0 0 9993 -2 40938 54.2759 297.2377 0048024 171.7126 197.1132 1.00262704 5908 -SKY MUSTER (NBN1A) -1 40940U 15054A 17116.01545583 -.00000289 00000-0 00000-0 0 9999 -2 40940 0.0165 262.2380 0001599 127.0372 330.7433 1.00270404 5815 -ARSAT 2 -1 40941U 15054B 17116.62830677 -.00000235 00000-0 00000-0 0 9999 -2 40941 0.0143 230.0093 0001199 169.4769 320.5225 1.00270092 5855 -MORELOS 3 -1 40946U 15056A 17116.63308841 -.00000065 00000-0 00000-0 0 9991 -2 40946 6.4893 329.7934 0001422 355.1217 4.7009 1.00271666 5818 -APSTAR 9 -1 40982U 15059A 17117.00782284 -.00000278 00000-0 00000-0 0 9999 -2 40982 0.0135 266.7880 0000646 37.6956 55.5188 1.00268881 5699 -TURKSAT 4B -1 40984U 15060A 17117.26277957 .00000103 00000-0 00000-0 0 9993 -2 40984 0.0407 82.9158 0001926 305.3905 331.7123 1.00270918 5658 -CHINASAT 2C (ZX 2C) -1 41021U 15063A 17117.98029328 -.00000337 00000-0 00000-0 0 9995 -2 41021 0.0228 3.6102 0002910 31.7047 277.1750 1.00271136 5542 -GSAT-15 -1 41028U 15065A 17117.14222039 -.00000270 00000-0 00000-0 0 9992 -2 41028 0.0941 95.1208 0002002 296.2375 328.6619 1.00271123 5393 -BADR-7 (ARABSAT-6B) -1 41029U 15065B 17117.32913298 .00000133 00000-0 00000-0 0 9994 -2 41029 0.0384 252.3668 0002656 5.3301 102.2814 1.00271742 5283 -LAOSAT 1 -1 41034U 15067A 17117.04518466 -.00000355 00000-0 00000-0 0 9996 -2 41034 0.0188 92.3060 0001025 168.4133 99.2691 1.00270248 5404 -TELSTAR 12V -1 41036U 15068A 17116.44551241 -.00000130 00000-0 00000-0 0 9991 -2 41036 0.0107 210.9633 0001939 182.5453 326.5037 1.00269236 5154 -CHINASAT 1C (ZX 1C) -1 41103U 15073A 17117.91577310 -.00000164 00000-0 00000-0 0 9997 -2 41103 0.0154 292.2913 0003094 24.0910 310.9089 1.00272200 5202 -ELEKTRO-L 2 -1 41105U 15074A 17117.47930025 -.00000109 00000-0 00000-0 0 9996 -2 41105 0.0633 57.2317 0002068 11.7263 35.2424 1.00271515 5058 -COSMOS 2513 -1 41121U 15075A 17117.97340459 -.00000152 00000-0 00000-0 0 9994 -2 41121 0.0750 86.4624 0003406 329.1409 231.2148 1.00271448 5131 -EXPRESS-AMU1 -1 41191U 15082A 17117.22701594 .00000144 00000-0 00000-0 0 9998 -2 41191 0.0060 169.0732 0001654 211.8824 312.2719 1.00272049 5032 -GAOFEN 4 -1 41194U 15083A 17117.76105369 -.00000347 00000-0 00000-0 0 9995 -2 41194 0.0117 267.4537 0002579 290.7035 37.4471 1.00268400 5027 -BELINTERSAT-1 -1 41238U 16001A 17117.93035581 .00000093 00000-0 10000-3 0 9993 -2 41238 0.0628 83.1705 0001160 327.4095 191.9288 1.00272658 4810 -IRNSS-1E -1 41241U 16003A 17114.42019644 -.00000250 00000-0 00000-0 0 9994 -2 41241 28.6979 115.6166 0019558 187.7326 172.2858 1.00266983 4599 -INTELSAT 29E (IS-29E) -1 41308U 16004A 17117.53973758 -.00000294 00000-0 00000-0 0 9997 -2 41308 0.0165 260.1902 0001517 130.3195 329.5068 1.00271007 4719 -EUTELSAT 9B -1 41310U 16005A 17117.37625115 .00000049 00000-0 00000-0 0 9991 -2 41310 0.0605 99.8657 0003897 238.1359 21.9899 1.00270040 4651 -SES-9 -1 41380U 16013A 17117.10119203 -.00000357 00000-0 00000-0 0 9997 -2 41380 0.0238 296.4856 0001279 110.7465 312.7871 1.00271312 4037 -EUTELSAT 65 WEST A -1 41382U 16014A 17116.58453580 -.00000287 00000-0 00000-0 0 9992 -2 41382 0.0551 25.0955 0001709 6.2524 328.6713 1.00271275 4091 -IRNSS-1F -1 41384U 16015A 17117.05156159 .00000143 00000-0 00000-0 0 9990 -2 41384 4.2636 266.3524 0021293 175.3013 184.5678 1.00273189 4226 -BEIDOU IGSO 6 -1 41434U 16021A 17117.96834563 -.00000144 00000-0 10000-3 0 9991 -2 41434 55.4786 72.9503 0027297 185.9302 41.3972 1.00281076 4021 -IRNSS-1G -1 41469U 16027A 17117.78335953 -.00000352 00000-0 00000-0 0 9991 -2 41469 4.3353 267.6502 0001500 91.8329 268.0492 1.00268747 3739 -JCSAT 2B -1 41471U 16028A 17115.97731134 -.00000175 00000-0 00000-0 0 9998 -2 41471 0.0118 225.9447 0001168 184.6949 309.3707 1.00271088 3637 -THAICOM 8 -1 41552U 16031A 17117.18387176 -.00000133 00000-0 00000-0 0 9994 -2 41552 0.0748 59.5254 0005015 334.6792 325.8361 1.00270339 3267 -INTELSAT 31 (IS-31) -1 41581U 16035A 17116.66719882 -.00000161 00000-0 00000-0 0 9996 -2 41581 0.0150 239.8780 0001963 347.7795 132.3347 1.00270876 3237 -BEIDOU G7 -1 41586U 16037A 17116.87553415 -.00000262 00000-0 00000-0 0 9996 -2 41586 1.3222 315.7013 0001712 293.1868 65.8440 1.00267877 3327 -ABS-2A (MONGOLSAT-1) -1 41588U 16038A 17116.19681341 -.00000094 00000-0 00000-0 0 9997 -2 41588 0.0157 231.2698 0002112 69.7991 58.9104 1.00270214 3242 -EUTELSAT 117 WEST B -1 41589U 16038B 17116.72794179 -.00000022 00000-0 00000-0 0 9992 -2 41589 0.0037 79.2052 0000311 315.9932 324.8037 1.00270169 3243 -BRISAT -1 41591U 16039A 17115.98705320 -.00000207 00000-0 00000-0 0 9998 -2 41591 0.0182 276.0775 0002212 115.7852 328.1602 1.00271398 3166 -ECHOSTAR 18 -1 41592U 16039B 17116.57392046 -.00000292 00000-0 00000-0 0 9996 -2 41592 0.0197 246.5186 0001839 132.7923 340.6961 1.00268628 3162 -TIANTONG-1 1 -1 41725U 16048A 17117.83660447 -.00000336 00000-0 00000-0 0 9996 -2 41725 4.6566 325.2565 0004940 49.1616 244.2138 1.00269197 2809 -JCSAT-16 -1 41729U 16050A 17116.95229038 -.00000103 00000-0 00000-0 0 9994 -2 41729 0.0203 249.8855 0001635 148.0981 322.0279 1.00270117 2609 -INTELSAT 36 (IS-36) -1 41747U 16053A 17116.91279094 -.00000036 00000-0 00000-0 0 9995 -2 41747 0.0369 52.7296 0001812 349.0469 210.4048 1.00271453 2498 -INTELSAT 33E (IS-33E) -1 41748U 16053B 17117.23496068 .00000037 00000-0 00000-0 0 9994 -2 41748 0.0100 284.9518 0001619 114.0329 321.0270 1.00271934 2791 -INSAT-3DR -1 41752U 16054A 17117.19603294 -.00000089 00000-0 00000-0 0 9994 -2 41752 0.0651 103.4437 0007168 178.8667 77.6178 1.00270745 2352 -GSAT-18 -1 41793U 16060A 17117.19645072 -.00000089 00000-0 00000-0 0 9996 -2 41793 0.0840 101.1864 0006877 347.6697 271.2308 1.00271944 2079 -SKY MUSTER 2 -1 41794U 16060B 17117.00010658 -.00000256 00000-0 00000-0 0 9999 -2 41794 0.0166 266.1328 0001344 117.3954 336.4865 1.00270195 2068 -HIMAWARI-9 -1 41836U 16064A 17117.01119582 -.00000286 00000-0 00000-0 0 9990 -2 41836 0.0381 83.4113 0000619 338.0844 298.5190 1.00271683 1724 -SHIJIAN-17 (SJ-17) -1 41838U 16065A 17117.89305606 -.00000127 00000-0 00000-0 0 9997 -2 41838 0.0725 75.9019 0002518 63.2129 200.5047 1.00166270 1765 -GOES 16 -1 41866U 16071A 17116.65187186 -.00000193 00000-0 00000-0 0 9992 -2 41866 0.0108 65.4581 0001555 322.9658 331.5936 1.00272028 1638 -TIANLIAN 1-04 -1 41869U 16072A 17117.02574821 -.00000122 00000-0 00000-0 0 9996 -2 41869 2.7637 290.2696 0006419 130.9138 240.2633 1.00271737 1845 -FENGYUN 4A -1 41882U 16077A 17117.97022532 -.00000316 00000-0 00000-0 0 9992 -2 41882 0.1121 266.7982 0002637 258.2444 139.9757 1.00277180 1511 -ECHOSTAR 19 -1 41893U 16079A 17116.67297528 -.00000149 00000-0 00000-0 0 9995 -2 41893 0.0207 244.9861 0001173 148.4643 326.5570 1.00269739 1255 -STAR ONE D1 -1 41904U 16082B 17116.63670930 -.00000221 00000-0 00000-0 0 9991 -2 41904 0.0427 96.2633 0002612 317.2641 306.5056 1.00273074 1300 -TJS-2 -1 41911U 17001A 17117.02735219 -.00000355 00000-0 00000-0 0 9995 -2 41911 0.7857 280.0160 0001843 187.9162 224.7105 1.00274108 1254 -HISPASAT 36W-1 -1 41942U 17006A 17117.26142550 -.00000205 00000-0 00000-0 0 9994 -2 41942 0.0482 72.1332 0002800 331.1091 240.3263 1.00272241 1057 -TELKOM 3S -1 41944U 17007A 17117.07423128 -.00000374 00000-0 00000-0 0 9996 -2 41944 0.0100 211.1653 0000799 228.6723 280.1715 1.00268401 678 -INTELSAT 32E (IS-32E) -1 41945U 17007B 17116.52353783 -.00000280 00000-0 00000-0 0 9991 -2 41945 0.0130 238.2968 0000536 340.9326 140.7667 1.00268437 774 diff --git a/firmware/app/libs/libpredict/tests/data/geosynchronous_satellite_numbers.dat b/firmware/app/libs/libpredict/tests/data/geosynchronous_satellite_numbers.dat deleted file mode 100644 index 68b08a1d..00000000 --- a/firmware/app/libs/libpredict/tests/data/geosynchronous_satellite_numbers.dat +++ /dev/null @@ -1,2094 +0,0 @@ -40882 -24674 -37737 -28924 -25371 -37951 -38356 -40146 -41729 -26095 -41838 -29495 -37210 -25924 -24916 -27831 -35756 -40892 -41471 -32252 -41591 -25067 -24653 -25657 -27441 -28937 -41794 -41586 -33274 -28628 -32500 -40982 -41836 -40267 -40940 -39487 -36287 -39613 -28364 -27399 -27461 -28638 -29045 -32767 -38332 -37234 -37804 -41469 -41034 -36744 -29272 -35755 -25354 -37150 -38331 -29640 -26863 -27718 -40141 -28786 -41944 -28902 -25894 -37265 -31800 -25462 -29349 -40547 -35812 -41241 -38049 -36590 -37677 -42662 -26559 -37776 -37207 -32019 -41380 -34941 -26554 -25880 -41911 -40938 -41194 -37933 -37384 -26107 -40367 -41021 -28082 -28707 -40549 -29398 -35696 -41725 -41882 -38352 -39157 -32404 -32478 -30794 -39460 -27603 -39727 -30793 -27298 -41028 -33051 -29648 -40147 -35362 -27516 -40345 -41434 -26388 -37606 -39017 -33463 -24901 -36106 -36358 -32388 -23613 -38953 -40269 -40880 -28911 -38779 -37746 -39216 -25630 -41103 -26369 -32779 -41121 -28134 -29163 -41552 -39500 -41869 -38107 -41105 -39508 -41588 -39234 -39498 -41752 -41793 -27525 -38098 -39020 -39375 -41747 -38740 -37238 -39237 -23839 -24732 -27513 -28899 -35943 -39476 -26900 -28184 -26853 -41748 -26638 -38091 -39728 -39199 -39635 -36032 -39612 -37605 -40332 -39022 -40277 -39034 -37393 -40617 -41238 -25071 -24957 -40984 -28089 -24665 -33460 -32050 -38245 -26766 -28885 -39079 -27380 -26590 -26038 -23842 -27825 -25785 -38014 -33056 -39522 -27509 -40505 -27811 -37779 -39509 -41191 -36101 -20776 -33750 -26719 -37392 -41384 -39617 -38741 -27948 -36745 -28542 -39285 -38778 -40364 -36592 -33154 -41029 -29526 -39233 -32294 -39215 -36581 -38992 -25515 -37810 -26494 -32708 -31306 -37775 -29055 -33436 -37836 -26243 -36582 -29270 -28946 -33459 -38730 -34710 -40258 -28912 -41310 -37258 -39163 -28187 -25639 -38652 -32299 -39773 -36831 -38552 -40613 -32487 -36033 -28358 -40424 -40732 -40107 -32794 -25358 -27460 -29273 -26470 -36830 -37816 -40875 -33595 -27389 -26927 -37806 -40895 -41036 -24307 -38977 -33055 -26824 -27414 -38087 -27632 -27438 -41942 -27683 -22871 -37264 -28945 -27528 -33153 -37237 -26695 -27403 -27508 -28393 -37344 -28526 -34111 -39172 -39504 -32253 -26451 -41945 -36097 -22314 -27400 -23331 -25239 -41308 -38867 -25153 -40384 -40874 -38749 -36397 -39616 -35942 -39078 -27852 -41592 -39008 -36792 -25004 -37602 -25152 -32293 -41382 -25954 -26580 -23536 -42432 -32768 -40733 -40272 -24936 -35873 -29155 -38991 -37826 -23754 -33414 -40664 -27501 -40941 -33373 -27820 -26071 -41904 -24713 -28472 -28626 -37185 -35493 -25740 -37809 -39481 -28702 -41866 -31307 -38342 -26469 -24812 -32763 -32018 -41581 -40271 -27445 -26402 -33376 -41893 -33278 -29236 -28903 -32729 -36395 -40333 -28659 -36516 -29494 -26985 -37218 -40663 -36131 -31862 -28644 -37748 -23553 -35491 -29644 -28446 -38551 -26624 -39127 -28868 -23846 -25949 -33207 -27426 -28935 -28378 -29643 -35496 -29162 -39035 -40425 -37843 -29520 -40946 -39360 -39122 -41589 -31102 -27378 -36499 -28238 -27854 -32951 -33275 -28790 -27954 -33453 -27715 -24315 -28252 -28884 -28154 -26495 -36411 -26639 -26608 -39070 -27566 -33749 -38978 -37834 -36831 -39773 -32299 -38652 -28187 -39163 -37258 -41310 -34710 -38730 -33459 -28946 -29270 -36582 -37836 -33436 -31306 -37775 -29055 -37810 -38992 -36581 -32294 -39233 -36592 -33154 -29526 -41029 -40364 -38778 -39285 -28542 -36745 -38741 -39617 -37392 -26719 -33750 -36101 -41191 -39509 -37779 -27811 -40505 -33056 -39522 -38014 -23842 -26038 -26590 -39079 -28885 -38245 -33460 -28089 -40984 -41238 -40617 -37393 -39034 -40277 -39022 -40332 -37605 -39612 -36032 -39728 -38091 -41748 -27380 -26853 -28184 -26900 -39476 -35943 -41588 -27513 -39237 -37238 -38740 -41747 -39375 -39020 -38098 -27298 -41793 -32050 -39498 -39234 -41752 -39508 -41105 -38107 -29163 -39500 -41552 -28134 -41121 -41103 -39216 -38779 -37746 -28911 -40880 -38953 -32388 -36358 -36106 -37749 -39017 -37606 -26369 -40345 -29648 -40147 -35362 -33051 -30793 -41028 -27603 -39460 -30794 -32478 -39157 -38352 -35696 -28707 -41021 -40107 -37933 -41194 -25880 -34941 -26554 -41380 -37207 -32019 -37776 -26559 -37677 -36590 -38049 -35812 -29349 -25462 -31800 -37265 -25894 -28902 -28786 -40141 -27718 -38331 -37150 -29272 -35755 -36744 -41034 -37804 -37234 -38332 -32767 -29045 -28638 -41903 -27399 -28364 -39613 -39487 -36287 -40940 -40267 -41836 -40982 -32500 -33274 -41794 -28937 -41591 -32252 -41471 -40892 -35756 -27831 -25924 -37210 -29495 -41729 -26095 -25354 -40146 -38356 -37951 -25371 -28924 -40882 -37834 -38978 -33749 -39070 -26639 -36411 -28154 -26495 -28884 -28252 -27715 -33453 -27954 -28790 -33275 -32951 -27854 -28238 -36499 -27378 -31102 -41589 -39122 -39360 -29520 -37843 -40425 -39035 -29162 -29643 -28378 -28935 -27426 -33207 -25949 -28868 -26624 -39127 -38551 -28446 -29644 -35491 -37748 -28644 -31862 -36131 -40663 -37218 -26985 -29494 -36516 -28659 -32729 -40333 -28903 -29236 -41893 -33376 -40271 -27445 -41581 -32018 -24812 -38342 -31307 -41866 -28702 -39481 -37809 -25740 -35493 -37185 -28626 -28472 -41904 -26071 -27820 -33373 -40941 -40664 -33414 -23754 -37826 -27501 -38991 -29155 -35873 -24936 -40272 -40733 -32768 -25954 -26580 -41382 -32293 -37602 -36792 -39008 -27852 -41592 -35942 -39078 -39616 -36397 -38749 -40874 -40384 -38867 -26608 -41308 -25239 -36097 -32253 -39172 -34111 -28526 -27508 -27403 -37237 -33153 -27528 -28945 -37264 -27683 -27438 -38087 -26824 -33055 -41036 -40895 -37806 -26927 -33595 -40875 -37816 -36830 -29273 -27460 -32794 -28132 -40732 -40424 -28358 -36033 -32487 -40613 -38552 -25639 -28912 -26243 -32708 -26494 -25515 -39215 -27948 -41384 -20776 -27509 -27825 -26766 -24665 -25785 -24957 -26638 -24932 -25071 -28899 -24732 -23839 -27525 -41869 -32779 -25630 -40269 -23613 -24901 -33463 -26388 -27516 -39727 -32404 -41882 -41725 -29398 -28082 -40367 -26107 -26863 -29640 -41469 -27461 -28628 -41586 -27441 -29656 -25657 -24653 -25067 -24916 -41838 -37737 -24674 -27566 -21639 -24315 -40946 -35496 -23846 -23553 -33278 -26402 -32763 -26469 -24713 -27400 -25152 -23536 -19548 -25004 -25153 -23331 -22314 -26451 -39504 -28393 -26695 -22871 -27414 -37344 -38977 -24307 -27389 -26470 -25358 -27632 -40258 -36398 -38868 -39488 -37952 -3947 -3623 -39614 -40259 -39729 -29516 -41840 -24891 -11147 -11144 -40355 -15626 -15391 -6976 -13878 -13010 -13636 -37381 -19090 -40278 -9785 -11623 -10001 -33059 -10002 -11621 -18715 -8882 -15386 -17611 -15219 -24834 -14821 -21814 -18328 -16729 -19683 -10000 -17083 -19215 -15643 -22117 -19876 -23865 -23636 -21989 -5589 -14786 -26058 -25311 -20217 -15236 -16339 -6974 -11941 -13954 -9478 -17065 -3692 -14333 -15141 -11728 -33598 -6973 -17969 -14194 -14005 -16797 -23778 -16676 -12850 -13669 -11570 -26936 -19020 -16870 -15995 -13907 -15963 -19017 -22044 -21648 -20370 -21046 -20086 -19931 -11862 -19777 -23730 -21041 -21940 -23883 -18952 -26738 -22984 -19776 -22624 -21824 -22248 -25645 -28451 -25339 -24846 -23013 -18877 -19331 -14307 -26487 -21052 -26480 -26666 -25473 -20394 -26098 -8832 -8751 -14532 -25237 -21047 -15629 -31577 -19688 -14160 -11622 -15159 -13595 -25673 -20667 -11145 -21759 -24209 -21140 -25495 -17046 -23816 -19883 -11115 -21139 -22921 -13092 -20402 -11353 -15384 -19121 -23413 -20835 -12635 -7298 -20705 -21792 -8774 -14943 -11841 -23192 -13899 -40896 -19347 -11684 -21894 -18351 -20083 -25558 -21149 -12544 -24742 -13969 -25913 -25460 -23227 -24768 -15235 -20317 -26378 -28520 -21668 -23686 -15158 -23581 -20771 -14248 -16497 -6278 -28137 -4881 -22653 -12474 -23313 -14128 -20918 -12089 -23051 -18350 -15383 -21533 -26599 -28622 -10516 -18570 -23124 -21056 -25331 -21813 -25937 -24808 -23528 -22912 -22930 -26578 -20872 -20401 -25626 -23598 -23864 -20315 -26761 -21392 -22096 -25922 -24748 -25492 -25546 -26352 -28629 -23200 -23571 -14659 -21893 -23765 -19765 -32387 -24880 -22028 -26724 -23764 -19772 -33596 -16101 -22253 -25312 -24769 -24786 -14133 -23651 -21222 -26871 -10855 -20946 -6796 -23649 -23176 -30323 -25585 -25134 -4297 -14077 -21726 -26720 -25404 -23915 -38692 -23461 -19919 -22931 -20945 -20193 -23943 -23175 -19621 -28463 -10975 -27830 -22087 -8697 -25010 -20762 -13269 -23016 -19508 -13083 -23948 -11964 -29230 -28234 -22041 -20558 -23199 -10143 -22563 -26643 -7815 -23781 -25491 -28417 -27444 -21906 -16597 -21803 -23305 -23723 -23537 -22116 -21653 -27499 -38690 -25516 -18316 -38695 -20777 -29642 -10953 -20837 -23185 -10981 -13643 -24714 -19217 -38072 -32373 -10061 -20107 -15581 -25049 -23522 -13782 -24652 -14328 -14951 -23171 -26381 -10024 -28218 -15824 -22966 -12994 -20801 -20523 -4068 -38696 -24819 -7648 -14234 -20570 -21939 -19874 -23877 -20706 -15561 -12677 -16482 -26246 -16274 -21227 -40369 -26736 -13035 -23314 -21765 -23779 -20410 -8476 -16276 -5709 -25048 -16650 -26056 -22880 -25666 -26108 -18951 -15642 -23639 -19687 -8620 -14421 -22205 -25086 -21762 -22723 -22175 -22266 -20040 -15385 -20873 -15993 -13069 -27813 -15237 -23731 -7544 -19484 -23768 -16649 -22115 -6437 -27714 -11153 -12065 -8838 -34264 -23319 -5775 -15152 -26298 -15308 -8808 -20168 -27807 -21922 -7466 -13984 -25896 -14948 -17705 -15826 -23717 -23775 -21703 -7250 -17561 -13652 -10557 -26089 -17706 -8330 -13651 -13056 -21964 -16275 -11484 -7578 -21055 -12447 -8132 -22724 -19397 -9047 -14985 -23118 -25897 -24897 -34265 -9852 -20502 -21019 -12545 -12996 -9862 -28119 -18387 -13983 -25318 -7790 -22272 -23270 -23451 -26382 -9009 -15873 -19076 -6052 -11676 -12967 -13431 -28256 -22316 -23330 -21129 -14158 -29014 -28466 -25900 -12855 -21904 -22907 -39298 -25638 -39297 -16250 -23656 -17873 -26460 -23880 -14134 -26397 -22245 -14365 -22027 -14195 -858 -18446 -2639 -40924 -25522 -2608 -26373 -13630 -12351 -15825 -15560 -3691 -39299 -20800 -27775 -19550 -17939 -22883 -11568 -23615 -20662 -19400 -18578 -20799 -39296 -20266 -19913 -16214 -25353 -20041 -19073 -7324 -38691 -28240 -26101 -33511 -7229 -24208 -23429 -27951 -28704 -18718 -38699 -20926 -30000 -33512 -21536 -23415 -14117 -11567 -29233 -12851 -25000 -14394 -25021 -21925 -14086 -19094 -38701 -22213 -29106 -39998 -15630 -14115 -23524 -17875 -11571 -12471 -13900 -28491 -13753 -20122 -16732 -18331 -33513 -15139 -11569 -38697 -19686 -40871 -3432 -40989 -11256 -3428 -29000 -14193 -25001 -33510 -20962 -39999 -7318 -38705 -33509 -33465 -41548 -38704 -38702 -29676 -4478 -24931 -40990 -38700 -40872 -37345 -38693 -25611 -41106 -17972 -15487 -20110 -22910 -41547 -15693 -18634 -21135 -38694 -26745 -23111 -32479 -36359 -39376 -37807 -38698 -32375 -41546 -41122 -24820 -41543 -38703 -3292 -41545 -41544 -2222 -3291 -2221 -3290 -2220 -2655 -3289 -2219 -3288 -2654 -2218 -3287 -2653 -2217 -3286 -3285 -2216 -3284 -2215 -2652 -2207 -2651 -2650 -2649 -2645 -2868 -2867 -2866 -2865 -2864 -2863 -2862 -40346 -38980 -37751 -9998 -22694 -26394 -20693 -19344 -23448 -21111 -14783 -23680 -12309 -33108 -25315 -22836 -20643 -14867 -23327 -13177 -13974 -12897 -11343 -8513 -14725 -9416 -33458 -10294 -18922 -11440 -33111 -28094 -14548 -25045 -19330 -16199 -21016 -20659 -14940 -17872 -9503 -11561 -18575 -20473 -12120 -28139 -22210 -17874 -10365 -11273 -12564 -21038 -22981 -14377 -16526 -24435 -26939 -28634 -13554 -20367 -23010 -26477 -40000 -26895 -11708 -31395 -7392 -10792 -16769 -11648 -10987 -19710 -8357 -20263 -25642 -10159 -12618 -24438 -22963 -15181 -25050 -21821 -19928 -13129 -20836 -20696 -40987 -24798 -17125 -27554 -21132 -15057 -28194 -34779 -23949 -11581 -37950 -27780 -14318 -26892 -23683 -22557 -10489 -19596 -14899 -23720 -20953 -7547 -10778 -4376 -22839 -22269 -15678 -2717 -15677 -19483 -22796 -4902 -22911 -4353 -5587 -4250 -22927 -8746 -8747 -23670 -15994 -39689 -8366 -39688 -3029 -13631 -14050 -23741 -12472 -8585 -24313 -3431 -18631 -1317 -25126 -15144 -2969 -20499 -13624 -15946 -12003 -23168 -22112 -15574 -11669 -18443 -20391 -23426 -23267 -23653 -18384 -25110 -5588 -21641 -21702 -24894 -33519 -38101 -20923 -26372 -38104 -16667 -23108 -15484 -23322 -14114 -21789 -500 -450 -400 -350 -300 -250 -200 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -500 -450 -400 -350 -300 -250 -200 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -500 -450 -400 -350 -300 -250 -200 -07 -08 -09 -10 -11 -12 -13 -14 -15 -16 -17 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -150 -100 -50 -0 -50 -100 -150 -200 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -500 -400 -300 -200 -100 -0 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -300 -250 -200 -150 -100 -50 -09 -10 -11 -12 -13 -14 -15 -16 -17 -700 -600 -500 -400 -3 -201 -14 -1 -201 -5 -201 -6 -201 -7 -500 -450 -400 -350 -300 -250 -200 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -150 -100 -50 -0 -50 -100 -150 -100 -50 -0 -50 -100 -150 -3 -201 -014 -201 -5 -201 -6 -201 -7 -500 -450 -400 -350 -300 -250 -200 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -500 -450 -400 -350 -300 -250 -200 -09 -10 -11 -12 -13 -14 -15 -16 -17 -1 -1 -1 -1 -1 -1 -1 -1 -500 -450 -400 -350 -300 -250 -200 -07 -08 -09 -10 -11 -12 -13 -14 -15 -16 -17 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -500 -450 -400 -350 -300 -250 -200 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -500 -450 -400 -350 -300 -250 -200 -09 -10 -11 -12 -13 -14 -15 -16 -17 -1 -1 -1 -1 -1 -1 -1 -1 -500 -450 -400 -350 -300 -250 -200 -7 -8 -9 -0 -1 -2 -3 -4 -5 -6 -7 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -634 -10637 -33000 -36395 -36828 -37158 -37256 -37384 -37763 -37948 -39199 -39635 -40547 diff --git a/firmware/app/libs/libpredict/tests/data/large-tle-collection.tle b/firmware/app/libs/libpredict/tests/data/large-tle-collection.tle deleted file mode 100644 index 1e1dfdad..00000000 --- a/firmware/app/libs/libpredict/tests/data/large-tle-collection.tle +++ /dev/null @@ -1,5667 +0,0 @@ -OSCAR 7 (AO-7) -1 07530U 74089B 17117.87990456 -.00000052 00000-0 -46847-4 0 9990 -2 07530 101.6258 87.5656 0012474 60.6439 353.6072 12.53626606942326 -UOSAT 2 (UO-11) -1 14781U 84021B 17117.89719176 .00000160 00000-0 25980-4 0 9996 -2 14781 97.7030 165.4494 0008735 15.0174 345.1298 14.82885799761897 -LUSAT (LO-19) -1 20442U 90005G 17117.86612107 .00000023 00000-0 24418-4 0 9992 -2 20442 98.5731 54.8995 0010762 299.8881 60.1233 14.32857185424355 -EYESAT-1 (AO-27) -1 22825U 93061C 17117.88429787 .00000000 00000-0 17814-4 0 9993 -2 22825 98.8074 82.8612 0009397 115.0229 245.1929 14.29993727229943 -ITAMSAT (IO-26) -1 22826U 93061D 17117.92689895 .00000013 00000-0 22355-4 0 9997 -2 22826 98.8017 82.9923 0010003 106.5428 253.6854 14.30322185230140 -RADIO ROSTO (RS-15) -1 23439U 94085A 17117.91414752 -.00000045 00000-0 -68834-4 0 9991 -2 23439 64.8158 300.4808 0167268 254.4146 217.8537 11.27565578919744 -JAS-2 (FO-29) -1 24278U 96046B 17117.95625726 -.00000009 00000-0 24181-4 0 9997 -2 24278 98.5711 7.8835 0351331 107.4956 256.4898 13.53075699 21839 -TECHSAT 1B (GO-32) -1 25397U 98043D 17117.87210180 -.00000007 00000-0 15920-4 0 9993 -2 25397 98.6063 61.2802 0002118 118.5780 241.5612 14.23620396976415 -ISS (ZARYA) -1 25544U 98067A 17117.89041289 -.00158687 00000-0 -24621-2 0 9992 -2 25544 51.6432 289.0003 0006055 101.4704 344.3366 15.53834686 53936 -PCSAT (NO-44) -1 26931U 01043C 17117.69653303 .00000008 00000-0 34847-4 0 9999 -2 26931 67.0516 221.4674 0007891 272.9385 87.0813 14.30457240813127 -SAUDISAT 1C (SO-50) -1 27607U 02058C 17117.90978278 .00000113 00000-0 36998-4 0 9998 -2 27607 64.5550 279.1976 0031890 121.8188 238.6026 14.75315015771565 -CUTE-1 (CO-55) -1 27844U 03031E 17117.90754108 .00000072 00000-0 52093-4 0 9995 -2 27844 98.6909 127.6436 0010705 128.6749 231.5388 14.22031562717132 -CUBESAT XI-IV (CO-57) -1 27848U 03031J 17117.96407819 .00000055 00000-0 44753-4 0 9994 -2 27848 98.7002 127.9366 0010494 136.9803 223.2196 14.21646872717033 -MOZHAYETS 4 (RS-22) -1 27939U 03042A 17117.96976086 .00000169 00000-0 38813-4 0 9990 -2 27939 97.9314 264.3514 0013610 31.3840 79.6709 14.66553420725817 -CUBESAT XI-V (CO-58) -1 28895U 05043F 17117.71231096 .00000229 00000-0 53034-4 0 9992 -2 28895 97.8592 282.3471 0015617 306.1771 53.7987 14.63379376613105 -CUTE-1.7+APD II (CO-65) -1 32785U 08021C 17117.46775361 .00000485 00000-0 58694-4 0 9995 -2 32785 97.5708 144.0461 0012548 343.4154 16.6651 14.87856727487286 -DELFI-C3 (DO-64) -1 32789U 08021G 17117.88668598 .00001863 00000-0 13651-3 0 9992 -2 32789 97.5640 177.1713 0010797 271.7767 88.2223 15.04710937489205 -SEEDS II (CO-66) -1 32791U 08021J 17117.14530473 .00000735 00000-0 81283-4 0 9998 -2 32791 97.5682 147.9437 0012491 329.0627 30.9854 14.90175823487549 -YUBILEINY (RS-30) -1 32953U 08025A 17117.89986168 .00000009 00000-0 -53921-5 0 9994 -2 32953 82.5005 270.9211 0019193 38.1161 322.1273 12.43076184405172 -PRISM (HITOMI) -1 33493U 09002B 17117.78617899 .00000962 00000-0 92327-4 0 9999 -2 33493 98.1757 358.0770 0013991 249.4498 110.5225 14.95596719448248 -KKS-1 (KISEKI) -1 33499U 09002H 17117.95150143 .00000201 00000-0 37807-4 0 9996 -2 33499 98.3266 281.8788 0009492 166.5654 193.5808 14.75170920443532 -SWISSCUBE -1 35932U 09051B 17117.90072421 .00000217 00000-0 60206-4 0 9997 -2 35932 98.4876 255.5273 0008540 52.9045 307.2932 14.55994565402967 -BEESAT -1 35933U 09051C 17117.89121317 .00000202 00000-0 56737-4 0 9993 -2 35933 98.4912 256.7974 0006920 66.2096 293.9826 14.56116366403021 -ITUPSAT 1 -1 35935U 09051E 17117.37022521 .00000216 00000-0 60815-4 0 9992 -2 35935 98.5022 256.5202 0009149 59.6036 300.6064 14.55311737402841 -XIWANG-1 (HOPE-1) -1 36122U 09072B 17117.94859490 -.00000020 00000-0 59409-4 0 9991 -2 36122 100.1052 146.5018 0007371 356.9494 3.1574 13.16339298353914 -TISAT 1 -1 36799U 10035E 17117.85717713 .00000719 00000-0 79914-4 0 9990 -2 36799 98.0544 239.5878 0013696 129.0460 231.1978 14.90338319368082 -JUGNU -1 37839U 11058B 17117.15774817 .00000337 00000-0 37850-4 0 9992 -2 37839 19.9621 39.8895 0018776 341.2691 159.5079 14.12580305286367 -SRMSAT -1 37841U 11058D 17117.97599463 .00000320 00000-0 30702-4 0 9998 -2 37841 19.9720 75.5771 0011683 249.1149 146.8476 14.10572141286091 -M-CUBED & EXP-1 PRIME -1 37855U 11061F 17117.86616987 .00001836 00000-0 10416-3 0 9998 -2 37855 101.7208 323.7260 0181304 230.0931 128.4223 15.02845377298763 -HORYU 2 -1 38340U 12025D 17117.96665375 .00000359 00000-0 61031-4 0 9994 -2 38340 98.3767 120.1205 0013047 91.6000 268.6703 14.75308303255471 -STRAND-1 -1 39090U 13009E 17117.60871736 .00000054 00000-0 34382-4 0 9992 -2 39090 98.5589 323.5096 0010422 90.1932 270.0448 14.34961027218225 -SOMP -1 39134U 13015E 17117.94078594 .00002141 00000-0 11437-3 0 9990 -2 39134 64.8700 28.6216 0033578 281.8215 77.9146 15.17637569221475 -BEESAT-2 -1 39136U 13015G 17117.94226247 .00001784 00000-0 10461-3 0 9990 -2 39136 64.8727 38.6136 0030435 290.8594 68.9272 15.14953386221270 -CUBEBUG-1 (CAPITAN BETO) -1 39153U 13018D 17117.72940361 .00000402 00000-0 59942-4 0 9992 -2 39153 97.9842 210.2990 0016467 207.5450 152.4891 14.80151691216120 -ZACUBE-1 (TSHEPISOSAT) -1 39417U 13066B 17117.81523503 .00000433 00000-0 61176-4 0 9999 -2 39417 97.6350 162.4859 0060907 75.2758 285.5194 14.80678012185327 -TRITON-1 -1 39427U 13066M 17117.93653226 .00000303 00000-0 56380-4 0 9996 -2 39427 97.6408 136.6557 0115286 149.0984 211.7074 14.67429504183480 -GOMX 1 -1 39430U 13066Q 17117.96532357 .00000241 00000-0 52927-4 0 9998 -2 39430 97.6650 120.8338 0151400 201.1190 158.3718 14.58839585182420 -HUMSAT-D -1 39433U 13066T 17117.73383578 .00000929 00000-0 97854-4 0 9996 -2 39433 97.6565 182.3364 0031789 27.6407 332.6493 14.91369684186492 -EAGLE 2 -1 39436U 13066W 17117.50964786 .00031487 00000-0 92666-3 0 9998 -2 39436 97.7059 221.0985 0010794 256.5402 103.4638 15.34959271187722 -CUBEBUG-2 (LO-74) -1 39440U 13066AA 17117.65278385 .00000417 00000-0 65162-4 0 9993 -2 39440 97.6338 151.9083 0082396 104.1730 256.8652 14.75418776184646 -FUNCUBE-1 (AO-73) -1 39444U 13066AE 17117.68457815 .00000553 00000-0 74975-4 0 9990 -2 39444 97.6365 163.3507 0060055 72.7455 288.0319 14.81402603184130 -UWE-3 -1 39446U 13066AG 17117.91318022 .00000415 00000-0 61896-4 0 9999 -2 39446 97.6332 157.0975 0072103 89.3589 271.5884 14.77951202183181 -SPROUT -1 39770U 14029E 17117.87019669 .00002119 00000-0 24761-3 0 9991 -2 39770 97.8691 217.7443 0010495 126.9486 233.2687 14.86150742158666 -UNISAT-6 -1 40012U 14033C 17117.75210351 .00000376 00000-0 63692-4 0 9995 -2 40012 97.8638 3.0495 0060130 96.0717 264.7348 14.73588042153512 -DUCHIFAT-1 -1 40021U 14033M 17117.86016812 .00000711 00000-0 79901-4 0 9996 -2 40021 97.9209 30.9481 0014538 104.8818 255.4010 14.89829837155109 -FUNCUBE-3 (EO-79) -1 40025U 14033R 17117.79236067 .00000521 00000-0 62282-4 0 9991 -2 40025 97.9154 28.9615 0013972 108.4459 251.8277 14.88377266154994 -CHUBUSAT-1 -1 40300U 14070C 17117.88963038 .00002115 00000-0 98806-4 0 9995 -2 40300 97.3972 198.7032 0018931 279.2925 185.8441 15.20757975137149 -NUDT-PHONESAT -1 40900U 15049B 17117.91814044 .00003340 00000-0 16184-3 0 9993 -2 40900 97.4436 126.5623 0015463 46.8315 313.4209 15.19129211 88829 -ZDPS 2A -1 40901U 15049C 17117.94442522 .00001759 00000-0 94580-4 0 9994 -2 40901 97.4591 126.1041 0015299 45.7158 314.5327 15.16097712 88721 -ZDPS 2B -1 40902U 15049D 17117.93449968 .00001683 00000-0 91030-4 0 9998 -2 40902 97.4460 124.8698 0015281 43.1224 317.1202 15.15937437 88713 -XW-2A -1 40903U 15049E 17117.91372473 .00003022 00000-0 81462-4 0 9990 -2 40903 97.4248 142.9952 0016852 87.3516 272.9658 15.38491533 89914 -KAITUO 1A -1 40904U 15049F 17117.89376667 .00001584 00000-0 89473-4 0 9998 -2 40904 97.4541 124.5688 0016241 41.6341 51.7806 15.14444017 88639 -2015-049G -1 40905U 15049G 17117.95361516 .00000874 00000-0 52340-4 0 9997 -2 40905 97.4514 123.4588 0016887 32.4997 327.7270 15.13475619 88607 -XW-2C -1 40906U 15049H 17117.96087854 .00001331 00000-0 75777-4 0 9997 -2 40906 97.4556 124.4578 0016258 34.1831 326.0444 15.14438783 88632 -XW-2D -1 40907U 15049J 17117.94758613 .00001403 00000-0 79505-4 0 9997 -2 40907 97.4525 124.2201 0015576 32.7551 327.4644 15.14535089 88639 -LILACSAT 2 -1 40908U 15049K 17117.96104249 .00000805 00000-0 49038-4 0 9993 -2 40908 97.4627 124.0557 0017021 29.9633 330.2569 15.13059317 88576 -XW-2F -1 40910U 15049M 17117.91220604 .00001866 00000-0 10214-3 0 9996 -2 40910 97.4542 124.7899 0016359 30.9105 329.3087 15.15371034 88669 -XW-2B -1 40911U 15049N 17117.95246829 .00001385 00000-0 78596-4 0 9992 -2 40911 97.4568 124.5752 0015478 33.1023 327.1175 15.14499759 88533 -KAITUO 1B -1 40912U 15049P 17117.77523646 .00003449 00000-0 17512-3 0 9991 -2 40912 97.4508 126.3496 0016474 23.9054 61.6686 15.17457399 88647 -TIANWANG 1C (TW-1C) -1 40926U 15051B 17117.85064436 .00014345 00000-0 33754-3 0 9998 -2 40926 97.2349 157.8130 0011533 0.9630 83.4861 15.42000022 89163 -TIANWANG 1B (TW-1B) -1 40927U 15051C 17117.89255963 .00013750 00000-0 33549-3 0 9991 -2 40927 97.2436 157.8915 0011894 10.5538 114.8392 15.40911759 89126 -TIANWANG 1A (TW-1A) -1 40928U 15051D 17117.79212189 .00007759 00000-0 22472-3 0 9999 -2 40928 97.2321 154.5108 0013659 27.3955 62.4426 15.35755461 88965 -LAPAN-A2 (IO-86) -1 40931U 15052B 17117.31416037 .00000801 00000-0 22711-4 0 9998 -2 40931 6.0045 235.4936 0012922 247.9790 111.9288 14.76525283 85433 -LQSAT -1 40958U 15057A 17117.84292190 .00000139 00000-0 29447-4 0 9999 -2 40958 97.9798 194.0335 0017066 224.8864 135.0955 14.72959174 83701 -CHUBUSAT-2 -1 41338U 16012B 17117.30321636 .00000724 00000-0 50364-4 0 9995 -2 41338 31.0035 75.4177 0014021 275.5173 84.3863 14.99709735 65346 -CHUBUSAT-3 -1 41339U 16012C 17117.30498422 .00000832 00000-0 58596-4 0 9999 -2 41339 31.0105 74.6336 0013967 281.5343 78.3724 14.99918537 65326 -OUFTI-1 -1 41458U 16025C 17117.98367530 .00005415 00000-0 29139-3 0 9996 -2 41458 98.1883 152.6763 0175785 97.4196 264.7039 15.02943028 55049 -E-ST@R-II -1 41459U 16025D 17117.86635530 .00003845 00000-0 20784-3 0 9994 -2 41459 98.1909 152.5211 0177429 97.9470 264.1930 15.02804445 55013 -AAUSAT 4 -1 41460U 16025E 17117.89227298 .00006814 00000-0 36574-3 0 9990 -2 41460 98.1851 152.6203 0170139 96.5723 265.4824 15.03625334 55037 -NUSAT 1 (LO-87) -1 41557U 16033B 17117.88196912 .00002292 00000-0 89453-4 0 9994 -2 41557 97.4647 197.4002 0014501 178.4476 181.6810 15.26867048 50751 -BEESAT-4 -1 41619U 16040W 17117.91761869 .00002446 00000-0 11478-3 0 9996 -2 41619 97.4663 180.7833 0010732 239.2746 120.7433 15.20558082 34951 -PRATHAM -1 41783U 16059A 17117.74913516 .00000116 00000-0 32138-4 0 9996 -2 41783 98.1716 179.6310 0032679 320.7602 39.1231 14.62826302 31222 -ALSAT 1N -1 41789U 16059G 17117.84765939 .00000194 00000-0 46161-4 0 9994 -2 41789 98.1715 180.1324 0027400 315.4582 44.4404 14.64033880 31249 -NAYIF-1 (EO-88) -1 42017U 17008BX 17117.90560704 .00002569 00000-0 11298-3 0 9994 -2 42017 97.4994 179.4522 0007725 48.9362 311.2540 15.22775768 10839 -NOAA 15 -1 25338U 98030A 17117.96894994 .00000036 00000-0 34234-4 0 9995 -2 25338 98.7838 128.7757 0010432 359.1807 0.9354 14.25788655985583 -NOAA 18 -1 28654U 05018A 17117.96799378 .00000017 00000-0 34642-4 0 9995 -2 28654 99.1861 138.9463 0013859 208.7422 151.2987 14.12334472615079 -METOP-A -1 29499U 06044A 17117.90671132 .00000021 00000-0 29415-4 0 9991 -2 29499 98.6830 178.3560 0000944 44.3194 75.3974 14.21497227545997 -NOAA 19 -1 33591U 09005A 17117.89348672 .00000104 00000-0 81534-4 0 9999 -2 33591 99.0880 84.0177 0014922 56.0394 304.2193 14.12174414423290 -METOP-B -1 38771U 12049A 17117.94580154 .00000028 00000-0 32544-4 0 9997 -2 38771 98.6834 178.9436 0001717 64.0338 61.1552 14.21497770239145 -SARAL -1 39086U 13009A 17117.93401277 -.00000001 00000-0 16030-4 0 9995 -2 39086 98.5410 306.3211 0002015 65.0913 295.0480 14.32000020217913 -BEIDOU G1 -1 36287U 10001A 17117.80604922 -.00000298 00000-0 00000-0 0 9996 -2 36287 1.4997 356.9041 0001858 169.8506 119.4197 1.00275049 26708 -BEIDOU G3 -1 36590U 10024A 17117.67045698 -.00000368 00000-0 00000-0 0 9990 -2 36590 1.3180 18.5970 0006088 326.0782 222.9550 1.00277245 25312 -BEIDOU IGSO 1 -1 36828U 10036A 17117.82823109 -.00000126 00000-0 10000-3 0 9991 -2 36828 54.1812 193.9871 0057103 226.6544 210.7072 1.00295177 24752 -BEIDOU G4 -1 37210U 10057A 17117.76246394 -.00000124 00000-0 00000-0 0 9992 -2 37210 0.9656 54.3339 0003841 172.9399 63.1553 1.00271291 23825 -BEIDOU IGSO 2 -1 37256U 10068A 17117.98338259 -.00000220 00000-0 10000-3 0 9991 -2 37256 53.1878 311.8413 0050097 204.9840 169.0473 1.00248763 23349 -BEIDOU IGSO 3 -1 37384U 11013A 17117.78745964 -.00000184 00000-0 10000-3 0 9996 -2 37384 57.7663 73.4599 0027726 212.8974 334.3089 1.00276456 22213 -BEIDOU IGSO 4 -1 37763U 11038A 17117.85370544 -.00000070 00000-0 10000-3 0 9994 -2 37763 54.4890 196.3398 0045944 214.6825 206.9405 1.00285276 21180 -BEIDOU IGSO 5 -1 37948U 11073A 17117.97007340 -.00000159 00000-0 10000-3 0 9990 -2 37948 53.2745 311.3132 0043427 203.0391 145.7787 1.00265390 19938 -BEIDOU G5 -1 38091U 12008A 17117.92856885 .00000044 00000-0 00000-0 0 9998 -2 38091 2.1332 55.6291 0002532 232.8854 320.5169 1.00269735 19016 -BEIDOU M3 -1 38250U 12018A 17117.82953743 -.00000047 00000-0 10000-3 0 9994 -2 38250 56.2128 55.8246 0022971 228.9545 8.8313 1.86234623 34139 -BEIDOU M4 -1 38251U 12018B 17117.76416265 -.00000048 00000-0 10000-3 0 9992 -2 38251 56.1498 55.2622 0024941 221.9814 20.2563 1.86233973 34134 -BEIDOU M6 -1 38775U 12050B 17117.71336973 .00000055 00000-0 00000-0 0 9994 -2 38775 54.8397 174.9884 0021815 233.4826 170.2548 1.86233137 31515 -BEIDOU G6 -1 38953U 12059A 17116.84216362 -.00000186 00000-0 10000-3 0 9993 -2 38953 1.5498 79.9483 0003323 181.2375 341.0710 1.00273276 16578 -BEIDOU I1-S -1 40549U 15019A 17117.96584828 -.00000147 00000-0 00000-0 0 9998 -2 40549 54.4435 334.3431 0039420 181.7011 138.7710 1.00252691 7614 -BEIDOU-3 M1 -1 40748U 15037A 17117.65360368 -.00000049 00000-0 00000-0 0 9997 -2 40748 55.4183 55.2630 0008656 284.1963 153.3065 1.86237666 11965 -BEIDOU-3 M2 -1 40749U 15037B 17117.59359133 -.00000049 00000-0 00000-0 0 9999 -2 40749 55.4210 55.2510 0009611 291.7162 243.8412 1.86237217 11953 -BEIDOU I2-S -1 40938U 15053A 17117.98638063 -.00000149 00000-0 00000-0 0 9993 -2 40938 54.2759 297.2377 0048024 171.7126 197.1132 1.00262704 5908 -BEIDOU M3-S -1 41315U 16006A 17117.84555254 .00000054 00000-0 00000-0 0 9991 -2 41315 55.0239 175.2058 0003073 292.3167 67.7422 1.86235583 8457 -BEIDOU IGSO 6 -1 41434U 16021A 17117.96834563 -.00000144 00000-0 10000-3 0 9991 -2 41434 55.4786 72.9503 0027297 185.9302 41.3972 1.00281076 4021 -BEIDOU G7 -1 41586U 16037A 17116.87553415 -.00000262 00000-0 00000-0 0 9996 -2 41586 1.3222 315.7013 0001712 293.1868 65.8440 1.00267877 3327 -EYESAT-1 (AO-27) -1 22825U 93061C 17117.88429787 .00000000 00000-0 17814-4 0 9993 -2 22825 98.8074 82.8612 0009397 115.0229 245.1929 14.29993727229943 -CUTE-1 (CO-55) -1 27844U 03031E 17117.90754108 .00000072 00000-0 52093-4 0 9995 -2 27844 98.6909 127.6436 0010705 128.6749 231.5388 14.22031562717132 -CUBESAT XI-IV (CO-57) -1 27848U 03031J 17117.96407819 .00000055 00000-0 44753-4 0 9994 -2 27848 98.7002 127.9366 0010494 136.9803 223.2196 14.21646872717033 -CUBESAT XI 5 -1 28895U 05043F 17117.71231096 .00000229 00000-0 53034-4 0 9992 -2 28895 97.8592 282.3471 0015617 306.1771 53.7987 14.63379376613105 -CUTE-1.7+APD II (CO-65) -1 32785U 08021C 17117.46775361 .00000485 00000-0 58694-4 0 9995 -2 32785 97.5708 144.0461 0012548 343.4154 16.6651 14.87856727487286 -COMPASS-1 -1 32787U 08021E 17117.86927688 .00000570 00000-0 60703-4 0 9991 -2 32787 97.5648 152.9857 0011262 311.2448 48.7801 14.92538943487993 -AAUSAT-II -1 32788U 08021F 17117.66143033 .00001030 00000-0 10220-3 0 9994 -2 32788 97.5640 155.5383 0010514 304.0696 55.9526 14.93807108488137 -DELFI-C3 (DO-64) -1 32789U 08021G 17117.88668598 .00001863 00000-0 13651-3 0 9992 -2 32789 97.5640 177.1713 0010797 271.7767 88.2223 15.04710937489205 -CANX-2 -1 32790U 08021H 17117.30372539 .00000430 00000-0 52995-4 0 9992 -2 32790 97.5684 142.2994 0013270 345.1822 14.9004 14.87587181487198 -SEEDS II (CO-66) -1 32791U 08021J 17117.14530473 .00000735 00000-0 81283-4 0 9998 -2 32791 97.5682 147.9437 0012491 329.0627 30.9854 14.90175823487549 -SWISSCUBE -1 35932U 09051B 17117.90072421 .00000217 00000-0 60206-4 0 9997 -2 35932 98.4876 255.5273 0008540 52.9045 307.2932 14.55994565402967 -BEESAT -1 35933U 09051C 17117.89121317 .00000202 00000-0 56737-4 0 9993 -2 35933 98.4912 256.7974 0006920 66.2096 293.9826 14.56116366403021 -ITUPSAT 1 -1 35935U 09051E 17117.37022521 .00000216 00000-0 60815-4 0 9992 -2 35935 98.5022 256.5202 0009149 59.6036 300.6064 14.55311737402841 -TISAT 1 -1 36799U 10035E 17117.85717713 .00000719 00000-0 79914-4 0 9990 -2 36799 98.0544 239.5878 0013696 129.0460 231.1978 14.90338319368082 -M-CUBED & EXP-1 PRIME -1 37855U 11061F 17117.86616987 .00001836 00000-0 10416-3 0 9998 -2 37855 101.7208 323.7260 0181304 230.0931 128.4223 15.02845377298763 -HORYU 2 -1 38340U 12025D 17117.96665375 .00000359 00000-0 61031-4 0 9994 -2 38340 98.3767 120.1205 0013047 91.6000 268.6703 14.75308303255471 -STRAND-1 -1 39090U 13009E 17117.60871736 .00000054 00000-0 34382-4 0 9992 -2 39090 98.5589 323.5096 0010422 90.1932 270.0448 14.34961027218225 -BRITE-AUSTRIA -1 39091U 13009F 17117.62510302 .00000042 00000-0 30290-4 0 9995 -2 39091 98.5550 322.9300 0011714 97.2957 262.9560 14.35023693218230 -UNIBRITE -1 39092U 13009G 17117.82923316 .00000036 00000-0 28027-4 0 9999 -2 39092 98.5559 322.8283 0010599 90.7291 269.5109 14.34898699218246 -AIST-2 -1 39133U 13015D 17117.90832486 .00000407 00000-0 41495-4 0 9994 -2 39133 64.8730 84.4464 0035503 290.9454 68.7868 15.04251051220346 -SOMP -1 39134U 13015E 17117.94078594 .00002141 00000-0 11437-3 0 9990 -2 39134 64.8700 28.6216 0033578 281.8215 77.9146 15.17637569221475 -BEESAT-2 -1 39136U 13015G 17117.94226247 .00001784 00000-0 10461-3 0 9990 -2 39136 64.8727 38.6136 0030435 290.8594 68.9272 15.14953386221270 -NEE-01 PEGASUS -1 39151U 13018B 17117.72369487 .00000343 00000-0 52608-4 0 9990 -2 39151 97.9822 209.5653 0016520 209.2440 150.7849 14.79691798216074 -CUBEBUG-1 (CAPITAN BETO) -1 39153U 13018D 17117.72940361 .00000402 00000-0 59942-4 0 9992 -2 39153 97.9842 210.2990 0016467 207.5450 152.4891 14.80151691216120 -ESTCUBE 1 -1 39161U 13021C 17117.75687536 .00000413 00000-0 73954-4 0 9991 -2 39161 98.0273 204.4157 0008139 310.6627 49.3863 14.71873578213336 -POPACS 1 -1 39268U 13055D 17117.86659317 .00011642 00000-0 33600-3 0 9993 -2 39268 81.0060 60.6885 0653941 7.2901 353.7232 14.30412124184993 -POPACS 2 -1 39269U 13055E 17117.88692097 .00006184 00000-0 18139-3 0 9993 -2 39269 81.0175 74.5294 0703470 43.5056 321.9451 14.19529178182944 -POPACS 3 -1 39270U 13055F 17117.91644595 .00004008 00000-0 12517-3 0 9996 -2 39270 81.0188 82.0336 0727778 66.5613 301.0340 14.12906983162975 -FIREFLY -1 39404U 13064AA 17117.83069401 .00041923 00000-0 30469-3 0 9996 -2 39404 40.4999 260.6134 0005888 32.0348 328.0835 15.72497878193323 -ZACUBE-1 (TSHEPISOSAT) -1 39417U 13066B 17117.81523503 .00000433 00000-0 61176-4 0 9999 -2 39417 97.6350 162.4859 0060907 75.2758 285.5194 14.80678012185327 -WNISAT-1 -1 39423U 13066H 17117.85627544 .00000206 00000-0 51019-4 0 9993 -2 39423 97.6798 110.4040 0174491 235.3346 123.1299 14.52829577181929 -TRITON-1 -1 39427U 13066M 17117.93653226 .00000303 00000-0 56380-4 0 9996 -2 39427 97.6408 136.6557 0115286 149.0984 211.7074 14.67429504183480 -GOMX 1 -1 39430U 13066Q 17117.96532357 .00000241 00000-0 52927-4 0 9998 -2 39430 97.6650 120.8338 0151400 201.1190 158.3718 14.58839585182420 -BRITE-PL -1 39431U 13066R 17117.90966782 .00000044 00000-0 20181-4 0 9994 -2 39431 97.7025 100.1380 0201229 271.3858 86.4293 14.46831878180983 -HUMSAT-D -1 39433U 13066T 17117.73383578 .00000929 00000-0 97854-4 0 9996 -2 39433 97.6565 182.3364 0031789 27.6407 332.6493 14.91369684186492 -EAGLE 2 -1 39436U 13066W 17117.50964786 .00031487 00000-0 92666-3 0 9998 -2 39436 97.7059 221.0985 0010794 256.5402 103.4638 15.34959271187722 -CUBEBUG-2 (LO-74) -1 39440U 13066AA 17117.65278385 .00000417 00000-0 65162-4 0 9993 -2 39440 97.6338 151.9083 0082396 104.1730 256.8652 14.75418776184646 -NEE-02 KRYSAOR -1 39441U 13066AB 17117.63177710 .00000303 00000-0 50066-4 0 9993 -2 39441 97.6318 150.6728 0083720 107.4779 253.5602 14.74594071183378 -FUNCUBE-1 (AO-73) -1 39444U 13066AE 17117.68457815 .00000553 00000-0 74975-4 0 9990 -2 39444 97.6365 163.3507 0060055 72.7455 288.0319 14.81402603184130 -UWE-3 -1 39446U 13066AG 17117.91318022 .00000415 00000-0 61896-4 0 9999 -2 39446 97.6332 157.0975 0072103 89.3589 271.5884 14.77951202183181 -BRITE-TORONTO -1 40020U 14033L 17117.88279069 .00000123 00000-0 29446-4 0 9998 -2 40020 97.8435 350.9017 0088765 126.4674 234.4752 14.66376679152722 -DUCHIFAT-1 -1 40021U 14033M 17117.86016812 .00000711 00000-0 79901-4 0 9996 -2 40021 97.9209 30.9481 0014538 104.8818 255.4010 14.89829837155109 -FLOCK 1C-10 -1 40023U 14033P 17117.78525227 .00001620 00000-0 17954-3 0 9993 -2 40023 97.9244 30.0153 0013813 108.9391 251.3345 14.88629210155000 -NANOSATC-BR1 -1 40024U 14033Q 17117.70521081 .00000728 00000-0 82984-4 0 9994 -2 40024 97.9170 29.7589 0013775 106.1428 254.1306 14.89163449154516 -QB50P1 -1 40025U 14033R 17117.79236067 .00000521 00000-0 62282-4 0 9991 -2 40025 97.9154 28.9615 0013972 108.4459 251.8277 14.88377266154994 -FLOCK 1C-7 -1 40026U 14033S 17117.69252459 .00001610 00000-0 17546-3 0 9996 -2 40026 97.9262 30.5757 0012171 104.9985 255.2493 14.89362179155038 -FLOCK 1C-1 -1 40027U 14033T 17117.68815221 .00001614 00000-0 17866-3 0 9997 -2 40027 97.9245 30.1279 0013662 106.5820 253.6868 14.88692802155000 -POPSAT-HIP-1 -1 40028U 14033U 17117.81954482 .00000798 00000-0 92402-4 0 9998 -2 40028 97.9190 29.2472 0015246 105.9396 254.3490 14.88250592154986 -FLOCK 1C-2 -1 40029U 14033V 17117.71759820 .00001574 00000-0 17422-3 0 9998 -2 40029 97.9257 30.0230 0015257 103.5108 256.7835 14.88710352154995 -FLOCK 1C-4 -1 40031U 14033X 17117.72898287 .00001439 00000-0 16030-3 0 9997 -2 40031 97.9258 30.0294 0015844 102.0177 258.2829 14.88573373154980 -QB50P2 -1 40032U 14033Y 17117.75761221 .00000538 00000-0 64755-4 0 9995 -2 40032 97.9129 28.0982 0013398 103.7188 256.5520 14.87936282154420 -FLOCK 1C-11 -1 40033U 14033Z 17117.70539988 .00001713 00000-0 18283-3 0 9994 -2 40033 97.9262 31.2614 0013118 95.5687 264.7021 14.90110098155071 -ANTELSAT -1 40034U 14033AA 17117.90325846 .00000389 00000-0 65607-4 0 9994 -2 40034 97.8661 3.3753 0060575 94.4226 266.3906 14.73663798152982 -FLOCK 1C-9 -1 40035U 14033AB 17117.70815973 .00001491 00000-0 16527-3 0 9999 -2 40035 97.9272 30.3499 0013029 97.3673 262.9024 14.88762255154999 -FLOCK 1C-6 -1 40036U 14033AC 17117.79989595 .00001824 00000-0 20033-3 0 9998 -2 40036 97.9289 30.6342 0013265 96.4287 263.8422 14.88870354155028 -PERSEUS-M2 -1 40037U 14033AD 17117.69946939 .00000208 00000-0 29963-4 0 9990 -2 40037 97.9154 26.7165 0015824 109.0400 251.2531 14.86206796154314 -FLOCK 1C-5 -1 40038U 14033AE 17117.53813928 .00001748 00000-0 19206-3 0 9993 -2 40038 97.9271 30.1949 0015749 98.3757 261.9146 14.88866930154971 -PERSEUS-M1 -1 40039U 14033AF 17117.82116885 .00000196 00000-0 28807-4 0 9998 -2 40039 97.9162 26.4258 0015718 104.8926 255.4031 14.85831542154282 -FLOCK 1C-8 -1 40040U 14033AG 17117.72877875 .00002090 00000-0 21796-3 0 9996 -2 40040 97.9299 32.2999 0014312 85.8242 274.4623 14.90795258155110 -FLOCK 1C-3 -1 40041U 14033AH 17117.69158466 .00001622 00000-0 18010-3 0 9996 -2 40041 97.9279 30.1484 0014243 94.7877 265.4932 14.88563540154971 -POLYITAN-1 -1 40042U 14033AJ 17117.75290921 .00000643 00000-0 76001-4 0 9994 -2 40042 97.9227 28.8882 0016309 97.7076 262.5992 14.88006179154413 -TIGRISAT -1 40043U 14033AK 17117.87274996 .00000269 00000-0 47301-4 0 9997 -2 40043 97.8642 3.9742 0061712 95.9530 264.8717 14.73953574153127 -LEMUR-1 -1 40044U 14033AL 17117.91583820 .00000277 00000-0 48776-4 0 9998 -2 40044 97.8639 3.7766 0060851 96.8549 263.9588 14.73779322153012 -AEROCUBE 6A -1 40045U 14033AM 17117.72610688 .00000636 00000-0 99844-4 0 9992 -2 40045 97.8750 4.8463 0059908 91.9920 268.8151 14.74770565153047 -AEROCUBE 6B -1 40046U 14033AN 17117.25126953 .00000729 00000-0 11344-3 0 9999 -2 40046 97.8745 4.3222 0059135 93.0930 267.7048 14.74772136152976 -UKUBE-1 -1 40074U 14037F 17117.84040769 .00000906 00000-0 11735-3 0 9990 -2 40074 98.3403 230.5143 0003977 198.7320 161.3748 14.83458186151711 -BRITE-PL 2 -1 40119U 14049B 17117.78390368 .00000244 00000-0 35741-4 0 9998 -2 40119 97.9362 203.9510 0016211 252.2068 107.7377 14.84115139145592 -FIREBIRD 4 -1 40378U 15003C 17117.94748016 .00004851 00000-0 20854-3 0 9997 -2 40378 99.1206 291.9378 0137539 168.3190 192.1284 15.15098062123398 -GRIFEX -1 40379U 15003D 17117.78581521 .00003196 00000-0 14683-3 0 9990 -2 40379 99.1216 289.7363 0143029 175.7733 184.4739 15.12719344123260 -EXOCUBE -1 40380U 15003E 17117.72316331 .00002961 00000-0 14079-3 0 9999 -2 40380 99.1252 288.5187 0146395 179.5364 180.6024 15.11298453123160 -DEORBITSAIL -1 40719U 15032E 17117.95678016 .00000657 00000-0 10272-3 0 9994 -2 40719 97.9859 12.3290 0015543 309.1394 50.8433 14.76002439 96918 -TIANWANG 1C (TW-1C) -1 40926U 15051B 17117.85064436 .00014345 00000-0 33754-3 0 9998 -2 40926 97.2349 157.8130 0011533 0.9630 83.4861 15.42000022 89163 -TIANWANG 1B (TW-1B) -1 40927U 15051C 17117.89255963 .00013750 00000-0 33549-3 0 9991 -2 40927 97.2436 157.8915 0011894 10.5538 114.8392 15.40911759 89126 -TIANWANG 1A (TW-1A) -1 40928U 15051D 17117.79212189 .00007759 00000-0 22472-3 0 9999 -2 40928 97.2321 154.5108 0013659 27.3955 62.4426 15.35755461 88965 -LEMUR-2-JOEL -1 40932U 15052C 17117.32237063 .00001410 00000-0 10453-3 0 9996 -2 40932 6.0111 231.1210 0014841 262.7024 97.1332 14.77445689 85474 -LEMUR-2-CHRIS -1 40933U 15052D 17117.32965153 .00001031 00000-0 52397-4 0 9998 -2 40933 6.0077 229.9966 0015505 263.7687 96.0633 14.77589281 85483 -LEMUR-2-JEROEN -1 40934U 15052E 17117.27775888 .00001220 00000-0 80307-4 0 9999 -2 40934 6.0089 235.1325 0011986 249.8364 110.0413 14.76906682 85403 -LEMUR-2-PETER -1 40935U 15052F 17117.28967475 .00001280 00000-0 89279-4 0 9999 -2 40935 6.0032 236.3023 0011615 246.4157 113.4815 14.76696092 85406 -EXACTVIEW 9 -1 40936U 15052G 17117.27467349 .00000985 00000-0 49217-4 0 9993 -2 40936 6.0069 238.4850 0011108 241.8510 118.0486 14.76231801 85393 -ATHENOXAT 1 -1 41168U 15077C 17117.36977241 .00004352 00000-0 21082-3 0 9996 -2 41168 14.9948 180.6360 0012950 31.4192 308.1213 15.11430396 75337 -GALASSIA -1 41170U 15077E 17117.31132535 .00003014 00000-0 13197-3 0 9995 -2 41170 14.9880 177.7210 0013626 48.3709 311.7777 15.11946919 75369 -VELOX 2 -1 41171U 15077F 17117.27851486 .00002593 00000-0 11623-3 0 9997 -2 41171 14.9909 188.6790 0009337 7.5662 352.4799 15.09763069 75260 -AGGIESAT 4 -1 41313U 98067HP 17117.88856294 .00027416 00000-0 21135-3 0 9994 -2 41313 51.6370 260.5703 0004048 307.2747 52.7882 15.71743272 71015 -BEVO 2 -1 41314U 98067HQ 17117.78037836 .00162071 21220-4 43762-3 0 9995 -2 41314 51.6242 240.5340 0007618 319.0436 40.9998 15.93934194 71062 -HORYU-IV -1 41340U 16012D 17117.23382348 .00001153 00000-0 82440-4 0 9994 -2 41340 31.0054 72.9135 0014293 288.9018 71.0068 15.00542843 65352 -OUFTI-1 -1 41458U 16025C 17117.98367530 .00005415 00000-0 29139-3 0 9996 -2 41458 98.1883 152.6763 0175785 97.4196 264.7039 15.02943028 55049 -E-ST@R-II -1 41459U 16025D 17117.86635530 .00003845 00000-0 20784-3 0 9994 -2 41459 98.1909 152.5211 0177429 97.9470 264.1930 15.02804445 55013 -AAUSAT 4 -1 41460U 16025E 17117.89227298 .00006814 00000-0 36574-3 0 9990 -2 41460 98.1851 152.6203 0170139 96.5723 265.4824 15.03625334 55037 -DIWATA-1 -1 41463U 98067HT 17117.74134057 .00014441 00000-0 17099-3 0 9999 -2 41463 51.6418 279.7313 0000235 44.5344 54.0790 15.61515485 56918 -MINXSS -1 41474U 98067HU 17117.85338954 .00705529 26144-3 91467-3 0 9990 -2 41474 51.6493 250.5488 0009619 319.1629 40.8662 16.06395010 54385 -STMSAT-1 -1 41476U 98067HW 17110.92644424 .05491109 12138-4 11894-2 0 9990 -2 41476 51.6168 282.7472 0011810 288.2314 71.7422 16.29591596 53242 -NODES 2 -1 41477U 98067HX 17117.64924661 .00065514 00000-0 39910-3 0 9994 -2 41477 51.6300 264.9062 0004005 274.6406 85.4137 15.76801039 54082 -NODES 1 -1 41478U 98067HY 17117.86708760 .00053595 00000-0 33259-3 0 9995 -2 41478 51.6332 264.1150 0003680 276.1036 83.9544 15.76464640 54114 -FLOCK 2E'-1 -1 41479U 98067HZ 17117.67406738 .00026815 00000-0 25045-3 0 9994 -2 41479 51.6359 273.4110 0000833 59.3201 300.7877 15.67092940 53933 -FLOCK 2E'-3 -1 41480U 98067JA 17117.95323481 .00023155 00000-0 21637-3 0 9997 -2 41480 51.6361 271.5465 0000677 152.9203 207.1828 15.67172785 53974 -FLOCK 2E'-2 -1 41481U 98067JB 17117.86346073 .00022422 00000-0 20404-3 0 9997 -2 41481 51.6352 270.9159 0001146 30.7985 329.3079 15.67851793 53967 -FLOCK 2E'-4 -1 41482U 98067JC 17117.63115144 .00029993 00000-0 25614-3 0 9994 -2 41482 51.6347 271.6016 0001498 228.6212 131.4656 15.69230736 53933 -FLOCK 2E-1 -1 41483U 98067ID 17117.94934080 .00020674 00000-0 19926-3 0 9993 -2 41483 51.6374 272.2975 0001991 205.1500 154.9400 15.66480567 53824 -FLOCK 2E-2 -1 41484U 98067JE 17117.72674678 .00027364 00000-0 24870-3 0 9991 -2 41484 51.6389 272.3273 0001743 216.8515 143.2362 15.67755506 53808 -FLOCK 2E-3 -1 41486U 98067JG 17117.68243372 .00019152 00000-0 19170-3 0 9994 -2 41486 51.6369 275.0084 0002510 242.2376 117.8365 15.65587802 53786 -FLOCK 2E-4 -1 41487U 98067JH 17117.69264568 .00022392 00000-0 21405-3 0 9990 -2 41487 51.6371 273.5542 0002924 248.6699 111.3985 15.66628267 53801 -FLOCK 2E-6 -1 41563U 98067JM 17117.70590552 .00020892 00000-0 21040-3 0 9990 -2 41563 51.6365 275.1409 0001246 48.0647 312.0454 15.65368785 51859 -FLOCK 2E-5 -1 41564U 98067JN 17117.71297708 .00019920 00000-0 20183-3 0 9996 -2 41564 51.6366 275.1953 0001080 55.8892 304.2205 15.65250527 51849 -FLOCK 2E-7 -1 41565U 98067JP 17117.67622853 .00026122 00000-0 23754-3 0 9994 -2 41565 51.6360 272.6768 0003583 283.6343 76.4255 15.67765998 51772 -FLOCK 2E-8 -1 41566U 98067JQ 17117.88030192 .00088873 00000-0 38732-3 0 9990 -2 41566 51.6320 259.6592 0006839 289.2881 70.7382 15.83976326 51950 -FLOCK 2E'-5 -1 41567U 98067JR 17117.93559926 .00015401 00000-0 16213-3 0 9995 -2 41567 51.6377 275.1907 0003645 305.4839 54.5816 15.64490124 51736 -FLOCK 2E'-6 -1 41568U 98067JS 17117.71137180 .00021558 00000-0 21131-3 0 9991 -2 41568 51.6360 274.4137 0003276 300.7311 59.3362 15.66025178 51755 -FLOCK 2E'-8 -1 41569U 98067JT 17117.65378708 .00028579 00000-0 25703-3 0 9997 -2 41569 51.6357 272.5303 0001610 245.5770 114.5058 15.67989702 51659 -FLOCK 2E'-7 -1 41570U 98067JU 17117.67964695 .00034704 00000-0 28466-3 0 9993 -2 41570 51.6361 270.4681 0002921 233.3096 126.7633 15.70128630 51703 -FLOCK 2E-9 -1 41571U 98067JV 17117.66511043 .00028139 00000-0 24929-3 0 9993 -2 41571 51.6367 271.8695 0003247 284.7074 75.3562 15.68365870 51647 -FLOCK 2E-10 -1 41572U 98067JW 17117.72358775 .00026092 00000-0 24274-3 0 9991 -2 41572 51.6364 273.0133 0003613 288.9991 71.0613 15.67202150 51636 -FLOCK 2E-12 -1 41573U 98067JX 17117.87586062 .00024085 00000-0 21875-3 0 9994 -2 41573 51.6359 271.7712 0003404 303.8155 56.2517 15.67848295 51663 -FLOCK 2E-11 -1 41574U 98067JY 17117.68607962 .00027391 00000-0 24566-3 0 9990 -2 41574 51.6345 271.9656 0003991 304.3717 55.6902 15.68077253 51647 -FLOCK 2E'-9 -1 41575U 98067JZ 17117.64706161 .00033045 00000-0 28617-3 0 9992 -2 41575 51.6341 271.6876 0003751 319.0573 41.0141 15.68832321 51630 -FLOCK 2E'-10 -1 41576U 98067KA 17117.67719824 .00026849 00000-0 24218-3 0 9993 -2 41576 51.6367 272.7128 0003584 319.0759 40.9968 15.67949646 51522 -FLOCK 2E'-11 -1 41577U 98067KB 17117.69777214 .00026494 00000-0 24362-3 0 9999 -2 41577 51.6372 272.8578 0003988 297.7920 62.2672 15.67481556 51349 -FLOCK 2E'-12 -1 41578U 98067KC 17117.66912503 .00028018 00000-0 24765-3 0 9990 -2 41578 51.6349 272.6114 0004511 284.1953 75.8543 15.68419741 51342 -LEMUR-2-DRMUZZ -1 41595U 16019B 17117.84302896 .00127020 00000-0 44515-3 0 9992 -2 41595 51.6302 254.1195 0003423 293.4657 66.5988 15.88344786 48736 -FLOCK 2P-6 -1 41606U 16040H 17117.60756184 .00005638 00000-0 25068-3 0 9998 -2 41606 97.4631 180.7135 0009542 246.8064 113.2168 15.21870432 47011 -FLOCK 2P-11 -1 41608U 16040K 17117.94163601 .00001850 00000-0 84373-4 0 9990 -2 41608 97.4628 181.0199 0009592 245.7377 114.2857 15.21879305 47006 -FLOCK 2P-2 -1 41609U 16040L 17117.89235751 .00001827 00000-0 83314-4 0 9999 -2 41609 97.4633 180.9541 0009545 245.2216 114.8027 15.21898186 46975 -FLOCK 2P-9 -1 41610U 16040M 17117.90472840 .00004854 00000-0 21599-3 0 9994 -2 41610 97.4628 180.9271 0009642 245.7251 114.2978 15.21916789 46859 -FLOCK 2P-4 -1 41611U 16040N 17117.86502867 .00003018 00000-0 13567-3 0 9990 -2 41611 97.4655 181.0742 0009770 256.2054 103.8095 15.21867773 47016 -FLOCK 2P-10 -1 41612U 16040P 17117.84314646 .00001549 00000-0 71162-4 0 9998 -2 41612 97.4665 181.1204 0009599 256.6905 103.3261 15.21876036 47012 -FLOCK 2P-8 -1 41613U 16040Q 17117.79380488 .00002021 00000-0 91917-4 0 9996 -2 41613 97.4657 181.0198 0009575 256.0237 103.9934 15.21865721 47002 -FLOCK 2P-12 -1 41614U 16040R 17117.82123275 .00002197 00000-0 99662-4 0 9999 -2 41614 97.4667 181.1743 0009260 255.6227 104.3981 15.21863280 47012 -FLOCK 2P-7 -1 41615U 16040S 17117.91992175 .00005097 00000-0 22673-3 0 9992 -2 41615 97.4652 181.1472 0009516 257.1055 102.9119 15.21900333 47025 -FLOCK 2P-5 -1 41616U 16040T 17117.70078230 .00004551 00000-0 20287-3 0 9990 -2 41616 97.4665 181.0282 0009292 255.8314 104.1890 15.21891411 46971 -FLOCK 2P-1 -1 41617U 16040U 17117.88648594 .00004002 00000-0 17878-3 0 9999 -2 41617 97.4667 181.2375 0009175 255.9418 104.0798 15.21890261 47020 -FLOCK 2P-3 -1 41618U 16040V 17117.91436232 .00003514 00000-0 15736-3 0 9996 -2 41618 97.4663 181.1976 0009217 255.3226 104.6989 15.21896729 47024 -BEESAT-4 -1 41619U 16040W 17117.91761869 .00002446 00000-0 11478-3 0 9996 -2 41619 97.4663 180.7833 0010732 239.2746 120.7433 15.20558082 34951 -3CAT-2 -1 41732U 16051B 17117.84237591 .00003436 00000-0 14123-3 0 9996 -2 41732 97.3776 35.5828 0015921 90.1270 310.9936 15.24732608 38860 -FLOCK 2E'-13 -1 41761U 98067KH 17117.68099529 .00014062 00000-0 17760-3 0 9991 -2 41761 51.6386 284.7850 0006999 74.7379 285.4388 15.59826357 35023 -FLOCK 2E'-14 -1 41762U 98067KJ 17117.67139885 .00014321 00000-0 17979-3 0 9991 -2 41762 51.6398 284.7364 0006897 75.9747 284.2012 15.59967456 35023 -FLOCK 2E'-16 -1 41763U 98067KK 17117.65592762 .00015752 00000-0 19450-3 0 9992 -2 41763 51.6395 284.6283 0006287 86.8203 273.3510 15.60320725 34981 -FLOCK 2E'-15 -1 41764U 98067KL 17117.88131529 .00012631 00000-0 16071-3 0 9997 -2 41764 51.6395 283.8845 0006587 82.5935 277.5806 15.59744132 35014 -FLOCK 2E'-18 -1 41769U 98067KM 17117.74021575 .00013973 00000-0 17684-3 0 9997 -2 41769 51.6393 284.4359 0005753 103.8246 256.3387 15.59784918 34991 -FLOCK 2E'-17 -1 41776U 98067KN 17117.66967328 .00011888 00000-0 15129-3 0 9996 -2 41776 51.6402 284.7273 0005999 104.5105 255.6554 15.59811228 34973 -FLOCK 2E'-19 -1 41777U 98067KP 17117.72866038 .00019736 00000-0 22879-3 0 9990 -2 41777 51.6384 282.8484 0004876 104.2554 255.8982 15.61796591 34968 -FLOCK 2E'-20 -1 41782U 98067KQ 17117.89934744 .00016041 00000-0 19118-3 0 9992 -2 41782 51.6397 282.5044 0004923 100.4555 259.6994 15.61241931 34855 -CANX-7 -1 41788U 16059F 17117.76011401 .00000159 00000-0 39714-4 0 9999 -2 41788 98.1709 179.9284 0028561 321.6367 38.2792 14.63692958 31215 -ALSAT 1N -1 41789U 16059G 17117.84765939 .00000194 00000-0 46161-4 0 9994 -2 41789 98.1715 180.1324 0027400 315.4582 44.4404 14.64033880 31249 -RAVAN -1 41849U 16067B 17117.22165980 .00002279 00000-0 20389-3 0 9991 -2 41849 97.9499 194.4492 0010408 108.8657 251.3693 14.96869819 24888 -CELTEE 1 -1 41850U 16067C 17117.71522530 .00000118 00000-0 15761-4 0 9994 -2 41850 97.9510 194.8951 0010342 103.9380 256.2992 14.96518333 24950 -OPTICUBE 04 -1 41851U 16067D 17117.91936757 -.00000203 00000-0 -12522-4 0 9996 -2 41851 97.9507 195.0949 0010305 104.3464 255.8902 14.96461892 24980 -AEROCUBE 8D -1 41852U 16067E 17117.82342739 .00001051 00000-0 98634-4 0 9996 -2 41852 97.9516 194.9286 0011354 105.6193 254.6282 14.96154128 24968 -AEROCUBE 8C -1 41853U 16067F 17117.89441789 .00001040 00000-0 97720-4 0 9992 -2 41853 97.9518 194.9902 0011756 106.1209 254.1306 14.96118438 24973 -PROMETHEUS 2-1 -1 41854U 16067G 17117.77311589 .00001030 00000-0 97048-4 0 9996 -2 41854 97.9522 194.8393 0012111 105.8580 254.3977 14.96051393 24956 -PROMETHEUS 2-3 -1 41855U 16067H 17117.90799088 .00000887 00000-0 84333-4 0 9998 -2 41855 97.9522 194.9758 0012254 105.6836 254.5737 14.96043026 24975 -LEMUR-2-XIAOQING -1 41871U 16062C 17117.76930831 .00004903 00000-0 22619-3 0 9999 -2 41871 51.6375 326.4504 0006539 67.2943 10.4464 15.21964560 23269 -LEMUR-2-SOKOLSKY -1 41872U 16062D 17117.82908058 .00004251 00000-0 19708-3 0 9994 -2 41872 51.6437 326.0666 0005999 67.3796 28.9764 15.22132643 23267 -LEMUR-2-ANUBHAVTHAKUR -1 41873U 16062E 17117.79916006 .00002849 00000-0 13965-3 0 9993 -2 41873 51.6372 326.5709 0007633 66.6642 36.6419 15.21416912 23242 -LEMUR-2-WINGO -1 41874U 16062F 17117.77565659 .00003859 00000-0 18192-3 0 9995 -2 41874 51.6343 326.4885 0006562 67.4845 10.2163 15.21811399 23252 -STARS-C -1 41895U 98067KR 17117.68305651 .00029445 00000-0 37085-3 0 9998 -2 41895 51.6389 287.8020 0004650 133.8670 226.2707 15.59366455 20109 -TANCREDO-1 -1 41931U 98067KT 17117.91994729 .00048674 00000-0 52449-3 0 9991 -2 41931 51.6384 285.6264 0004985 89.6048 270.5518 15.63179491 15720 -ITF-2 -1 41932U 98067KU 17117.68252201 .00019293 00000-0 25901-3 0 9996 -2 41932 51.6406 288.5525 0005802 84.2189 275.9464 15.57931361 15661 -WASEDA-SAT3 -1 41933U 98067KV 17117.86578988 .00018431 00000-0 24441-3 0 9991 -2 41933 51.6399 287.5245 0005614 86.4432 273.7202 15.58297153 15691 -EGG -1 41934U 98067KW 17117.86634358 .00484650 00000-0 20823-2 0 9995 -2 41934 51.6300 282.9825 0009674 294.3263 65.6729 15.83154229 15842 -AOBA-VELOX 3 -1 41935U 98067KX 17117.68078888 .00021193 00000-0 28192-3 0 9993 -2 41935 51.6404 288.5394 0005173 89.0702 271.0883 15.58112862 15762 -TUPOD -1 41936U 98067KY 17117.68471490 .00084313 00000-0 82229-3 0 9994 -2 41936 51.6381 286.3097 0002567 98.1001 262.0285 15.65484278 15172 -OSNSAT -1 41939U 98067KZ 17117.72437336 .00038052 00000-0 45103-3 0 9992 -2 41939 51.6391 287.3243 0006217 88.0087 272.1618 15.60820381 15040 -FLOCK 3P-8 -1 41951U 17008D 17117.88430574 .00003555 00000-0 15855-3 0 9997 -2 41951 97.4997 179.3307 0008710 20.7741 339.3847 15.22035856 10885 -FLOCK 3P-51 -1 41952U 17008E 17117.93060742 .00002257 00000-0 10122-3 0 9990 -2 41952 97.5004 179.4278 0009176 38.5000 321.6889 15.22224595 10897 -FLOCK 3P-37 -1 41953U 17008F 17117.91863110 .00003884 00000-0 17016-3 0 9995 -2 41953 97.4999 179.4397 0008679 43.2669 316.9248 15.22587696 10893 -INS-1B -1 41954U 17008G 17117.89682641 .00002173 00000-0 99508-4 0 9998 -2 41954 97.4978 179.2942 0010007 18.0351 342.1237 15.21543021 10826 -FLOCK 3P-19 -1 41955U 17008H 17117.89250737 .00005617 00000-0 24997-3 0 9991 -2 41955 97.4992 179.3160 0009515 20.0399 340.1209 15.21844908 10806 -FLOCK 3P-24 -1 41956U 17008J 17117.82685793 .00007201 00000-0 31949-3 0 9995 -2 41956 97.4992 179.2512 0009301 17.6462 342.5095 15.21850692 10876 -FLOCK 3P-18 -1 41957U 17008K 17117.89306345 .00006105 00000-0 27165-3 0 9993 -2 41957 97.4993 179.3176 0009466 17.9911 342.1658 15.21814954 10725 -FLOCK 3P-22 -1 41958U 17008L 17117.89252690 .00005671 00000-0 25275-3 0 9994 -2 41958 97.4993 179.3183 0009309 18.8257 341.3321 15.21792505 10717 -FLOCK 3P-21 -1 41959U 17008M 17117.88662811 .00005759 00000-0 25583-3 0 9993 -2 41959 97.4997 179.3286 0009221 21.2597 338.9021 15.21894130 10721 -FLOCK 3P-28 -1 41960U 17008N 17117.88799822 .00004431 00000-0 19722-3 0 9992 -2 41960 97.4997 179.3260 0008950 19.6365 340.5214 15.21963279 10800 -FLOCK 3P-26 -1 41961U 17008P 17117.89051910 .00004294 00000-0 19180-3 0 9998 -2 41961 97.4995 179.3223 0009194 18.4911 341.6657 15.21853947 10727 -FLOCK 3P-17 -1 41962U 17008Q 17117.88303115 .00003419 00000-0 15235-3 0 9990 -2 41962 97.4996 179.3322 0009053 21.7063 338.4555 15.22090270 10676 -FLOCK 3P-27 -1 41963U 17008R 17117.89168386 .00005006 00000-0 22377-3 0 9990 -2 41963 97.4996 179.3222 0009273 18.9656 341.1924 15.21746920 10722 -FLOCK 3P-25 -1 41964U 17008S 17117.88862869 .00004357 00000-0 19424-3 0 9994 -2 41964 97.4995 179.3236 0009021 19.9186 340.2400 15.21912845 10705 -FLOCK 3P-4 -1 41965U 17008T 17117.88611353 .00006043 00000-0 26757-3 0 9996 -2 41965 97.4996 179.3292 0008996 21.1764 338.9842 15.21991387 10809 -FLOCK 3P 2 -1 41966U 17008U 17117.88618833 .00003738 00000-0 16675-3 0 9993 -2 41966 97.4999 179.3307 0008810 19.6606 340.4968 15.21986397 10725 -FLOCK 3P-1 -1 41967U 17008V 17117.88611810 .00003520 00000-0 15746-3 0 9999 -2 41967 97.5000 179.3310 0008918 19.9851 340.1732 15.21935197 10726 -FLOCK 3P-3 -1 41968U 17008W 17117.88687496 .00004824 00000-0 21460-3 0 9991 -2 41968 97.4997 179.3284 0008860 19.7363 340.4214 15.21936884 10804 -FLOCK 3P-6 -1 41969U 17008X 17117.88493619 .00003205 00000-0 14353-3 0 9999 -2 41969 97.4999 179.3325 0008669 20.0408 340.1167 15.21967541 10713 -FLOCK 3P-7 -1 41970U 17008Y 17117.94264677 .00004063 00000-0 18045-3 0 9993 -2 41970 97.5000 179.4090 0008787 22.9084 337.2543 15.22088309 10735 -FLOCK 3P-5 -1 41971U 17008Z 17117.88187023 .00004229 00000-0 18809-3 0 9998 -2 41971 97.5001 179.3379 0008727 22.3604 337.8011 15.22019050 10656 -FLOCK 3P-12 -1 41972U 17008AA 17117.88122961 .00005388 00000-0 23847-3 0 9994 -2 41972 97.4999 179.3388 0008600 22.3591 337.8019 15.22058212 10805 -FLOCK 3P-9 -1 41973U 17008AB 17117.88342021 .00003011 00000-0 13492-3 0 9992 -2 41973 97.5002 179.3377 0008690 20.5803 339.5782 15.21997919 10806 -FLOCK 3P-10 -1 41974U 17008AC 17117.88043921 .00004893 00000-0 21654-3 0 9998 -2 41974 97.5002 179.3420 0008531 21.9511 338.2088 15.22109396 10698 -FLOCK 3P-11 -1 41975U 17008AD 17117.88379102 .00004913 00000-0 21875-3 0 9990 -2 41975 97.5001 179.3369 0008794 21.5084 338.6519 15.21898151 10698 -FLOCK 3P-60 -1 41976U 17008AE 17117.93943174 .00003280 00000-0 14569-3 0 9991 -2 41976 97.5002 179.4164 0008551 22.9681 337.1936 15.22232550 10067 -FLOCK 3P-58 -1 41977U 17008AF 17117.88036548 .00001916 00000-0 86957-4 0 9999 -2 41977 97.5003 179.3405 0008530 22.5439 337.6170 15.22016825 10880 -FLOCK 3P-57 -1 41978U 17008AG 17117.94580222 .00004497 00000-0 19938-3 0 9991 -2 41978 97.5001 179.4073 0008545 20.8869 339.2714 15.22088768 10736 -FLOCK 3P-75 -1 41979U 17008AH 17117.87954718 .00004387 00000-0 19471-3 0 9999 -2 41979 97.5022 179.3680 0008925 23.8619 336.3029 15.22063859 10877 -FLOCK 3P-70 -1 41980U 17008AJ 17117.94512493 .00003650 00000-0 16241-3 0 9993 -2 41980 97.5023 179.4347 0008849 23.0226 337.1405 15.22095517 10730 -FLOCK 3P-73 -1 41981U 17008AK 17117.94575462 .00004886 00000-0 21666-3 0 9998 -2 41981 97.5023 179.4334 0009024 23.1497 337.0144 15.22039306 10861 -FLOCK 3P-88 -1 41982U 17008AL 17117.94373196 .00003112 00000-0 13885-3 0 9994 -2 41982 97.5020 179.4335 0008883 23.3692 336.7946 15.22119866 9832 -FLOCK 3P-85 -1 41983U 17008AM 17117.93482036 .00003024 00000-0 13437-3 0 9993 -2 41983 97.5022 179.4462 0009031 26.9410 333.2294 15.22274907 10736 -FLOCK 3P-79 -1 41984U 17008AN 17117.93576521 .00003828 00000-0 16922-3 0 9991 -2 41984 97.5022 179.4445 0008666 27.3592 332.8099 15.22285044 10739 -FLOCK 3P-86 -1 41985U 17008AP 17117.93686574 .00003203 00000-0 14213-3 0 9990 -2 41985 97.5021 179.4421 0008632 26.7391 333.4289 15.22284445 10727 -FLOCK 3P-36 -1 41986U 17008AQ 17117.93983630 .00004372 00000-0 19316-3 0 9991 -2 41986 97.5004 179.4164 0008120 24.3269 335.8349 15.22227541 10214 -FLOCK 3P-30 -1 41987U 17008AR 17117.93325730 .00003216 00000-0 14245-3 0 9995 -2 41987 97.5004 179.4260 0008200 26.4059 333.7594 15.22346748 10682 -FLOCK 3P-34 -1 41988U 17008AS 17117.94152379 .00005208 00000-0 22991-3 0 9994 -2 41988 97.5000 179.4124 0008188 22.5371 337.6223 15.22166720 10218 -FLOCK 3P-35 -1 41989U 17008AT 17117.94211338 .00005954 00000-0 26265-3 0 9992 -2 41989 97.4999 179.4117 0008234 22.1672 337.9918 15.22131314 10214 -FLOCK 3P-33 -1 41990U 17008AU 17117.93863185 .00004954 00000-0 21851-3 0 9991 -2 41990 97.5001 179.4170 0008026 24.1703 335.9908 15.22223799 10212 -LEMUR-2-SATCHMO -1 41991U 17008AV 17117.94036775 .00001868 00000-0 84875-4 0 9997 -2 41991 97.5003 179.4151 0008460 24.6059 335.5579 15.21999054 10218 -LEMUR-2-MIA-GRACE -1 41992U 17008AW 17117.93674514 .00002702 00000-0 12092-3 0 9995 -2 41992 97.5005 179.4209 0008364 25.3800 334.7845 15.22137149 10217 -LEMUR-2-SMITA-SHARAD -1 41993U 17008AX 17117.93837299 .00002350 00000-0 10577-3 0 9992 -2 41993 97.5003 179.4184 0008328 25.3340 334.8303 15.22067808 10211 -LEMUR-2-SPIRE-MINIONS -1 41994U 17008AY 17117.93824750 .00002428 00000-0 10919-3 0 9997 -2 41994 97.5003 179.4177 0008267 25.4242 334.7399 15.22069342 10217 -LEMUR-2-RDEATON -1 41995U 17008AZ 17117.93707501 .00002397 00000-0 10769-3 0 9990 -2 41995 97.5004 179.4208 0009740 36.0301 324.1590 15.22097084 10899 -LEMUR-2-NOGUECORREIG -1 41996U 17008BA 17117.93491563 .00002705 00000-0 12086-3 0 9996 -2 41996 97.5005 179.4236 0009716 36.4293 323.7602 15.22175054 10117 -LEMUR-2-JOBANPUTRA -1 41997U 17008BB 17117.93276300 .00003184 00000-0 14136-3 0 9997 -2 41997 97.5003 179.4270 0009575 37.0095 323.1799 15.22260883 10200 -LEMUR-2-TACHIKOMA -1 41998U 17008BC 17117.93543269 .00001969 00000-0 89009-4 0 9990 -2 41998 97.5004 179.4227 0009749 36.5999 323.5901 15.22109469 10137 -BGUSAT -1 41999U 17008BD 17117.93063311 .00003442 00000-0 15234-3 0 9992 -2 41999 97.5007 179.4313 0009661 38.7968 321.3960 15.22313496 10206 -DIDO-2 -1 42000U 17008BE 17117.93557038 .00001683 00000-0 76622-4 0 9994 -2 42000 97.5003 179.4228 0009754 36.9289 323.2617 15.22073382 10218 -FLOCK 3P-49 -1 42001U 17008BF 17117.92833328 .00005019 00000-0 22051-3 0 9996 -2 42001 97.5002 179.4303 0009300 39.0330 321.1576 15.22336418 10730 -FLOCK 3P-67 -1 42002U 17008BG 17117.93181094 .00001780 00000-0 80342-4 0 9993 -2 42002 97.5002 179.4247 0009186 38.2128 321.9758 15.22281700 10896 -FLOCK 3P-68 -1 42003U 17008BH 17117.93193013 .00001791 00000-0 80936-4 0 9999 -2 42003 97.5001 179.4243 0009265 37.5945 322.5937 15.22236468 10537 -FLOCK 3P-41 -1 42004U 17008BJ 17117.92556734 .00001754 00000-0 79019-4 0 9991 -2 42004 97.5000 179.4293 0009134 40.3211 319.8701 15.22375862 10737 -FLOCK 3P-45 -1 42005U 17008BK 17117.92789884 .00006646 00000-0 29110-3 0 9997 -2 42005 97.4998 179.4296 0009088 39.2279 320.9614 15.22319918 10898 -FLOCK 3P-48 -1 42006U 17008BL 17117.92683056 .00001785 00000-0 80511-4 0 9994 -2 42006 97.5003 179.4316 0009056 40.6066 319.5844 15.22318259 10677 -FLOCK 3P-43 -1 42007U 17008BM 17117.92558465 .00001863 00000-0 83751-4 0 9996 -2 42007 97.5001 179.4311 0008975 40.4178 319.7723 15.22364572 10893 -FLOCK 3P-42 -1 42008U 17008BN 17117.92513829 .00001747 00000-0 78807-4 0 9999 -2 42008 97.4999 179.4306 0008955 40.4399 319.7501 15.22343852 10810 -FLOCK 3P-61 -1 42009U 17008BP 17117.92268201 .00001664 00000-0 75153-4 0 9990 -2 42009 97.5000 179.4339 0008988 42.3221 317.8707 15.22369458 10864 -FLOCK 3P-40 -1 42010U 17008BQ 17117.92001377 .00002139 00000-0 95545-4 0 9996 -2 42010 97.4995 179.4337 0008864 42.9509 317.2418 15.22426183 10125 -FLOCK 3P-16 -1 42011U 17008BR 17117.91667514 .00002196 00000-0 97595-4 0 9997 -2 42011 97.4997 179.4395 0008585 43.6845 316.5069 15.22571907 10065 -FLOCK 3P-14 -1 42012U 17008BS 17117.91634744 .00001961 00000-0 87596-4 0 9996 -2 42012 97.4999 179.4414 0008753 45.0845 315.1100 15.22522491 10686 -FLOCK 3P-53 -1 42013U 17008BT 17117.91781299 .00002100 00000-0 93766-4 0 9997 -2 42013 97.4993 179.4339 0008682 44.0870 316.1057 15.22467328 10684 -FLOCK 3P-54 -1 42014U 17008BU 17117.91660444 .00001850 00000-0 82875-4 0 9996 -2 42014 97.4995 179.4373 0008601 44.7565 315.4364 15.22509453 10896 -PEASSS -1 42015U 17008BV 17117.90864510 .00001976 00000-0 87887-4 0 9993 -2 42015 97.4992 179.4464 0007831 47.6956 312.4942 15.22670726 10694 -AL-FARABI 1 -1 42016U 17008BW 17117.90623780 .00002566 00000-0 11293-3 0 9999 -2 42016 97.4995 179.4515 0007735 48.6595 311.5306 15.22761727 10818 -NAYIF-1 (EO-88) -1 42017U 17008BX 17117.90560704 .00002569 00000-0 11298-3 0 9994 -2 42017 97.4994 179.4522 0007725 48.9362 311.2540 15.22775768 10839 -FLOCK 3P-23 -1 42018U 17008BY 17117.89038354 .00005153 00000-0 22928-3 0 9998 -2 42018 97.4993 179.3196 0009094 19.1909 340.9668 15.21896240 9659 -FLOCK 3P-76 -1 42019U 17008BZ 17117.94227885 .00005224 00000-0 23042-3 0 9991 -2 42019 97.5025 179.4392 0008919 25.7304 334.4374 15.22187470 10724 -FLOCK 3P-69 -1 42020U 17008CA 17117.94110336 .00003456 00000-0 15316-3 0 9995 -2 42020 97.5023 179.4400 0008799 24.1775 335.9872 15.22266130 9611 -FLOCK 3P-84 -1 42021U 17008CB 17117.87986851 .00006109 00000-0 26990-3 0 9999 -2 42021 97.5020 179.3659 0009009 23.8019 336.3632 15.22062389 10729 -FLOCK 3P-59 -1 42022U 17008CC 17117.94187068 .00004134 00000-0 18333-3 0 9999 -2 42022 97.5001 179.4121 0008603 23.8799 336.2835 15.22134637 9759 -FLOCK 3P-32 -1 42023U 17008CD 17117.94494690 .00004940 00000-0 21885-3 0 9993 -2 42023 97.5002 179.4098 0008386 21.2559 338.9023 15.22072439 10894 -FLOCK 3P-71 -1 42024U 17008CE 17117.94485394 .00003971 00000-0 17671-3 0 9996 -2 42024 97.5024 179.4357 0008927 23.8889 336.2760 15.22031965 9764 -FLOCK 3P-77 -1 42025U 17008CF 17117.94228925 .00005788 00000-0 25523-3 0 9995 -2 42025 97.5020 179.4363 0008816 25.8206 334.3469 15.22152062 10736 -FLOCK 3P-80 -1 42026U 17008CG 17117.93433305 .00001821 00000-0 81753-4 0 9997 -2 42026 97.5022 179.4451 0008593 26.7854 333.3824 15.22441468 8875 -FLOCK 3P-66 -1 42027U 17008CH 17117.93221249 .00004590 00000-0 20239-3 0 9997 -2 42027 97.5002 179.4257 0009230 37.1707 323.0167 15.22258753 10849 -FLOCK 3P-65 -1 42028U 17008CJ 17117.93162462 .00006441 00000-0 28229-3 0 9993 -2 42028 97.5000 179.4267 0009150 37.2447 322.9422 15.22312728 10746 -FLOCK 3P-50 -1 42029U 17008CK 17117.92852684 .00003494 00000-0 15464-3 0 9997 -2 42029 97.5004 179.4320 0009139 39.6210 320.5693 15.22303987 10068 -FLOCK 3P-52 -1 42030U 17008CL 17117.92970864 .00001718 00000-0 77659-4 0 9992 -2 42030 97.5002 179.4278 0009093 38.5563 321.6320 15.22286872 10835 -FLOCK 3P-46 -1 42031U 17008CM 17117.92723847 .00004933 00000-0 21693-3 0 9998 -2 42031 97.4999 179.4295 0009031 39.7235 320.4661 15.22315510 10893 -FLOCK 3P-47 -1 42032U 17008CN 17117.92663095 .00001715 00000-0 77458-4 0 9993 -2 42032 97.5001 179.4305 0009053 39.9745 320.2156 15.22326391 10710 -FLOCK 3P-44 -1 42033U 17008CP 17117.92351431 .00004258 00000-0 18729-3 0 9992 -2 42033 97.5001 179.4348 0009044 41.8761 318.3166 15.22387485 9468 -FLOCK 3P-64 -1 42034U 17008CQ 17117.92285855 .00002073 00000-0 92840-4 0 9999 -2 42034 97.4999 179.4328 0008947 41.9838 318.2082 15.22366553 10886 -FLOCK 3P-63 -1 42035U 17008CR 17117.92234442 .00001750 00000-0 78827-4 0 9996 -2 42035 97.4997 179.4323 0008983 42.2189 317.9738 15.22386140 8855 -FLOCK 3P-62 -1 42036U 17008CS 17117.92060168 .00001817 00000-0 81578-4 0 9990 -2 42036 97.4999 179.4357 0008916 43.3553 316.8383 15.22451222 10051 -FLOCK 3P-38 -1 42037U 17008CT 17117.92067492 .00002220 00000-0 99051-4 0 9992 -2 42037 97.4997 179.4344 0008731 43.2888 316.9032 15.22425393 10839 -FLOCK 3P-39 -1 42038U 17008CU 17117.92052619 .00002253 00000-0 10044-3 0 9998 -2 42038 97.4995 179.4325 0008934 42.7971 317.3959 15.22435115 10789 -FLOCK 3P-15 -1 42039U 17008CV 17117.92065031 .00002279 00000-0 10171-3 0 9990 -2 42039 97.4998 179.4347 0008799 42.6709 317.5209 15.22388001 10066 -FLOCK 3P-13 -1 42040U 17008CW 17117.91914960 .00001808 00000-0 81200-4 0 9994 -2 42040 97.4999 179.4372 0008759 43.5243 316.6683 15.22450956 10050 -FLOCK 3P 55 -1 42041U 17008CX 17117.91208432 .00002128 00000-0 94481-4 0 9996 -2 42041 97.4998 179.4451 0008627 47.7726 312.4241 15.22633603 10892 -FLOCK 3P-56 -1 42042U 17008CY 17117.91261835 .00001900 00000-0 84777-4 0 9997 -2 42042 97.4995 179.4408 0008606 46.4231 313.7718 15.22599944 10685 -FLOCK 3P-81 -1 42043U 17008CZ 17117.74121139 .00003098 00000-0 13772-3 0 9997 -2 42043 97.5024 179.2446 0008811 27.3916 332.7783 15.22243909 10046 -FLOCK 3P-87 -1 42044U 17008DA 17117.74657948 .00007358 00000-0 32375-3 0 9993 -2 42044 97.5018 179.2354 0008840 23.9516 336.2129 15.22130647 10191 -FLOCK 3P-29 -1 42045U 17008DB 17117.74684697 .00006621 00000-0 29214-3 0 9995 -2 42045 97.5002 179.2132 0008440 22.5973 337.5633 15.22077991 10047 -FLOCK 3P-82 -1 42046U 17008DC 17117.94429318 .00005805 00000-0 25647-3 0 9994 -2 42046 97.5019 179.4329 0008946 23.7194 336.4453 15.22081255 10120 -FLOCK 3P-78 -1 42047U 17008DD 17117.87753839 .00003411 00000-0 15188-3 0 9995 -2 42047 97.5022 179.3690 0008833 24.2348 335.9302 15.22114453 10042 -FLOCK 3P-74 -1 42048U 17008DE 17117.68232499 .00006723 00000-0 29714-3 0 9998 -2 42048 97.5025 179.1721 0009051 25.0934 335.0740 15.22008773 10013 -FLOCK 3P-31 -1 42049U 17008DF 17117.74767558 .00004859 00000-0 21565-3 0 9999 -2 42049 97.5004 179.2133 0008529 22.7340 337.4272 15.22013176 9481 -FLOCK 3P-83 -1 42050U 17008DG 17117.94453105 .00003174 00000-0 14174-3 0 9990 -2 42050 97.5019 179.4321 0008998 23.9812 336.1842 15.22063966 10783 -FLOCK 3P-72 -1 42051U 17008DH 17117.67743945 .00007332 00000-0 32082-3 0 9993 -2 42051 97.5025 179.1792 0008549 25.0642 335.1008 15.22320717 8337 -LEMUR-2-REDFERN-GOES -1 42059U 98067LA 17117.89036229 .00017847 00000-0 25115-3 0 9990 -2 42059 51.6399 288.4369 0008499 110.0579 250.1329 15.56701854 8178 -TECHEDSAT 5 -1 42066U 98067LB 17117.92157381 .00106558 00000-0 10996-2 0 9993 -2 42066 51.6371 287.1395 0001292 204.9681 155.1252 15.63958765 7926 -LEMUR-2-TRUTNA -1 42067U 98067LC 17117.68910864 .00028817 00000-0 39181-3 0 9999 -2 42067 51.6399 289.3417 0007806 109.7811 250.4023 15.57316914 7977 -LEMUR-2-AUSTINTACIOUS -1 42068U 98067LD 17117.89142568 .00019056 00000-0 26784-3 0 9991 -2 42068 51.6398 288.4429 0008001 110.1474 250.0380 15.56688107 8102 -LEMUR-2-TRUTNAHD -1 42069U 98067LE 17117.89168216 .00019328 00000-0 27108-3 0 9993 -2 42069 51.6402 288.4454 0007899 108.6654 251.5196 15.56737145 8156 -BEIJING 1 -1 28890U 05043A 17117.87305616 .00000055 00000-0 20169-4 0 9994 -2 28890 97.8693 276.3291 0014198 313.3095 46.6932 14.61172938613077 -HJ-1A -1 33320U 08041A 17117.90438058 .00000337 00000-0 55229-4 0 9998 -2 33320 97.9398 183.4818 0026167 184.3852 175.7116 14.76770344465369 -HJ-1B -1 33321U 08041B 17117.84531018 .00000397 00000-0 63426-4 0 9996 -2 33321 97.9445 184.5935 0034047 201.8959 158.0786 14.76845271465341 -YAOGAN 4 -1 33446U 08061A 17117.96730530 .00000144 00000-0 27277-4 0 9993 -2 33446 97.5933 117.9610 0017432 104.1397 256.1752 14.76623623452611 -DEIMOS-1 -1 35681U 09041A 17117.88799528 .00000150 00000-0 31897-4 0 9998 -2 35681 97.9589 11.3031 0002740 105.9182 254.2338 14.71653793415744 -UK-DMC 2 -1 35683U 09041C 17117.91265618 .00000119 00000-0 27022-4 0 9992 -2 35683 97.8451 358.5404 0001375 89.5178 270.6192 14.70956680415625 -RISAT 1 -1 38248U 12017A 17117.95728384 .00001925 00000-0 12563-3 0 9996 -2 38248 97.5741 126.2642 0003516 193.2634 222.5140 15.09044773275668 -DMC3-FM1 -1 40715U 15032A 17117.85995324 .00000111 00000-0 24870-4 0 9998 -2 40715 98.0458 13.7987 0015124 302.5599 57.4147 14.73683936 96782 -DMC3-FM2 -1 40716U 15032B 17117.88302103 .00000098 00000-0 22839-4 0 9996 -2 40716 98.0477 13.8866 0012577 312.9079 47.1078 14.73674542 96791 -DMC3-FM3 -1 40717U 15032C 17114.17097362 -.00000054 00000-0 -44719-6 0 9991 -2 40717 98.0462 10.9780 0016258 315.3884 44.6004 14.73708170 96246 -SAUDISAT 1C -1 27607U 02058C 17117.90978278 .00000113 00000-0 36998-4 0 9998 -2 27607 64.5550 279.1976 0031890 121.8188 238.6026 14.75315015771565 -SAUDISAT 2 -1 28371U 04025F 17117.86304334 .00000010 00000-0 12806-4 0 9992 -2 28371 98.1293 73.8243 0026589 133.2055 227.1366 14.54244914680527 -SAUDISAT 3 -1 31118U 07012B 17117.87508187 .00000045 00000-0 15409-4 0 9997 -2 31118 97.7291 114.0452 0016694 71.0829 289.2184 14.69051834537629 -PISAT -1 41784U 16059B 17117.76401181 .00000186 00000-0 45306-4 0 9997 -2 41784 98.1719 179.7717 0031072 320.3302 39.5627 14.63205123 31201 -PROBA-1 -1 26958U 01049B 17117.87550216 .00001193 00000-0 10839-3 0 9993 -2 26958 97.5584 86.6980 0074552 135.9863 224.7351 14.95017442844002 -BIRD 2 -1 26959U 01049C 17117.89856694 .00002349 00000-0 73607-4 0 9992 -2 26959 97.7843 62.1977 0008828 190.7532 169.3523 15.34170018164859 -CUTE-1 (CO-55) -1 27844U 03031E 17117.90754108 .00000072 00000-0 52093-4 0 9995 -2 27844 98.6909 127.6436 0010705 128.6749 231.5388 14.22031562717132 -CUBESAT XI-IV (CO-57) -1 27848U 03031J 17117.96407819 .00000055 00000-0 44753-4 0 9994 -2 27848 98.7002 127.9366 0010494 136.9803 223.2196 14.21646872717033 -GENESIS 1 -1 29252U 06029A 17117.47444212 .00001146 00000-0 68373-4 0 9995 -2 29252 64.5040 91.1269 0011471 304.2303 193.9620 15.16708370594059 -FALCONSAT-3 -1 30776U 07006E 17117.92386921 .00003778 00000-0 12090-3 0 9993 -2 30776 35.4370 25.4249 0004430 243.4596 116.5675 15.31991729560545 -GENESIS 2 -1 31789U 07028A 17117.53581267 .00000919 00000-0 57593-4 0 9991 -2 31789 64.5028 128.6918 0034401 228.6670 131.1491 15.15988958541237 -APRIZESAT 4 -1 35684U 09041D 17117.90519049 .00000122 00000-0 23857-4 0 9998 -2 35684 98.1257 59.6437 0045976 259.0924 141.3481 14.79019608417645 -APRIZESAT 3 -1 35686U 09041F 17117.95867562 .00000148 00000-0 22677-4 0 9998 -2 35686 98.2757 115.3934 0073375 175.7760 184.4090 14.87054686419674 -PROBA-2 -1 36037U 09059B 17117.87706725 .00000014 00000-0 14246-4 0 9997 -2 36037 98.2545 312.1235 0014417 128.0628 232.1871 14.52995764396739 -APRIZESAT 5 -1 37792U 11044E 17117.91070293 .00000172 00000-0 33213-4 0 9992 -2 37792 98.3290 259.5053 0057853 209.9915 149.7975 14.75116945306300 -APRIZESAT 6 -1 37793U 11044F 17117.93072053 .00000147 00000-0 31567-4 0 9993 -2 37793 98.2805 245.4395 0046076 233.1556 242.9882 14.72196507305727 -TET-1 -1 38710U 12039D 17117.92035616 .00004342 00000-0 94633-4 0 9995 -2 38710 97.5394 72.1639 0003191 66.8209 293.3375 15.44830301266488 -STSAT-2C -1 39068U 13003A 17117.72471387 .00022729 -22460-6 22149-3 0 9993 -2 39068 80.1999 175.1745 0370309 250.4560 105.6332 15.11897717224890 -PROBA-V -1 39159U 13021A 17117.86928799 -.00000012 00000-0 13694-4 0 9990 -2 39159 98.5986 195.1222 0004671 144.7771 215.3705 14.22940748206445 -CUSAT 1 -1 39266U 13055B 17117.95098845 .00011329 00000-0 31920-3 0 9999 -2 39266 80.9888 61.0975 0665289 16.5705 345.6107 14.28543710184821 -STPSAT-3 -1 39380U 13064A 17117.90013314 .00002717 00000-0 86337-4 0 9993 -2 39380 40.5011 69.0970 0002916 171.4650 188.6213 15.34342537190409 -APRIZESAT 7 -1 39416U 13066A 17117.71937039 .00000199 00000-0 29919-4 0 9998 -2 39416 97.6394 170.0052 0042665 59.9981 300.5457 14.83683482185715 -APRIZESAT 8 -1 39425U 13066K 17117.94626009 .00000139 00000-0 24031-4 0 9999 -2 39425 97.6339 164.5757 0053534 71.3515 289.3500 14.80931930185198 -BUGSAT-1 (TITA) -1 40014U 14033E 17117.90059796 .00000829 00000-0 81223-4 0 9991 -2 40014 97.9555 42.0160 0032955 129.9807 230.4290 14.94717691155699 -SAUDISAT 4 -1 40016U 14033G 17117.77426442 .00000112 00000-0 23708-4 0 9993 -2 40016 97.8692 6.6760 0049893 89.9947 270.6980 14.75105813153734 -TABLETSAT-AURORA -1 40017U 14033H 17117.86350860 .00000703 00000-0 73456-4 0 9995 -2 40017 97.9445 37.9345 0024732 131.4572 228.8776 14.92734086155458 -APRIZESAT 9 -1 40018U 14033J 17117.91440233 .00000079 00000-0 20714-4 0 9991 -2 40018 97.8516 357.1886 0072926 110.7640 250.1400 14.69794516152972 -APRIZESAT 10 -1 40019U 14033K 17117.72653098 .00000079 00000-0 21791-4 0 9992 -2 40019 97.8442 351.8423 0085601 124.3028 236.6318 14.66865892152828 -AISAT -1 40054U 14034B 17117.87930853 .00000716 00000-0 10908-3 0 9990 -2 40054 98.1860 216.7521 0012688 200.6318 159.4381 14.77029713152297 -CANX-4 -1 40055U 14034C 17117.82167430 .00000203 00000-0 38422-4 0 9992 -2 40055 98.1828 214.3845 0013497 218.2711 141.7540 14.74589544152129 -CANX-5 -1 40056U 14034D 17117.82261484 .00000202 00000-0 38299-4 0 9998 -2 40056 98.1829 214.3828 0013506 218.4952 141.5293 14.74585721142914 -TDS 1 -1 40076U 14037H 17117.85230614 .00000201 00000-0 33063-4 0 9990 -2 40076 98.3251 226.9383 0004765 228.7129 131.3671 14.81322196151571 -TIANTUO 2 -1 40144U 14053B 17117.88048880 .00002172 00000-0 70304-4 0 9997 -2 40144 97.3236 200.7196 0013642 89.1501 23.4437 15.33049674147287 -GSAT0101 (PRN E11) -1 37846U 11060A 17114.83304321 -.00000009 00000-0 00000-0 0 9994 -2 37846 55.7886 73.2046 0005400 329.6595 30.2713 1.70473582 34177 -GSAT0102 (PRN E12) -1 37847U 11060B 17117.34389545 -.00000021 00000-0 00000-0 0 9999 -2 37847 55.7913 73.1335 0006344 314.5582 189.3282 1.70475788 34229 -GSAT0103 (PRN E19) -1 38857U 12055A 17115.46369245 .00000024 00000-0 00000-0 0 9994 -2 38857 54.9073 193.4908 0004464 237.3596 122.6674 1.70473641 28234 -GSAT0104 (PRN E20) -1 38858U 12055B 17117.15778157 .00000027 00000-0 00000-0 0 9992 -2 38858 54.9088 193.4429 0003448 237.5079 122.5372 1.70473667 28207 -GSAT0201 (PRN E18) -1 40128U 14050A 17117.39330562 -.00000070 00000-0 00000-0 0 9991 -2 40128 50.2807 47.2498 1620138 61.7281 313.6096 1.85518359 16425 -GSAT0202 (PRN E14) -1 40129U 14050B 17117.12213120 -.00000070 00000-0 00000-0 0 9993 -2 40129 50.3344 46.2556 1620846 62.7394 312.7763 1.85518988 18554 -GSAT0203 (PRN E26) -1 40544U 15017A 17115.78826820 -.00000014 00000-0 00000-0 0 9993 -2 40544 55.5778 73.4760 0003691 275.1481 84.7686 1.70474994 12276 -GSAT0204 (PRN E22) -1 40545U 15017B 17117.33112485 -.00000021 00000-0 00000-0 0 9990 -2 40545 55.5857 73.4431 0001212 283.4971 76.4459 1.70475083 12965 -GSAT0205 (PRN E24) -1 40889U 15045A 17116.39771652 -.00000024 00000-0 00000-0 0 9997 -2 40889 57.0518 313.5369 0003704 29.8948 330.1405 1.70474626 10094 -GSAT0206 (PRN E30) -1 40890U 15045B 17116.61766460 -.00000025 00000-0 00000-0 0 9996 -2 40890 57.0510 313.5282 0002236 42.7563 317.2738 1.70474700 10120 -GSAT0209 (PRN E09) -1 41174U 15079A 17117.37650380 .00000027 00000-0 00000-0 0 9997 -2 41174 54.9207 193.1252 0005409 279.8218 80.1968 1.70474042 8452 -GSAT0208 (PRN E08) -1 41175U 15079B 17117.00984805 .00000028 00000-0 00000-0 0 9991 -2 41175 54.9189 193.1359 0004531 276.3820 83.6450 1.70474111 8457 -GSAT0211 (PRN E02) -1 41549U 16030A 17114.78332279 -.00000015 00000-0 00000-0 0 9995 -2 41549 57.1917 313.3182 0001607 333.1119 26.9029 1.70474465 5721 -GSAT0210 (PRN E01) -1 41550U 16030B 17114.49000576 -.00000013 00000-0 00000-0 0 9995 -2 41550 57.1913 313.3283 0000598 245.4590 114.5592 1.70474458 5717 -GSAT0207 (PRN E07) -1 41859U 16069A 17114.73729743 .00000020 00000-0 00000-0 0 9997 -2 41859 54.5808 193.8506 0005235 267.7099 92.2948 1.70473996 2693 -GSAT0212 (PRN E03) -1 41860U 16069B 17111.07114535 .00000007 00000-0 00000-0 0 9995 -2 41860 54.5789 193.9541 0003805 279.8361 80.1683 1.70474039 2646 -GSAT0213 (PRN E04) -1 41861U 16069C 17115.54385408 .00000024 00000-0 00000-0 0 9990 -2 41861 54.5812 193.8312 0004552 245.5133 114.5091 1.70473919 2726 -GSAT0214 (PRN E05) -1 41862U 16069D 17117.45021559 .00000026 00000-0 00000-0 0 9999 -2 41862 54.5787 193.7747 0003868 247.0465 112.9913 1.70473982 2740 -STARLETTE -1 07646U 75010A 17117.91272899 -.00000135 00000-0 52455-5 0 9996 -2 07646 49.8246 316.7809 0205757 198.7440 160.5794 13.82302451132918 -LAGEOS 1 -1 08820U 76039A 17117.82764281 .00000022 00000-0 00000-0 0 9992 -2 08820 109.8321 116.1586 0044561 296.6233 119.4827 6.38664636700325 -AJISAI (EGS) -1 16908U 86061A 17117.95189642 -.00000092 00000-0 40650-4 0 9997 -2 16908 50.0102 329.0110 0011283 327.1606 189.5961 12.44485451 64973 -LAGEOS 2 -1 22195U 92070B 17117.88948562 -.00000009 00000-0 00000-0 0 9994 -2 22195 52.6474 215.8374 0137315 168.0551 218.2475 6.47294107579588 -STELLA -1 22824U 93061B 17117.94895757 -.00000044 00000-0 52504-6 0 9999 -2 22824 98.8132 74.3636 0006183 183.3983 249.5257 14.27368163228684 -GRACE-1 -1 27391U 02012A 17117.92950789 .00013968 00000-0 81718-4 0 9999 -2 27391 88.9882 328.2310 0003424 191.0157 284.5165 15.78193217168485 -GRACE-2 -1 27392U 02012B 17117.65580123 .00015104 00000-0 88389-4 0 9996 -2 27392 88.9897 328.4002 0003410 192.5834 167.5359 15.78192307849429 -LARES -1 38077U 12006A 17117.75757334 -.00000022 00000-0 10000-3 0 9991 -2 38077 69.4920 232.8714 0010662 301.3943 58.6037 12.54930969238440 -TDRS 3 -1 19548U 88091B 17117.43482086 -.00000309 00000-0 00000-0 0 9998 -2 19548 14.4377 8.4853 0038291 314.2229 347.1134 1.00274614 91894 -SKYNET 4C -1 20776U 90079A 17117.35448114 .00000118 00000-0 00000-0 0 9994 -2 20776 13.8074 16.6196 0002327 1.9377 358.0135 1.00274747 97459 -TDRS 5 -1 21639U 91054B 17117.70188633 .00000077 00000-0 00000-0 0 9997 -2 21639 14.3454 21.9512 0025210 344.6898 294.5266 1.00262986 94243 -TDRS 6 -1 22314U 93003B 17117.43419350 -.00000301 00000-0 00000-0 0 9998 -2 22314 13.8692 24.8717 0006388 315.6641 345.3318 1.00265130 88970 -INTELSAT 701 (IS-701) -1 22871U 93066A 17117.84915325 -.00000228 00000-0 00000-0 0 9991 -2 22871 4.1027 67.2656 0003830 326.2480 98.6790 1.00270267 85958 -ASTRA 1D -1 23331U 94070A 17117.94887056 -.00000297 00000-0 00000-0 0 9995 -2 23331 7.4884 49.6425 0003975 337.7411 123.0119 1.00270333 82821 -BRASILSAT B2 -1 23536U 95016A 17117.25374222 -.00000287 00000-0 00000-0 0 9992 -2 23536 7.1112 51.5320 0001897 343.0176 204.2203 1.00270849 80842 -AMSC 1 -1 23553U 95019A 17116.80157384 -.00000121 00000-0 00000-0 0 9999 -2 23553 10.0205 40.3317 0005329 345.7280 14.1729 1.00273269 80703 -TDRS 7 -1 23613U 95035B 17117.68131510 -.00000210 00000-0 00000-0 0 9993 -2 23613 14.9559 15.6529 0032064 358.5136 171.6632 1.00276770 79680 -ECHOSTAR 1 -1 23754U 95073A 17117.51259294 -.00000252 00000-0 00000-0 0 9999 -2 23754 0.7063 90.2833 0002531 293.7045 298.9798 1.00272672 18946 -INMARSAT 3-F1 -1 23839U 96020A 17117.92549392 -.00000004 00000-0 00000-0 0 9997 -2 23839 3.8911 67.7201 0006122 329.3836 216.6400 1.00273042 76851 -ASTRA 1F -1 23842U 96021A 17117.93035581 .00000126 00000-0 00000-0 0 9997 -2 23842 0.0435 4.9337 0003647 27.4447 202.9405 1.00272640 18886 -MSAT M1 -1 23846U 96022A 17116.83767356 -.00000091 00000-0 00000-0 0 9994 -2 23846 7.6767 49.1832 0005486 347.5035 12.3856 1.00272650 76949 -INMARSAT 3-F2 -1 24307U 96053A 17117.26168468 -.00000134 00000-0 00000-0 0 9996 -2 24307 2.5253 77.9378 0006520 302.6379 273.5684 1.00272241 75555 -AMC-1 (GE-1) -1 24315U 96054A 17116.99830703 .00000049 00000-0 00000-0 0 9997 -2 24315 1.4627 85.2444 0002541 312.9431 47.2340 1.00272459 12855 -AFRICASAT-2 (MEASAT-2) -1 24653U 96063B 17117.66310705 -.00000236 00000-0 00000-0 0 9991 -2 24653 7.4101 50.0650 0006306 192.5242 359.9637 1.00272436 74885 -EUTELSAT 48A -1 24665U 96067A 17113.99054804 .00000111 00000-0 00000-0 0 9996 -2 24665 6.2716 55.4586 0005034 330.9125 230.6826 1.00273660 75177 -INMARSAT 3-F3 -1 24674U 96070A 17117.63968044 .00000026 00000-0 00000-0 0 9990 -2 24674 3.3351 71.9923 0005920 325.4929 226.7369 1.00269553 74503 -AMC-2 (GE-2) -1 24713U 97002A 17117.46282128 -.00000220 00000-0 00000-0 0 9990 -2 24713 4.2449 66.1892 0004965 329.2587 261.9464 1.00273046 74112 -INTELSAT 26 (IS-26) -1 24732U 97007A 17117.80741380 -.00000006 00000-0 00000-0 0 9996 -2 24732 7.3857 50.3876 0005476 3.0506 157.4337 1.00270756 39274 -GALAXY 25 (G-25) -1 24812U 97026A 17116.66187462 -.00000173 00000-0 00000-0 0 9999 -2 24812 0.0451 90.3866 0003544 305.2334 324.4126 1.00273150 72894 -ABS-3 -1 24901U 97042A 17117.80488368 -.00000204 00000-0 00000-0 0 9997 -2 24901 4.7987 63.5399 0008362 325.4649 202.2346 1.00272611 72086 -INTELSAT 5 (IS-5) -1 24916U 97046A 17117.16364104 -.00000150 00000-0 00000-0 0 9997 -2 24916 3.4490 71.3292 0003546 321.5620 38.3528 1.00271601 72157 -AMC-3 (GE-3) -1 24936U 97050A 17117.53155150 -.00000271 00000-0 00000-0 0 9998 -2 24936 0.2740 91.5953 0002576 307.6319 295.8336 1.00270355 71973 -NSS-5 -1 24957U 97053A 17117.93035581 .00000098 00000-0 00000-0 0 9999 -2 24957 3.7438 69.5263 0003313 320.8842 211.1239 1.00268268 71710 -ECHOSTAR 3 -1 25004U 97059A 17117.79502708 -.00000294 00000-0 00000-0 0 9992 -2 25004 2.0546 80.3892 0001312 283.8269 76.1678 1.00270852 71597 -JCSAT-1B -1 25067U 97075A 17117.65636578 -.00000217 00000-0 00000-0 0 9992 -2 25067 5.4745 59.2190 0003990 310.3321 232.5496 1.00271491 73890 -ASTRA 1G -1 25071U 97076A 17117.93035581 .00000095 00000-0 00000-0 0 9999 -2 25071 2.2219 78.5414 0003243 316.9076 206.6691 1.00273085 71099 -BRASILSAT B3 -1 25152U 98006A 17116.76880240 -.00000291 00000-0 00000-0 0 9992 -2 25152 3.9372 68.5992 0003547 324.7262 35.1876 1.00274450 10043 -INMARSAT 3-F5 -1 25153U 98006B 17117.58053549 -.00000298 00000-0 00000-0 0 9995 -2 25153 2.4767 74.2479 0004250 318.8801 337.6097 1.00274335 70420 -NSS-806 -1 25239U 98014A 17117.49771485 -.00000291 00000-0 00000-0 0 9998 -2 25239 0.0667 43.3045 0004164 347.0110 317.0595 1.00272070 13836 -CHINASAT 5A (ZX 5A) -1 25354U 98033A 17117.91114970 -.00000366 00000-0 00000-0 0 9997 -2 25354 1.1354 87.3456 0002396 252.4935 329.7335 1.00267159 73775 -THOR III -1 25358U 98035A 17117.57728456 -.00000053 00000-0 00000-0 0 9998 -2 25358 5.3412 59.3790 0002298 330.8240 29.0523 1.00272039 69385 -INTELSAT 805 (IS-805) -1 25371U 98037A 17117.77637519 -.00000044 00000-0 00000-0 0 9996 -2 25371 0.0085 83.9267 0003083 318.9617 261.5410 1.00270643 69082 -ASTRA 2A -1 25462U 98050A 17117.86998072 -.00000372 00000-0 00000-0 0 9990 -2 25462 0.0587 250.0045 0001821 114.1770 278.5134 1.00266930 12886 -AFRISTAR -1 25515U 98063A 17117.72039122 .00000114 00000-0 00000-0 0 9993 -2 25515 3.2049 69.8252 0004257 323.8405 102.5370 1.00272987 67482 -JCSAT-4A -1 25630U 99006A 17116.84702260 -.00000165 00000-0 00000-0 0 9998 -2 25630 2.1908 80.2430 0001676 325.9206 195.7184 1.00269989 17133 -SKYNET 4E -1 25639U 99009B 17116.98035801 .00000014 00000-0 00000-0 0 9997 -2 25639 10.0900 28.9973 0002841 5.3789 179.6513 1.00273014 66543 -ASIASAT 3S -1 25657U 99013A 17117.84214854 -.00000248 00000-0 00000-0 0 9995 -2 25657 2.4061 78.4567 0003334 319.0948 267.6850 1.00270524 66359 -NIMIQ 1 -1 25740U 99027A 17117.48989917 -.00000210 00000-0 00000-0 0 9991 -2 25740 0.0077 263.8005 0005794 127.1301 274.5873 1.00272613 65737 -ASTRA 1H -1 25785U 99033A 17117.93035581 .00000127 00000-0 00000-0 0 9992 -2 25785 3.7288 69.6845 0002700 318.4700 206.3377 1.00271741 17950 -TELKOM 1 -1 25880U 99042A 17117.83243694 -.00000357 00000-0 00000-0 0 9999 -2 25880 0.0410 104.0944 0001395 320.7406 198.8135 1.00265354 64924 -ABS-7 -1 25894U 99046A 17117.91197160 -.00000375 00000-0 00000-0 0 9993 -2 25894 0.0107 248.3542 0002385 163.2774 248.8804 1.00270507 63661 -ABS-6 -1 25924U 99053A 17116.96068447 -.00000131 00000-0 00000-0 0 9994 -2 25924 0.0242 86.2938 0003232 337.8423 295.9057 1.00270899 64416 -TELSTAR 12 (ORION 2) -1 25949U 99059A 17117.38035667 -.00000073 00000-0 00000-0 0 9997 -2 25949 0.8286 88.8282 0002792 297.9184 216.5534 1.00270883 64062 -AMC-4 (GE-4) -1 25954U 99060A 17116.58960841 -.00000283 00000-0 00000-0 0 9990 -2 25954 0.0747 83.6143 0002314 346.5514 289.8681 1.00272694 10260 -GALAXY 11 (G-11) -1 26038U 99071A 17117.93035581 .00000124 00000-0 00000-0 0 9993 -2 26038 0.0073 290.7859 0001167 42.6936 262.4449 1.00271306 63646 -HISPASAT 1C -1 26071U 00007A 17117.51230095 -.00000224 00000-0 00000-0 0 9994 -2 26071 0.4599 88.5486 0009069 305.5308 282.2854 1.00269688 63169 -SUPERBIRD-B2 -1 26095U 00012A 17117.82820889 -.00000106 00000-0 00000-0 0 9995 -2 26095 0.2942 94.8317 0003273 303.0241 278.2461 1.00271995 11726 -ASIASTAR -1 26107U 00016A 17117.85404823 -.00000344 00000-0 00000-0 0 9996 -2 26107 1.5700 81.9783 0003796 314.6700 231.8181 1.00270047 62466 -EUTELSAT 16C -1 26243U 00019A 17117.80715095 .00000081 00000-0 00000-0 0 9998 -2 26243 4.1728 66.5666 0002854 330.5413 123.9513 1.00274944 62287 -EUTELSAT 80A -1 26369U 00028A 17117.86096794 -.00000153 00000-0 00000-0 0 9992 -2 26369 0.9102 84.9793 0005368 347.4285 174.0633 1.00270144 61971 -TDRS 8 -1 26388U 00034A 17117.31061349 -.00000232 00000-0 00000-0 0 9996 -2 26388 7.4099 56.2608 0004718 257.7593 102.0921 1.00263738 61713 -ECHOSTAR 6 -1 26402U 00038A 17117.46460757 -.00000157 00000-0 00000-0 0 9995 -2 26402 4.0907 67.3481 0003248 325.4717 253.8669 1.00271136 61479 -INTELSAT 9 (IS-9) -1 26451U 00043A 17117.94657378 -.00000282 00000-0 00000-0 0 9994 -2 26451 3.4365 71.5444 0002688 315.4717 126.7630 1.00272717 10685 -BRASILSAT B4 -1 26469U 00046A 17116.89564228 -.00000179 00000-0 00000-0 0 9995 -2 26469 1.5554 85.3555 0003117 314.4699 45.6975 1.00272426 61498 -NILESAT 102 -1 26470U 00046B 17117.93470049 -.00000071 00000-0 00000-0 0 9991 -2 26470 1.5766 83.7989 0004305 308.1969 153.6027 1.00271977 11738 -ASTRA 2B -1 26494U 00054A 17117.87757578 .00000108 00000-0 00000-0 0 9994 -2 26494 2.1096 79.1778 0005202 329.6321 142.5842 1.00274614 13420 -AMC-7 (GE-7) -1 26495U 00054B 17116.77791431 .00000077 00000-0 00000-0 0 9994 -2 26495 0.0432 82.2799 0001120 288.8817 348.8496 1.00272717 60779 -NSS-11 (AAP-1) -1 26554U 00059A 17117.90604911 -.00000358 00000-0 00000-0 0 9990 -2 26554 0.0063 85.5734 0001949 322.2868 242.5888 1.00271778 7848 -N-SAT-110 (JCSAT-110) -1 26559U 00060A 17117.91248865 -.00000364 00000-0 00000-0 0 9997 -2 26559 0.0368 87.6857 0000970 3.3095 203.6529 1.00271882 7815 -AMC-6 (GE-6) -1 26580U 00067A 17117.50743608 -.00000285 00000-0 00000-0 0 9990 -2 26580 0.0218 356.4381 0001281 14.5567 320.3637 1.00271374 60515 -INTELSAT 12 (IS-12) -1 26590U 00068A 17117.93035581 .00000124 00000-0 00000-0 0 9994 -2 26590 0.3782 93.3320 0001540 294.8926 207.7699 1.00272133 18259 -INTELSAT 1R (IS-1R) -1 26608U 00072A 17117.52112888 .00000111 00000-0 00000-0 0 9996 -2 26608 0.2105 89.2644 0001663 269.6291 247.5204 1.00009937 60184 -ANIK F1 -1 26624U 00076A 17116.70124283 -.00000085 00000-0 00000-0 0 9990 -2 26624 0.0398 103.7159 0001422 334.6556 281.6533 1.00271966 60252 -ASTRA 2D -1 26638U 00081A 17117.43027749 .00000038 00000-0 00000-0 0 9998 -2 26638 3.5537 70.2649 0001966 323.7234 36.1874 1.00271905 19446 -AMC-8 (GE-8) -1 26639U 00081B 17117.51147722 .00000092 00000-0 00000-0 0 9992 -2 26639 0.0332 80.0772 0003191 325.6418 215.1011 1.00272006 59882 -SKYNET 4F -1 26695U 01005B 17117.06777510 -.00000256 00000-0 00000-0 0 9998 -2 26695 8.8418 37.0007 0002772 341.0792 187.5842 1.00271851 59408 -EUTELSAT 33C -1 26719U 01011A 17117.93521792 .00000142 00000-0 00000-0 0 9990 -2 26719 0.0726 27.6068 0004605 2.0993 196.1408 1.00273062 59081 -INTELSAT 10 (IS-10) -1 26766U 01019A 17117.93035581 .00000114 00000-0 00000-0 0 9995 -2 26766 1.4127 85.3638 0002139 290.5843 222.5639 1.00272879 12179 -INTELSAT 901 (IS-901) -1 26824U 01024A 17117.90090181 -.00000154 00000-0 00000-0 0 9995 -2 26824 0.0135 285.3709 0002681 101.3989 135.6098 1.00272019 58237 -ASTRA 2C -1 26853U 01025A 17117.92641178 .00000033 00000-0 00000-0 0 9993 -2 26853 0.2935 90.6741 0002799 300.6764 218.5592 1.00273170 11594 -ARTEMIS -1 26863U 01029A 17117.89753111 -.00000378 00000-0 00000-0 0 9998 -2 26863 12.6809 33.5825 0001767 26.6924 241.9256 1.00272512 10683 -INTELSAT 902 (IS-902) -1 26900U 01039A 17117.92594959 .00000019 00000-0 00000-0 0 9999 -2 26900 0.0099 278.1849 0002976 119.6629 213.5763 1.00272569 57252 -EUTELSAT 12 WEST B -1 26927U 01042A 17117.91873723 -.00000114 00000-0 00000-0 0 9997 -2 26927 0.0595 38.9647 0005840 347.7510 147.6130 1.00270791 57054 -DIRECTV 4S -1 26985U 01052A 17117.42410554 -.00000125 00000-0 00000-0 0 9999 -2 26985 0.0057 281.5796 0002007 119.7179 225.7744 1.00270575 56522 -INSAT-3C -1 27298U 02002A 17117.91937221 -.00000271 00000-0 00000-0 0 9994 -2 27298 0.5182 91.6118 0004690 231.6543 317.2944 1.00269922 55949 -ECHOSTAR 7 -1 27378U 02006A 17117.43382691 -.00000012 00000-0 00000-0 0 9992 -2 27378 0.0601 83.5006 0001324 277.2206 252.2488 1.00270465 17187 -INTELSAT 904 (IS-904) -1 27380U 02007A 17117.93035581 .00000123 00000-0 00000-0 0 9996 -2 27380 0.0464 91.3410 0002721 359.5396 145.2385 1.00272625 18301 -TDRS 9 -1 27389U 02011A 17117.92058000 -.00000110 00000-0 00000-0 0 9997 -2 27389 5.1478 79.6916 0020420 251.2959 204.2960 1.00273147 56981 -JCSAT 2A -1 27399U 02015A 17117.90172552 -.00000319 00000-0 00000-0 0 9990 -2 27399 0.3725 92.7624 0000877 186.2937 37.6472 1.00275290 55439 -ASTRA 3A -1 27400U 02015B 17116.72497990 -.00000289 00000-0 00000-0 0 9994 -2 27400 3.7174 69.0026 0002702 335.9286 23.9999 1.00272628 55253 -INTELSAT 903 (IS-903) -1 27403U 02016A 17117.74532738 -.00000251 00000-0 00000-0 0 9990 -2 27403 0.0199 275.9980 0002885 121.1229 52.6235 1.00271935 12204 -NSS-7 -1 27414U 02019A 17117.68738644 -.00000167 00000-0 00000-0 0 9998 -2 27414 1.7911 83.2758 0002707 321.2122 38.8366 1.00272050 55091 -DIRECTV 5 (TEMPO 1) -1 27426U 02023A 17116.70904308 -.00000066 00000-0 00000-0 0 9998 -2 27426 0.0192 253.0937 0003274 147.2819 319.6487 1.00270450 54862 -INTELSAT 905 (IS-905) -1 27438U 02027A 17117.87674363 -.00000197 00000-0 00000-0 0 9994 -2 27438 0.0111 253.4625 0002843 117.2349 136.4867 1.00271456 17919 -EXPRESS-A4 -1 27441U 02029A 17117.90296847 -.00000259 00000-0 00000-0 0 9990 -2 27441 5.9779 56.8288 0002262 23.3526 246.1482 1.00265198 54500 -GALAXY 3C (G-3C) -1 27445U 02030A 17116.66721878 -.00000161 00000-0 00000-0 0 9997 -2 27445 0.0185 287.7924 0001743 51.7560 20.4537 1.00271418 13106 -EUTELSAT 5 WEST A -1 27460U 02035A 17117.41519679 -.00000054 00000-0 00000-0 0 9998 -2 27460 0.0541 48.4484 0005148 343.4483 328.1425 1.00271934 54168 -N-STAR C -1 27461U 02035B 17117.77656080 -.00000320 00000-0 00000-0 0 9992 -2 27461 4.5396 65.0686 0004106 322.8350 243.5936 1.00274166 54260 -ECHOSTAR 8 -1 27501U 02039A 17117.71514125 -.00000236 00000-0 00000-0 0 9994 -2 27501 0.9886 88.6082 0011140 347.6384 317.9643 1.00186446 53812 -EUTELSAT 36 WEST A -1 27508U 02040A 17116.50367880 -.00000255 00000-0 00000-0 0 9994 -2 27508 0.0716 353.5647 0006501 32.2253 334.2515 1.00272471 53724 -METEOSAT-8 (MSG-1) -1 27509U 02040B 17117.67664500 .00000131 00000-0 00000-0 0 9995 -2 27509 4.7557 58.5253 0000941 266.9424 175.5485 1.00262079 53794 -INTELSAT 906 (IS-906) -1 27513U 02041A 17117.80674681 .00000001 00000-0 00000-0 0 9993 -2 27513 0.0235 268.9750 0002993 131.2485 170.3374 1.00273219 53574 -KODAMA (DRTS) -1 27516U 02042B 17117.80227965 -.00000250 00000-0 00000-0 0 9993 -2 27516 4.9535 62.3425 0003255 340.1842 193.0170 1.00271423 12440 -KALPANA-1 (METSAT 1) -1 27525U 02043A 17117.35141353 -.00000087 00000-0 00000-0 0 9998 -2 27525 6.2678 55.5575 0013379 237.2420 122.5229 1.00273567 53593 -HISPASAT 1D -1 27528U 02044A 17117.87665264 -.00000229 00000-0 00000-0 0 9999 -2 27528 0.0332 353.8021 0004800 25.2114 122.6347 1.00272121 9351 -TDRS 10 -1 27566U 02055A 17117.04900725 .00000070 00000-0 00000-0 0 9999 -2 27566 4.9483 58.6279 0009378 246.4828 113.3121 1.00271717 52762 -NSS-6 -1 27603U 02057A 17117.91091101 -.00000283 00000-0 00000-0 0 9995 -2 27603 0.0468 87.4320 0001344 282.6637 268.9063 1.00270011 52630 -NIMIQ 2 -1 27632U 02062A 17116.67575144 -.00000223 00000-0 00000-0 0 9993 -2 27632 1.8893 82.1930 0003745 249.6130 110.4679 0.99547659 52401 -INTELSAT 907 (IS-907) -1 27683U 03007A 17117.47743308 -.00000214 00000-0 00000-0 0 9997 -2 27683 0.0112 258.5995 0002868 144.7855 316.6455 1.00270988 51981 -GALAXY 12 (G-12) -1 27715U 03013B 17117.47480003 .00000047 00000-0 00000-0 0 9993 -2 27715 0.0610 89.8594 0001695 307.5230 220.1919 1.00271940 18675 -ASIASAT 4 -1 27718U 03014A 17117.82757797 -.00000373 00000-0 00000-0 0 9996 -2 27718 0.0477 98.6673 0000257 311.0494 226.2992 1.00268620 51452 -HELLAS-SAT 2 -1 27811U 03020A 17117.93521792 .00000139 00000-0 00000-0 0 9992 -2 27811 0.0425 86.6161 0003703 305.9869 199.1440 1.00271488 9393 -AMC-9 (GE-12) -1 27820U 03024A 17117.50551885 -.00000227 00000-0 00000-0 0 9994 -2 27820 0.0235 292.0436 0002626 94.1854 288.4387 1.00270023 50914 -THURAYA-2 -1 27825U 03026A 17117.51764172 .00000119 00000-0 00000-0 0 9996 -2 27825 4.8746 28.9310 0004609 356.0434 61.0687 1.00274042 50881 -OPTUS C1 -1 27831U 03028B 17117.76236484 -.00000160 00000-0 00000-0 0 9999 -2 27831 0.0310 190.7453 0002386 221.6695 233.9786 1.00271337 19592 -ECHOSTAR 12 (RAINBOW 1) -1 27852U 03033A 17117.94904992 -.00000295 00000-0 00000-0 0 9993 -2 27852 0.0032 48.2035 0000939 331.7742 116.6164 1.00270169 50524 -GALAXY 23 (G-23) -1 27854U 03034A 17117.38108368 .00000001 00000-0 00000-0 0 9991 -2 27854 0.0204 134.0337 0002988 259.8204 197.8948 1.00271212 50278 -EUTELSAT 33A -1 27948U 03043A 17117.87271644 .00000140 00000-0 00000-0 0 9991 -2 27948 2.2720 78.4586 0002148 231.0387 251.5634 1.00271428 12017 -GALAXY 13 (HORIZONS-1) -1 27954U 03044A 17117.43868888 .00000036 00000-0 00000-0 0 9997 -2 27954 0.0500 96.9803 0000764 318.8048 190.7435 1.00271160 49693 -ZHONGXING-20 -1 28082U 03052A 17117.46768166 -.00000336 00000-0 00000-0 0 9994 -2 28082 3.4072 71.5319 0003959 304.3480 111.4306 1.00270634 49295 -YAMAL 202 -1 28089U 03053A 17117.93035581 .00000106 00000-0 00000-0 0 9996 -2 28089 0.0634 83.2940 0003496 309.6706 207.0284 1.00274806 49218 -EXPRESS-AM22 (SESAT 2) -1 28134U 03060A 17117.91577310 -.00000150 00000-0 00000-0 0 9994 -2 28134 0.3458 90.5762 0000094 209.0401 326.2422 1.00271102 48814 -AMC-10 (GE-10) -1 28154U 04003A 17117.70168354 .00000076 00000-0 00000-0 0 9991 -2 28154 0.0151 288.3657 0002624 135.1563 269.9492 1.00272473 48465 -ABS-4 (MOBISAT-1) -1 28184U 04007A 17117.81160571 .00000028 00000-0 00000-0 0 9990 -2 28184 0.0230 275.3988 0001871 120.7392 172.9886 1.00272530 18878 -EUTELSAT 7A -1 28187U 04008A 17117.88243532 .00000034 00000-0 00000-0 0 9997 -2 28187 0.0702 1.5133 0003087 52.0990 127.1030 1.00270214 47926 -DIRECTV 7S -1 28238U 04016A 17117.43382691 -.00000010 00000-0 00000-0 0 9999 -2 28238 0.0321 47.4470 0002723 349.4632 215.8149 1.00269925 47603 -AMC-11 (GE-11) -1 28252U 04017A 17117.63471220 .00000057 00000-0 00000-0 0 9995 -2 28252 0.0236 329.2628 0002593 72.5884 271.4431 1.00271585 47234 -INTELSAT 10-02 -1 28358U 04022A 17117.81437965 -.00000024 00000-0 00000-0 0 9991 -2 28358 0.0153 175.9473 0000462 116.6379 215.5888 1.00271268 47182 -APSTAR 5 (TELSTAR 18) -1 28364U 04024A 17117.80604922 -.00000307 00000-0 00000-0 0 9992 -2 28364 0.0371 100.1185 0003166 303.6607 240.3729 1.00272600 47155 -ANIK F2 -1 28378U 04027A 17117.50219032 -.00000062 00000-0 00000-0 0 9999 -2 28378 0.0255 347.1699 0000396 260.3333 37.8886 1.00271537 7822 -AMAZONAS 1 -1 28393U 04031A 17117.29146619 -.00000256 00000-0 00000-0 0 9992 -2 28393 1.6466 83.9017 0004038 320.7703 239.5517 1.00271648 46602 -AMC-15 -1 28446U 04041A 17117.41694934 -.00000100 00000-0 00000-0 0 9992 -2 28446 0.0788 70.8686 0001712 306.8840 242.8742 1.00271398 45913 -AMC-16 -1 28472U 04048A 17117.48285421 -.00000218 00000-0 00000-0 0 9992 -2 28472 0.0219 341.5826 0002794 75.7071 247.2063 1.00272091 45347 -NSS-10 (AMC-12) -1 28526U 05003A 17117.73270097 -.00000263 00000-0 00000-0 0 9995 -2 28526 0.0223 307.8152 0002611 84.6656 49.7424 1.00270331 44851 -XTAR-EUR -1 28542U 05005A 17117.32091317 .00000139 00000-0 00000-0 0 9997 -2 28542 0.0388 84.7742 0002643 305.5684 329.6808 1.00271994 44748 -XM-3 (RHYTHM) -1 28626U 05008A 17117.47436293 -.00000217 00000-0 00000-0 0 9993 -2 28626 0.0450 66.9409 0000346 174.8171 59.5523 1.00270635 44596 -INMARSAT 4-F1 -1 28628U 05009A 17117.03392840 -.00000272 00000-0 00000-0 0 9998 -2 28628 2.8709 11.2869 0002823 29.9554 329.6820 1.00271451 44201 -APSTAR 6 -1 28638U 05012A 17117.90572722 -.00000331 00000-0 00000-0 0 9994 -2 28638 0.0064 151.8062 0002354 263.8070 260.5354 1.00271747 68943 -SPACEWAY 1 -1 28644U 05015A 17117.35305598 -.00000114 00000-0 00000-0 0 9997 -2 28644 0.0080 201.0782 0000376 66.0325 332.6012 1.00272836 13125 -DIRECTV 8 -1 28659U 05019A 17116.68338213 -.00000126 00000-0 00000-0 0 9995 -2 28659 0.0111 265.2696 0003143 133.0633 321.6895 1.00269929 43673 -GALAXY 28 (G-28) -1 28702U 05022A 17117.43521699 -.00000197 00000-0 00000-0 0 9992 -2 28702 0.0061 191.6243 0001605 202.3874 249.2715 1.00270588 18642 -EXPRESS-AM3 -1 28707U 05023A 17117.98029328 -.00000335 00000-0 00000-0 0 9994 -2 28707 0.0018 157.7792 0001205 255.5365 258.7300 1.00269697 43385 -THAICOM 4 -1 28786U 05028A 17117.91212845 -.00000376 00000-0 00000-0 0 9992 -2 28786 0.0117 274.7736 0001953 112.0065 277.1460 1.00268213 18819 -GALAXY 14 (G-14) -1 28790U 05030A 17117.43868888 .00000025 00000-0 00000-0 0 9991 -2 28790 0.0109 236.7748 0002121 141.2559 230.5041 1.00272833 42836 -ANIK F1R -1 28868U 05036A 17117.04493699 -.00000085 00000-0 00000-0 0 9991 -2 28868 0.0562 71.6647 0002884 323.4250 89.0143 1.00271681 13048 -GALAXY 15 (G-15) -1 28884U 05041A 17117.63438270 .00000066 00000-0 00000-0 0 9992 -2 28884 0.0250 92.8477 0001657 315.0810 263.2601 1.00273269 42155 -SYRACUSE 3A -1 28885U 05041B 17117.90644469 .00000116 00000-0 00000-0 0 9998 -2 28885 0.0146 316.4540 0003003 82.3296 190.5886 1.00272428 42293 -INMARSAT 4-F2 -1 28899U 05044A 17117.25403834 -.00000001 00000-0 00000-0 0 9997 -2 28899 2.5645 11.1945 0002504 28.9255 330.6550 1.00272957 42059 -TELKOM 2 -1 28902U 05046A 17112.60952086 -.00000371 00000-0 00000-0 0 9996 -2 28902 0.0266 242.9679 0000869 181.3340 123.8784 1.00267947 41722 -SPACEWAY 2 -1 28903U 05046B 17117.42410554 -.00000138 00000-0 00000-0 0 9992 -2 28903 0.0049 70.7398 0000043 13.8276 184.6348 1.00271174 17875 -INSAT-4A -1 28911U 05049A 17116.17395585 -.00000175 00000-0 00000-0 0 9992 -2 28911 0.1043 94.1062 0003408 233.5604 32.3220 1.00271444 41618 -METEOSAT-9 (MSG-2) -1 28912U 05049B 17117.16504358 .00000051 00000-0 00000-0 0 9995 -2 28912 2.1048 70.8043 0000560 129.4061 83.7904 1.00269537 41600 -EUTELSAT 172A (GE-23) -1 28924U 05052A 17117.76842414 -.00000019 00000-0 00000-0 0 9991 -2 28924 0.0703 10.8219 0005754 25.2854 268.4485 1.00271679 41516 -ECHOSTAR 10 -1 28935U 06003A 17117.42896751 -.00000067 00000-0 00000-0 0 9999 -2 28935 0.0615 74.0173 0001548 346.7063 199.1105 1.00270856 41011 -HIMAWARI-7 (MTSAT-2) -1 28937U 06004A 17117.84214854 -.00000255 00000-0 00000-0 0 9995 -2 28937 0.0692 92.9658 0003474 306.2616 264.9760 1.00274084 41015 -SPAINSAT -1 28945U 06007A 17117.48431187 -.00000228 00000-0 00000-0 0 9997 -2 28945 0.0173 210.3523 0002243 182.6197 327.0499 1.00271268 40760 -EUTELSAT HOT BIRD 13E -1 28946U 06007B 17117.36526661 .00000075 00000-0 00000-0 0 9996 -2 28946 0.0601 261.0072 0002876 185.4509 273.5828 1.00269346 40832 -JCSAT-5A -1 29045U 06010A 17117.81793146 -.00000341 00000-0 00000-0 0 9992 -2 29045 0.0107 273.1860 0001857 152.7965 216.5010 1.00270140 40311 -ASTRA 1KR -1 29055U 06012A 17117.83105093 .00000107 00000-0 00000-0 0 9994 -2 29055 0.0466 276.8626 0001146 45.2221 212.2600 1.00270484 12264 -GOES 13 -1 29155U 06018A 17116.61117068 -.00000261 00000-0 00000-0 0 9993 -2 29155 0.2882 273.0145 0004779 151.5840 295.4602 1.00276158 9925 -EUTELSAT 113 WEST A -1 29162U 06020A 17116.71700910 -.00000048 00000-0 00000-0 0 9992 -2 29162 0.0112 330.6056 0002968 71.1814 318.2445 1.00272935 40006 -THAICOM 5 -1 29163U 06020B 17117.91577310 -.00000134 00000-0 00000-0 0 9998 -2 29163 0.0284 271.5765 0003396 102.7062 249.9736 1.00270607 40039 -GALAXY 16 (G-16) -1 29236U 06023A 17117.37549479 -.00000139 00000-0 00000-0 0 9992 -2 29236 0.0137 249.4336 0002744 159.5844 202.7179 1.00273983 39765 -EUTELSAT HOT BIRD 13B -1 29270U 06032A 17117.87757578 .00000073 00000-0 00000-0 0 9992 -2 29270 0.0853 323.7507 0005202 55.9991 165.2138 1.00269811 13864 -JCSAT-3A -1 29272U 06033A 17117.92285122 -.00000358 00000-0 00000-0 0 9999 -2 29272 0.0152 267.6496 0001703 146.7151 261.9523 1.00268065 14278 -SYRACUSE 3B -1 29273U 06033B 17117.95206821 -.00000057 00000-0 00000-0 0 9998 -2 29273 0.0117 305.8412 0004801 73.2201 174.6100 1.00272538 39251 -KOREASAT 5 (MUGUNGWHA 5) -1 29349U 06034A 17117.83243694 -.00000371 00000-0 00000-0 0 9998 -2 29349 0.0159 73.3539 0000675 38.0463 157.3403 1.00270107 7857 -ZHONGXING-22A -1 29398U 06038A 17117.90552795 -.00000330 00000-0 00000-0 0 9994 -2 29398 5.7030 58.0665 0001808 254.5274 331.2123 1.00269188 38948 -DIRECTV 9S -1 29494U 06043A 17117.42410554 -.00000126 00000-0 00000-0 0 9993 -2 29494 0.0134 226.1841 0003130 166.9350 234.0600 1.00272237 17938 -OPTUS D1 -1 29495U 06043B 17117.72549699 -.00000123 00000-0 00000-0 0 9997 -2 29495 0.0559 82.6865 0003257 310.8258 243.5612 1.00271121 38659 -XM-4 (BLUES) -1 29520U 06049A 17117.43382691 -.00000035 00000-0 00000-0 0 9999 -2 29520 0.0031 28.1297 0000042 71.0407 157.3869 1.00271409 38529 -BADR-4 -1 29526U 06051A 17117.87271644 .00000131 00000-0 00000-0 0 9997 -2 29526 0.0517 336.9457 0005039 20.5747 198.6813 1.00271332 17843 -FENGYUN 2D -1 29640U 06053A 17117.90188513 -.00000371 00000-0 10000-3 0 9993 -2 29640 4.3605 64.6207 0004790 342.3052 257.6462 1.00276521 38091 -WILDBLUE-1 -1 29643U 06054A 17117.50219032 -.00000061 00000-0 00000-0 0 9996 -2 29643 0.0414 97.9911 0001463 294.5324 252.7651 1.00271160 20338 -AMC-18 -1 29644U 06054B 17117.42896751 -.00000101 00000-0 00000-0 0 9992 -2 29644 0.0132 78.3974 0002385 317.0840 229.5778 1.00269595 38123 -MEASAT-3 -1 29648U 06056A 17117.80227965 -.00000255 00000-0 00000-0 0 9995 -2 29648 0.0631 111.3791 0002369 340.0316 144.9012 1.00271711 16997 -INSAT-4B -1 30793U 07007A 17117.91091101 -.00000272 00000-0 00000-0 0 9997 -2 30793 0.0102 238.0917 0006804 182.6519 216.7794 1.00273110 8747 -SKYNET 5A -1 30794U 07007B 17117.79952494 -.00000285 00000-0 00000-0 0 9999 -2 30794 0.0706 15.9449 0003541 24.0039 199.0655 1.00272385 37239 -ANIK F3 -1 31102U 07009A 17117.38881730 -.00000013 00000-0 00000-0 0 9993 -2 31102 0.0113 269.6619 0001772 130.0690 197.1072 1.00273748 36861 -ASTRA 1L -1 31306U 07016A 17117.87757578 .00000106 00000-0 00000-0 0 9995 -2 31306 0.0648 307.2017 0003507 42.3918 201.5543 1.00269925 11618 -GALAXY 17 (G-17) -1 31307U 07016B 17117.45037390 -.00000186 00000-0 00000-0 0 9992 -2 31307 0.0491 57.1226 0003199 345.3070 244.3425 1.00272232 36481 -ZHONGXING-6B -1 31800U 07031A 17117.91197160 -.00000375 00000-0 00000-0 0 9990 -2 31800 0.0154 291.8261 0002141 84.2496 283.8270 1.00272103 35974 -DIRECTV 10 -1 31862U 07032A 17116.68879987 -.00000114 00000-0 00000-0 0 9997 -2 31862 0.0137 292.6008 0000413 351.9429 75.4605 1.00273325 12161 -SPACEWAY 3 -1 32018U 07036A 17117.37549479 -.00000163 00000-0 00000-0 0 9996 -2 32018 0.0452 73.0857 0000335 196.3082 346.3893 1.00271258 13126 -BSAT-3A -1 32019U 07036B 17117.09682664 -.00000362 00000-0 00000-0 0 9991 -2 32019 0.0374 193.0130 0000772 61.0105 105.9763 1.00270919 17038 -INSAT-4CR -1 32050U 07037A 17117.90644390 .00000112 00000-0 00000-0 0 9993 -2 32050 0.0822 94.4984 0003071 282.0344 213.7044 1.00273401 17935 -OPTUS D2 -1 32252U 07044A 17117.84198639 -.00000196 00000-0 00000-0 0 9991 -2 32252 0.0450 83.1917 0003434 311.3426 276.6057 1.00271653 35116 -INTELSAT 11 (IS-11) -1 32253U 07044B 17117.65367050 -.00000281 00000-0 00000-0 0 9991 -2 32253 0.0345 130.9941 0001493 256.5767 20.6001 1.00273233 35133 -STAR ONE C1 -1 32293U 07056A 17116.58402931 -.00000287 00000-0 00000-0 0 9993 -2 32293 0.0333 89.4449 0002673 317.0484 313.5379 1.00272180 18318 -SKYNET 5B -1 32294U 07056B 17117.87271644 .00000129 00000-0 00000-0 0 9996 -2 32294 0.0693 1.4218 0003641 32.0755 161.8121 1.00271567 34750 -ASTRA 4A (SIRIUS 4) -1 32299U 07057A 17117.88243532 .00000019 00000-0 00000-0 0 9996 -2 32299 0.0186 62.3217 0002505 324.2792 151.9313 1.00268930 18241 -HORIZONS-2 -1 32388U 07063B 17117.80488368 -.00000195 00000-0 00000-0 0 9998 -2 32388 0.0119 290.0196 0002884 106.1771 194.3778 1.00270749 34397 -THURAYA-3 -1 32404U 08001A 17117.90604911 -.00000319 00000-0 00000-0 0 9993 -2 32404 4.0792 353.2407 0004382 32.7683 254.7415 1.00272108 34058 -EXPRESS-AM33 -1 32478U 08003A 17117.91091100 -.00000294 00000-0 00000-0 0 9999 -2 32478 0.0102 294.7657 0000819 170.9054 174.8209 1.00270238 34150 -THOR 5 -1 32487U 08006A 17117.88730039 -.00000022 00000-0 00000-0 0 9998 -2 32487 0.0160 246.7298 0002401 149.3993 138.6041 1.00270712 33847 -KIZUNA (WINDS) -1 32500U 08007A 17117.90533324 -.00000271 00000-0 00000-0 0 9992 -2 32500 0.7277 90.4811 0002917 317.8243 276.6776 1.00272422 33439 -AMC-14 -1 32708U 08011A 17117.16471829 .00000093 00000-0 00000-0 0 9997 -2 32708 19.0270 63.6120 0041593 354.6375 234.3843 1.00276074 34623 -DIRECTV 11 -1 32729U 08013A 17117.42410554 -.00000138 00000-0 00000-0 0 9990 -2 32729 0.0038 299.0058 0000098 75.2139 254.8818 1.00271660 33468 -ICO G1 -1 32763U 08016A 17117.46492965 -.00000187 00000-0 00000-0 0 9995 -2 32763 3.8597 354.3737 0003236 44.7954 250.9892 1.00273047 33111 -VINASAT-1 -1 32767U 08018A 17117.03573191 -.00000340 00000-0 00000-0 0 9996 -2 32767 0.0028 292.5882 0001442 113.5214 313.9022 1.00271211 33158 -STAR ONE C2 -1 32768U 08018B 17116.59793540 -.00000275 00000-0 00000-0 0 9996 -2 32768 0.0606 113.4158 0003130 331.3196 275.3092 1.00271166 33217 -TIANLIAN 1-01 -1 32779U 08019A 17117.86096794 -.00000150 00000-0 10000-3 0 9993 -2 32779 2.6970 76.3341 0034842 233.7714 295.9543 1.00270881 33006 -AMOS-3 -1 32794U 08022A 17117.96761240 -.00000049 00000-0 00000-0 0 9993 -2 32794 0.0155 234.8143 0002036 123.3092 202.2394 1.00270513 48917 -GALAXY 18 (G-18) -1 32951U 08024A 17116.74457174 .00000014 00000-0 00000-0 0 9994 -2 32951 0.0140 219.4846 0003215 187.1833 313.3589 1.00271659 32618 -CHINASAT 9 (ZX 9) -1 33051U 08028A 17117.97324649 -.00000261 00000-0 00000-0 0 9991 -2 33051 0.0047 285.5177 0003738 111.7774 261.4213 1.00271797 32546 -SKYNET 5C -1 33055U 08030A 17117.90377468 -.00000153 00000-0 00000-0 0 9998 -2 33055 0.0658 1.4967 0003395 52.2411 109.8755 1.00270172 32504 -TURKSAT 3A -1 33056U 08030B 17117.93521792 .00000132 00000-0 00000-0 0 9999 -2 33056 0.0666 84.4947 0004842 320.2943 190.0067 1.00274651 18899 -INTELSAT 25 (IS-25) -1 33153U 08034A 17117.48848125 -.00000236 00000-0 00000-0 0 9999 -2 33153 0.0046 230.1087 0002637 145.1540 344.7532 1.00270445 32170 -BADR-6 -1 33154U 08034B 17117.73656907 .00000132 00000-0 00000-0 0 9997 -2 33154 0.0600 40.1248 0005610 3.9615 103.0181 1.00275592 32290 -ECHOSTAR 11 -1 33207U 08035A 17116.70871715 -.00000067 00000-0 00000-0 0 9997 -2 33207 0.0522 80.5222 0002800 325.2483 314.2613 1.00271502 17783 -SUPERBIRD-C2 -1 33274U 08038A 17117.84214854 -.00000264 00000-0 00000-0 0 9994 -2 33274 0.0127 280.6787 0000851 99.0281 283.4318 1.00273085 72264 -AMC-21 -1 33275U 08038B 17117.43868888 .00000024 00000-0 00000-0 0 9995 -2 33275 0.0631 75.9926 0002536 332.5006 200.1490 1.00270678 32029 -INMARSAT 4-F3 -1 33278U 08039A 17117.42410554 -.00000151 00000-0 00000-0 0 9993 -2 33278 3.0225 0.9699 0002772 39.4011 229.9191 1.00272916 31797 -NIMIQ 4 -1 33373U 08044A 17117.50551885 -.00000232 00000-0 00000-0 0 9997 -2 33373 0.0217 277.7598 0002327 122.9872 274.8937 1.00269859 31500 -GALAXY 19 (G-19) -1 33376U 08045A 17116.67266587 -.00000149 00000-0 00000-0 0 9997 -2 33376 0.0117 257.7656 0002598 137.0528 325.2075 1.00269365 31483 -VENESAT-1 -1 33414U 08055A 17117.49768817 -.00000250 00000-0 00000-0 0 9998 -2 33414 0.0190 265.8945 0001514 151.7876 259.1381 1.00272877 31212 -ASTRA 1M -1 33436U 08057A 17117.87757578 .00000107 00000-0 00000-0 0 9998 -2 33436 0.0084 236.1458 0003096 214.5664 100.4560 1.00274229 12284 -CIEL-2 -1 33453U 08063A 17117.45309159 .00000046 00000-0 00000-0 0 9998 -2 33453 0.0342 99.5233 0002719 298.0751 212.2897 1.00271967 30693 -EUTELSAT HOT BIRD 13C -1 33459U 08065A 17117.36532475 .00000074 00000-0 00000-0 0 9996 -2 33459 0.0529 327.2582 0005238 87.9989 304.8003 1.00269480 13911 -EUTELSAT 48D -1 33460U 08065B 17117.90644359 .00000111 00000-0 00000-0 0 9995 -2 33460 0.0689 52.8634 0001497 344.9353 192.6858 1.00269366 30567 -FENGYUN 2E -1 33463U 08066A 17117.86649177 -.00000218 00000-0 00000-0 0 9996 -2 33463 2.0878 66.6220 0003340 220.4014 328.0984 1.00269577 30623 -EXPRESS-AM44 -1 33595U 09007A 17117.60674503 -.00000101 00000-0 00000-0 0 9992 -2 33595 0.0039 303.3145 0001238 159.7809 320.1259 1.00272521 30095 -NSS-9 -1 33749U 09008A 17117.66734164 .00000059 00000-0 00000-0 0 9991 -2 33749 0.0188 55.3374 0001884 333.7401 250.0431 1.00270547 30053 -EUTELSAT 33E -1 33750U 09008B 17117.93521792 .00000142 00000-0 00000-0 0 9997 -2 33750 0.0623 68.7867 0001587 324.4533 192.6223 1.00272907 29990 -TELSTAR 11N -1 34111U 09009A 17117.72585248 -.00000263 00000-0 00000-0 0 9998 -2 34111 0.0148 260.4364 0002369 113.1434 66.0677 1.00269133 12771 -EUTELSAT 10A -1 34710U 09016A 17117.88243532 .00000055 00000-0 00000-0 0 9993 -2 34710 0.0690 10.5032 0005323 25.7183 147.4880 1.00272154 7799 -SES-7 (PROTOSTAR 2) -1 34941U 09027A 17117.90604911 -.00000358 00000-0 00000-0 0 9993 -2 34941 0.0620 78.3407 0001694 224.2225 347.9624 1.00271474 29179 -MEASAT-3A -1 35362U 09032A 17117.14778016 -.00000253 00000-0 00000-0 0 9995 -2 35362 0.0304 214.6134 0000072 255.9562 249.4394 1.00269246 28771 -GOES 14 -1 35491U 09033A 17116.69224996 -.00000105 00000-0 00000-0 0 9997 -2 35491 0.1660 103.8623 0004668 130.2036 125.8996 1.00271284 28688 -SIRIUS FM-5 -1 35493U 09034A 17117.48990042 -.00000212 00000-0 00000-0 0 9999 -2 35493 0.0137 277.4101 0001070 63.8866 324.5728 1.00268563 28501 -TERRESTAR-1 -1 35496U 09035A 17116.66440281 -.00000070 00000-0 00000-0 0 9999 -2 35496 2.9355 343.4206 0003037 52.3565 307.2458 1.00272152 28700 -ASIASAT 5 -1 35696U 09042A 17117.97022532 -.00000321 00000-0 00000-0 0 9998 -2 35696 0.0041 243.9910 0001381 126.5521 295.3830 1.00271634 28205 -JCSAT-RA (JCSAT-12) -1 35755U 09044A 17117.04681684 -.00000357 00000-0 00000-0 0 9992 -2 35755 0.0660 64.2889 0000742 358.6905 297.0366 1.00270836 28151 -OPTUS D3 -1 35756U 09044B 17117.76236484 -.00000160 00000-0 00000-0 0 9998 -2 35756 0.0504 41.6616 0004002 343.4132 261.3023 1.00270896 28108 -PALAPA D -1 35812U 09046A 17117.08831145 -.00000370 00000-0 00000-0 0 9996 -2 35812 0.0175 316.1497 0001952 115.7115 288.1684 1.00272761 28219 -NIMIQ 5 -1 35873U 09050A 17117.52575233 -.00000269 00000-0 00000-0 0 9997 -2 35873 0.0517 89.3804 0001855 304.0795 298.8058 1.00270995 27899 -AMAZONAS 2 -1 35942U 09054A 17117.94904992 -.00000295 00000-0 00000-0 0 9991 -2 35942 0.0573 106.6638 0003096 331.7094 58.4163 1.00271569 27732 -COMSATBW-1 -1 35943U 09054B 17117.92549392 .00000011 00000-0 00000-0 0 9994 -2 35943 0.0569 80.7719 0002429 325.3108 206.1675 1.00270661 27848 -NSS-12 -1 36032U 09058A 17117.24337260 .00000059 00000-0 00000-0 0 9994 -2 36032 0.0444 79.1380 0002824 327.4447 313.4490 1.00273282 27483 -THOR 6 -1 36033U 09058B 17117.88730039 -.00000023 00000-0 00000-0 0 9998 -2 36033 0.0279 137.2384 0001915 285.2981 112.1018 1.00272109 27571 -INTELSAT 14 (IS-14) -1 36097U 09064A 17116.52862781 -.00000284 00000-0 00000-0 0 9994 -2 36097 0.0184 268.3720 0002200 122.4376 329.2124 1.00272664 27232 -EUTELSAT 36B -1 36101U 09065A 17117.93521792 .00000142 00000-0 00000-0 0 9993 -2 36101 0.0699 10.5563 0004447 29.0687 189.0472 1.00271731 27268 -INTELSAT 15 (IS-15) -1 36106U 09067A 17117.91577310 -.00000199 00000-0 00000-0 0 9998 -2 36106 0.0081 295.5587 0002095 84.5430 250.8097 1.00272075 7842 -DIRECTV 12 -1 36131U 09075A 17117.43745505 -.00000115 00000-0 00000-0 0 9993 -2 36131 0.0088 230.3254 0000208 100.9137 299.0622 1.00271978 13135 -BEIDOU G1 -1 36287U 10001A 17117.80604922 -.00000298 00000-0 00000-0 0 9996 -2 36287 1.4997 356.9041 0001858 169.8506 119.4197 1.00275049 26708 -RADUGA-1M 2 -1 36358U 10002A 17117.91577310 -.00000197 00000-0 00000-0 0 9996 -2 36358 0.0265 259.9308 0002762 176.8821 193.9495 1.00272745 16641 -SDO -1 36395U 10005A 17117.15685212 -.00000038 00000-0 00000-0 0 9991 -2 36395 28.7064 141.3349 0000822 160.5379 228.1754 1.00273335 26598 -INTELSAT 16 (IS-16) -1 36397U 10006A 17117.50257694 -.00000297 00000-0 00000-0 0 9999 -2 36397 0.0407 74.1133 0001438 320.2455 304.1440 1.00270075 26261 -GOES 15 -1 36411U 10008A 17116.77924873 .00000079 00000-0 00000-0 0 9993 -2 36411 0.1007 105.4333 0002141 51.6756 202.9092 1.00273183 26212 -ECHOSTAR 14 -1 36499U 10010A 17117.43382691 -.00000011 00000-0 00000-0 0 9999 -2 36499 0.0075 247.9280 0002691 143.7121 221.2482 1.00270298 26068 -SES-1 -1 36516U 10016A 17117.42410554 -.00000126 00000-0 00000-0 0 9991 -2 36516 0.0278 18.1781 0002366 20.7458 228.3562 1.00270095 25660 -ASTRA 3B -1 36581U 10021A 17117.87271644 .00000124 00000-0 00000-0 0 9990 -2 36581 0.0432 330.2361 0002689 69.1047 154.3873 1.00274085 25414 -COMSATBW-2 -1 36582U 10021B 17117.87757578 .00000075 00000-0 00000-0 0 9991 -2 36582 0.0510 276.3921 0001891 131.8986 136.9064 1.00267423 25514 -BEIDOU G3 -1 36590U 10024A 17117.67045698 -.00000368 00000-0 00000-0 0 9990 -2 36590 1.3180 18.5970 0006088 326.0782 222.9550 1.00277245 25312 -BADR-5 -1 36592U 10025A 17117.87271644 .00000132 00000-0 00000-0 0 9995 -2 36592 0.0123 239.2096 0000973 198.6999 118.3271 1.00274636 19758 -COMS 1 -1 36744U 10032A 17117.92285057 -.00000358 00000-0 00000-0 0 9992 -2 36744 0.0164 339.3925 0000715 58.1991 278.9481 1.00270053 17620 -ARABSAT-5A -1 36745U 10032B 17117.87271644 .00000140 00000-0 00000-0 0 9992 -2 36745 0.0584 18.9464 0003442 17.8345 163.9159 1.00271928 25187 -ECHOSTAR 15 -1 36792U 10034A 17117.94904992 -.00000295 00000-0 00000-0 0 9995 -2 36792 0.0056 53.3360 0002283 353.0150 89.7709 1.00273189 24919 -NILESAT 201 -1 36830U 10037A 17117.93951064 -.00000071 00000-0 00000-0 0 9994 -2 36830 0.0583 144.6297 0005672 263.4862 139.2100 1.00271361 24904 -RASCOM-QAF 1R -1 36831U 10037B 17117.39331280 .00000006 00000-0 00000-0 0 9994 -2 36831 0.0111 350.6026 0004788 41.6602 327.7746 1.00272046 24840 -CHINASAT 6A (ZX 6A) -1 37150U 10042A 17117.91114970 -.00000367 00000-0 00000-0 0 9999 -2 37150 0.0581 106.1080 0001184 67.0333 136.0136 1.00270307 24437 -QZS-1 (MICHIBIKI) -1 37158U 10045A 17115.76142302 -.00000112 00000-0 00000-0 0 9999 -2 37158 40.8186 160.0853 0750436 269.9548 192.8060 1.00297829 24239 -XM-5 -1 37185U 10053A 17117.46953410 -.00000216 00000-0 00000-0 0 9992 -2 37185 0.0117 256.8702 0001078 78.1805 324.4069 1.00268665 24020 -BSAT-3B -1 37207U 10056B 17117.89503390 -.00000364 00000-0 00000-0 0 9999 -2 37207 0.0454 341.8804 0003663 6.9486 299.3078 1.00270205 18793 -BEIDOU G4 -1 37210U 10057A 17117.76246394 -.00000124 00000-0 00000-0 0 9992 -2 37210 0.9656 54.3339 0003841 172.9399 63.1553 1.00271291 23825 -SKYTERRA 1 -1 37218U 10061A 17116.60056793 -.00000132 00000-0 00000-0 0 9998 -2 37218 3.2871 330.0501 0002233 147.5523 212.0774 1.00271870 23737 -ZHONGXING-20A -1 37234U 10064A 17117.87039238 -.00000350 00000-0 00000-0 0 9996 -2 37234 0.0620 95.7045 0004322 289.9676 273.7816 1.00272884 23569 -HYLAS 1 -1 37237U 10065A 17117.83369663 -.00000247 00000-0 00000-0 0 9999 -2 37237 0.0472 45.2672 0001425 331.7377 105.5945 1.00269992 23525 -INTELSAT 17 (IS-17) -1 37238U 10065B 17117.92063499 -.00000015 00000-0 00000-0 0 9991 -2 37238 0.0120 197.5351 0002594 199.8870 216.0897 1.00272484 19967 -EUTELSAT KA-SAT 9A -1 37258U 10069A 17117.37622919 .00000049 00000-0 00000-0 0 9990 -2 37258 0.0367 283.7356 0001491 142.3790 293.9091 1.00267329 10585 -HISPASAT 1E -1 37264U 10070A 17117.87665264 -.00000229 00000-0 00000-0 0 9995 -2 37264 0.0525 96.3906 0003136 325.4404 79.8470 1.00272804 19722 -KOREASAT 6 -1 37265U 10070B 17117.91197160 -.00000375 00000-0 00000-0 0 9998 -2 37265 0.0170 279.1405 0001646 104.2323 276.9987 1.00268575 23314 -ELEKTRO-L 1 (GOMS 2) -1 37344U 11001A 17116.72182454 -.00000262 00000-0 00000-0 0 9994 -2 37344 2.3349 78.1422 0004268 279.1164 80.8735 1.00219570 22996 -BEIDOU IGSO 3 -1 37384U 11013A 17117.78745964 -.00000184 00000-0 10000-3 0 9996 -2 37384 57.7663 73.4599 0027726 212.8974 334.3089 1.00276456 22213 -INTELSAT NEW DAWN -1 37392U 11016A 17117.93521792 .00000142 00000-0 00000-0 0 9995 -2 37392 0.0117 205.6738 0000543 216.8099 163.1012 1.00271560 19830 -YAHSAT 1A -1 37393U 11016B 17117.93119845 .00000088 00000-0 00000-0 0 9997 -2 37393 0.0179 259.9300 0001479 127.4595 216.4307 1.00271346 8944 -TELSTAR 14R -1 37602U 11021A 17117.50743608 -.00000292 00000-0 00000-0 0 9997 -2 37602 0.0459 59.7302 0001570 298.7625 336.8587 1.00272032 22388 -GSAT-8 -1 37605U 11022A 17117.93073531 .00000072 00000-0 00000-0 0 9994 -2 37605 0.0108 283.1636 0005146 27.0154 296.0193 1.00271518 19753 -ST-2 -1 37606U 11022B 17117.91091101 -.00000224 00000-0 00000-0 0 9996 -2 37606 0.0101 261.5616 0001301 132.3951 238.0288 1.00267464 21804 -CHINASAT 10 (ZX 10) -1 37677U 11026A 17117.97787924 -.00000365 00000-0 00000-0 0 9995 -2 37677 0.0564 272.7688 0001725 241.5890 164.3047 1.00267633 21502 -TIANLIAN 1-02 -1 37737U 11032A 17117.61309976 .00000019 00000-0 00000-0 0 9992 -2 37737 2.4866 77.5850 0006484 221.9875 313.7441 1.00275906 21256 -GSAT-12 -1 37746U 11034A 17117.72217826 -.00000178 00000-0 00000-0 0 9995 -2 37746 0.0901 272.8214 0006239 174.9296 111.1204 1.00271717 21495 -SES-3 -1 37748U 11035A 17117.43745505 -.00000114 00000-0 00000-0 0 9996 -2 37748 0.0177 302.7166 0002682 50.7149 276.6645 1.00271757 21149 -ASTRA 1N -1 37775U 11041A 17117.87757578 .00000107 00000-0 00000-0 0 9995 -2 37775 0.0554 18.0423 0005350 27.9821 145.1783 1.00274721 11077 -BSAT-3C (JCSAT-110R) -1 37776U 11041B 17117.89503576 -.00000364 00000-0 00000-0 0 9991 -2 37776 0.0576 84.0912 0000217 190.2485 13.8797 1.00266863 17031 -PAKSAT-1R -1 37779U 11042A 17117.93521792 .00000140 00000-0 00000-0 0 9991 -2 37779 0.0629 73.4343 0004076 308.4154 208.9378 1.00274117 21012 -CHINASAT 1A (ZX 1A) -1 37804U 11047A 17117.87039470 -.00000350 00000-0 00000-0 0 9999 -2 37804 0.0273 272.1799 0000913 65.3862 321.7566 1.00275859 20612 -COSMOS 2473 -1 37806U 11048A 17117.60743946 -.00000120 00000-0 00000-0 0 9998 -2 37806 0.0669 95.8155 0002864 339.6820 345.4748 1.00272194 20600 -SES-2 -1 37809U 11049A 17117.48990098 -.00000208 00000-0 00000-0 0 9997 -2 37809 0.0141 328.8399 0002340 44.5301 291.6604 1.00272640 20555 -ARABSAT-5C -1 37810U 11049B 17117.87757578 .00000110 00000-0 00000-0 0 9997 -2 37810 0.0669 4.1487 0002727 25.0467 162.7740 1.00269352 20599 -EUTELSAT 7 WEST A -1 37816U 11051A 17117.42128247 -.00000072 00000-0 00000-0 0 9990 -2 37816 0.0694 31.1553 0001349 108.6052 220.2572 1.00270407 20444 -QUETZSAT 1 -1 37826U 11054A 17117.51879441 -.00000253 00000-0 00000-0 0 9994 -2 37826 0.0219 327.2838 0002403 88.7113 269.4509 1.00269735 20628 -INTELSAT 18 (IS-18) -1 37834U 11056A 17117.53193792 .00000041 00000-0 00000-0 0 9999 -2 37834 0.0068 229.8026 0002114 179.8429 177.5687 1.00272990 20382 -EUTELSAT 16A -1 37836U 11057A 17117.14074610 .00000092 00000-0 00000-0 0 9992 -2 37836 0.0699 355.7484 0004693 50.2941 235.9497 1.00274120 20314 -VIASAT-1 -1 37843U 11059A 17117.43382691 -.00000035 00000-0 00000-0 0 9993 -2 37843 0.0188 251.6787 0002343 138.8216 226.1763 1.00269094 13867 -ASIASAT 7 -1 37933U 11069A 17117.89641398 -.00000347 00000-0 00000-0 0 9992 -2 37933 0.0094 244.0736 0001486 113.0125 287.1521 1.00268057 11397 -LUCH 5A -1 37951U 11074B 17117.77595258 -.00000056 00000-0 00000-0 0 9995 -2 37951 1.5532 186.1735 0004021 190.4387 285.6345 1.00273438 19723 -NIGCOMSAT 1R -1 38014U 11077A 17117.93521792 .00000131 00000-0 00000-0 0 9992 -2 38014 0.0555 68.5274 0000317 264.1502 262.6266 1.00274849 19494 -FENGYUN 2F -1 38049U 12002A 17117.73436551 -.00000369 00000-0 00000-0 0 9999 -2 38049 1.6134 77.9514 0002913 170.6678 343.7793 1.00276058 19425 -SES-4 -1 38087U 12007A 17116.07248362 -.00000178 00000-0 00000-0 0 9991 -2 38087 0.0263 350.4261 0002489 35.4688 192.4674 1.00272096 19007 -BEIDOU G5 -1 38091U 12008A 17117.92856885 .00000044 00000-0 00000-0 0 9998 -2 38091 2.1332 55.6291 0002532 232.8854 320.5169 1.00269735 19016 -INTELSAT 22 (IS-22) -1 38098U 12011A 17117.20149384 -.00000070 00000-0 00000-0 0 9999 -2 38098 0.0272 356.9410 0001823 55.0491 308.0346 1.00270100 18371 -APSTAR 7 -1 38107U 12013A 17116.84702259 -.00000113 00000-0 00000-0 0 9995 -2 38107 0.0320 125.7547 0002588 267.8390 202.8751 1.00272168 18691 -YAHSAT 1B -1 38245U 12016A 17117.26938155 .00000114 00000-0 00000-0 0 9994 -2 38245 0.0031 214.7897 0001569 173.0469 332.1800 1.00270865 12163 -JCSAT-13 -1 38331U 12023A 17117.05777120 -.00000368 00000-0 00000-0 0 9990 -2 38331 0.0129 258.0570 0001334 147.6302 314.3237 1.00267968 18060 -VINASAT-2 -1 38332U 12023B 17117.64007542 -.00000342 00000-0 00000-0 0 9992 -2 38332 0.0110 282.0783 0001992 130.7094 165.2828 1.00269450 18141 -NIMIQ 6 -1 38342U 12026A 17116.65634662 -.00000184 00000-0 00000-0 0 9999 -2 38342 0.0392 68.8520 0002575 326.3621 324.8119 1.00271529 16964 -CHINASAT 2A (ZX 2A) -1 38352U 12028A 17117.79735200 -.00000306 00000-0 00000-0 0 9994 -2 38352 0.0255 274.6431 0004263 81.4650 245.1493 1.00273607 17913 -INTELSAT 19 (IS-19) -1 38356U 12030A 17116.94139020 -.00000067 00000-0 00000-0 0 9999 -2 38356 0.0243 350.4509 0003266 51.9359 317.6470 1.00273890 17007 -ECHOSTAR 17 -1 38551U 12035A 17116.70064796 -.00000086 00000-0 00000-0 0 9993 -2 38551 0.0215 243.8276 0001996 148.0054 328.1791 1.00269580 17607 -METEOSAT-10 (MSG-3) -1 38552U 12035B 17117.40141041 -.00000016 00000-0 00000-0 0 9994 -2 38552 0.8005 51.9205 0000232 155.6438 152.4418 1.00277252 17424 -SES-5 -1 38652U 12036A 17116.07316208 .00000024 00000-0 00000-0 0 9995 -2 38652 0.0345 265.9011 0001928 133.9601 205.7209 1.00272673 17589 -TIANLIAN 1-03 -1 38730U 12040A 17117.37165398 .00000061 00000-0 00000-0 0 9994 -2 38730 0.0210 228.2696 0002588 201.3366 290.4296 1.00275726 15250 -INTELSAT 20 (IS-20) -1 38740U 12043A 17117.21132225 -.00000036 00000-0 00000-0 0 9997 -2 38740 0.0181 201.9596 0000365 354.5412 163.4981 1.00270108 17306 -HYLAS 2 -1 38741U 12043B 17117.31530424 .00000142 00000-0 00000-0 0 9999 -2 38741 0.0358 85.5005 0001540 303.3196 331.1965 1.00270951 17303 -INTELSAT 21 (IS-21) -1 38749U 12045A 17116.56463404 -.00000295 00000-0 00000-0 0 9998 -2 38749 0.0181 245.8931 0001867 145.4303 328.6878 1.00268873 17080 -ASTRA 2F -1 38778U 12051A 17117.32303741 .00000138 00000-0 00000-0 0 9994 -2 38778 0.0603 237.7861 0000791 5.2545 116.9595 1.00273058 7702 -GSAT-10 -1 38779U 12051B 17117.17132557 -.00000177 00000-0 00000-0 0 9997 -2 38779 0.0837 96.3840 0002273 318.9132 304.7324 1.00272366 16653 -INTELSAT 23 (IS-23) -1 38867U 12057A 17117.54805843 -.00000297 00000-0 00000-0 0 9990 -2 38867 0.0071 228.1720 0001560 160.0413 331.8029 1.00271038 16545 -BEIDOU G6 -1 38953U 12059A 17116.84216362 -.00000186 00000-0 10000-3 0 9993 -2 38953 1.5498 79.9483 0003323 181.2375 341.0710 1.00273276 16578 -LUCH 5B -1 38977U 12061A 17117.81477027 -.00000141 00000-0 00000-0 0 9994 -2 38977 3.4436 74.8585 0003385 316.8276 101.3060 1.00272803 16714 -YAMAL 300K -1 38978U 12061B 17117.66734164 .00000058 00000-0 00000-0 0 9992 -2 38978 0.0013 65.8483 0001186 158.6029 54.5753 1.00270004 16406 -STAR ONE C3 -1 38991U 12062A 17117.51230095 -.00000261 00000-0 00000-0 0 9993 -2 38991 0.0632 86.5787 0001403 291.9084 306.6125 1.00273422 16309 -EUTELSAT 21B -1 38992U 12062B 17117.34139536 .00000118 00000-0 00000-0 0 9993 -2 38992 0.0699 357.3051 0002481 57.2231 305.5028 1.00274556 16398 -ECHOSTAR 16 -1 39008U 12065A 17117.57160113 -.00000294 00000-0 00000-0 0 9991 -2 39008 0.0165 244.8235 0002036 147.0914 328.0975 1.00269141 16161 -CHINASAT 12 (ZX 12) -1 39017U 12067A 17117.75576133 -.00000219 00000-0 00000-0 0 9993 -2 39017 0.0142 289.9655 0002655 105.8268 179.6945 1.00269482 16045 -EUTELSAT 70B -1 39020U 12069A 17117.20584515 -.00000056 00000-0 00000-0 0 9991 -2 39020 0.0649 6.7979 0001899 50.2833 302.9452 1.00270932 16041 -YAMAL 402 -1 39022U 12070A 17117.16024598 .00000074 00000-0 10000-3 0 9993 -2 39022 0.0280 253.8595 0002296 162.7652 271.3062 1.00273295 16123 -SKYNET 5D -1 39034U 12075A 17117.93119845 .00000085 00000-0 00000-0 0 9994 -2 39034 0.0737 352.5704 0003301 43.2148 208.3101 1.00273364 15707 -MEXSAT 3 -1 39035U 12075B 17116.72193635 -.00000037 00000-0 00000-0 0 9998 -2 39035 0.0203 201.5722 0001203 185.8867 332.5563 1.00275171 15709 -TDRS 11 -1 39070U 13004A 17116.79061433 .00000074 00000-0 00000-0 0 9997 -2 39070 5.4615 328.7166 0009629 304.9713 54.7219 1.00268414 13220 -AMAZONAS 3 -1 39078U 13006A 17117.57030832 -.00000294 00000-0 00000-0 0 9998 -2 39078 0.0232 210.7990 0001017 170.7766 338.4364 1.00266020 11423 -AZERSPACE 1 -1 39079U 13006B 17117.27380132 .00000121 00000-0 00000-0 0 9995 -2 39079 0.0085 224.3879 0002026 199.2180 296.4148 1.00271387 15344 -EUTELSAT 117 WEST A -1 39122U 13012A 17116.72757230 -.00000024 00000-0 00000-0 0 9990 -2 39122 0.0082 293.0210 0002872 90.1407 336.8602 1.00271865 14986 -ANIK G1 -1 39127U 13014A 17116.70111460 -.00000085 00000-0 00000-0 0 9991 -2 39127 0.0128 268.8176 0001685 70.5411 20.6435 1.00271429 14798 -CHINASAT 11 (ZX 11) -1 39157U 13020A 17117.83729890 -.00000304 00000-0 00000-0 0 9992 -2 39157 0.0082 184.5590 0002293 122.6127 308.2587 1.00271445 14682 -EUTELSAT 7B -1 39163U 13022A 17117.38183232 .00000036 00000-0 00000-0 0 9996 -2 39163 0.0504 21.9676 0004772 349.0419 349.0090 1.00270125 14530 -SES-6 -1 39172U 13026A 17117.20327191 -.00000273 00000-0 00000-0 0 9999 -2 39172 0.0640 66.7789 0001644 342.8966 198.4033 1.00272157 14255 -IRNSS-1A -1 39199U 13034A 17117.56962913 .00000120 00000-0 00000-0 0 9993 -2 39199 28.7377 115.9038 0020747 189.5995 170.3742 1.00274229 13904 -ALPHASAT -1 39215U 13038A 17117.41305156 .00000126 00000-0 00000-0 0 9996 -2 39215 1.6566 29.6853 0001710 353.9133 5.5184 1.00270017 10580 -INSAT-3D -1 39216U 13038B 17117.17372789 -.00000169 00000-0 00000-0 0 9994 -2 39216 0.0454 86.7516 0001079 259.4051 13.8486 1.00274076 13654 -EUTELSAT 25B -1 39233U 13044A 17117.33066672 .00000131 00000-0 00000-0 0 9997 -2 39233 0.0650 50.4334 0001680 337.4043 332.1794 1.00272127 13174 -GSAT-7 -1 39234U 13044B 17116.19881661 -.00000088 00000-0 00000-0 0 9996 -2 39234 0.1051 98.1590 0002381 211.2129 50.6164 1.00272181 11886 -AMOS-4 -1 39237U 13045A 17117.22122427 -.00000004 00000-0 00000-0 0 9991 -2 39237 0.0467 110.7753 0001601 260.4183 348.8183 1.00271512 13490 -ASTRA 2E -1 39285U 13056A 17117.32231868 .00000138 00000-0 00000-0 0 9994 -2 39285 0.0782 50.0304 0002434 345.7492 324.2448 1.00272380 13009 -SIRIUS FM-6 -1 39360U 13058A 17116.72558332 -.00000027 00000-0 00000-0 0 9999 -2 39360 0.0061 263.1140 0000899 295.4476 161.4352 1.00269316 12878 -RADUGA-1M 3 -1 39375U 13062A 17117.92063499 -.00000052 00000-0 00000-0 0 9996 -2 39375 0.0052 229.1858 0002841 203.8969 184.4430 1.00272377 12661 -SES-8 -1 39460U 13071A 17116.14083076 -.00000279 00000-0 00000-0 0 9998 -2 39460 0.0201 267.7730 0002484 145.8360 306.4233 1.00268061 11045 -INMARSAT 5-F1 -1 39476U 13073A 17117.75465862 .00000015 00000-0 00000-0 0 9999 -2 39476 0.0142 258.5341 0000381 50.2184 241.4462 1.00270660 12130 -TKSAT-1 (TUPAC KATARI) -1 39481U 13075A 17117.48990183 -.00000207 00000-0 00000-0 0 9990 -2 39481 0.0155 74.9497 0002566 287.8256 302.0727 1.00271282 12372 -EXPRESS-AM5 -1 39487U 13077A 17117.23484271 -.00000292 00000-0 00000-0 0 9991 -2 39487 0.0173 321.1911 0000715 339.7770 139.0540 1.00272139 12900 -GSAT-14 -1 39498U 14001A 17116.19901211 -.00000088 00000-0 00000-0 0 9996 -2 39498 0.0776 270.5701 0004142 146.8407 302.6386 1.00272992 12090 -THAICOM 6 -1 39500U 14002A 17117.91577310 -.00000135 00000-0 00000-0 0 9994 -2 39500 0.0777 112.3510 0002332 331.0864 180.8359 1.00272357 11988 -TDRS 12 -1 39504U 14004A 17117.44786351 -.00000289 00000-0 00000-0 0 9995 -2 39504 6.0328 336.1590 0002577 40.5444 319.2879 1.00273341 10811 -ABS-2 -1 39508U 14006A 17117.19366995 -.00000099 00000-0 00000-0 0 9990 -2 39508 0.0316 71.7322 0003321 325.9744 322.3250 1.00273381 11859 -ATHENA-FIDUS -1 39509U 14006B 17117.29651905 .00000142 00000-0 00000-0 0 9998 -2 39509 0.0155 293.1760 0001216 102.3867 324.4536 1.00273106 11610 -TURKSAT 4A -1 39522U 14007A 17117.28486032 .00000134 00000-0 00000-0 0 9991 -2 39522 0.0276 270.9949 0002231 64.7257 24.2772 1.00270986 11534 -EXPRESS-AT1 -1 39612U 14010A 17117.57341089 .00000066 00000-0 00000-0 0 9993 -2 39612 0.0128 314.6617 0000418 181.6479 341.8679 1.00272751 11589 -EXPRESS-AT2 -1 39613U 14010B 17117.66619015 -.00000294 00000-0 00000-0 0 9995 -2 39613 0.0143 314.7677 0000300 306.2754 334.4739 1.00271132 11414 -AMAZONAS 4A -1 39616U 14011A 17117.57011408 -.00000295 00000-0 00000-0 0 9992 -2 39616 0.0865 75.8825 0005333 323.8685 320.2958 1.00271635 11231 -ASTRA 5B -1 39617U 14011B 17117.06942167 .00000143 00000-0 00000-0 0 9993 -2 39617 0.0498 315.1147 0002975 88.3285 228.3291 1.00275404 11392 -IRNSS-1B -1 39635U 14017A 17113.08129908 .00000063 00000-0 00000-0 0 9998 -2 39635 29.1906 295.7644 0019205 177.1796 182.7814 1.00278970 11295 -LUCH 5V -1 39727U 14023A 17117.91091100 -.00000285 00000-0 00000-0 0 9992 -2 39727 2.8046 299.0420 0002860 98.0777 241.5887 1.00268912529055 -KAZSAT-3 -1 39728U 14023B 17117.23911005 .00000048 00000-0 00000-0 0 9999 -2 39728 0.0123 272.7284 0001094 189.5235 257.7604 1.00272744 8989 -EUTELSAT 3B -1 39773U 14030A 17117.88243532 .00000007 00000-0 00000-0 0 9996 -2 39773 0.0799 324.9493 0001515 68.6682 143.2054 1.00271592 10612 -ASIASAT 8 -1 40107U 14046A 17117.41199892 -.00000045 00000-0 00000-0 0 9997 -2 40107 0.0024 76.2848 0000051 264.7857 18.9372 1.00272372 68693 -ASIASAT 6 -1 40141U 14052A 17117.91212845 -.00000375 00000-0 00000-0 0 9997 -2 40141 0.0105 217.3390 0000580 190.6922 256.3209 1.00269771 9598 -OPTUS 10 -1 40146U 14054A 17115.94963136 -.00000084 00000-0 00000-0 0 9998 -2 40146 0.1044 3.8346 0001507 26.0638 330.1195 1.00271492 9645 -MEASAT-3B -1 40147U 14054B 17116.15055614 -.00000252 00000-0 00000-0 0 9993 -2 40147 0.0381 27.5678 0002708 15.8995 316.5632 1.00269817 9435 -LUCH (OLYMP) -1 40258U 14058A 17117.83797624 .00000054 00000-0 00000-0 0 9999 -2 40258 0.0087 189.0678 0000499 215.2963 123.2120 1.00269973 9473 -HIMAWARI-8 -1 40267U 14060A 17117.01160997 -.00000288 00000-0 00000-0 0 9999 -2 40267 0.0115 305.2623 0000585 134.1294 280.6233 1.00269483 9298 -IRNSS-1C -1 40269U 14061A 17117.86747072 -.00000176 00000-0 00000-0 0 9996 -2 40269 3.1158 251.3666 0018891 8.4350 351.5616 1.00273379 9353 -INTELSAT 30 (IS-30) -1 40271U 14062A 17116.40940988 -.00000160 00000-0 00000-0 0 9993 -2 40271 0.0118 251.6237 0000981 220.4768 154.8191 1.00268509 9211 -ARSAT 1 -1 40272U 14062B 17117.53648071 -.00000272 00000-0 00000-0 0 9991 -2 40272 0.0107 186.5942 0000923 198.5210 311.9545 1.00271595 9412 -EXPRESS-AM6 -1 40277U 14064A 17117.65882578 .00000085 00000-0 00000-0 0 9994 -2 40277 0.0138 313.5286 0000453 133.7726 58.7090 1.00271456 9209 -GSAT-16 -1 40332U 14078A 17117.24884318 .00000073 00000-0 00000-0 0 9997 -2 40332 0.0956 88.4139 0006072 344.9104 286.7505 1.00272630 8661 -DIRECTV 14 -1 40333U 14078B 17117.42375833 -.00000137 00000-0 00000-0 0 9997 -2 40333 0.0136 264.8062 0000571 35.9934 328.1253 1.00271206 8695 -YAMAL 401 -1 40345U 14082A 17117.91091100 -.00000241 00000-0 00000-0 0 9997 -2 40345 0.0654 76.3877 0001419 19.5531 177.9986 1.00270015 8944 -ASTRA 2G -1 40364U 14089A 17117.32319888 .00000138 00000-0 00000-0 0 9990 -2 40364 0.0234 33.5213 0004638 8.8669 317.6476 1.00270810 8509 -FENGYUN 2G -1 40367U 14090A 17117.85407676 -.00000343 00000-0 00000-0 0 9995 -2 40367 0.5380 260.1505 0003624 324.6317 43.1079 1.00281078 8579 -INMARSAT 5-F2 -1 40384U 15005A 17117.21518361 -.00000297 00000-0 00000-0 0 9993 -2 40384 0.0203 252.2432 0000197 45.7643 299.8340 1.00269286 8201 -ABS-3A -1 40424U 15010A 17116.41198922 -.00000036 00000-0 00000-0 0 9993 -2 40424 0.0116 264.8307 0001947 55.9449 39.2196 1.00271079 7948 -EUTELSAT 115 WEST B -1 40425U 15010B 17116.72223496 -.00000036 00000-0 00000-0 0 9993 -2 40425 0.0186 95.2337 0000331 315.1453 309.6327 1.00272873 7939 -EXPRESS-AM7 -1 40505U 15012A 17117.16960516 .00000138 00000-0 00000-0 0 9996 -2 40505 0.0064 344.5860 0002487 34.1261 297.7362 1.00275825 7883 -IRNSS-1D -1 40547U 15018A 17116.91366651 -.00000329 00000-0 00000-0 0 9993 -2 40547 29.1719 295.8388 0019995 179.2718 180.6576 1.00269953 7524 -BEIDOU I1-S -1 40549U 15019A 17117.96584828 -.00000147 00000-0 00000-0 0 9998 -2 40549 54.4435 334.3431 0039420 181.7011 138.7710 1.00252691 7614 -THOR 7 -1 40613U 15022A 17117.40307496 -.00000021 00000-0 00000-0 0 9998 -2 40613 0.0383 105.6479 0002517 286.2239 328.1514 1.00271187 7366 -TURKMENALEM52E/MONACOSAT -1 40617U 15023A 17117.25711709 .00000091 00000-0 00000-0 0 9998 -2 40617 0.0175 325.9433 0002715 75.9132 318.1724 1.00273623 7371 -DIRECTV 15 -1 40663U 15026A 17116.68859506 -.00000114 00000-0 00000-0 0 9993 -2 40663 0.0207 127.5812 0000319 38.2844 194.1441 1.00269867 7064 -SKY MEXICO-1 -1 40664U 15026B 17116.62225059 -.00000245 00000-0 00000-0 0 9993 -2 40664 0.0205 247.0234 0001864 144.9356 328.0523 1.00270836 7087 -METEOSAT-11 (MSG-4) -1 40732U 15034A 17117.08970345 -.00000040 00000-0 00000-0 0 9997 -2 40732 1.9114 243.9311 0000818 126.2920 233.7403 1.00272959 6571 -STAR ONE C4 -1 40733U 15034B 17116.59788324 -.00000275 00000-0 00000-0 0 9997 -2 40733 0.0593 67.9083 0002756 322.8663 329.2505 1.00271429 6568 -INTELSAT 34 (IS-34) -1 40874U 15039A 17116.55763949 -.00000296 00000-0 00000-0 0 9993 -2 40874 0.0208 264.9248 0000929 306.7335 148.3451 1.00270112 6205 -EUTELSAT 8 WEST B -1 40875U 15039B 17117.42345163 -.00000078 00000-0 00000-0 0 9993 -2 40875 0.0691 10.4219 0003326 15.9044 333.6986 1.00272433 6226 -GSAT-6 -1 40880U 15041A 17117.17108562 -.00000177 00000-0 00000-0 0 9994 -2 40880 0.0407 117.2808 0006897 171.9963 70.6569 1.00272283 6189 -INMARSAT 5-F3 -1 40882U 15042A 17116.90362900 .00000038 00000-0 00000-0 0 9990 -2 40882 0.0217 254.3450 0000531 286.8364 178.8185 1.00266924 6096 -TJS-1 -1 40892U 15046A 17117.76234197 -.00000169 00000-0 00000-0 0 9992 -2 40892 0.0645 275.9785 0007248 110.7787 258.6129 1.00272774 6082 -EXPRESS-AM8 -1 40895U 15048A 17117.36575874 -.00000123 00000-0 00000-0 0 9993 -2 40895 0.0111 312.0010 0000876 151.7155 229.5053 1.00271905 5909 -BEIDOU I2-S -1 40938U 15053A 17117.98638063 -.00000149 00000-0 00000-0 0 9993 -2 40938 54.2759 297.2377 0048024 171.7126 197.1132 1.00262704 5908 -SKY MUSTER (NBN1A) -1 40940U 15054A 17116.01545583 -.00000289 00000-0 00000-0 0 9999 -2 40940 0.0165 262.2380 0001599 127.0372 330.7433 1.00270404 5815 -ARSAT 2 -1 40941U 15054B 17116.62830677 -.00000235 00000-0 00000-0 0 9999 -2 40941 0.0143 230.0093 0001199 169.4769 320.5225 1.00270092 5855 -MORELOS 3 -1 40946U 15056A 17116.63308841 -.00000065 00000-0 00000-0 0 9991 -2 40946 6.4893 329.7934 0001422 355.1217 4.7009 1.00271666 5818 -APSTAR 9 -1 40982U 15059A 17117.00782284 -.00000278 00000-0 00000-0 0 9999 -2 40982 0.0135 266.7880 0000646 37.6956 55.5188 1.00268881 5699 -TURKSAT 4B -1 40984U 15060A 17117.26277957 .00000103 00000-0 00000-0 0 9993 -2 40984 0.0407 82.9158 0001926 305.3905 331.7123 1.00270918 5658 -CHINASAT 2C (ZX 2C) -1 41021U 15063A 17117.98029328 -.00000337 00000-0 00000-0 0 9995 -2 41021 0.0228 3.6102 0002910 31.7047 277.1750 1.00271136 5542 -GSAT-15 -1 41028U 15065A 17117.14222039 -.00000270 00000-0 00000-0 0 9992 -2 41028 0.0941 95.1208 0002002 296.2375 328.6619 1.00271123 5393 -BADR-7 (ARABSAT-6B) -1 41029U 15065B 17117.32913298 .00000133 00000-0 00000-0 0 9994 -2 41029 0.0384 252.3668 0002656 5.3301 102.2814 1.00271742 5283 -LAOSAT 1 -1 41034U 15067A 17117.04518466 -.00000355 00000-0 00000-0 0 9996 -2 41034 0.0188 92.3060 0001025 168.4133 99.2691 1.00270248 5404 -TELSTAR 12V -1 41036U 15068A 17116.44551241 -.00000130 00000-0 00000-0 0 9991 -2 41036 0.0107 210.9633 0001939 182.5453 326.5037 1.00269236 5154 -CHINASAT 1C (ZX 1C) -1 41103U 15073A 17117.91577310 -.00000164 00000-0 00000-0 0 9997 -2 41103 0.0154 292.2913 0003094 24.0910 310.9089 1.00272200 5202 -ELEKTRO-L 2 -1 41105U 15074A 17117.47930025 -.00000109 00000-0 00000-0 0 9996 -2 41105 0.0633 57.2317 0002068 11.7263 35.2424 1.00271515 5058 -COSMOS 2513 -1 41121U 15075A 17117.97340459 -.00000152 00000-0 00000-0 0 9994 -2 41121 0.0750 86.4624 0003406 329.1409 231.2148 1.00271448 5131 -EXPRESS-AMU1 -1 41191U 15082A 17117.22701594 .00000144 00000-0 00000-0 0 9998 -2 41191 0.0060 169.0732 0001654 211.8824 312.2719 1.00272049 5032 -GAOFEN 4 -1 41194U 15083A 17117.76105369 -.00000347 00000-0 00000-0 0 9995 -2 41194 0.0117 267.4537 0002579 290.7035 37.4471 1.00268400 5027 -BELINTERSAT-1 -1 41238U 16001A 17117.93035581 .00000093 00000-0 10000-3 0 9993 -2 41238 0.0628 83.1705 0001160 327.4095 191.9288 1.00272658 4810 -IRNSS-1E -1 41241U 16003A 17114.42019644 -.00000250 00000-0 00000-0 0 9994 -2 41241 28.6979 115.6166 0019558 187.7326 172.2858 1.00266983 4599 -INTELSAT 29E (IS-29E) -1 41308U 16004A 17117.53973758 -.00000294 00000-0 00000-0 0 9997 -2 41308 0.0165 260.1902 0001517 130.3195 329.5068 1.00271007 4719 -EUTELSAT 9B -1 41310U 16005A 17117.37625115 .00000049 00000-0 00000-0 0 9991 -2 41310 0.0605 99.8657 0003897 238.1359 21.9899 1.00270040 4651 -SES-9 -1 41380U 16013A 17117.10119203 -.00000357 00000-0 00000-0 0 9997 -2 41380 0.0238 296.4856 0001279 110.7465 312.7871 1.00271312 4037 -EUTELSAT 65 WEST A -1 41382U 16014A 17116.58453580 -.00000287 00000-0 00000-0 0 9992 -2 41382 0.0551 25.0955 0001709 6.2524 328.6713 1.00271275 4091 -IRNSS-1F -1 41384U 16015A 17117.05156159 .00000143 00000-0 00000-0 0 9990 -2 41384 4.2636 266.3524 0021293 175.3013 184.5678 1.00273189 4226 -BEIDOU IGSO 6 -1 41434U 16021A 17117.96834563 -.00000144 00000-0 10000-3 0 9991 -2 41434 55.4786 72.9503 0027297 185.9302 41.3972 1.00281076 4021 -IRNSS-1G -1 41469U 16027A 17117.78335953 -.00000352 00000-0 00000-0 0 9991 -2 41469 4.3353 267.6502 0001500 91.8329 268.0492 1.00268747 3739 -JCSAT 2B -1 41471U 16028A 17115.97731134 -.00000175 00000-0 00000-0 0 9998 -2 41471 0.0118 225.9447 0001168 184.6949 309.3707 1.00271088 3637 -THAICOM 8 -1 41552U 16031A 17117.18387176 -.00000133 00000-0 00000-0 0 9994 -2 41552 0.0748 59.5254 0005015 334.6792 325.8361 1.00270339 3267 -INTELSAT 31 (IS-31) -1 41581U 16035A 17116.66719882 -.00000161 00000-0 00000-0 0 9996 -2 41581 0.0150 239.8780 0001963 347.7795 132.3347 1.00270876 3237 -BEIDOU G7 -1 41586U 16037A 17116.87553415 -.00000262 00000-0 00000-0 0 9996 -2 41586 1.3222 315.7013 0001712 293.1868 65.8440 1.00267877 3327 -ABS-2A (MONGOLSAT-1) -1 41588U 16038A 17116.19681341 -.00000094 00000-0 00000-0 0 9997 -2 41588 0.0157 231.2698 0002112 69.7991 58.9104 1.00270214 3242 -EUTELSAT 117 WEST B -1 41589U 16038B 17116.72794179 -.00000022 00000-0 00000-0 0 9992 -2 41589 0.0037 79.2052 0000311 315.9932 324.8037 1.00270169 3243 -BRISAT -1 41591U 16039A 17115.98705320 -.00000207 00000-0 00000-0 0 9998 -2 41591 0.0182 276.0775 0002212 115.7852 328.1602 1.00271398 3166 -ECHOSTAR 18 -1 41592U 16039B 17116.57392046 -.00000292 00000-0 00000-0 0 9996 -2 41592 0.0197 246.5186 0001839 132.7923 340.6961 1.00268628 3162 -TIANTONG-1 1 -1 41725U 16048A 17117.83660447 -.00000336 00000-0 00000-0 0 9996 -2 41725 4.6566 325.2565 0004940 49.1616 244.2138 1.00269197 2809 -JCSAT-16 -1 41729U 16050A 17116.95229038 -.00000103 00000-0 00000-0 0 9994 -2 41729 0.0203 249.8855 0001635 148.0981 322.0279 1.00270117 2609 -INTELSAT 36 (IS-36) -1 41747U 16053A 17116.91279094 -.00000036 00000-0 00000-0 0 9995 -2 41747 0.0369 52.7296 0001812 349.0469 210.4048 1.00271453 2498 -INTELSAT 33E (IS-33E) -1 41748U 16053B 17117.23496068 .00000037 00000-0 00000-0 0 9994 -2 41748 0.0100 284.9518 0001619 114.0329 321.0270 1.00271934 2791 -INSAT-3DR -1 41752U 16054A 17117.19603294 -.00000089 00000-0 00000-0 0 9994 -2 41752 0.0651 103.4437 0007168 178.8667 77.6178 1.00270745 2352 -GSAT-18 -1 41793U 16060A 17117.19645072 -.00000089 00000-0 00000-0 0 9996 -2 41793 0.0840 101.1864 0006877 347.6697 271.2308 1.00271944 2079 -SKY MUSTER 2 -1 41794U 16060B 17117.00010658 -.00000256 00000-0 00000-0 0 9999 -2 41794 0.0166 266.1328 0001344 117.3954 336.4865 1.00270195 2068 -HIMAWARI-9 -1 41836U 16064A 17117.01119582 -.00000286 00000-0 00000-0 0 9990 -2 41836 0.0381 83.4113 0000619 338.0844 298.5190 1.00271683 1724 -SHIJIAN-17 (SJ-17) -1 41838U 16065A 17117.89305606 -.00000127 00000-0 00000-0 0 9997 -2 41838 0.0725 75.9019 0002518 63.2129 200.5047 1.00166270 1765 -GOES 16 -1 41866U 16071A 17116.65187186 -.00000193 00000-0 00000-0 0 9992 -2 41866 0.0108 65.4581 0001555 322.9658 331.5936 1.00272028 1638 -TIANLIAN 1-04 -1 41869U 16072A 17117.02574821 -.00000122 00000-0 00000-0 0 9996 -2 41869 2.7637 290.2696 0006419 130.9138 240.2633 1.00271737 1845 -FENGYUN 4A -1 41882U 16077A 17117.97022532 -.00000316 00000-0 00000-0 0 9992 -2 41882 0.1121 266.7982 0002637 258.2444 139.9757 1.00277180 1511 -ECHOSTAR 19 -1 41893U 16079A 17116.67297528 -.00000149 00000-0 00000-0 0 9995 -2 41893 0.0207 244.9861 0001173 148.4643 326.5570 1.00269739 1255 -STAR ONE D1 -1 41904U 16082B 17116.63670930 -.00000221 00000-0 00000-0 0 9991 -2 41904 0.0427 96.2633 0002612 317.2641 306.5056 1.00273074 1300 -TJS-2 -1 41911U 17001A 17117.02735219 -.00000355 00000-0 00000-0 0 9995 -2 41911 0.7857 280.0160 0001843 187.9162 224.7105 1.00274108 1254 -HISPASAT 36W-1 -1 41942U 17006A 17117.26142550 -.00000205 00000-0 00000-0 0 9994 -2 41942 0.0482 72.1332 0002800 331.1091 240.3263 1.00272241 1057 -TELKOM 3S -1 41944U 17007A 17117.07423128 -.00000374 00000-0 00000-0 0 9996 -2 41944 0.0100 211.1653 0000799 228.6723 280.1715 1.00268401 678 -INTELSAT 32E (IS-32E) -1 41945U 17007B 17116.52353783 -.00000280 00000-0 00000-0 0 9991 -2 41945 0.0130 238.2968 0000536 340.9326 140.7667 1.00268437 774 -GLOBALSTAR M001 [-] -1 25162U 98008A 17117.94868854 -.00000002 00000-0 72632-3 0 9996 -2 25162 52.0051 342.9523 0002404 113.2078 350.3803 12.38086615875531 -GLOBALSTAR M004 [-] -1 25163U 98008B 17117.97479447 -.00000094 00000-0 53468-4 0 9994 -2 25163 51.9975 120.3912 0002984 180.9288 196.7471 12.63264234886013 -GLOBALSTAR M002 [-] -1 25164U 98008C 17117.84337763 -.00000065 00000-0 22583-3 0 9996 -2 25164 51.9984 132.4895 0001001 123.8311 236.2604 11.61460937838672 -GLOBALSTAR M003 [-] -1 25165U 98008D 17117.97597479 .00000027 00000-0 12470-2 0 9993 -2 25165 51.9807 121.1041 0006700 64.6158 310.6307 12.11920954872825 -GLOBALSTAR M014 [-] -1 25306U 98023A 17117.47331656 -.00000078 00000-0 -17505-4 0 9999 -2 25306 51.9810 119.0299 0000851 292.1855 237.0353 11.65411526844639 -GLOBALSTAR M006 [-] -1 25307U 98023B 17117.36160122 -.00000082 00000-0 -13048-3 0 9998 -2 25307 51.9950 60.7563 0003688 134.9636 11.3369 11.58137812872492 -GLOBALSTAR M015 [-] -1 25308U 98023C 17117.90556014 -.00000057 00000-0 36719-3 0 9999 -2 25308 51.9850 21.8797 0012254 188.7013 249.5608 11.48817870852839 -GLOBALSTAR M008 [-] -1 25309U 98023D 17117.63569927 -.00000062 00000-0 26484-3 0 9991 -2 25309 51.9952 175.2001 0002512 37.8298 128.5467 12.35961612870571 -GLOBALSTAR M023 [-] -1 25621U 99004A 17117.87891238 -.00000105 00000-0 -84695-5 0 9996 -2 25621 52.0094 102.5770 0010661 43.7025 37.6813 12.62344545840371 -GLOBALSTAR M040 [-] -1 25622U 99004B 17117.96970358 -.00000105 00000-0 -82953-5 0 9993 -2 25622 51.9903 102.1707 0000704 316.0328 79.4001 12.61868811840261 -GLOBALSTAR M036 [-] -1 25623U 99004C 17117.67507269 -.00000091 00000-0 -12084-3 0 9999 -2 25623 51.9944 154.7334 0011643 118.4084 356.8661 11.86552505826100 -GLOBALSTAR M038 [-] -1 25624U 99004D 17117.94087275 -.00000064 00000-0 25537-3 0 9996 -2 25624 51.9993 350.2533 0001394 346.6862 114.8659 12.32422501835877 -GLOBALSTAR M022 [-] -1 25649U 99012A 17117.92963903 -.00000100 00000-0 -16124-3 0 9995 -2 25649 52.0032 90.1431 0002876 59.5580 42.4066 12.02422337818828 -GLOBALSTAR M041 [-] -1 25650U 99012B 17117.72903795 -.00000081 00000-0 51821-4 0 9999 -2 25650 52.0017 241.4413 0002358 257.7429 250.3308 11.96589136822673 -GLOBALSTAR M046 [-] -1 25651U 99012C 17117.96986392 .00000001 00000-0 99463-3 0 9994 -2 25651 52.0033 148.5875 0002349 70.4211 310.9291 12.09324480824300 -GLOBALSTAR M037 [+] -1 25652U 99012D 17117.82543274 -.00000151 00000-0 -26381-3 0 9995 -2 25652 52.0007 234.5404 0002100 98.8538 42.5757 12.62302786835948 -GLOBALSTAR M045 [-] -1 25676U 99019A 17117.87789274 -.00000081 00000-0 10862-3 0 9993 -2 25676 51.9945 135.8556 0000479 212.2082 218.2562 12.26944380828778 -GLOBALSTAR M019 [-] -1 25677U 99019B 17117.33715203 -.00000033 00000-0 59289-3 0 9999 -2 25677 51.9885 58.9606 0001687 60.9502 43.4726 12.13796252824304 -GLOBALSTAR M044 [-] -1 25678U 99019C 17117.83330774 -.00000069 00000-0 20299-3 0 9999 -2 25678 51.9991 357.1410 0007023 68.2514 9.6797 11.90177149817388 -GLOBALSTAR M042 [-] -1 25679U 99019D 17117.86345120 -.00000056 00000-0 33960-3 0 9999 -2 25679 51.9994 161.0542 0002666 314.7064 95.1525 12.21995651821900 -GLOBALSTAR M025 [-] -1 25770U 99031A 17117.67411056 -.00000076 00000-0 -25629-3 0 9992 -2 25770 51.9806 205.0533 0001491 192.1152 320.4472 11.22517921147898 -GLOBALSTAR M049 [-] -1 25771U 99031B 17117.63278019 -.00000021 00000-0 15195-2 0 9994 -2 25771 51.9858 90.5537 0001619 125.3410 234.7538 11.12087532786702 -GLOBALSTAR M047 [-] -1 25772U 99031C 17117.91760219 -.00000051 00000-0 51613-3 0 9993 -2 25772 51.9863 10.7853 0015906 197.2861 162.7405 11.31888409134530 -GLOBALSTAR M052 [-] -1 25773U 99031D 17117.76656708 -.00000096 00000-0 -10113-2 0 9993 -2 25773 51.9861 240.7003 0002016 271.2480 249.5755 11.15020651146937 -GLOBALSTAR M035 [-] -1 25851U 99037A 17117.66048620 -.00000080 00000-0 -63151-3 0 9997 -2 25851 51.9938 203.7435 0014346 205.0124 305.4865 11.04504362767797 -GLOBALSTAR M032 [-] -1 25852U 99037B 17117.68396912 -.00000097 00000-0 -96864-3 0 9995 -2 25852 51.9945 233.9860 0000568 80.7705 279.3159 11.19023191802008 -GLOBALSTAR M051 [-] -1 25853U 99037C 17117.90660559 -.00000051 00000-0 50569-3 0 9993 -2 25853 51.9825 10.8423 0002084 46.7284 35.5484 11.42159315792748 -GLOBALSTAR M030 [-] -1 25854U 99037D 17117.87780962 -.00000017 00000-0 12300-2 0 9993 -2 25854 51.9904 5.8942 0004771 90.0684 270.0679 11.55050863806568 -GLOBALSTAR M048 [-] -1 25872U 99041A 17117.67027758 -.00000039 00000-0 83698-3 0 9996 -2 25872 51.9354 191.4644 0013219 79.5248 80.6108 11.33809493788033 -GLOBALSTAR M026 [-] -1 25873U 99041B 17117.90416174 -.00000064 00000-0 21941-3 0 9998 -2 25873 52.0039 9.7476 0002990 137.0822 303.0601 12.62275224819141 -GLOBALSTAR M043 [-] -1 25874U 99041C 17117.89924167 -.00000086 00000-0 -51796-3 0 9999 -2 25874 51.9380 180.2046 0013959 287.2972 119.7780 11.25646192788158 -GLOBALSTAR M028 [-] -1 25875U 99041D 17117.29656969 -.00000107 00000-0 -39109-4 0 9995 -2 25875 51.9634 56.6632 0064031 96.4208 264.3950 12.50478472818262 -GLOBALSTAR M024 [-] -1 25883U 99043A 17117.67223513 -.00000106 00000-0 -14566-2 0 9990 -2 25883 52.0007 247.4153 0001241 241.5287 218.3881 11.10130046784743 -GLOBALSTAR M027 [+] -1 25884U 99043B 17117.88526519 -.00000121 00000-0 -21885-2 0 9995 -2 25884 52.0209 240.8405 0021601 228.3238 244.2016 11.04351461812891 -GLOBALSTAR M054 [-] -1 25885U 99043C 17117.87276477 -.00000078 00000-0 -16599-3 0 9998 -2 25885 52.0117 146.7281 0005443 42.2110 14.3506 11.39181377780590 -GLOBALSTAR M053 [-] -1 25886U 99043D 17117.97217372 -.00000085 00000-0 -48649-3 0 9998 -2 25886 51.9982 288.7829 0003901 77.0457 95.0471 11.27627670784219 -GLOBALSTAR M058 [-] -1 25907U 99049A 17117.42491264 -.00000076 00000-0 11795-3 0 9993 -2 25907 51.9913 126.4052 0001418 282.7178 162.4122 11.93094437186680 -GLOBALSTAR M050 [-] -1 25908U 99049B 17117.84138338 -.00000153 00000-0 -73674-3 0 9991 -2 25908 52.0012 355.0869 0008123 223.7020 215.6526 12.07373784789151 -GLOBALSTAR M033 [-] -1 25909U 99049C 17117.83420066 -.00000046 00000-0 44173-3 0 9995 -2 25909 51.9918 72.3379 0011892 317.5319 42.4608 12.20259159172876 -GLOBALSTAR M055 [-] -1 25910U 99049D 17117.76086122 -.00000078 00000-0 13983-3 0 9990 -2 25910 52.0016 227.7313 0007399 79.0873 281.0811 12.29332907802706 -GLOBALSTAR M057 [-] -1 25943U 99058A 17117.60123376 -.00000068 00000-0 23062-3 0 9990 -2 25943 51.9959 143.3381 0002911 11.7729 348.3188 12.24725437802693 -GLOBALSTAR M059 [+] -1 25944U 99058B 17117.89000425 -.00000100 00000-0 -17051-3 0 9990 -2 25944 52.0030 327.6681 0000682 122.2502 338.6749 11.99918645217226 -GLOBALSTAR M056 [-] -1 25945U 99058C 17117.96057264 -.00000092 00000-0 -57011-4 0 9993 -2 25945 51.9986 45.6492 0002060 44.3137 50.8574 12.04711997804388 -GLOBALSTAR M031 [-] -1 25946U 99058D 17117.49263799 -.00000003 00000-0 88719-3 0 9993 -2 25946 51.9940 116.9526 0001372 277.7688 250.2324 12.15944741803078 -GLOBALSTAR M039 [-] -1 25961U 99062A 17117.84591507 -.00000090 00000-0 77657-4 0 9991 -2 25961 51.9850 320.4417 0002261 235.5461 124.5192 12.62187140804841 -GLOBALSTAR M034 [-] -1 25962U 99062B 17117.89956090 -.00000091 00000-0 -16761-3 0 9999 -2 25962 51.9856 177.0097 0014667 185.1636 223.6165 11.79379966787673 -GLOBALSTAR M029 [+] -1 25963U 99062C 17117.77344646 -.00000052 00000-0 42886-3 0 9998 -2 25963 51.9800 218.4569 0002427 44.9929 94.7156 11.99826435812367 -GLOBALSTAR M061 [-] -1 25964U 99062D 17117.80548424 -.00000051 00000-0 47385-3 0 9991 -2 25964 51.9804 321.9627 0006553 133.4794 312.5066 11.76726800771450 -GLOBALSTAR M063 [+] -1 26081U 00008A 17117.87907469 -.00000091 00000-0 68672-4 0 9996 -2 26081 51.9949 142.2121 0000897 356.1422 69.0999 12.62268127802577 -GLOBALSTAR M062 [-] -1 26082U 00008B 17117.81808271 -.00000070 00000-0 19921-3 0 9991 -2 26082 51.9835 195.3644 0006600 237.5129 240.5548 12.43341538789369 -GLOBALSTAR M060 [-] -1 26083U 00008C 17117.94579635 -.00000168 00000-0 -76788-3 0 9998 -2 26083 52.0007 94.6931 0002335 178.5654 229.0713 12.17544591790476 -GLOBALSTAR M064 [-] -1 26084U 00008D 17117.63012987 -.00000049 00000-0 49194-3 0 9995 -2 26084 52.0005 153.5524 0001732 115.3985 244.7027 11.88467063813769 -GLOBALSTAR M065 [+] -1 31571U 07020A 17117.88867959 -.00000107 00000-0 -17313-4 0 9992 -2 31571 51.9908 275.8503 0001919 108.1457 12.0102 12.62268508458404 -GLOBALSTAR M069 [+] -1 31573U 07020C 17117.68265976 -.00000079 00000-0 13662-3 0 9992 -2 31573 51.9947 232.3425 0001696 137.5195 1.4087 12.62269614459175 -GLOBALSTAR M072 [+] -1 31574U 07020D 17117.96647958 -.00000092 00000-0 63501-4 0 9991 -2 31574 52.0089 324.8727 0001778 99.5157 48.3603 12.62274140457603 -GLOBALSTAR M071 [P] -1 31576U 07020F 17117.86036186 -.00000096 00000-0 42120-4 0 9995 -2 31576 52.0065 234.8625 0000900 215.4129 294.3654 12.62274277120573 -GLOBALSTAR M067 [+] -1 32263U 07048A 17117.50169517 -.00000100 00000-0 19092-4 0 9993 -2 32263 51.9739 93.3024 0000590 330.7082 143.1278 12.62244551440714 -GLOBALSTAR M070 [+] -1 32264U 07048B 17117.92777017 -.00000084 00000-0 11182-3 0 9992 -2 32264 51.9742 182.7043 0000564 222.8040 186.8835 12.62266494438494 -GLOBALSTAR M066 [+] -1 32265U 07048C 17117.86233176 -.00000100 00000-0 22823-4 0 9993 -2 32265 51.9691 45.9140 0001079 36.1400 66.6116 12.62270980440691 -GLOBALSTAR M068 [-] -1 32266U 07048D 17117.89895598 -.00000080 00000-0 13377-3 0 9999 -2 32266 51.9904 1.3304 0001512 56.1047 24.9699 12.62685775442369 -GLOBALSTAR M079 [+] -1 37188U 10054A 17117.69636014 -.00000080 00000-0 13227-3 0 9996 -2 37188 52.0028 188.5596 0000523 192.5422 271.5503 12.62268137301266 -GLOBALSTAR M074 [+] -1 37189U 10054B 17117.65707652 -.00000077 00000-0 14801-3 0 9995 -2 37189 52.0005 188.4655 0000673 172.1458 352.6192 12.62265602301704 -GLOBALSTAR M076 [+] -1 37190U 10054C 17117.76074772 -.00000067 00000-0 20303-3 0 9992 -2 37190 52.0020 188.0437 0000500 198.8832 316.8656 12.62268940301757 -GLOBALSTAR M077 [+] -1 37191U 10054D 17117.66520938 -.00000092 00000-0 63567-4 0 9990 -2 37191 52.0050 144.3490 0000161 204.1883 296.7949 12.62268130302028 -GLOBALSTAR M075 [+] -1 37192U 10054E 17117.85172597 -.00000096 00000-0 41871-4 0 9994 -2 37192 51.9945 231.6691 0000699 190.0496 319.7424 12.62265896300851 -GLOBALSTAR M073 [+] -1 37193U 10054F 17117.60525458 -.00000093 00000-0 58521-4 0 9993 -2 37193 52.0037 143.9942 0000058 6.7687 102.5282 12.62267100302430 -GLOBALSTAR M083 [+] -1 37739U 11033A 17117.46972729 -.00000114 00000-0 -57490-4 0 9997 -2 37739 51.9846 97.1949 0000855 74.5469 78.3465 12.62266478271643 -GLOBALSTAR M088 [+] -1 37740U 11033B 17117.90247410 -.00000090 00000-0 75919-4 0 9998 -2 37740 51.9751 3.8841 0001061 103.5351 336.0723 12.62267348267258 -GLOBALSTAR M091 [+] -1 37741U 11033C 17117.91718514 -.00000092 00000-0 66425-4 0 9992 -2 37741 52.0004 322.0666 0001076 119.6720 327.7470 12.62267659267999 -GLOBALSTAR M085 [+] -1 37742U 11033D 17117.74885425 -.00000108 00000-0 -26107-4 0 9992 -2 37742 51.9864 276.2426 0000849 120.0771 341.2468 12.62267906268809 -GLOBALSTAR M081 [+] -1 37743U 11033E 17117.85669451 -.00000103 00000-0 37225-5 0 9992 -2 37743 51.9960 276.8672 0000962 142.6899 329.3724 12.62266635268689 -GLOBALSTAR M089 [+] -1 37744U 11033F 17117.49785951 -.00000104 00000-0 -27392-5 0 9993 -2 37744 51.9931 232.7424 0000201 118.5481 341.9972 12.62264933269381 -GLOBALSTAR M084 [+] -1 38040U 11080A 17117.97185480 -.00000123 00000-0 -10729-3 0 9994 -2 38040 51.9995 97.0320 0000420 15.4054 20.1603 12.62264590247531 -GLOBALSTAR M080 [+] -1 38041U 11080B 17117.48736646 -.00000119 00000-0 -86788-4 0 9991 -2 38041 52.0047 99.0690 0000327 356.9445 115.7504 12.62267279247456 -GLOBALSTAR M082 [+] -1 38042U 11080C 17117.96712257 -.00000113 00000-0 -51602-4 0 9998 -2 38042 52.0088 52.7459 0000916 88.3602 346.2579 12.62267742248253 -GLOBALSTAR M092 [+] -1 38043U 11080D 17117.55844625 -.00000103 00000-0 27679-5 0 9995 -2 38043 52.0069 144.1810 0000332 23.0217 113.2892 12.62267932246710 -GLOBALSTAR M090 [+] -1 38044U 11080E 17117.90484280 -.00000105 00000-0 -83002-5 0 9997 -2 38044 51.9898 50.5757 0000929 87.0169 303.8157 12.62268302248251 -GLOBALSTAR M086 [+] -1 38045U 11080F 17117.93250727 -.00000112 00000-0 -44329-4 0 9994 -2 38045 51.9910 50.8121 0001010 214.9667 182.2035 12.62265693248200 -GLOBALSTAR M097 [+] -1 39072U 13005A 17117.87168815 -.00000095 00000-0 46304-4 0 9997 -2 39072 52.0053 322.5054 0000959 126.7852 233.3103 12.62267694195525 -GLOBALSTAR M093 [+] -1 39073U 13005B 17117.84505185 -.00000095 00000-0 48953-4 0 9992 -2 39073 51.9817 320.6573 0001231 125.6507 234.4474 12.62262088195486 -GLOBALSTAR M094 [+] -1 39074U 13005C 17117.84511410 -.00000087 00000-0 92700-4 0 9991 -2 39074 51.9954 232.0585 0000682 158.3195 201.7700 12.62266197197018 -GLOBALSTAR M096 [+] -1 39075U 13005D 17117.85857442 -.00000106 00000-0 -13404-4 0 9998 -2 39075 52.0071 278.2132 0000908 133.5396 226.5546 12.62263647196255 -GLOBALSTAR M078 [+] -1 39076U 13005E 17117.91112039 -.00000091 00000-0 73923-4 0 9996 -2 39076 51.9909 6.0100 0001101 101.6336 258.4654 12.62268112194773 -GLOBALSTAR M095 [+] -1 39077U 13005F 17117.85836211 -.00000086 00000-0 97696-4 0 9992 -2 39077 51.9820 5.4516 0001376 95.7164 264.3859 12.62262532194768 -COSMOS 2419 (714) -1 28915U 05050A 17117.52702573 -.00000011 00000-0 00000-0 0 9996 -2 28915 65.4732 67.5600 0017428 348.3395 107.4079 2.13110349 88250 -COSMOS 2425 (716) -1 29670U 06062A 17117.75462432 -.00000005 00000-0 10000-3 0 9998 -2 29670 65.4857 306.5619 0021874 351.7384 331.3912 2.13104995 80457 -COSMOS 2426 (717) -1 29671U 06062B 17117.48764424 -.00000003 00000-0 10000-3 0 9993 -2 29671 65.5049 306.6602 0017153 157.2893 179.7165 2.13103006 80450 -COSMOS 2424 (715) -1 29672U 06062C 17117.70199127 -.00000004 00000-0 10000-3 0 9992 -2 29672 65.4888 306.5754 0016519 155.8127 161.0536 2.13102253 80456 -COSMOS 2433 (720) -1 32275U 07052A 17117.70536163 -.00000011 00000-0 10000-3 0 9998 -2 32275 65.4883 67.3288 0004340 293.8990 183.5951 2.13104711 73978 -COSMOS 2432 (719) -1 32276U 07052B 17117.72396670 -.00000011 00000-0 10000-3 0 9998 -2 32276 65.5003 67.3985 0013955 332.9751 111.7734 2.13104147 73975 -COSMOS 2434 (721) -1 32393U 07065A 17117.83335288 -.00000005 00000-0 00000-0 0 9991 -2 32393 65.1033 305.7321 0005824 94.1733 11.3542 2.13102939 72686 -COSMOS 2436 (723) -1 32395U 07065C 17117.40978797 -.00000004 00000-0 10000-3 0 9997 -2 32395 65.1124 305.7927 0016002 7.7853 181.2300 2.13104327 72608 -COSMOS 2443 (725) -1 33379U 08046B 17116.96865532 -.00000012 00000-0 00000-0 0 9997 -2 33379 65.4176 66.7416 0015770 187.0047 346.6488 2.13103279 66822 -COSMOS 2456 (730) -1 36111U 09070A 17117.82445069 .00000053 00000-0 00000-0 0 9991 -2 36111 64.1782 185.2983 0005125 307.2629 322.3494 2.13102919 57344 -COSMOS 2457 (733) -1 36112U 09070B 17117.68039958 .00000054 00000-0 00000-0 0 9993 -2 36112 64.1597 185.2229 0006272 177.2691 110.6250 2.13101559 57347 -COSMOS 2458 (734) -1 36113U 09070C 17117.73731010 .00000054 00000-0 10000-3 0 9992 -2 36113 64.1660 185.2302 0001653 328.3146 51.1546 2.13102146 57354 -COSMOS 2459 (731) -1 36400U 10007A 17117.85724492 -.00000012 00000-0 10000-3 0 9997 -2 36400 65.3966 66.4369 0029745 349.9273 106.5823 2.13102353 55700 -COSMOS 2461 (735) -1 36401U 10007B 17117.60152568 -.00000013 00000-0 10000-3 0 9991 -2 36401 65.3901 66.4239 0006228 45.0746 125.8497 2.13102368 55691 -COSMOS 2460 (732) -1 36402U 10007C 17117.68948512 -.00000013 00000-0 10000-3 0 9992 -2 36402 65.3802 66.3937 0002621 324.8740 314.9135 2.13101829 55692 -COSMOS 2465 (737) -1 37138U 10041B 17117.40791170 -.00000005 00000-0 00000-0 0 9990 -2 37138 64.7012 305.7604 0034714 168.7626 14.9457 2.13107303 51763 -COSMOS 2464 (736) -1 37139U 10041C 17117.56753682 -.00000005 00000-0 00000-0 0 9994 -2 37139 64.7089 305.7539 0024496 16.6538 112.6873 2.13102643 51764 -COSMOS 2471 (701K) -1 37372U 11009A 17117.78315888 -.00000013 00000-0 00000-0 0 9993 -2 37372 65.3784 66.3379 0008367 247.0196 239.7110 2.13107739 47977 -COSMOS 2474 (742) -1 37829U 11055A 17117.70717066 .00000054 00000-0 00000-0 0 9991 -2 37829 64.5027 185.8456 0009174 250.8450 148.8109 2.13101966 43341 -COSMOS 2476 (744) -1 37867U 11064A 17117.69731882 .00000054 00000-0 00000-0 0 9993 -2 37867 64.4826 185.9194 0018419 245.0513 192.9746 2.13102041 42696 -COSMOS 2477 (745) -1 37868U 11064B 17117.68965556 .00000054 00000-0 00000-0 0 9990 -2 37868 64.4906 185.9634 0016396 246.8017 4.4925 2.13101849 42641 -COSMOS 2475 (743) -1 37869U 11064C 17117.47752869 .00000056 00000-0 00000-0 0 9991 -2 37869 64.4982 185.9604 0021250 271.7553 133.1648 2.13101926 42659 -COSMOS 2485 (747) -1 39155U 13019A 17117.59069800 .00000055 00000-0 00000-0 0 9991 -2 39155 64.6521 185.9411 0018728 240.0369 161.2290 2.13102011 31161 -COSMOS 2492 (754) -1 39620U 14012A 17117.70046002 -.00000013 00000-0 10000-3 0 9993 -2 39620 65.2702 66.3365 0017392 330.0399 189.4848 2.13103505 24112 -COSMOS 2500 (755) -1 40001U 14032A 17117.79041534 -.00000013 00000-0 00000-0 0 9990 -2 40001 65.2094 66.3333 0005409 231.9613 219.7040 2.13102924 22337 -COSMOS 2501 (702K) -1 40315U 14075A 17117.90036488 -.00000008 00000-0 00000-0 0 9994 -2 40315 64.4352 307.1019 0013654 205.2770 137.4588 2.13098604 18730 -COSMOS 2514 (751) -1 41330U 16008A 17117.68264175 -.00000013 00000-0 00000-0 0 9997 -2 41330 65.0110 66.4960 0008931 232.7412 316.1086 2.13103486 9494 -COSMOS 2516 (753) -1 41554U 16032A 17117.81534201 -.00000007 00000-0 00000-0 0 9990 -2 41554 64.6549 306.8568 0009531 216.3617 327.1668 2.13101726 7109 -GOES 1 (SMS-C) [-] -1 08366U 75100A 17117.50551885 -.00000248 00000-0 00000-0 0 9995 -2 08366 12.1297 319.1267 0004141 286.4401 70.1179 1.00287152151593 -GOES 2 [-] -1 10061U 77048A 17117.44389811 .00000048 00000-0 00000-0 0 9991 -2 10061 13.3490 328.1464 0016224 319.2885 301.5030 0.99397333 90332 -GOES 3 [-] -1 10953U 78062A 17117.94936806 -.00000285 00000-0 00000-0 0 9999 -2 10953 13.4871 331.7017 0002805 309.2962 236.6703 0.99362688 95374 -GOES 4 [-] -1 11964U 80074A 17117.38436303 -.00000071 00000-0 00000-0 0 9996 -2 11964 14.2542 335.4453 0033205 11.0861 201.7089 0.99232160 94516 -GOES 5 [-] -1 12472U 81049A 17117.30192146 -.00000301 00000-0 00000-0 0 9996 -2 12472 14.4092 345.6193 0003942 258.0292 13.0005 1.00287034 89499 -GOES 6 [-] -1 14050U 83041A 17117.17784635 -.00000274 00000-0 00000-0 0 9998 -2 14050 14.6218 350.4827 0001411 230.5031 341.6666 1.00291237182585 -GOES 7 [-] -1 17561U 87022A 17117.13313800 -.00000026 00000-0 00000-0 0 9994 -2 17561 15.1474 6.3563 0005140 306.2799 198.2656 0.99891424 93637 -GOES 8 [-] -1 23051U 94022A 17117.38865896 .00000034 00000-0 00000-0 0 9995 -2 23051 11.3305 39.3759 0006831 251.8869 306.2834 0.98903398 91105 -GOES 9 [-] -1 23581U 95025A 17117.66888250 -.00000261 00000-0 00000-0 0 9990 -2 23581 10.8316 38.7776 0002016 44.2276 149.1734 0.98802069 79773 -GOES 10 [-] -1 24786U 97019A 17117.12267509 -.00000311 00000-0 00000-0 0 9998 -2 24786 9.2010 43.4413 0028538 162.0344 197.9730 0.99126332 72983 -GOES 11 [-] -1 26352U 00022A 17117.38554456 -.00000079 00000-0 00000-0 0 9996 -2 26352 4.8546 74.4471 0002602 171.8128 302.4358 0.99044379 61931 -GOES 12 [-] -1 26871U 01031A 17117.55635144 -.00000130 00000-0 00000-0 0 9994 -2 26871 6.2464 60.3783 0009379 240.3589 300.3260 0.99140376 57672 -GOES 13 [+] -1 29155U 06018A 17116.61117068 -.00000261 00000-0 00000-0 0 9993 -2 29155 0.2882 273.0145 0004779 151.5840 295.4602 1.00276158 9925 -GOES 14 [S] -1 35491U 09033A 17116.69224996 -.00000105 00000-0 00000-0 0 9997 -2 35491 0.1660 103.8623 0004668 130.2036 125.8996 1.00271284 28688 -GOES 15 [+] -1 36411U 10008A 17116.77924873 .00000079 00000-0 00000-0 0 9993 -2 36411 0.1007 105.4333 0002141 51.6756 202.9092 1.00273183 26212 -GOES 16 [S] -1 41866U 16071A 17116.65187186 -.00000193 00000-0 00000-0 0 9992 -2 41866 0.0108 65.4581 0001555 322.9658 331.5936 1.00272028 1638 -GORIZONT 1 [-] -1 11158U 78118A 17116.93247388 -.00000114 00000-0 00000-0 0 9998 -2 11158 15.7417 268.5889 3476220 189.0896 162.5076 1.00308368 89445 -GORIZONT 2 [-] -1 11440U 79062A 17117.62618797 -.00000256 00000-0 00000-0 0 9991 -2 11440 12.9417 324.2193 0004266 265.0453 302.0331 1.00278186104553 -GORIZONT 3 [-] -1 11648U 79105A 17117.68020660 .00000080 00000-0 00000-0 0 9995 -2 11648 13.0463 325.3983 0011609 174.9512 11.4960 1.00218799 89014 -GORIZONT 4 [-] -1 11841U 80049A 17117.15405309 -.00000046 00000-0 00000-0 0 9991 -2 11841 14.0363 329.8335 0004596 285.1112 287.0636 0.98627909200623 -GORIZONT 5 [-] -1 13092U 82020A 17117.50743608 -.00000105 00000-0 00000-0 0 9994 -2 13092 14.7725 334.6121 0032243 165.2178 186.6937 0.98531198 88704 -GORIZONT 6 [-] -1 13624U 82103A 17117.14169687 -.00000272 00000-0 00000-0 0 9991 -2 13624 13.6337 334.4947 0002657 250.3843 6.0619 1.00245111 87462 -GORIZONT 7 [-] -1 14160U 83066A 17114.95642491 -.00000121 00000-0 00000-0 0 9994 -2 14160 14.8548 342.2709 0014425 266.8317 60.3574 0.98347481121935 -GORIZONT 8 [-] -1 14532U 83118A 17117.40446128 -.00000233 00000-0 00000-0 0 9991 -2 14532 14.9159 343.8275 0023997 100.0532 83.9711 0.98271711 87706 -GORIZONT 9 [-] -1 14940U 84041A 17117.09258616 -.00000041 00000-0 00000-0 0 9995 -2 14940 14.1574 342.4750 0005999 215.7431 115.9094 1.00317654 88543 -GORIZONT 10 [-] -1 15144U 84078A 17116.26462176 -.00000280 00000-0 00000-0 0 9993 -2 15144 14.1892 343.4644 0004720 271.9724 15.1161 1.00306799121098 -GORIZONT 11 [-] -1 15484U 85007A 17115.34169844 -.00000279 00000-0 00000-0 0 9995 -2 15484 14.2407 345.2407 0001712 262.2429 51.5766 1.00221977119139 -GORIZONT 12 [-] -1 16769U 86044A 17117.72202944 -.00000374 00000-0 00000-0 0 9993 -2 16769 14.5096 350.0849 0004931 249.9736 345.0262 1.00284577113801 -GORIZONT 13 [-] -1 17083U 86090A 17114.84523949 -.00000133 00000-0 00000-0 0 9998 -2 17083 15.9682 356.0544 0018431 282.4989 258.6504 0.96726246 86352 -GORIZONT 14 [-] -1 17969U 87040A 17117.83753216 -.00000169 00000-0 00000-0 0 9990 -2 17969 15.5097 348.3805 0027311 128.7890 49.4460 0.97659493 87263 -GORIZONT 15 [-] -1 19017U 88028A 17117.82618904 -.00000117 00000-0 00000-0 0 9999 -2 19017 15.9848 359.3686 0032667 109.1937 77.6774 0.97828487 86857 -GORIZONT 16 [-] -1 19397U 88071A 17117.63250510 .00000054 00000-0 00000-0 0 9991 -2 19397 14.8939 358.3067 0013727 346.9264 293.6704 0.99982066104860 -GORIZONT 17 [-] -1 19765U 89004A 17117.48799639 -.00000272 00000-0 00000-0 0 9993 -2 19765 15.2042 1.2255 0017651 81.0532 279.5675 0.99068267102504 -GORIZONT 18 [-] -1 20107U 89052A 17116.51326708 -.00000212 00000-0 00000-0 0 9998 -2 20107 15.1365 2.5805 0039157 264.5167 302.4720 0.99405177101225 -GORIZONT 19 [-] -1 20263U 89081A 17117.82132694 .00000113 00000-0 00000-0 0 9996 -2 20263 14.9066 2.0344 0005911 236.6249 309.7377 1.00249407 13874 -GORIZONT 20 [-] -1 20659U 90054A 17112.72607301 .00000066 00000-0 00000-0 0 9990 -2 20659 15.1102 5.0220 0005521 172.1857 348.0816 1.00278998 98187 -GORIZONT 21 [-] -1 20923U 90094A 17117.46054582 -.00000253 00000-0 00000-0 0 9990 -2 20923 15.0563 5.7576 0006197 207.8358 315.0550 1.00269444 96985 -GORIZONT 22 [-] -1 20953U 90102A 17116.92896550 -.00000021 00000-0 00000-0 0 9995 -2 20953 14.9903 6.0577 0006545 268.7768 276.8356 1.00285232 96898 -GORIZONT 23 [-] -1 21533U 91046A 17117.34456488 -.00000204 00000-0 00000-0 0 9990 -2 21533 15.4330 9.7520 0008749 254.7978 253.9363 0.98910714 13672 -GORIZONT 24 [-] -1 21759U 91074A 17117.17526781 -.00000083 00000-0 00000-0 0 9991 -2 21759 15.4389 11.3714 0020147 187.9553 1.8498 0.98442263 92093 -GORIZONT 25 [-] -1 21922U 92017A 17116.88273667 -.00000204 00000-0 00000-0 0 9995 -2 21922 15.0118 11.1396 0024334 20.3237 236.0001 0.99843489 91598 -GORIZONT 26 [-] -1 22041U 92043A 17117.45865837 .00000006 00000-0 00000-0 0 9996 -2 22041 15.0294 12.7808 0032961 190.0292 69.7876 0.99240244 90345 -GORIZONT 27 [-] -1 22245U 92082A 17114.98571839 -.00000250 00000-0 00000-0 0 9998 -2 22245 14.9533 12.9672 0014760 295.4584 228.9830 1.00202869 93680 -GORIZONT 28 [-] -1 22880U 93069A 17117.26563209 -.00000017 00000-0 00000-0 0 9996 -2 22880 14.7840 16.3363 0029327 82.7369 103.1266 0.99647799 85862 -GORIZONT 29 [-] -1 22907U 93072A 17117.35165337 .00000092 00000-0 00000-0 0 9992 -2 22907 14.7307 16.0554 0013957 276.3477 252.9971 1.00142276 85759 -GORIZONT 30 [-] -1 23108U 94030A 17117.39368876 .00000087 00000-0 00000-0 0 9992 -2 23108 14.6603 17.0570 0004777 228.8877 309.2526 1.00211718 84003 -GORIZONT 31 [-] -1 23775U 96005A 17117.86785434 .00000103 00000-0 00000-0 0 9990 -2 23775 14.0689 22.6012 0020398 163.0528 20.5851 0.99888670 77712 -GORIZONT 32 [-] -1 23880U 96034A 17117.58053535 -.00000217 00000-0 00000-0 0 9995 -2 23880 13.9710 23.2494 0011947 273.5473 280.3430 1.00218633 76615 -GORIZONT 33 [-] -1 26372U 00029A 17117.79430295 -.00000367 00000-0 00000-0 0 9994 -2 26372 11.8189 32.7470 0001573 251.0131 329.4526 1.00178478 61950 -GPS BIIR-2 (PRN 13) -1 24876U 97035A 17117.71110472 .00000007 00000-0 00000-0 0 9998 -2 24876 55.5619 229.0967 0036236 106.5476 253.8574 2.00561911145014 -GPS BIIR-3 (PRN 11) -1 25933U 99055A 17117.58874096 -.00000017 00000-0 00000-0 0 9993 -2 25933 51.5997 79.8543 0164713 93.7073 107.3597 2.00558785128639 -GPS BIIR-4 (PRN 20) -1 26360U 00025A 17117.74067830 .00000055 00000-0 00000-0 0 9996 -2 26360 53.1077 156.9939 0041380 91.0059 322.1467 2.00563868124330 -GPS BIIR-5 (PRN 28) -1 26407U 00040A 17117.69912535 -.00000056 00000-0 00000-0 0 9992 -2 26407 56.6468 347.1159 0199793 270.1101 34.0827 2.00567062123004 -GPS BIIR-6 (PRN 14) -1 26605U 00071A 17117.81515104 .00000008 00000-0 00000-0 0 9997 -2 26605 55.1330 226.8438 0092019 248.1574 48.1841 2.00566781120603 -GPS BIIR-7 (PRN 18) -1 26690U 01004A 17117.85707588 .00000053 00000-0 00000-0 0 9991 -2 26690 53.0302 159.9330 0182060 256.4389 180.8389 2.00553339119011 -GPS BIIR-8 (PRN 16) -1 27663U 03005A 17117.88370983 -.00000057 00000-0 00000-0 0 9998 -2 27663 56.7162 346.8450 0092559 23.7124 172.8292 2.00562563104377 -GPS BIIR-9 (PRN 21) -1 27704U 03010A 17117.49655049 .00000020 00000-0 00000-0 0 9995 -2 27704 53.8302 100.3242 0242377 263.7867 332.8401 2.00560730103164 -GPS BIIR-10 (PRN 22) -1 28129U 03058A 17117.40051723 .00000058 00000-0 00000-0 0 9990 -2 28129 52.9171 159.9474 0078178 259.5096 99.6923 2.00579657 97842 -GPS BIIR-11 (PRN 19) -1 28190U 04009A 17117.48384308 -.00000053 00000-0 00000-0 0 9997 -2 28190 55.9782 47.9242 0100736 54.0664 5.8337 2.00565054 96039 -GPS BIIR-12 (PRN 23) -1 28361U 04023A 17117.64302101 .00000010 00000-0 00000-0 0 9994 -2 28361 54.1168 222.0143 0117311 219.0918 227.6228 2.00553187 94109 -GPS BIIR-13 (PRN 02) -1 28474U 04045A 17117.22527272 .00000021 00000-0 00000-0 0 9997 -2 28474 54.2106 99.7855 0170067 246.4539 258.7819 2.00551319 91479 -GPS BIIRM-1 (PRN 17) -1 28874U 05038A 17117.76450094 -.00000055 00000-0 00000-0 0 9998 -2 28874 56.1358 45.1678 0118635 254.4067 29.0208 2.00570299 84896 -GPS BIIRM-2 (PRN 31) -1 29486U 06042A 17117.81497852 -.00000021 00000-0 00000-0 0 9996 -2 29486 55.4318 284.3016 0085084 343.7347 258.1416 2.00561633 77497 -GPS BIIRM-3 (PRN 12) -1 29601U 06052A 17117.42111906 -.00000053 00000-0 00000-0 0 9991 -2 29601 56.6890 345.7829 0064961 46.9485 313.6454 2.00579209 76467 -GPS BIIRM-4 (PRN 15) -1 32260U 07047A 17117.24661253 .00000011 00000-0 00000-0 0 9999 -2 32260 53.2431 218.4238 0089906 32.0994 328.4706 2.00550112 69898 -GPS BIIRM-5 (PRN 29) -1 32384U 07062A 17117.96072082 -.00000055 00000-0 00000-0 0 9997 -2 32384 56.1990 45.7387 0007056 351.6488 300.7686 2.00567783 68618 -GPS BIIRM-6 (PRN 07) -1 32711U 08012A 17117.64635103 -.00000021 00000-0 00000-0 0 9994 -2 32711 55.1597 283.6887 0105092 211.6763 147.6569 2.00555096 66836 -GPS BIIRM-8 (PRN 05) -1 35752U 09043A 17117.78097128 .00000056 00000-0 00000-0 0 9998 -2 35752 54.2459 161.5606 0048142 28.3366 92.7228 2.00556414 56429 -GPS BIIF-1 (PRN 25) -1 36585U 10022A 17117.90243088 -.00000056 00000-0 00000-0 0 9995 -2 36585 55.9983 342.6174 0063057 44.1575 269.0381 2.00572448 50659 -GPS BIIF-2 (PRN 01) -1 37753U 11036A 17117.59251528 .00000026 00000-0 00000-0 0 9998 -2 37753 55.4188 102.7919 0064204 29.0499 146.9850 2.00561847 42334 -GPS BIIF-3 (PRN 24) -1 38833U 12053A 17117.33844898 -.00000022 00000-0 00000-0 0 9995 -2 38833 54.1882 280.6688 0055482 25.8609 334.3818 2.00560847 32600 -GPS BIIF-4 (PRN 27) -1 39166U 13023A 17117.69060775 -.00000058 00000-0 00000-0 0 9995 -2 39166 55.8433 42.2020 0046659 15.9758 344.1709 2.00565064 28949 -GPS BIIF-5 (PRN 30) -1 39533U 14008A 17116.69816321 -.00000023 00000-0 00000-0 0 9994 -2 39533 54.3429 285.9827 0026962 180.4130 179.5586 2.00561742 23277 -GPS BIIF-6 (PRN 06) -1 39741U 14026A 17116.97382425 .00000030 00000-0 00000-0 0 9996 -2 39741 55.4057 102.3363 0010261 288.1037 71.7751 2.00565027 21568 -GPS BIIF-7 (PRN 09) -1 40105U 14045A 17117.06729393 .00000009 00000-0 00000-0 0 9999 -2 40105 54.6399 221.9169 0005932 116.0501 244.0289 2.00566458 19152 -GPS BIIF-8 (PRN 03) -1 40294U 14068A 17117.43673556 .00000061 00000-0 00000-0 0 9991 -2 40294 54.9926 162.5160 0006236 342.9401 17.1257 2.00554236 18264 -GPS BIIF-9 (PRN 26) -1 40534U 15013A 17117.07457666 -.00000052 00000-0 00000-0 0 9992 -2 40534 54.9551 341.7976 0018244 356.8921 3.1446 2.00561392 14873 -GPS BIIF-10 (PRN 08) -1 40730U 15033A 17117.23427953 -.00000059 00000-0 00000-0 0 9993 -2 40730 55.3777 41.9143 0027522 315.2750 44.5035 2.00569561 13068 -GPS BIIF-11 (PRN 10) -1 41019U 15062A 17117.28787317 .00000063 00000-0 00000-0 0 9998 -2 41019 55.0025 162.3078 0025494 205.1920 154.7701 2.00563362 10883 -GPS BIIF-12 (PRN 32) -1 41328U 16007A 17117.37400445 .00000010 00000-0 00000-0 0 9997 -2 41328 54.8978 222.0789 0012113 217.3946 142.5406 2.00558063 8943 -INTELSAT 701 (IS-701) -1 22871U 93066A 17117.84915325 -.00000228 00000-0 00000-0 0 9991 -2 22871 4.1027 67.2656 0003830 326.2480 98.6790 1.00270267 85958 -INTELSAT 26 (IS-26) -1 24732U 97007A 17117.80741380 -.00000006 00000-0 00000-0 0 9996 -2 24732 7.3857 50.3876 0005476 3.0506 157.4337 1.00270756 39274 -GALAXY 25 (G-25) -1 24812U 97026A 17116.66187462 -.00000173 00000-0 00000-0 0 9999 -2 24812 0.0451 90.3866 0003544 305.2334 324.4126 1.00273150 72894 -INTELSAT 5 (IS-5) -1 24916U 97046A 17117.16364104 -.00000150 00000-0 00000-0 0 9997 -2 24916 3.4490 71.3292 0003546 321.5620 38.3528 1.00271601 72157 -INTELSAT 805 (IS-805) -1 25371U 98037A 17117.77637519 -.00000044 00000-0 00000-0 0 9996 -2 25371 0.0085 83.9267 0003083 318.9617 261.5410 1.00270643 69082 -AFRISTAR -1 25515U 98063A 17117.72039122 .00000114 00000-0 00000-0 0 9993 -2 25515 3.2049 69.8252 0004257 323.8405 102.5370 1.00272987 67482 -INTELSAT 8 (IS-8) -1 25522U 98065A 17117.91577310 -.00000102 00000-0 00000-0 0 9998 -2 25522 0.9010 87.3270 0299136 221.0967 317.3566 0.95184692 13045 -GALAXY 11 (G-11) -1 26038U 99071A 17117.93035581 .00000124 00000-0 00000-0 0 9993 -2 26038 0.0073 290.7859 0001167 42.6936 262.4449 1.00271306 63646 -SIRIUS-1 -1 26390U 00035A 17117.42896751 -.00000001 00000-0 00000-0 0 9999 -2 26390 59.5335 227.3534 0002164 207.1117 150.9766 1.57876826 62732 -INTELSAT 9 (IS-9) -1 26451U 00043A 17117.94657378 -.00000282 00000-0 00000-0 0 9994 -2 26451 3.4365 71.5444 0002688 315.4717 126.7630 1.00272717 10685 -INTELSAT 12 (IS-12) -1 26590U 00068A 17117.93035581 .00000124 00000-0 00000-0 0 9994 -2 26590 0.3782 93.3320 0001540 294.8926 207.7699 1.00272133 18259 -INTELSAT 1R (IS-1R) -1 26608U 00072A 17117.52112888 .00000111 00000-0 00000-0 0 9996 -2 26608 0.2105 89.2644 0001663 269.6291 247.5204 1.00009937 60184 -INTELSAT 10 (IS-10) -1 26766U 01019A 17117.93035581 .00000114 00000-0 00000-0 0 9995 -2 26766 1.4127 85.3638 0002139 290.5843 222.5639 1.00272879 12179 -INTELSAT 901 (IS-901) -1 26824U 01024A 17117.90090181 -.00000154 00000-0 00000-0 0 9995 -2 26824 0.0135 285.3709 0002681 101.3989 135.6098 1.00272019 58237 -INTELSAT 902 (IS-902) -1 26900U 01039A 17117.92594959 .00000019 00000-0 00000-0 0 9999 -2 26900 0.0099 278.1849 0002976 119.6629 213.5763 1.00272569 57252 -DIRECTV 4S -1 26985U 01052A 17117.42410554 -.00000125 00000-0 00000-0 0 9999 -2 26985 0.0057 281.5796 0002007 119.7179 225.7744 1.00270575 56522 -INTELSAT 904 (IS-904) -1 27380U 02007A 17117.93035581 .00000123 00000-0 00000-0 0 9996 -2 27380 0.0464 91.3410 0002721 359.5396 145.2385 1.00272625 18301 -INTELSAT 903 (IS-903) -1 27403U 02016A 17117.74532738 -.00000251 00000-0 00000-0 0 9990 -2 27403 0.0199 275.9980 0002885 121.1229 52.6235 1.00271935 12204 -DIRECTV 5 (TEMPO 1) -1 27426U 02023A 17116.70904308 -.00000066 00000-0 00000-0 0 9998 -2 27426 0.0192 253.0937 0003274 147.2819 319.6487 1.00270450 54862 -INTELSAT 905 (IS-905) -1 27438U 02027A 17117.87674363 -.00000197 00000-0 00000-0 0 9994 -2 27438 0.0111 253.4625 0002843 117.2349 136.4867 1.00271456 17919 -GALAXY 3C (G-3C) -1 27445U 02030A 17116.66721878 -.00000161 00000-0 00000-0 0 9997 -2 27445 0.0185 287.7924 0001743 51.7560 20.4537 1.00271418 13106 -INTELSAT 906 (IS-906) -1 27513U 02041A 17117.80674681 .00000001 00000-0 00000-0 0 9993 -2 27513 0.0235 268.9750 0002993 131.2485 170.3374 1.00273219 53574 -INTELSAT 907 (IS-907) -1 27683U 03007A 17117.47743308 -.00000214 00000-0 00000-0 0 9997 -2 27683 0.0112 258.5995 0002868 144.7855 316.6455 1.00270988 51981 -GALAXY 12 (G-12) -1 27715U 03013B 17117.47480003 .00000047 00000-0 00000-0 0 9993 -2 27715 0.0610 89.8594 0001695 307.5230 220.1919 1.00271940 18675 -GALAXY 23 (G-23) -1 27854U 03034A 17117.38108368 .00000001 00000-0 00000-0 0 9991 -2 27854 0.0204 134.0337 0002988 259.8204 197.8948 1.00271212 50278 -GALAXY 13 (HORIZONS-1) -1 27954U 03044A 17117.43868888 .00000036 00000-0 00000-0 0 9997 -2 27954 0.0500 96.9803 0000764 318.8048 190.7435 1.00271160 49693 -DIRECTV 7S -1 28238U 04016A 17117.43382691 -.00000010 00000-0 00000-0 0 9999 -2 28238 0.0321 47.4470 0002723 349.4632 215.8149 1.00269925 47603 -INTELSAT 10-02 -1 28358U 04022A 17117.81437965 -.00000024 00000-0 00000-0 0 9991 -2 28358 0.0153 175.9473 0000462 116.6379 215.5888 1.00271268 47182 -XM-3 (RHYTHM) -1 28626U 05008A 17117.47436293 -.00000217 00000-0 00000-0 0 9993 -2 28626 0.0450 66.9409 0000346 174.8171 59.5523 1.00270635 44596 -SPACEWAY 1 -1 28644U 05015A 17117.35305598 -.00000114 00000-0 00000-0 0 9997 -2 28644 0.0080 201.0782 0000376 66.0325 332.6012 1.00272836 13125 -DIRECTV 8 -1 28659U 05019A 17116.68338213 -.00000126 00000-0 00000-0 0 9995 -2 28659 0.0111 265.2696 0003143 133.0633 321.6895 1.00269929 43673 -GALAXY 28 (G-28) -1 28702U 05022A 17117.43521699 -.00000197 00000-0 00000-0 0 9992 -2 28702 0.0061 191.6243 0001605 202.3874 249.2715 1.00270588 18642 -GALAXY 14 (G-14) -1 28790U 05030A 17117.43868888 .00000025 00000-0 00000-0 0 9991 -2 28790 0.0109 236.7748 0002121 141.2559 230.5041 1.00272833 42836 -GALAXY 15 (G-15) -1 28884U 05041A 17117.63438270 .00000066 00000-0 00000-0 0 9992 -2 28884 0.0250 92.8477 0001657 315.0810 263.2601 1.00273269 42155 -SPACEWAY 2 -1 28903U 05046B 17117.42410554 -.00000138 00000-0 00000-0 0 9992 -2 28903 0.0049 70.7398 0000043 13.8276 184.6348 1.00271174 17875 -GALAXY 16 (G-16) -1 29236U 06023A 17117.37549479 -.00000139 00000-0 00000-0 0 9992 -2 29236 0.0137 249.4336 0002744 159.5844 202.7179 1.00273983 39765 -DIRECTV 9S -1 29494U 06043A 17117.42410554 -.00000126 00000-0 00000-0 0 9993 -2 29494 0.0134 226.1841 0003130 166.9350 234.0600 1.00272237 17938 -XM-4 (BLUES) -1 29520U 06049A 17117.43382691 -.00000035 00000-0 00000-0 0 9999 -2 29520 0.0031 28.1297 0000042 71.0407 157.3869 1.00271409 38529 -GALAXY 17 (G-17) -1 31307U 07016B 17117.45037390 -.00000186 00000-0 00000-0 0 9992 -2 31307 0.0491 57.1226 0003199 345.3070 244.3425 1.00272232 36481 -DIRECTV 10 -1 31862U 07032A 17116.68879987 -.00000114 00000-0 00000-0 0 9997 -2 31862 0.0137 292.6008 0000413 351.9429 75.4605 1.00273325 12161 -SPACEWAY 3 -1 32018U 07036A 17117.37549479 -.00000163 00000-0 00000-0 0 9996 -2 32018 0.0452 73.0857 0000335 196.3082 346.3893 1.00271258 13126 -INTELSAT 11 (IS-11) -1 32253U 07044B 17117.65367050 -.00000281 00000-0 00000-0 0 9991 -2 32253 0.0345 130.9941 0001493 256.5767 20.6001 1.00273233 35133 -HORIZONS-2 -1 32388U 07063B 17117.80488368 -.00000195 00000-0 00000-0 0 9998 -2 32388 0.0119 290.0196 0002884 106.1771 194.3778 1.00270749 34397 -DIRECTV 11 -1 32729U 08013A 17117.42410554 -.00000138 00000-0 00000-0 0 9990 -2 32729 0.0038 299.0058 0000098 75.2139 254.8818 1.00271660 33468 -GALAXY 18 (G-18) -1 32951U 08024A 17116.74457174 .00000014 00000-0 00000-0 0 9994 -2 32951 0.0140 219.4846 0003215 187.1833 313.3589 1.00271659 32618 -INTELSAT 25 (IS-25) -1 33153U 08034A 17117.48848125 -.00000236 00000-0 00000-0 0 9999 -2 33153 0.0046 230.1087 0002637 145.1540 344.7532 1.00270445 32170 -GALAXY 19 (G-19) -1 33376U 08045A 17116.67266587 -.00000149 00000-0 00000-0 0 9997 -2 33376 0.0117 257.7656 0002598 137.0528 325.2075 1.00269365 31483 -SIRIUS FM-5 -1 35493U 09034A 17117.48990042 -.00000212 00000-0 00000-0 0 9999 -2 35493 0.0137 277.4101 0001070 63.8866 324.5728 1.00268563 28501 -INTELSAT 14 (IS-14) -1 36097U 09064A 17116.52862781 -.00000284 00000-0 00000-0 0 9994 -2 36097 0.0184 268.3720 0002200 122.4376 329.2124 1.00272664 27232 -INTELSAT 15 (IS-15) -1 36106U 09067A 17117.91577310 -.00000199 00000-0 00000-0 0 9998 -2 36106 0.0081 295.5587 0002095 84.5430 250.8097 1.00272075 7842 -DIRECTV 12 -1 36131U 09075A 17117.43745505 -.00000115 00000-0 00000-0 0 9993 -2 36131 0.0088 230.3254 0000208 100.9137 299.0622 1.00271978 13135 -INTELSAT 16 (IS-16) -1 36397U 10006A 17117.50257694 -.00000297 00000-0 00000-0 0 9999 -2 36397 0.0407 74.1133 0001438 320.2455 304.1440 1.00270075 26261 -XM-5 -1 37185U 10053A 17117.46953410 -.00000216 00000-0 00000-0 0 9992 -2 37185 0.0117 256.8702 0001078 78.1805 324.4069 1.00268665 24020 -INTELSAT 17 (IS-17) -1 37238U 10065B 17117.92063499 -.00000015 00000-0 00000-0 0 9991 -2 37238 0.0120 197.5351 0002594 199.8870 216.0897 1.00272484 19967 -INTELSAT NEW DAWN -1 37392U 11016A 17117.93521792 .00000142 00000-0 00000-0 0 9995 -2 37392 0.0117 205.6738 0000543 216.8099 163.1012 1.00271560 19830 -INTELSAT 18 (IS-18) -1 37834U 11056A 17117.53193792 .00000041 00000-0 00000-0 0 9999 -2 37834 0.0068 229.8026 0002114 179.8429 177.5687 1.00272990 20382 -INTELSAT 22 (IS-22) -1 38098U 12011A 17117.20149384 -.00000070 00000-0 00000-0 0 9999 -2 38098 0.0272 356.9410 0001823 55.0491 308.0346 1.00270100 18371 -INTELSAT 19 (IS-19) -1 38356U 12030A 17116.94139020 -.00000067 00000-0 00000-0 0 9999 -2 38356 0.0243 350.4509 0003266 51.9359 317.6470 1.00273890 17007 -INTELSAT 20 (IS-20) -1 38740U 12043A 17117.21132225 -.00000036 00000-0 00000-0 0 9997 -2 38740 0.0181 201.9596 0000365 354.5412 163.4981 1.00270108 17306 -INTELSAT 21 (IS-21) -1 38749U 12045A 17116.56463404 -.00000295 00000-0 00000-0 0 9998 -2 38749 0.0181 245.8931 0001867 145.4303 328.6878 1.00268873 17080 -INTELSAT 23 (IS-23) -1 38867U 12057A 17117.54805843 -.00000297 00000-0 00000-0 0 9990 -2 38867 0.0071 228.1720 0001560 160.0413 331.8029 1.00271038 16545 -SIRIUS FM-6 -1 39360U 13058A 17116.72558332 -.00000027 00000-0 00000-0 0 9999 -2 39360 0.0061 263.1140 0000899 295.4476 161.4352 1.00269316 12878 -INTELSAT 30 (IS-30) -1 40271U 14062A 17116.40940988 -.00000160 00000-0 00000-0 0 9993 -2 40271 0.0118 251.6237 0000981 220.4768 154.8191 1.00268509 9211 -INTELSAT 34 (IS-34) -1 40874U 15039A 17116.55763949 -.00000296 00000-0 00000-0 0 9993 -2 40874 0.0208 264.9248 0000929 306.7335 148.3451 1.00270112 6205 -INTELSAT 29E (IS-29E) -1 41308U 16004A 17117.53973758 -.00000294 00000-0 00000-0 0 9997 -2 41308 0.0165 260.1902 0001517 130.3195 329.5068 1.00271007 4719 -INTELSAT 31 (IS-31) -1 41581U 16035A 17116.66719882 -.00000161 00000-0 00000-0 0 9996 -2 41581 0.0150 239.8780 0001963 347.7795 132.3347 1.00270876 3237 -INTELSAT 36 (IS-36) -1 41747U 16053A 17116.91279094 -.00000036 00000-0 00000-0 0 9995 -2 41747 0.0369 52.7296 0001812 349.0469 210.4048 1.00271453 2498 -INTELSAT 33E (IS-33E) -1 41748U 16053B 17117.23496068 .00000037 00000-0 00000-0 0 9994 -2 41748 0.0100 284.9518 0001619 114.0329 321.0270 1.00271934 2791 -IRIDIUM 106 [+] -1 41917U 17003A 17117.85794366 .00000111 00000-0 32732-4 0 9992 -2 41917 86.4047 43.0874 0002971 74.7131 285.4393 14.34218125 14865 -IRIDIUM 103 [+] -1 41918U 17003B 17117.84525217 .00000103 00000-0 29783-4 0 9992 -2 41918 86.4007 43.0154 0002754 99.8287 260.3220 14.34216032 14891 -IRIDIUM 109 [+] -1 41919U 17003C 17117.92136728 .00000105 00000-0 30502-4 0 9990 -2 41919 86.4008 42.9880 0002301 87.3955 272.7504 14.34218541 14865 -IRIDIUM 102 [+] -1 41920U 17003D 17117.88965532 .00000108 00000-0 31506-4 0 9998 -2 41920 86.4007 42.9966 0002069 90.1679 269.9754 14.34217525 14942 -IRIDIUM 105 [+] -1 41921U 17003E 17117.93881964 .00000378 00000-0 41760-4 0 9993 -2 41921 85.8820 41.3110 0009160 231.6777 128.3623 14.84278160 15304 -IRIDIUM 104 [+] -1 41922U 17003F 17117.90233740 .00000110 00000-0 32081-4 0 9994 -2 41922 86.4008 42.9823 0002961 81.9443 278.2088 14.34218751 14939 -IRIDIUM 114 [+] -1 41923U 17003G 17117.90868472 .00000108 00000-0 31406-4 0 9998 -2 41923 86.4008 42.9727 0002347 73.8383 286.3071 14.34216971 14938 -IRIDIUM 108 [+] -1 41924U 17003H 17117.86528729 .00000375 00000-0 41436-4 0 9992 -2 41924 85.8847 41.2888 0009084 230.5787 129.4632 14.84278235 15283 -IRIDIUM 112 [+] -1 41925U 17003J 17117.89600089 .00000106 00000-0 30771-4 0 9998 -2 41925 86.4004 42.9790 0001515 75.9953 284.1411 14.34217619 14943 -IRIDIUM 111 [+] -1 41926U 17003K 17117.95306814 .00000105 00000-0 30361-4 0 9999 -2 41926 86.4005 42.9537 0002822 91.7577 268.3942 14.34217868 14921 -IRIDIUM 8 [+] -1 24792U 97020A 17117.72417435 .00000125 00000-0 37405-4 0 9993 -2 24792 86.3959 339.7993 0002069 86.3575 273.7858 14.34222785 45737 -IRIDIUM 7 [+] -1 24793U 97020B 17117.71783354 .00000119 00000-0 35520-4 0 9998 -2 24793 86.3965 340.0827 0002113 86.0268 274.1169 14.34222625 45735 -IRIDIUM 6 [+] -1 24794U 97020C 17117.71140379 .00000121 00000-0 36216-4 0 9999 -2 24794 86.3963 340.0170 0002146 87.3446 272.7996 14.34221541 45720 -IRIDIUM 5 [+] -1 24795U 97020D 17117.70513891 .00000126 00000-0 38023-4 0 9995 -2 24795 86.3961 340.0366 0002230 85.9173 274.2277 14.34222281 46004 -IRIDIUM 4 [-] -1 24796U 97020E 17117.73062441 .00000099 00000-0 27884-4 0 9991 -2 24796 86.3956 338.9890 0002090 87.3399 315.5217 14.35149594 46039 -IRIDIUM 914 [-] -1 24836U 97030A 17117.83987231 .00000130 00000-0 35825-4 0 9991 -2 24836 86.3960 355.8333 0000604 60.6370 299.4889 14.38753724179605 -IRIDIUM 12 [+] -1 24837U 97030B 17117.79908946 .00000196 00000-0 62875-4 0 9990 -2 24837 86.3996 11.1628 0002185 82.2145 319.6742 14.34213596 39444 -IRIDIUM 10 [+] -1 24839U 97030D 17117.79220317 .00000204 00000-0 65649-4 0 9993 -2 24839 86.3997 11.1456 0002083 79.5993 352.2070 14.34215271 39712 -IRIDIUM 13 [+] -1 24840U 97030E 17117.79734223 .00000201 00000-0 64746-4 0 9995 -2 24840 86.3998 11.2825 0002210 78.3223 281.8221 14.34213086 39729 -IRIDIUM 16 [-] -1 24841U 97030F 17117.84565518 .00000141 00000-0 41028-4 0 9992 -2 24841 86.4076 11.1043 0004468 88.0781 272.0928 14.36704687 40095 -IRIDIUM 911 [-] -1 24842U 97030G 17117.83326953 .00000171 00000-0 43258-4 0 9990 -2 24842 86.4503 11.9232 0012305 257.1120 102.8708 14.44951117 45681 -IRIDIUM 15 [+] -1 24869U 97034A 17117.88065971 .00000206 00000-0 60672-4 0 9996 -2 24869 86.4222 43.1249 0002426 97.5999 262.5475 14.38631117 36432 -IRIDIUM 17 [-] -1 24870U 97034B 17117.92008625 .00000143 00000-0 42740-4 0 9992 -2 24870 86.4001 41.2365 0003381 56.9863 303.1658 14.35752451 36962 -IRIDIUM 920 [-] -1 24871U 97034C 17117.83592838 .00000120 00000-0 32073-4 0 9990 -2 24871 86.4018 27.5811 0012995 137.7018 222.5186 14.39466349 38846 -IRIDIUM 18 [+] -1 24872U 97034D 17117.88954532 .00000194 00000-0 62154-4 0 9993 -2 24872 86.4000 43.0983 0002313 85.4314 274.7146 14.34224917 36663 -IRIDIUM 921 [-] -1 24873U 97034E 17117.92014904 .00001742 00000-0 10149-3 0 9995 -2 24873 86.3916 89.7447 0007316 181.0942 179.0282 15.11269957 80227 -IRIDIUM 26 [-] -1 24903U 97043A 17117.91318035 .00000098 00000-0 27225-4 0 9997 -2 24903 86.3935 275.8307 0002305 94.1727 15.3450 14.35252405 30288 -IRIDIUM 25 [+] -1 24904U 97043B 17117.90759268 -.00000005 00000-0 -89848-5 0 9994 -2 24904 86.3925 276.4344 0002165 93.2820 266.8624 14.34214230 30418 -IRIDIUM 46 [+] -1 24905U 97043C 17117.85074396 -.00000102 00000-0 -43560-4 0 9999 -2 24905 86.3931 276.4224 0002365 101.7512 258.3949 14.34237738 30614 -IRIDIUM 23 [+] -1 24906U 97043D 17117.86565946 -.00000005 00000-0 -89424-5 0 9999 -2 24906 86.3938 276.4935 0002053 95.2524 15.8331 14.34214415 30343 -IRIDIUM 22 [+] -1 24907U 97043E 17117.88857429 -.00000002 00000-0 -78952-5 0 9993 -2 24907 86.3934 277.1059 0002077 91.7341 268.4093 14.34215976 30635 -DUMMY MASS 1 [-] -1 24925U 97048A 17117.91778254 .00000103 00000-0 87676-5 0 9993 -2 24925 86.3360 66.5894 0005756 201.7691 158.3289 14.85129888 63882 -DUMMY MASS 2 [-] -1 24926U 97048B 17117.88103106 .00000102 00000-0 87436-5 0 9991 -2 24926 86.3358 67.7141 0006230 213.4051 146.6780 14.84898063 63722 -IRIDIUM 29 [-] -1 24944U 97051A 17117.89266043 .00000137 00000-0 41495-4 0 9998 -2 24944 86.3924 307.9208 0001887 83.6889 276.4522 14.34622204 27007 -IRIDIUM 32 [+] -1 24945U 97051B 17117.56848585 -.00000003 00000-0 -79917-5 0 9995 -2 24945 86.3921 308.2674 0001975 87.8011 272.3411 14.34216666 27167 -IRIDIUM 33 [-] -1 24946U 97051C 17117.92653894 .00000097 00000-0 27874-4 0 9998 -2 24946 86.3839 307.7762 0009617 56.0447 304.1662 14.33548829 26822 -IRIDIUM 28 [-] -1 24948U 97051E 17117.94065690 .00000119 00000-0 34567-4 0 9995 -2 24948 86.3928 307.1614 0002502 90.1184 270.0300 14.35545298 27309 -IRIDIUM 30 [+] -1 24949U 97051F 17117.91114779 -.00000171 00000-0 -68231-4 0 9991 -2 24949 86.3924 308.2453 0002541 86.2086 273.9401 14.34205254 26980 -IRIDIUM 31 [+] -1 24950U 97051G 17117.90463452 .00000012 00000-0 -27374-5 0 9994 -2 24950 86.3922 308.2204 0002052 87.1919 272.9512 14.34217192 27286 -IRIDIUM 19 [+] -1 24965U 97056A 17117.74953963 .00000121 00000-0 36094-4 0 9996 -2 24965 86.3960 339.7999 0002103 85.9118 274.2318 14.34223155 25326 -IRIDIUM 35 [+] -1 24966U 97056B 17117.76223193 .00000119 00000-0 35469-4 0 9996 -2 24966 86.3959 339.7889 0002106 86.5062 273.6374 14.34222723 25023 -IRIDIUM 36 [-] -1 24967U 97056C 17117.73824703 .00000114 00000-0 32735-4 0 9996 -2 24967 86.3970 338.8960 0002106 83.5952 276.5484 14.35598536 25621 -IRIDIUM 37 [+] -1 24968U 97056D 17117.73685820 .00000120 00000-0 35645-4 0 9992 -2 24968 86.3961 339.9844 0002074 85.8592 274.2841 14.34222860 25090 -IRIDIUM 34 [+] -1 24969U 97056E 17117.75588187 .00000132 00000-0 40243-4 0 9996 -2 24969 86.3962 339.9133 0002112 85.1179 275.0258 14.34223284 25317 -IRIDIUM 43 [+] -1 25039U 97069A 17117.88311394 .00000222 00000-0 72136-4 0 9993 -2 25039 86.4019 43.0399 0002259 78.7349 281.4101 14.34227854 19101 -IRIDIUM 41 [+] -1 25040U 97069B 17117.87684066 .00000196 00000-0 62850-4 0 9995 -2 25040 86.3998 42.9848 0002338 86.8736 273.2727 14.34225341 18801 -IRIDIUM 40 [-] -1 25041U 97069C 17117.91323041 .00040855 -10362-5 39946-3 0 9997 -2 25041 86.3949 41.9078 0301473 109.4977 253.9097 15.25663544 19272 -IRIDIUM 39 [B] -1 25042U 97069D 17117.85144776 .00000178 00000-0 44032-4 0 9996 -2 25042 86.3959 40.6846 0020908 116.8491 243.4852 14.46148176 19181 -IRIDIUM 38 [-] -1 25043U 97069E 17117.63253226 .00000142 00000-0 41894-4 0 9998 -2 25043 86.4000 40.3297 0003609 86.3112 273.8497 14.36024196 19217 -IRIDIUM 42 [-] -1 25077U 97077A 17117.89681448 .00000133 00000-0 40320-4 0 9996 -2 25077 86.4002 42.9330 0002433 87.7881 272.3594 14.34538410 14971 -IRIDIUM 44 [-] -1 25078U 97077B 17117.90941372 .00000167 00000-0 48672-4 0 9999 -2 25078 86.4005 32.6310 0003898 80.6033 279.5605 14.38116118 16375 -IRIDIUM 45 [+] -1 25104U 97082A 17117.89829144 .00000002 00000-0 -62536-5 0 9990 -2 25104 86.3919 308.2551 0003028 92.9936 267.1606 14.34217066 12909 -IRIDIUM 24 [-] -1 25105U 97082B 17117.93674986 .00000127 00000-0 34000-4 0 9999 -2 25105 86.3919 256.6588 0012998 142.6695 217.5409 14.39849945 15373 -IRIDIUM 47 [+] -1 25106U 97082C 17117.85686239 .00000010 00000-0 -35581-5 0 9993 -2 25106 86.3922 276.3282 0002045 95.3798 264.7631 14.34214029 12864 -IRIDIUM 49 [+] -1 25108U 97082E 17117.89116024 -.00000002 00000-0 -77442-5 0 9993 -2 25108 86.3924 276.4153 0002088 93.5205 18.1525 14.34213987 12906 -IRIDIUM 52 [+] -1 25169U 98010A 17117.82904929 .00000187 00000-0 59879-4 0 9999 -2 25169 86.3997 11.4441 0002228 83.9655 276.1794 14.34214559 4280 -IRIDIUM 56 [+] -1 25170U 98010B 17117.82273398 .00000171 00000-0 53963-4 0 9991 -2 25170 86.4014 11.5533 0002350 85.8113 274.3351 14.34217637 4461 -IRIDIUM 54 [+] -1 25171U 98010C 17117.85442533 .00000195 00000-0 62431-4 0 9990 -2 25171 86.4000 11.4545 0002133 82.7162 277.4276 14.34227535 4736 -IRIDIUM 50 [+] -1 25172U 98010D 17117.81637334 .00000201 00000-0 64624-4 0 9996 -2 25172 86.4000 11.4270 0002048 82.4647 277.6781 14.34227272 4261 -IRIDIUM 53 [+] -1 25173U 98010E 17117.83539662 .00000200 00000-0 64345-4 0 9993 -2 25173 86.4001 11.4249 0002176 82.4369 277.7074 14.34213598 4286 -IRIDIUM 51 [S] -1 25262U 98018A 17117.71146574 .00000165 00000-0 51983-4 0 9997 -2 25262 86.3972 340.1393 0001782 89.7806 270.3594 14.34225469 3680 -IRIDIUM 61 [+] -1 25263U 98018B 17117.74318053 .00000117 00000-0 34603-4 0 9991 -2 25263 86.3962 339.9472 0002098 86.8073 273.3362 14.34222170999416 -IRIDIUM 55 [+] -1 25272U 98019A 17117.88559911 -.00000091 00000-0 -39435-4 0 9998 -2 25272 86.3920 308.0430 0002035 88.0658 272.0771 14.34215596998632 -IRIDIUM 57 [-] -1 25273U 98019B 17117.92413976 .00000076 00000-0 20120-4 0 9996 -2 25273 86.3928 308.3341 0002055 88.5002 271.6429 14.34265704998658 -IRIDIUM 58 [+] -1 25274U 98019C 17117.65726643 -.00000005 00000-0 -90034-5 0 9991 -2 25274 86.3927 308.6405 0002010 90.1594 269.9832 14.34217410998613 -IRIDIUM 59 [+] -1 25275U 98019D 17117.66361459 -.00000002 00000-0 -78334-5 0 9999 -2 25275 86.3922 308.4934 0001906 87.5393 272.6021 14.34217099998898 -IRIDIUM 60 [+] -1 25276U 98019E 17117.87928511 -.00000007 00000-0 -96036-5 0 9995 -2 25276 86.3919 308.0246 0002035 87.6419 272.5009 14.34215406998649 -IRIDIUM 62 [+] -1 25285U 98021A 17117.84083005 .00000157 00000-0 48951-4 0 9991 -2 25285 86.3971 244.9256 0002214 99.9624 260.1821 14.34216972997800 -IRIDIUM 63 [-] -1 25286U 98021B 17117.95021255 .00000125 00000-0 37289-4 0 9990 -2 25286 86.4002 245.2870 0001944 96.5173 16.8027 14.34654949997561 -IRIDIUM 64 [+] -1 25287U 98021C 17117.85354408 .00000146 00000-0 45080-4 0 9990 -2 25287 86.3972 244.9627 0002287 92.7220 267.4238 14.34216304997506 -IRIDIUM 65 [+] -1 25288U 98021D 17117.85989174 .00000142 00000-0 43632-4 0 9992 -2 25288 86.3971 244.8643 0002317 99.7668 260.3789 14.34216206997526 -IRIDIUM 66 [+] -1 25289U 98021E 17117.86622751 .00000147 00000-0 45484-4 0 9991 -2 25289 86.3970 244.7655 0002205 99.2984 260.8461 14.34216441997804 -IRIDIUM 67 [+] -1 25290U 98021F 17117.87257490 .00000136 00000-0 41610-4 0 9993 -2 25290 86.3971 244.8984 0002220 97.5668 262.5780 14.34216176997538 -IRIDIUM 68 [+] -1 25291U 98021G 17117.87888846 .00000147 00000-0 45294-4 0 9993 -2 25291 86.3973 245.0136 0002264 96.0087 264.1367 14.34216544997505 -IRIDIUM 69 [-] -1 25319U 98026A 17117.89449026 .00000101 00000-0 26571-4 0 9991 -2 25319 86.3973 266.8557 0004021 87.4965 272.6693 14.38663766995551 -IRIDIUM 71 [-] -1 25320U 98026B 17117.89926388 .00000129 00000-0 35212-4 0 9996 -2 25320 86.3960 262.7657 0003720 120.9987 239.1577 14.39078364995977 -IRIDIUM 70 [+] -1 25342U 98032A 17117.92812852 .00000146 00000-0 45198-4 0 9994 -2 25342 86.3977 245.2325 0002216 100.5156 22.7150 14.34216644991618 -IRIDIUM 72 [+] -1 25343U 98032B 17117.89157585 .00000138 00000-0 42225-4 0 9995 -2 25343 86.3972 244.8629 0002228 97.7258 262.4191 14.34216749991613 -IRIDIUM 73 [-] -1 25344U 98032C 17117.87051360 .00000156 00000-0 35639-4 0 9999 -2 25344 86.4467 224.1795 0001865 109.6315 250.5091 14.49028684999982 -IRIDIUM 74 [S] -1 25345U 98032D 17117.87679853 .00000150 00000-0 39322-4 0 9990 -2 25345 86.4487 245.2932 0006500 179.0270 293.3375 14.42444534995204 -IRIDIUM 75 [+] -1 25346U 98032E 17117.89791153 .00000144 00000-0 44209-4 0 9994 -2 25346 86.3974 245.1108 0002203 97.2097 262.9349 14.34216923992191 -IRIDIUM 3 [+] -1 25431U 98048A 17117.90374625 .00000001 00000-0 -67858-5 0 9998 -2 25431 86.3928 276.7142 0002106 94.6643 16.5791 14.34214533978130 -IRIDIUM 76 [+] -1 25432U 98048B 17117.92247448 .00000007 00000-0 -46867-5 0 9996 -2 25432 86.3925 276.4620 0001940 92.4826 17.1674 14.34214115978391 -IRIDIUM 82 [+] -1 25467U 98051A 17117.87065042 .00000079 00000-0 21183-4 0 9991 -2 25467 86.4001 43.1700 0002837 82.9580 277.1938 14.34213951979401 -IRIDIUM 81 [+] -1 25468U 98051B 17117.86430326 .00000193 00000-0 61774-4 0 9999 -2 25468 86.3997 42.8160 0002181 80.1906 279.9536 14.34219346975599 -IRIDIUM 80 [+] -1 25469U 98051C 17117.40384119 .00000189 00000-0 65142-4 0 9996 -2 25469 86.3988 43.3120 0003272 78.4327 66.4447 14.30596473975552 -IRIDIUM 77 [+] -1 25471U 98051E 17117.93157272 .00000200 00000-0 64166-4 0 9994 -2 25471 86.3992 42.6449 0002156 85.0655 328.4298 14.34225556980572 -IRIDIUM 2 [-] -1 25527U 98066A 17117.90678267 .00002035 00000-0 10283-3 0 9999 -2 25527 85.5320 61.9255 0006700 278.4742 81.5738 15.16421450 10744 -IRIDIUM 86 [+] -1 25528U 98066B 17117.81002869 .00000203 00000-0 65421-4 0 9999 -2 25528 86.3991 10.8682 0002186 89.0243 271.1204 14.34227507971906 -IRIDIUM 84 [+] -1 25530U 98066D 17117.84174153 .00000210 00000-0 67830-4 0 9995 -2 25530 86.3991 11.0188 0002145 84.7169 275.4272 14.34213699969712 -IRIDIUM 83 [+] -1 25531U 98066E 17117.80368798 .00000198 00000-0 63630-4 0 9991 -2 25531 86.3997 11.1581 0002181 82.5835 277.5608 14.34214055966847 -IRIDIUM 20 [+] -1 25577U 98074A 17117.86320268 -.00000000 00000-0 -72200-5 0 9994 -2 25577 86.3925 276.4087 0002109 91.6898 268.4539 14.34212914146614 -IRIDIUM 11 [+] -1 25578U 98074B 17117.89747083 -.00000001 00000-0 -73242-5 0 9994 -2 25578 86.3924 276.5965 0002199 90.3714 21.0271 14.34213801970181 -IRIDIUM 14 [+] -1 25777U 99032A 17117.84720972 .00000141 00000-0 43227-4 0 9995 -2 25777 86.3974 244.9633 0002270 101.1246 259.0205 14.34216040947383 -IRIDIUM 21 [+] -1 25778U 99032B 17117.88522958 .00000139 00000-0 42734-4 0 9993 -2 25778 86.3972 244.9670 0002076 95.5406 264.6027 14.34216906940828 -IRIDIUM 91 [+] -1 27372U 02005A 17117.65294368 -.00000082 00000-0 -36315-4 0 9992 -2 27372 86.3926 308.3012 0001699 97.8828 305.4518 14.34216733804339 -IRIDIUM 90 [S] -1 27373U 02005B 17117.84536240 .00000227 00000-0 61964-4 0 9999 -2 27373 86.4505 11.1236 0002125 87.4358 272.7086 14.42962821804026 -IRIDIUM 94 [+] -1 27374U 02005C 17117.91627696 .00000046 00000-0 92397-5 0 9998 -2 27374 86.3927 276.7173 0001726 111.9825 358.3847 14.34213674808713 -IRIDIUM 95 [+] -1 27375U 02005D 17117.89193811 -.00000179 00000-0 -70968-4 0 9991 -2 27375 86.3693 308.2955 0001955 88.5968 271.5451 14.34216252803676 -IRIDIUM 96 [+] -1 27376U 02005E 17117.73051312 .00000135 00000-0 41100-4 0 9990 -2 27376 86.3990 340.3062 0001349 54.3120 305.8201 14.34223073209540 -IRIDIUM 97 [+] -1 27450U 02031A 17117.76857710 .00000116 00000-0 34347-4 0 9995 -2 27450 86.3958 339.9851 0002270 82.8060 277.3394 14.34222020782958 -IRIDIUM 98 [+] -1 27451U 02031B 17117.88699420 .00000201 00000-0 62734-4 0 9997 -2 27451 86.3991 43.2160 0002327 81.4242 344.2406 14.35766046784079 -MTI -1 26102U 00014A 17117.94352104 .00008740 00000-0 17706-3 0 9994 -2 26102 97.5700 286.7732 0009414 95.9957 25.9854 15.46621436946750 -CFESAT -1 30777U 07006F 17117.28713601 .00004305 00000-0 14268-3 0 9998 -2 30777 35.4266 51.8992 0006752 248.4129 111.5876 15.30794601560192 -SPIRALE A -1 33751U 09008C 17116.39485220 .00000092 00000-0 11326-3 0 9992 -2 33751 2.0179 217.9902 5519416 327.4129 8.2075 4.58656451108475 -SPIRALE B -1 33752U 09008D 17117.35600087 .00005865 00000-0 10304-2 0 9997 -2 33752 2.1231 22.8684 6963298 346.9032 1.8193 2.69824864 73473 -SAPPHIRE -1 39088U 13009C 17117.66534077 .00000022 00000-0 23521-4 0 9997 -2 39088 98.5611 321.2603 0012603 86.3197 273.9429 14.34135184218105 -MOLNIYA 2-9 -1 07276U 74026A 17117.18500011 .00000157 00000-0 -11886-2 0 9994 -2 07276 62.7524 180.6582 6869775 287.4035 12.5500 2.45097661203342 -MOLNIYA 2-10 -1 07376U 74056A 17117.47890507 -.00001760 00000-0 -32392-3 0 9990 -2 07376 62.8794 310.2427 7368465 292.2213 8.4684 2.01157543312611 -MOLNIYA 1-S -1 07392U 74060A 17117.89499132 -.00000359 00000-0 00000-0 0 9998 -2 07392 9.2668 308.1238 0008207 167.3197 167.2499 1.00303803100692 -MOLNIYA 1-29 -1 07780U 75036A 17117.11298319 .00000361 00000-0 -76416-3 0 9992 -2 07780 61.6285 140.6878 7341171 272.0213 13.6172 2.00696021307957 -MOLNIYA 2-13 -1 08015U 75063A 17117.02575217 -.00001166 00000-0 93093-4 0 9994 -2 08015 61.4143 141.6750 7421369 269.7800 13.6845 2.00307471306317 -MOLNIYA 2-14 -1 08195U 75081A 17117.01310124 .00000016 00000-0 -16672-4 0 9997 -2 08195 61.5067 110.8972 7438037 275.3103 12.0120 2.00548594305035 -MOLNIYA 3-3 -1 08425U 75105A 17117.54221560 .00001265 00000-0 45746-3 0 9992 -2 08425 61.1298 130.7328 7506239 269.2745 13.1863 2.00810853303734 -MOLNIYA 1-32 -1 08601U 76006A 17117.72320456 -.00001034 00000-0 -90935-2 0 9998 -2 08601 62.1673 214.6558 7186600 268.3560 16.0527 1.99974477 15173 -MOLNIYA 2-17 -1 09829U 77010A 17117.80438856 -.00001048 00000-0 -13291-2 0 9995 -2 09829 61.4445 236.3162 7353421 257.0015 19.0288 2.00765394291794 -MOLNIYA 1-36 -1 09880U 77021A 17117.82995904 .00001267 00000-0 46361-2 0 9993 -2 09880 61.7108 203.3707 7282937 267.2850 15.6326 2.00837128191757 -MOLNIYA 3-7 -1 09941U 77032A 17117.24426493 -.00000799 00000-0 -16087-2 0 9994 -2 09941 61.3293 209.0741 7360469 261.4908 17.0876 2.00656694290218 -MOLNIYA 3-8 -1 10455U 77105A 17114.54512876 .00001448 00000-0 47449-2 0 9994 -2 10455 62.2344 271.4086 7324628 267.5920 15.0651 2.00680803289429 -MOLNIYA 1-40 -1 10925U 78055A 17116.56741384 .00000263 00000-0 -31265-3 0 9998 -2 10925 62.3531 302.2200 7383100 271.7896 13.2209 2.00520334285012 -MOLNIYA 3-10 -1 11057U 78095A 17109.43770018 .00049988 25478-4 63547-4 0 9998 -2 11057 62.4848 31.9740 7188319 270.1075 15.4387 2.47200969309471 -MOLNIYA 1-44 -1 11474U 79070A 17117.96205142 .00446550 44561-5 79377-3 0 9991 -2 11474 61.9919 113.1750 1384330 32.2381 335.6087 13.08646568558640 -MOLNIYA 3-13 -1 11896U 80063A 17116.84104019 -.00000176 00000-0 -18033-3 0 9999 -2 11896 62.7231 48.8043 7439371 265.9699 14.7769 2.00644230269445 -MOLNIYA 1-49 -1 12156U 81009A 17115.20553569 -.00000030 00000-0 00000-0 0 9997 -2 12156 64.2127 80.5515 7026950 248.7754 325.2828 2.05695898182866 -MOLNIYA 1-52 -1 13012U 81123A 17117.36185473 .00000682 00000-0 15493+0 0 9993 -2 13012 64.2706 161.9879 6652901 255.1210 144.6066 2.00379983258913 -MOLNIYA 1-53 -1 13070U 82015A 17117.47165109 .00000371 00000-0 10653-2 0 9995 -2 13070 62.5223 146.9671 7224045 263.3504 263.7285 2.00694828257594 -MOLNIYA 3-20 -1 13875U 83015A 17117.64593015 .00001279 00000-0 81374-1 0 9994 -2 13875 63.7580 226.7341 6751043 263.2007 177.0431 2.00530957186106 -MOLNIYA 1-56 -1 13890U 83019A 17117.91638161 -.00001033 00000-0 00000-0 0 9992 -2 13890 63.4672 257.1943 6965316 264.5838 135.2078 1.99927828249088 -MOLNIYA 1-62 -1 15214U 84089A 17117.53508749 .00001282 00000-0 69703-2 0 9990 -2 15214 63.0636 282.3408 7252041 262.8082 17.4402 1.97926270207106 -MOLNIYA 1-63 -1 15429U 84124A 17115.55956084 .00000922 00000-0 00000-0 0 9990 -2 15429 63.9665 0.3621 6966457 273.0017 216.1902 2.00383274237061 -MOLNIYA 3-24 -1 15738U 85040A 17117.17845494 -.00000053 00000-0 -66946-2 0 9993 -2 15738 64.5521 27.9781 6522503 264.8163 340.7369 2.55627939255873 -MOLNIYA 3-27 -1 16393U 85117A 17117.64413878 .00000054 00000-0 98249-1 0 9994 -2 16393 64.7819 281.6542 6668484 274.1387 66.9412 2.12397555234333 -MOLNIYA 1-69 -1 17078U 86089A 17117.64593154 -.00001352 00000-0 -17027-1 0 9999 -2 17078 64.2285 26.2759 6999932 274.2665 13.1122 2.00365993223174 -MOLNIYA 3-31 -1 17328U 87008A 17117.11068990 .00000315 00000-0 20432-2 0 9997 -2 17328 64.2198 329.4223 7003767 270.6614 345.9651 2.00587083218236 -MOLNIYA 1-71 -1 18946U 88017A 17117.12561281 .00000009 00000-0 -77034-2 0 9998 -2 18946 64.0388 339.9913 7112085 268.7457 346.9397 2.00659827213386 -MOLNIYA 1-75 -1 19807U 89014A 17117.33297714 .00000668 00000-0 -36793-1 0 9990 -2 19807 63.7223 143.5947 6778479 278.1940 15.8259 2.00511517206440 -MOLNIYA 1-80 -1 21118U 91012A 17117.83876669 .00000305 00000-0 -52404-1 0 9991 -2 21118 63.1277 188.7050 6935019 291.8111 11.0903 2.05248348192480 -MOLNIYA 3-40 -1 21196U 91022A 17117.09147804 -.00000758 00000-0 -16664-1 0 9999 -2 21196 63.3101 178.5307 6891829 290.4302 11.6579 2.03008837191583 -MOLNIYA 1-81 -1 21426U 91043A 17117.78154761 .00000317 00000-0 00000-0 0 9999 -2 21426 63.6031 200.2580 6838512 281.2846 14.4774 2.00608705189505 -MOLNIYA 3-41 -1 21706U 91065A 17116.23832472 -.00000897 00000-0 -39603-2 0 9993 -2 21706 64.3750 20.2976 7073515 275.0981 345.0422 2.04363036188553 -MOLNIYA 3-42 -1 22178U 92067A 17117.13542798 .00000116 00000-0 00000-0 0 9998 -2 22178 63.5587 95.9232 6875902 287.4669 12.4362 2.20435236 38797 -MOLNIYA 1-86 -1 22671U 93035A 17117.86995379 -.00000016 00000-0 28821-4 0 9994 -2 22671 63.0176 245.1346 4896231 338.5197 6.4917 5.62526675246729 -MOLNIYA 1-87 -1 22949U 93079A 17116.47065918 -.00000977 00000-0 23000-3 0 9992 -2 22949 62.7317 325.4333 7429278 287.1588 9.1922 2.02849657171189 -MOLNIYA 1-88 -1 23420U 94081A 17116.73899444 -.00000095 00000-0 -49862-3 0 9995 -2 23420 63.4461 294.6141 6253413 300.6210 12.2756 3.34499379 50896 -MOLNIYA 3-47 -1 23642U 95042A 17116.13040700 .00000851 00000-0 24543-3 0 9993 -2 23642 62.7058 303.0579 7386340 286.4924 9.5193 2.01975264159109 -MOLNIYA 1-90 -1 24960U 97054A 17115.96966762 .00004386 00000-0 59059-3 0 9994 -2 24960 62.6366 287.2931 6609721 288.7520 335.8512 3.18377422148228 -MOLNIYA 1-91 -1 25485U 98054A 17117.38289804 -.00000003 00000-0 84768-3 0 9999 -2 25485 61.8870 127.0796 7408205 271.1157 251.0052 2.00729305136113 -MOLNIYA 3-50 -1 25847U 99036A 17116.90756375 -.00000227 00000-0 -52688-2 0 9995 -2 25847 62.1670 254.7348 7276774 266.1768 16.0121 2.00613762130449 -COSMOS 2361 [-] -1 25590U 98076A 17117.95632517 .00000048 00000-0 35297-4 0 9998 -2 25590 82.9330 153.1143 0032178 26.7439 22.3272 13.72931641918786 -COSMOS 2378 [-] -1 26818U 01023A 17117.86040032 .00000037 00000-0 23568-4 0 9999 -2 26818 82.9307 174.6684 0032665 341.5083 18.4891 13.73914330796623 -COSMOS 2389 [-] -1 27436U 02026A 17117.60143981 .00000026 00000-0 11749-4 0 9995 -2 27436 82.9476 118.6258 0045591 210.5065 289.2196 13.74912988748518 -COSMOS 2398 [-] -1 27818U 03023A 17117.86858702 .00000044 00000-0 31602-4 0 9999 -2 27818 82.9478 73.9484 0030114 221.0570 138.8318 13.72142316696033 -COSMOS 2407 [+] -1 28380U 04028A 17117.89269487 .00000024 00000-0 91166-5 0 9999 -2 28380 82.9648 25.5555 0038066 222.8936 136.9257 13.76039047641084 -COSMOS 2414 [+] -1 28521U 05002A 17117.58866609 .00000038 00000-0 18592-4 0 9990 -2 28521 82.9506 47.0597 0040783 121.2831 239.2561 13.87584609621268 -COSMOS 2429 [-] -1 32052U 07038A 17117.64387867 .00000048 00000-0 34357-4 0 9994 -2 32052 82.9787 145.0103 0038179 191.5541 168.4743 13.74887379483008 -COSMOS 2454 [-] -1 35635U 09039A 17117.85454621 .00000038 00000-0 18230-4 0 9994 -2 35635 82.9594 36.7082 0020792 85.1717 275.1816 13.89610890394063 -COSMOS 2463 [+] -1 36519U 10017A 17117.96712720 .00000113 00000-0 10834-3 0 9998 -2 36519 82.9636 181.0281 0037154 30.2831 330.0460 13.71411329350587 -TRANSIT 16 [?] -1 02807U 67048A 17117.45348383 .00000045 00000-0 55053-4 0 9998 -2 02807 89.6234 106.6167 0018943 220.8468 293.3582 13.50147510457570 -TRANSIT 17 [?] -1 02965U 67092A 17117.91299644 .00000036 00000-0 36667-4 0 9998 -2 02965 89.2437 263.5052 0048256 23.1536 87.7180 13.52870434444904 -TRANSIT 18 [?] -1 03133U 68012A 17117.56334372 .00000051 00000-0 64786-4 0 9998 -2 03133 89.9583 275.3834 0073912 296.5083 114.0616 13.50980903143736 -NNSS 19 [?] -1 04507U 70067A 17117.93442010 .00000011 00000-0 -18225-6 0 9993 -2 04507 89.8330 263.5638 0173594 56.4569 305.3027 13.50647595296840 -NNSS O-20 [?] -1 06909U 73081A 17117.94949199 .00000087 00000-0 78331-4 0 9995 -2 06909 89.8238 313.5261 0158209 155.1661 205.7224 13.70437650372005 -TRANSAT [?] -1 10457U 77106A 17117.80132373 .00000051 00000-0 66102-4 0 9997 -2 10457 89.7652 173.1952 0023144 276.8515 217.6899 13.48566156942734 -NOVA I [?] -1 12458U 81044A 17117.94501454 -.00000002 00000-0 -25504-4 0 9990 -2 12458 89.9532 121.6551 0015291 144.5649 273.9847 13.22958765735227 -NOVA 3 [?] -1 15362U 84110A 17117.87665608 .00000064 00000-0 13108-3 0 9990 -2 15362 90.0486 54.6198 0032627 16.5314 43.3775 13.22730074570425 -OSCAR 30 [?] -1 15935U 85066A 17117.91952868 .00000052 00000-0 81393-4 0 9998 -2 15935 90.1349 49.6081 0168314 331.3681 69.2692 13.35618191543900 -OSCAR 24 [?] -1 15936U 85066B 17117.88442588 .00000044 00000-0 66084-4 0 9999 -2 15936 90.1231 43.4681 0169243 335.7767 63.6950 13.35496962545844 -POLAR BEAR [?] -1 17070U 86088A 17117.64245549 .00000053 00000-0 44091-4 0 9991 -2 17070 89.5359 329.5169 0036710 258.8814 133.8306 13.74727653526815 -OSCAR 27 [?] -1 18361U 87080A 17117.67230873 .00000052 00000-0 74527-4 0 9991 -2 18361 90.3310 333.8567 0102892 244.7870 114.2582 13.44429329452135 -OSCAR 29 [?] -1 18362U 87080B 17117.74339689 .00000046 00000-0 65352-4 0 9994 -2 18362 90.3314 334.0829 0104430 261.3542 142.0040 13.44018968451809 -OSCAR 23 [?] -1 19070U 88033A 17117.53705146 .00000018 00000-0 24650-4 0 9997 -2 19070 90.3605 271.6519 0188858 301.5176 98.0286 13.27405673404711 -OSCAR 32 [?] -1 19071U 88033B 17117.55920948 .00000050 00000-0 89869-4 0 9998 -2 19071 90.3603 271.7286 0186737 290.7914 110.1818 13.27590935404662 -NOVA 11 [?] -1 19223U 88052A 17117.97006957 .00000004 00000-0 -12542-4 0 9993 -2 19223 89.9625 87.1569 0032288 57.4551 4.0150 13.22648892392957 -OSCAR 25 [?] -1 19419U 88074A 17117.83723774 .00000047 00000-0 65845-4 0 9992 -2 19419 89.9886 19.0530 0094734 231.2163 170.2890 13.42162815403970 -OSCAR 31 [?] -1 19420U 88074B 17117.79402862 .00000056 00000-0 81552-4 0 9994 -2 19420 89.9892 19.0674 0093001 225.4183 168.8783 13.42174902403807 -NOAA 1 [-] -1 04793U 70106A 17117.84085573 -.00000035 00000-0 63216-4 0 9995 -2 04793 101.8056 183.1654 0031596 355.5009 118.9602 12.53980189122362 -NOAA 2 [-] -1 06235U 72082A 17117.86339319 -.00000038 00000-0 41133-4 0 9992 -2 06235 101.6769 83.8088 0004424 83.7988 330.3647 12.53091734 36910 -NOAA 3 [-] -1 06920U 73086A 17117.91849519 -.00000063 00000-0 -14181-3 0 9993 -2 06920 101.9352 88.4608 0006516 166.9970 254.3189 12.40353976968128 -NOAA 4 [-] -1 07529U 74089A 17117.86342976 -.00000041 00000-0 22843-4 0 9992 -2 07529 101.6354 87.6995 0009153 116.2480 297.6486 12.53109900941498 -NOAA 5 [-] -1 09057U 76077A 17117.96689385 -.00000057 00000-0 -10361-3 0 9997 -2 09057 101.8248 101.5926 0010059 24.7923 38.7677 12.37764663841560 -TIROS N [P] -1 11060U 78096A 17117.74700414 .00000036 00000-0 39594-4 0 9995 -2 11060 98.8999 167.6216 0011650 122.8361 237.3937 14.18154018205595 -NOAA 6 [P] -1 11416U 79057A 17117.92634482 .00000048 00000-0 33236-4 0 9999 -2 11416 98.5763 106.2775 0011177 42.2591 317.9452 14.33413129972663 -NOAA 7 [-] -1 12553U 81059A 17117.97257737 -.00000021 00000-0 12338-4 0 9998 -2 12553 99.0474 98.8025 0012213 43.5553 22.0219 14.17215168851991 -NOAA 8 [-] -1 13923U 83022A 17117.57907620 .00000035 00000-0 31193-4 0 9995 -2 13923 98.5104 108.9301 0014426 315.4930 44.5092 14.28582580774411 -NOAA 9 [P] -1 15427U 84123A 17117.87944984 .00000027 00000-0 35769-4 0 9990 -2 15427 98.7994 62.4530 0015920 102.4673 310.3083 14.15996593671023 -NOAA 10 [-] -1 16969U 86073A 17117.93478462 .00000002 00000-0 17720-4 0 9998 -2 16969 98.4624 128.1266 0013294 66.3666 351.7658 14.28005733593009 -NOAA 11 [-] -1 19531U 88089A 17117.78279177 .00000006 00000-0 24728-4 0 9990 -2 19531 98.5564 178.3042 0011295 177.1424 182.9816 14.15206837475375 -NOAA 12 [-] -1 21263U 91032A 17117.91271234 -.00000004 00000-0 16544-4 0 9994 -2 21263 98.5677 143.0754 0014890 70.7488 289.5302 14.25840455349304 -NOAA 13 [-] -1 22739U 93050A 17117.75124287 -.00000005 00000-0 20017-4 0 9993 -2 22739 98.5655 168.6988 0008712 324.2462 35.8126 14.12681367222077 -NOAA 14 [-] -1 23455U 94089A 17117.94084525 -.00000009 00000-0 17901-4 0 9995 -2 23455 98.6889 194.2858 0008452 302.8653 57.1707 14.14096510151490 -NOAA 15 [B] -1 25338U 98030A 17117.96894994 .00000036 00000-0 34234-4 0 9995 -2 25338 98.7838 128.7757 0010432 359.1807 0.9354 14.25788655985583 -NOAA 16 [-] -1 26536U 00055A 17117.94374048 .00000008 00000-0 27980-4 0 9996 -2 26536 98.8586 191.2188 0011660 103.7757 256.4713 14.13174840152304 -NOAA 17 [-] -1 27453U 02032A 17117.91791449 .00000000 00000-0 18060-4 0 9998 -2 27453 98.4296 84.3817 0011588 353.3156 6.7868 14.24983706771599 -NOAA 18 [B] -1 28654U 05018A 17117.96799378 .00000017 00000-0 34642-4 0 9995 -2 28654 99.1861 138.9463 0013859 208.7422 151.2987 14.12334472615079 -NOAA 19 [+] -1 33591U 09005A 17117.89348672 .00000104 00000-0 81534-4 0 9999 -2 33591 99.0880 84.0177 0014922 56.0394 304.2193 14.12174414423290 -NPP [+] -1 37849U 11061A 17117.96995167 .00000005 00000-0 23224-4 0 9991 -2 37849 98.7325 57.3739 0000564 55.4253 2.0870 14.19546095284971 -ORBCOMM-X [-] -1 21576U 91050C 17117.94741251 .00000057 00000-0 31800-4 0 9994 -2 21576 98.7261 142.7395 0004887 101.7107 258.4630 14.41445707353805 -ORBCOMM FM01 [-] -1 23545U 95017A 17117.50945160 .00000524 00000-0 97742-4 0 9992 -2 23545 69.9685 102.7395 0004452 7.7705 352.3508 14.70708937174725 -ORBCOMM FM02 [-] -1 23546U 95017B 17117.93153280 .00000463 00000-0 90001-4 0 9997 -2 23546 69.9703 110.8793 0006753 357.9890 2.1225 14.69590915174336 -ORBCOMM FM08 [+] -1 25112U 97084A 17117.83456081 -.00000148 00000-0 -16027-5 0 9997 -2 25112 45.0158 106.2471 0006666 35.3048 324.8241 14.38553667 13033 -ORBCOMM FM10 [+] -1 25113U 97084B 17117.44975745 .00000341 00000-0 15657-3 0 9997 -2 25113 45.0170 109.1683 0005662 358.9528 1.1308 14.38541391187994 -ORBCOMM FM11 [+] -1 25114U 97084C 17117.44100739 .00000210 00000-0 11426-3 0 9996 -2 25114 45.0155 108.5356 0006438 2.7652 357.3231 14.38536498 12970 -ORBCOMM FM12 [+] -1 25115U 97084D 17117.42438912 .00000240 00000-0 12388-3 0 9993 -2 25115 45.0161 108.4081 0005457 0.1655 359.9194 14.38534450 12788 -ORBCOMM FM09 [+] -1 25116U 97084E 17117.43327798 .00000257 00000-0 12950-3 0 9997 -2 25116 45.0167 108.9389 0006765 350.6608 9.4114 14.38539829 12970 -ORBCOMM FM05 [+] -1 25117U 97084F 17117.39673104 .00000236 00000-0 12282-3 0 9993 -2 25117 45.0161 109.2435 0002140 343.6752 16.4027 14.38538942 12994 -ORBCOMM FM06 [+] -1 25118U 97084G 17117.48772713 .00000272 00000-0 13427-3 0 9992 -2 25118 45.0159 108.6830 0001970 343.6307 159.4706 14.38527729 12982 -ORBCOMM FM07 [+] -1 25119U 97084H 17117.40716582 .00000072 00000-0 69527-4 0 9998 -2 25119 45.0156 109.2280 0003734 352.6786 7.4008 14.38541437 12975 -ORBCOMM FM03 [-] -1 25158U 98007B 17117.95129347 .00000074 00000-0 80215-4 0 9993 -2 25158 107.9843 183.8024 0047894 1.9679 358.1639 14.29050287999061 -ORBCOMM FM04 [+] -1 25159U 98007C 17117.89455720 .00000173 00000-0 11820-3 0 9999 -2 25159 107.9837 184.5557 0043421 2.1615 357.9703 14.29367211999189 -ORBCOMM FM17 [-] -1 25413U 98046A 17117.66213867 .00000135 00000-0 10432-3 0 9990 -2 25413 44.9947 166.7892 0003750 224.3679 135.6866 14.30548406977206 -ORBCOMM FM18 [+] -1 25414U 98046B 17117.48831843 .00000042 00000-0 66791-4 0 9998 -2 25414 44.9945 137.2137 0005694 227.9788 132.0573 14.32532042977576 -ORBCOMM FM19 [+] -1 25415U 98046C 17117.52472101 .00000117 00000-0 94046-4 0 9999 -2 25415 44.9949 137.2827 0004153 228.9426 267.6330 14.32537699977575 -ORBCOMM FM20 [+] -1 25416U 98046D 17117.53511376 .00000107 00000-0 90625-4 0 9997 -2 25416 44.9948 137.5053 0002171 265.0635 229.5245 14.32510043977690 -ORBCOMM FM16 [+] -1 25417U 98046E 17117.51835742 .00000182 00000-0 11789-3 0 9998 -2 25417 44.9975 139.1127 0004648 240.2721 119.7663 14.32525452977574 -ORBCOMM FM15 [+] -1 25418U 98046F 17117.55425002 .00000195 00000-0 12247-3 0 9991 -2 25418 44.9978 139.2566 0005419 243.3044 254.3601 14.32535587977573 -ORBCOMM FM14 [+] -1 25419U 98046G 17117.49826115 .00000255 00000-0 14462-3 0 9993 -2 25419 44.9975 139.3619 0004018 241.9249 273.6605 14.32532337977563 -ORBCOMM FM13 [+] -1 25420U 98046H 17117.57660389 .00000147 00000-0 10487-3 0 9996 -2 25420 44.9980 139.5101 0005665 228.3878 275.3322 14.32525018977793 -ORBCOMM FM21 [+] -1 25475U 98053A 17117.72103521 .00000125 00000-0 97148-4 0 9997 -2 25475 45.0098 221.7588 0002381 206.0593 154.0133 14.32502152970742 -ORBCOMM FM22 [-] -1 25476U 98053B 17117.70596384 .00000139 00000-0 10194-3 0 9999 -2 25476 45.0091 222.3589 0003470 191.9475 168.1289 14.32617572970735 -ORBCOMM FM23 [+] -1 25477U 98053C 17117.77648259 .00000034 00000-0 64056-4 0 9997 -2 25477 45.0098 221.9152 0003001 197.6012 162.4730 14.32419972970905 -ORBCOMM FM24 [-] -1 25478U 98053D 17117.74761547 .00000113 00000-0 92789-4 0 9993 -2 25478 45.0096 223.7533 0002727 202.7179 157.3547 14.32486437971138 -ORBCOMM FM25 [-] -1 25479U 98053E 17117.80248966 .00000163 00000-0 11105-3 0 9993 -2 25479 45.0088 222.1312 0005391 201.6280 158.4339 14.32507514971152 -ORBCOMM FM26 [-] -1 25480U 98053F 17117.72298430 .00000183 00000-0 11844-3 0 9999 -2 25480 45.0080 211.9949 0007778 220.1150 139.9123 14.32349891971181 -ORBCOMM FM27 [+] -1 25481U 98053G 17117.73628847 .00000117 00000-0 94163-4 0 9993 -2 25481 45.0071 222.4642 0001868 235.7137 124.3533 14.32496695971133 -ORBCOMM FM28 [-] -1 25482U 98053H 17117.62686340 .00000160 00000-0 10813-3 0 9991 -2 25482 45.0085 174.7205 0006186 236.4681 123.5575 14.33344671971744 -ORBCOMM FM30 [+] -1 25980U 99065A 17117.91189289 .00000128 00000-0 98397-4 0 9998 -2 25980 45.0342 33.9369 0006064 331.1762 28.8749 14.32471685907922 -ORBCOMM FM31 [+] -1 25981U 99065B 17117.89796143 .00000154 00000-0 10789-3 0 9996 -2 25981 45.0259 29.7440 0005347 354.5862 5.4926 14.32470662907580 -ORBCOMM FM32 [+] -1 25982U 99065C 17117.96759007 .00000087 00000-0 84054-4 0 9995 -2 25982 45.0206 28.4865 0007187 0.2874 106.4309 14.31972773908444 -ORBCOMM FM33 [P] -1 25983U 99065D 17117.88048494 .00000184 00000-0 11384-3 0 9991 -2 25983 45.0318 356.8075 0009558 332.2676 89.0440 14.34721469908902 -ORBCOMM FM36 [+] -1 25984U 99065E 17117.25641991 .00000222 00000-0 13267-3 0 9999 -2 25984 45.0392 39.6290 0003575 282.1254 77.9192 14.32471378907928 -ORBCOMM FM35 [+] -1 25985U 99065F 17117.94076909 .00000165 00000-0 11177-3 0 9991 -2 25985 45.0421 37.9749 0004370 355.6416 4.4392 14.32479690908295 -ORBCOMM FM34 [+] -1 25986U 99065G 17117.22976867 .00000181 00000-0 11772-3 0 9994 -2 25986 45.0416 40.6021 0005036 314.3323 45.7111 14.32459592908367 -ORBCOMM FM38 [-] -1 33060U 08031A 17117.90143349 .00000071 00000-0 41844-4 0 9997 -2 33060 48.4438 296.1526 0006402 329.3357 30.7180 14.73270574476028 -ORBCOMM FM41 [-] -1 33061U 08031B 17117.87390976 .00000065 00000-0 40931-4 0 9993 -2 33061 48.4472 298.8339 0005539 320.4347 138.9949 14.73128302475618 -ORBCOMM FM29 [-] -1 33062U 08031C 17117.80650523 .00000100 00000-0 46510-4 0 9993 -2 33062 48.4426 304.7812 0007574 319.2438 118.1783 14.72910771475905 -ORBCOMM FM39 [-] -1 33063U 08031D 17117.91202414 .00000053 00000-0 39676-4 0 9990 -2 33063 48.4437 312.1310 0008727 309.1637 50.8499 14.72342778475399 -ORBCOMM FM37 [-] -1 33064U 08031E 17117.90023053 .00000055 00000-0 39855-4 0 9991 -2 33064 48.4430 306.0772 0006774 320.3675 138.9856 14.72584356475579 -ORBCOMM FM40 [-] -1 33065U 08031F 17117.92217531 .00000123 00000-0 49994-4 0 9991 -2 33065 48.4456 306.8994 0008425 320.9412 148.8677 14.73046035475458 -ORBCOMM FM109 [+] -1 40086U 14040A 17117.85009606 .00000030 00000-0 45469-4 0 9993 -2 40086 47.0049 310.9937 0002114 30.9819 329.1190 14.54582556148232 -ORBCOMM FM107 [+] -1 40087U 14040B 17117.86680543 .00000034 00000-0 46239-4 0 9990 -2 40087 47.0070 311.2552 0001834 36.4518 323.6491 14.54581050148230 -ORBCOMM FM106 [+] -1 40088U 14040C 17117.88330687 .00000035 00000-0 46577-4 0 9990 -2 40088 47.0052 311.2549 0002000 37.0060 323.0962 14.54595564148065 -ORBCOMM FM111 [-] -1 40089U 14040D 17117.57194257 .00000059 00000-0 37151-4 0 9992 -2 40089 47.0060 153.1218 0035872 164.1469 196.0555 14.76870656150284 -ORBCOMM FM104 [+] -1 40090U 14040E 17117.91288997 -.00000008 00000-0 37860-4 0 9999 -2 40090 47.0067 313.0579 0017676 357.0921 2.9857 14.53213828148204 -ORBCOMM FM103 [+] -1 40091U 14040F 17117.90136874 .00000037 00000-0 47033-4 0 9999 -2 40091 47.0070 311.4926 0001944 25.5967 334.5013 14.54586266131294 -ORBCOMM FM114 [+] -1 41179U 15081A 17117.74033470 .00000071 00000-0 54794-4 0 9993 -2 41179 47.0028 222.3846 0001780 109.8684 250.2392 14.54572562 71556 -ORBCOMM FM119 [+] -1 41180U 15081B 17117.68033978 -.00000027 00000-0 32081-4 0 9998 -2 41180 47.0005 131.9132 0002046 202.9829 157.0964 14.54569229 72745 -ORBCOMM FM105 [+] -1 41181U 15081C 17117.77331264 -.00000038 00000-0 34998-4 0 9999 -2 41181 47.0017 236.7378 0001965 318.8197 41.2534 14.43232043 71250 -ORBCOMM FM110 [+] -1 41182U 15081D 17117.71806270 .00000073 00000-0 55352-4 0 9993 -2 41182 47.0015 222.1929 0002055 253.9553 106.1105 14.54573612 71444 -ORBCOMM FM118 [+] -1 41183U 15081E 17117.76340567 .00000078 00000-0 56461-4 0 9998 -2 41183 47.0036 221.7995 0001841 264.8167 95.2506 14.54567487 71569 -ORBCOMM FM112 [+] -1 41184U 15081F 17117.45718954 -.00000014 00000-0 35261-4 0 9990 -2 41184 46.9978 132.7392 0002087 200.2199 159.8603 14.54569721 72713 -ORBCOMM FM113 [+] -1 41185U 15081G 17117.50845111 -.00000025 00000-0 32575-4 0 9990 -2 41185 47.0003 132.3155 0002050 201.2822 158.7977 14.54570723 72729 -ORBCOMM FM115 [+] -1 41186U 15081H 17117.96232738 .00000191 00000-0 43875-4 0 9994 -2 41186 46.9988 84.4280 0001038 277.5800 82.4979 14.88344023 73380 -ORBCOMM FM108 [+] -1 41187U 15081J 17117.40320751 .00000294 00000-0 54899-4 0 9999 -2 41187 46.9972 86.8857 0002072 23.7925 336.3068 14.88340355 73304 -ORBCOMM FM117 [+] -1 41188U 15081K 17117.71689467 .00000223 00000-0 47266-4 0 9998 -2 41188 46.9999 85.1784 0001929 269.6264 90.4412 14.88349911 73355 -ORBCOMM FM116 [+] -1 41189U 15081L 17117.49115664 -.00000025 00000-0 32561-4 0 9990 -2 41189 47.0006 132.2593 0002033 205.6275 154.4509 14.54570226 72724 -O3B FM5 -1 39188U 13031A 17117.33164342 -.00000020 00000-0 00000-0 0 9993 -2 39188 0.0421 30.8340 0007137 54.8425 274.4066 5.00115873 70143 -O3B FM4 -1 39189U 13031B 17117.22361053 -.00000020 00000-0 00000-0 0 9990 -2 39189 0.0505 356.7712 0004954 335.5421 27.6620 5.00115670 70159 -O3B FM2 -1 39190U 13031C 17117.19858684 -.00000020 00000-0 00000-0 0 9999 -2 39190 0.0555 355.6952 0005402 332.0936 32.1800 5.00115591 70111 -O3B PFM -1 39191U 13031D 17117.22198016 -.00000020 00000-0 00000-0 0 9990 -2 39191 0.0421 19.2587 0004299 4.1628 336.5998 5.00115854 70121 -O3B FM3 -1 40079U 14038A 17117.33376629 -.00000020 00000-0 00000-0 0 9995 -2 40079 0.0472 6.6980 0004096 62.9723 290.3754 5.00115863 46236 -O3B FM7 -1 40080U 14038B 17116.48876216 -.00000019 00000-0 00000-0 0 9997 -2 40080 0.0470 3.9192 0002809 43.4175 312.6888 5.00115408 50973 -O3B FM6 -1 40081U 14038C 17117.31115341 -.00000020 00000-0 00000-0 0 9998 -2 40081 0.0471 5.4973 0003105 50.2003 304.3334 5.00114946 51134 -O3B FM8 -1 40082U 14038D 17117.15610756 -.00000020 00000-0 00000-0 0 9991 -2 40082 0.0477 1.6310 0003814 29.5079 328.8854 5.00115080 51108 -O3B FM10 -1 40348U 14083A 17117.57798659 -.00000021 00000-0 00000-0 0 9992 -2 40348 0.0454 14.2021 0001517 33.3745 312.4379 5.00115858 43080 -O3B FM11 -1 40349U 14083B 17117.19999894 -.00000020 00000-0 00000-0 0 9994 -2 40349 0.0434 16.0104 0001914 13.6128 330.3893 5.00115655 43061 -O3B FM12 -1 40350U 14083C 17117.26694752 -.00000020 00000-0 00000-0 0 9999 -2 40350 0.0435 14.7406 0002491 17.5160 327.7603 5.00115486 43076 -O3B FM9 -1 40351U 14083D 17117.24445637 -.00000020 00000-0 00000-0 0 9994 -2 40351 0.0443 17.1491 0001969 24.7054 318.1622 5.00115562 43089 -CELESTIS-02 -1 25160U 98007D 17117.83609623 -.00000087 00000-0 18726-4 0 9996 -2 25160 107.9518 92.6829 0060868 85.9216 333.2336 14.21460344996176 -CELESTIS-03 -1 26034U 99070C 17117.88790757 .00002143 00000-0 14939-3 0 9997 -2 26034 98.3217 307.5785 0012962 334.9086 25.1508 15.06592369937865 -CALSPHERE 1 -1 00900U 64063C 17117.90761248 .00000321 00000-0 33760-3 0 9990 -2 00900 90.1457 10.7179 0024413 264.9509 94.8868 13.72902568613119 -CALSPHERE 2 -1 00902U 64063E 17117.72176091 .00000056 00000-0 71017-4 0 9991 -2 00902 90.1526 13.0470 0017693 189.0743 230.2529 13.52647250405062 -LCS 1 -1 01361U 65034C 17117.62112730 .00000011 00000-0 38372-3 0 9996 -2 01361 32.1376 181.4978 0008974 312.9292 47.0452 9.89291535879354 -TEMPSAT 1 -1 01512U 65065E 17117.90531601 .00000018 00000-0 17627-4 0 9999 -2 01512 89.8235 243.1108 0068123 258.7706 220.5896 13.33401755515296 -CALSPHERE 4(A) -1 01520U 65065H 17117.97272528 .00000047 00000-0 73199-4 0 9993 -2 01520 90.0795 122.3177 0070322 153.3279 267.3699 13.35731458517147 -OPS 5712 (P/L 160) -1 02826U 67053A 17117.89517696 .00000796 00000-0 23115-3 0 9994 -2 02826 69.9298 359.6883 0004658 119.3859 240.7739 14.47845256580904 -OPS 5712 (P/L 153) -1 02874U 67053H 17117.89402687 -.00000037 00000-0 11514-4 0 9990 -2 02874 69.9742 64.1489 0009099 222.2755 137.7650 13.96287248540901 -SURCAL 150B -1 02909U 67053J 17117.95603251 .00001167 00000-0 25630-3 0 9993 -2 02909 69.9485 74.5888 0005824 219.7867 140.2845 14.60078862589426 -RIGIDSPHERE 2 (LCS 4) -1 05398U 71067E 17117.90825652 .00000228 00000-0 73799-4 0 9991 -2 05398 87.6289 180.2660 0066225 92.2366 268.6416 14.33568612395367 -RADUGA 1 [-] -1 08513U 75123A 17117.03132594 -.00000195 00000-0 00000-0 0 9995 -2 08513 10.5891 312.8219 0006440 181.2820 174.8452 1.00290873161475 -RADUGA 2 [-] -1 09416U 76092A 17117.03403675 -.00000172 00000-0 00000-0 0 9990 -2 09416 11.2011 314.6823 0028276 299.5932 53.9848 1.00249369 95868 -RADUGA 3 [-] -1 10159U 77071A 17117.74898215 -.00000351 00000-0 00000-0 0 9999 -2 10159 11.7488 316.9388 0008613 203.4304 68.3791 1.00328492143572 -RADUGA 4 [-] -1 10987U 78073A 17117.85778816 -.00000105 00000-0 00000-0 0 9994 -2 10987 12.2696 319.8007 0011778 298.6102 342.1253 1.00193353 86125 -RADUGA 5 [-] -1 11343U 79035A 17117.76356272 -.00000022 00000-0 00000-0 0 9996 -2 11343 12.6422 322.0553 0001495 119.2807 114.3605 1.00265334 95882 -RADUGA 6 [-] -1 11708U 80016A 17117.76680809 .00000052 00000-0 00000-0 0 9990 -2 11708 12.8936 324.5211 0003172 238.1415 345.4640 1.00214577 88697 -RADUGA 7 [-] -1 12003U 80081A 17117.39498734 .00000097 00000-0 00000-0 0 9993 -2 12003 13.0066 326.1429 0011588 236.2390 353.5749 1.00328085 89830 -RADUGA 8 [-] -1 12351U 81027A 17117.70813126 .00000061 00000-0 00000-0 0 9992 -2 12351 13.3036 326.9314 0084831 175.1574 18.8446 1.00408225 89046 -RADUGA 9 [-] -1 12618U 81069A 17117.76438260 .00000117 00000-0 00000-0 0 9994 -2 12618 13.4101 329.1119 0001024 344.8572 213.9307 1.00246630 13872 -RADUGA 10 [-] -1 12897U 81102A 17117.69600800 -.00000079 00000-0 00000-0 0 9992 -2 12897 13.4562 329.8538 0003115 169.8244 38.1226 1.00250106 83875 -RADUGA 11 [-] -1 13669U 82113A 17112.69630793 -.00000142 00000-0 00000-0 0 9993 -2 13669 14.9090 340.8916 0041139 207.0800 37.0927 0.97708911 88877 -RADUGA 12 [-] -1 13974U 83028A 17114.62341080 -.00000208 00000-0 00000-0 0 9994 -2 13974 14.1226 338.2350 0002914 307.9874 236.1780 1.00274057135877 -RADUGA 13 [-] -1 14307U 83088A 17116.58012678 -.00000229 00000-0 00000-0 0 9999 -2 14307 15.0345 342.5573 0016978 341.5304 260.5100 0.98175942 86165 -RADUGA 14 [-] -1 14725U 84016A 17117.76865531 -.00000025 00000-0 00000-0 0 9994 -2 14725 14.1198 341.2810 0000245 23.5579 192.6241 1.00260032 84636 -RADUGA 15 [-] -1 15057U 84063A 17117.85815227 -.00000379 00000-0 00000-0 0 9994 -2 15057 14.1789 342.2400 0001386 157.4257 150.8245 1.00238619107636 -RADUGA 16 [-] -1 15946U 85070A 17116.26462176 -.00000285 00000-0 00000-0 0 9991 -2 15946 14.3532 346.4342 0003173 252.9164 31.5047 1.00234663 88746 -RADUGA 17 [-] -1 16250U 85107A 17116.88226705 -.00000032 00000-0 00000-0 0 9995 -2 16250 14.3928 347.6100 0010524 149.1427 38.9573 1.00178206118363 -RADUGA 18 [-] -1 16497U 86007A 17116.83104878 -.00000161 00000-0 00000-0 0 9992 -2 16497 15.0587 349.8833 0070489 115.3813 60.0376 0.98814147112876 -RADUGA 19 [-] -1 17046U 86082A 17117.36746116 -.00000057 00000-0 00000-0 0 9996 -2 17046 15.2198 353.3497 0008073 107.4002 160.8542 0.98459262110049 -RADUGA 20 [-] -1 17611U 87028A 17116.56240126 -.00000169 00000-0 00000-0 0 9990 -2 17611 17.0126 356.8774 0024221 89.3361 143.0823 0.95963315106252 -RADUGA 21 [-] -1 18631U 87100A 17117.33160719 -.00000220 00000-0 00000-0 0 9997 -2 18631 15.1682 355.2047 0002072 251.1031 357.9867 1.00358387107619 -RADUGA 22 [-] -1 19596U 88095A 17117.87757578 .00000052 00000-0 00000-0 0 9998 -2 19596 14.8437 358.8222 0001991 125.0976 62.7101 1.00242475 88186 -RADUGA 23 [-] -1 19928U 89030A 17117.82618904 .00000109 00000-0 00000-0 0 9994 -2 19928 14.8521 0.4890 0017640 117.4674 64.0607 1.00281380101380 -RADUGA-1 1 [-] -1 20083U 89048A 17117.70272458 -.00000017 00000-0 00000-0 0 9993 -2 20083 15.4009 3.0741 0016187 62.0762 267.9508 0.98707605 98315 -RADUGA 24 [-] -1 20367U 89098A 17117.82270800 -.00000349 00000-0 00000-0 0 9993 -2 20367 15.2364 3.0566 0003910 239.8968 12.0788 1.00298101 99500 -RADUGA 25 [-] -1 20499U 90016A 17117.36387897 -.00000204 00000-0 00000-0 0 9995 -2 20499 14.9653 3.4695 0001944 246.9448 2.1787 1.00378466 99431 -RADUGA 26 [-] -1 21016U 90112A 17117.72234552 -.00000172 00000-0 00000-0 0 9991 -2 21016 15.0109 6.5816 0003286 349.6735 201.3288 1.00225558 96771 -RADUGA-1 2 [-] -1 21038U 90116A 17117.89744073 -.00000322 00000-0 00000-0 0 9998 -2 21038 15.0430 6.6916 0003279 21.1031 250.5953 1.00253215 13873 -RADUGA 27 [-] -1 21132U 91014A 17117.82132694 .00000110 00000-0 00000-0 0 9998 -2 21132 15.5660 6.9028 0002162 298.8682 243.1271 1.00343918 95848 -RADUGA 28 [-] -1 21821U 91087A 17117.90777341 -.00000386 00000-0 00000-0 0 9992 -2 21821 15.0472 9.9874 0002360 71.0093 219.8326 1.00263708 92855 -RADUGA 29 [-] -1 22557U 93013A 17117.55539973 -.00000338 00000-0 00000-0 0 9995 -2 22557 14.8996 14.0957 0001224 20.8915 155.1375 1.00284482 88226 -RADUGA 30 [-] -1 22836U 93062A 17117.78543576 -.00000091 00000-0 00000-0 0 9994 -2 22836 14.7822 15.8933 0006040 247.8160 306.7506 1.00284506 12538 -RADUGA-1 3 [-] -1 22981U 94008A 17117.75465862 .00000014 00000-0 00000-0 0 9998 -2 22981 14.7615 17.0955 0001773 258.7800 270.4885 1.00317686 85013 -RADUGA 31 [-] -1 23010U 94012A 17117.80674681 -.00000013 00000-0 00000-0 0 9994 -2 23010 14.7282 17.0575 0001310 315.6588 238.2608 1.00209853 84883 -RADUGA 32 [-] -1 23448U 94087A 17114.75179031 -.00000081 00000-0 00000-0 0 9996 -2 23448 14.4881 19.6273 0008014 204.2247 331.3409 1.00281507 99387 -RADUGA-1 4 [-] -1 25642U 99010A 17117.86299542 .00000084 00000-0 00000-0 0 9992 -2 25642 14.0534 31.8536 0005553 212.5738 332.9250 1.00209409 66483 -RADUGA-1 5 [-] -1 26477U 00049A 17117.90794802 -.00000275 00000-0 00000-0 0 9990 -2 26477 11.7188 34.0315 0002276 284.8690 318.1936 1.00220395 60957 -RADUGA-1 6 [-] -1 26936U 01045A 17117.31837152 -.00000064 00000-0 00000-0 0 9994 -2 26936 11.3751 39.3692 0015370 131.8915 71.2092 0.97743795 55970 -RADUGA-1 7 [-] -1 28194U 04010A 17117.80277064 -.00000227 00000-0 00000-0 0 9992 -2 28194 9.6361 46.6418 0003770 194.1258 354.2088 1.00170047 47941 -RADUGA-1M 1 [-] -1 32373U 07058A 17117.36545189 -.00000235 00000-0 00000-0 0 9997 -2 32373 2.9835 73.7397 0003008 247.0113 9.7070 0.99401300 19214 -RADUGA-1 8 [-] -1 34264U 09010A 17117.40150236 -.00000027 00000-0 00000-0 0 9997 -2 34264 5.6445 68.7815 0010507 297.7951 246.9326 0.99816659 29852 -RADUGA-1M 2 [+] -1 36358U 10002A 17117.91577310 -.00000197 00000-0 00000-0 0 9996 -2 36358 0.0265 259.9308 0002762 176.8821 193.9495 1.00272745 16641 -RADUGA-1M 3 [+] -1 39375U 13062A 17117.92063499 -.00000052 00000-0 00000-0 0 9996 -2 39375 0.0052 229.1858 0002841 203.8969 184.4430 1.00272377 12661 -SCD 1 -1 22490U 93009B 17117.75330972 .00000267 00000-0 23428-4 0 9999 -2 22490 24.9697 254.3975 0043025 162.2655 305.4169 14.44483526278301 -TECHSAT 1B (GO-32) -1 25397U 98043D 17117.87210180 -.00000007 00000-0 15920-4 0 9993 -2 25397 98.6063 61.2802 0002118 118.5780 241.5612 14.23620396976415 -SCD 2 -1 25504U 98060A 17117.35246248 .00000244 00000-0 18115-4 0 9990 -2 25504 24.9952 99.6889 0017183 192.4030 320.3555 14.44004897977587 -LANDSAT 7 -1 25682U 99020A 17117.79092659 .00000264 00000-0 68682-4 0 9993 -2 25682 98.2153 189.6418 0001113 96.7887 263.3430 14.57107304959254 -DLR-TUBSAT -1 25757U 99029B 17117.96664014 .00000046 00000-0 22861-4 0 9991 -2 25757 98.4155 29.8500 0015608 93.6659 266.6321 14.51357535949188 -QUIKSCAT -1 25789U 99034A 17117.63898297 -.00000009 00000-0 14272-4 0 9995 -2 25789 98.6068 307.0544 0001475 129.0261 231.1051 14.27275070929986 -TERRA -1 25994U 99068A 17117.80142603 .00000123 00000-0 37358-4 0 9998 -2 25994 98.2109 193.5573 0000796 103.5014 256.6277 14.57108027923339 -EO-1 -1 26619U 00075A 17117.69247499 .00000270 00000-0 59650-4 0 9991 -2 26619 97.8389 149.2746 0008635 267.7698 92.2496 14.64377576876148 -MAROC-TUBSAT -1 27004U 01056D 17117.91302615 -.00000040 00000-0 28360-5 0 9998 -2 27004 99.3478 259.1699 0020736 106.7120 4.3633 13.70122087769160 -AQUA -1 27424U 02022A 17117.90384507 .00000166 00000-0 46901-4 0 9995 -2 27424 98.2012 59.9560 0000140 10.1984 64.8011 14.57120005796901 -IRS-P6 (RESOURCESAT-1) -1 28051U 03046A 17117.87846487 .00000029 00000-0 32645-4 0 9993 -2 28051 98.6257 194.6895 0004991 110.1924 249.9787 14.21666728702130 -TANSUO 1 (TS 1) -1 28220U 04012A 17117.91258384 .00000003 00000-0 50787-5 0 9993 -2 28220 97.6944 74.6211 0009474 326.9428 33.1202 14.99160517708766 -FORMOSAT-2 (ROCSAT 2) -1 28254U 04018A 17117.81654788 .00000010 00000-0 35213-4 0 9997 -2 28254 98.8628 178.9581 0001389 322.7377 147.4924 14.00609030661541 -AURA -1 28376U 04026A 17117.89508280 .00000174 00000-0 48733-4 0 9996 -2 28376 98.2001 62.1239 0000952 96.4983 263.6324 14.57125904679956 -IRS-P5 (CARTOSAT-1) -1 28649U 05017A 17117.76942614 .00000344 00000-0 48300-4 0 9998 -2 28649 97.8631 192.9578 0001890 158.1916 201.9377 14.83451832648506 -SINAH 1 -1 28893U 05043D 17117.90047476 .00000032 00000-0 15357-4 0 9996 -2 28893 97.8685 278.4355 0014137 315.3002 44.7060 14.61429710612857 -EROS B -1 29079U 06014A 17117.85254906 .00007732 00000-0 26182-3 0 9995 -2 29079 97.3451 238.7725 0002675 248.6691 227.4838 15.30857586610647 -RESURS-DK 1 -1 29228U 06021A 17117.89884446 .00000244 00000-0 25881-4 0 9998 -2 29228 69.9360 226.0190 0002553 20.5766 339.5497 15.02138532600544 -ARIRANG-2 (KOMPSAT-2) -1 29268U 06031A 17117.88498326 .00000183 00000-0 45541-4 0 9997 -2 29268 98.1071 18.0603 0018497 159.5134 200.6809 14.62268135573648 -LAPAN-TUBSAT -1 29709U 07001A 17117.89473232 .00000158 00000-0 26205-4 0 9993 -2 29709 97.6990 94.5872 0011404 257.4159 102.5795 14.82050459556538 -CARTOSAT-2 (IRS-P7) -1 29710U 07001B 17117.84203336 .00000079 00000-0 17811-4 0 9991 -2 29710 97.9293 179.6269 0001099 38.1331 321.9928 14.78688362555752 -HAIYANG-1B -1 31113U 07010A 17117.83836495 .00000009 00000-0 20214-4 0 9992 -2 31113 98.5630 173.7078 0013881 358.4650 1.6486 14.30167830524275 -COSMO-SKYMED 1 -1 31598U 07023A 17117.81074779 .00000334 00000-0 48528-4 0 9999 -2 31598 97.8797 302.2796 0001640 90.1474 269.9931 14.82162541534982 -TERRASAR-X -1 31698U 07026A 17117.51443348 .00000177 00000-0 11610-4 0 9999 -2 31698 97.4463 125.8941 0001756 91.0749 269.0686 15.19148445547185 -WORLDVIEW-1 (WV-1) -1 32060U 07041A 17117.80175024 .00002414 00000-0 10126-3 0 9991 -2 32060 97.3811 238.5269 0000675 72.7166 49.8503 15.24450886534570 -YAOGAN 3 -1 32289U 07055A 17117.90007340 .00000201 00000-0 32947-4 0 9993 -2 32289 97.9985 119.9711 0001804 94.5391 265.6045 14.80805546511293 -COSMO-SKYMED 2 -1 32376U 07059A 17117.84451568 -.00000119 00000-0 -83547-5 0 9995 -2 32376 97.8795 302.3142 0001543 86.2257 273.9125 14.82158238507739 -RADARSAT-2 -1 32382U 07061A 17115.50222194 -.00000044 00000-0 28856-7 0 9997 -2 32382 98.5767 123.8716 0001282 86.2977 76.0370 14.29983695488764 -CARTOSAT-2A -1 32783U 08021A 17117.88739042 .00000439 00000-0 66820-4 0 9994 -2 32783 97.9306 179.7413 0014442 117.6573 242.6088 14.78676071485707 -JASON 2 (OSTM) -1 33105U 08032A 17117.95477267 -.00000043 00000-0 79730-4 0 9997 -2 33105 66.0417 225.9632 0007981 272.3976 214.8416 12.80928953414101 -RAPIDEYE 2 -1 33312U 08040A 17117.83454930 .00000154 00000-0 27106-4 0 9997 -2 33312 97.8194 200.1225 0013502 149.3440 210.8555 14.79911130467920 -RAPIDEYE 5 -1 33313U 08040B 17117.85747900 .00000175 00000-0 29946-4 0 9999 -2 33313 97.8316 198.0399 0017405 34.7396 325.4941 14.79906492467878 -RAPIDEYE 1 -1 33314U 08040C 17117.84589282 .00000155 00000-0 27303-4 0 9999 -2 33314 97.8211 199.7446 0024656 164.7300 195.4652 14.79912126467919 -RAPIDEYE 3 -1 33315U 08040D 17117.81476871 .00000188 00000-0 31670-4 0 9994 -2 33315 97.8342 197.6508 0013532 104.8603 255.4105 14.79914371467872 -RAPIDEYE 4 -1 33316U 08040E 17117.80138924 .00000199 00000-0 33155-4 0 9990 -2 33316 97.8385 197.1869 0012408 56.0823 304.1573 14.79909480467863 -HUANJING 1A (HJ-1A) -1 33320U 08041A 17117.90438058 .00000337 00000-0 55229-4 0 9998 -2 33320 97.9398 183.4818 0026167 184.3852 175.7116 14.76770344465369 -HUANJING 1B (HJ-1B) -1 33321U 08041B 17117.84531018 .00000397 00000-0 63426-4 0 9996 -2 33321 97.9445 184.5935 0034047 201.8959 158.0786 14.76845271465341 -GEOEYE 1 -1 33331U 08042A 17117.75778246 .00000143 00000-0 36152-4 0 9999 -2 33331 98.1124 193.6943 0010713 66.1041 294.1246 14.64150070461721 -THEOS -1 33396U 08049A 17117.86355759 .00000169 00000-0 10000-3 0 9990 -2 33396 98.6806 186.0210 0001043 98.1824 31.8161 14.20052886444335 -COSMO-SKYMED 3 -1 33412U 08054A 17117.83182498 .00000291 00000-0 43113-4 0 9998 -2 33412 97.8797 302.3010 0001428 90.8366 269.3007 14.82165670460195 -YAOGAN 4 -1 33446U 08061A 17117.96730530 .00000144 00000-0 27277-4 0 9993 -2 33446 97.5933 117.9610 0017432 104.1397 256.1752 14.76623623452611 -GOSAT (IBUKI) -1 33492U 09002A 17117.84316038 -.00000070 00000-0 -38634-5 0 9990 -2 33492 98.1154 229.9114 0001772 79.8047 280.3362 14.67523524442442 -YAOGAN 6 -1 34839U 09021A 17117.89503023 .00001110 00000-0 45908-4 0 9999 -2 34839 97.1496 170.6942 0030141 137.0550 223.3049 15.25573791444891 -DEIMOS-1 -1 35681U 09041A 17117.88799528 .00000150 00000-0 31897-4 0 9998 -2 35681 97.9589 11.3031 0002740 105.9182 254.2338 14.71653793415744 -DUBAISAT-1 -1 35682U 09041B 17117.87073638 .00000175 00000-0 38120-4 0 9998 -2 35682 97.8049 340.7077 0010821 320.8469 39.1955 14.68571564414823 -OCEANSAT 2 -1 35931U 09051A 17117.89063810 .00000125 00000-0 42790-4 0 9992 -2 35931 98.3070 213.1036 0002342 20.8114 339.3176 14.50846329402069 -WORLDVIEW-2 (WV-2) -1 35946U 09055A 17117.76800505 .00000011 00000-0 18236-4 0 9990 -2 35946 98.5060 194.5591 0001156 144.9263 215.1978 14.37762548396269 -SMOS -1 36036U 09059A 17117.63201199 .00000064 00000-0 34460-4 0 9990 -2 36036 98.4455 306.0489 0001352 86.6744 273.4599 14.39767398393338 -YAOGAN 7 -1 36110U 09069A 17117.85866219 -.00000183 00000-0 -19001-4 0 9996 -2 36110 98.2064 275.9751 0022899 274.9237 84.9361 14.75119481397463 -TANDEM-X -1 36605U 10030A 17117.51443261 -.00000023 00000-0 20733-5 0 9993 -2 36605 97.4464 125.8962 0001415 94.4760 265.6636 15.19148717379928 -CARTOSAT 2B -1 36795U 10035A 17117.85688660 .00000183 00000-0 31975-4 0 9994 -2 36795 97.9289 179.5698 0014015 188.0091 172.0885 14.78676905366749 -YAOGAN 10 -1 36834U 10038A 17117.78813719 .00000180 00000-0 30132-4 0 9999 -2 36834 97.9311 114.7638 0001887 86.0918 274.0498 14.80816073363028 -COSMO-SKYMED 4 -1 37216U 10060A 17117.79386222 .00000140 00000-0 24149-4 0 9991 -2 37216 97.8803 302.2638 0001573 80.7477 279.3913 14.82163905350279 -HAIYANG 2A -1 37781U 11043A 17117.93488988 .00000137 00000-0 17829-3 0 9990 -2 37781 99.3315 129.8588 0001740 102.1132 258.0240 13.78714394287051 -RASAT -1 37791U 11044D 17117.84761123 .00000103 00000-0 28568-4 0 9993 -2 37791 98.1333 210.3333 0020650 281.0703 78.8167 14.64597858304400 -MEGHA-TROPIQUES -1 37838U 11058A 17117.29304347 .00000306 00000-0 23916-4 0 9997 -2 37838 19.9772 93.5569 0009417 222.3872 137.5804 14.09680327218672 -SRMSAT -1 37841U 11058D 17117.97599463 .00000320 00000-0 30702-4 0 9998 -2 37841 19.9720 75.5771 0011683 249.1149 146.8476 14.10572141286091 -YAOGAN 13 -1 37941U 11072A 17117.89586382 .00002222 00000-0 11199-3 0 9993 -2 37941 97.4844 46.3925 0002744 84.7573 348.8531 15.18198176300037 -PLEIADES 1A -1 38012U 11076F 17117.78372785 .00000077 00000-0 26435-4 0 9991 -2 38012 98.2004 193.6234 0001641 84.4934 275.6452 14.58552117285512 -ZIYUAN 1-02C (ZY 1-02C) -1 38038U 11079A 17117.87664945 .00000089 00000-0 45677-4 0 9996 -2 38038 98.3467 183.4394 0000848 83.5064 276.6224 14.35448442280287 -ZIYUAN 3 (ZY 3) -1 38046U 12001A 17117.87154128 .00001412 00000-0 65897-4 0 9995 -2 38046 97.2888 185.7624 0002136 104.3543 5.2673 15.21415970294306 -RISAT 1 -1 38248U 12017A 17117.95728384 .00001925 00000-0 12563-3 0 9996 -2 38248 97.5741 126.2642 0003516 193.2634 222.5140 15.09044773275668 -ARIRANG-3 (KOMPSAT-3) -1 38338U 12025B 17117.81724405 .00000136 00000-0 36789-4 0 9990 -2 38338 98.1356 56.7719 0010963 122.4477 237.7790 14.61561849263821 -KANOPUS-V 1 -1 38707U 12039A 17117.86537073 .00000915 00000-0 45467-4 0 9991 -2 38707 97.4533 36.4977 0001482 69.4892 16.2538 15.20160319264417 -EXACTVIEW-1 (ADS-1B) -1 38709U 12039C 17117.88710796 .00000020 00000-0 29313-4 0 9999 -2 38709 99.0933 92.6499 0011907 39.9856 320.2193 14.23928950247678 -SPOT 6 -1 38755U 12047A 17117.86730632 .00000052 00000-0 20991-4 0 9996 -2 38755 98.2228 185.7620 0001295 76.7627 283.3704 14.58540738246602 -PLEIADES 1B -1 39019U 12068A 17117.88676905 .00000067 00000-0 24348-4 0 9993 -2 39019 98.2036 193.7339 0001499 83.8174 276.3184 14.58548828234385 -GOKTURK 2 -1 39030U 12073A 17117.90839214 .00000129 00000-0 28030-4 0 9990 -2 39030 98.0009 11.5337 0000634 143.3460 216.7796 14.72638760233153 -LANDSAT 8 -1 39084U 13008A 17117.82309738 .00000069 00000-0 25402-4 0 9995 -2 39084 98.2262 188.9014 0001630 84.5311 275.6073 14.57119915223727 -SARAL -1 39086U 13009A 17117.93401277 -.00000001 00000-0 16030-4 0 9995 -2 39086 98.5410 306.3211 0002015 65.0913 295.0480 14.32000020217913 -GAOFEN 1 -1 39150U 13018A 17117.89841831 .00000205 00000-0 36671-4 0 9994 -2 39150 97.9515 202.3776 0017815 214.6753 145.3286 14.76517001215822 -VNREDSAT 1 -1 39160U 13021B 17117.85228838 -.00000420 00000-0 -73001-4 0 9990 -2 39160 98.0838 194.6561 0001431 83.9811 276.2491 14.62982244212242 -ARIRANG-5 (KOMPSAT-5) -1 39227U 13042A 17117.86082866 .00000115 00000-0 12498-4 0 9999 -2 39227 97.6089 303.6258 0001223 86.0062 25.2304 15.04526334202127 -YAOGAN 18 -1 39363U 13059A 17117.84996978 .00002192 00000-0 11079-3 0 9994 -2 39363 97.3950 187.4747 0002509 74.0741 31.1784 15.18084850193687 -SKYSAT-1 -1 39418U 13066C 17117.79607526 .00001087 00000-0 95464-4 0 9998 -2 39418 97.7006 201.5719 0023294 91.3726 269.0110 14.98457159187535 -DUBAISAT-2 -1 39419U 13066D 17117.81390269 .00000417 00000-0 44725-4 0 9995 -2 39419 97.6808 191.6833 0015573 77.0128 283.2835 14.93602391186984 -GPM-CORE -1 39574U 14009C 17117.84935445 .00004188 00000-0 65442-4 0 9997 -2 39574 65.0088 90.9956 0010681 281.1564 78.8381 15.55359376179683 -SENTINEL-1A -1 39634U 14016A 17117.92726088 .00000025 00000-0 14975-4 0 9993 -2 39634 98.1817 126.2754 0001381 79.4136 280.7225 14.59199071163362 -KAZEOSAT 1 -1 39731U 14024A 17117.83570323 -.00000044 00000-0 00000-0 0 9991 -2 39731 98.4198 197.6150 0001545 97.1462 262.9974 14.42004541157633 -ALOS-2 -1 39766U 14029A 17117.86375906 -.00000286 00000-0 -31459-4 0 9992 -2 39766 97.9187 215.9073 0001523 84.7945 275.3471 14.79470032158166 -KAZEOSAT 2 -1 40010U 14033A 17117.89688735 .00000154 00000-0 26058-4 0 9992 -2 40010 97.8998 20.2643 0018425 79.6294 280.7001 14.82094060154496 -HODOYOSHI-4 -1 40011U 14033B 17117.88386147 .00000340 00000-0 50552-4 0 9997 -2 40011 97.8914 16.9460 0028402 74.6394 285.7954 14.80856855154315 -DEIMOS-2 -1 40013U 14033D 17117.90578981 .00000423 00000-0 56069-4 0 9992 -2 40013 97.8888 22.4735 0002320 96.5993 263.5497 14.84854332154748 -HODOYOSHI-3 -1 40015U 14033F 17117.75000754 .00000207 00000-0 35368-4 0 9994 -2 40015 97.8808 12.0305 0038616 80.2363 280.3206 14.78228015154031 -SPOT 7 -1 40053U 14034A 17117.90199067 -.00000045 00000-0 00000-0 0 9992 -2 40053 98.1572 185.9211 0001185 82.3484 277.7857 14.58572281150548 -SKYSAT-2 -1 40072U 14037D 17117.86435106 .00000260 00000-0 41001-4 0 9996 -2 40072 98.3298 227.0076 0005622 205.5803 154.5124 14.80975541151537 -WORLDVIEW-3 (WV-3) -1 40115U 14048A 17117.78288736 .00000227 00000-0 33030-4 0 9998 -2 40115 97.8705 198.6063 0001691 83.8298 276.3102 14.84805658146626 -YAOGAN 21 -1 40143U 14053A 17117.85911133 .00002770 00000-0 11385-3 0 9990 -2 40143 97.3144 192.1021 0011689 15.5607 88.6159 15.24947685146736 -YAOGAN 22 -1 40275U 14063A 17117.70601537 -.00000044 00000-0 00000-0 0 9997 -2 40275 100.4025 231.9031 0006353 180.9626 179.1477 13.15318684121000 -ASNARO -1 40298U 14070A 17117.78415396 .00003221 00000-0 15441-3 0 9991 -2 40298 97.4087 200.6864 0001671 75.4181 77.3279 15.19615327137205 -HODOYOSHI-1 -1 40299U 14070B 17117.90933416 .00001886 00000-0 85166-4 0 9991 -2 40299 97.4042 201.4119 0011611 269.1803 217.4689 15.22166559137290 -CHUBUSAT-1 -1 40300U 14070C 17117.88963038 .00002115 00000-0 98806-4 0 9995 -2 40300 97.3972 198.7032 0018931 279.2925 185.8441 15.20757975137149 -QSAT-EOS -1 40301U 14070D 17117.87311046 .00004431 00000-0 18987-3 0 9995 -2 40301 97.3907 198.6084 0026329 275.3634 176.6668 15.22978867137177 -TSUBAME -1 40302U 14070E 17117.86118502 .00002379 00000-0 12423-3 0 9995 -2 40302 97.3797 191.3089 0038481 298.9894 152.1462 15.16260869136721 -YAOGAN 23 -1 40305U 14071A 17117.86521880 .00002187 00000-0 11053-3 0 9991 -2 40305 97.4233 56.7818 0002485 70.8424 14.7695 15.18101273135797 -YAOGAN 24 -1 40310U 14072A 17117.88325576 .00000203 00000-0 36019-4 0 9991 -2 40310 97.9945 238.5511 0015880 229.4413 130.5412 14.77104401131308 -CBERS-4 -1 40336U 14079A 17117.88323736 .00000008 00000-0 17705-4 0 9996 -2 40336 98.4553 193.5655 0001120 107.1293 253.0004 14.35463103125195 -RESURS P2 -1 40360U 14087A 17117.88325486 .00001865 00000-0 62109-4 0 9996 -2 40360 97.2750 212.4727 0008362 324.3756 173.4463 15.32349708130687 -YAOGAN 26 -1 40362U 14088A 17117.89449009 .00003595 00000-0 13948-3 0 9996 -2 40362 97.3566 197.5540 0008944 88.5436 42.3158 15.26716728130083 -SMAP -1 40376U 15003A 17117.65380944 .00000152 00000-0 38480-4 0 9990 -2 40376 98.1225 126.1001 0001151 35.4009 324.7268 14.63390677119503 -KOMPSAT 3A -1 40536U 15014A 17117.86602946 .00000970 00000-0 59943-4 0 9997 -2 40536 97.4776 58.6458 0010978 142.9277 302.5045 15.12138395115445 -SENTINEL-2A -1 40697U 15028A 17117.82991097 .00000006 00000-0 18959-4 0 9996 -2 40697 98.5693 193.5093 0001281 90.6879 269.4448 14.30815301 96490 -CARBONITE 1 (CBNT-1) -1 40718U 15032D 17117.86591295 .00000144 00000-0 29291-4 0 9999 -2 40718 97.9761 10.7060 0015906 303.7610 56.2080 14.74516796 96833 -YAOGAN 27 -1 40878U 15040A 17117.74412819 -.00000044 00000-0 00000-0 0 9999 -2 40878 100.4006 179.3616 0007875 330.3723 29.6945 13.15953674 80187 -LAPAN-A2 -1 40931U 15052B 17117.31416037 .00000801 00000-0 22711-4 0 9998 -2 40931 6.0045 235.4936 0012922 247.9790 111.9288 14.76525283 85433 -YAOGAN 28 -1 41026U 15064A 17117.90305778 .00003700 00000-0 12894-3 0 9992 -2 41026 97.3073 246.5297 0010736 128.8300 346.3345 15.30220685 82064 -YAOGAN 29 -1 41038U 15069A 17117.77167817 .00000099 00000-0 19757-4 0 9999 -2 41038 97.8950 100.8104 0001901 63.8287 296.3118 14.80384510 76620 -KENT RIDGE 1 -1 41167U 15077B 17117.44605106 .00001241 00000-0 36366-4 0 9998 -2 41167 14.9826 189.7763 0011260 9.4686 103.4375 15.08674417 75261 -TELEOS 1 -1 41169U 15077D 17117.54824565 .00002326 00000-0 10150-3 0 9990 -2 41169 14.9830 187.3703 0011004 13.2278 114.8616 15.09313352 75298 -JASON-3 -1 41240U 16002A 17117.88566005 -.00000033 00000-0 12248-3 0 9992 -2 41240 66.0417 226.6217 0007933 273.5151 86.4957 12.80929040 59704 -SENTINEL-3A -1 41335U 16011A 17117.94609294 .00000017 00000-0 25138-4 0 9996 -2 41335 98.6281 186.1123 0001053 102.3014 257.8284 14.26732346 62196 -SENTINEL-1B -1 41456U 16025A 17114.66963276 -.00000045 00000-0 15538-6 0 9991 -2 41456 98.1817 122.8903 0001518 87.8336 272.3002 14.59198080 53055 -ZIYUAN 3-2 -1 41556U 16033A 17117.86838069 .00002290 00000-0 10542-3 0 9997 -2 41556 97.4651 195.0834 0002493 60.2617 73.4080 15.21320683 50597 -NUSAT 1 (FRESCO) -1 41557U 16033B 17117.88196912 .00002292 00000-0 89453-4 0 9994 -2 41557 97.4647 197.4002 0014501 178.4476 181.6810 15.26867048 50751 -NUSAT 2 (BATATA) -1 41558U 16033C 17117.91082038 .00002207 00000-0 86576-4 0 9991 -2 41558 97.4673 197.4743 0014016 176.8570 183.2759 15.26744051 50759 -CARTOSAT-2C -1 41599U 16040A 17117.82560844 -.00000069 00000-0 00000-0 0 9999 -2 41599 97.4600 180.1955 0013735 247.0947 246.7428 15.19183105 47005 -SKYSAT-C1 -1 41601U 16040C 17117.96725821 .00001990 00000-0 89943-4 0 9996 -2 41601 97.5709 182.9773 0002612 113.6464 246.5047 15.22144250 47100 -LAPAN-A3 -1 41603U 16040E 17117.92693509 .00000480 00000-0 25968-4 0 9991 -2 41603 97.4661 180.4962 0012006 247.6433 217.5552 15.19319823 47029 -BIROS -1 41604U 16040F 17117.91794128 .00000972 00000-0 47544-4 0 9990 -2 41604 97.4665 180.7784 0010840 240.4901 119.5253 15.20558797 47042 -3CAT-2 -1 41732U 16051B 17117.84237591 .00003436 00000-0 14123-3 0 9996 -2 41732 97.3776 35.5828 0015921 90.1270 310.9936 15.24732608 38860 -SKYSAT-C4 -1 41771U 16058B 17117.96670633 .00001895 00000-0 85694-4 0 9996 -2 41771 97.3970 191.7092 0001592 28.3315 331.8011 15.22141826 34045 -SKYSAT-C5 -1 41772U 16058C 17117.77943047 .00002060 00000-0 92731-4 0 9993 -2 41772 97.3970 191.3362 0001223 353.1238 6.9978 15.22206428 34004 -SKYSAT-C2 -1 41773U 16058D 17117.93899110 .00001766 00000-0 79830-4 0 9990 -2 41773 97.3975 191.7488 0001700 89.7214 270.4209 15.22231257 34035 -SKYSAT-C3 -1 41774U 16058E 17117.81952274 .00001853 00000-0 83603-4 0 9999 -2 41774 97.3972 191.6033 0000494 92.4587 267.6701 15.22244451 34014 -PATHFINDER 1 -1 41787U 16059E 17117.78661878 .00000155 00000-0 39149-4 0 9997 -2 41787 98.1704 179.8928 0030059 319.6916 40.2055 14.63506289 31211 -WORLDVIEW-4 -1 41848U 16067A 17117.92782273 .00000183 00000-0 27942-4 0 9992 -2 41848 97.9495 192.0768 0001442 160.0059 200.1212 14.84728826 24807 -GOKTURK 1A -1 41875U 16073A 17117.88524071 -.00001120 00000-0 -21055-3 0 9996 -2 41875 98.1610 13.3711 0001498 72.5076 287.5470 14.62749912 20940 -RESOURCESAT-2A -1 41877U 16074A 17117.87646215 .00000017 00000-0 27843-4 0 9997 -2 41877 98.7091 194.0837 0001763 94.1580 265.9790 14.21624958 20135 -CARTOSAT-2D -1 41948U 17008A 17117.89615078 .00000998 00000-0 50695-4 0 9998 -2 41948 97.4985 178.9932 0007875 42.2812 317.9028 15.19169278 10881 -INS-1A -1 41949U 17008B 17117.90214270 .00002264 00000-0 10386-3 0 9990 -2 41949 97.4982 179.2927 0010186 15.9017 344.2537 15.21433050 10883 -INS-1B -1 41950U 17008C 17117.88767424 .00005175 00000-0 22962-3 0 9990 -2 41950 97.4991 179.3202 0009775 20.6980 339.4650 15.21983067 10886 -SARSAT 7 (NOAA 15) -1 25338U 98030A 17117.96894994 .00000036 00000-0 34234-4 0 9995 -2 25338 98.7838 128.7757 0010432 359.1807 0.9354 14.25788655985583 -GPS BIIR-07 -1 26690U 01004A 17117.85707588 .00000053 00000-0 00000-0 0 9991 -2 26690 53.0302 159.9330 0182060 256.4389 180.8389 2.00553339119011 -METEOSAT-8 (MSG-1) -1 27509U 02040B 17117.67664500 .00000131 00000-0 00000-0 0 9995 -2 27509 4.7557 58.5253 0000941 266.9424 175.5485 1.00262079 53794 -GPS BIIR-08 -1 27663U 03005A 17117.88370983 -.00000057 00000-0 00000-0 0 9998 -2 27663 56.7162 346.8450 0092559 23.7124 172.8292 2.00562563104377 -GPS BIIR-11 -1 28190U 04009A 17117.48384308 -.00000053 00000-0 00000-0 0 9997 -2 28190 55.9782 47.9242 0100736 54.0664 5.8337 2.00565054 96039 -GPS BIIR-12 -1 28361U 04023A 17117.64302101 .00000010 00000-0 00000-0 0 9994 -2 28361 54.1168 222.0143 0117311 219.0918 227.6228 2.00553187 94109 -GPS BIIR-13 -1 28474U 04045A 17117.22527272 .00000021 00000-0 00000-0 0 9997 -2 28474 54.2106 99.7855 0170067 246.4539 258.7819 2.00551319 91479 -SARSAT 10 (NOAA 18) -1 28654U 05018A 17117.96799378 .00000017 00000-0 34642-4 0 9995 -2 28654 99.1861 138.9463 0013859 208.7422 151.2987 14.12334472615079 -GPS BIIR-14M -1 28874U 05038A 17117.76450094 -.00000055 00000-0 00000-0 0 9998 -2 28874 56.1358 45.1678 0118635 254.4067 29.0208 2.00570299 84896 -MSG-2 -1 28912U 05049B 17117.16504358 .00000051 00000-0 00000-0 0 9995 -2 28912 2.1048 70.8043 0000560 129.4061 83.7904 1.00269537 41600 -GOES 13 -1 29155U 06018A 17116.61117068 -.00000261 00000-0 00000-0 0 9993 -2 29155 0.2882 273.0145 0004779 151.5840 295.4602 1.00276158 9925 -SARSAT 11 (METOP-A) -1 29499U 06044A 17117.90671132 .00000021 00000-0 29415-4 0 9991 -2 29499 98.6830 178.3560 0000944 44.3194 75.3974 14.21497227545997 -GPS BIIR-16M -1 29601U 06052A 17117.42111906 -.00000053 00000-0 00000-0 0 9991 -2 29601 56.6890 345.7829 0064961 46.9485 313.6454 2.00579209 76467 -GPS BIIR-17M -1 32260U 07047A 17117.24661253 .00000011 00000-0 00000-0 0 9999 -2 32260 53.2431 218.4238 0089906 32.0994 328.4706 2.00550112 69898 -GPS BIIR-18M -1 32384U 07062A 17117.96072082 -.00000055 00000-0 00000-0 0 9997 -2 32384 56.1990 45.7387 0007056 351.6488 300.7686 2.00567783 68618 -SARSAT 12 (NOAA 19) -1 33591U 09005A 17117.89348672 .00000104 00000-0 81534-4 0 9999 -2 33591 99.0880 84.0177 0014922 56.0394 304.2193 14.12174414423290 -GOES 14 -1 35491U 09033A 17116.69224996 -.00000105 00000-0 00000-0 0 9997 -2 35491 0.1660 103.8623 0004668 130.2036 125.8996 1.00271284 28688 -GOES 15 -1 36411U 10008A 17116.77924873 .00000079 00000-0 00000-0 0 9993 -2 36411 0.1007 105.4333 0002141 51.6756 202.9092 1.00273183 26212 -ELEKTRO-L 1 -1 37344U 11001A 17116.72182454 -.00000262 00000-0 00000-0 0 9994 -2 37344 2.3349 78.1422 0004268 279.1164 80.8735 1.00219570 22996 -GLONASS-K 1 -1 37372U 11009A 17117.78315888 -.00000013 00000-0 00000-0 0 9993 -2 37372 65.3784 66.3379 0008367 247.0196 239.7110 2.13107739 47977 -GPS BIIF-2 -1 37753U 11036A 17117.59251528 .00000026 00000-0 00000-0 0 9998 -2 37753 55.4188 102.7919 0064204 29.0499 146.9850 2.00561847 42334 -GSAT0101 (GALILEO-PFM) -1 37846U 11060A 17114.83304321 -.00000009 00000-0 00000-0 0 9994 -2 37846 55.7886 73.2046 0005400 329.6595 30.2713 1.70473582 34177 -GSAT0102 (GALILEO-FM2) -1 37847U 11060B 17117.34389545 -.00000021 00000-0 00000-0 0 9999 -2 37847 55.7913 73.1335 0006344 314.5582 189.3282 1.70475788 34229 -LUCH 5A -1 37951U 11074B 17117.77595258 -.00000056 00000-0 00000-0 0 9995 -2 37951 1.5532 186.1735 0004021 190.4387 285.6345 1.00273438 19723 -MSG-3 -1 38552U 12035B 17117.40141041 -.00000016 00000-0 00000-0 0 9994 -2 38552 0.8005 51.9205 0000232 155.6438 152.4418 1.00277252 17424 -SARSAT 13 (METOP-B) -1 38771U 12049A 17117.94580154 .00000028 00000-0 32544-4 0 9997 -2 38771 98.6834 178.9436 0001717 64.0338 61.1552 14.21497770239145 -GPS BIIF-3 -1 38833U 12053A 17117.33844898 -.00000022 00000-0 00000-0 0 9995 -2 38833 54.1882 280.6688 0055482 25.8609 334.3818 2.00560847 32600 -GSAT0103 (GALILEO-FM3) -1 38857U 12055A 17115.46369245 .00000024 00000-0 00000-0 0 9994 -2 38857 54.9073 193.4908 0004464 237.3596 122.6674 1.70473641 28234 -GSAT0104 (GALILEO-FM4) -1 38858U 12055B 17117.15778157 .00000027 00000-0 00000-0 0 9992 -2 38858 54.9088 193.4429 0003448 237.5079 122.5372 1.70473667 28207 -GPS BIIF-4 -1 39166U 13023A 17117.69060775 -.00000058 00000-0 00000-0 0 9995 -2 39166 55.8433 42.2020 0046659 15.9758 344.1709 2.00565064 28949 -INSAT-3D -1 39216U 13038B 17117.17372789 -.00000169 00000-0 00000-0 0 9994 -2 39216 0.0454 86.7516 0001079 259.4051 13.8486 1.00274076 13654 -GPS BIIF-5 -1 39533U 14008A 17116.69816321 -.00000023 00000-0 00000-0 0 9994 -2 39533 54.3429 285.9827 0026962 180.4130 179.5586 2.00561742 23277 -LUCH 5V -1 39727U 14023A 17117.91091100 -.00000285 00000-0 00000-0 0 9992 -2 39727 2.8046 299.0420 0002860 98.0777 241.5887 1.00268912529055 -GPS BIIF-6 -1 39741U 14026A 17116.97382425 .00000030 00000-0 00000-0 0 9996 -2 39741 55.4057 102.3363 0010261 288.1037 71.7751 2.00565027 21568 -GPS BIIF-7 -1 40105U 14045A 17117.06729393 .00000009 00000-0 00000-0 0 9999 -2 40105 54.6399 221.9169 0005932 116.0501 244.0289 2.00566458 19152 -GSAT0201 (GALILEO 5) -1 40128U 14050A 17117.39330562 -.00000070 00000-0 00000-0 0 9991 -2 40128 50.2807 47.2498 1620138 61.7281 313.6096 1.85518359 16425 -GSAT0202 (GALILEO 6) -1 40129U 14050B 17117.12213120 -.00000070 00000-0 00000-0 0 9993 -2 40129 50.3344 46.2556 1620846 62.7394 312.7763 1.85518988 18554 -GPS BIIF-8 -1 40294U 14068A 17117.43673556 .00000061 00000-0 00000-0 0 9991 -2 40294 54.9926 162.5160 0006236 342.9401 17.1257 2.00554236 18264 -GLONASS-K 2 -1 40315U 14075A 17117.90036488 -.00000008 00000-0 00000-0 0 9994 -2 40315 64.4352 307.1019 0013654 205.2770 137.4588 2.13098604 18730 -GPS BIIF-9 -1 40534U 15013A 17117.07457666 -.00000052 00000-0 00000-0 0 9992 -2 40534 54.9551 341.7976 0018244 356.8921 3.1446 2.00561392 14873 -GSAT0203 (GALILEO 7) -1 40544U 15017A 17115.78826820 -.00000014 00000-0 00000-0 0 9993 -2 40544 55.5778 73.4760 0003691 275.1481 84.7686 1.70474994 12276 -GSAT0204 (GALILEO 8) -1 40545U 15017B 17117.33112485 -.00000021 00000-0 00000-0 0 9990 -2 40545 55.5857 73.4431 0001212 283.4971 76.4459 1.70475083 12965 -GPS BIIF-10 -1 40730U 15033A 17117.23427953 -.00000059 00000-0 00000-0 0 9993 -2 40730 55.3777 41.9143 0027522 315.2750 44.5035 2.00569561 13068 -GSAT0205 (GALILEO 9) -1 40889U 15045A 17116.39771652 -.00000024 00000-0 00000-0 0 9997 -2 40889 57.0518 313.5369 0003704 29.8948 330.1405 1.70474626 10094 -GSAT0206 (GALILEO 10) -1 40890U 15045B 17116.61766460 -.00000025 00000-0 00000-0 0 9996 -2 40890 57.0510 313.5282 0002236 42.7563 317.2738 1.70474700 10120 -GPS BIIF-11 -1 41019U 15062A 17117.28787317 .00000063 00000-0 00000-0 0 9998 -2 41019 55.0025 162.3078 0025494 205.1920 154.7701 2.00563362 10883 -GSAT0209 (GALILEO 12) -1 41174U 15079A 17117.37650380 .00000027 00000-0 00000-0 0 9997 -2 41174 54.9207 193.1252 0005409 279.8218 80.1968 1.70474042 8452 -GSAT0208 (GALILEO 11) -1 41175U 15079B 17117.00984805 .00000028 00000-0 00000-0 0 9991 -2 41175 54.9189 193.1359 0004531 276.3820 83.6450 1.70474111 8457 -GPS BIIF-12 -1 41328U 16007A 17117.37400445 .00000010 00000-0 00000-0 0 9997 -2 41328 54.8978 222.0789 0012113 217.3946 142.5406 2.00558063 8943 -GSAT0211 (GALILEO 14) -1 41549U 16030A 17114.78332279 -.00000015 00000-0 00000-0 0 9995 -2 41549 57.1917 313.3182 0001607 333.1119 26.9029 1.70474465 5721 -GSAT0210 (GALILEO 13) -1 41550U 16030B 17114.49000576 -.00000013 00000-0 00000-0 0 9995 -2 41550 57.1913 313.3283 0000598 245.4590 114.5592 1.70474458 5717 -GSAT0207 (GALILEO 15) -1 41859U 16069A 17114.73729743 .00000020 00000-0 00000-0 0 9997 -2 41859 54.5808 193.8506 0005235 267.7099 92.2948 1.70473996 2693 -GSAT0214 (GALILEO 18) -1 41862U 16069D 17117.45021559 .00000026 00000-0 00000-0 0 9999 -2 41862 54.5787 193.7747 0003868 247.0465 112.9913 1.70473982 2740 -AOR-E (EGNOS/PRN 120) -1 24307U 96053A 17117.26168468 -.00000134 00000-0 00000-0 0 9996 -2 24307 2.5253 77.9378 0006520 302.6379 273.5684 1.00272241 75555 -ARTEMIS (EGNOS/PRN 124) -1 26863U 01029A 17117.89753111 -.00000378 00000-0 00000-0 0 9998 -2 26863 12.6809 33.5825 0001767 26.6924 241.9256 1.00272512 10683 -CRE (WAAS/PRN 138) -1 28868U 05036A 17117.04493699 -.00000085 00000-0 00000-0 0 9991 -2 28868 0.0562 71.6647 0002884 323.4250 89.0143 1.00271681 13048 -CRW (WAAS/PRN 135) -1 28884U 05041A 17117.63438270 .00000066 00000-0 00000-0 0 9992 -2 28884 0.0250 92.8477 0001657 315.0810 263.2601 1.00273269 42155 -IOR-W (EGNOS/PRN 126) -1 28899U 05044A 17117.25403834 -.00000001 00000-0 00000-0 0 9997 -2 28899 2.5645 11.1945 0002504 28.9255 330.6550 1.00272957 42059 -MTSAT-2 (MSAS/PRN 137) -1 28937U 06004A 17117.84214854 -.00000255 00000-0 00000-0 0 9995 -2 28937 0.0692 92.9658 0003474 306.2616 264.9760 1.00274084 41015 -AMR (WAAS/PRN 133) -1 33278U 08039A 17117.42410554 -.00000151 00000-0 00000-0 0 9993 -2 33278 3.0225 0.9699 0002772 39.4011 229.9191 1.00272916 31797 -QZS-1 (QZSS/PRN 183) -1 37158U 10045A 17115.76142302 -.00000112 00000-0 00000-0 0 9999 -2 37158 40.8186 160.0853 0750436 269.9548 192.8060 1.00297829 24239 -GSAT-8 (GAGAN/PRN 127) -1 37605U 11022A 17117.93073531 .00000072 00000-0 00000-0 0 9994 -2 37605 0.0108 283.1636 0005146 27.0154 296.0193 1.00271518 19753 -LUCH 5A (SDCM/PRN 140) -1 37951U 11074B 17117.77595258 -.00000056 00000-0 00000-0 0 9995 -2 37951 1.5532 186.1735 0004021 190.4387 285.6345 1.00273438 19723 -SES-5 (EGNOS/PRN 136) -1 38652U 12036A 17116.07316208 .00000024 00000-0 00000-0 0 9995 -2 38652 0.0345 265.9011 0001928 133.9601 205.7209 1.00272673 17589 -GSAT-10 (GAGAN/PRN 128) -1 38779U 12051B 17117.17132557 -.00000177 00000-0 00000-0 0 9997 -2 38779 0.0837 96.3840 0002273 318.9132 304.7324 1.00272366 16653 -LUCH 5B (SDCM/PRN 125) -1 38977U 12061A 17117.81477027 -.00000141 00000-0 00000-0 0 9994 -2 38977 3.4436 74.8585 0003385 316.8276 101.3060 1.00272803 16714 -ASTRA 5B (EGNOS/PRN 123) -1 39617U 14011B 17117.06942167 .00000143 00000-0 00000-0 0 9993 -2 39617 0.0498 315.1147 0002975 88.3285 228.3291 1.00275404 11392 -LUCH 5V (SDCM/PRN 141) -1 39727U 14023A 17117.91091100 -.00000285 00000-0 00000-0 0 9992 -2 39727 2.8046 299.0420 0002860 98.0777 241.5887 1.00268912529055 -GSAT-15 (GAGAN/PRN 139) -1 41028U 15065A 17117.14222039 -.00000270 00000-0 00000-0 0 9992 -2 41028 0.0941 95.1208 0002002 296.2375 328.6619 1.00271123 5393 -AKEBONO (EXOS-D) -1 19822U 89016A 17117.63192165 .00012691 88031-6 26088-3 0 9998 -2 19822 75.0446 348.8313 1919174 258.9729 79.0746 11.66496453903352 -HST -1 20580U 90037B 17117.94700056 .00000756 00000-0 35772-4 0 9998 -2 20580 28.4705 339.4922 0002693 357.0910 111.3947 15.08748200282609 -POLAR -1 23802U 96013A 17116.37265279 -.00000198 00000-0 00000-0 0 9990 -2 23802 78.4004 271.3370 7396639 324.9472 3.3191 1.29842447101502 -SWAS -1 25560U 98071A 17117.94710030 .00000408 00000-0 47409-4 0 9994 -2 25560 69.9006 27.2507 0011092 265.1462 94.8428 14.93353654997869 -ORSTED -1 25635U 99008B 17117.88843351 .00000150 00000-0 43023-4 0 9996 -2 25635 96.4844 35.1458 0140366 48.4402 312.8732 14.47984886958676 -CXO -1 25867U 99040B 17119.12170435 .00000402 00000-0 00000-0 0 9998 -2 25867 74.3104 291.0502 6830407 253.1618 0.2465 0.37796604 15861 -XMM-NEWTON -1 25989U 99066A 17119.82667602 -.00000175 00000-0 00000-0 0 9993 -2 25989 68.8695 6.4454 8217924 95.7728 359.6385 0.50134877 20647 -TERRA -1 25994U 99068A 17117.80142603 .00000123 00000-0 37358-4 0 9998 -2 25994 98.2109 193.5573 0000796 103.5014 256.6277 14.57108027923339 -CLUSTER II-FM6 (SALSA) -1 26410U 00041A 17119.89541367 .00000441 00000-0 00000-0 0 9999 -2 26410 130.9778 332.5439 4517370 150.4410 0.8171 0.44238109 17287 -CLUSTER II-FM7 (SAMBA) -1 26411U 00041B 17119.88089900 .00000347 00000-0 00000-0 0 9994 -2 26411 129.9985 333.9760 5141463 158.1074 0.9170 0.44226846 5558 -CLUSTER II-FM5 (RUMBA) -1 26463U 00045A 17119.89829580 .00000407 00000-0 00000-0 0 9999 -2 26463 133.5259 332.2469 4847143 156.1406 0.8838 0.44226036 5452 -CLUSTER II-FM8 (TANGO) -1 26464U 00045B 17116.88873786 .00000598 00000-0 00000-0 0 9994 -2 26464 130.9759 332.5170 4525140 150.3816 245.2838 0.44218919 5537 -ODIN -1 26702U 01007A 17117.64175222 .00000719 00000-0 51999-4 0 9995 -2 26702 97.6128 135.2475 0009939 218.1420 141.9105 15.07119626883432 -TIMED -1 26998U 01055B 17117.92151297 .00000192 00000-0 24993-4 0 9991 -2 26998 74.0732 55.1437 0000438 237.3256 122.7882 14.87885055833956 -RHESSI -1 27370U 02004A 17117.88649650 .00003064 00000-0 11343-3 0 9996 -2 27370 38.0341 355.3596 0011133 349.7434 10.3107 15.28273747838567 -INTEGRAL -1 27540U 02048A 17118.36352028 .00000840 00000-0 00000-0 0 9991 -2 27540 50.0265 191.1121 8235342 261.5435 0.2173 0.37587107 14115 -CORIOLIS -1 27640U 03001A 17117.95597142 -.00000002 00000-0 20010-4 0 9992 -2 27640 98.7446 128.8588 0015274 91.9293 323.3828 14.18940267740845 -SORCE -1 27651U 03004A 17117.79214115 .00000327 00000-0 48531-4 0 9992 -2 27651 39.9956 242.5443 0023936 245.5473 114.2819 14.88645380773270 -MOST -1 27843U 03031D 17117.96561490 -.00000016 00000-0 12784-4 0 9992 -2 27843 98.7147 126.8161 0010429 152.8026 207.3699 14.20545810716827 -SCISAT 1 -1 27858U 03036A 17117.91780725 .00000070 00000-0 14929-4 0 9994 -2 27858 73.9321 287.4322 0007288 33.1106 327.0523 14.77126007738357 -SWIFT -1 28485U 04047A 17117.41525513 .00001385 00000-0 66533-4 0 9999 -2 28485 20.5561 129.6633 0011204 317.8371 42.1201 15.03687397680537 -FORMOSAT-3 FM6 -1 29047U 06011A 17117.91050652 .00000050 00000-0 35894-4 0 9993 -2 29047 71.9786 289.7709 0051657 239.5827 120.0200 14.28575456577577 -FORMOSAT-3 FM1 -1 29048U 06011B 17117.91100020 .00000167 00000-0 82360-4 0 9998 -2 29048 71.9679 201.9770 0044756 196.6805 285.8158 14.28507774580062 -FORMOSAT-3 FM5 -1 29049U 06011C 17117.73536016 .00000102 00000-0 56574-4 0 9994 -2 29049 72.0218 7.5076 0036501 233.3842 126.3936 14.28559313575829 -FORMOSAT-3 FM3 -1 29050U 06011D 17117.87976436 .00000267 00000-0 66995-4 0 9995 -2 29050 72.0156 270.0752 0051757 248.7846 110.7773 14.58492585589139 -FORMOSAT-3 FM4 -1 29051U 06011E 17117.89784926 .00000069 00000-0 42651-4 0 9992 -2 29051 72.0052 271.3373 0067066 107.8415 253.0052 14.28583272578438 -FORMOSAT-3 FM2 -1 29052U 06011F 17117.90492385 .00000132 00000-0 68118-4 0 9997 -2 29052 72.0350 342.1335 0040895 196.2406 163.7423 14.28675539575937 -CLOUDSAT -1 29107U 06016A 17117.89163538 .00000059 00000-0 23156-4 0 9997 -2 29107 98.1994 62.6270 0001094 117.4168 242.7142 14.57102859584940 -CALIPSO -1 29108U 06016B 17117.95915413 .00000178 00000-0 49600-4 0 9996 -2 29108 98.2003 62.2446 0001375 82.0428 278.0927 14.57104016585022 -HINODE (SOLAR-B) -1 29479U 06041A 17117.96736407 .00000135 00000-0 34458-4 0 9998 -2 29479 98.1664 122.8008 0017574 20.5882 339.6026 14.64812996566036 -SJ-6C -1 29505U 06046A 17117.85897424 -.00000077 00000-0 -18558-5 0 9999 -2 29505 97.8202 120.0210 0001323 262.5260 97.5786 14.94314743572353 -SJ-6D -1 29506U 06046B 17117.85705369 -.00000472 00000-0 -39629-4 0 9996 -2 29506 97.8384 119.2992 0002103 11.7368 348.3912 14.93258351572047 -AGILE -1 31135U 07013A 17117.26745931 .00003784 00000-0 89792-4 0 9999 -2 31135 2.4673 145.4873 0013366 286.0449 73.8133 15.29557325188513 -AIM -1 31304U 07015A 17117.92721265 .00000893 00000-0 56216-4 0 9999 -2 31304 97.9980 294.5554 0004150 320.5212 39.5714 15.11976292547349 -FGRST (GLAST) -1 33053U 08029A 17117.94701517 .00000742 00000-0 26176-4 0 9993 -2 33053 25.5834 345.6238 0012711 62.0252 298.1569 15.10876705489699 -IBEX -1 33401U 08051A 17118.19398348 -.00000967 00000-0 00000-0 0 9991 -2 33401 24.8196 94.6754 6402848 21.4922 358.2466 0.11384780 3605 -WISE -1 36119U 09071A 17117.81603356 .00001596 00000-0 60875-4 0 9997 -2 36119 97.4551 145.5861 0004211 116.7801 243.3870 15.28171646408588 -SDO -1 36395U 10005A 17117.15685212 -.00000038 00000-0 00000-0 0 9991 -2 36395 28.7064 141.3349 0000822 160.5379 228.1754 1.00273335 26598 -CRYOSAT 2 -1 36508U 10013A 17117.92365053 .00000007 00000-0 96716-6 0 9999 -2 36508 92.0198 190.1974 0009072 139.6005 220.5878 14.52179594373884 -GCOM-W1 (SHIZUKU) -1 38337U 12025A 17117.89385987 .00000166 00000-0 47000-4 0 9996 -2 38337 98.2015 58.8653 0001338 114.0516 287.1077 14.57098089263047 -NUSTAR -1 38358U 12031A 17117.30564102 .00001297 00000-0 63204-4 0 9990 -2 38358 6.0275 318.5615 0012573 281.0919 78.7796 14.87722484264852 -RBSP A -1 38752U 12046A 17117.11872368 -.00000075 00000-0 -72580-3 0 9990 -2 38752 9.6669 215.8680 6815089 89.6213 341.6654 2.68115450 45504 -RBSP B -1 38753U 12046B 17117.38127165 -.00000093 00000-0 -88299-3 0 9992 -2 38753 9.6713 225.7695 6832924 71.0254 347.6659 2.65139612 45221 -NEOSSAT -1 39089U 13009D 17117.80643402 .00000027 00000-0 25293-4 0 9990 -2 39089 98.5590 321.7627 0012275 87.8768 272.3822 14.34381921218166 -BRITE-AUSTRIA -1 39091U 13009F 17117.62510302 .00000042 00000-0 30290-4 0 9995 -2 39091 98.5550 322.9300 0011714 97.2957 262.9560 14.35023693218230 -UNIBRITE -1 39092U 13009G 17117.82923316 .00000036 00000-0 28027-4 0 9999 -2 39092 98.5559 322.8283 0010599 90.7291 269.5109 14.34898699218246 -IRIS -1 39197U 13033A 17117.94090537 .00000141 00000-0 26438-4 0 9996 -2 39197 97.9256 300.2291 0027262 340.8470 19.1713 14.78381131206660 -HISAKI (SPRINT-A) -1 39253U 13049A 17117.87279117 .00000033 00000-0 -42183-4 0 9997 -2 39253 29.7201 260.1453 0137326 331.4642 27.8468 13.55170603178362 -CASSIOPE -1 39265U 13055A 17117.89578844 .00008667 00000-0 25266-3 0 9990 -2 39265 80.9712 67.1024 0690549 38.6073 326.2442 14.22441622184367 -DANDE -1 39267U 13055C 17117.92391583 .00006179 00000-0 18281-3 0 9994 -2 39267 81.0120 77.5437 0715758 55.5526 311.1177 14.16737803181578 -STSAT-3 -1 39422U 13066G 17117.83056767 .00000706 00000-0 79615-4 0 9990 -2 39422 97.6618 181.9336 0024394 43.7844 316.5280 14.89421599186431 -BRITE-PL -1 39431U 13066R 17117.90966782 .00000044 00000-0 20181-4 0 9994 -2 39431 97.7025 100.1380 0201229 271.3858 86.4293 14.46831878180983 -SWARM B -1 39451U 13067A 17117.89201384 .00000682 00000-0 29235-4 0 9992 -2 39451 87.7506 262.8792 0001725 107.4214 252.7220 15.20965986175641 -SWARM A -1 39452U 13067B 17117.94407327 .00001699 00000-0 38785-4 0 9993 -2 39452 87.3532 188.7970 0003155 107.0825 253.0777 15.42050677192358 -SWARM C -1 39453U 13067C 17117.94399937 .00001698 00000-0 38749-4 0 9990 -2 39453 87.3535 190.2120 0003187 107.1786 252.9819 15.42051295192317 -BRITE-TORONTO -1 40020U 14033L 17117.88279069 .00000123 00000-0 29446-4 0 9998 -2 40020 97.8435 350.9017 0088765 126.4674 234.4752 14.66376679152722 -OCO 2 -1 40059U 14035A 17117.88456575 .00000086 00000-0 29109-4 0 9995 -2 40059 98.2010 60.0378 0001619 98.3016 261.8366 14.57109095150052 -BRITE-PL 2 -1 40119U 14049B 17117.78390368 .00000244 00000-0 35741-4 0 9998 -2 40119 97.9362 203.9510 0016211 252.2068 107.7377 14.84115139145592 -RESURS P2 -1 40360U 14087A 17117.88325486 .00001865 00000-0 62109-4 0 9996 -2 40360 97.2750 212.4727 0008362 324.3756 173.4463 15.32349708130687 -MMS 1 -1 40482U 15011A 17117.80208333 -.00000628 00000-0 00000-0 0 9997 -2 40482 27.8141 310.0064 9023304 152.6411 165.2102 0.35804616 7487 -MMS 2 -1 40483U 15011B 17114.67361111 -.00000288 00000-0 00000-0 0 9996 -2 40483 27.6756 310.1160 9026176 152.6253 123.6208 0.35748658 7455 -MMS 3 -1 40484U 15011C 17109.73150463 -.00000099 00000-0 00000-0 0 9994 -2 40484 27.8996 310.1284 9023985 152.3496 209.0785 0.35694751 7433 -MMS 4 -1 40485U 15011D 17109.72916667 -.00000099 00000-0 00000-0 0 9990 -2 40485 27.9151 310.0971 9019578 152.3661 209.1231 0.35681468 7435 -ASTROSAT -1 40930U 15052A 17117.72628758 .00000900 00000-0 37879-4 0 9998 -2 40930 5.9991 234.9348 0007433 250.9997 108.9509 14.76113038 85483 -DAMPE -1 41173U 15078A 17117.89365640 .00000336 00000-0 16919-4 0 9997 -2 41173 97.2891 127.3557 0013367 340.9552 114.2708 15.23548298 75802 -PISAT -1 41784U 16059B 17117.76401181 .00000186 00000-0 45306-4 0 9997 -2 41784 98.1719 179.7717 0031072 320.3302 39.5627 14.63205123 31201 -ASTRA 1D -1 23331U 94070A 17117.94887056 -.00000297 00000-0 00000-0 0 9995 -2 23331 7.4884 49.6425 0003975 337.7411 123.0119 1.00270333 82821 -ASTRA 1F -1 23842U 96021A 17117.93035581 .00000126 00000-0 00000-0 0 9997 -2 23842 0.0435 4.9337 0003647 27.4447 202.9405 1.00272640 18886 -AMC-1 (GE-1) -1 24315U 96054A 17116.99830703 .00000049 00000-0 00000-0 0 9997 -2 24315 1.4627 85.2444 0002541 312.9431 47.2340 1.00272459 12855 -AMC-2 (GE-2) -1 24713U 97002A 17117.46282128 -.00000220 00000-0 00000-0 0 9990 -2 24713 4.2449 66.1892 0004965 329.2587 261.9464 1.00273046 74112 -AMC-3 (GE-3) -1 24936U 97050A 17117.53155150 -.00000271 00000-0 00000-0 0 9998 -2 24936 0.2740 91.5953 0002576 307.6319 295.8336 1.00270355 71973 -NSS-5 -1 24957U 97053A 17117.93035581 .00000098 00000-0 00000-0 0 9999 -2 24957 3.7438 69.5263 0003313 320.8842 211.1239 1.00268268 71710 -ASTRA 1G -1 25071U 97076A 17117.93035581 .00000095 00000-0 00000-0 0 9999 -2 25071 2.2219 78.5414 0003243 316.9076 206.6691 1.00273085 71099 -NSS-806 -1 25239U 98014A 17117.49771485 -.00000291 00000-0 00000-0 0 9998 -2 25239 0.0667 43.3045 0004164 347.0110 317.0595 1.00272070 13836 -ASTRA 2A -1 25462U 98050A 17117.86998072 -.00000372 00000-0 00000-0 0 9990 -2 25462 0.0587 250.0045 0001821 114.1770 278.5134 1.00266930 12886 -ASTRA 1H -1 25785U 99033A 17117.93035581 .00000127 00000-0 00000-0 0 9992 -2 25785 3.7288 69.6845 0002700 318.4700 206.3377 1.00271741 17950 -AMC-4 (GE-4) -1 25954U 99060A 17116.58960841 -.00000283 00000-0 00000-0 0 9990 -2 25954 0.0747 83.6143 0002314 346.5514 289.8681 1.00272694 10260 -ASTRA 2B -1 26494U 00054A 17117.87757578 .00000108 00000-0 00000-0 0 9994 -2 26494 2.1096 79.1778 0005202 329.6321 142.5842 1.00274614 13420 -AMC-7 (GE-7) -1 26495U 00054B 17116.77791431 .00000077 00000-0 00000-0 0 9994 -2 26495 0.0432 82.2799 0001120 288.8817 348.8496 1.00272717 60779 -NSS-11 (AAP-1) -1 26554U 00059A 17117.90604911 -.00000358 00000-0 00000-0 0 9990 -2 26554 0.0063 85.5734 0001949 322.2868 242.5888 1.00271778 7848 -AMC-6 (GE-6) -1 26580U 00067A 17117.50743608 -.00000285 00000-0 00000-0 0 9990 -2 26580 0.0218 356.4381 0001281 14.5567 320.3637 1.00271374 60515 -ASTRA 2D -1 26638U 00081A 17117.43027749 .00000038 00000-0 00000-0 0 9998 -2 26638 3.5537 70.2649 0001966 323.7234 36.1874 1.00271905 19446 -AMC-8 (GE-8) -1 26639U 00081B 17117.51147722 .00000092 00000-0 00000-0 0 9992 -2 26639 0.0332 80.0772 0003191 325.6418 215.1011 1.00272006 59882 -ASTRA 2C -1 26853U 01025A 17117.92641178 .00000033 00000-0 00000-0 0 9993 -2 26853 0.2935 90.6741 0002799 300.6764 218.5592 1.00273170 11594 -ASTRA 3A -1 27400U 02015B 17116.72497990 -.00000289 00000-0 00000-0 0 9994 -2 27400 3.7174 69.0026 0002702 335.9286 23.9999 1.00272628 55253 -NSS-7 -1 27414U 02019A 17117.68738644 -.00000167 00000-0 00000-0 0 9998 -2 27414 1.7911 83.2758 0002707 321.2122 38.8366 1.00272050 55091 -NSS-6 -1 27603U 02057A 17117.91091101 -.00000283 00000-0 00000-0 0 9995 -2 27603 0.0468 87.4320 0001344 282.6637 268.9063 1.00270011 52630 -AMC-9 (GE-12) -1 27820U 03024A 17117.50551885 -.00000227 00000-0 00000-0 0 9994 -2 27820 0.0235 292.0436 0002626 94.1854 288.4387 1.00270023 50914 -AMC-10 (GE-10) -1 28154U 04003A 17117.70168354 .00000076 00000-0 00000-0 0 9991 -2 28154 0.0151 288.3657 0002624 135.1563 269.9492 1.00272473 48465 -AMC-11 (GE-11) -1 28252U 04017A 17117.63471220 .00000057 00000-0 00000-0 0 9995 -2 28252 0.0236 329.2628 0002593 72.5884 271.4431 1.00271585 47234 -AMC-15 -1 28446U 04041A 17117.41694934 -.00000100 00000-0 00000-0 0 9992 -2 28446 0.0788 70.8686 0001712 306.8840 242.8742 1.00271398 45913 -AMC-16 -1 28472U 04048A 17117.48285421 -.00000218 00000-0 00000-0 0 9992 -2 28472 0.0219 341.5826 0002794 75.7071 247.2063 1.00272091 45347 -NSS-10 (AMC-12) -1 28526U 05003A 17117.73270097 -.00000263 00000-0 00000-0 0 9995 -2 28526 0.0223 307.8152 0002611 84.6656 49.7424 1.00270331 44851 -ASTRA 1KR -1 29055U 06012A 17117.83105093 .00000107 00000-0 00000-0 0 9994 -2 29055 0.0466 276.8626 0001146 45.2221 212.2600 1.00270484 12264 -AMC-18 -1 29644U 06054B 17117.42896751 -.00000101 00000-0 00000-0 0 9992 -2 29644 0.0132 78.3974 0002385 317.0840 229.5778 1.00269595 38123 -ASTRA 1L -1 31306U 07016A 17117.87757578 .00000106 00000-0 00000-0 0 9995 -2 31306 0.0648 307.2017 0003507 42.3918 201.5543 1.00269925 11618 -ASTRA 4A (SIRIUS 4) -1 32299U 07057A 17117.88243532 .00000019 00000-0 00000-0 0 9996 -2 32299 0.0186 62.3217 0002505 324.2792 151.9313 1.00268930 18241 -AMC-21 -1 33275U 08038B 17117.43868888 .00000024 00000-0 00000-0 0 9995 -2 33275 0.0631 75.9926 0002536 332.5006 200.1490 1.00270678 32029 -ASTRA 1M -1 33436U 08057A 17117.87757578 .00000107 00000-0 00000-0 0 9998 -2 33436 0.0084 236.1458 0003096 214.5664 100.4560 1.00274229 12284 -CIEL-2 -1 33453U 08063A 17117.45309159 .00000046 00000-0 00000-0 0 9998 -2 33453 0.0342 99.5233 0002719 298.0751 212.2897 1.00271967 30693 -NSS-9 -1 33749U 09008A 17117.66734164 .00000059 00000-0 00000-0 0 9991 -2 33749 0.0188 55.3374 0001884 333.7401 250.0431 1.00270547 30053 -SES-7 (PROTOSTAR 2) -1 34941U 09027A 17117.90604911 -.00000358 00000-0 00000-0 0 9993 -2 34941 0.0620 78.3407 0001694 224.2225 347.9624 1.00271474 29179 -NSS-12 -1 36032U 09058A 17117.24337260 .00000059 00000-0 00000-0 0 9994 -2 36032 0.0444 79.1380 0002824 327.4447 313.4490 1.00273282 27483 -SES-1 -1 36516U 10016A 17117.42410554 -.00000126 00000-0 00000-0 0 9991 -2 36516 0.0278 18.1781 0002366 20.7458 228.3562 1.00270095 25660 -ASTRA 3B -1 36581U 10021A 17117.87271644 .00000124 00000-0 00000-0 0 9990 -2 36581 0.0432 330.2361 0002689 69.1047 154.3873 1.00274085 25414 -SES-3 -1 37748U 11035A 17117.43745505 -.00000114 00000-0 00000-0 0 9996 -2 37748 0.0177 302.7166 0002682 50.7149 276.6645 1.00271757 21149 -ASTRA 1N -1 37775U 11041A 17117.87757578 .00000107 00000-0 00000-0 0 9995 -2 37775 0.0554 18.0423 0005350 27.9821 145.1783 1.00274721 11077 -SES-2 -1 37809U 11049A 17117.48990098 -.00000208 00000-0 00000-0 0 9997 -2 37809 0.0141 328.8399 0002340 44.5301 291.6604 1.00272640 20555 -QUETZSAT 1 -1 37826U 11054A 17117.51879441 -.00000253 00000-0 00000-0 0 9994 -2 37826 0.0219 327.2838 0002403 88.7113 269.4509 1.00269735 20628 -SES-4 -1 38087U 12007A 17116.07248362 -.00000178 00000-0 00000-0 0 9991 -2 38087 0.0263 350.4261 0002489 35.4688 192.4674 1.00272096 19007 -SES-5 -1 38652U 12036A 17116.07316208 .00000024 00000-0 00000-0 0 9995 -2 38652 0.0345 265.9011 0001928 133.9601 205.7209 1.00272673 17589 -ASTRA 2F -1 38778U 12051A 17117.32303741 .00000138 00000-0 00000-0 0 9994 -2 38778 0.0603 237.7861 0000791 5.2545 116.9595 1.00273058 7702 -SES-6 -1 39172U 13026A 17117.20327191 -.00000273 00000-0 00000-0 0 9999 -2 39172 0.0640 66.7789 0001644 342.8966 198.4033 1.00272157 14255 -O3B FM5 -1 39188U 13031A 17117.33164342 -.00000020 00000-0 00000-0 0 9993 -2 39188 0.0421 30.8340 0007137 54.8425 274.4066 5.00115873 70143 -O3B FM4 -1 39189U 13031B 17117.22361053 -.00000020 00000-0 00000-0 0 9990 -2 39189 0.0505 356.7712 0004954 335.5421 27.6620 5.00115670 70159 -O3B FM2 -1 39190U 13031C 17117.19858684 -.00000020 00000-0 00000-0 0 9999 -2 39190 0.0555 355.6952 0005402 332.0936 32.1800 5.00115591 70111 -O3B PFM -1 39191U 13031D 17117.22198016 -.00000020 00000-0 00000-0 0 9990 -2 39191 0.0421 19.2587 0004299 4.1628 336.5998 5.00115854 70121 -ASTRA 2E -1 39285U 13056A 17117.32231868 .00000138 00000-0 00000-0 0 9994 -2 39285 0.0782 50.0304 0002434 345.7492 324.2448 1.00272380 13009 -SES-8 -1 39460U 13071A 17116.14083076 -.00000279 00000-0 00000-0 0 9998 -2 39460 0.0201 267.7730 0002484 145.8360 306.4233 1.00268061 11045 -ASTRA 5B -1 39617U 14011B 17117.06942167 .00000143 00000-0 00000-0 0 9993 -2 39617 0.0498 315.1147 0002975 88.3285 228.3291 1.00275404 11392 -O3B FM3 -1 40079U 14038A 17117.33376629 -.00000020 00000-0 00000-0 0 9995 -2 40079 0.0472 6.6980 0004096 62.9723 290.3754 5.00115863 46236 -O3B FM7 -1 40080U 14038B 17116.48876216 -.00000019 00000-0 00000-0 0 9997 -2 40080 0.0470 3.9192 0002809 43.4175 312.6888 5.00115408 50973 -O3B FM6 -1 40081U 14038C 17117.31115341 -.00000020 00000-0 00000-0 0 9998 -2 40081 0.0471 5.4973 0003105 50.2003 304.3334 5.00114946 51134 -O3B FM8 -1 40082U 14038D 17117.15610756 -.00000020 00000-0 00000-0 0 9991 -2 40082 0.0477 1.6310 0003814 29.5079 328.8854 5.00115080 51108 -O3B FM10 -1 40348U 14083A 17117.57798659 -.00000021 00000-0 00000-0 0 9992 -2 40348 0.0454 14.2021 0001517 33.3745 312.4379 5.00115858 43080 -O3B FM11 -1 40349U 14083B 17117.19999894 -.00000020 00000-0 00000-0 0 9994 -2 40349 0.0434 16.0104 0001914 13.6128 330.3893 5.00115655 43061 -O3B FM12 -1 40350U 14083C 17117.26694752 -.00000020 00000-0 00000-0 0 9999 -2 40350 0.0435 14.7406 0002491 17.5160 327.7603 5.00115486 43076 -O3B FM9 -1 40351U 14083D 17117.24445637 -.00000020 00000-0 00000-0 0 9994 -2 40351 0.0443 17.1491 0001969 24.7054 318.1622 5.00115562 43089 -ASTRA 2G -1 40364U 14089A 17117.32319888 .00000138 00000-0 00000-0 0 9990 -2 40364 0.0234 33.5213 0004638 8.8669 317.6476 1.00270810 8509 -SES-9 -1 41380U 16013A 17117.10119203 -.00000357 00000-0 00000-0 0 9997 -2 41380 0.0238 296.4856 0001279 110.7465 312.7871 1.00271312 4037 -TDRS 3 -1 19548U 88091B 17117.43482086 -.00000309 00000-0 00000-0 0 9998 -2 19548 14.4377 8.4853 0038291 314.2229 347.1134 1.00274614 91894 -HST -1 20580U 90037B 17117.94700056 .00000756 00000-0 35772-4 0 9998 -2 20580 28.4705 339.4922 0002693 357.0910 111.3947 15.08748200282609 -TDRS 5 -1 21639U 91054B 17117.70188633 .00000077 00000-0 00000-0 0 9997 -2 21639 14.3454 21.9512 0025210 344.6898 294.5266 1.00262986 94243 -TDRS 6 -1 22314U 93003B 17117.43419350 -.00000301 00000-0 00000-0 0 9998 -2 22314 13.8692 24.8717 0006388 315.6641 345.3318 1.00265130 88970 -TDRS 7 -1 23613U 95035B 17117.68131510 -.00000210 00000-0 00000-0 0 9993 -2 23613 14.9559 15.6529 0032064 358.5136 171.6632 1.00276770 79680 -ISS (ZARYA) -1 25544U 98067A 17117.89041289 -.00158687 00000-0 -24621-2 0 9992 -2 25544 51.6432 289.0003 0006055 101.4704 344.3366 15.53834686 53936 -LANDSAT 7 -1 25682U 99020A 17117.79092659 .00000264 00000-0 68682-4 0 9993 -2 25682 98.2153 189.6418 0001113 96.7887 263.3430 14.57107304959254 -TERRA -1 25994U 99068A 17117.80142603 .00000123 00000-0 37358-4 0 9998 -2 25994 98.2109 193.5573 0000796 103.5014 256.6277 14.57108027923339 -TDRS 8 -1 26388U 00034A 17117.31061349 -.00000232 00000-0 00000-0 0 9996 -2 26388 7.4099 56.2608 0004718 257.7593 102.0921 1.00263738 61713 -EO-1 -1 26619U 00075A 17117.69247499 .00000270 00000-0 59650-4 0 9991 -2 26619 97.8389 149.2746 0008635 267.7698 92.2496 14.64377576876148 -TIMED -1 26998U 01055B 17117.92151297 .00000192 00000-0 24993-4 0 9991 -2 26998 74.0732 55.1437 0000438 237.3256 122.7882 14.87885055833956 -TDRS 9 -1 27389U 02011A 17117.92058000 -.00000110 00000-0 00000-0 0 9997 -2 27389 5.1478 79.6916 0020420 251.2959 204.2960 1.00273147 56981 -AQUA -1 27424U 02022A 17117.90384507 .00000166 00000-0 46901-4 0 9995 -2 27424 98.2012 59.9560 0000140 10.1984 64.8011 14.57120005796901 -TDRS 10 -1 27566U 02055A 17117.04900725 .00000070 00000-0 00000-0 0 9999 -2 27566 4.9483 58.6279 0009378 246.4828 113.3121 1.00271717 52762 -SORCE -1 27651U 03004A 17117.79214115 .00000327 00000-0 48531-4 0 9992 -2 27651 39.9956 242.5443 0023936 245.5473 114.2819 14.88645380773270 -AURA -1 28376U 04026A 17117.89508280 .00000174 00000-0 48733-4 0 9996 -2 28376 98.2001 62.1239 0000952 96.4983 263.6324 14.57125904679956 -SWIFT -1 28485U 04047A 17117.41525513 .00001385 00000-0 66533-4 0 9999 -2 28485 20.5561 129.6633 0011204 317.8371 42.1201 15.03687397680537 -THEMIS A -1 30580U 07004A 17118.09331801 .00000257 00000-0 16698+0 0 9993 -2 30580 6.3824 215.4411 8391728 101.0289 0.2646 0.87727473 36639 -THEMIS D -1 30797U 07004D 17117.77430556 .00000094 00000-0 81820-1 0 9994 -2 30797 3.7888 164.1915 8197849 163.0659 34.8189 1.02185240 36987 -THEMIS E -1 30798U 07004E 17117.79513889 .00000545 00000-0 52272+0 0 9996 -2 30798 3.7921 198.0165 8233032 129.8251 316.9150 0.97408732 37106 -AIM -1 31304U 07015A 17117.92721265 .00000893 00000-0 56216-4 0 9999 -2 31304 97.9980 294.5554 0004150 320.5212 39.5714 15.11976292547349 -FGRST (GLAST) -1 33053U 08029A 17117.94701517 .00000742 00000-0 26176-4 0 9993 -2 33053 25.5834 345.6238 0012711 62.0252 298.1569 15.10876705489699 -WISE -1 36119U 09071A 17117.81603356 .00001596 00000-0 60875-4 0 9997 -2 36119 97.4551 145.5861 0004211 116.7801 243.3870 15.28171646408588 -TDRS 11 -1 39070U 13004A 17116.79061433 .00000074 00000-0 00000-0 0 9997 -2 39070 5.4615 328.7166 0009629 304.9713 54.7219 1.00268414 13220 -TDRS 12 -1 39504U 14004A 17117.44786351 -.00000289 00000-0 00000-0 0 9995 -2 39504 6.0328 336.1590 0002577 40.5444 319.2879 1.00273341 10811 -GPM-CORE -1 39574U 14009C 17117.84935445 .00004188 00000-0 65442-4 0 9997 -2 39574 65.0088 90.9956 0010681 281.1564 78.8381 15.55359376179683 -MMS 1 -1 40482U 15011A 17117.80208333 -.00000628 00000-0 00000-0 0 9997 -2 40482 27.8141 310.0064 9023304 152.6411 165.2102 0.35804616 7487 -MMS 2 -1 40483U 15011B 17114.67361111 -.00000288 00000-0 00000-0 0 9996 -2 40483 27.6756 310.1160 9026176 152.6253 123.6208 0.35748658 7455 -MMS 3 -1 40484U 15011C 17109.73150463 -.00000099 00000-0 00000-0 0 9994 -2 40484 27.8996 310.1284 9023985 152.3496 209.0785 0.35694751 7433 -MMS 4 -1 40485U 15011D 17109.72916667 -.00000099 00000-0 00000-0 0 9990 -2 40485 27.9151 310.0971 9019578 152.3661 209.1231 0.35681468 7435 -SES-10 -1 42432U 17017A 17116.59366356 -.00000279 00000-0 00000-0 0 9999 -2 42432 0.0615 287.0530 0003334 168.1634 264.8305 1.00270024 314 -FALCON 9 R/B -1 42433U 17017B 17117.33525216 .00005565 00000-0 11341-2 0 9999 -2 42433 26.1663 344.9441 7144545 196.7506 114.0838 2.46040599 672 -CHINASAT 16 (SJ-13) -1 42662U 17018A 17117.09498522 -.00000364 00000-0 00000-0 0 9997 -2 42662 0.0701 92.0541 0004473 144.6488 123.2625 1.00269687 262 -CZ-3B R/B -1 42663U 17018B 17116.78830297 .00010085 00000-0 22795-2 0 9999 -2 42663 20.9417 0.4716 7527789 186.7535 148.7183 1.98687857 274 -CYGNUS OA-7 -1 42681U 17019A 17117.56707067 -.00142631 00000-0 -21978-2 0 9992 -2 42681 51.6419 290.6117 0005907 96.1704 339.6747 15.53960634 1397 -SOYUZ MS-04 -1 42682U 17020A 17117.56707067 -.00142631 00000-0 -21978-2 0 9995 -2 42682 51.6419 290.6117 0005907 96.1704 339.6747 15.53960634 1130 -TIANZHOU 1 -1 42684U 17021A 17115.57863850 .00010739 00000-0 12852-3 0 9993 -2 42684 42.7842 308.3949 0006997 305.6848 120.0072 15.61008913 796 -CZ-7 R/B -1 42685U 17021B 17117.89470814 .00505596 83290-5 39170-3 0 9994 -2 42685 42.7870 292.2201 0101474 227.5612 131.6558 16.03461630 1184 -CZ-7 DEB -1 42686U 17021C 17115.94763990 .12860804 77632-5 26275-2 0 9992 -2 42686 42.4147 305.1229 0072902 208.8757 152.8273 16.22657722 861 -CZ-7 DEB -1 42687U 17021D 17114.94314343 .14294077 76601-5 34004-2 0 9995 -2 42687 42.6373 311.3812 0080492 190.8459 171.5228 16.19913630 704 -CZ-7 DEB -1 42688U 17021E 17115.93834342 .08151244 85120-5 13207-2 0 9991 -2 42688 43.1009 305.2374 0089795 213.8702 147.9107 16.21600192 863 -METEOSAT-7 -1 24932U 97049B 17116.77393491 -.00000025 00000-0 00000-0 0 9996 -2 24932 10.5935 37.7545 0010836 312.4175 47.4098 0.98307959 71939 -NOAA 15 -1 25338U 98030A 17117.96894994 .00000036 00000-0 34234-4 0 9995 -2 25338 98.7838 128.7757 0010432 359.1807 0.9354 14.25788655985583 -METEOSAT-8 (MSG-1) -1 27509U 02040B 17117.67664500 .00000131 00000-0 00000-0 0 9995 -2 27509 4.7557 58.5253 0000941 266.9424 175.5485 1.00262079 53794 -KALPANA-1 (METSAT 1) -1 27525U 02043A 17117.35141353 -.00000087 00000-0 00000-0 0 9998 -2 27525 6.2678 55.5575 0013379 237.2420 122.5229 1.00273567 53593 -INSAT-3A -1 27714U 03013A 17117.77637519 -.00000129 00000-0 00000-0 0 9993 -2 27714 1.0496 88.1390 0014707 238.9300 338.3469 0.99813424 51413 -NOAA 18 -1 28654U 05018A 17117.96799378 .00000017 00000-0 34642-4 0 9995 -2 28654 99.1861 138.9463 0013859 208.7422 151.2987 14.12334472615079 -METEOSAT-9 (MSG-2) -1 28912U 05049B 17117.16504358 .00000051 00000-0 00000-0 0 9995 -2 28912 2.1048 70.8043 0000560 129.4061 83.7904 1.00269537 41600 -HIMAWARI-7 (MTSAT-2) -1 28937U 06004A 17117.84214854 -.00000255 00000-0 00000-0 0 9995 -2 28937 0.0692 92.9658 0003474 306.2616 264.9760 1.00274084 41015 -FORMOSAT-3 FM6 -1 29047U 06011A 17117.91050652 .00000050 00000-0 35894-4 0 9993 -2 29047 71.9786 289.7709 0051657 239.5827 120.0200 14.28575456577577 -FORMOSAT-3 FM1 -1 29048U 06011B 17117.91100020 .00000167 00000-0 82360-4 0 9998 -2 29048 71.9679 201.9770 0044756 196.6805 285.8158 14.28507774580062 -FORMOSAT-3 FM5 -1 29049U 06011C 17117.73536016 .00000102 00000-0 56574-4 0 9994 -2 29049 72.0218 7.5076 0036501 233.3842 126.3936 14.28559313575829 -FORMOSAT-3 FM3 -1 29050U 06011D 17117.87976436 .00000267 00000-0 66995-4 0 9995 -2 29050 72.0156 270.0752 0051757 248.7846 110.7773 14.58492585589139 -FORMOSAT-3 FM4 -1 29051U 06011E 17117.89784926 .00000069 00000-0 42651-4 0 9992 -2 29051 72.0052 271.3373 0067066 107.8415 253.0052 14.28583272578438 -FORMOSAT-3 FM2 -1 29052U 06011F 17117.90492385 .00000132 00000-0 68118-4 0 9997 -2 29052 72.0350 342.1335 0040895 196.2406 163.7423 14.28675539575937 -GOES 13 -1 29155U 06018A 17116.61117068 -.00000261 00000-0 00000-0 0 9993 -2 29155 0.2882 273.0145 0004779 151.5840 295.4602 1.00276158 9925 -METOP-A -1 29499U 06044A 17117.90671132 .00000021 00000-0 29415-4 0 9991 -2 29499 98.6830 178.3560 0000944 44.3194 75.3974 14.21497227545997 -FENGYUN 2D -1 29640U 06053A 17117.90188513 -.00000371 00000-0 10000-3 0 9993 -2 29640 4.3605 64.6207 0004790 342.3052 257.6462 1.00276521 38091 -FENGYUN 3A -1 32958U 08026A 17114.50910717 -.00000040 00000-0 62222-6 0 9992 -2 32958 98.4136 145.8597 0010947 78.6448 281.5965 14.19657871461722 -FENGYUN 2E -1 33463U 08066A 17117.86649177 -.00000218 00000-0 00000-0 0 9996 -2 33463 2.0878 66.6220 0003340 220.4014 328.0984 1.00269577 30623 -NOAA 19 -1 33591U 09005A 17117.89348672 .00000104 00000-0 81534-4 0 9999 -2 33591 99.0880 84.0177 0014922 56.0394 304.2193 14.12174414423290 -GOES 14 -1 35491U 09033A 17116.69224996 -.00000105 00000-0 00000-0 0 9997 -2 35491 0.1660 103.8623 0004668 130.2036 125.8996 1.00271284 28688 -METEOR-M 1 -1 35865U 09049A 17117.94218892 .00000021 00000-0 28288-4 0 9994 -2 35865 98.4258 141.8675 0001314 316.1021 44.0052 14.22106913394819 -GOES 15 -1 36411U 10008A 17116.77924873 .00000079 00000-0 00000-0 0 9993 -2 36411 0.1007 105.4333 0002141 51.6756 202.9092 1.00273183 26212 -COMS 1 -1 36744U 10032A 17117.92285057 -.00000358 00000-0 00000-0 0 9992 -2 36744 0.0164 339.3925 0000715 58.1991 278.9481 1.00270053 17620 -FENGYUN 3B -1 37214U 10059A 17117.93617325 .00000013 00000-0 29424-4 0 9994 -2 37214 98.8899 76.9443 0016132 284.5685 75.3699 14.15848223335439 -ELEKTRO-L 1 (GOMS 2) -1 37344U 11001A 17116.72182454 -.00000262 00000-0 00000-0 0 9994 -2 37344 2.3349 78.1422 0004268 279.1164 80.8735 1.00219570 22996 -SUOMI NPP -1 37849U 11061A 17117.96995167 .00000005 00000-0 23224-4 0 9991 -2 37849 98.7325 57.3739 0000564 55.4253 2.0870 14.19546095284971 -FENGYUN 2F -1 38049U 12002A 17117.73436551 -.00000369 00000-0 00000-0 0 9999 -2 38049 1.6134 77.9514 0002913 170.6678 343.7793 1.00276058 19425 -METEOSAT-10 (MSG-3) -1 38552U 12035B 17117.40141041 -.00000016 00000-0 00000-0 0 9994 -2 38552 0.8005 51.9205 0000232 155.6438 152.4418 1.00277252 17424 -METOP-B -1 38771U 12049A 17117.94580154 .00000028 00000-0 32544-4 0 9997 -2 38771 98.6834 178.9436 0001717 64.0338 61.1552 14.21497770239145 -FENGYUN 3C -1 39260U 13052A 17117.86887908 .00000007 00000-0 23501-4 0 9994 -2 39260 98.6512 188.7204 0001660 100.0058 260.1297 14.19645578186248 -METEOR-M 2 -1 40069U 14037A 17114.56512847 -.00000028 00000-0 70209-5 0 9990 -2 40069 98.6618 170.3854 0006438 19.5500 340.6158 14.20641274144948 -HIMAWARI-8 -1 40267U 14060A 17117.01160997 -.00000288 00000-0 00000-0 0 9999 -2 40267 0.0115 305.2623 0000585 134.1294 280.6233 1.00269483 9298 -FENGYUN 2G -1 40367U 14090A 17117.85407676 -.00000343 00000-0 00000-0 0 9995 -2 40367 0.5380 260.1505 0003624 324.6317 43.1079 1.00281078 8579 -METEOSAT-11 (MSG-4) -1 40732U 15034A 17117.08970345 -.00000040 00000-0 00000-0 0 9997 -2 40732 1.9114 243.9311 0000818 126.2920 233.7403 1.00272959 6571 -ELEKTRO-L 2 -1 41105U 15074A 17117.47930025 -.00000109 00000-0 00000-0 0 9996 -2 41105 0.0633 57.2317 0002068 11.7263 35.2424 1.00271515 5058 -HIMAWARI-9 -1 41836U 16064A 17117.01119582 -.00000286 00000-0 00000-0 0 9990 -2 41836 0.0381 83.4113 0000619 338.0844 298.5190 1.00271683 1724 -GOES 16 -1 41866U 16071A 17116.65187186 -.00000193 00000-0 00000-0 0 9992 -2 41866 0.0108 65.4581 0001555 322.9658 331.5936 1.00272028 1638 -FENGYUN 4A -1 41882U 16077A 17117.97022532 -.00000316 00000-0 00000-0 0 9992 -2 41882 0.1121 266.7982 0002637 258.2444 139.9757 1.00277180 1511 -CYGFM05 -1 41884U 16078A 17117.87087187 .00000685 00000-0 39010-4 0 9996 -2 41884 34.9575 337.0778 0017333 255.0795 104.7996 15.13530095 20218 -CYGFM04 -1 41885U 16078B 17117.70551274 .00000753 00000-0 42263-4 0 9992 -2 41885 34.9507 337.5553 0015803 252.4244 107.4741 15.13936034 20198 -CYGFM02 -1 41886U 16078C 17117.91648289 .00000698 00000-0 39424-4 0 9992 -2 41886 34.9599 336.5244 0016469 254.5357 105.3535 15.13796344 20223 -CYGFM01 -1 41887U 16078D 17117.94195870 .00000676 00000-0 38521-4 0 9992 -2 41887 34.9543 336.6795 0017757 256.1793 103.6942 15.13503626 20220 -CYGFM08 -1 41888U 16078E 17117.86326471 .00000687 00000-0 39019-4 0 9992 -2 41888 34.9513 336.9557 0017033 255.1094 104.7731 15.13635664 20201 -CYGFM06 -1 41889U 16078F 17117.89211866 .00000734 00000-0 41137-4 0 9994 -2 41889 34.9594 336.3176 0015204 253.2633 106.6410 15.14045414 20213 -CYGFM07 -1 41890U 16078G 17117.88405139 .00001471 00000-0 80367-4 0 9990 -2 41890 34.9529 336.1926 0015007 253.5312 106.3749 15.14177283 20214 -CYGFM03 -1 41891U 16078H 17117.87908482 .00000713 00000-0 39883-4 0 9994 -2 41891 34.9564 336.1818 0014432 253.4967 106.4158 15.14164487 20217 -APRIZESAT 2 -1 28366U 04025A 17117.70666385 .00000026 00000-0 22312-4 0 9996 -2 28366 98.3395 33.2352 0107256 200.7069 158.9756 14.36598585672344 -SAUDICOMSAT 1 -1 28369U 04025D 17117.43016627 .00000093 00000-0 33727-4 0 9993 -2 28369 98.1902 70.7574 0033578 178.4020 181.7289 14.52351849679366 -SAUDICOMSAT 2 -1 28370U 04025E 17117.81665725 .00000065 00000-0 29805-4 0 9997 -2 28370 98.2972 63.8510 0056897 305.0692 54.5172 14.47299162677157 -APRIZESAT 1 -1 28372U 04025G 17117.69181864 .00000055 00000-0 25950-4 0 9998 -2 28372 98.2505 66.7506 0045214 244.1917 115.4609 14.49490387678250 -NANOSAT-1 -1 28493U 04049B 17117.77671165 .00000159 00000-0 32674-4 0 9991 -2 28493 98.2061 186.7817 0005196 148.7664 211.3852 14.73304365663495 -SAUDICOMSAT 7 -1 31119U 07012C 17117.89942703 .00000076 00000-0 24286-4 0 9993 -2 31119 97.9440 82.8646 0059260 219.4933 140.1943 14.61574811534560 -SAUDICOMSAT 6 -1 31121U 07012E 17117.91811954 .00000079 00000-0 26642-4 0 9993 -2 31121 98.0102 75.0373 0075411 283.9275 75.3546 14.58376084533400 -SAUDICOMSAT 5 -1 31124U 07012H 17117.95723383 .00000095 00000-0 27072-4 0 9994 -2 31124 97.9049 87.7198 0051528 186.9160 173.1338 14.63260892535137 -SAUDICOMSAT 3 -1 31125U 07012J 17117.86923966 .00000105 00000-0 28036-4 0 9997 -2 31125 97.8658 92.7441 0043961 156.1420 204.1834 14.64978204535714 -SAUDICOMSAT 4 -1 31127U 07012L 17117.84511234 .00000083 00000-0 26415-4 0 9992 -2 31127 97.9763 79.1433 0066842 250.1718 109.2269 14.60087039534003 -APRIZESAT 4 -1 35684U 09041D 17117.90519049 .00000122 00000-0 23857-4 0 9998 -2 35684 98.1257 59.6437 0045976 259.0924 141.3481 14.79019608417645 -APRIZESAT 3 -1 35686U 09041F 17117.95867562 .00000148 00000-0 22677-4 0 9998 -2 35686 98.2757 115.3934 0073375 175.7760 184.4090 14.87054686419674 -AISSAT 1 -1 36797U 10035C 17117.87786749 .00000340 00000-0 45538-4 0 9990 -2 36797 98.0342 231.2458 0011900 154.5217 205.6587 14.85820232367702 diff --git a/firmware/app/libs/libpredict/tests/data/moon_201509201000.test b/firmware/app/libs/libpredict/tests/data/moon_201509201000.test deleted file mode 100644 index 66d3d819..00000000 --- a/firmware/app/libs/libpredict/tests/data/moon_201509201000.test +++ /dev/null @@ -1,26 +0,0 @@ -[qth] -lat=63.9 -lon=10.9 -alt=0 - -[data] -1442736001,66.09,-30.42,-17.51,224.85,254.05 -1442736002,66.09,-30.42,-17.51,224.86,254.05 -1442736003,66.09,-30.41,-17.51,224.86,254.05 -1442736004,66.10,-30.41,-17.51,224.87,254.05 -1442736005,66.10,-30.41,-17.51,224.87,254.05 -1442736006,66.11,-30.41,-17.51,224.87,254.05 -1442736007,66.11,-30.41,-17.51,224.88,254.05 -1442736008,66.11,-30.41,-17.51,224.88,254.05 -1442736009,66.12,-30.40,-17.51,224.89,254.05 -1442736010,66.12,-30.40,-17.51,224.89,254.05 -1442736011,66.13,-30.40,-17.51,224.89,254.05 -1442736012,66.13,-30.40,-17.51,224.90,254.05 -1442736013,66.13,-30.40,-17.51,224.90,254.05 -1442736014,66.14,-30.40,-17.51,224.91,254.05 -1442736015,66.14,-30.39,-17.51,224.91,254.05 -1442736016,66.15,-30.39,-17.51,224.91,254.05 -1442736017,66.15,-30.39,-17.51,224.92,254.05 -1442736018,66.15,-30.39,-17.51,224.92,254.05 -1442736019,66.16,-30.39,-17.51,224.93,254.05 -1442736020,66.16,-30.39,-17.51,224.93,254.05 diff --git a/firmware/app/libs/libpredict/tests/data/moon_201509201600.test b/firmware/app/libs/libpredict/tests/data/moon_201509201600.test deleted file mode 100644 index 495eca52..00000000 --- a/firmware/app/libs/libpredict/tests/data/moon_201509201600.test +++ /dev/null @@ -1,26 +0,0 @@ -[qth] -lat=63.9 -lon=10.9 -alt=0 - -[data] -1442757601,144.68,+3.42,-17.75,311.80,257.35 -1442757602,144.68,+3.42,-17.75,311.81,257.35 -1442757603,144.69,+3.42,-17.75,311.81,257.35 -1442757604,144.69,+3.42,-17.75,311.82,257.35 -1442757605,144.70,+3.42,-17.75,311.82,257.35 -1442757606,144.70,+3.42,-17.75,311.82,257.35 -1442757607,144.70,+3.42,-17.75,311.83,257.35 -1442757608,144.71,+3.42,-17.75,311.83,257.35 -1442757609,144.71,+3.42,-17.75,311.84,257.35 -1442757610,144.71,+3.43,-17.75,311.84,257.35 -1442757611,144.72,+3.43,-17.75,311.84,257.35 -1442757612,144.72,+3.43,-17.75,311.85,257.35 -1442757613,144.73,+3.43,-17.75,311.85,257.35 -1442757614,144.73,+3.43,-17.75,311.86,257.35 -1442757615,144.73,+3.43,-17.75,311.86,257.35 -1442757616,144.74,+3.43,-17.75,311.86,257.35 -1442757617,144.74,+3.43,-17.75,311.87,257.35 -1442757618,144.74,+3.43,-17.75,311.87,257.35 -1442757619,144.75,+3.43,-17.75,311.88,257.35 -1442757620,144.75,+3.44,-17.75,311.88,257.35 diff --git a/firmware/app/libs/libpredict/tests/data/sat_ERS-1_201509261800.test b/firmware/app/libs/libpredict/tests/data/sat_ERS-1_201509261800.test deleted file mode 100644 index 99fcd09e..00000000 --- a/firmware/app/libs/libpredict/tests/data/sat_ERS-1_201509261800.test +++ /dev/null @@ -1,33 +0,0 @@ -[tle] -1 21574U 91050A 15268.99630557 .00000263 00000-0 10150-3 0 9991 -2 21574 98.3773 218.1360 0034080 40.2399 0.7933 14.37359081267054 - -[qth] -lat=63.9 -lon=10.9 -alt=0 -freq=0 -alat=No alat -alon=No alon - -[data] -1443290401,-21.46,306.94,762.91,237.90,-46.42,1258.889423,360.00,300.88,26715,5950.32,10229.00,7.48,1,-73.91 -1443290402,-21.40,306.93,762.86,237.94,-46.39,1259.557878,360.00,300.94,26715,5950.17,10225.18,7.48,1,-73.94 -1443290403,-21.34,306.91,762.82,237.97,-46.36,1260.226023,360.00,301.00,26715,5950.02,10221.35,7.48,1,-73.97 -1443290404,-21.28,306.90,762.78,238.01,-46.34,1260.910873,360.00,301.06,26715,5949.86,10217.43,7.48,1,-74.00 -1443290405,-21.22,306.88,762.74,238.05,-46.31,1261.577957,360.00,301.12,26715,5949.71,10213.60,7.48,1,-74.04 -1443290406,-21.16,306.87,762.69,238.08,-46.28,1262.244464,360.00,301.18,26715,5949.56,10209.76,7.48,1,-74.07 -1443290407,-21.10,306.85,762.65,238.12,-46.25,1262.910684,360.00,301.24,26715,5949.41,10205.93,7.48,1,-74.10 -1443290408,-21.04,306.84,762.61,238.16,-46.23,1263.576061,360.00,301.31,26715,5949.26,10202.09,7.48,1,-74.13 -1443290409,-20.98,306.83,762.57,238.19,-46.20,1264.247271,360.00,301.37,26715,5949.11,10198.21,7.48,1,-74.16 -1443290410,-20.92,306.81,762.52,238.23,-46.17,1264.911298,360.00,301.43,26715,5948.96,10194.37,7.48,1,-74.19 -1443290411,-20.85,306.80,762.48,238.27,-46.14,1265.574981,360.00,301.49,26715,5948.81,10190.53,7.48,1,-74.22 -1443290412,-20.79,306.78,762.44,238.30,-46.12,1266.237846,360.00,301.55,26715,5948.66,10186.69,7.48,1,-74.25 -1443290413,-20.73,306.77,762.40,238.34,-46.09,1266.900104,360.00,301.61,26715,5948.51,10182.84,7.48,1,-74.28 -1443290414,-20.67,306.75,762.36,238.38,-46.06,1267.562803,360.00,301.67,26715,5948.36,10178.99,7.48,1,-74.31 -1443290415,-20.61,306.74,762.31,238.41,-46.04,1268.224103,360.00,301.73,26715,5948.21,10175.14,7.48,1,-74.34 -1443290416,-20.55,306.73,762.27,238.45,-46.01,1268.885003,360.00,301.79,26715,5948.06,10171.28,7.48,1,-74.38 -1443290417,-20.49,306.71,762.23,238.49,-45.98,1269.545344,360.00,301.85,26715,5947.91,10167.43,7.48,1,-74.41 -1443290418,-20.43,306.70,762.19,238.52,-45.95,1270.205465,360.00,301.91,26715,5947.77,10163.57,7.48,1,-74.44 -1443290419,-20.37,306.68,762.15,238.56,-45.93,1270.874468,360.00,301.97,26715,5947.61,10159.65,7.48,1,-74.47 -1443290420,-20.31,306.67,762.10,238.60,-45.90,1271.532543,360.00,302.03,26715,5947.47,10155.79,7.48,1,-74.50 diff --git a/firmware/app/libs/libpredict/tests/data/sat_GPS_BIIA-10_201509261800.test b/firmware/app/libs/libpredict/tests/data/sat_GPS_BIIA-10_201509261800.test deleted file mode 100644 index 0c31989a..00000000 --- a/firmware/app/libs/libpredict/tests/data/sat_GPS_BIIA-10_201509261800.test +++ /dev/null @@ -1,33 +0,0 @@ -[tle] -1 20959U 90103A 15268.04814446 -.00000015 00000-0 00000+0 0 9997 -2 20959 54.2521 190.2003 0113059 6.2850 353.8618 2.00562036181841 - -[qth] -lat=63.9 -lon=10.9 -alt=0 -freq=0 -alat=No alat -alon=No alon - -[data] -1443290401,+24.14,76.13,20423.24,101.14,+19.41,-226.452390,146.11,142.70,18188,16972.46,24000.47,3.84,1,-11.94 -1443290402,+24.14,76.13,20423.26,101.14,+19.41,-226.460433,146.12,142.71,18188,16972.46,24001.16,3.84,1,-11.93 -1443290403,+24.13,76.13,20423.29,101.14,+19.40,-226.468456,146.13,142.72,18188,16972.47,24001.85,3.84,1,-11.92 -1443290404,+24.12,76.13,20423.31,101.14,+19.39,-226.476465,146.14,142.73,18188,16972.47,24002.54,3.84,1,-11.92 -1443290405,+24.12,76.13,20423.34,101.14,+19.39,-226.484479,146.15,142.74,18188,16972.47,24003.23,3.84,1,-11.91 -1443290406,+24.11,76.14,20423.37,101.15,+19.38,-226.492483,146.15,142.75,18188,16972.48,24003.91,3.84,1,-11.90 -1443290407,+24.10,76.14,20423.39,101.15,+19.37,-226.500583,146.16,142.76,18188,16972.48,24004.61,3.84,1,-11.89 -1443290408,+24.10,76.14,20423.42,101.15,+19.37,-226.508575,146.17,142.76,18188,16972.48,24005.30,3.84,1,-11.88 -1443290409,+24.09,76.14,20423.44,101.15,+19.36,-226.516563,146.18,142.77,18188,16972.48,24005.98,3.84,1,-11.87 -1443290410,+24.08,76.14,20423.47,101.15,+19.35,-226.524551,146.19,142.78,18188,16972.49,24006.67,3.84,1,-11.87 -1443290411,+24.08,76.14,20423.49,101.16,+19.35,-226.532537,146.20,142.79,18188,16972.49,24007.36,3.84,1,-11.86 -1443290412,+24.07,76.14,20423.52,101.16,+19.34,-226.540516,146.21,142.80,18188,16972.49,24008.05,3.84,1,-11.85 -1443290413,+24.06,76.15,20423.54,101.16,+19.33,-226.548492,146.22,142.81,18188,16972.50,24008.74,3.84,1,-11.84 -1443290414,+24.06,76.15,20423.57,101.16,+19.33,-226.556469,146.23,142.82,18188,16972.50,24009.42,3.84,1,-11.83 -1443290415,+24.05,76.15,20423.59,101.17,+19.32,-226.564443,146.23,142.82,18188,16972.50,24010.11,3.84,1,-11.83 -1443290416,+24.05,76.15,20423.62,101.17,+19.31,-226.572412,146.24,142.83,18188,16972.51,24010.80,3.84,1,-11.82 -1443290417,+24.04,76.15,20423.65,101.17,+19.30,-226.580580,146.25,142.84,18188,16972.51,24011.51,3.84,1,-11.81 -1443290418,+24.03,76.15,20423.67,101.17,+19.30,-226.588537,146.26,142.85,18188,16972.51,24012.19,3.84,1,-11.80 -1443290419,+24.03,76.16,20423.70,101.17,+19.29,-226.596493,146.27,142.86,18188,16972.51,24012.88,3.84,1,-11.79 -1443290420,+24.02,76.16,20423.72,101.18,+19.28,-226.604444,146.28,142.87,18188,16972.52,24013.57,3.84,1,-11.79 diff --git a/firmware/app/libs/libpredict/tests/data/sat_HINODE_201509261800.test b/firmware/app/libs/libpredict/tests/data/sat_HINODE_201509261800.test deleted file mode 100644 index b7069229..00000000 --- a/firmware/app/libs/libpredict/tests/data/sat_HINODE_201509261800.test +++ /dev/null @@ -1,33 +0,0 @@ -[tle] -1 29479U 06041A 15269.11672282 .00000318 00000-0 69027-4 0 9994 -2 29479 98.1514 267.8479 0018201 43.1347 317.1278 14.64523079481168 - -[qth] -lat=63.9 -lon=10.9 -alt=0 -freq=0 -alat=No alat -alon=No alon - -[data] -1443290401,+79.10,220.96,684.70,350.71,-9.06,-2021.546112,360.00,56.02,48126,5663.37,4206.75,7.52,1,-31.51 -1443290402,+79.06,220.71,684.71,350.75,-9.10,-2021.836550,360.00,56.08,48126,5663.40,4212.89,7.52,1,-31.50 -1443290403,+79.02,220.46,684.72,350.80,-9.14,-2022.123266,360.00,56.15,48126,5663.43,4219.03,7.52,1,-31.50 -1443290404,+78.97,220.22,684.73,350.85,-9.19,-2022.406348,360.00,56.21,48126,5663.46,4225.17,7.52,1,-31.49 -1443290405,+78.93,219.98,684.73,350.90,-9.23,-2022.689580,360.00,56.27,48126,5663.49,4231.40,7.52,1,-31.49 -1443290406,+78.89,219.74,684.74,350.94,-9.27,-2022.965641,360.00,56.33,48126,5663.51,4237.55,7.52,1,-31.48 -1443290407,+78.85,219.50,684.75,350.99,-9.31,-2023.237969,360.00,56.39,48126,5663.54,4243.70,7.52,1,-31.47 -1443290408,+78.81,219.26,684.76,351.04,-9.35,-2023.506469,360.00,56.46,48126,5663.57,4249.85,7.52,1,-31.47 -1443290409,+78.76,219.03,684.76,351.08,-9.40,-2023.771607,360.00,56.52,48126,5663.60,4256.00,7.52,1,-31.46 -1443290410,+78.72,218.79,684.77,351.13,-9.44,-2024.036677,360.00,56.58,48126,5663.63,4262.24,7.52,1,-31.46 -1443290411,+78.68,218.56,684.78,351.18,-9.48,-2024.294509,360.00,56.64,48126,5663.66,4268.39,7.52,1,-31.45 -1443290412,+78.63,218.33,684.79,351.22,-9.52,-2024.548697,360.00,56.71,48126,5663.68,4274.54,7.52,1,-31.45 -1443290413,+78.59,218.11,684.79,351.27,-9.57,-2024.799440,360.00,56.77,48126,5663.71,4280.69,7.52,1,-31.44 -1443290414,+78.55,217.88,684.80,351.32,-9.61,-2025.046800,360.00,56.83,48126,5663.74,4286.84,7.52,1,-31.43 -1443290415,+78.50,217.66,684.81,351.36,-9.65,-2025.290673,360.00,56.89,48126,5663.77,4293.00,7.52,1,-31.43 -1443290416,+78.46,217.43,684.82,351.41,-9.69,-2025.531086,360.00,56.95,48126,5663.80,4299.15,7.52,1,-31.42 -1443290417,+78.42,217.21,684.82,351.46,-9.73,-2025.768025,360.00,57.01,48126,5663.82,4305.31,7.52,1,-31.42 -1443290418,+78.37,216.99,684.83,351.50,-9.77,-2026.001554,360.00,57.08,48126,5663.85,4311.47,7.52,1,-31.41 -1443290419,+78.33,216.78,684.84,351.55,-9.82,-2026.231714,360.00,57.14,48126,5663.88,4317.63,7.52,1,-31.40 -1443290420,+78.28,216.56,684.84,351.59,-9.86,-2026.461001,360.00,57.20,48126,5663.91,4323.86,7.52,1,-31.40 diff --git a/firmware/app/libs/libpredict/tests/data/sat_ISS_201509261800.test b/firmware/app/libs/libpredict/tests/data/sat_ISS_201509261800.test deleted file mode 100644 index 71feef2d..00000000 --- a/firmware/app/libs/libpredict/tests/data/sat_ISS_201509261800.test +++ /dev/null @@ -1,33 +0,0 @@ -[tle] -1 25544U 98067A 15268.21313216 .00005785 00000-0 94507-4 0 9995 -2 25544 51.6463 304.6860 0005196 319.3549 152.0018 15.54144244963604 - -[qth] -lat=63.9 -lon=10.9 -alt=0 -freq=0 -alat=No alat -alon=No alon - -[data] -1443290401,+49.66,89.72,411.41,70.65,-16.53,-831.434808,360.00,110.78,96384,4463.49,4774.93,7.67,0,21.79 -1443290402,+49.68,89.81,411.42,70.56,-16.54,-833.888112,360.00,110.84,96384,4463.53,4777.46,7.67,0,21.76 -1443290403,+49.70,89.90,411.42,70.48,-16.56,-836.335879,360.00,110.91,96384,4463.57,4780.00,7.67,0,21.74 -1443290404,+49.72,89.99,411.43,70.39,-16.57,-838.779367,360.00,110.98,96384,4463.62,4782.54,7.67,0,21.72 -1443290405,+49.74,90.09,411.44,70.30,-16.59,-841.254356,360.00,111.04,96384,4463.66,4785.13,7.67,0,21.70 -1443290406,+49.76,90.18,411.45,70.22,-16.60,-843.687356,360.00,111.11,96384,4463.70,4787.69,7.67,0,21.68 -1443290407,+49.78,90.27,411.46,70.13,-16.61,-846.115386,360.00,111.17,96384,4463.74,4790.25,7.67,0,21.65 -1443290408,+49.80,90.37,411.46,70.04,-16.63,-848.539595,360.00,111.24,96384,4463.78,4792.83,7.67,0,21.63 -1443290409,+49.82,90.46,411.47,69.96,-16.64,-850.958725,360.00,111.30,96384,4463.82,4795.41,7.67,0,21.61 -1443290410,+49.84,90.55,411.48,69.87,-16.66,-853.395945,360.00,111.37,96384,4463.87,4798.02,7.67,0,21.58 -1443290411,+49.85,90.65,411.49,69.79,-16.67,-855.806007,360.00,111.44,96384,4463.91,4800.62,7.67,0,21.56 -1443290412,+49.87,90.74,411.50,69.70,-16.69,-858.210404,360.00,111.50,96384,4463.95,4803.22,7.67,0,21.54 -1443290413,+49.89,90.83,411.50,69.62,-16.70,-860.610088,360.00,111.57,96384,4463.99,4805.83,7.67,0,21.52 -1443290414,+49.91,90.93,411.51,69.53,-16.72,-863.005149,360.00,111.63,96384,4464.03,4808.45,7.67,0,21.49 -1443290415,+49.93,91.02,411.52,69.44,-16.73,-865.397951,360.00,111.70,96384,4464.07,4811.08,7.67,0,21.47 -1443290416,+49.95,91.11,411.53,69.36,-16.75,-867.780622,360.00,111.76,96384,4464.11,4813.71,7.67,0,21.45 -1443290417,+49.96,91.21,411.54,69.27,-16.76,-870.159233,360.00,111.83,96384,4464.15,4816.35,7.67,0,21.42 -1443290418,+49.98,91.30,411.54,69.19,-16.78,-872.531419,360.00,111.90,96384,4464.19,4819.00,7.67,0,21.40 -1443290419,+50.00,91.39,411.55,69.10,-16.79,-874.899912,360.00,111.96,96384,4464.23,4821.65,7.67,0,21.38 -1443290420,+50.02,91.49,411.56,69.02,-16.81,-877.265076,360.00,112.03,96384,4464.27,4824.31,7.67,0,21.36 diff --git a/firmware/app/libs/libpredict/tests/data/sat_MOLNIYA_1-29_201509261800.test b/firmware/app/libs/libpredict/tests/data/sat_MOLNIYA_1-29_201509261800.test deleted file mode 100644 index c7a7109d..00000000 --- a/firmware/app/libs/libpredict/tests/data/sat_MOLNIYA_1-29_201509261800.test +++ /dev/null @@ -1,33 +0,0 @@ -[tle] -1 07780U 75036A 15268.44024861 .00000357 00000-0 -30994-3 0 9998 -2 07780 61.6281 228.0088 7320994 263.7628 16.5221 2.00561847296359 - -[qth] -lat=63.9 -lon=10.9 -alt=0 -freq=0 -alat=0 -alon=0 - -[data] -1443290401,+60.41,60.63,35723.82,75.71,+63.20,351.355691,18.81,242.21,29637,18097.64,36311.95,1.98,1,-54.20 -1443290402,+60.41,60.63,35722.72,75.71,+63.20,351.406994,18.81,242.22,29637,18097.59,36310.88,1.98,1,-54.20 -1443290403,+60.41,60.63,35721.63,75.71,+63.20,351.458287,18.82,242.23,29637,18097.54,36309.81,1.98,1,-54.19 -1443290404,+60.41,60.63,35720.54,75.71,+63.20,351.509591,18.82,242.24,29637,18097.48,36308.74,1.98,1,-54.19 -1443290405,+60.41,60.63,35719.45,75.71,+63.20,351.560883,18.82,242.25,29637,18097.43,36307.67,1.98,1,-54.19 -1443290406,+60.41,60.63,35718.36,75.71,+63.20,351.612175,18.82,242.26,29637,18097.38,36306.61,1.98,1,-54.19 -1443290407,+60.41,60.63,35717.27,75.72,+63.20,351.663473,18.83,242.26,29637,18097.33,36305.54,1.98,1,-54.19 -1443290408,+60.41,60.63,35716.17,75.72,+63.20,351.714762,18.83,242.27,29637,18097.28,36304.47,1.98,1,-54.18 -1443290409,+60.41,60.63,35715.08,75.72,+63.19,351.766014,18.83,242.28,29637,18097.23,36303.40,1.98,1,-54.18 -1443290410,+60.41,60.63,35713.98,75.72,+63.19,351.817451,18.83,242.29,29637,18097.18,36302.33,1.98,1,-54.18 -1443290411,+60.41,60.63,35712.89,75.72,+63.19,351.868780,18.84,242.30,29637,18097.13,36301.26,1.98,1,-54.18 -1443290412,+60.41,60.63,35711.80,75.72,+63.19,351.920157,18.84,242.31,29637,18097.08,36300.19,1.98,1,-54.18 -1443290413,+60.41,60.63,35710.70,75.72,+63.19,351.971467,18.84,242.31,29637,18097.03,36299.12,1.98,1,-54.18 -1443290414,+60.41,60.63,35709.61,75.72,+63.19,352.022781,18.84,242.32,29637,18096.98,36298.05,1.99,1,-54.17 -1443290415,+60.41,60.63,35708.52,75.73,+63.19,352.074104,18.85,242.33,29637,18096.93,36296.98,1.99,1,-54.17 -1443290416,+60.40,60.63,35707.42,75.73,+63.19,352.125413,18.85,242.34,29637,18096.88,36295.91,1.99,1,-54.17 -1443290417,+60.40,60.63,35706.33,75.73,+63.19,352.176801,18.85,242.35,29637,18096.82,36294.84,1.99,1,-54.17 -1443290418,+60.40,60.63,35705.23,75.73,+63.19,352.228109,18.85,242.36,29637,18096.77,36293.77,1.99,1,-54.17 -1443290419,+60.40,60.63,35704.14,75.73,+63.19,352.279397,18.86,242.37,29637,18096.72,36292.70,1.99,1,-54.16 -1443290420,+60.40,60.63,35703.05,75.73,+63.19,352.330692,18.86,242.37,29637,18096.67,36291.62,1.99,1,-54.16 diff --git a/firmware/app/libs/libpredict/tests/data/sat_SIRIUS-1_201509261800.test b/firmware/app/libs/libpredict/tests/data/sat_SIRIUS-1_201509261800.test deleted file mode 100644 index 85d94a42..00000000 --- a/firmware/app/libs/libpredict/tests/data/sat_SIRIUS-1_201509261800.test +++ /dev/null @@ -1,33 +0,0 @@ -[tle] -1 26390U 00035A 15263.05767392 .00000057 00000-0 00000+0 0 9995 -2 26390 59.7673 235.4685 2643498 268.8985 140.1391 1.00280878 55759 - -[qth] -lat=63.9 -lon=10.9 -alt=0 -freq=0 -alat=No alat -alon=No alon - -[data] -1443290401,-26.58,303.20,28252.04,238.81,-24.25,-94.165685,360.00,36.31,5582,17674.66,36741.00,3.68,1,-127.34 -1443290402,-26.58,303.20,28252.78,238.81,-24.25,-94.184648,360.00,36.31,5582,17674.71,36741.28,3.68,1,-127.34 -1443290403,-26.57,303.20,28253.52,238.81,-24.24,-94.203602,360.00,36.32,5582,17674.77,36741.57,3.68,1,-127.34 -1443290404,-26.57,303.20,28254.26,238.82,-24.24,-94.222557,360.00,36.32,5582,17674.82,36741.86,3.68,1,-127.34 -1443290405,-26.56,303.20,28254.99,238.82,-24.24,-94.241518,360.00,36.33,5582,17674.87,36742.14,3.68,1,-127.34 -1443290406,-26.56,303.20,28255.74,238.82,-24.23,-94.260744,360.00,36.33,5582,17674.92,36742.43,3.68,1,-127.34 -1443290407,-26.55,303.20,28256.48,238.83,-24.23,-94.279691,360.00,36.33,5582,17674.97,36742.72,3.68,1,-127.34 -1443290408,-26.55,303.20,28257.22,238.83,-24.22,-94.298625,360.00,36.34,5582,17675.02,36743.00,3.68,1,-127.34 -1443290409,-26.54,303.20,28257.96,238.83,-24.22,-94.317563,360.00,36.34,5582,17675.07,36743.29,3.68,1,-127.34 -1443290410,-26.54,303.20,28258.70,238.83,-24.21,-94.336495,360.00,36.35,5582,17675.12,36743.58,3.68,1,-127.34 -1443290411,-26.53,303.20,28259.43,238.84,-24.21,-94.355459,360.00,36.35,5582,17675.17,36743.86,3.68,1,-127.34 -1443290412,-26.53,303.20,28260.17,238.84,-24.21,-94.374388,360.00,36.36,5582,17675.22,36744.15,3.68,1,-127.34 -1443290413,-26.52,303.20,28260.91,238.84,-24.20,-94.393320,360.00,36.36,5582,17675.28,36744.44,3.68,1,-127.34 -1443290414,-26.52,303.20,28261.65,238.84,-24.20,-94.412254,360.00,36.36,5582,17675.33,36744.72,3.68,1,-127.34 -1443290415,-26.51,303.19,28262.39,238.85,-24.19,-94.431172,360.00,36.37,5582,17675.38,36745.01,3.68,1,-127.34 -1443290416,-26.51,303.19,28263.13,238.85,-24.19,-94.450279,360.00,36.37,5582,17675.43,36745.30,3.68,1,-127.34 -1443290417,-26.50,303.19,28263.87,238.85,-24.18,-94.469210,360.00,36.38,5582,17675.48,36745.59,3.68,1,-127.34 -1443290418,-26.50,303.19,28264.61,238.85,-24.18,-94.488144,360.00,36.38,5582,17675.53,36745.88,3.68,1,-127.34 -1443290420,-26.49,303.19,28265.35,238.86,-24.18,-94.507075,360.00,36.39,5582,17675.58,36746.16,3.68,1,-127.34 -1443290421,-26.49,303.19,28266.09,238.86,-24.17,-94.526013,360.00,36.39,5582,17675.63,36746.45,3.68,1,-127.34 diff --git a/firmware/app/libs/libpredict/tests/data/sat_THOR_III_201509261800.test b/firmware/app/libs/libpredict/tests/data/sat_THOR_III_201509261800.test deleted file mode 100644 index 35314904..00000000 --- a/firmware/app/libs/libpredict/tests/data/sat_THOR_III_201509261800.test +++ /dev/null @@ -1,33 +0,0 @@ -[tle] -1 25358U 98035A 15268.24841071 -.00000057 00000-0 00000+0 0 9999 -2 25358 4.3158 63.1329 0002182 131.4584 254.3027 1.00273084 63433 - -[qth] -lat=63.9 -lon=10.9 -alt=0 -freq=0 -alat=50 -alon=90 - -[data] -1443290401,-1.99,355.67,35783.82,196.60,+14.76,-10.130545,120.36,76.45,6345,18100.42,40075.29,3.07,1,-83.77 -1443290402,-1.99,355.67,35783.82,196.60,+14.76,-10.130176,120.36,76.45,6345,18100.42,40075.32,3.07,1,-83.77 -1443290403,-1.99,355.67,35783.82,196.60,+14.76,-10.129807,120.36,76.46,6345,18100.42,40075.36,3.07,1,-83.76 -1443290405,-1.99,355.67,35783.82,196.60,+14.76,-10.129438,120.37,76.46,6345,18100.42,40075.39,3.07,1,-83.76 -1443290406,-1.99,355.67,35783.82,196.60,+14.76,-10.129069,120.37,76.47,6345,18100.42,40075.42,3.07,1,-83.76 -1443290407,-1.99,355.67,35783.82,196.60,+14.76,-10.128700,120.37,76.47,6345,18100.42,40075.45,3.07,1,-83.75 -1443290408,-2.00,355.67,35783.82,196.60,+14.76,-10.128331,120.37,76.48,6345,18100.42,40075.48,3.07,1,-83.75 -1443290409,-2.00,355.67,35783.82,196.60,+14.76,-10.127962,120.37,76.48,6345,18100.42,40075.51,3.07,1,-83.74 -1443290410,-2.00,355.67,35783.82,196.60,+14.76,-10.127593,120.37,76.48,6345,18100.42,40075.54,3.07,1,-83.74 -1443290411,-2.00,355.67,35783.82,196.60,+14.76,-10.127224,120.37,76.49,6345,18100.42,40075.57,3.07,1,-83.73 -1443290412,-2.00,355.67,35783.82,196.60,+14.76,-10.126855,120.37,76.49,6345,18100.42,40075.60,3.07,1,-83.73 -1443290413,-2.00,355.67,35783.82,196.60,+14.76,-10.126485,120.37,76.50,6345,18100.42,40075.63,3.07,1,-83.73 -1443290414,-2.00,355.67,35783.82,196.60,+14.76,-10.126116,120.37,76.50,6345,18100.42,40075.66,3.07,1,-83.72 -1443290415,-2.00,355.67,35783.83,196.60,+14.76,-10.125747,120.37,76.50,6345,18100.42,40075.69,3.07,1,-83.72 -1443290416,-2.00,355.67,35783.83,196.60,+14.75,-10.125378,120.37,76.51,6345,18100.42,40075.72,3.07,1,-83.71 -1443290417,-2.00,355.67,35783.83,196.60,+14.75,-10.125002,120.37,76.51,6345,18100.42,40075.75,3.07,1,-83.71 -1443290418,-2.00,355.67,35783.83,196.60,+14.75,-10.124633,120.38,76.52,6345,18100.42,40075.79,3.07,1,-83.70 -1443290419,-2.00,355.67,35783.83,196.60,+14.75,-10.124263,120.38,76.52,6345,18100.42,40075.82,3.07,1,-83.70 -1443290420,-2.00,355.67,35783.83,196.60,+14.75,-10.123894,120.38,76.53,6345,18100.42,40075.85,3.07,1,-83.70 -1443290421,-2.00,355.67,35783.83,196.60,+14.75,-10.123524,120.38,76.53,6345,18100.42,40075.88,3.07,1,-83.69 diff --git a/firmware/app/libs/libpredict/tests/data/sat_VELA-1_201509261800.test b/firmware/app/libs/libpredict/tests/data/sat_VELA-1_201509261800.test deleted file mode 100644 index 1f92e346..00000000 --- a/firmware/app/libs/libpredict/tests/data/sat_VELA-1_201509261800.test +++ /dev/null @@ -1,33 +0,0 @@ -[tle] -1 00692U 63039C 15270.70453905 -.00001516 00000-0 00000+0 0 9999 -2 00692 35.8806 1.0617 5492959 190.0635 359.6944 0.22560069 41927 - -[qth] -lat=63.9 -lon=10.9 -alt=0 -freq=0 -alat=No alat -alon=No alon - -[data] -1443290401,+27.63,131.83,127022.16,51.11,+9.78,336.915343,360.00,282.84,4192,19427.46,132178.16,1.57,1,-47.14 -1443290402,+27.63,131.83,127021.30,51.11,+9.78,336.919938,360.00,282.84,4192,19427.45,132177.14,1.57,1,-47.14 -1443290403,+27.63,131.82,127020.42,51.12,+9.78,336.924602,360.00,282.84,4192,19427.45,132176.09,1.57,1,-47.14 -1443290404,+27.63,131.82,127019.56,51.12,+9.78,336.929197,360.00,282.85,4192,19427.45,132175.08,1.57,1,-47.14 -1443290405,+27.63,131.81,127018.70,51.12,+9.79,336.933790,360.00,282.85,4192,19427.44,132174.06,1.57,1,-47.14 -1443290406,+27.63,131.81,127017.84,51.12,+9.79,336.938384,360.00,282.85,4192,19427.44,132173.03,1.57,1,-47.14 -1443290407,+27.63,131.81,127016.98,51.13,+9.79,336.942979,360.00,282.85,4192,19427.43,132172.02,1.57,1,-47.14 -1443290408,+27.63,131.80,127016.12,51.13,+9.79,336.947571,360.00,282.85,4192,19427.43,132171.00,1.57,1,-47.14 -1443290409,+27.63,131.80,127015.26,51.13,+9.79,336.952163,360.00,282.85,4192,19427.43,132169.97,1.57,1,-47.14 -1443290410,+27.63,131.80,127014.40,51.14,+9.79,336.956756,360.00,282.85,4192,19427.42,132168.95,1.57,1,-47.14 -1443290411,+27.63,131.79,127013.54,51.14,+9.80,336.961349,360.00,282.85,4192,19427.42,132167.94,1.57,1,-47.14 -1443290412,+27.63,131.79,127012.67,51.14,+9.80,336.965941,360.00,282.85,4192,19427.41,132166.91,1.57,1,-47.14 -1443290413,+27.63,131.79,127011.81,51.15,+9.80,336.970533,360.00,282.85,4192,19427.41,132165.89,1.57,1,-47.15 -1443290414,+27.63,131.78,127010.95,51.15,+9.80,336.975126,360.00,282.85,4192,19427.41,132164.88,1.57,1,-47.15 -1443290415,+27.63,131.78,127010.09,51.15,+9.80,336.979719,360.00,282.86,4192,19427.40,132163.84,1.57,1,-47.15 -1443290416,+27.63,131.77,127009.23,51.15,+9.80,336.984313,360.00,282.86,4192,19427.40,132162.83,1.57,1,-47.15 -1443290417,+27.63,131.77,127008.37,51.16,+9.80,336.988907,360.00,282.86,4192,19427.39,132161.81,1.57,1,-47.15 -1443290418,+27.63,131.77,127007.51,51.16,+9.81,336.993502,360.00,282.86,4192,19427.39,132160.78,1.57,1,-47.15 -1443290419,+27.63,131.76,127006.65,51.16,+9.81,336.998095,360.00,282.86,4192,19427.39,132159.77,1.57,1,-47.15 -1443290420,+27.63,131.76,127005.79,51.17,+9.81,337.002691,360.00,282.86,4192,19427.38,132158.75,1.57,1,-47.15 diff --git a/firmware/app/libs/libpredict/tests/data/sun_201509201933.test b/firmware/app/libs/libpredict/tests/data/sun_201509201933.test deleted file mode 100644 index 358705d1..00000000 --- a/firmware/app/libs/libpredict/tests/data/sun_201509201933.test +++ /dev/null @@ -1,26 +0,0 @@ -[qth] -lat=63.9 -lon=10.9 -alt=0 - -[data] -1442770381,275.65,-1.63,1.02,84.89,177.65 -1442770382,275.65,-1.63,1.02,84.90,177.65 -1442770383,275.66,-1.64,1.02,84.90,177.65 -1442770384,275.66,-1.64,1.02,84.90,177.65 -1442770385,275.67,-1.64,1.02,84.91,177.65 -1442770386,275.67,-1.64,1.02,84.91,177.65 -1442770387,275.67,-1.64,1.02,84.92,177.65 -1442770388,275.68,-1.65,1.02,84.92,177.65 -1442770389,275.68,-1.65,1.02,84.93,177.65 -1442770390,275.68,-1.65,1.02,84.93,177.65 -1442770391,275.69,-1.65,1.02,84.93,177.65 -1442770392,275.69,-1.65,1.02,84.94,177.65 -1442770393,275.70,-1.65,1.02,84.94,177.65 -1442770394,275.70,-1.66,1.02,84.95,177.65 -1442770395,275.70,-1.66,1.02,84.95,177.65 -1442770396,275.71,-1.66,1.02,84.95,177.65 -1442770397,275.71,-1.66,1.02,84.96,177.65 -1442770398,275.71,-1.66,1.02,84.96,177.65 -1442770399,275.72,-1.67,1.02,84.97,177.65 -1442770400,275.72,-1.67,1.02,84.97,177.65 diff --git a/firmware/app/libs/libpredict/tests/data/sun_201509210600.test b/firmware/app/libs/libpredict/tests/data/sun_201509210600.test deleted file mode 100644 index 2c932521..00000000 --- a/firmware/app/libs/libpredict/tests/data/sun_201509210600.test +++ /dev/null @@ -1,26 +0,0 @@ -[qth] -lat=63.9 -lon=10.9 -alt=0 - -[data] -1442808001,73.90,-6.80,0.85,241.68,178.04 -1442808002,73.91,-6.80,0.85,241.69,178.04 -1442808003,73.91,-6.80,0.85,241.69,178.04 -1442808004,73.91,-6.80,0.85,241.69,178.04 -1442808005,73.92,-6.79,0.85,241.70,178.04 -1442808006,73.92,-6.79,0.85,241.70,178.04 -1442808007,73.93,-6.79,0.85,241.71,178.04 -1442808008,73.93,-6.79,0.85,241.71,178.04 -1442808009,73.93,-6.79,0.85,241.71,178.04 -1442808010,73.94,-6.79,0.85,241.72,178.04 -1442808011,73.94,-6.78,0.85,241.72,178.04 -1442808012,73.95,-6.78,0.85,241.73,178.04 -1442808013,73.95,-6.78,0.85,241.73,178.04 -1442808014,73.95,-6.78,0.85,241.74,178.04 -1442808015,73.96,-6.78,0.85,241.74,178.04 -1442808016,73.96,-6.78,0.85,241.74,178.04 -1442808017,73.96,-6.77,0.85,241.75,178.04 -1442808018,73.97,-6.77,0.85,241.75,178.04 -1442808019,73.97,-6.77,0.85,241.76,178.04 -1442808020,73.98,-6.77,0.85,241.76,178.04 diff --git a/firmware/app/libs/libpredict/tests/dummy-t.c b/firmware/app/libs/libpredict/tests/dummy-t.c deleted file mode 100644 index 664df40e..00000000 --- a/firmware/app/libs/libpredict/tests/dummy-t.c +++ /dev/null @@ -1,9 +0,0 @@ -/* - Verify that the test framework works. This test always returns - success. -*/ - -int main(int argc, char *argv[]) -{ - return 0; -} diff --git a/firmware/app/libs/libpredict/tests/geostationary-t.cpp b/firmware/app/libs/libpredict/tests/geostationary-t.cpp deleted file mode 100644 index 509702cc..00000000 --- a/firmware/app/libs/libpredict/tests/geostationary-t.cpp +++ /dev/null @@ -1,158 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "testcase_reader.h" - -#include -#include -#include - -/** - * Satellite structure with name and orbital elements. - **/ -typedef struct { - ///Satellite name - std::string name; - ///Orbital elements - predict_orbital_elements_t *elements; -} satellite_t; - -/** - * Read TLE file. - * - * \param tle_file Filename - * \return List of orbital elements contained in file - **/ -std::vector orbital_elements_from_file(const char *tle_file); - -/** - * Read list of satellite numbers from file. - * - * \param filename Filename - * \return Satellite number list, where retmap[satnum] returns true if satellite number is present in the file - **/ -std::map satcat_list_from_file(const char *filename); - -/** - * Print "geostationary" or "non-geostationary" depending on input. Used for printing convenience in error messages in main(). - * - * \param geos Geostationary/non-geostationary - * \return "geostationary" if geos is true, "non-geostationary" otherwise - **/ -const char* geos_string(bool geos); - -int main(int argc, char **argv) -{ - if (argc < 2) { - std::cout << "Usage: " << argv[0] << " tle-file [optional: geostationary-satcats]" << std::endl; - return 1; - } - - std::vector orbital_elements = orbital_elements_from_file(argv[1]); - std::map geostationary; - - //If satellite number list is not specified, we assume that all satellites in TLE file should be geostationary - bool all_geostationary = false; - if (argc < 3) { - all_geostationary = true; - } else { - geostationary = satcat_list_from_file(argv[2]); - } - bool failed = false; - - for (size_t i=0; i < orbital_elements.size(); i++) { - predict_orbital_elements_t *elements = orbital_elements[i].elements; - std::string name = orbital_elements[i].name; - bool predict_geostationary = predict_is_geosynchronous(elements); - bool is_geostationary = true; - if (!all_geostationary) { - //check against list over satellites that should be geostationary - is_geostationary = geostationary[elements->satellite_number]; - } - - if (predict_geostationary != is_geostationary) { - fprintf(stderr, "Predicted %s, but should be %s ", geos_string(predict_geostationary), geos_string(is_geostationary)); - fprintf(stderr, "for %s (%i): meanmo=%f, ecc=%f, inclin=%f\n", name.c_str(), elements->satellite_number, elements->mean_motion, elements->eccentricity, elements->inclination); - failed = true; - - } - } - return failed; -} - -#define NUM_CHARS_IN_TLE 80 -std::vector orbital_elements_from_file(const char *tle_file) -{ - std::vector ret_list; - - FILE *fd = fopen(tle_file, "r"); - if (fd == NULL) { - fprintf(stderr, "Failed to open TLE file.\n"); - exit(1); - } - - while (feof(fd) == 0) { - satellite_t satellite; - - char name[NUM_CHARS_IN_TLE] = {0}; - char line1[NUM_CHARS_IN_TLE] = {0}; - char line2[NUM_CHARS_IN_TLE] = {0}; - - //read element set - if (fgets(name, NUM_CHARS_IN_TLE, fd) == NULL) break; - if (fgets(line1, NUM_CHARS_IN_TLE, fd) == NULL) break; - if (fgets(line2, NUM_CHARS_IN_TLE, fd) == NULL) break; - - //parse element set - predict_orbital_elements_t *temp_elements = predict_parse_tle(line1, line2); - satellite.elements = temp_elements; - satellite.name = std::string(name); - - //trim name - std::stringstream stream(satellite.name); - stream >> satellite.name; - - ret_list.push_back(satellite); - } - - if (ret_list.size() == 0) { - fprintf(stderr, "Failed to read TLEs from TLE file.\n"); - exit(1); - } - - fclose(fd); - return ret_list; -} - -std::map satcat_list_from_file(const char *filename) -{ - std::ifstream file; - file.open(filename); - - if (file.fail()) { - fprintf(stderr, "Failed to open satellite numbers file.\n"); - exit(1); - } - - std::map ret_list; - while (!file.eof()) { - long sat_cat; - file >> sat_cat; - ret_list[sat_cat] = true; - } - return ret_list; -} - -const char* geos_string(bool geos) -{ - if (geos) { - return "geostationary"; - } else { - return "non-geostationary"; - } -} diff --git a/firmware/app/libs/libpredict/tests/link-t.c b/firmware/app/libs/libpredict/tests/link-t.c deleted file mode 100644 index 4b4d501d..00000000 --- a/firmware/app/libs/libpredict/tests/link-t.c +++ /dev/null @@ -1,23 +0,0 @@ -/* - Verify that it is possible to link with the library and that the - header files and the library have the same version number -*/ - -#include -#include - -int main(int argc, char *argv[]) -{ - printf("Header file version: %06i\n", PREDICT_VERSION); - printf(" Major: %i\n", PREDICT_VERSION_MAJOR); - printf(" Minor: %i\n", PREDICT_VERSION_MINOR); - printf(" Patch: %i\n", PREDICT_VERSION_PATCH); - printf(" String: %s\n", PREDICT_VERSION_STRING); - printf("Object file version: %06i\n", predict_version()); - printf(" Major: %i\n", predict_version_major()); - printf(" Minor: %i\n", predict_version_minor()); - printf(" Patch: %i\n", predict_version_patch()); - printf(" String: %s\n", predict_version_string()); - - return predict_version() != PREDICT_VERSION; // 0 == success -} diff --git a/firmware/app/libs/libpredict/tests/maxelevation-t.cpp b/firmware/app/libs/libpredict/tests/maxelevation-t.cpp deleted file mode 100644 index 050d52f4..00000000 --- a/firmware/app/libs/libpredict/tests/maxelevation-t.cpp +++ /dev/null @@ -1,252 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include "testcase_reader.h" -#include -using namespace std; - -int runtest(const char *filename); - -int main(int argc, char **argv) -{ - //check arguments - if (argc < 2) { - cout << "Usage: " << argv[0] << " " << endl; - return -1; - } - - //test all provided test files - int retval = 0; - for (int i = 1; i < argc; ++i) { - if (runtest(argv[i])) { - cout << argv[i] << ": failed" << endl; - retval = -1; - } else { - cout << argv[i] << ": OK" << endl; - } - } - - return retval; -} - -#include - -//precision of numerical tests -const double EPSILON = 2*FLT_EPSILON; - -/** - * Let predict_at_max_elevation go through a couple of sanity tests: - * - Check that max elevation time is within AOS/LOS of the pass - * - Check if the derivative crosses the zero boundary - * - Check that the elevation is non-zero - * - Check that rough sampling of the elevation throughout the pass does not yield higher elevations - * - Check that when the max elevation time is used as the input, the same max elevation time is returned - * - Check that the same max elevation time is returned regardless of the input time throughout the pass - * This is done for NUM_PASSES different passes, found from the input time. - * - * \param start_time Input start time - * \param observer Observer - * \param orbital_elements Orbital elements of satellite - * \return 0 on success, -1 on failure - **/ -int test_max_elevation(double start_time, predict_observer_t *observer, predict_orbital_elements_t *orbital_elements); - -int runtest(const char *filename) -{ - //load testcase - TestCaseReader testcase; - testcase.loadFromFile(filename); - if (!(testcase.containsValidData() && (testcase.containsValidQth()) && (testcase.containsValidTLE()))) { - fprintf(stderr, "Failed to load testfile: %s\n", filename); - return -1; - } - - //get TLE - char *tle[2]; - testcase.getTLE(tle); - - //create orbit object - predict_orbital_elements_t *orbital_elements = predict_parse_tle(tle[0], tle[1]); - - if (predict_is_geosynchronous(orbital_elements)) { - return 0; - } - - //test at the standard defined QTH - double start_time = predict_to_julian(testcase.data()[0][0]); - predict_observer_t *observer = predict_create_observer("test", testcase.latitude()*M_PI/180.0, testcase.longitude()*M_PI/180.0, testcase.altitude()); - if (test_max_elevation(start_time, observer, orbital_elements) != 0) { - fprintf(stderr, "Failed on fixed QTH.\n"); - return -1; - } - - //test at a QTH that is located exactly on the satellite track, so that elevation should be 90 degrees (and thus potentially a bit problematic with the derivative) - struct predict_position orbit; - struct predict_observation obs; - predict_orbit(orbital_elements, &orbit, start_time); - observer = predict_create_observer("problematic", orbit.latitude, orbit.longitude, 0); - double max_elevation_time = start_time; - - //test that the elevation actually is 90.0 - predict_observe_orbit(observer, &orbit, &obs); - if (!fuzzyCompare(obs.elevation, M_PI/2.0, EPSILON)) { - fprintf(stderr, "Our QTH does not observe a 90 degrees elevation as it should, something wrong with test: %f\n", obs.elevation*180.0/M_PI); - return -1; - } - - //find a time slightly before the pass with elevation less than 0 - double revolution_fraction = 1.0/orbital_elements->mean_motion/12.0; - while (obs.elevation > 0) { - start_time -= revolution_fraction; - predict_orbit(orbital_elements, &orbit, start_time); - predict_observe_orbit(observer, &orbit, &obs); - } - - //find AOS/LOS of pass with elevation 90 degrees - struct predict_observation aos = predict_next_aos(observer, orbital_elements, start_time); - double next_aos = aos.time; - - struct predict_observation los = predict_next_los(observer, orbital_elements, next_aos); - double next_los = los.time; - if (!((max_elevation_time > next_aos) && (max_elevation_time < next_los))) { - fprintf(stderr, "Error in preparing pass times.\n"); - return -1; - } - - //test that time predicted from start_time before the 90 degrees pass corresponds to the theoretical maximum elevation - struct predict_observation max_ele_time_from_start = predict_at_max_elevation(observer, orbital_elements, start_time); - if (!fuzzyCompare(max_elevation_time, max_ele_time_from_start.time, EPSILON)) { - fprintf(stderr, "Failed on predicting max elevation corresponding to theoretical 90 degrees time: new = %f, orig = %f\n", max_ele_time_from_start.time, max_elevation_time); - return -1; - } - - //test that we get back the theoretical maximum elevation when predicting from theoretical maximum elevation time - struct predict_observation max_ele_at_max_elevation = predict_at_max_elevation(observer, orbital_elements, max_elevation_time); - if (!fuzzyCompare(max_elevation_time, max_ele_at_max_elevation.time, EPSILON)) { - fprintf(stderr, "Failed on predicting the same max elevation as input max elevation for 90 degrees elevation: new = %f, orig = %f\n", max_ele_at_max_elevation.time, max_elevation_time); - return -1; - } - - - //check that max elevation for times before a pass are correct, and that the rest of the sanity checks are correct for our 90 degrees elevation test qth - if (test_max_elevation(start_time, observer, orbital_elements) != 0) { - fprintf(stderr, "Failed on QTH placed directly under the satellite.\n"); - return -1; - } - return 0; -} - -//threshold for pass length in order to avoid errors in AOS/LOS finding functions triggering an error in the max elevation tests -#define PASS_LENGTH_THRESHOLD (3.0/(24.0*60)) - -//number of passes to check -#define NUM_PASSES 20 - -//skip one day between each time point we will predict a pass and check the max elevation -#define TIME_DIFF 1 - -//number of times we will sample the elevation throughout a pass to roughly check agains the predicted max elevation -#define NUM_TIME_STEPS 10 - -int test_max_elevation(double start_time, predict_observer_t *observer, predict_orbital_elements_t *orbital_elements) -{ - struct predict_position orbit; - struct predict_observation obs; - - for (int i=0; i < NUM_PASSES; i++) { - start_time += i*TIME_DIFF; - - predict_orbit(orbital_elements, &orbit, start_time); - predict_observe_orbit(observer, &orbit, &obs); - - //one fifth of the total revolution around earth - double revolution_fraction = 1.0/orbital_elements->mean_motion/5.0; - - //skip to time where current elevation is less than 0 (i.e. skip ahead some time along the revolution around earth) - if (obs.elevation > 0) { - struct predict_observation los = predict_next_los(observer, orbital_elements, start_time); - start_time = los.time + revolution_fraction; - while (obs.elevation > 0) { - start_time += revolution_fraction; - predict_orbit(orbital_elements, &orbit, start_time); - predict_observe_orbit(observer, &orbit, &obs); - } - } - - //get times from next pass - struct predict_observation aos = predict_next_aos(observer, orbital_elements, start_time); - predict_julian_date_t next_aos_time = aos.time; - struct predict_observation los = predict_next_los(observer, orbital_elements, next_aos_time); - predict_julian_date_t next_los_time = los.time; - struct predict_observation max_elevation_obs = predict_at_max_elevation(observer, orbital_elements, start_time); - double max_elevation = max_elevation_obs.elevation; - - //check if max elevation time is within aos/los-times - if (!((max_elevation_obs.time > next_aos_time) && (max_elevation_obs.time < next_los_time))) { - fprintf(stderr, "Predicted elevation time not within times for AOS and LOS: predicted time %f, aos %f, los %f\n", max_elevation_obs.time, next_aos_time, next_los_time); - return -1; - } - - //check if derivative on either side of the estimated solution crosses the zero boundary - predict_orbit(orbital_elements, &orbit, max_elevation_obs.time-EPSILON); - predict_observe_orbit(observer, &orbit, &obs); - double lower_derivative = obs.elevation_rate; - predict_orbit(orbital_elements, &orbit, max_elevation_obs.time+EPSILON); - predict_observe_orbit(observer, &orbit, &obs); - double upper_derivative = obs.elevation_rate; - if (!((upper_derivative < 0) && (lower_derivative > 0))) { - fprintf(stderr, "First derivative of elevation not zero: %f %f %f\n", max_elevation_obs.time, lower_derivative, upper_derivative); - return -1; - } - - //check if the found max elevation rate is larger than all other elevations sampled throughout the pass - for (int i=0; i < NUM_TIME_STEPS; i++) { - double time = next_aos_time + i*(next_los_time - next_aos_time)/NUM_TIME_STEPS; - predict_orbit(orbital_elements, &orbit, time); - predict_observe_orbit(observer, &orbit, &obs); - if (max_elevation < obs.elevation - EPSILON) { - fprintf(stderr, "Found elevation through the pass larger than the max elevation: %f, %f\n", max_elevation, obs.elevation); - return -1; - } - } - - //check that the difference between AOS/LOS time is larger than a threshold, and stop the rest of the tests if not (aos/los-functions will detect almost-passes very close to the horizon as actual passes, due to the set thresholds and behavior of the pass finding functions: See issue #18 in the git repository. This will be taken care of among the AOS/LOS tests once the issue is fixed). Predicted max elevation - //will not fail basic tests above (derivative, actual maximum), but will fail the more nasty tests below since they assume more perfect AOS/LOS timepoints. TODO: - //Remove this check once issue #18 is fixed, and we have new and more numerically stable aos/los functions. - if ((next_los_time - next_aos_time) < PASS_LENGTH_THRESHOLD) { - continue; - } - - //check if elevation at max elevation is non-zero - if (max_elevation <= 0) { - fprintf(stderr, "Predicted max elevation is negative: %f\n", max_elevation); - return -1; - } - - //check if max elevation predicted from the max elevation time is valid and the same - struct predict_observation max_ele_at_max_ele = predict_at_max_elevation(observer, orbital_elements, max_elevation_obs.time); - if (!((max_ele_at_max_ele.time > next_aos_time) && (max_ele_at_max_ele.time < next_los_time))) { - fprintf(stderr, "Max elevation predicted at max elevation time not within original pass: %f, %f, %f\n", max_ele_at_max_ele.time, next_aos_time, next_los_time); - return -1; - } - if (!fuzzyCompare(max_elevation_obs.time, max_ele_at_max_ele.time, EPSILON)) { - fprintf(stderr, "Max elevation time predicted from earlier max elevation time not the same: %f, %f\n", max_elevation_obs.time, max_ele_at_max_ele.time); - return -1; - } - - //check if max elevation time predicted from selected time points throughout the pass is consistent - for (int i=0; i < NUM_TIME_STEPS-1; i++) { - double time = next_aos_time + i*(next_los_time - next_aos_time)/NUM_TIME_STEPS; - struct predict_observation new_max_elevation = predict_at_max_elevation(observer, orbital_elements, time); - if (!fuzzyCompare(new_max_elevation.time, max_elevation_obs.time, EPSILON)) { - fprintf(stderr, "Failed to predict consistent elevation times: Original time %f, new time %f, at timestep %d\n", max_elevation_obs.time, new_max_elevation.time, i); - return -1; - } - } - } - - return 0; -} diff --git a/firmware/app/libs/libpredict/tests/moon-t.cpp b/firmware/app/libs/libpredict/tests/moon-t.cpp deleted file mode 100644 index 35be60cb..00000000 --- a/firmware/app/libs/libpredict/tests/moon-t.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "testcase_reader.h" - -#include -using namespace std; - -int runtest(const char *filename); - -int main(int argc, char **argv) -{ - // Check arguments - if (argc < 2) { - cout << "Usage: " << argv[0] << " " << endl; - return -1; - } - - // Test all provided test files - int retval = 0; - for (int i = 1; i < argc; ++i) { - if (runtest(argv[i])) { - cout << argv[i] << ": failed" << endl; - retval = -1; - } else { - cout << argv[i] << ": OK" << endl; - } - } - - return retval; -} - - - -int runtest(const char *filename) -{ - // Load testcase - TestCaseReader testcase; - testcase.loadFromFile(filename); - if (!(testcase.containsValidData() && (testcase.containsValidQth()))) { - fprintf(stderr, "Failed to load testfile: %s\n", filename); - return -1; - } - - // Create observer object - predict_observer_t *obs = predict_create_observer("test", testcase.latitude()*M_PI/180.0, testcase.longitude()*M_PI/180.0, testcase.altitude()); - if (!obs) { - fprintf(stderr, "Failed to initialize observer!"); - return -1; - } - - // Test - int retval = 0; - int line = 1; - for (size_t i=0; i < testcase.data().size(); i++) { - std::vector d = testcase.data()[i]; - double time = d[0]; - double az = d[1]; - double el = d[2]; - double dec = d[3]; - double gha = d[4]; - double ra = d[5]; - - // Compare values within (time - 1, time + 1) (i.e. up time + 1, but not including time + 1) - // (since we don't know the exact time predict generated its data, only within an error of 1 second) - const int DIFF = 1; - struct predict_observation moon_obs_lower; - struct predict_observation moon_obs_upper; - - // Lower bound - predict_observe_moon(obs, predict_to_julian(time), &moon_obs_lower); - - // Upper bound - predict_observe_moon(obs, predict_to_julian(time + DIFF), &moon_obs_upper); - - // Check values - string failed = ""; - if (!fuzzyCompareWithBoundaries(moon_obs_lower.azimuth*180.0/M_PI, moon_obs_upper.azimuth*180.0/M_PI, az)) { - failed += "(azimuth)"; - } - if (!fuzzyCompareWithBoundaries(moon_obs_lower.elevation*180.0/M_PI, moon_obs_upper.elevation*180.0/M_PI, el)) { - failed += "(elevation)"; - } - - //calculate RA, dec and GHA - double dec_lower = predict_moon_declination(predict_to_julian(time))*180.0/M_PI; - double dec_upper = predict_moon_declination(predict_to_julian(time + DIFF))*180.0/M_PI; - if (!fuzzyCompareWithBoundaries(dec_lower, dec_upper, dec)) { - failed += "(declination)"; - } - - double ra_lower = predict_moon_ra(predict_to_julian(time))*180.0/M_PI; - double ra_upper = predict_moon_ra(predict_to_julian(time + DIFF))*180.0/M_PI; - if (!fuzzyCompareWithBoundaries(ra_lower, ra_upper, ra)) { - failed += "(right ascension)"; - } - - double gha_lower = predict_moon_gha(predict_to_julian(time))*180.0/M_PI; - double gha_upper = predict_moon_gha(predict_to_julian(time + DIFF))*180.0/M_PI; - if (!fuzzyCompareWithBoundaries(gha_lower, gha_upper, gha)) { - failed += "(GHA)"; - } - - // Failed? - if (failed != "") { - cout << filename << ": failed at data line " << line << ": " << failed << endl; - - printf("%.8f, %.8f/%.8f/%.8f, %.8f/%.8f/%.8f, " - "%.8f/%.8f/%.8f, " - "%.8f/%.8f/%.8f, " - "%.8f/%.8f/%.8f," - "\n", time, - moon_obs_lower.azimuth*180.0/M_PI, az, moon_obs_upper.azimuth*180.0/M_PI, - moon_obs_lower.elevation*180.0/M_PI, el, moon_obs_upper.elevation*180.0/M_PI, - dec_lower, dec, dec_upper, - ra_lower, ra, ra_upper, - gha_lower, gha, gha_upper - ); - - - retval = -1; - } - - // Increment data line number - ++line; - } - - return retval; -} diff --git a/firmware/app/libs/libpredict/tests/orbit-t.cpp b/firmware/app/libs/libpredict/tests/orbit-t.cpp deleted file mode 100644 index f79a0e11..00000000 --- a/firmware/app/libs/libpredict/tests/orbit-t.cpp +++ /dev/null @@ -1,226 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "testcase_reader.h" - -#include -using namespace std; - -int runtest(const char *filename); - -int main(int argc, char **argv) -{ - // Check arguments - if (argc < 2) { - cout << "Usage: " << argv[0] << " " << endl; - return -1; - } - - // Test all provided test files - int retval = 0; - for (int i = 1; i < argc; ++i) { - if (runtest(argv[i])) { - cout << argv[i] << ": failed" << endl; - retval = -1; - } else { - cout << argv[i] << ": OK" << endl; - } - } - - return retval; -} - -int runtest(const char *filename) -{ - // Load testcase - TestCaseReader testcase; - testcase.loadFromFile(filename); - if (!(testcase.containsValidData() && (testcase.containsValidQth()) && (testcase.containsValidTLE()))) { - fprintf(stderr, "Failed to load testfile: %s\n", filename); - return -1; - } - - // Get TLE - char *tle[2]; - testcase.getTLE(tle); - - // Create orbit objects - predict_orbital_elements_t *orbital_elements = predict_parse_tle(tle[0], tle[1]); - - // Used in lower bound in value check - struct predict_position orbit_lower; - - // Used in upper bound in value check - struct predict_position orbit_upper; - - // Create observer object - predict_observer_t *obs = predict_create_observer("test", testcase.latitude()*M_PI/180.0, testcase.longitude()*M_PI/180.0, testcase.altitude()); - if (!obs) { - fprintf(stderr, "Failed to initialize observer!"); - return -1; - } - - bool check_squint_angle = testcase.containsValidAlonAlat() && (orbital_elements->ephemeris == EPHEMERIS_SDP4); - - // Test - int retval = 0; - int line = 1; - for (size_t i=0; i < testcase.data().size(); i++) { - std::vector d = testcase.data()[i]; - double time = d[0]; - double lat = d[1]; - double lon = d[2]; - double alt = d[3]; - double az = d[4]; - double el = d[5]; - double doppler = d[6]; - double squint = d[7]; - double phase = d[8]; - long revolutions = d[9]; - double footprint = d[10]; - double range = d[11]; - double velocity = d[12]; - double visibility = d[13]; - double eclipse_depth = d[14]; - - bool is_in_sunlight = false; - bool is_visible = false; - - // Parse visibility value - if (visibility == 0.0) { - is_in_sunlight = false; - is_visible = false; - } else if (visibility == 1.0) { - is_in_sunlight = true; - is_visible = false; - } else if (visibility == 2.0) { - is_in_sunlight = true; - is_visible = true; - } - - // Compare values within (time - 1, time + 1) (i.e. up time + 1, but not including time + 1) - // (since we don't know the exact time predict generated its data, only within an error of 1 second) - const int DIFF = 1; - struct predict_observation orbit_obs_lower; - struct predict_observation orbit_obs_upper; - - // Lower bound - predict_orbit(orbital_elements, &orbit_lower, predict_to_julian(time)); - predict_observe_orbit(obs, &orbit_lower, &orbit_obs_lower); - - // Upper bound - predict_orbit(orbital_elements, &orbit_upper, predict_to_julian(time + DIFF)); - predict_observe_orbit(obs, &orbit_upper, &orbit_obs_upper); - - // Check values - string failed = ""; - - // Lat, lon, alt - if (!fuzzyCompareWithBoundaries(orbit_lower.latitude*180.0/M_PI, orbit_upper.latitude*180/M_PI, lat)) { - failed += "(latitude)"; - } - if (!fuzzyCompareWithBoundaries(orbit_lower.longitude*180.0/M_PI, orbit_upper.longitude*180/M_PI, lon)) { - failed += "(longitude)"; - } - if (!fuzzyCompareWithBoundaries(orbit_lower.altitude, orbit_upper.altitude, alt)) { - failed += "(altitude)"; - } - - // Azi, ele - if (!fuzzyCompareWithBoundaries(orbit_obs_lower.azimuth*180.0/M_PI, orbit_obs_upper.azimuth*180.0/M_PI, az)) { - failed += "(azimuth)"; - } - if (!fuzzyCompareWithBoundaries(orbit_obs_lower.elevation*180.0/M_PI, orbit_obs_upper.elevation*180.0/M_PI, el)) { - failed += "(elevation)"; - } - - // Doppler shift, footprint, range, velocity - double frequency = 100.0e06; //predict outputs a weird factor instead of the actual doppler shift (since sign depends on whether it is uplink or downlink frequency), so can set this fixed frequency in order to get the same factor from libpredict. - // uplink and downlink correction is different as we want to anticipate the doppler observed by the satellite such that the satellite receives the uplink signal at nominal frequency - double doppler_lower = predict_doppler_shift(&orbit_obs_lower, frequency); - double doppler_upper = predict_doppler_shift(&orbit_obs_upper, frequency); - if (!fuzzyCompareWithBoundaries(doppler_lower, doppler_upper, doppler)) { - failed += "(doppler)"; - } - if (!fuzzyCompareWithBoundaries(orbit_lower.footprint, orbit_upper.footprint, footprint, 1)) { - failed += "(footprint)"; - } - if (!fuzzyCompareWithBoundaries(orbit_obs_lower.range, orbit_obs_upper.range, range)) { - failed += "(range)"; - } - double velocity_lower = sqrt(pow(orbit_lower.velocity[0], 2.0) + pow(orbit_lower.velocity[1], 2.0) + pow(orbit_lower.velocity[2], 2.0)); - double velocity_upper = sqrt(pow(orbit_upper.velocity[0], 2.0) + pow(orbit_upper.velocity[1], 2.0) + pow(orbit_upper.velocity[2], 2.0)); - if (!fuzzyCompareWithBoundaries(velocity_lower, velocity_upper, velocity)) { - failed += "(velocity)"; - } - - // Eclipse depth - if (!fuzzyCompareWithBoundaries(orbit_lower.eclipse_depth*180.0/M_PI, orbit_upper.eclipse_depth*180.0/M_PI, eclipse_depth)) { - failed += "(eclipse_depth)"; - } - - // Visibility status - if (!(orbit_lower.eclipsed) != is_in_sunlight) { - failed += "(eclipsed)"; - } - if (orbit_obs_lower.visible != is_visible) { - failed += "(visibility)"; - } - - // Squint angle - double squint_angle_lower, squint_angle_upper; - if (check_squint_angle) { - squint_angle_lower = predict_squint_angle(obs, &orbit_lower, testcase.alon()*M_PI/180.0, testcase.alat()*M_PI/180.0)*180.0/M_PI; - squint_angle_upper = predict_squint_angle(obs, &orbit_upper, testcase.alon()*M_PI/180.0, testcase.alat()*M_PI/180.0)*180/M_PI; - if (!fuzzyCompareWithBoundaries(squint_angle_lower, squint_angle_upper, squint)) { - failed += "(squint)"; - } - } - - // Phase - if (!fuzzyCompareWithBoundaries(orbit_lower.phase*180.0/M_PI, orbit_upper.phase*180.0/M_PI, phase)) { - failed += "(phase)"; - } - - // Revolutions - if (!fuzzyCompareWithBoundaries(orbit_lower.revolutions, orbit_upper.revolutions, revolutions)) { - failed += "(revolutions)"; - } - - // Failed? - if (failed != "") { - cout << filename << ": failed at data line " << line << ": " << failed << endl; - - printf("%.8f, %.8f/%.8f/%.8f, %.8f/%.8f/%.8f, %.3f/%.3f/%.3f, %.3f/%.3f/%.3f, %.3f/%.3f/%.3f", time, - orbit_lower.latitude*180.0/M_PI, lat, orbit_upper.latitude*180.0/M_PI, - orbit_lower.longitude*180.0/M_PI, lon, orbit_upper.longitude*180.0/M_PI, - orbit_lower.altitude, alt, orbit_upper.altitude, - orbit_obs_lower.azimuth*180.0/M_PI, az, orbit_obs_upper.azimuth*180.0/M_PI, - orbit_obs_lower.elevation*180.0/M_PI, el, orbit_obs_upper.elevation*180.0/M_PI); - printf(", %.8f/%.8f/%.8f", doppler_lower, doppler, doppler_upper); - printf(", %.8f/%.8f/%.8f", orbit_lower.footprint, footprint, orbit_upper.footprint); - printf(", %.8f/%.8f/%.8f", orbit_obs_lower.range, range, orbit_obs_upper.range); - printf(", %.8f/%.8f/%.8f", velocity_lower, velocity, velocity_upper); - printf(", %.8f/%.8f/%.8f", orbit_lower.eclipse_depth*180.0/M_PI, eclipse_depth, orbit_upper.eclipse_depth*180.0/M_PI); - printf(", %d/%d", !(orbit_lower.eclipsed), is_in_sunlight); - printf(", %d/%d", orbit_obs_lower.visible, is_visible); - - if (check_squint_angle) { - printf(", %.8f/%.8f/%.8f", squint_angle_lower, squint, squint_angle_upper); - } - printf(", %.8f/%.8f/%.8f, %ld/%ld/%ld", orbit_lower.phase*180.0/M_PI, phase, orbit_upper.phase*180.0/M_PI, orbit_lower.revolutions, revolutions, orbit_upper.revolutions); - printf("\n"); - - retval = -1; - } - - // Increment data line number - ++line; - } - - return retval; -} diff --git a/firmware/app/libs/libpredict/tests/sun-t.cpp b/firmware/app/libs/libpredict/tests/sun-t.cpp deleted file mode 100644 index 58898631..00000000 --- a/firmware/app/libs/libpredict/tests/sun-t.cpp +++ /dev/null @@ -1,131 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "testcase_reader.h" - -#include -using namespace std; - -int runtest(const char *filename); - -int main(int argc, char **argv) -{ - // Check arguments - if (argc < 2) { - cout << "Usage: " << argv[0] << " " << endl; - return -1; - } - - // Test all provided test files - int retval = 0; - for (int i = 1; i < argc; ++i) { - if (runtest(argv[i])) { - cout << argv[i] << ": failed" << endl; - retval = -1; - } else { - cout << argv[i] << ": OK" << endl; - } - } - return retval; -} - -int runtest(const char *filename) -{ - // Load testcase - TestCaseReader testcase; - testcase.loadFromFile(filename); - if (!(testcase.containsValidData() && (testcase.containsValidQth()))) { - fprintf(stderr, "Failed to load testfile: %s\n", filename); - return -1; - } - - // Create observer object - predict_observer_t *obs = predict_create_observer("test", testcase.latitude()*M_PI/180.0, testcase.longitude()*M_PI/180.0, testcase.altitude()); - if (!obs) { - fprintf(stderr, "Failed to initialize observer!"); - return -1; - } - - // Test - int retval = 0; - int line = 1; - for (size_t i=0; i < testcase.data().size(); i++) { - std::vector d = testcase.data()[i]; - double time = d[0]; - double az = d[1]; - double el = d[2]; - double dec = d[3]; - double gha = d[4]; - double ra = d[5]; - - // Compare values within (time - 1, time + 1) (i.e. up time + 1, but not including time + 1) - // (since we don't know the exact time predict generated its data, only within an error of 1 second) - const int DIFF = 1; - struct predict_observation sun_obs_lower; - struct predict_observation sun_obs_upper; - - // Lower bound - predict_observe_sun(obs, predict_to_julian(time), &sun_obs_lower); - - // Upper bound - predict_observe_sun(obs, predict_to_julian(time + DIFF), &sun_obs_upper); - - // Check values - string failed = ""; - if (!fuzzyCompareWithBoundaries(sun_obs_lower.azimuth*180.0/M_PI, sun_obs_upper.azimuth*180.0/M_PI, az)) { - failed += "(azimuth)"; - } - if (!fuzzyCompareWithBoundaries(sun_obs_lower.elevation*180.0/M_PI, sun_obs_upper.elevation*180.0/M_PI, el)) { - failed += "(elevation)"; - } - - //calculate RA, dec and GHA - double dec_lower = predict_sun_declination(predict_to_julian(time))*180.0/M_PI; - double dec_upper = predict_sun_declination(predict_to_julian(time + DIFF))*180.0/M_PI; - if (!fuzzyCompareWithBoundaries(dec_lower, dec_upper, dec)) { - failed += "(declination)"; - } - - double ra_lower = predict_sun_ra(predict_to_julian(time))*180.0/M_PI; - double ra_upper = predict_sun_ra(predict_to_julian(time + DIFF))*180.0/M_PI; - if (!fuzzyCompareWithBoundaries(ra_lower, ra_upper, ra)) { - failed += "(right ascension)"; - } - - double gha_lower = predict_sun_gha(predict_to_julian(time))*180.0/M_PI; - double gha_upper = predict_sun_gha(predict_to_julian(time + DIFF))*180.0/M_PI; - if (!fuzzyCompareWithBoundaries(gha_lower, gha_upper, gha)) { - failed += "(GHA)"; - } - - // Failed? - if (failed != "") { - - cout << filename << ": failed at data line " << line << ": " << failed << endl; - - printf("%.8f, %.8f/%.8f/%.8f, %.8f/%.8f/%.8f, " - "%.8f/%.8f/%.8f, " - "%.8f/%.8f/%.8f, " - "%.8f/%.8f/%.8f," - "\n", time, - sun_obs_lower.azimuth*180.0/M_PI, az, sun_obs_upper.azimuth*180.0/M_PI, - sun_obs_lower.elevation*180.0/M_PI, el, sun_obs_upper.elevation*180.0/M_PI, - dec_lower, dec, dec_upper, - ra_lower, ra, ra_upper, - gha_lower, gha, gha_upper - ); - - retval = -1; - } - - // Increment data line number - ++line; - } - - return retval; -} diff --git a/firmware/app/libs/libpredict/tests/testcase_reader.cpp b/firmware/app/libs/libpredict/tests/testcase_reader.cpp deleted file mode 100644 index 491399e2..00000000 --- a/firmware/app/libs/libpredict/tests/testcase_reader.cpp +++ /dev/null @@ -1,246 +0,0 @@ -#include "testcase_reader.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -using namespace std; - -TestCaseReader::TestCaseReader() -{ - m_qth_latitude = NAN; - m_qth_longitude = NAN; - m_qth_altitude = 0; - - m_alat = NAN; - m_alon = NAN; -} - -TestCaseReader::~TestCaseReader() -{ - -} -// trim from start -static inline std::string <rim(std::string &s) { - s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(std::isspace)))); - return s; -} - -// trim from end -static inline std::string &rtrim(std::string &s) { - s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun(std::isspace))).base(), s.end()); - return s; -} - -// trim from both ends -static inline std::string &trim(std::string &s) { - return ltrim(rtrim(s)); -} - -vector tokenize(const string& str,const string& delimiters) -{ - vector tokens; - string::size_type delimPos = 0, tokenPos = 0, pos = 0; - - if(str.length()<1) return tokens; - while(1){ - delimPos = str.find_first_of(delimiters, pos); - tokenPos = str.find_first_not_of(delimiters, pos); - if(string::npos != delimPos){ - if(string::npos != tokenPos){ - if(tokenPos tokens = tokenize(line, "="); - - // Check size - if (tokens.size() != 2) continue; - - // Trim key and value - string key = trim(tokens[0]); - string value = trim(tokens[1]); - - // Skip if empty - if (key.size() == 0) continue; - if (value.size() == 0) continue; - - // Handle keywords - if (key == "lat" || key == "latitude") { - stringstream(value) >> m_qth_latitude; - - } else if (key == "lon" || key == "longitude") { - stringstream(value) >> m_qth_longitude; - } else if (key == "alt" || key == "altitude") { - stringstream(value) >> m_qth_altitude; - } else if (key == "alon"){ - if (value != "No alon") { - stringstream(value) >> m_alon; - } - } else if (key == "alat"){ - if (value != "No alat") { - stringstream(value) >> m_alat; - } - } - } break; - - case DATA: { - // Tokenize on = - vector tokens = tokenize(line, ","); - - vector d; - // Convert to double vector - for (int i=0;i<(int)tokens.size();i++) { - // Trim token spaces - tokens[i] = trim(tokens[i]); - - // Convert to double - double val; - stringstream(tokens[i]) >> val; - - // Append - d.push_back(val); - } - - // Save in data vector - m_data.push_back(d); - - } break; - default: break; - } - } - - file.close(); -} - -void TestCaseReader::getTLE(char *tle[2]) -{ - tle[0] = new char[m_tle[0].size()]; - tle[1] = new char[m_tle[1].size()]; - strcpy(tle[0], m_tle[0].c_str()); - strcpy(tle[1], m_tle[1].c_str()); -} - -bool TestCaseReader::containsValidData() -{ - return (m_data.size() != 0); -} - -bool TestCaseReader::containsValidQth() -{ - return (!(std::isnan(m_qth_latitude)) && !(std::isnan(m_qth_longitude))); -} - -bool TestCaseReader::containsValidTLE() -{ - return ((m_tle[0].size() != 0) && (m_tle[1].size() != 0)); -} - -bool TestCaseReader::containsValidAlonAlat() -{ - return (!(std::isnan(m_alon)) && !(std::isnan(m_alat))); -} - -bool fuzzyCompare(const double &x, const double &y, const double &epsilon) -{ - return fabs(x - y) < epsilon; -} - -bool fuzzyCompareWithBoundaries(const double &input_value_1, const double &input_value_2, const double &compared_value, double offset) -{ - double lower, upper; - if (input_value_2 > input_value_1) - { - lower = input_value_1; - upper = input_value_2; - } - else - { - lower = input_value_2; - upper = input_value_1; - } - return (compared_value < upper + offset) && (compared_value > lower - offset); -} diff --git a/firmware/app/libs/libpredict/tests/testcase_reader.h b/firmware/app/libs/libpredict/tests/testcase_reader.h deleted file mode 100644 index 6a4d3701..00000000 --- a/firmware/app/libs/libpredict/tests/testcase_reader.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef TEST_CASE_H_ -#define TEST_CASE_H_ - -#include -#include -#include - -class TestCaseReader -{ -public: - TestCaseReader(); - ~TestCaseReader(); - - void loadFromFile(const char *filename); - - void getTLE(char *tle[2]); - - double latitude() const {return m_qth_latitude;} - double longitude() const {return m_qth_longitude;} - double altitude() const {return m_qth_altitude;} - - double alon() const {return m_alon;}; - double alat() const {return m_alat;}; - - std::vector > &data() {return m_data;} - - bool containsValidData(); - bool containsValidQth(); - bool containsValidTLE(); - bool containsValidAlonAlat(); - -private: - std::string m_tle[2]; - - double m_alat; - double m_alon; - - double m_qth_latitude; - double m_qth_longitude; - double m_qth_altitude; - - std::vector > m_data; -}; - -bool fuzzyCompare(const double &x, const double &y, const double &epsilon = std::numeric_limits::epsilon()); - -/** - * Check whether input value lies within supplied boundary values. Order of boundary values is irrelevant. - * \param boundary_value_1 Boundary value 1 - * \param boundary_value_2 Boundary value 2 - * \param compared_value Compared value - * \param offset Offset added to each boundary value in order to permit larger deviations from the allowed range. Defaults to 0.05, since predict usually is accurate to two decimals - * \return True if the compared value lies within the boundary values - **/ -bool fuzzyCompareWithBoundaries(const double &boundary_value_1, const double &boundary_value_2, const double &compared_value, double offset = 0.05); - -#endif From 1e607dec742f67fddf83ffb7405c67b11623c3cb Mon Sep 17 00:00:00 2001 From: Carlos Augusto Porto Freitas Date: Sat, 17 Aug 2024 16:26:16 -0300 Subject: [PATCH 5/7] firmware: app: tasks: pos_det: Update pos_det task to use new libpredict version --- firmware/app/tasks/pos_det.c | 75 +++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/firmware/app/tasks/pos_det.c b/firmware/app/tasks/pos_det.c index b1565706..c306d7c5 100644 --- a/firmware/app/tasks/pos_det.c +++ b/firmware/app/tasks/pos_det.c @@ -37,17 +37,18 @@ #include #include #include +#include #include #include "pos_det.h" #include "startup.h" -#ifndef M_PI - #define M_PI 3.14159265358979323846 -#endif /* M_PI */ - xTaskHandle xTaskPosDetHandle; +static predict_orbital_elements_t satellite; +static struct predict_sgp4 sgp4_model; +static struct predict_sdp4 sdp4_model; + void vTaskPosDet(void) { /* Wait startup task to finish */ @@ -61,37 +62,41 @@ void vTaskPosDet(void) const char *tle_line_1 = "1 25544U 98067A 24223.83784911 .00020194 00000+0 36238-3 0 9994"; const char *tle_line_2 = "2 25544 51.6408 44.5872 0005770 185.1957 306.5656 15.49872002467029"; - /* Create orbit object */ - predict_orbital_elements_t *satellite = predict_parse_tle(tle_line_1, tle_line_2); - - /* Predict satellite position */ - struct predict_position my_orbit; - - sys_time_t now = system_get_time(); - - predict_julian_date_t curr_time = predict_to_julian(now + 1723341922ULL); /* 1723341922ULL Corresponds to ISO Time Stamp: 2024-08-11T02:05:22Z */ - - predict_orbit(satellite, &my_orbit, curr_time); - - float lat = my_orbit.latitude * 180.0 / M_PI; - float lon = my_orbit.longitude * 180.0 / M_PI; - float alt = my_orbit.altitude; - - sat_data_buf.obdh.data.position.latitude = (int16_t)lat; - sat_data_buf.obdh.data.position.longitude = (int16_t)lon; - sat_data_buf.obdh.data.position.altitude = (int16_t)alt; - sat_data_buf.obdh.data.position.timestamp = now; - - sys_log_print_event_from_module(SYS_LOG_INFO, TASK_POS_DET_NAME, "Current position (lat/lon/alt): "); - sys_log_print_float(lat, 2); - sys_log_print_msg(" deg/"); - sys_log_print_float(lon, 2); - sys_log_print_msg(" deg/"); - sys_log_print_float(alt, 2); - sys_log_print_msg(" km"); - sys_log_new_line(); - - predict_destroy_orbital_elements(satellite); + /* Populate orbit elements */ + if (predict_parse_tle(&satellite, &sgp4_model, &sdp4_model, tle_line_1, tle_line_2) != NULL) + { + /* Predict satellite position */ + struct predict_position my_orbit; + + sys_time_t now = system_get_time(); + + predict_julian_date_t curr_time = julian_from_timestamp(now + 1723341922ULL); /* 1723341922ULL Corresponds to ISO Time Stamp: 2024-08-11T02:05:22Z */ + + predict_orbit(&satellite, &my_orbit, curr_time); + + float lat = predictRAD2DEG(my_orbit.latitude); + float lon = predictRAD2DEG(my_orbit.longitude); + float alt = my_orbit.altitude; + + sat_data_buf.obdh.data.position.latitude = (int16_t)lat; + sat_data_buf.obdh.data.position.longitude = (int16_t)lon; + sat_data_buf.obdh.data.position.altitude = (int16_t)alt; + sat_data_buf.obdh.data.position.timestamp = now; + + sys_log_print_event_from_module(SYS_LOG_INFO, TASK_POS_DET_NAME, "Current position (lat/lon/alt): "); + sys_log_print_float(lat, 2); + sys_log_print_msg(" deg/"); + sys_log_print_float(lon, 2); + sys_log_print_msg(" deg/"); + sys_log_print_float(alt, 2); + sys_log_print_msg(" km"); + sys_log_new_line(); + } + else + { + sys_log_print_event_from_module(SYS_LOG_ERROR, TASK_POS_DET_NAME, "Failed to parse TLEs"); + sys_log_new_line(); + } vTaskDelayUntil(&last_cycle, pdMS_TO_TICKS(TASK_POS_DET_PERIOD_MS)); } From e11963e7a0e0b4497a4790f920518aa6f1e7f775 Mon Sep 17 00:00:00 2001 From: Carlos Augusto Porto Freitas Date: Mon, 26 Aug 2024 21:25:24 -0300 Subject: [PATCH 6/7] firmware: app: tasks: pos_det: Fix MISRA-C 2012 violations --- firmware/app/tasks/pos_det.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/firmware/app/tasks/pos_det.c b/firmware/app/tasks/pos_det.c index 9b290a7b..06a26d13 100644 --- a/firmware/app/tasks/pos_det.c +++ b/firmware/app/tasks/pos_det.c @@ -47,12 +47,12 @@ xTaskHandle xTaskPosDetHandle; -static predict_orbital_elements_t satellite; -static struct predict_sgp4 sgp4_model; -static struct predict_sdp4 sdp4_model; - void vTaskPosDet(void) { + static predict_orbital_elements_t satellite; + static struct predict_sgp4 sgp4_model; + static struct predict_sdp4 sdp4_model; + /* Flag used to control notification sending */ bool sat_is_inside_brazil = false; @@ -77,7 +77,7 @@ void vTaskPosDet(void) predict_julian_date_t curr_time = julian_from_timestamp(now + 1723341922ULL); /* 1723341922ULL Corresponds to ISO Time Stamp: 2024-08-11T02:05:22Z */ - predict_orbit(&satellite, &my_orbit, curr_time); + (void)predict_orbit(&satellite, &my_orbit, curr_time); float lat = predictRAD2DEG(my_orbit.latitude); float lon = predictRAD2DEG(my_orbit.longitude); From 0fe432ab54c76b3be9350ee2db206ba3d8b8cdff Mon Sep 17 00:00:00 2001 From: Carlos Augusto Porto Freitas Date: Mon, 26 Aug 2024 21:48:05 -0300 Subject: [PATCH 7/7] firmware: Update version for modified files --- firmware/app/tasks/pos_det.c | 2 +- firmware/version.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware/app/tasks/pos_det.c b/firmware/app/tasks/pos_det.c index 06a26d13..d5761bc4 100644 --- a/firmware/app/tasks/pos_det.c +++ b/firmware/app/tasks/pos_det.c @@ -26,7 +26,7 @@ * \author Gabriel Mariano Marcelino * \author Carlos Augusto Porto Freitas * - * \version 0.10.19 + * \version 0.10.20 * * \date 2023/07/19 * diff --git a/firmware/version.h b/firmware/version.h index 4f581505..aef8f632 100644 --- a/firmware/version.h +++ b/firmware/version.h @@ -25,7 +25,7 @@ * * \author Gabriel Mariano Marcelino * - * \version 0.10.19 + * \version 0.10.20 * * \date 2019/10/25 * @@ -36,7 +36,7 @@ #ifndef VERSION_H_ #define VERSION_H_ -#define FIRMWARE_VERSION "0.10.19" +#define FIRMWARE_VERSION "0.10.20" #define FIRMWARE_STATUS "Development"