Ich möchte TLE-Daten verwenden, um den Azimut und die Höhe aller GPS-Satelliten am Standort des Benutzers zu berechnen.
Um die Korrektheit der TLE-Berechnung zu überprüfen, habe ich eine Android-App geschrieben, die über GPS positioniert werden kann und die Daten jedes Satelliten bei der Positionierung über die Android-API erhält.
Gleichzeitig werden Azimut und Elevation des Satelliten anhand von Pyephem und Benutzerposition, Ortungszeit und TLE-Daten berechnet, wenn die App ausgeführt wird.
Seltsamerweise unterscheiden sich die Ergebnisse meiner TLE-Datenberechnung von denen, die per App auf Telefonen erhalten wurden.
Das Folgende ist der spezifische Prozess:
Zuerst schreibe ich ein einfaches Android-Programm, verwende getPrn() , getAzimuth() , getElevation() , um Prn, Azimut und Höhe jedes Satelliten zu erhalten. Und erhalten Sie den GPS-Standort. Der Kerncode lautet wie folgt:
private final GpsStatus.Listener gpsStatusListener = new GpsStatus.Listener() {
public void onGpsStatusChanged(int event) {
GpsStatus status = mLocationManager.getGpsStatus(null);
getGPSStatus(event, status);
}
};
private void getGPSStatus(int event, GpsStatus status) {
if (status == null) {
} else if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS) {
String detail = "";
int maxSatellites = status.getMaxSatellites();
Iterator<GpsSatellite> it = status.getSatellites().iterator();
// numSatelliteList.clear();
int count = 0;
int goodcount = 0;
mPrnStr = "";
while (it.hasNext() && count <= maxSatellites) {
GpsSatellite gpsSatellite = it.next();
float elevation = gpsSatellite.getElevation();
float azimuth = gpsSatellite.getAzimuth();
int prn = gpsSatellite.getPrn();
float snr = gpsSatellite.getSnr();
int hasAlmanac = gpsSatellite.hasAlmanac() ? 1 : 0;
int hasEphemeris = gpsSatellite.hasEphemeris() ? 1 : 0;
int usedInFix = gpsSatellite.usedInFix() ? 1 : 0;
if (usedInFix == 1) {
goodcount++;
mPrnStr += (prn + "|");
}
count++;
detail = detail + String.format("%.5f:%.5f:%d:%.5f:%d:%d:%d|", elevation, azimuth, prn, snr, hasAlmanac,
hasEphemeris, usedInFix);
}
mGpsStar = String.format("%d-%d", goodcount, count);
mGpsStarDetail = detail;
}
}
Ich habe die APP auf meinem Handy ausgeführt und folgende Ergebnisse erhalten:
49.00000:185.00000:10:29.20000:1:1:1|33.00000:52.00000:12:42.30000:1:1:1|54.00000:312.00000:14:38.80000:1:0:1
Aus den Daten können wir ersehen, dass der Azimut des Satelliten mit PRN gleich 10 185° und die Elevation 49° beträgt.
Zweitens , wenn ich die App ausführe, ist das Ergebnis der GPS-Positionierung, dass 116.295953,40.050029,42.00(longitude,latitude,altitude)
ich Pyephem und TLE verwende, um Azimut und Höhe jedes Satelliten zu berechnen, wenn meine Position 116.295953,40.050029,42.00
und Zeit ist 2018-11-9 18:30:30
(dies ist die Zeit, in der ich die Android-App ausgeführt habe).
Der Code lautet wie folgt:
import ephem
me = ephem.Observer()
me.lon, me.lat, me.elevation = 116.295953,40.050029,42.00
line1 = 'GPS BIIF-11 (PRN 10)'
line2 = '1 41019U 15062A 18315.18162228 .00000031 00000-0 00000-0 0 9991'
line3 = '2 41019 55.1130 139.9366 0040562 201.4871 158.3788 2.00564661 22171'
sat = ephem.readtle(line1, line2, line3)
me.date = ephem.date((2018, 11, 9, 18, 30, 30))
sat.compute(me)
print sat.az * 180.0 / 3.1416
print sat.alt * 180.0 / 3.1416
Die Ausgabe dieses Codes ist:
24.5045833546
-19.6957760088
Da ich denselben Ort und dieselbe Zeit eingestellt habe, sollten die von TLE berechneten Ergebnisse den Ergebnissen ähneln, die ich von der Ausführung der Android-App erhalten habe. Aber im App-Ergebnis beträgt der Azimut und die Höhe von prn10: 185° und 49°. Im TLE-Ergebnis betragen der Azimut und die Höhe von prn10: 24,5045833546°, -19,6957760088°. Sie sind sehr unterschiedlich. Es ist komisch.
Bitte sagen Sie mir, wo das Problem liegt. Danke vielmals.
Anscheinend können (oder müssen?) Breiten- und Längengrade PyEphem als Zeichenfolgen bereitgestellt werden, wobei das Grad:Minuten-Format verwendet wird, dh Längengrad: 116:17.75718, Breitengrad: 40:3.00174
Siehe rhodesmill.org/pyephem/quick.html#observers
PyEphem benötigt auch die Weltzeit (und nicht die Zeit in der lokalen Zeitzone)
Siehe rhodesmill.org/pyephem/quick.html#dates
Angesichts der Tatsache, dass 40 N, 116 E in der Nähe von Peking (GMT-8) liegt, vermutete ich, dass die korrekte UTC-Zeit 10:30 sein würde.
Durch die Verwendung des korrekten Längen-/Breitenformats und 10:30 UTC-Zeit erhalte ich Az: 183,2 El: 38,5, das nahe an den Erwartungen liegt.
Das Ergebnis ist immer noch anders als die erwarteten 185° / 49°, aber vielleicht war die Zeit früher oder später ein paar Minuten?
In der Tat kann ich 185 Az, 49 Elev erhalten, indem ich 10:08 als Beobachtungszeit angebe.
Mein Code folgt:
import ephem
me = ephem.Observer()
me.lon, me.lat, me.elevation = 116.295953,40.050029,42.00
longitude = '116:'+str(int(0.295953*60))+str((0.295953*60)%1)[1:]
latitude = '40:'+str(int(0.050029*60))+str((0.050029*60)%1)[1:]
print "Longitude in degrees:minutes format:", longitude
print "Latitude in degrees:minutes format:", latitude
me.lon = longitude
me.lat = latitude
line1 = 'GPS BIIF-11 (PRN 10)'
line2 = '1 41019U 15062A 18315.18162228 .00000031 00000-0 00000-0 0 9991'
line3 = '2 41019 55.1130 139.9366 0040562 201.4871 158.3788 2.00564661 22171'
sat = ephem.readtle(line1, line2, line3)
me.date = ephem.date((2018, 11, 9, 10, 30, 30))
sat.compute(me)
print sat.az * 180.0 / 3.1416
print sat.alt * 180.0 / 3.1416
me.date = ephem.date((2018, 11, 9, 10, 8, 30))
sat.compute(me)
print sat.az * 180.0 / 3.1416
print sat.alt * 180.0 / 3.1416
BEARBEITEN: Wenn Sie Lat/Lon als Zahlen anstelle von Zeichenfolgen angeben, werden sie als Bogenmaß interpretiert. Ihr vorhandener Code würde also funktionieren, wenn me.lon und me.lat in Grad konvertiert würden (geteilt durch 180, multipliziert mit 3,1416). Die Uhrzeit muss noch in UTC umgerechnet werden.
BlueCoder
BlueCoder
AndyShan
AndyShan
äh
äh
Topos()
in meinem Skript benannte Argumente verwendet. Ich habe aus Spaß Subsat hinzugefügt. Viel Glück!Bit-Jäger
BlueCoder
BlueCoder
BlueCoder
BlueCoder
BlueCoder