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:
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.
Von dem Punkt an, an dem Sie sind, müssen Sie:
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.
äh
äh
pymat
äh
pymat
äh
pymat
äh
pymat