我试图在某个空间物体经过我的位置时收到警报,因此我的计划是使用 skyfield 通过 find_events 函数生成通过列表(不关心是否可见,没有海拔限制)并存储通过列表时间与卫星信息。所以我有完整的 TLE 跟踪对象列表,我设置了 skyfield,它创建的列表很好......但我注意到,经过大约两个小时的相当一致的传递后,它变得非常稀疏。每隔几分钟,然后就更稀疏了。
所以我的问题是 - 为什么要这样做?有更好的方法吗?
欣赏任何人可能拥有的任何见解。愿意完全改变我的方法,但也只是对为什么两个小时后通行证变得如此稀疏感到困惑。我当前的解决方案只是每两个小时重新运行一次代码,但其计算量相当大。
相关代码如下:
def next_pass_details(tle_line1, tle_line2, observer_location):
ts = load.timescale()
satellite = EarthSatellite(tle_line1, tle_line2)
observer = Topos(latitude_degrees=observer_location[0], longitude_degrees=observer_location[1])
start_time = ts.now()
end_time = start_time + 1.0 # Look 24 hours ahead
culmination_time = None
altitude_km = -1
times, events = satellite.find_events(observer, start_time, end_time, altitude_degrees=0.0)
for time, event in zip(times, events):
if event == 1: # Culmination
culmination_time = time
geocentric = satellite.at(time)
subpoint = geocentric.subpoint()
altitude_km = subpoint.elevation.km
observer_location = (observer.latitude.degrees, observer.longitude.degrees)
subsatellite_point = (subpoint.latitude.degrees, subpoint.longitude.degrees)
distance_km = geodesic(observer_location, subsatellite_point).km
if distance_km > radius: #exclude satellites too far away
return None
print(distance_km)
return {
'culmination_time': culmination_time.utc_strftime('%Y-%m-%d %H:%M:%S'),
'altitude_km': altitude_km,
'distance_km': distance_km
}
return None
谢谢
愚蠢,但错误是我使用 for 循环来返回 pass 事件,因此它只返回每个 TLE 的一个事件并跳过其余事件。