.. _program_listing_file_simulations_ephemeris_ephemeris_simulation.h: Program Listing for File ephemeris_simulation.h =============================================== |exhale_lsh| :ref:`Return to documentation for file ` (``simulations/ephemeris/ephemeris_simulation.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once #include #include #include "lupnt/conversions/frame_converter.h" #include "lupnt/core/constants.h" #include "lupnt/simulations/simulation.h" namespace lupnt { struct EphemerisOrbitConfig { double a_m = 6541.4e3; double ecc = 0.6; double inc_rad = 56.2 * RAD; double raan_rad = 0.0; double argp_rad = 90.0 * RAD; double m0_rad = 0.0; Frame coe_frame = Frame::MOON_OP; }; struct EphemerisSimulationConfig { std::string start_epoch_utc = "2027-01-01T00:00:00"; EphemerisOrbitConfig orbit; Frame propagate_frame = Frame::MOON_CI; double duration_days = 3.0; double sample_dt_s = 60.0; // Force model for the numerically propagated truth trajectory. int moon_gravity_degree = 20; int moon_gravity_order = 20; bool include_earth = true; bool include_sun = true; bool use_relativity = false; double integration_step_s = 30.0; std::vector fit_window_minutes = {60.0, 120.0, 240.0, 480.0}; int num_windows = 6; int cartesian_poly_order = 8; bool cartesian_use_keplerian_baseline = true; int cartesian_num_fourier_terms = 0; int almanac_poly_order = 1; int almanac_num_fourier_terms = 1; Frame output_frame = Frame::MOON_CI; double datasize_precision_m = 0.01; }; struct EphemerisWindowResult { double fit_window_min = 0.0; int num_params = 0; int total_bits = 0; double pos_rms_m = 0.0; double vel_rms_mps = 0.0; double pos_p95_m = 0.0; double vel_p95_mps = 0.0; }; struct EphemerisResults { VecXd t_truth_s; // Elapsed time since start_epoch_utc [s], size [N] MatXd rv_truth; // Truth Cartesian states [N x 6] in output_frame std::vector cartesian_results; std::vector almanac_results; }; // The ephemeris/almanac datasize-accuracy study is driven by `EphemerisApp` // (applications/ephemeris/ephemeris_app.h) on a thin `EphemerisManager` agent, via // `pnt.Simulation(...)`. The `EphemerisSimulationConfig`/`EphemerisResults` structs above // are the shared config/result payloads consumed by that app: for each // `fit_window_minutes` entry, `num_windows` windows are sampled across a numerically // propagated lunar-orbit truth trajectory; each ephemeris/almanac model is fit and // evaluated (RMS/95th-percentile RTN position and velocity error) on every window, and the // minimum per-parameter broadcast resolution (bit count) needed to keep the position // accuracy within `datasize_precision_m` is found by bisection -- mirroring the // accuracy/datasize trade-off studies used to size GNSS broadcast ephemeris/almanac // message formats. } // namespace lupnt