带有spg4,pyephem的Python卫星跟踪-位置不匹配

问题描述 投票:4回答:1

我正在尝试编写一个基本的python脚本,它将从给定位置跟踪由tle定义的给定卫星。我不是一个惯性/轨道的人,但正在尝试变得更聪明。

我遇到了一个问题,我使用的不同模型给我的位置答案非常不同。我尝试使用:Espg4预测(通过脚本执行系统调用)

我正在测试的卫星是ISS和directv10(一个固定的卫星,一个正在移动的卫星,可以通过互联网跟踪进行验证):

0 Direct10
1 31862U 07032A   13099.15996183 -.00000126  00000-0  10000-3 0  1194
2 31862 000.0489 046.9646 0000388 001.7833 103.5813 01.00271667 21104
0 ISS
1 25544U 98067A   13112.50724749  .00016717  00000-0  10270-3 0  9148
2 25544  51.6465  24.5919 0009906 171.1474 188.9854 15.52429950 26067

我已经修改了预测来源,为我提供了eci位置,因此我可以使用它来知道真实位置。我还给出了用于验证观测值的z,el范围。我正在使用spg4获取真实位置。对于观察到的位置,我正在使用PyEphem。

我通过以下方式从spg4获取ECEF位置:

def get_real(epoch, sv):
    satellite = twoline2rv(sv.tle1, sv.tle2, wgs84)

    #epoch = time.time()
    obsTime = datetime.datetime.utcfromtimestamp(epoch)
    position, velocity = satellite.propagate(obsTime.year,
                                             obsTime.month,
                                             obsTime.day,
                                             obsTime.hour,
                                             obsTime.minute,
                                             obsTime.second)


    x = position[0]
    y = position[1]
    z = position[2]

    x *= 1000
    y *= 1000
    z *= 1000

我基于pyephem的观测结果的代码是:

def get_ob(epoch, sv, obsLoc):
    site = ephem.Observer()
    site.lon = str(obsLoc.lat)   # +E -104.77 here
    site.lat = str(obsLoc.lon)   # +N 38.95   here
    site.elevation = obsLoc.alt # meters    0 here
    #epoch = time.time()
    site.date = datetime.datetime.utcfromtimestamp(epoch)

    sat = ephem.readtle(sv.name,sv.tle1,sv.tle2)
    sat.compute(site)

    az       = degrees(sat.az)
    el       = degrees(sat.alt)
    #range in m
    range    = sat.range
    sat_lat  = degrees(sat.sublat)
    sat_long = degrees(sat.sublong)
    # elevation of sat in m
    sat_elev = sat.elevation

    #TODO: switch to using az,el,range for observed location calculation
    #x, y, z    = aer2ecef(az,el,range,38.95,-104.77,80 / 1000)
    x,y,z  = llh2ecef(sat_lat, sat_long, sat_elev)

llh2ecef转换:

def llh2ecef (flati,floni, altkmi ):
    #         lat,lon,height to xyz vector
    #
    # input:
    # flat      geodetic latitude in deg
    # flon      longitude in deg
    # altkm     altitude in km
    # output:
    # returns vector x 3 long ECEF in km

    dtr =  pi/180.0;

    flat  = float(flati);
    flon  = float(floni);
    altkm = float(altkmi);

    clat = cos(dtr*flat);
    slat = sin(dtr*flat);
    clon = cos(dtr*flon);
    slon = sin(dtr*flon);

    rrnrm  = radcur (flat);
    rn     = rrnrm[1];
    re     = rrnrm[0];

    ecc1    = ecc;
    esq1    = ecc1*ecc1

    x      =  (rn + altkm) * clat * clon;
    y      =  (rn + altkm) * clat * slon;
    z      =  ( (1-esq1)*rn + altkm ) * slat;

    return x,y,z

aer2ecef:

