Source code for skplatform.satellite.satellitesunsync
from typing import Union
import numpy as np
from datetime import datetime, timedelta
import sktimeutils
from .satellitebase import SatelliteBase
from .satellitekepler import SatelliteKepler
from .satellitesgp4 import SatelliteSGP4
# ------------------------------------------------------------------------------
# class SatelliteKepler
# ------------------------------------------------------------------------------
[docs]
class SatelliteSunSync(SatelliteBase):
"""
Implements a sun-synchronous orbit. This model starts the chosen orbit propagator with
appropriate initial conditions given by the user. The orbit inclination is chosen by the code
so the orbit with the given period (or altitude) is sun-synchronous. The user can utilize
a Keplerian or SGP4 orbit propagator. The kepler propagator is useful for short, one orbit, studies but will not
actually precess the orbit. The SGP4 propagator is slower but will capture the sun-synchronous precession over
a period of days and months.
"""
[docs]
def __init__(self, utc: Union[np.datetime64, datetime, float, str], orbittype='sgp4', sgp4_bstar_drag=0.0, **kwargs):
"""
Parameters:
utc: datetime.datetime
The UTC time of the ali_elements. This is set as the time of the ascending node of the selected orbit.
period_from_seconds : float
Optional, specifies the orbital period in seconds. An alternative to specify the period is with the optional
parameter `period_from_altitude`. One, but only one, of the two optional methods must be used.
period_from_altitude : float
Optional, specifies the orbital period using the altitude of the satellite in meters. The altitude is nominal as we do not
account for oblateness of the Earth etc. The radius of the Earth is internally assumed to be 6378000.0 meters.
An alternative to specify the period is with the optional parameter `period_from_seconds`. One, but only one, of the
two optional methods must be used.
orbittype: str
(default='sgp4'). User can choose the orbit propagator. Currently accepted values are 'kepler' and 'sgp4'.
sgp4_bstar_drag : float
(default 0.0). Allows the user to add a drag term. This value is only used by the SGP4 predictor and must
be compatible with the SGP4 predictor.
localtime_of_ascending_node_hours: float
Specifies the nominal local time of the ascending node in hours (0-24). If set then its value
represents the "hour" at which you want the ascending node for example a floating point value of 18.25 will
set the node to 18:15 LT. The current implementation may not be exact but will be close.
longitude_of_ascending_node_degrees: float
Specifies the geographic longitude of the ascending node (-180 to 360)at time `platform_utc`. This is an alternative method
to using parameters `localtime_of_ascending_node_hours` and `right_ascension_ascending_node` to specify the right ascension of the ascending node.
One, but only one, of the 3 optional methods may be used, if neither option is used the RAAN is set to 0.0.
right_ascension_ascending_node: float
Specifies the Right Ascension of the ascending node in radians (0 to :math:`2\\pi`). This is an alternative method
to parameter `longitude_of_ascending_node_degrees` to specify the right ascension of the ascending node.
One, but only one, of the two optional methods must be used, if neither option is used the RAAN is set to 0.0.
argument_of_perigee: float
Default 0. The argument of perigree in radians (0 to :math:`2\\pi`).
eccentricity: float
Default 0. The eccentricity of the orbit (0 to 1)
orbitnumber: int
Default 0. The orbit number at the epoch given by `platform_utc`
"""
super().__init__()
ut = sktimeutils.ut_to_datetime(utc)
self.satellite = None
self.set_sun_sync_from_elements(ut, orbittype=orbittype, sgp4_bstar_drag=sgp4_bstar_drag, **kwargs)
# -----------------------------------------------------------------------------
# update_eci_position
# -----------------------------------------------------------------------------
[docs]
def update_eci_position(self, tnow: datetime):
"""
Updates the eciposition and ecivelocity of the satellite at the given instant in time. The user does not
usually call this function directly. It is usually called by the base class :class:`~.SatelliteBase`
Parameters:
tnow : datetime
Updates the ECI eci-position and ECI eci-velocity of the satellite to this time
"""
self.satellite.update_eci_position(tnow)
self._set_current_state(self.satellite.eciposition(), self.satellite.ecivelocity(), tnow)
# ------------------------------------------------------------------------------
# period
# ------------------------------------------------------------------------------
[docs]
def period(self) -> float:
"""
Return the period of the satellite. For low earth orbit spacecraft
this is accurate to about 0.1 seconds.
Returns:
datetime.timedelta
The period of the satellite
"""
return self.satellite.period()
# -----------------------------------------------------------------------------
# eccentricity
# -----------------------------------------------------------------------------
[docs]
def eccentricity(self) -> float:
return self.satellite.eccentricity()
# -----------------------------------------------------------------------------
# set_sun_sync_from_elements
# -----------------------------------------------------------------------------
[docs]
def set_sun_sync_from_elements(self,
utc: datetime,
orbittype: str = 'sgp4',
sgp4_bstar_drag: float = 0.0,
**kwargs):
"""
Defines the sun-synchronous orbit using Keplerian orbital ali_elements. The sun-synchronous orbit is always
kick-started using a Kepler based orbit and it can continue to use that kepler orbit to propagate the position
and velocity or it can use the SGP4 model. This function is called by the class instance constructor and the
user does not normally need to call this function directly.
Parameters:
utc : datetime.datetime
The universal time of the orbital ali_elements.
orbittype: str
Specifies the type of orbit predictor to be used to propagate the orbit. It can be either 'kepler' or 'sgp4'. Default is 'sgp4'
sgp4_bstar_drag: float
Optional argument that is only used if the `sgp4` propagator is selected. This value is used as the bstar drag
term in the SGP4 orbit predictor. The default value is 0.0 implying drag is ignored.
kwargs: extra key word arguments.
These keywords are from the keyword options in :meth:`.SatelliteKepler.from_elements`.
Note that parameter `localtime_of_ascending_node` will override, if set, the `longitude_of_ascending_node_degrees`
setting in the keywords options.
"""
kepler = SatelliteKepler(utc, inclination_is_sun_sync=True, **kwargs)
if orbittype.lower() == 'kepler':
self.satellite = kepler
elif orbittype.lower() == 'sgp4':
sgp4 = SatelliteSGP4()
sgp4.from_kepler_orbit(kepler, bstar=sgp4_bstar_drag)
self.satellite = sgp4
else:
raise Exception('the requested type of orbit predictor {} is not supported'.format(orbittype))