私は与えられた場所からtle'sで定義された特定の衛星を追跡する基本的なpythonスクリプトを作成しようとしています。私はアスト/軌道人ではなく、よりスマートになるよう努力しています。spg4でPython衛星の追跡、pyephemの位置が一致しない
私が使用しているさまざまなモデルが私に非常に異なるポジションの回答を与えているという問題が発生しています。私が使って試してみました: pyEphem SPG4 は、私がテストしてる
衛星がISSとdirectv10(1が固定、検証のために利用可能なインターネットの追跡と1主として移動)されている(スクリプトからexecシステムコール)を予測:
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位置を使用して)、私はどこにでも答えを得ています。私がISSトラッキングウェブサイト(http://www.n2yo.com/?s=25544)に表示されているものと一致すると予測されるeci位置(ecefに変換されたもの)
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]
Pythonはベース: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は2つの観測値の間で一致しません。位置は「真の」場所と一致しません。 (緯度と経度はecef2llh変換後の高さではありません
ウェブベースのトラッカーと比較すると、私は予想される "真の"場所がウェブサイトと一致することに気付きます。directv10の場合、pyEphemは方位角と仰角を一致させます - ISSのためではありません
地球上にプロットすると、予想されるeci "真"の場所が正しい場所にあります - トラッカーのウェブサイトに一致します)。 spg84 ecefの位置(私は予測と同じでなければならないと思っていたが、地球の反対側にあると考えられる) "観測された"位置はspg84の位置に近い。低い、内側の地球)
私の質問はどこで間違っているのですか?私の理解は、spg84 propagate()コールで、衛星のexec位置をメートルで返すべきだった。 eci2efec変換後に予測位置に一致する必要があります。私はまた、sat.sublat、sat.sublong、sat.elevationを使用したときにllh2ecef()とマッチすると予想していました。
私が言ったように、私は周回するすべてのものに新しいので、私は簡単な数学のエラーやsoemthingを作ると確信しています。私はGoogleに答え、例とチュートリアルを可能な限り検索しようとしましたが、何もこれまで助けなかった(これらのバグを解消するために複数のecef2llhとllh2ecefメソッドを試しました)。正しい方向に私はポストを送信することができます/それは誰かのために役立つことを使用して私は完全なcodを送信することができます私はここに重要な部分を投稿し、非常に)長い記事と長い。
助けてくれてありがとう。
をアーロン
更新:
私はこの問題の少なくとも一部を発見しました。 spg84.propagate()はECEFではなくECI内の位置を返します。 eci2ecefをすばやく実行すると、予測応答と完全に一致します。
私はいつも助けを掲示した後、解決策を見つけるように見える;)
は今オブザーバーの場所で起こっているかを把握する必要があります。これは次のようになります。 pyEphem.compute()の結果を衛星のecef位置に取得するにはどうすればよいですか? az、el、範囲の値ではなく、緯度、経度、高度で行うことをお勧めします。
私はaer2ecefコールのバグを推測しています。
ありがとうございました。
UPDATE 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
は今ちょうどあなたが開いている新しい質問へのリンクを提供することができれば
私はこれを新しい質問を開いて閉じます。私は2つの問題を解決して以来、今ではより簡潔な単一の質問をする方が簡単だと思います。私はこれを、コンバージョンと同じ問題に遭遇するかもしれない他の誰にとっても役立つとは思っていますが、残したいと思います。また、誰かがより多くのフィードバックを持っている場合は、私に知らせてください。私は常に改善を探しています。 –
関数radcurがどこに届くか教えてください。 – Brian