0

我对轨道力学领域很陌生,目前正在为以下问题苦苦挣扎,这应该很容易用 Skyfield 解决,但我对所有不同的坐标系和它们之间的转换有点不知所措。

Topos在地球上有一个位置和Topos一个 LEO 卫星的位置。我正在考虑他们之间的视线。我想确定沿着这条路径的位置的纬度和经度,它与大气的特定层相交。

一个例子是中间层和一个基于纬度和经度给出的大约 100 公里处的属性的现有数据集。交叉点将使我能够更好地理解这些属性对与卫星通信的相互作用。

我尝试直接使用 Skyfield 进行此操作,但最终得到的Apparent对象是我无法将其转换回地球上的纬度、经度。首先,我用三角法确定了从地球到达到 100 公里高度的点的距离。

然后,我在地球上的位置,并使用不变的仰角,方位角来保持路径的方向,最后加上计算的距离到达这个位置。我认为我需要Geocentric使用一个对象subpoint()才能获得该位置所需的纬度、经度。

这是我到目前为止所拥有的:

from skyfield.api import load, Distance
from skyfield.toposlib import Topos
import numpy as np

ts = load.timescale()

earth_position = Topos('52.230039 N', '4.842402 E', elevation_m=10)
space_position = Topos('51.526200 N', '5.347795 E', elevation_m=625 * 1000)

difference = (space_position - earth_position).at(ts.now()).altaz()

distance_to_height = 100 / np.sin(difference[0].radians)

position = earth_position.at(ts.now()).from_altaz(alt_degrees=difference[0].degrees, az_degrees=difference[1].degrees, distance=Distance(km=distance_to_height))

我已经多次阅读文档,偶然发现frame_latlon(frame)了通用 ICRF 对象,但不知道如何进一步进行。

用纬度和经度完全三角学尝试也没有产生预期的结果。

不幸的是,我真的没有任何经过验证的结果可以用来更容易地解决这个问题。再次用三角函数想象它,很明显,卫星位置高度的增加会使交叉点的纬度、经度更接近地球上的位置。降低高度将使这个交叉点更靠近卫星。

4

1 回答 1

1

这是一个有趣的问题,Skyfield 的 API 没有提供简单的方法来询问;如果您可以通过了解视线与特定高度的交点来概述将要解决的更大问题,那么可以编写解决该问题的例程以供将来解决相同问题的用户使用。

同时:

  1. 为了让你的脚本运行,我必须Distanceapi.
  2. 该名称dis无法识别,因此我将其替换为distance_to_height,希望这是预期的名称。
  3. Callingts.now()会在每次通话中为您提供稍微不同的日期和时间。虽然脚本运行得如此之快以至于它可能无关紧要,但为了清楚起见,我已经转向now()在脚本开头只调用一次,这也比重复调用它稍微快一点。(实际上在这种情况下它要快得多,因为旋转矩阵只计算一次,而不必为每个单独的时间对象重新计算一次,但这是一个不容易看到的隐藏细节。)
  4. 我怀疑你的几何形状有问题:100 / sin()我认为,只有在地球是平的情况下,这种机动才能奏效?但也许您总是在处理近乎头顶的卫星,因此错误是可控的?(或者我可能错误地想象几何;如果数学实际上是正确的,请随时提供图表。)
  5. 为了便于阅读,我将给出altaz()名称而不是数字的组成部分。

有了这些调整,我认为答案是您需要Geocentric 通过将观察者的位置和您在观察者和沿视线的 100 公里点之间创建的相对矢量相加来手动构建一个位置. 必须采取像这样的手动步骤表明 Skyfield 可以改进的可能领域。下面是它在代码中的样子:

from skyfield.api import load, Distance
from skyfield.positionlib import Geocentric
from skyfield.toposlib import Topos
import numpy as np

ts = load.timescale()
t = ts.now()

earth_position = Topos('52.230039 N', '4.842402 E', elevation_m=10)
space_position = Topos('51.526200 N', '5.347795 E', elevation_m=625 * 1000)

alt, az, distance = (space_position - earth_position).at(t).altaz()

distance_to_height = 100 / np.sin(alt.radians)

e = earth_position.at(t)
p = e.from_altaz(alt_degrees=alt.degrees, az_degrees=az.degrees, distance=Distance(km=distance_to_height))

g = Geocentric(e.position.au + p.position.au, t=t)
s = g.subpoint()
print(s)
print(s.elevation.km, '<- warning: 100/sin() did not produce exactly 100')

我看到的结果是:

Topos 52deg 06' 30.0" N 04deg 55' 51.7" E
100.02752954478532 <- warning: 100/sin() did not produce exactly 100

对于未来,我在 SkyfieldTODO.rst文件中添加了一些想法,这些想法可能会一起朝着解锁一种更惯用的方式来执行这种计算的方向发展——尽管我怀疑除了这些之外还需要更多的步骤:

https://github.com/skyfielders/python-skyfield/commit/ba1172a0ccfef84473436d9d7b8a7d7011344cbd

于 2020-07-01T16:31:19.267 回答