2013-04-10 1 views
5

주어진 위치에서 tle 's로 정의 된 특정 위성을 추적 할 기본 파이썬 스크립트를 작성하려고합니다. 나는 asto/orbital 사람이 아니지만 그것에 더 똑똑해 지려고 노력하고 있습니다.Python 위성 추적, spg4, pyephem- 위치가 일치하지 않음

다른 모델에서 나에게 매우 다른 위치 응답을주는 문제가 있습니다. 내가 사용 시도 : pyEphem를 spg4 (스크립트 간부 시스템 호출)

을 예측 내가 함께 테스트하고있어 위성이 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 위치를 알려주기 위해 예측 소스를 수정했습니다. 나는 또한 관측을 검증하기 위해 사용하는 범위 인 az, el을 제공해야한다. 나는 실제 위치를 얻기 위해 spg4를 사용하고 있습니다. 관찰 된 위치에 대해 PyEphem을 사용하고 있습니다.

내가 함께 spg4에서 ECEF 위치를 받고 있어요 : pyephem 기반 관측

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 

내 코드 것은 :

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 위치 사용) 할 때 나는 그 곳곳에서 응답을 얻고 있습니다. (ecef로 변환 된) 예측 eci 위치가 ISS에서 보이는 것과 일치합니다. 추적 웹 사이트 (http://www.n2yo.com/?s=25544)

get_real()의 결과는 소수 자리 및 위치에서 벗어났습니다.

을 기반으로 예측이 :

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] 

파이썬 기반 : get_ob에서 결과는()

예를 들어 결과 규모를 잘하지만, 세계에서 위치에 잘못

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는 두 관측 사이에 일치하지 않습니다. 위치가 "실제"위치와 일치하지 않습니다. (위도와 경도는 ecef2llh 변환 후 높이가 아닙니다.

웹 기반 트래커와 비교할 때 예상되는 "실제"위치는 웹 사이트와 일치합니다. directv10의 경우 pyEphem은 방위각 및 고도와 일치합니다 - ISS는 아니지만

지구상에 그림을 그릴 때, 예상 eci "true"위치가 올바른 위치에 있습니다 (추적기 웹 사이트와 일치). spg84 ecef 위치 (예상했던 것과 같을 것으로 생각되는)는 지구 반대편에 있습니다. 예상 "관찰 된"위치는 spg84 위치에 가깝습니다. pyEphem은 고도가 완전히 떨어져 표시되지 않습니다. 낮은, 내부 지구).

그래서 내 질문은 어디에서 파이썬 모델을 잘못 사용하고 있습니까?나의 이해는 spg84 propagate() 호출로 위성의 exec 위치를 미터로 반환해야한다. eci2efec 변환 후 예측 위치와 일치해야한다고 생각했습니다. 또한 sat.sublat, sat.sublong, sat.elevation을 사용할 때 llh2ecef()와 일치한다고 예상했을 것입니다.

내가 말했듯이, 나는 궤도를 도는 모든 것에 익숙하다. 그래서 나는 간단한 수학 오류 또는 soemthing을 만들 것이라고 확신한다. 가능한 한 많은 답변, 예제 및 자습서에 대한 검색을 시도했지만 지금까지는 아무 것도 도움이되었습니다 (여러 ecef2llh 및 llh2ecef 메서드를 사용하여 해당 버그를 해결하려고했습니다.)

제안, 조언, 참고 사항 오른쪽 방향으로 크게 감상 할 수 있습니다. 나는 누군가에게 도움이 될만한 것이라면 사용하여 완전한 대구를 게시 할 수 있습니다. 여기에 중요한 부분을 게시했는지 확인하려고했는데 (이미 매우) 긴 포스트 긴.

도움을 주셔서 감사합니다.

을 아론

업데이트 :

문제점의 주요 부분을 발견했습니다. spg84.propagate()는 ECEF가 아닌 ECI에서 위치를 반환합니다. eci2ecef를 통한 빠른 실행은 예상 응답과 완벽하게 일치합니다.

나는 항상 도움을 게시 한 후 해결책을 찾을 수가)

지금 관찰자의 위치와 무슨 일이 일어나고 있는지 파악해야합니다. 이것은 다음과 같습니다. pyEphem.compute()에서 결과를 가져 와서 위성의 ece 위치를 얻으려면 어떻게해야합니까? 위도, 경도, 표고가 아닌 az, el, 범위 값을 사용하는 것이 좋습니다.

내 aer2ecef 호출에서 버그를 추측하고 있습니다.

감사합니다.

업데이트 2 :

은 "true"로 위치에 줄 수있는 관찰을 얻었다. 내가 문제가 생긴 것 같아. 작업 코드 :

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 

지금 당신은 당신이 열어 새 질문에 대한 링크를 제공 할 수있는 경우

+0

나는이 새로운 문을 열어 닫을 것입니다. 두 가지 문제를 해결 한 이후로 지금은 더 간단하고 간결한 질문을하는 것이 더 쉽습니다. 나는 다른 사람들에게 도움이 될 수 있기를 바란다. 나는 전환과 동일한 문제를 겪을 수도있다. 또한, 더 많은 의견을 가지고 있다면 알려 주시기 바랍니다. 나는 항상 개선을 찾고 있습니다. –

+0

함수 radcur를 어디서 얻을 수 있는지 말해 주시겠습니까? – Brian

답변

2

... 적절한 위치를 반환 aer2ecef() 메소드를해야하고, 또한이 대답을 표시 녹색 체크 박스를 선택하면,이 질문은 더 이상 Stack Overflow에 대한 답변이없는 PyEphem 질문으로 나타나지 않을 것이고,이 분야에서 답이없는 질문을주의하는 우리들의 콘솔을 군집하게 될 것입니다. 당신의 발자취를 따라갈 사람들을 위해 많은 것을 나누어 주셔서 감사합니다!

+0

새 질문에 대한 링크입니다 (해결됨). http://stackoverflow.com/questions/15954978/ecef-from-azimuth-elevation-range-and-observer-lat-lon-alt –

+0

새 질문 http://stackoverflow.com/questions/15954978/ecef-from-azimuth-elevation-range-and-observer-lat-lon-alt –

+0

하지만 그건 당신의 오래된 질문이지, 안 그래? –