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#
|
Returns r and v vectors in perifocal frame. |
|
Create a rotation matrix for coe transformation |
|
Converts from classical orbital to state vectors. |
|
Converts from vectors to classical orbital elements. |
|
- 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.
First the angular momentum is computed:
\[\vec{h} = \vec{r} \times \vec{v}\]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}\]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}\]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}\]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}\]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)#