Quiero usar datos TLE para calcular el acimut y la elevación de todos los satélites GPS en la ubicación del usuario.
Para verificar la exactitud del cálculo de TLE, escribí una aplicación de Android que se puede posicionar usando GPS y obtener los datos de cada satélite cuando se posiciona usando la API de Android.
Al mismo tiempo, el acimut y la elevación del satélite se calculan utilizando el piefem y la posición del usuario, el tiempo de posicionamiento y los datos TLE cuando la aplicación está en ejecución.
Extrañamente, los resultados de mi cálculo de datos TLE son diferentes de los obtenidos por la aplicación en los teléfonos.
El siguiente es el proceso específico:
Primero , escribo un programa simple de Android, uso getPrn() , getAzimuth() , getElevation() para obtener prn, acimut y elevación de cada satélite. Y obtener la ubicación gps. El código central es el siguiente:
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;
}
}
Ejecuté la aplicación en mi teléfono y obtuve los siguientes resultados:
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
A partir de los datos, podemos ver que el acimut del satélite con PRN igual a 10 es 185° y la elevación es 49°.
En segundo lugar , cuando ejecuto la aplicación, el resultado del posicionamiento GPS es 116.295953,40.050029,42.00(longitude,latitude,altitude)
que uso pyephem y TLE para calcular el acimut y la elevación de cada satélite cuando mi posición es 116.295953,40.050029,42.00
y la hora es 2018-11-9 18:30:30
(esta es la hora en que solía ejecutar la aplicación de Android).
El código es el siguiente:
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
La salida de este código es:
24.5045833546
-19.6957760088
Debido a que configuré la misma ubicación y hora, los resultados calculados a partir de TLE deberían ser similares a los resultados que obtuve al ejecutar la aplicación de Android. Pero en el resultado de la aplicación, el acimut y la elevación de prn10 son: 185° y 49°. En el resultado de TLE, el acimut y la elevación de prn10 son: 24,5045833546°, -19,6957760088°. Son muy diferentes. Es extraño.
Por favor, dime dónde está el problema. Muchas gracias.
Parece que la latitud y la longitud pueden (¿o deben?) proporcionarse a PyEphem como una cadena, usando el formato de grados: minutos, es decir, Longitud: 116: 17.75718, Latitud: 40: 3.00174
Ver rhodesmill.org/pyephem/quick.html#observers
PyEphem también necesita la hora universal (y no la hora en la zona horaria local)
Consulte rhodesmill.org/pyephem/quick.html#dates
Dado que 40 N, 116 E está cerca de Beijing (GMT-8), supuse que la hora UTC correcta sería las 10:30.
Al usar el formato largo/lat correcto y la hora UTC de las 10:30, obtengo Az: 183,2 El: 38,5 cerca de lo esperado.
El resultado sigue siendo diferente de los 185°/49° esperados, pero ¿quizás el tiempo fue unos minutos tarde o temprano?
De hecho, puedo obtener 185 Az, 49 Elev proporcionando 10:08 como hora de observación.
Mi código sigue:
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
EDITAR: al proporcionar Lat/Lon como números, en lugar de cadenas, se interpretan como radianes. Entonces, su código existente funcionaría si me.lon y me.lat se convirtieran en grados (divididos por 180, multiplicados por 3.1416). La hora aún debe convertirse a UTC.
codificador azul
codificador azul
andyshan
andyshan
UH oh
UH oh
Topos()
en mi script. Agregué subsat por diversión. ¡Buena suerte!Cazador de bits
codificador azul
codificador azul
codificador azul
codificador azul
codificador azul