Search code examples
pythonvectorcartesian-coordinatesorbital-mechanics

Python OrbitalPy Traceback error Cartesian State Vectors Position and Velocity from Keplerian Elements


I am trying to get the cartesian position and velocity vectors for each propagation step in my orbit. I am using OrbitalPy http://pythonhosted.org/OrbitalPy/ to generate the orbit with classical Keplerian elements.

According to the documentation I should be able to get the state vectors (both position and velocity) from class orbital.utilities.StateVector , but I get a Type Error: new() takes exactly 3 arguments (2 given)

Here is the code:

from scipy.constants import kilo

import orbital
from orbital import earth, KeplerianElements, Maneuver, plot, utilities
from orbital.utilities import Position, Velocity

import matplotlib.pyplot as plt
import numpy as np

#Orbit Setup
orbitPineapple = KeplerianElements.with_period(96 * 60, body=earth, i=(np.deg2rad(51.6)))
plot(orbitPineapple)
plt.show()
orbitPineapple

Out[23]: KeplerianElements(a=6945033.343911132,
                  e=0,
                  i=0.90058989402907408,
                  raan=0,
                  arg_pe=0,
                  M0=0.0,
                  body=orbital.bodies.earth,
                  ref_epoch=<Time object: scale='utc' format='jyear_str' value=J2000.000>)

prop1 = orbital.maneuver.PropagateAnomalyTo(M=1.00)
orbitX = orbitPineapple.apply_maneuver(prop1)
plot(orbitPineapple, title='Go Pineapple!')
plt.show()

orbital.utilities.StateVector(orbitPineapple)

TypeError                                 Traceback (most recent call last)
<ipython-input-53-91fb5303082b> in <module>()
      4 #print(orbital.utilities.StateVector.velocity(orbitPineapple))
      5 
----> 6 orbital.utilities.StateVector(orbitPineapple)
      7 #orbital.utilities.StateVector.position(orbitPineapple())
      8 
    TypeError: __new__() takes exactly 3 arguments (2 given)

Solution

  • It turns out that the issue is with OrbitalPy. One can only get state vectors when using the original orbit name.

    In this case orbitPineapple.r would return position (x,y,z) and orbitPineapple.v would return (Vx,Vy,Vy).

    The position and velocity vectors are update after each maneuver is applied just use the exact same line with the original orbit name print(orbitPineapple.r, orbitPineapple.v).

    Additionally, a super useful feature that would have saved me hours, is you can just type a variable or function and name. and hit the tab key and all the options are displayed.