6

衛星が特定の経度をいつ横切るかを計算する方法を理解するのに苦労しています。期間と TLE を提供し、指定された期間中に衛星が特定の経度を横切るすべての時刻を返すことができると便利です。pyephem はこのようなものをサポートしていますか?

4

2 に答える 2

6

ユーザーが質問する可能性のある状況は非常に多くあります。衛星が特定の経度を横切るとき。特定の緯度に達したとき。一定の高さに達したとき、または最低高度まで下降したとき。その速度が最大または最小のとき — PyEphem はそれらすべてに組み込み関数を提供しようとはしません。代わりにnewton()、サテライト属性と、検索するその属性の事前定義された値との間で行う比較のゼロクロッシングを見つけることができる関数を提供します。

newton()SciPy Python ライブラリには、特に動作の悪い関数を扱っている場合に備えて、PyEphem の関数よりもはるかに洗練された非常に慎重な検索関数がいくつか含まれていることに注意してください。

http://docs.scipy.org/doc/scipy/reference/optimize.html

一般的な手法を示すために、衛星 (この例では ISS) が特定の経度を通過する時期を検索する方法を次に示します。これは可能な限り最速のアプローチではありません — 特に分ごとの検索は、非常に注意すれば高速化できます — しかし、経度以外の値が存在する場合に備えて、非常に一般的で非常に安全であるように書かれています。あなたも検索したい。何が起こっているのか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

このスクリプトを実行したときに得られる出力は、ISS が目標の経度に到達する瞬間を (妥当な許容範囲内で) 実際に見つけたことを示しています。

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
于 2013-04-20T14:01:07.687 に答える