Python OrbitalPy Traceback错误笛卡尔状态向量来自开普勒元素的位置和速度

时间:2017-09-21 17:41:51

标签: python vector cartesian-coordinates orbital-mechanics

我试图在我的轨道上获得每个传播步骤的笛卡尔位置和速度矢量。我正在使用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 个答案:

答案 0 :(得分:2)

我不使用此软件包,但错误很简单,无法诊断。从the docs您可以看到orbital.utilities.StateVector有两个参数;一个用于&#34;位置&#34;和#34;速度&#34;。当你执行orbital.utilities.StateVector(orbitPineapple)时,你只提供一个参数(orbitPineapple),其值将被视为代表&#34; position&#34;。你也需要提供速度。

对于错误...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)

所以你可以阅读错误,因为&#34;需要2个参数,但你只给了1&#34;

答案 1 :(得分:0)

事实证明,问题出在OrbitalPy上。在使用原始轨道名称时,只能获得状态向量。

在这种情况下,orbitPineapple.r将返回位置(x,y,z),orbitPineapple.v将返回(Vx,Vy,Vy)。

在应用每个机动后,位置和速度矢量会更新,只需使用与原始轨道名称print(orbitPineapple.r, orbitPineapple.v)完全相同的线。

此外,一个可以节省时间的超级实用功能是,您只需输入变量或函数name.并点击 标签键 并显示所有选项。