Bodenlänge/-breite unter einem Satelliten (kartesische Koordinaten) zu einer bestimmten Epoche

Das Skript, das ich entwickeln möchte, verwendet die kartesischen Koordinaten (XYZ) eines Satelliten, und in Verbindung mit der Entfernung, der Höhe und dem Azimut eines Standorts nehme ich dann die Orbitalinformationen eines Satelliten und erhalte den Längen-/Breitengrad des Bodens unter diesem Satelliten zu einer bestimmten Zeit.

Noch einen Schritt weiter: Stellen Sie sich das Signal eines Satelliten vor, der genau 300 km über dem Meeresspiegel die Atmosphäre durchdringt. An diesem bestimmten Punkt, wenn die Höhe 300 km beträgt, muss ich den Längen-/Breitengrad des Bodens berechnen.

Im pyephem-Modul scheint es bereits eine Methode (ephem.readtle) zu geben, die dies erreichen kann, jedoch nur für TLE-Daten (zweizeilige Elemente). Ich möchte die kartesischen Koordinaten eines Satelliten verwenden, um dies zu entwickeln. Gibt es so eine Methode schon? Oder vielleicht kann mich jemand mit Erfahrung in diesem Bereich in die richtige Richtung weisen.

Eine ähnliche Frage existiert bereits in Bezug auf ECEF von Azimuth, Elevation, Range und Observer Lat,Lon,Alt , aber es ist nicht dasselbe Problem.

Folgendes habe ich bereits entwickelt:

  • kartesische Satellitenkoordinaten, XYZ
  • Azimut, Elevation und Reichweite des Satelliten von der Bodenstation
  • Bodenstationskoordinaten in Lat, Long, Höhe über dem Meeresspiegel

Folgendes brauche ich: Bodenlänge/-breite unter einem Satelliten zu einer bestimmten Epoche und insbesondere dort, wo der Durchstoßpunkt in der Atmosphäre (der Punkt, an dem das Signal des Satelliten die Atmosphäre durchdringt) in 300 km Höhe liegt.


Ok, also habe ich das Problem mit der Lösung für Bodenspuren für Höhen von 300 km noch nicht gelöst, aber ich glaube, die Methode, die ich geschrieben habe, um XYZ in Ellipsoid umzuwandeln, ist vollständig:

 def cartesian_to_ellipsoidal(self):
    x = 4433469.9438
    y = 362672.7267
    z = 4556211.6409
    r = np.sqrt(x**2 + y**2 + z**2)

    # WGS-84 PARAMETERS, semimajor and semiminor axis
    a = 6378137.0
    b = 6356752.314 

    # Eccentricity
    e_squared = (a**2 - b**2) / a**2

    # Auxiliary quantities
    p = np.sqrt(x**2 + y**2)

    # Latitude (phi) & Longitude (lam)
    phi = np.rad2deg(np.arctan(z / ((1- e_squared) * p)))
    lam = np.rad2deg(np.arctan(y/x))

    # Radius of curvature in prime vertical               
    N = a / np.sqrt(1 - e_squared * (np.sin(np.deg2rad(phi)))**2)

    # Altitude
    h = (p / np.cos(np.deg2rad(phi))) - N

    return lam, phi, h

Die XYZ-Koordinaten wurden als Beispiel aus diesem mit Matlab bearbeiteten Beispiel mit Matlab bearbeiteten Beispiel genommen . Die Ergebnisse sind mit einer Genauigkeit, mit der ich zufrieden bin. Was ich nicht verstehe und vielleicht eine dumme Frage, aber wenn eine Bodenspur zusammen mit der Höhe berechnet wird, warum ist die Höhe nicht Null? Da eine Bodenspur auf die Erdoberfläche abgebildet wird, würde man erwarten, dass die Höhe null sein sollte.

