我正在对Astropy中的坐标进行转换。但这不能正常工作。情况如下,我在J2000中有一个星星的坐标,我想将其转换为实际的纪元(或另一个特定的日期)。我正在用Stellarium提供的坐标来验证代码。 问题在于,大约20分钟后结果会有所不同,这是一个很大的问题,因为我需要几十毫秒的精度。 所使用的代码如下:
from astropy.coordinates import SkyCoord
from astropy.coordinates import FK5
c = SkyCoord(20.398617733743833, 38.466348612533892,
unit='deg', frame='icrs')
c_fk5 = c.transform_to(FK5(equinox='2018-10-19 00:19:41'))
我想知道我的方法是否错误以及如何获得更好的结果。请大家自由回答并发表评论和建议。谢谢。
答案 0 :(得分:4)
您正在混合 equinox (用于右提升的经典零点)和 epoch (在观察到某些东西时)。同样,FK5是旧的天体参考系,已由ICRS取代,并且两个系非常紧密地对齐,因此在两者之间进行转换没有意义。
Astropy使用ERFA,它是SOFA代码的重新实现,该代码实现了IAU2000 / 2006分辨率以计算位置并使用了基于CIO的现代转换。恒星正在使用较旧的基于春分点的方法。您可以在SOFA Tools for Earth Attitude Cookbook的图2中看到两种方法之间的区别,其中Astropy沿右侧CIO分支下降,而Stellarium沿基于左春分线的分支下降。
您可以计算您要问的内容,即“我的物体在天空中的哪个位置,在我于2018-10-19 00:19:41 UTC时这些ICRS坐标为J2000.0”,这将是天体中间参考系统(CIRS)使用了天体,但是这与Stellarium中报道的地心表观位置不具有可比性。这是因为在这两种方法之间,地球极点所在的模型(岁差-晃动模型),右上角的起源和地球自转模型是不同的。这使得比较事物变得更加困难,直到两种方法在图2中的local apparent [h, delta]
步骤再次相遇为止(对应于Stellarium中的HA/Dec (apparent)
)。熵实际上并没有HA / Dec框架这一事实并没有帮助,因为它通常是Alt / Az过渡的中间步骤,即物体向西/向东延伸到地平面上方的距离,观察员。
以下代码应允许您计算本地表观HA,Dec以便与Stellarium进行比较(假设您发送的Stellarium中的日期和地点相同)。这将适用于可以忽略适当运动和视差的远处物体;否则,您需要在声明SkyCoord
时将它们添加进来-有关更多详细信息,请参见Using velocities with SkyCoord。
import astropy.units as u
from astropy.coordinates import SkyCoord, ITRS, EarthLocation
from astropy.time import Time
c = SkyCoord(20.398617733743833, 38.466348612533892, unit='deg', frame='icrs')
t = Time('2018-10-19 00:19:41', scale='utc')
loc = EarthLocation(lon=30*u.deg, lat=30*u.deg, height=0*u.m)
c_ITRS = c.transform_to(ITRS(obstime=t))
# Calculate local apparent Hour Angle (HA), wrap at 0/24h
local_ha = loc.lon - c_ITRS.spherical.lon
local_ha.wrap_at(24*u.hourangle, inplace=True)
# Calculate local apparent Declination
local_dec = c_ITRS.spherical.lat
print("Local apparent HA, Dec={} {}".format(local_ha.to_string(unit=u.hourangle, sep=':'), local_dec.to_string(unit=u.deg, sep=':', alwayssign=True) ))
由于使用了不同的模型(考虑到地球方向参数(UT1-UTC,极运动)等),因此会有一些差异,但是应该在亚秒级进行比较。