Antenna Look Angles
Satellite look angle computations
References:
[1] https://www.ngs.noaa.gov/CORS/Articles/SolerEisemannJSE.pdf.
[3] Maral, Gerard., Sun, Zhili., Bousquet, Michel. Satellite Communications Systems: Systems, Techniques and Technology. 3rd ed.
- linkbudget.pointing.get_default_tle_dataset_dir()[source]
Get the default directory for saving TLE datasets
- linkbudget.pointing.get_sat_pos_by_tle(name, group=None, obs_time=None, save_dir=None, no_save=False)[source]
Get satellite position from Two-Line Element (TLE) predictions
First, searches for the satellite on CelesTrak’s TLE database. Then, computes the expected satellite position on the given observation time using the implementation from the Skyfield package.
The TLE dataset is queried using the format described in https://celestrak.org/NORAD/documentation/gp-data-formats.php. More specifically, it is either requested with:
https://celestrak.org/NORAD/elements/gp.php?NAME=VALUE&FORMAT=tle
or
https://celestrak.org/NORAD/elements/gp.php?GROUP=VALUE&FORMAT=tle
The former is used when the satellite is specified by name only (group set to None). The second format is used when the specific group on CelesTrak’s database is also informed. See the groups at https://celestrak.org/NORAD/elements/. For example, the ‘active’ group holds a long list of active satellites, whereas the ‘geo’ group focuses on active geosynchronous satellites, and so on.
This function downloads the TLE dataset before processing, and the downloads are saved as txt files at ~/.link-budget/tle/ by default. When the dataset is already available locally (downloaded previously), this function does not need to download it again. This behavior can be customized using the save_dir and no_save arguments.
- Parameters:
name (str) – Satellite name on the TLE database.
group (str, optional) – Group to which the satellite belongs on the CelesTrak database. Defaults to None, in which case the satellite is searched by name over the entire database.
obs_time (datetime, optional) – Observation time. Defaults to None, in which case the current time is used.
save_dir (str, optional) – Directory on which the downloaded TLE dataset should be saved. Defaults to None, in which case the ~/.link-budget/tle/ directory is used.
no_save (bool, optional) – Whether to save the downloaded TLE dataset permanently on the save directory (save_dir) to speed up future queries.
- Returns:
Satellite longitude (degrees), latitude (degrees), and altitude (meters).
- Return type:
tuple
- linkbudget.pointing.look_angles(sat_long, sat_lat, sat_alt, rx_long, rx_lat, rx_height=0, ellipsoid='WGS84')[source]
Calculate look angles (elevation, azimuth) and slant range
Computes the angles relative to a reflector, either active (satellite) or passive (radar object). Compute using the rigorous ellipsoidal approach discussed in [1].
- Parameters:
sat_long – Subsatellite point’s longitude in degrees.
sat_lat – : Subsatellite point’s geodetic latitude in degrees.
sat_alt – Satellite/reflector altitude in meters above the reference ellipsoid.
rx_long – Longitude of the receiver station in degrees.
rx_lat – Geodetic latitude of the receiver station in degrees.
rx_height – Receiver station’s orthometric height (height above sea-level) in meters. Defaults to zero.
ellipsoid – Reference ellipsoid for the computation, GRS80 or WGS84. Defaults to WGS84.
Note
Positive longitudes are east of the prime meridian and negative longitudes are west of the prime meridian. Positive latitudes are north of the equator and negative latitudes are south of the equator.
- Returns:
Tuple with elevation (degrees), azimuth (degrees) and slant range (m).
- linkbudget.pointing.polarization_angle(sat_long, sat_lat, rx_long, rx_lat)[source]
Compute the polarization angle (skew) at a given location
A linearly polarized satellite transmission has the electric field oriented at a constant angle relative to a reference plane. For a satellite antenna, the reference plane is the equatorial plane. If the polarization is horizontal, the electric field is parallel to the equatorial plane. Otherwise, when the linear polarization is vertical, it is perpendicular to the equatorial plane.
The earth station antenna feed must have its polarization aligned with the polarization plane of the received wave. However, the local vertical (normal) plane does not match the equatorial plane due to the curvature of the earth. Hence, there is an angle difference between the polarization of the signal transmitted by the satellite and the apparent polarization of the received signal, which is known as the polarization angle or polarization skew (sometimes also referred to as “polarity”, “polarity skew”, “LNB skew”, or just “skew”).
When pointing an linearly-polarized earth station antenna, this angle has to be taken into account. In contrast, if pointing a circularly-polarized antenna, there is no need to compensate for the polarization skew.
For geostationary satellites, [3] presents the skew formula that follows:
\[\psi = \tan^{-1} \left( \frac{\sin(L)}{\tan(l)} \right)\]where \(L\) is the relative longitude (difference between the earth station’s longitude and the satellite longitude) and \(l\) is the earth station’s latitude.
As indicated by the equation, the skew is 0 when the earth station and the satellite are at the same longitude (when the relative longitude is zero).
Note that, for a positive skew value, the LNB must be rotated clockwise, whereas, for a negative polarization angle, the LNB must be rotated counterclockwise. Furthermore, note that the clockwise and counterclockwise directions are relative to the front face (the feed horn) of the LNB. In other words, for a positive skew value, someone standing behind the dish and facing the satellite in the sky would rotate the LNB clockwise.
- Parameters:
sat_long (float) – Subsatellite point’s longitude in degrees.
sat_lat (float) – Subsatellite point’s geodetic latitude in degrees.
rx_long (float) – Earth station’s longitude in degrees.
rx_lat (float) – Earth station’s geodetic latitude in degrees.
- Returns:
Polarization angle in degrees.
- Return type:
float