def test_from_coord_fails_if_no_time_differential(): pos = [30000, 0, 0] * u.km cartrep = CartesianRepresentation(*pos) # Method fails if coordinate instance doesn't contain a differential with respect to time with pytest.raises(ValueError) as excinfo: Orbit.from_coords(Earth, SkyCoord(cartrep)) assert ( "ValueError: Coordinate instance doesn't have a differential with respect to time" in excinfo.exconly())
def test_from_coord_fails_for_multiple_positions(obstime): cartdiff = CartesianDifferential([[0, 1, 0], [-0.1, 0.9, 0]] * u.km / u.s, xyz_axis=1) cartrep = CartesianRepresentation([[1, 0, 0], [0.9, 0.1, 0]] * u.km, differentials=cartdiff, xyz_axis=1) coords = GCRS(cartrep, representation_type=CartesianRepresentation, obstime=obstime) with pytest.raises(ValueError) as excinfo: Orbit.from_coords(Earth, coords) assert ( "ValueError: Coordinate instance must represents exactly 1 position, found: 2" in excinfo.exconly())
def test_orbit_creation_using_frame_obj(attractor, frame, obstime): vel = [0, 2, 0] * u.km / u.s cartdiff = CartesianDifferential(*vel) pos = [30000, 0, 0] * u.km cartrep = CartesianRepresentation(*pos, differentials=cartdiff) coord = frame(cartrep, obstime=obstime) o = Orbit.from_coords(attractor, coord) inertial_frame_at_body_centre = get_frame(attractor, Planes.EARTH_EQUATOR, obstime=coord.obstime) coord_transformed_to_irf = coord.transform_to( inertial_frame_at_body_centre) pos_transformed_to_irf = coord_transformed_to_irf.cartesian.xyz vel_transformed_to_irf = coord_transformed_to_irf.cartesian.differentials[ "s"].d_xyz assert_quantity_allclose(o.r, pos_transformed_to_irf, atol=1e-5 * u.km) assert_quantity_allclose(o.v, vel_transformed_to_irf, atol=1e-5 * u.km / u.s)
def test_from_coord_if_coord_is_not_of_shape_zero(): pos = [0, 1, 0] vel = [1, 0, 0] cartdiff = CartesianDifferential([vel] * u.km / u.s, xyz_axis=1) cartrep = CartesianRepresentation([pos] * u.km, differentials=cartdiff, xyz_axis=1) coords = GCRS(cartrep, representation_type=CartesianRepresentation, obstime=J2000) ss = Orbit.from_coords(Earth, coords) assert_quantity_allclose(ss.r, pos * u.km, rtol=1e-5) assert_quantity_allclose(ss.v, vel * u.km / u.s, rtol=1e-5)
def test_orbit_creation_using_skycoord(attractor): vel = [0, 2, 0] * u.km / u.s cartdiff = CartesianDifferential(*vel) pos = [30000, 0, 0] * u.km cartrep = CartesianRepresentation(*pos, differentials=cartdiff) coord = SkyCoord(cartrep, frame="icrs") o = Orbit.from_coords(attractor, coord) inertial_frame_at_body_centre = get_frame(attractor, Planes.EARTH_EQUATOR, obstime=coord.obstime) coord_transformed_to_irf = coord.transform_to( inertial_frame_at_body_centre) pos_transformed_to_irf = coord_transformed_to_irf.cartesian.xyz vel_transformed_to_irf = coord_transformed_to_irf.cartesian.differentials[ "s"].d_xyz assert (o.r == pos_transformed_to_irf).all() assert (o.v == vel_transformed_to_irf).all()
def el2rv(inc, raan, ecc, argp, mean_anomaly, mean_motion, epoch): """ Converts mean orbital elements to state vector """ time_tle = epoch.jd - 2433281.5 sat = Satrec() sat.sgp4init( WGS84, "i", 0, time_tle, 0.0, 0.0, 0.0, ecc, argp, inc, mean_anomaly, mean_motion, raan, ) errorCode, rTEME, vTEME = sat.sgp4(epoch.jd1, epoch.jd2) if errorCode != 0: raise RuntimeError(SGP4_ERRORS[errorCode]) pTEME = coord.CartesianRepresentation(rTEME * u.km) vTEME = coord.CartesianDifferential(vTEME * u.km / u.s) svTEME = TEME(pTEME.with_differentials(vTEME), obstime=epoch) svITRS = svTEME.transform_to(coord.ITRS(obstime=epoch)) orb = Orbit.from_coords(Earth, svITRS) return orb.r, orb.v
0.0, 0.0, ecc, argp, inc, m_ano, m_mot, raan, ) errorCode, rTEME, vTEME = sat.sgp4(epoch.jd1, epoch.jd2) if errorCode != 0: raise RuntimeError(SGP4_ERRORS[errorCode]) # Convert state vector from TEME (True Equator Mean Equinox) to ITRS pTEME = coord.CartesianRepresentation(rTEME * u.km) vTEME = coord.CartesianDifferential(vTEME * u.km / u.s) svTEME = TEME(pTEME.with_differentials(vTEME), obstime=iss.epoch) svITRS = svTEME.transform_to(coord.ITRS(obstime=iss.epoch)) sv = Orbit.from_coords(Earth, svITRS) # Display results print("State vector [rv2el]") print(f" r = {sv.r}") print(f" v = {sv.v}") print() print("State vector differences [poliastro - rv2el]") print(f" dr = {iss.r - sv.r}") print(f" dv = {iss.v - sv.v}") print()