2013-04-10 22 views
5

Tôi đang cố gắng viết một tập lệnh python cơ bản sẽ theo dõi một vệ tinh nhất định, được xác định bằng tle's, từ một vị trí nhất định. Tôi không phải là người asto/quỹ đạo nhưng tôi đang cố gắng trở nên thông minh hơn.Theo dõi vệ tinh Python với vị trí spg4, pyephem không khớp với

Tôi đang gặp sự cố trong đó các mô hình khác nhau mà tôi đang sử dụng đang mang lại cho tôi các câu trả lời về vị trí rất khác nhau. Tôi đã cố gắng sử dụng: pyEphem spg4 dự đoán (gọi hệ thống exec từ script)

Các vệ tinh Tôi đang thử nghiệm với rất ISS và directv10 (một cố định, một moving- với theo dõi internet có sẵn để xác minh):

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 

Tôi đã sửa đổi nguồn dự đoán để cung cấp cho tôi vị trí eci để tôi có thể sử dụng để biết vị trí thực. Tôi cũng có nó cho az, el, phạm vi để sử dụng để xác minh quan sát. Tôi đang sử dụng spg4 để có được vị trí thực sự. Đối với các vị trí quan sát, tôi đang sử dụng PyEphem.

Tôi nhận được vị trí ECEF từ spg4 với:

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 

Mã của tôi cho các quan sát dựa pyephem là:

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) 

Các llh2ecef chuyển đổi:

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 

Khi tôi so sánh và vẽ các vị trí trên quả địa cầu 3D (sử dụng các vị trí ecef), tôi nhận được câu trả lời khắp nơi. Vị trí eci dự đoán (được chuyển đổi thành ecef) khớp với những gì tôi thấy trên các trang web Theo dõi ISS (http://www.n2yo.com/?s=25544)

Kết quả từ get_real() không đúng theo quy mô và vị trí. Kết quả từ get_ob() là đúng về quy mô, nhưng sai trong vị trí trên toàn cầu

dụ kết quả:

ước đoán dựa trên:

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 dựa trên:

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] 

các az , el và phạm vi không khớp giữa hai quan sát. Các vị trí không khớp với vị trí "đúng". (Độ dài và độ dài nhưng chiều cao không theo sau chuyển đổi ecef2llh.

Khi so sánh với trình theo dõi dựa trên web, tôi nhận thấy các vị trí llh đúng "đúng" phù hợp với trang web. - nhưng không phải cho ISS

Khi tôi vẽ chúng trên hình ảnh địa cầu, vị trí eci "đúng" dự đoán nằm ở đúng vị trí - trang web theo dõi phù hợp). Vị trí ecg spg84 (mà tôi nghĩ là giống như dự đoán, nằm ở phía bên kia của quả địa cầu. Vị trí "quan sát" được dự đoán, gần với vị trí spg84. Các pyEphem hoàn toàn tắt ở độ cao và không được hiển thị (cách quá thấp, bên trong trái đất)

Vì vậy, câu hỏi của tôi là nơi tôi đang sử dụng các mô hình python sai?Sự hiểu biết của tôi là cuộc gọi spg84 propagate(), nên trả về vị trí exec của vệ tinh theo mét. Tôi đã có thể nghĩ tại nên phù hợp với vị trí dự đoán sau khi chuyển đổi eci2efec. Tôi cũng đã mong đợi rằng trận đấu sau đó là llh2ecef() khi sử dụng sat.sublat, sat.sublong, sat.elevation.

Như tôi đã nói, tôi là người mới đối với tất cả mọi thứ quay quanh, vì vậy tôi chắc chắn rằng tôi đang tạo ra một lỗi toán học đơn giản hoặc soemthing. Tôi đã cố gắng google và tìm kiếm câu trả lời, ví dụ và hướng dẫn càng nhiều càng tốt nhưng không có gì đã giúp cho đến nay (tôi đã thử nhiều phương pháp ecef2llh và llh2ecef để cố gắng tìm ra những lỗi đó. theo đúng hướng sẽ được đánh giá rất cao.Tôi có thể đăng/gửi e-mail hoàn chỉnh mà tôi đang sử dụng nếu điều đó có ích cho ai đó. Tôi đã cố gắng đảm bảo rằng tôi đã đăng các phần quan trọng ở đây và không muốn thực hiện điều này rất) bài viết dài và lâu hơn.

Thanks for the help.

Aaron

CẬP NHẬT:

Tôi đã tìm thấy ít nhất một phần vấn đề. spg84.propagate() trả về vị trí trong ECI, chứ không phải ECEF. Chạy nhanh qua eci2ecef và nó xếp hàng hoàn hảo với phản hồi dự đoán.

tôi dường như luôn tìm ra giải pháp sau khi công bố để được giúp đỡ;)

Bây giờ cần phải tìm hiểu những gì đang xảy ra với các địa điểm quan sát. Điều này tóm tắt: Làm cách nào để lấy kết quả từ pyEphem.compute() và nhận vị trí ecef cho vệ tinh? Thích làm điều đó với các giá trị az, el, range, không phải là vĩ độ, kinh độ, độ cao.

Tôi đoán lỗi trong cuộc gọi aer2ecef của tôi.

Cảm ơn.

CẬP NHẬT 2:

Có quan sát để xếp hàng với vị trí "đúng". Có vẻ như tôi có vấn đề về đơn vị. Mã làm việc:

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 

Bây giờ chỉ cần phương pháp aer2ecef() để trở về vị trí thích hợp ...

+0

Tôi sẽ đóng câu hỏi mở này. Vì tôi đã giải quyết được hai vấn đề, tôi nghĩ sẽ dễ dàng hơn khi hỏi một câu hỏi đơn giản, súc tích hơn. Tôi muốn để điều này mặc dù hữu ích cho bất kỳ ai khác có thể chạy vào cùng một vấn đề tôi đã thực hiện với các chuyển đổi. Ngoài ra, nếu có ai có thêm phản hồi, vui lòng cho tôi biết. Tôi luôn tìm kiếm những cải tiến. –

+0

Bạn có thể cho tôi biết nơi bạn nhận được chức năng radcur không? – Brian

Trả lời

2

Nếu bạn có thể cung cấp một liên kết cho câu hỏi mới mà bạn đã mở ra, và cũng có thể đánh dấu câu trả lời này với màu xanh lá cây hộp kiểm, sau đó câu hỏi này sẽ không còn hiển thị như là một câu hỏi PyEphem chưa trả lời trên Stack tràn và đám đông bàn giao tiếp của những người trong chúng ta những người tìm ra cho câu hỏi chưa được trả lời trong lĩnh vực này. Cảm ơn bạn đã chia sẻ rất nhiều công việc của bạn cho những người sẽ theo bước chân của bạn!

+0

Đây là liên kết đến câu hỏi mới (được giải quyết): http://stackoverflow.com/questions/15954978/ecef-from-azimuth-elevation-range-and-observer-lat-lon-alt –

+0

Câu hỏi mới tôi đã mở http://stackoverflow.com/questions/15954978/ecef-from-azimuth-elevation-range-and-observer-lat-lon-alt –

+0

Nhưng đó là câu hỏi cũ của bạn, phải không? –

Các vấn đề liên quan