Program Listing for File orbit_utils.h¶
↰ Return to documentation for file (environment/plasma/env/orbit_utils.h)
#pragma once
#include <cmath>
#include <filesystem>
#include <string>
#include <vector>
#include "lupnt/environment/plasma/core/definitions.h"
#include "lupnt/environment/plasma/gcpm/constants_gcpm.h"
namespace pecsim {
class Satellite {
public:
int id_; // Satellite ID (PRN)
Vec6d posvel_; // Position in ECEF coordinates [km]
Vec6d coe_; // Classical orbital elements (a, e, i, Omega, w, M)
double epoch_utc_; // Epoch in UTC seconds (since J2000 epoch)
double GM_ = 3.986004418e5; // Gravitational constant for Earth [km^3/s^2]
Satellite(int id, const Vec6d& coe, double epoch_utc, double GM = GM_EARTH);
void propagate(double epoch_utc_new);
Vec3d get_pos() const; // Get position in ECI coordinates [km]
Vec3d get_pos_epoch(double dt); // Propagate position by time dt [s]
};
// Math utils
double wrap2pi(double angle); // Wrap angle to [0, 2*pi)
Mat3d RotXd(double angle);
Mat3d RotYd(double angle); // Passive rotation matrix about the y-axis
Mat3d RotZd(double angle); // Passive rotation matrix about the z-axis
// Anomalies
double ecc2true(double E,
double e); // Convert eccentric anomaly to true anomaly
double ecc2mean(double E, double e);
double mean2ecc(double M, double e);
double mean2true(double M, double e);
double true2ecc(double nu, double e);
double true2mean(double nu, double e);
Vec6d coe2cart(const Vec6d& coe, double GM);
Vec6d cart2coe(const Vec6d& rv, double GM);
// Orbit conversions
Vec6d coe2cart(const Vec6d& coe, double GM);
Vec6d cart2coe(const Vec6d& posvel, double GM);
Vec6d propagate_coe(const Vec6d& coe, double GM,
double dt); // Propagate COE
// visibility
bool compute_vis(const Vec3d& pos1, const Vec3d& pos2, double radius, double max_angle);
double compute_min_altitude(const Vec3d& pos1, const Vec3d& pos2, double radius);
Vec3d solve_lt(Satellite sat, const Vec3d& rx_pos,
double epoch_utc_rx); // Solve light time for txpos
// satellite
std::vector<Satellite> setup_gnss_constellation(std::string filename);
} // namespace pecsim