Python的卫星与SPG4跟踪,pyephem-位置不匹配(Python satellite tr

2019-08-21 13:40发布

我试图写一个基本的Python纸条,将跟踪给定的卫星,颞叶癫痫的定义,从给定位置。 我不是一个ASTO /轨道的人,但我想成为它更聪明。

我遇到了在那里我使用不同的模型给了我很大的不同位置的答案的一个问题。 我已经尝试使用:pyEphem SPG4预测(从脚本exec系统调用)

我用来测试的卫星是国际空间站和directv10(一个固定,一个moving-与可用于验证网络跟踪​​):

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位置,这样我就可以用它来了解真正的位置。 我也有它给AZ,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地球的位置(使用地心固定位置),我得到所有的地方的答案。 该预测ECI位置(转换成ECEF)配衬我所看到的国际空间站上跟踪网站( 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]

在亚利桑那州,E1和范围没有两个观测之间匹配。 该位置不匹配“真实”的位置。 (lat和长时间?但ecef2llh转换后高度不会。

当与基于网络跟踪器相比,我注意到预测“真” LLH位置的网站相匹配。 对于directv10,pyEphem配衬方位角和elevation-但不为国际空间站

当我绘制他们在全球范围内,在预测ECI“真”的位置是在正确的位置 - 匹配跟踪网站)。 所述spg84 ECEF位置(我认为应该是作为预测相同,是对地球的另一侧,预测“观察”的位置,靠近spg84位置。所述pyEphem是完全关闭在高度和不显示(太低,内部接地)。

所以我的问题是我在哪里使用Python模式错了吗? 我的理解是spg84繁殖()调用,应返回米卫星的EXEC位置。 我本来以为在应该匹配eci2efec转换后的预测位置。 我本来还预期匹配,那么llh2ecef()使用sat.sublat时,sat.sublong,sat.elevation。

正如我所说的,我是新来的所有的事情轨道,所以我敢肯定,我做一个简单的数学错误或soemthing。 我曾尝试谷歌和搜索答案,示例和教程尽可能的,但没有帮助,到目前为止(我曾尝试多种ecef2llh和llh2ecef方法,试图找出这些错误。

任何建议,意见,在正确的方向指针将不胜感激。 我可以张贴/发送使用,如果这将是有帮助的人完全鳕鱼eI'm。 我想确保我张贴的重要组成部分,并在这里并不想使这个(已经很)长职位和更长的时间。

谢谢您的帮助。

亚伦

更新:

我发现这个问题的ATLEAST一部分。 spg84.propagate()返回ECI的位置,而不是ECEF。 通过与预测响应eci2ecef并排队完美的快速运行。

我似乎总是发帖求助后,找到解决办法;)

现在需要弄清楚是怎么回事与观察者的位置。 这归结为:我如何可以从pyEphem.compute(结果),并得到了卫星的ECEF位置? 喜欢用AZ,EL,范围值,而不是纬度,经度,海拔做到这一点。

我猜我aer2ecef调用的bug。

谢谢。

更新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()方法返回正确的位置...

Answer 1:

如果你能提供一个链接到新的问题,你已经打开了,也标志着这个答案与绿色的复选框,然后这个问题将不再显示为Stack Overflow上的一个悬而未决的PyEphem问题和人群我们这些谁看的游戏机出在这一领域悬而未决的问题。 感谢分享这么多的工作,为那些谁可能会跟随你的脚步!



文章来源: Python satellite tracking with spg4, pyephem- positions not matching