boinor.core.maneuver ==================== .. py:module:: boinor.core.maneuver .. autoapi-nested-parse:: Low level maneuver implementations. Functions --------- .. autoapisummary:: boinor.core.maneuver.hohmann boinor.core.maneuver.bielliptic boinor.core.maneuver.correct_pericenter Module Contents --------------- .. py:function:: hohmann(k, rv, r_f) Calculate the Hohmann maneuver velocities and the duration of the maneuver. By defining the relationship between orbit radius: .. math:: a_{trans} = \frac{r_{i} + r_{f}}{2} The Hohmann maneuver velocities can be expressed as: .. math:: \begin{aligned} \Delta v_{a} &= \sqrt{\frac{2\mu}{r_{i}} - \frac{\mu}{a_{trans}}} - v_{i}\\ \Delta v_{b} &= \sqrt{\frac{\mu}{r_{f}}} - \sqrt{\frac{2\mu}{r_{f}} - \frac{\mu}{a_{trans}}} \end{aligned} The time that takes to complete the maneuver can be computed as: .. math:: \tau_{trans} = \pi \sqrt{\frac{(a_{trans})^{3}}{\mu}} :param k: Standard Gravitational parameter :type k: float :param rv: Position and velocity vectors :type rv: numpy.ndarray, numpy.ndarray :param r_f: Final orbital radius :type r_f: float .. py:function:: bielliptic(k, r_b, r_f, rv) Calculate the increments in the velocities and the time of flight of the maneuver. The bielliptic maneuver employs two Hohmann transfers, therefore two intermediate orbits are established. We define the different radius relationships as follows: .. math:: \begin{aligned} a_{trans1} &= \frac{r_{i} + r_{b}}{2}\\ a_{trans2} &= \frac{r_{b} + r_{f}}{2}\\ \end{aligned} The increments in the velocity are: .. math:: \begin{aligned} \Delta v_{a} &= \sqrt{\frac{2\mu}{r_{i}} - \frac{\mu}{a_{trans1}}} - v_{i}\\ \Delta v_{b} &= \sqrt{\frac{2\mu}{r_{b}} - \frac{\mu}{a_{trans2}}} - \sqrt{\frac{2\mu}{r_{b}} - \frac{\mu}{a_trans{1}}}\\ \Delta v_{c} &= \sqrt{\frac{\mu}{r_{f}}} - \sqrt{\frac{2\mu}{r_{f}} - \frac{\mu}{a_{trans2}}}\\ \end{aligned} The time of flight for this maneuver is the addition of the time needed for both transition orbits, following the same formula as Hohmann: .. math:: \begin{aligned} \tau_{trans1} &= \pi \sqrt{\frac{a_{trans1}^{3}}{\mu}}\\ \tau_{trans2} &= \pi \sqrt{\frac{a_{trans2}^{3}}{\mu}}\\ \end{aligned} :param k: Standard Gravitational parameter :type k: float :param r_b: Altitude of the intermediate orbit :type r_b: float :param r_f: Final orbital radius :type r_f: float :param rv: Position and velocity vectors :type rv: numpy.ndarray, numpy.ndarray .. py:function:: correct_pericenter(k, R, J2, max_delta_r, v, a, inc, ecc) Calculates the time before burning and the velocity vector in direction of the burn. :param k: Standard Gravitational parameter :type k: float :param R: Radius of the attractor :type R: float :param J2: Oblateness factor :type J2: float :param max_delta_r: Maximum satellite’s geocentric distance :type max_delta_r: float :param v: Velocity vector :type v: numpy.ndarray :param a: Semi-major axis :type a: float :param inc: Inclination :type inc: float :param ecc: Eccentricity :type ecc: float .. rubric:: Notes The algorithm was obtained from :cite:t:`Vallado2013`, page 885. Given a ``max_delta_r``, we determine the maximum perigee drift before we do an orbit-adjustment burn to restore the perigee to its nominal value. We estimate the time until this burn using the allowable drift delta_w and the drift rate :math:`|dw|`. For positive ``delta_v``, the change in the eccentricity is positive for perigee burns and negative for apogee burns. The opposite holds for a ``delta_v`` applied against the velocity vector, which decreases the satellite’s velocity. Perigee drift are mainly due to the zonal harmonics, which cause variations in the altitude by changing the argument of perigee. Please note that ``ecc`` ≈ 0.001, so the error incurred by assuming a small eccentricity is on the order of 0.1%. This is smaller than typical variations in thruster performance between burns.