Ein letzter Punkt: Die gewünschte Bodenspur war dort, wo die Linie zwischen dem Satelliten und der Bodenstation die Amosphäre 300 km über der Erde durchdringt. Würde dann eine Anpassung meines Codes - nur um das gewünschte 300-km-Höhenszenario zu kompensieren - in Anbetracht von Entfernungen von 20000 km (26000 km Radius) das Ergebnis stark verändern? Wenn nicht, können Bodenspurdaten ausreichen.

Wenn Sie kartesisch sagen, meinen Sie damit erdzentrierte Trägheitskoordinaten? Und Sie wollen den Lat/Lon direkt unter dem Satelliten finden? Ziehen Sie einfach eine Linie vom Erdmittelpunkt zum Satelliten, finden Sie heraus, wo die Linie die Oberfläche schneidet (und 300 km über der Oberfläche)? Wenn XYZ von den TLEs kommen, wozu dient die Bodenstation?
Fragen zu Skyfield finden Sie hier und hier und auch auf der Website . Es ist einfach zu bedienen!
@uhoh, ja ECEF. Ich würde gerne die Bodenspur des Satelliten im lon / lat-Rahmen finden, aber anstatt des Satelliten selbst den Punkt, an dem sich die Linie vom Satelliten zum Empfänger 300 km über der Erde schneidet. XYZ stammen nicht von den TLEs, sondern von meinem eigenen Python-Skript über Satelliten-Ephemeriden.
Oh, ich verstehe jetzt - wo die Leitung vom Satelliten zur Bodenstation 300 km Höhe durchdringt. Das XYZ des Satelliten ist also in erdzentrierten erdfesten (ECEF = rotierenden) Koordinaten oder erdzentrierten Trägheitskoordinaten (ECI = nicht rotierend)?
ECEF. Ich habe bereits eine XYZ-Koordinate des Satelliten, plus Höhe, Azimut und Entfernung. Ich denke, dass dies einige Trigger erfordern wird, um die gewünschte Ausgabe zu erhalten.
Ist eine Genauigkeit von +/- 10 km in Ordnung (kugelförmige Erde) oder müssen Sie die Abflachung berücksichtigen - etwa 20 km Unterschied zwischen Pol und Äquator. Die Mathematik wird etwas schwieriger, wenn die Lat/Lon-Linien auf einer abgeflachten Kugel liegen. Sie können auch unter http://gis.stackexchange.com/ wirklich hilfreiche Dinge finden - schauen Sie sich dort um.
@uhoh, siehe meine geänderte Frage oben.
Können Sie versuchen, dies in eine besser (enger) definierte und kürzere Frage zu bringen, die eine klare Antwort haben kann? Hier passiert möglicherweise zu viel, um in das Q&A-Format von Stackexchange zu passen. Zumindest kommt mir das eher wie "lautes Denken" vor,
Die Koordinaten des Satelliten (sv) sind in XYZ angegeben, und der Radius von der Erde beträgt ungefähr 26000 km. Bodenspuren werden aus dem XYZ des Satelliten berechnet. Stellen Sie sich nun eine Linie vom SV zum Boden vor. Anstatt dass das SV auf dieser Linie ungefähr 20000 (26000 minus Erdradius) km entfernt ist, nehmen wir an, dass das SV auf derselben Linie liegt, aber in 300 km Höhe (wir nennen dies den Atmosphärendurchdringungspunkt). Das bedeutet, dass der sv eine Reichweite von (300 / sin e) km hat, wobei 'e' der Elevationswinkel ist. Was ich gerne wissen würde, ist die Bodenspur dieses Satelliten in dieser Entfernung (300 km über der Erde).

Antworten (1)

Von dem Punkt an, an dem Sie sind, müssen Sie:

  1. Berechnen Sie die XYZ-Koordinaten Ihrer Bodenstation
  2. Finden Sie die Linie im Raum zwischen dem Satelliten und der Bodenstation
  3. Finden Sie die XYZ-Koordinaten des Punktes am Schnittpunkt dieser Linie mit dem Ellipsoid, das durch alle Punkte mit Höhen von 300 km definiert ist
  4. Finden Sie den Breiten- und Längengrad dieses Punktes.

