lamberthub.utils.elements#

Holds routines for converting between different orbital elements sets.

Note

Some of these functions were directly taken from the poliastro[1] library, see the references section for more information about this powerful software.

Copyright (c) 2012-2021 Juan Luis Cano Rodríguez and the poliastro development team.

References

[1] poliastro: poliastro/poliastro

Module Contents#

Functions#

rv_pqw(k, p, ecc, nu)

Returns r and v vectors in perifocal frame.

coe_rotation_matrix(inc, raan, argp)

Create a rotation matrix for coe transformation

coe2rv(k, p, ecc, inc, raan, argp, nu)

Converts from classical orbital to state vectors.

rv2coe(k, r, v[, tol])

Converts from vectors to classical orbital elements.

rotation_matrix(angle, axis)

lamberthub.utils.elements.rv_pqw(k, p, ecc, nu)#

Returns r and v vectors in perifocal frame.

Parameters:
  • k (float) – Standard gravitational parameter (km^3 / s^2).

  • p (float) – Semi-latus rectum or parameter (km).

  • ecc (float) – Eccentricity.

  • nu (float) – True anomaly (rad).

Returns:

  • r (ndarray) – Position. Dimension 3 vector

  • v (ndarray) – Velocity. Dimension 3 vector

Notes

These formulas can be checked at Curtis 3rd. Edition, page 110. Also the example proposed is 2.11 of Curtis 3rd Edition book.

\[ \begin{align}\begin{aligned}\begin{split}\vec{r} = \frac{h^2}{\mu}\frac{1}{1 + e\cos(\theta)}\begin{bmatrix} \cos(\theta)\\ \sin(\theta)\\ 0 \end{bmatrix} \\\\\\\end{split}\\\begin{split}\vec{v} = \frac{h^2}{\mu}\begin{bmatrix} -\sin(\theta)\\ e+\cos(\theta)\\ 0 \end{bmatrix}\end{split}\end{aligned}\end{align} \]
lamberthub.utils.elements.coe_rotation_matrix(inc, raan, argp)#

Create a rotation matrix for coe transformation

lamberthub.utils.elements.coe2rv(k, p, ecc, inc, raan, argp, nu)#

Converts from classical orbital to state vectors.

Classical orbital elements are converted into position and velocity vectors by rv_pqw algorithm. A rotation matrix is applied to position and velocity vectors to get them expressed in terms of an IJK basis.

Parameters:
  • k (float) – Standard gravitational parameter (km^3 / s^2).

  • p (float) – Semi-latus rectum or parameter (km).

  • ecc (float) – Eccentricity.

  • inc (float) – Inclination (rad).

  • omega (float) – Longitude of ascending node (rad).

  • argp (float) – Argument of perigee (rad).

  • nu (float) – True anomaly (rad).

Returns:

  • r_ijk (np.array) – Position vector in basis ijk.

  • v_ijk (np.array) – Velocity vector in basis ijk.

Notes

\[\begin{split}\begin{align} \vec{r}_{IJK} &= [ROT3(-\Omega)][ROT1(-i)][ROT3(-\omega)]\vec{r}_{PQW} = \left [ \frac{IJK}{PQW} \right ]\vec{r}_{PQW}\\ \vec{v}_{IJK} &= [ROT3(-\Omega)][ROT1(-i)][ROT3(-\omega)]\vec{v}_{PQW} = \left [ \frac{IJK}{PQW} \right ]\vec{v}_{PQW}\\ \end{align}\end{split}\]

Previous rotations (3-1-3) can be expressed in terms of a single rotation matrix:

\[\left [ \frac{IJK}{PQW} \right ]\]
\[\begin{split}\begin{bmatrix} \cos(\Omega)\cos(\omega) - \sin(\Omega)\sin(\omega)\cos(i) & -\cos(\Omega)\sin(\omega) - \sin(\Omega)\cos(\omega)\cos(i) & \sin(\Omega)\sin(i)\\ \sin(\Omega)\cos(\omega) + \cos(\Omega)\sin(\omega)\cos(i) & -\sin(\Omega)\sin(\omega) + \cos(\Omega)\cos(\omega)\cos(i) & -\cos(\Omega)\sin(i)\\ \sin(\omega)\sin(i) & \cos(\omega)\sin(i) & \cos(i) \end{bmatrix}\end{split}\]
lamberthub.utils.elements.rv2coe(k, r, v, tol=1e-08)#

Converts from vectors to classical orbital elements.

Parameters:
  • k (float) – Standard gravitational parameter (km^3 / s^2)

  • r (array) – Position vector (km)

  • v (array) – Velocity vector (km / s)

  • tol (float, optional) – Tolerance for eccentricity and inclination checks, default to 1e-8

Returns:

  • p (float) – Semi-latus rectum of parameter (km)

  • ecc (float) – Eccentricity

  • inc (float) – Inclination (rad)

  • raan (float) – Right ascension of the ascending nod (rad)

  • argp (float) – Argument of Perigee (rad)

  • nu (float) – True Anomaly (rad)

Notes

This example is a real exercise from Orbital Mechanics for Engineering students by Howard D.Curtis. This exercise is 4.3 of 3rd. Edition, page 200.

  1. First the angular momentum is computed:

\[\vec{h} = \vec{r} \times \vec{v}\]
  1. With it the eccentricity can be solved:

\[\begin{split}\begin{align} \vec{e} &= \frac{1}{\mu}\left [ \left ( v^{2} - \frac{\mu}{r}\right ) \vec{r} - (\vec{r} \cdot \vec{v})\vec{v} \right ] \\ e &= \sqrt{\vec{e}\cdot\vec{e}} \\ \end{align}\end{split}\]
  1. The node vector line is solved:

\[\begin{split}\begin{align} \vec{N} &= \vec{k} \times \vec{h} \\ N &= \sqrt{\vec{N}\cdot\vec{N}} \end{align}\end{split}\]
  1. The right ascension node is computed:

\[\begin{split}\Omega = \left\{ \begin{array}{lcc} cos^{-1}{\left ( \frac{N_{x}}{N} \right )} & if & N_{y} \geq 0 \\ \\ 360^{o} -cos^{-1}{\left ( \frac{N_{x}}{N} \right )} & if & N_{y} < 0 \\ \end{array} \right.\end{split}\]
  1. The argument of perigee:

\[\begin{split}\omega = \left\{ \begin{array}{lcc} cos^{-1}{\left ( \frac{\vec{N}\vec{e}}{Ne} \right )} & if & e_{z} \geq 0 \\ \\ 360^{o} -cos^{-1}{\left ( \frac{\vec{N}\vec{e}}{Ne} \right )} & if & e_{z} < 0 \\ \end{array} \right.\end{split}\]
  1. And finally the true anomaly:

\[\begin{split}\nu = \left\{ \begin{array}{lcc} cos^{-1}{\left ( \frac{\vec{e}\vec{r}}{er} \right )} & if & v_{r} \geq 0 \\ \\ 360^{o} -cos^{-1}{\left ( \frac{\vec{e}\vec{r}}{er} \right )} & if & v_{r} < 0 \\ \end{array} \right.\end{split}\]
lamberthub.utils.elements.rotation_matrix(angle, axis)#