Orbiting Interferometer ======================= In the case of NOIRE or SunRISE, the antennas are placed on satellites. Thus, their physical configurations have to tracked with precision over time. On the other hand, for ground-based inteferometers, The user control the configuration which remains stable over the acquisitions. For satellites, the relatives velocities of the antennas can be very different from one baseline to another. Also, The antennas are mounted on the satellite bodies which can be oriented differently. The orientation of a satellite is called "attitude". In conclusion, One needs to know the position, velocity and attitude of the satellites. To do so, use the class :class:`~erwans3.Telescope_class.SatCoord`. This class derives from :class:`~astropy.coordinates.SkyCoord`. which can store Position and Velocity relative to a frame at given times. But SatCoord also include Attitude thanks to a class :class:`~erwans3.Telescope_class.AttitudeRepresentation`. AttitudeRepresentation ---------------------- :class:`~erwans3.Telescope_class.AttitudeRepresentation` derives from :class:`~astropy.coordinates.BaseRepresentation`. Attitudes are stored as quaternions and can be returns as rotation object. Anttena diagrams can thus be oriented on the sky. Attitude can be generated randomly or uniformly for simulations. Usage example ~~~~~~~~~~~~~ *Import* .. code-block:: python from erwans3.Telescope_class import AttitudeRepresentation *Random* .. code-block:: python n_sat = 6 # Number of satellite att = AttitudeRepresentation.make_random(n_sat) print(att) *Same Orientation* .. code-block:: python from scipy.spatial.transform import Rotation ori = Rotation.from_quat(your_quat) # `your_quat` being a single quaternion representaing the attitude of all the satellites att = AttitudeRepresentation.make_identity(n_sat) att.transform(ori.matrix, copy=False) print(att) Satellite Coordinates --------------------- :class:`~erwans3.Telescope_class.SatCoord` derives from :class:`~astropy.coordinates.SkyCoord` and includes an :class:`~erwans3.Telescope_class.AttitudeRepresentation` for each satellite at each time. SatCoord provides various support function for swarms as well as SkyCoord functionalities. SatCoord is not meant to propagate orbits. It is recommended you generate your orbits with a propagator of your choice and then load your orbits using a SatCoord object. Orbital files in the CIC format can be directly translated to SatCoord with the classmethod :meth:`~erwans3.Telescope_class.SatCoord.init_from_folder` Otherwise, you may generate random positions using the distribution function provided in :mod:`~erwans3.utils`. *Basic Usage* .. code-block:: python from erwans3.Telescope_class import SatCoord, AttitudeRepresentation import numpy as np import astropy.units as u from astropy.coordinates import CartesainRepresentation, CartesainDifferential from astropy.time import Time # let assumes you have `pos`, `vel` and `att` of your satellites satpos = CartesainRepresentation( pos*u.m ) satvel = CartesainDifferential( vel*u.m/u.s ) satposvel = satpos.with_differentials(satvel) sat_skycoord = SkyCoord(satposvel) # default frame is ICRS satatt = AttitudeRepresentation(att) times = Time.now() + np.arange(satpos.shape[0])*u.h # satcoord = SatCoord(sat_inframe, att=satatt, obstime=times) print(satcoord) SkyCoord functionalities ~~~~~~~~~~~~~~~~~~~~~~~~ *frame transform* Swarm functionalities ~~~~~~~~~~~~~~~~~~~~~ *barycenter* Custom Frame *trajectory interpolation* get time *baselines* nbl *uv_projection*