# lamberthub.utils.elements

Holds routines for converting between different orbital elements sets.

Note

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

References

[1] poliastro: https://github.com/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=1e-08) 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 rigth 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)