Use SGP4 Propagator for GPS #770

Merged
muellerr merged 33 commits from use-sgp4-propagator into main 2023-08-14 15:47:33 +02:00
Showing only changes of commit 8e2c6a95e0 - Show all commits

View File

@ -130,25 +130,44 @@ class MathOperations {
double b = 6356752.3142; // semiminor axis [m] double b = 6356752.3142; // semiminor axis [m]
// Calculation // Calculation
sif::debug << "ECEF = [" << vector[0] << "," << vector[1] << "," << vector[2] << "]"
<< std::endl;
double e2 = 1 - pow(b, 2) / pow(a, 2); double e2 = 1 - pow(b, 2) / pow(a, 2);
sif::debug << "e2 = " << e2 << std::endl;
double epsilon2 = pow(a, 2) / pow(b, 2) - 1; double epsilon2 = pow(a, 2) / pow(b, 2) - 1;
sif::debug << "epsilon2 = " << epsilon2 << std::endl;
double rho = sqrt(pow(vector[0], 2) + pow(vector[1], 2)); double rho = sqrt(pow(vector[0], 2) + pow(vector[1], 2));
sif::debug << "rho = " << rho << std::endl;
double p = std::abs(vector[2]) / epsilon2; double p = std::abs(vector[2]) / epsilon2;
sif::debug << "p = " << p << std::endl;
double s = pow(rho, 2) / (e2 * epsilon2); double s = pow(rho, 2) / (e2 * epsilon2);
sif::debug << "s = " << s << std::endl;
double q = pow(p, 2) - pow(b, 2) + s; double q = pow(p, 2) - pow(b, 2) + s;
sif::debug << "q = " << q << std::endl;
double u = p / sqrt(q); double u = p / sqrt(q);
sif::debug << "u = " << u << std::endl;
double v = pow(b, 2) * pow(u, 2) / q; double v = pow(b, 2) * pow(u, 2) / q;
sif::debug << "v = " << v << std::endl;
double P = 27 * v * s / q; double P = 27 * v * s / q;
sif::debug << "P = " << P << std::endl;
double Q = pow(sqrt(P + 1) + sqrt(P), 2. / 3.); double Q = pow(sqrt(P + 1) + sqrt(P), 2. / 3.);
sif::debug << "Q = " << Q << std::endl;
double t = (1 + Q + 1 / Q) / 6; double t = (1 + Q + 1 / Q) / 6;
sif::debug << "t = " << t << std::endl;
double c = sqrt(pow(u, 2) - 1 + 2 * t); double c = sqrt(pow(u, 2) - 1 + 2 * t);
sif::debug << "c = " << c << std::endl;
double w = (c - u) / 2; double w = (c - u) / 2;
double d = sif::debug << "w = " << w << std::endl;
sign(vector[2]) * sqrt(q) * (w + sqrt(sqrt(pow(t, 2) + v) - u * w - t / 2 - 1 / 4)); double d = sign(vector[2]) * sqrt(q) * (w + sqrt(sqrt(pow(t, 2) + v) - u * w - t / 2 - 1 / 4));
sif::debug << "d = " << d << std::endl;
double N = a * sqrt(1 + epsilon2 * pow(d, 2) / pow(b, 2)); double N = a * sqrt(1 + epsilon2 * pow(d, 2) / pow(b, 2));
sif::debug << "N = " << N << std::endl;
latitude = asin((epsilon2 + 1) * d / N); latitude = asin((epsilon2 + 1) * d / N);
sif::debug << "latitude = " << latitude << std::endl;
altitude = rho * cos(latitude) + vector[2] * sin(latitude) - pow(a, 2) / N; altitude = rho * cos(latitude) + vector[2] * sin(latitude) - pow(a, 2) / N;
sif::debug << "altitude = " << altitude << std::endl;
longitude = atan2(vector[1], vector[0]); longitude = atan2(vector[1], vector[0]);
sif::debug << "longitude = " << longitude << std::endl;
} }
static void dcmEJ(timeval time, T1 *outputDcmEJ, T1 *outputDotDcmEJ) { static void dcmEJ(timeval time, T1 *outputDcmEJ, T1 *outputDotDcmEJ) {