def aer2ecef(azimuthDeg, elevationDeg, slantRange, obs_lat, obs_long, obs_alt):

    #site ecef in meters
    sitex, sitey, sitez = llh2ecef(obs_lat,obs_long,obs_alt)

    #some needed calculations
    slat = sin(radians(obs_lat))
    slon = sin(radians(obs_long))
    clat = cos(radians(obs_lat))
    clon = cos(radians(obs_long))

    azRad = radians(azimuthDeg)
    elRad = radians(elevationDeg)

    # az,el,range to sez convertion
    south  = -slantRange * cos(elRad) * cos(azRad)
    east   =  slantRange * cos(elRad) * sin(azRad)
    zenith =  slantRange * sin(elRad)


    x = ( slat * clon * south) + (-slon * east) + (clat * clon * zenith) + sitex
    y = ( slat * slon * south) + ( clon * east) + (clat * slon * zenith) + sitey
    z = (-clat *        south) + ( slat * zenith) + sitez

    return x, y, z

[当我比较并绘制3D地球上的位置(使用ecef位置)时,我在整个地方都得到了答案。预测的eci位置(转换为ecef)与我在ISS跟踪网站(http://www.n2yo.com/?s=25544)]上看到的一致

get_real()的结果在规模和位置上都相差甚远。 get_ob()的结果在比例上是正确的,但在地球上的位置是错误的

示例结果:

基于预测:

sv: ISS predict observed response    @ epoch: 1365630559.000000 : [111.485527, -69.072949, 12351.471383]
sv: ISS predict aer2ecef position(m) @ epoch: 1365630559.000000 : [4731598.706291642, 1844098.7384999825, -4521102.9225004213]
sv: ISS predict ecef position(m) @ epoch: 1365630559.000000 : [-3207559.6840419229, -3937040.5048992992, -4521102.9110000003]
sv: ISS predict ecef2llh(m)      @ epoch: 1365630559.000000 : [-41.67839724680753, -129.170165912171, 6792829.6884068651]
sv: Direct10 predict observed response    @ epoch: 1365630559.000000 : [39.692138, -49.219935, 46791.914833]
sv: Direct10 predict aer2ecef position(m) @ epoch: 1365630559.000000 : [28401835.38849232, 31161334.784188181, 3419.5400331273049]
sv: Direct10 predict ecef position(m) @ epoch: 1365630559.000000 : [-9348629.6463202238, -41113211.570621684, 3419.8620000000005]
sv: Direct10 predict ecef2llh(m)      @ epoch: 1365630559.000000 : [0.0046473273713214715, -102.81051792373036, 42156319.281573996]

基于python的:

sv: ISS ephem observed response    @ epoch: 1365630559.000000 : [344.067992722211, -72.38297754053431, 12587123.0][degrees(sat.az), degrees(sat.alt), sat.range]
sv: ISS ephem llh location(m)      @ epoch: 1365630559.000000 : [-41.678271938092195, -129.16682754513502, 421062.90625][degrees(sat.sublat0, degrees(sat.sublong), sat.elevation]
sv: ISS ephem xyz location(m)      @ epoch: 1365630559.000000 :[-201637.5647039332, -247524.53652043006, -284203.56557438202][llh2ecef(lat,long,elev)]
sv: ISS spg84 ecef position(m) @ epoch: 1365630559.000000 : [4031874.0758277094, 3087193.8810081254, -4521293.538866323]
sv: ISS spg84 ecef2llh(m)      @ epoch: 1365630559.000000 : [-41.68067424524357, 37.4411722245808, 6792812.8704163525]
sv: Direct10 ephem observed response    @ epoch: 1365630559.000000 : [320.8276456938389, -19.703680198781303, 43887572.0][degrees(sat.az), degrees(sat.alt), sat.range]
sv: Direct10 ephem llh location(m)      @ epoch: 1365630559.000000 : [0.004647324660923812, -102.8070784813048, 35784688.0][degrees(sat.sublat0, degrees(sat.sublong), sat.elevation]
sv: Direct10 ephem xyz location(m)      @ epoch: 1365630559.000000 :[-7933768.6901137345, -34900655.02490133, 2903.0498773286708][llh2ecef(lat,long,elev)]
sv: Direct10 spg84 ecef position(m) @ epoch: 1365630559.000000 : [18612307.532456037, 37832170.97306267, -14060.29781505302]
sv: Direct10 spg84 ecef2llh(m)      @ epoch: 1365630559.000000 : [-0.019106864351793953, 63.80418030988552, 42156299.077687643]

两个观测值之间的az,el和range不匹配。位置与“真实”位置不匹配。 (经efef2llh转换后,纬度和经度会变化,但高度不会变化。

[与基于Web的跟踪器相比,我注意到预测的“真实”所有位置都与网站匹配。对于directv10,pyEphem匹配方位角和仰角-但不匹配ISS

当我将它们绘制在地球上时,预测的eci“真实”位置在正确的位置-匹配跟踪器网站)。 spg84 ecef位置(我认为应该与预测相同,位于地球的另一侧。预测的“观察到”位置靠近spg84位置。pyEphem的高度完全关闭,并且不显示(也是如此)低,在地球内部。

所以我的问题是我在哪里使用python模型错误?我的理解是,spg84 broadcast()调用应以米为单位返回卫星的执行位置。我本以为eci2efec转换后at应该匹配预测位置。当使用sat.sublat,sat.sublong,sat.elevation时,我也会期望匹配然后是llh2ecef()。

正如我说的那样,我对轨道上的所有事物都是陌生的,所以我确定自己正在做一个简单的数学错误或东西。我尝试过搜索并尽可能多地搜索答案,示例和教程,但到目前为止没有任何帮助(我尝试了多种ecef2llh和llh2ecef方法来尝试找出这些错误。

任何建议,建议,正确方向的指点将不胜感激。我可以发布/发送我正在使用的完整编码,如果这对某人有用。我试图确保我在此处发布了重要的部分,并且不想把这个(已经非常)长的文章发布更长的时间。

感谢您的帮助。

亚伦

更新:

我发现了问题的至少一部分。 spg84.propagate()返回ECI中的位置,而不是ECEF中的位置。快速运行eci2ecef,它与预测响应完美契合。

我似乎总是在发布帮助后找到解决方案;)

现在需要弄清楚观察者位置的状况。归结为:如何从pyEphem.compute()获取结果并获取卫星的ecef位置?最好使用az,el,范围值,而不是纬度,经度,高程。

我正在猜测我的aer2ecef通话中的错误。

谢谢。

更新2:

使观察与“真实”位置对齐。看来我有单位问题。工作代码:

az       = degrees(sat.az)
el       = degrees(sat.alt)
#range in km
range    = sat.range
sat_lat  = degrees(sat.sublat)
sat_long = degrees(sat.sublong)
# elevation of sat in km
sat_elev = sat.elevation


#x, y, z    = aer2ecef(az,el,range,obsLoc.lat,obsLoc.long,obsLoc.alt)
x,y,z  = llh2ecef(sat_lat, sat_long, sat_elev / 1000)

x *= 1000
y *= 1000
z *= 1000
return x,y,z

现在只需要aer2ecef()方法即可返回正确的位置...

我正在尝试编写一个基本的python脚本,它将从给定位置跟踪由tle定义的给定卫星。我不是一个惯性/轨道的人,但是我想变得更聪明。我是...

python coordinate-transformation astronomy pyephem satellite
1个回答
2
投票

[如果您可以提供已打开的新问题的链接,并用绿色复选框标记此答案,则该问题将不再显示为Stack Overflow上未回答的PyEphem问题,并挤满了我们这些控制台的控制台谁在这方面寻找未解决的问题。感谢您与可能会跟随您的人们分享您的大量工作!

© www.soinside.com 2019 - 2024. All rights reserved.