/** * Construct a planet_tle from two strings containing the two line elements * \param[in] line1 first line * \param[in] line2 second line */ tle::tle(const std::string& line1, const std::string& line2) try : base(), m_line1(line1), m_line2(line2), m_tle(Tle("TLE satellite", line1, line2)), m_sgp4_propagator(SGP4(m_tle)) { // We read the osculating elements of the satellite array6D keplerian_elements; double mu_central_body = kMU*1E09; // (m^3/s^2) double mean_motion = m_tle.MeanMotion() * 2 * kPI / kSECONDS_PER_DAY; // [rad/s] keplerian_elements[0] = std::pow(mu_central_body / (mean_motion*mean_motion),1./3); // a [m] keplerian_elements[1] = m_tle.Eccentricity(); // e keplerian_elements[2] = m_tle.Inclination(false); // i [rad] keplerian_elements[3] = m_tle.RightAscendingNode(false); // Om [rad] keplerian_elements[4] = m_tle.ArgumentPerigee(false); // om [rad] keplerian_elements[5] = m_tle.MeanAnomaly(false); // M [rad] std::string year_str = m_tle.IntDesignator().substr(0,2); int year_int = std::stoi(year_str); std::string rest = m_tle.IntDesignator().substr(2); int prefix = (year_int > 50)?(19):(20); std::string object_name(std::to_string(prefix)+year_str+std::string("-")+rest); set_mu_central_body(mu_central_body); set_name(object_name); m_ref_mjd2000 = epoch(m_tle.Epoch().ToJulian(),epoch::JD).mjd2000(); } catch (TleException& e) { std::cout << "TleException cought in planet_tle constructor" << std::endl; throw_value_error(e.what()); } catch (SatelliteException& e) { std::cout << "SatelliteException cought in planet_tle constructor" << std::endl; throw_value_error(e.what()); }
/** * Construct a planet from its common name (e.g. VENUS) * * \param[in] name a string describing a planet */ jpl_lp::jpl_lp(const std::string& name) : ref_mjd2000(epoch(2451545.0,epoch::JD).mjd2000()) { std::map<std::string, int> mapped_planets; mapped_planets["mercury"] = 1; mapped_planets["venus"] = 2; mapped_planets["earth"] = 3; mapped_planets["mars"] = 4; mapped_planets["jupiter"] = 5; mapped_planets["saturn"] = 6; mapped_planets["uranus"] = 7; mapped_planets["neptune"] = 8; mapped_planets["pluto"] = 9; double mu_central_body; double mu_self; double radius; double safe_radius; std::string lower_case_name = name; boost::algorithm::to_lower(lower_case_name); switch ( mapped_planets[lower_case_name] ) { case (1): { std::copy(mercury_el,mercury_el+6,&jpl_elements[0]); std::copy(mercury_el_dot,mercury_el_dot+6,&jpl_elements_dot[0]); radius = 2440000.; safe_radius = 1.1; mu_self = 22032e9; mu_central_body = ASTRO_MU_SUN; } break; case (2): { std::copy(venus_el,venus_el+6,&jpl_elements[0]); std::copy(venus_el_dot,venus_el_dot+6,&jpl_elements_dot[0]); radius = 6052000.; safe_radius = 1.1; mu_self = 324859e9; mu_central_body = ASTRO_MU_SUN; } break; case (3): { std::copy(earth_moon_el,earth_moon_el+6,&jpl_elements[0]); std::copy(earth_moon_el_dot,earth_moon_el_dot+6,&jpl_elements_dot[0]); radius = 6378000.; safe_radius = 1.1; mu_self = 398600.4418e9; mu_central_body = ASTRO_MU_SUN; } break; case (4): { std::copy(mars_el,mars_el+6,&jpl_elements[0]); std::copy(mars_el_dot,mars_el_dot+6,&jpl_elements_dot[0]); radius = 3397000.; safe_radius = 1.1; mu_self = 42828e9; mu_central_body = ASTRO_MU_SUN; } break; case (5): { std::copy(jupiter_el,jupiter_el+6,&jpl_elements[0]); std::copy(jupiter_el_dot,jupiter_el_dot+6,&jpl_elements_dot[0]); radius = 71492000.; safe_radius = 9.; mu_self = 126686534e9; mu_central_body = ASTRO_MU_SUN; } break; case (6): { std::copy(saturn_el,saturn_el+6,&jpl_elements[0]); std::copy(saturn_el_dot,saturn_el_dot+6,&jpl_elements_dot[0]); radius = 60330000.; safe_radius = 1.1; mu_self = 37931187e9; mu_central_body = ASTRO_MU_SUN; } break; case (7): { std::copy(uranus_el,uranus_el+6,&jpl_elements[0]); std::copy(uranus_el_dot,uranus_el_dot+6,&jpl_elements_dot[0]); radius = 25362000.; safe_radius = 1.1; mu_self = 5793939e9; mu_central_body = ASTRO_MU_SUN; } break; case (8): { std::copy(neptune_el,neptune_el+6,&jpl_elements[0]); std::copy(neptune_el_dot,neptune_el_dot+6,&jpl_elements_dot[0]); radius = 24622000.; safe_radius = 1.1; mu_self = 6836529e9; mu_central_body = ASTRO_MU_SUN; } break; case (9): { std::copy(pluto_el,pluto_el+6,&jpl_elements[0]); std::copy(pluto_el_dot,pluto_el_dot+6,&jpl_elements_dot[0]); radius = 1153000.; safe_radius = 1.1; mu_self = 871e9; mu_central_body = ASTRO_MU_SUN; } break; default : { throw_value_error(std::string("unknown planet name: ") + name); } } set_mu_central_body(mu_central_body); set_mu_self(mu_self); set_radius(radius); set_safe_radius(safe_radius); set_name(lower_case_name); }