我很难弄清楚如何计算卫星何时穿过特定经度。如果能够提供时间段和 TLE 并能够返回卫星在指定时间段内穿过给定经度的所有时间,那就太好了。pyephem 支持这样的东西吗?
2 回答
用户可能会询问很多可能的情况——当卫星穿过特定经度时;当它到达特定纬度时;当它达到一定高度或下降到最低高度时;当它的速度最大或最小时——PyEphem 不会尝试为所有这些提供内置函数。相反,它提供了一个newton()
功能,让您可以找到您想要在卫星属性和您想要搜索的该属性的预定值之间进行的任何比较的过零。
请注意,SciPy Python 库包含几个非常仔细的搜索函数,它们比 PyEphem 的newton()
函数要复杂得多,以防您正在处理一个行为特别糟糕的函数:
http://docs.scipy.org/doc/scipy/reference/optimize.html
以下是您如何搜索卫星(在本例中为国际空间站)通过特定经度的方法,以展示一般技术。这不是最快的方法——特别是每分钟的搜索,如果我们非常小心,可以加快速度——但它被写得非常笼统和非常安全,以防除了经度之外还有其他值你也想搜索。我试图添加文档和注释来解释发生了什么,以及为什么我使用znorm
而不是返回简单的差异。让我知道这个脚本是否适合你,并清楚地解释它的方法!
import ephem
line0 = 'ISS (ZARYA) '
line1 = '1 25544U 98067A 13110.27262069 .00008419 00000-0 14271-3 0 6447'
line2 = '2 25544 51.6474 35.7007 0010356 160.4171 304.1803 15.52381363825715'
sat = ephem.readtle(line0, line1, line2)
target_long = ephem.degrees('-83.8889')
def longitude_difference(t):
'''Return how far the satellite is from the target longitude.
Note carefully that this function does not simply return the
difference of the two longitudes, since that would produce a
terrible jagged discontinuity from 2pi to 0 when the satellite
crosses from -180 to 180 degrees longitude, which could happen to be
a point close to the target longitude. So after computing the
difference in the two angles we run degrees.znorm on it, so that the
result is smooth around the point of zero difference, and the
discontinuity sits as far away from the target position as possible.
'''
sat.compute(t)
return ephem.degrees(sat.sublong - target_long).znorm
t = ephem.date('2013/4/20')
# How did I know to make jumps by minute here? I experimented: a
# `print` statement in the loop showing the difference showed huge jumps
# when looping by a day or hour at a time, but minute-by-minute results
# were small enough steps to bring the satellite gradually closer to the
# target longitude at a rate slow enough that we could stop near it.
#
# The direction that the ISS travels makes the longitude difference
# increase with time; `print` statements at one-minute increments show a
# series like this:
#
# -25:16:40.9
# -19:47:17.3
# -14:03:34.0
# -8:09:21.0
# -2:09:27.0
# 3:50:44.9
# 9:45:50.0
# 15:30:54.7
#
# So the first `while` loop detects if we are in the rising, positive
# region of this negative-positive pattern and skips the positive
# region, since if the difference is positive then the ISS has already
# passed the target longitude and is on its way around the rest of
# the planet.
d = longitude_difference(t)
while d > 0:
t += ephem.minute
sat.compute(t)
d = longitude_difference(t)
# We now know that we are on the negative-valued portion of the cycle,
# and that the ISS is closing in on our longitude. So we keep going
# only as long as the difference is negative, since once it jumps to
# positive the ISS has passed the target longitude, as in the sample
# data series above when the difference goes from -2:09:27.0 to
# 3:50:44.9.
while d < 0:
t += ephem.minute
sat.compute(t)
d = longitude_difference(t)
# We are now sitting at a point in time when the ISS has just passed the
# target longitude. The znorm of the longitude difference ought to be a
# gently sloping zero-crossing curve in this region, so it should be
# safe to set Newton's method to work on it!
tn = ephem.newton(longitude_difference, t - ephem.minute, t)
# This should be the answer! So we print it, and also double-check
# ourselves by printing the longitude to see how closely it matches.
print 'When did ISS cross this longitude?', target_long
print 'At this specific date and time:', ephem.date(tn)
sat.compute(tn)
print 'To double-check, at that time, sublong =', sat.sublong
我在运行这个脚本时得到的输出表明它确实找到了国际空间站到达目标经度的时刻(在合理的公差范围内):
When did ISS cross this longitude? -83:53:20.0
At this specific date and time: 2013/4/20 00:18:21
To double-check, at that time, sublong = -83:53:20.1
程序计算经过经度的时间与实际时间之间存在时间差。我已经用美国国家航空航天局的 LIS 系统(它在国际空间站内)检查了它以找到闪电。而且我发现在欧洲的一些轨道上,程序计算通行证的时间,比实际时间提前了 30 秒。而在哥伦比亚的某些轨道上,提前时间约为 3 分钟(可能是因为哥伦比亚 1 度经度的公里数大于欧洲 1 度经度的公里数)。但是这个问题只发生在 2 个特定的轨道上!越过法国并在西西里岛下山的那艘。还有一个越过美国,在古巴落下。为什么这可能?在我的小齿轮中,我认为 ehem 中可能有一些错误。牛顿算法或者可能使用 TLE,通常它会读取在晚上 00:00:00 创建的一个,当它改变一天时(而不是实际的,因为 ISS 每天创建 3-4 个 TLE)或者可能使用 sat .sublong 函数,用于计算卫星的错误最低点。有没有人对这个问题有想法或解释?为什么会发生?PS:我需要检查一下,因为我需要知道国际空间站何时穿过一个区域(用于检测该区域内的闪电)。如果程序在某些轨道上计算的时间比实际时间提前,那么 sat.sublong 函数会计算它在该区域之外(它计算它尚未到达该区域)但程序显示它在该区域内区域。因此,在某些情况下,实际时间与程序计算的时间不匹配。