Python OrbitalPy Ошибка трассировки Положение декартовых векторов состояния и скорость из кеплеровских элементов

Я пытаюсь получить декартовы векторы положения и скорости для каждого шага распространения на моей орбите. Я использую OrbitalPy http://pythonhosted.org/OrbitalPy/ для генерации орбиты с классическими кеплеровскими элементами.

Согласно документации, я должен быть в состоянии получить векторы состояния (как положение, так и скорость) от class orbital.utilities.StateVector, но я получаю ошибку типа: new() принимает ровно 3 аргумента (2 дано)

Вот код:

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)

2 ответа

Решение

Оказывается, проблема в OrbitalPy. Можно получить векторы состояния только при использовании оригинального названия орбиты.

В этом случае orbitPineapple.r вернет позицию (x,y,z) и orbitPineapple.v вернется (Vx,Vy,Vy).

Векторы положения и скорости обновляются после каждого маневра, просто используйте одну и ту же линию с исходным названием орбиты. print(orbitPineapple.r, orbitPineapple.v),

Кроме того, супер полезная функция, которая бы сэкономила мне часы, вы можете просто ввести переменную или функцию и name. и нажмите клавишу Tab, и все параметры отображаются.

Я не использую этот пакет, но ошибка достаточно проста для диагностики. Из документов вы можете увидеть, что orbital.utilities.StateVector принимает два аргумента; один для "положения" и один для "скорости". Когда вы делаете orbital.utilities.StateVector(orbitPineapple) вы предоставляете только один аргумент (orbitPineapple) значение которого будет считаться представляющим "положение". Вы должны также предоставить скорость.

Что касается ошибки ...takes exactly 3 arguments (2 given), python переоценивает количество обязательных / переданных аргументов для методов класса, потому что он принимает self параметр во внимание при подсчете их. Например:

class Testing(object):


    def __init__(self):
        self.a = 2

    def do_something(self, b):
        self.a += b

obj = Testing()
obj.do_something(2, 3) # Clearly passing only 2 arguments

дает:

TypeError: do_something() takes exactly 2 arguments (3 given)

Таким образом, вы можете прочитать ошибку как "принимает 2 аргумента, но вы дали только 1"

Другие вопросы по тегам