2013-04-10 16 views
5

Belirli bir yerden, belirtilen bir uyduyu belirli bir konumdan izleyebilecek temel bir python yazmayı deniyorum. Ben/orbital bir insan değilim ama üzerinde daha akıllı olmaya çalışıyorum.Spg4 ile uyuşan python uydusu izlemesi, piyomezler eşleşmiyor

Kullanmakta olduğum farklı modellerin bana çok farklı konum yanıtları verdikleri bir sorunla karşılaşıyorum. Ben kullanarak denedi: pyEphem spg4 (komut dosyasından exec sistem çağrısı)

tahmin Birlikte test ediyorum uydular ISS ve directv10 (biri sabit, doğrulama için kullanılabilir internet takibi ile tek 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 konumunuzu vermek için tahmini kaynağı değiştirdim, böylece bunu gerçek konumu öğrenmek için kullanabilirim. Ayrıca gözlemleri doğrulamak için kullanabileceğiniz az, el menzili verdim. Gerçek yeri almak için spg4 kullanıyorum. Gözlemlenen yer için PyEphem kullanıyorum.

Birlikte spg4 gelen ECEF pozisyon alıyorum: pyephem bazlı gözlemler için

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 

Benim kod geçerli:

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 dönüşüm:

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 

3B dünya üzerindeki konumları karşılaştırdığımda ve çizerken (ecef konumlarını kullanarak), her yere cevaplar alıyorum. Tahmin edilen eci konumu (ecef'e dönüştürülür), ISS Tracking web sitelerinde gördüğüm şeyle eşleşir (http://www.n2yo.com/?s=25544)

get_real() öğesinin sonucu ölçek ve konum olarak kapalıdır.

tabanlı önceden tahmin edebildiği:

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] 

piton tabanlı: get_ob gelen sonuç()

örnek sonuçları ölçekte doğru, ama dünya üzerinde bir konumda yanlış

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 ve dizi iki gözlem arasında uyuşmuyor. Pozisyonlar "gerçek" konumlar için eşleşmiyor. (Lat boylu ve uzun boylu ancak yükseklik bir ecef2llh dönüşümden sonra olmaz.

Web tabanlı izleyici ile karşılaştırıldığında, "true" llh konumlarının web sitesiyle eşleştiğini tahmin ediyorum: directv10 için pyEphem azimut ve yükseklik ile eşleşiyor - ancak ISS

için değil, onları dünya üzerinde çizdiğimde, eci "gerçek" konumun doğru yerde olduğunu tahmin edin - izleyici web sitesi ile eşleşir). Spg84 ecef pozisyonu (tahmin edilenle aynı olması gerektiğini düşündüğüm, dünyanın diğer tarafındadır. "Gözlemlenen" konumun tahmini, spg84 konumuna yakındır. PyEphem irtifada tamamen kapalıdır ve görüntülenmez düşük, iç dünya)

Benim sorum python modellerini yanlış kullanıyorum nerede?Anlayışım, spg84 propagate() çağrısının, uyduların yürütme konumunu metre cinsinden döndürmesiydi. Eci2efec dönüşümden sonra tahmin konumunu eşleştirmesi gerektiğini düşünürdüm. Ben de o zaman satsublat, sat.sublong, sat.elevation kullanırken maçın llh2ecef() olmasını beklerdim.

Dediğim gibi, yörüngedeki her şey için yeniyim, bu yüzden eminim ki basit bir matematik hatası ya da benzer şeyler yapıyorum. Ben google çalıştım ve mümkün olduğunca çok cevaplar, örnekler ve öğreticiler için arama yaptık ama hiçbir şey bu kadar yardımcı olmamıştı (Bu hataları çözmek için birden çok ecef2llh ve llh2ecef yöntemlerini denedim.

Öneri, öneri, işaretçiler Doğru yönde çok takdir edersiniz.Bir cod için yararlı olurdu eğer ben tam cod eI'm göndermek/göndermek gönderebilirsiniz.Burada önemli parçaları gönderdi emin olmak istedim ve bunu yapmak istemedim (zaten çok) uzun yazı ve daha uzun.

yardım için teşekkürler.

Aaron

UPDATE:

Sorunun en azından bir kısmını buldum. spg84.propagate(), ECEF'de değil ECI'daki konumu döndürür. Eci2ecef ile hızlı koşun ve öngörü yanıtıyla mükemmel bir şekilde hizalanır.

Hep yardım için yazdıktan sonra çözüm bulmak görünmektedir;)

Şimdi gözlemci konumlarıyla ne olup bittiğini anlamaya ihtiyacımız var. Bu aşağı kaynar: Nasıl pyEphem.compute() sonucunu alabilir ve uydu için ecef konumunu alabilir miyim? Enlem, boylam, yükseklik değil, az, el, aralık değerleri ile yapmayı tercih edin.

Aer2ecef çağrımdaki hatayı tahmin ediyorum.

Teşekkürler.

GÜNCELLEME 2:

"gerçek" pozisyonuyla sıraya gözlem var. Bir birim sorunum var gibi görünüyor. çalışma kodu:

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 

Şimdi sadece açtığınız yeni soruya bir bağlantı sağlayabilir Eğer

+0

Bunu kapatmak için yeni bir soru açacağım. İki problemi çözdüğümden beri, şimdi daha tek bir soru sormanın daha kolay olduğunu düşünüyorum. Bunu, dönüşümlerle yaptığım aynı sorunlara dönüşebilecek başkalarına yardımcı olmak için bırakmak istiyorum. Ayrıca, daha fazla geribildirim varsa, lütfen bana bildirin. Her zaman geliştirmeler arıyorum. –

+0

Bana fonksiyonun nereden geldiğini söyler misiniz? – Brian

cevap

2

... Doğru pozisyon dönmek için aer2ecef() yöntemini gerekir ve ayrıca bu cevabı işaretlemek yeşil onay kutusu, daha sonra bu soru, Yığın Taşması konusunda cevapsız bir PyEphem sorusu olarak ortaya çıkmayacak ve bu alanda cevapsız sorulara cevap verenlerin konsollarını kalabalıklaştıracak. Ayaklarınızda takip edebilecekleriniz için çalışmalarınızın çoğunu paylaştığınız için teşekkür ederiz!

+0

İşte yeni soruya (ki bu da çözülmüştür) bağlantıdır: http://stackoverflow.com/questions/15954978/ecef-from-azimuth-elevation-range-and-observer-lat-lon-alt –

+0

Açtığım yeni soru http://stackoverflow.com/questions/15954978/ecef-from-azimuth-elevation-range-and-observer-lat-lon-alt –

+0

Ama bu senin eski sorunun, değil mi? –

İlgili konular