如何在Skyfield中从RA/DEC测量值计算卫星的GCRF位置?
问题
从地面传感器获取了地球轨道卫星的RA(赤经)和Dec(赤纬)测量值,想要计算该卫星在GCRF(地心天球参考系)下的地心位置矢量。由于目标是近地卫星,地心观测的RA/DEC与地面观测值存在差异,因此无法使用Skyfield官方示例。
尝试了以下代码:
from skyfield.api import load, wgs84, utc from skyfield.positionlib import position_of_radec from skyfield.units import Distance from datetime import datetime ra = 90 dec = 5 sensorlat = -30 sensorlon = 150 sensoralt = 1000 range = 37000 timestring = "2022-11-18T00:00:00.0Z" distance = Distance(km=range) time = datetime.strptime(timestring,'%Y-%m-%dT%H:%M:%S.%fZ') time = time.replace(tzinfo=utc) ts = load.timescale() t = ts.from_datetime(time) eph = load('de421.bsp') earth = eph['earth'] sensor = wgs84.latlon(sensorlat,sensorlon,sensoralt) satellite = position_of_radec(ra/15,dec,distance.au,t=t,center=sensor)
发现传感器被表示为Geocentric矢量,而卫星位置是Geometric矢量,无法合并:
satellite_icrf = sensor.at(t) + satellite # 触发异常: # Exception has occurred: TypeError # unsupported operand type(s) for +: 'Geocentric' and 'Geometric'
尝试修改Geometric矢量的center属性,数值未改变:
print(satellite.position.km) # 输出 [2.25697530e-12 3.68592038e+04 3.22476248e+03] satellite.center = earth print(satellite.position.km) # 仍输出 [2.25697530e-12 3.68592038e+04 3.22476248e+03]
请问如何将该Geometric矢量转换为GCRF矢量?
解决方案
问题核心是Geocentric和Geometric属于不同类型对象,无法直接相加;且直接修改center属性不会自动重新计算坐标。正确做法是提取两个对象的同坐标系矢量后再运算:
- 获取传感器的地心ICRF位置矢量:
sensor.at(t).position(ICRF是Skyfield对GCRF的实现) - 提取卫星相对于传感器的ICRF方向矢量:
satellite.position(position_of_radec默认生成ICRF坐标系下的相对矢量) - 将两个矢量直接相加,得到卫星的地心ICRF位置
修改后的完整代码:
from skyfield.api import load, wgs84, utc from skyfield.positionlib import position_of_radec from skyfield.units import Distance from datetime import datetime ra = 90 dec = 5 sensorlat = -30 sensorlon = 150 sensoralt = 1000 range_km = 37000 # 重命名避免和内置函数冲突 timestring = "2022-11-18T00:00:00.0Z" distance = Distance(km=range_km) time = datetime.strptime(timestring,'%Y-%m-%dT%H:%M:%S.%fZ') time = time.replace(tzinfo=utc) ts = load.timescale() t = ts.from_datetime(time) eph = load('de421.bsp') earth = eph['earth'] # 获取传感器的地心ICRF位置矢量 sensor = wgs84.latlon(sensorlat, sensorlon, sensoralt) sensor_icrf_pos = sensor.at(t).position # 获取卫星相对于传感器的ICRF矢量 sat_rel_to_sensor = position_of_radec(ra/15, dec, distance.au, t=t, center=sensor) sat_rel_icrf_pos = sat_rel_to_sensor.position # 计算卫星的地心ICRF位置 sat_geocentric_icrf_pos = sensor_icrf_pos + sat_rel_icrf_pos # 输出结果(单位:km) print(sat_geocentric_icrf_pos.km)
关键说明:
position_of_radec返回的Geometric对象的position属性,已经是ICRF坐标系下相对于传感器的位置矢量- 传感器的
Geocentric对象的position属性,是ICRF坐标系下的地心位置矢量 - 同坐标系的矢量可以直接相加,结果即为卫星的地心GCRF位置
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

