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 SatCoord. This class derives from SkyCoord.
which can store Position and Velocity relative to a frame at given times.
But SatCoord also include Attitude thanks to a class AttitudeRepresentation.
AttitudeRepresentation
AttitudeRepresentation derives from 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
from erwans3.Telescope_class import AttitudeRepresentation
Random
n_sat = 6 # Number of satellite
att = AttitudeRepresentation.make_random(n_sat)
print(att)
Same Orientation
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
SatCoord derives from SkyCoord
and includes an 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 init_from_folder()
Otherwise, you may generate random positions using the distribution function provided in utils.
Basic Usage
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