Orbital maneuvers.

Module Contents



Class to represent a Maneuver.

class poliastro.maneuver.Maneuver(*args)

Class to represent a Maneuver.

Each Maneuver consists on a list of impulses \(\Delta v_i\) (changes in velocity) each one applied at a certain instant \(t_i\). You can access them directly indexing the Maneuver object itself.

>>> man = Maneuver((0 * u.s, [1, 0, 0] * u.km / u.s),
... (10 * u.s, [1, 0, 0] * u.km / u.s))
>>> man[0]
(<Quantity 0. s>, <Quantity [1., 0., 0.] km / s>)
>>> man.impulses[1]
(<Quantity 10. s>, <Quantity [1., 0., 0.] km / s>)

Return repr(self).

_initialize(self, dts, dvs)
__getitem__(self, key)
classmethod impulse(cls, dv)

Single impulse at current time.


dv (np.array) – Velocity components of the impulse.

classmethod hohmann(cls, orbit_i, r_f)

Compute a Hohmann transfer between two circular orbits.

By defining the relationship between orbit radius:

\[a_{trans} = \frac{r_{i} + r_{f}}{2}\]

The Hohmann maneuver velocities can be expressed as:

\[\begin{split}\begin{align} \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{align}\end{split}\]

The time that takes to complete the maneuver can be computed as:

\[\tau_{trans} = \pi \sqrt{\frac{(a_{trans})^{3}}{\mu}}\]
classmethod bielliptic(cls, orbit_i, r_b, r_f)

Compute a bielliptic transfer between two circular orbits.

The bielliptic maneuver employs two Hohmann transfers, therefore two intermediate orbits are established. We define the different radius relationships as follows:

\[\begin{split}\begin{align} a_{trans1} &= \frac{r_{i} + r_{b}}{2}\\ a_{trans2} &= \frac{r_{b} + r_{f}}{2}\\ \end{align}\end{split}\]

The increments in the velocity are:

\[\begin{split}\begin{align} \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{align}\end{split}\]

The time of flight for this maneuver is the addition of the time needed for both transition orbits, following the same formula as Hohmann:

\[\begin{split}\begin{align} \tau_{trans1} &= \pi \sqrt{\frac{a_{trans1}^{3}}{\mu}}\\ \tau_{trans2} &= \pi \sqrt{\frac{a_{trans2}^{3}}{\mu}}\\ \end{align}\end{split}\]
  • orbit_i (poliastro.twobody.orbit.Orbit) – Initial orbit

  • r_b (astropy.unit.Quantity) – Altitude of the intermediate orbit

  • r_f (astropy.unit.Quantity) – Final altitude of the orbit

classmethod lambert(cls, orbit_i, orbit_f, method=lambert_izzo, short=True, **kwargs)

Computes Lambert maneuver between two different points.

  • orbit_i (Orbit) – Initial orbit

  • orbit_f (Orbit) – Final orbit

  • method (function) – Method for solving Lambert’s problem

  • short (keyword, boolean) – Selects between short and long solution


Returns total time of the maneuver.


Returns total cost of the maneuver.

classmethod correct_pericenter(cls, orbit, max_delta_r)

Returns a Maneuver with the time before burning and the velocity vector in direction of the burn.

  • orbit (Orbit) – Position and velocity of a body with respect to an attractor at a given time (epoch).

  • max_delta_r (Quantity) – Maximum satellite’s geocentric distance


maneuver – Maneuver with the maximum time before we do an orbit-adjustment burn to restore the perigee to its nominal value and the velocity vector of the spacecraft to achieve the desired correction.

Return type




  • If the correction maneuver is not implemented for the attractor.

  • if the eccentricity is greater than 0.001.


The algorithm was obtained from “Fundamentals of Astrodynamics and Applications, 4th ed (2013)” by David A. Vallado, 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 \(|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.