Für (1) können Sie diese Matlab-Funktion verwenden:

function [X,Y,Z] = ll2xyz(lat,lon,alt)
    b=6356752.3141;
    a=6378137.0;
    lat=lat*pi/180;
    %transformation between geografic and geocentric latitude
    gclat=atan(b^2*tan(lat)/a^2);
    lon=lon*pi/180;
    R=sqrt(1./(tan(gclat).^2/b^2 + 1/a^2));
    Z=R.*tan(gclat);
    Z=Z+alt.*sin(lat);
    R=R+alt.*cos(lat);
    X=R.*cos(lon);
    Y=R.*sin(lon);

Für (2) und (3) reicht diese Funktion aus

function [X Y Z] = rectaxelip(x1,x2,y1,y2,z1,z2,alt)
%rectaxelip calculates the point XYZ were a straight line that pass by points P1
%and P2, intersects a ellipsoid alt meters bigger than WGS84 
%ellispsoid (on each axis)

%The director cosines of the line are 
    d=sqrt((x1-x2).^2.*(y1-y2).^2.*(z1-z2).^2);
    L=(x1-x2)./d;
    M=(y1-y2)./d;
    N=(z1-z2)./d;
    %its parametric  for is
    %x = x1 + L * t
    %y = y1 + M * t
    %z = z1 + N * t
    %Now we look for the intersection
    %the ellipsoid would have axes bp and ap

    b=6356752.3141; 
    a=6378137.0;
    bp=b+alt; 
    ap=a+alt;

    %The equation of such ellipsod would be
    %  x^2/ap^2+y^2/ap^2+z^2/bp^2=1
    %subtituting and reorganizng you get a quadratic equation like
    %   A x^2 + B x + C = 0
    %with
    A=(L./ap).^2+(M./ap).^2+(N./bp).^2;
    B=2*((x1.*L./(ap.^2))+(y1.*M./(ap.^2))+(z1.*N./(bp.^2)));
    C=((x1./ap).^2+(y1./ap).^2+(z1./bp).^2)-1;
    ta=(-B+sqrt(B.^2 - (4*A.*C)))./(2*A);
    tb=(-B-sqrt(B.^2 - (4*A.*C)))./(2*A);

    %then
    x1a = x1 + L .* ta;
    y1a = y1 + M .* ta;
    z1a = z1 + N .* ta;
    x1b = x1 + L .* tb;
    y1b = y1 + M .* tb;
    z1b = z1 + N .* tb;
    %Now the distance from each point to the satellite is
    da=sqrt((x1a-x2).^2+(y1a-y2).^2+(z1a-z2).^2);
    db=sqrt((x1b-x2).^2+(y1b-y2).^2+(z1b-z2).^2);
    ESta=da<db;
    t=ta.*ESta+tb.*(~ESta);

    %then
    X = x1 + L .* t;
    Y = y1 + M .* t;
    Z = z1 + N .* t;

Und für (4) brauchen Sie nur eine Funktion, die Lat-Lon-Koordinaten aus XYZ-Positionen berechnet, und diese würde es tun:

function [lat,lon,alt] = xyz2ll(x,y,z1)
%For some reason the error spikes at +-45
a=6356752.3141; 
b=6378137.0;

signos=sign(z1);
z1=-abs(z1);

lon=atan2(y,x)*180/pi; %Longitude
d1=sqrt(x.^2+y.^2);
z2=-sqrt(1./((1/(a^2))+(1./(b^2*(z1./d1).^2))));
d2=z2./(z1./d1);
p2=-a*d2./(b^2*sqrt(1-(d2.^2/(b^2)))); %slope of the tangent to the ellipse in the point
for i=1:5
    %points in the palne
    dp=(z1-z2-(d1./p2)+(p2.*d2))./(p2-(1./p2));
    zp=(p2.*dp)+z2-(p2.*d2);
    %points in the ellipse
    z2=-sqrt(1./((1/(a^2))+(1./(b^2*(zp./dp).^2))));
    d2=z2./(zp./dp);
    p2=-a*d2./(b^2*sqrt(1-(d2.^2/(b^2))));
