def test_transform_unitless_vector(): vector = [0, 1, 0] angle = 45 * u.deg axis = 'z' expected_vector = [np.sqrt(2) / 2, np.sqrt(2) / 2, 0] result = util.transform(vector, angle, axis) assert_allclose(result, expected_vector)
def test_transform_unitless_vector(): vector = [0, 1, 0] angle = 45 * u.deg axis = 'z' expected_vector = [np.sqrt(2) / 2, np.sqrt(2) / 2, 0] result = util.transform(vector, angle, axis) assert_array_almost_equal(result, expected_vector)
def coe2rv(k, p, ecc, inc, raan, argp, nu): """Converts from classical orbital elements to vectors. Parameters ---------- k : float Standard gravitational parameter (km^3 / s^2). p : float Semi-latus rectum or parameter (km). ecc : float Eccentricity. inc : float Inclination (rad). omega : float Longitude of ascending node (rad). argp : float Argument of perigee (rad). nu : float True anomaly (rad). """ r_pqw, v_pqw = rv_pqw(k, p, ecc, nu) r_ijk = transform(r_pqw, -argp, "z", u.rad) r_ijk = transform(r_ijk, -inc, "x", u.rad) r_ijk = transform(r_ijk, -raan, "z", u.rad) v_ijk = transform(v_pqw, -argp, "z", u.rad) v_ijk = transform(v_ijk, -inc, "x", u.rad) v_ijk = transform(v_ijk, -raan, "z", u.rad) return r_ijk, v_ijk
def coe2rv(k, p, ecc, inc, raan, argp, nu): """Converts from classical orbital elements to vectors. Parameters ---------- k : float Standard gravitational parameter (km^3 / s^2). p : float Semi-latus rectum or parameter (km). ecc : float Eccentricity. inc : float Inclination (rad). omega : float Longitude of ascending node (rad). argp : float Argument of perigee (rad). nu : float True anomaly (rad). """ r_pqw, v_pqw = rv_pqw(k, p, ecc, nu) r_ijk = transform(r_pqw, -argp, 'z', u.rad) r_ijk = transform(r_ijk, -inc, 'x', u.rad) r_ijk = transform(r_ijk, -raan, 'z', u.rad) v_ijk = transform(v_pqw, -argp, 'z', u.rad) v_ijk = transform(v_ijk, -inc, 'x', u.rad) v_ijk = transform(v_ijk, -raan, 'z', u.rad) return r_ijk, v_ijk
def body_centered_to_icrs(r, v, source_body, epoch=J2000, rotate_meridian=False): """Converts position and velocity body-centered frame to ICRS. Parameters ---------- r : ~astropy.units.Quantity Position vector in a body-centered reference frame. v : ~astropy.units.Quantity Velocity vector in a body-centered reference frame. source_body : Body Source body. epoch : ~astropy.time.Time, optional Epoch, default to J2000. rotate_meridian : bool, optional Whether to apply the rotation of the meridian too, default to False. Returns ------- r, v : tuple (~astropy.units.Quantity) Position and velocity vectors in ICRS. """ ra, dec, W = source_body.rot_elements_at_epoch(epoch) if rotate_meridian: r = transform(r, -W, 'z') v = transform(v, -W, 'z') r_trans1 = transform(r, -(90 * u.deg - dec), 'x') r_trans2 = transform(r_trans1, -(90 * u.deg + ra), 'z') v_trans1 = transform(v, -(90 * u.deg - dec), 'x') v_trans2 = transform(v_trans1, -(90 * u.deg + ra), 'z') icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel( source_body.name, time=epoch) r_f = icrs_frame_pos_coord.xyz + r_trans2 v_f = icrs_frame_vel_coord.xyz + v_trans2 return r_f.to(r.unit), v_f.to(v.unit)
def icrs_to_body_centered(r, v, target_body, epoch=J2000, rotate_meridian=False): """Converts position and velocity in ICRS to body-centered frame. Parameters ---------- r : ~astropy.units.Quantity Position vector in ICRS. v : ~astropy.units.Quantity Velocity vector in ICRS. target_body : Body Target body. epoch : ~astropy.time.Time, optional Epoch, default to J2000. rotate_meridian : bool, optional Whether to apply the rotation of the meridian too, default to False. Returns ------- r, v : tuple (~astropy.units.Quantity) Position and velocity vectors in a body-centered reference frame. """ ra, dec, W = target_body.rot_elements_at_epoch(epoch) icrs_frame_pos_coord, icrs_frame_vel_coord = get_body_barycentric_posvel( target_body.name, time=epoch) r_trans1 = r - icrs_frame_pos_coord.xyz r_trans2 = transform(r_trans1, (90 * u.deg + ra), 'z') r_f = transform(r_trans2, (90 * u.deg - dec), 'x') v_trans1 = v - icrs_frame_vel_coord.xyz v_trans2 = transform(v_trans1, (90 * u.deg + ra), 'z') v_f = transform(v_trans2, (90 * u.deg - dec), 'x') if rotate_meridian: r_f = transform(r_f, W, 'z') v_f = transform(v_f, W, 'z') return r_f.to(r.unit), v_f.to(v.unit)