我试图在某些空间物体经过我的位置时收到警报,因此我的计划是使用 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
谢谢
你绝对是对的,Skyfield 的
find_events()
的行为很奇怪!问题不在于它在两个小时后发现的事件减少了,而在于它根本就不应该在最初的几个小时内返回
这么多
事件。
find_events()
应该只在卫星从你的地平线下穿过你的头顶时返回一次事件——“顶点”。但你的图表显示,在最初的几个小时内,对于你正在跟踪的许多卫星来说,它每分钟都会发现多个事件。这是不正确的,它解释了你为什么看到最初的传递次数激增,然后又减少——该函数在几个小时后开始正确运行。
罪魁祸首是这个看似无害的行:
times, events = satellite.find_events(observer, start_time, end_time, altitude_degrees=0.0)
你将
altitude_degrees
设置为零,这意味着你要求 Skyfield 返回卫星处于
地平线以下
0 度时的事件。换句话说,你要求它返回卫星在地球另一侧的所有时刻!难怪你会得到大量的虚假事件。
解决方案很简单:将
altitude_degrees
设置为一个小的
正
数。例如,尝试将
altitude_degrees=5.0
用于高于地平线 5 度的事件。这将大大减少虚假事件的数量,并为你提供一个更准确的卫星过境时间表。
以下是你更新后的代码:
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 # 观察未来 24 小时
culmination_time = None
altitude_km = -1
# 在此处更改 altitude_degrees!
times, events = satellite.find_events(observer, start_time, end_time, altitude_degrees=5.0)
for time, event in zip(times, events):
if event == 1: # 顶点
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: #排除太远的卫星
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
通过此更改,你的图表应该显示更真实的过境次数分布,并且你将不再需要每隔几个小时重新运行代码。
祝你跟踪愉快!
标签:python,skyfield From: 78307981