end
lat=-90-(atan(p2)*180/pi);   %geographic latitude
lat=abs(lat).*signos;
ecuador=find(abs(z1)<0.001);
lat(ecuador)=0;
alt=sqrt(d1.^2+z1.^2)-sqrt(d2.^2+z2.^2);
alt(ecuador)=d1(ecuador)-a;

Und dann sind Sie bereit und haben die Bodenposition des Punktes, an dem das GPS-Signal, das die Basisstation erreicht, die 300 km Höhe überquert.

Ich habe diese Funktionen selbst geschrieben und ausgiebig getestet, damit ich weiß, dass sie funktionieren, aber seien Sie sich bewusst, dass die letzte Funktion trotz ihrer sehr guten Genauigkeit aus einem Grund, den ich nicht viel untersucht habe, große Fehler bei Breitengraden zu erzeugen scheint von +-45°.

Das Letzte, was zu beachten ist. Wenn Sie mehr Genauigkeit wünschen und die Berechnung der XYZ-Koordinaten der GPS-Satelliten vermeiden möchten, können Sie die sp3-Ephemeridendateien verwenden. Sie können hier einfach heruntergeladen werden . Es gibt eine Datei pro Tag, und jede Datei enthält die XYZ-Positionen jedes Satelliten, die alle 15 Minuten tabelliert werden. Um jederzeit Positionen zu erhalten, bietet die Spline-Interpolation eine sehr gute Lösung, ziemlich genau die gleiche wie die empfohlene Polynom-Interpolation nach Neville.

Wenn Sie sagen "das Ellipsoid, das durch alle Punkte mit Höhen von 300 km definiert ist", wie "wachsen" Sie das WGS84-Ellipsoid um 300 km Höhe? Was mich interessiert, ist, ob sich jeder Punkt auf WGS84 auf einer lokalen Ellipsoidnormale oder radial vom Erdmittelpunkt weg oder entlang eines lokalen Schwerkraftgradienten ("nach oben") bewegt? Wenn Sie auch eine Antwort auf Was ist das Fischer 1960 Mercury Ellipsoid und warum heißt es so? mit etwas historischem bezug wäre das super! Ich liebe deine Antworten und ihre Geschichte ist ziemlich interessant!
@uhoh Wie Sie im Code sehen können, werden nur die 300 km zu den großen und kleinen Halbachsen hinzugefügt, die das Referenzellipsoid definieren. Und ich denke, das resultierende Ellipsoid entspricht der Oberfläche, die durch alle Punkte bei 300 km ellipsoidischer Höhe relativ zum ersten Ellipsoid definiert wird. Ellipsoidische Erhebungen wiederum werden senkrecht zur Ellipsoidoberfläche (dh Mindestabstand) gemessen, NICHT radial vom Ellipsoidzentrum NOCH unter Berücksichtigung von Schweregradienten in irgendeiner Weise. Interessante Frage, die du angesprochen hast! Aber ich verzichte diesmal auf eine Antwort, nur weil mir die Freizeit dafür fehlt. Beifall
Ah! Endlich ist mir klar geworden, was mich daran immer wieder verwirrt. "...mit dem Ellipsoid definiert durch..." Die resultierende Fläche ist kein Ellipsoid. Für kleine Änderungen würde es wahrscheinlich so aussehen, aber es kann nicht so genannt werden. Der schnellste Weg zur Überprüfung wäre, das Referenzellipsoid zu nehmen, 300 km zu Haupt- und Nebenradien hinzuzufügen, die Form eines richtigen Ellipsoids mit diesen Radien zu berechnen und dann die Differenz zu vergleichen. Wahrscheinlich nur ein paar Dutzend Meter. Trotzdem ist es besser, es nicht als Ellipsoid zu bezeichnen, wenn es keines ist.