Class SatelliteOdtsApp

Inheritance Relationships

Base Type

Class Documentation

class SatelliteOdtsApp : public lupnt::Application

Onboard distributed ISL ODTS flight application, hosted on a Spacecraft.

This is the distributed onboard filter: instead of one ground node running all N filters, each satellite runs its own (the centralized station-only alternative is the SurfaceStationManager’s GroundOdtsApp). On each scheduled Step this app:

  1. generates its OWN two-way crosslink measurements to every neighbour satellite by pulling their truth (orbit + clock) via the agent graph (Spacecraft::GetTruthStateAt),

  2. generates its surface-station aiding pseudoranges/Doppler (pulling station truth),

  3. runs its onboard Schmidt-EKF (IslOdtsApp), and

  4. at consider_exchange_interval_s, broadcasts its own posterior over the pub/sub bus (Simulation::Publish) and fuses the neighbours’ most-recently-received broadcasts into its consider blocks (Covariance-Intersection or naive overwrite). Because deliveries are scheduled events, each satellite fuses the previous exchange’s broadcasts — a deterministic one-interval latency, exactly like a real broadcast-ephemeris link.

Measurement noise is drawn independently on each satellite (a two-way link is measured on both ends), so results differ from — but are statistically consistent with — the centralized coordinator.

Public Functions

SatelliteOdtsApp() = default
explicit SatelliteOdtsApp(Config &config)
virtual void Setup() override

Initialize the application and schedule its periodic Step() calls.

Base implementation: if GetFrequency() > 0, schedules Step(t) on the owning agent’s Simulation at Event::Priority::APPLICATION, starting at t=0 with period 1/GetFrequency() seconds; otherwise logs a warning that no frequency is set. Derived classes (e.g. LanderNavApp::Setup, SurfaceStationApp::Setup) override this to additionally initialize their Filter’s time/state/covariance and dynamics/process noise callbacks before (optionally) calling the base behavior.

virtual void Step(Real t) override

Run one simulation step of this application’s mission logic at time t.

Pure virtual: derived classes implement the actual filter predict/update cycle here (e.g. LanderNavApp::Step computes a control input and logs state; the LNSS application’s Step would run the GNSS measurement-update). Invoked periodically by the Simulation event scheduled in Setup(), at the application’s configured frequency.

Parameters:

t – Current simulation time [s, since simulation epoch]

inline virtual void Log(Real) override

Log this application’s current state/diagnostics to the DataLogger.

Base implementation only emits a debug message. Called once after Setup() and thereafter from Agent::Log(t) (which forwards to application_->Log(time) each time the owning agent logs). Derived classes (e.g. LanderNavApp::Log) override this to additionally log their Filter’s state/covariance and any error metrics.

Parameters:

t – Current simulation time [s, since simulation epoch]

inline const std::string &SatName() const
inline const std::vector<std::string> &NeighborNames() const
inline const VecXd &TimeGrid() const
inline const MatXd &TruthState() const
inline const MatXd &OwnEstimate() const
inline const MatXd &OwnCovDiag() const
inline const MatXd &OwnCovFull() const
inline int NumAnchorsTotal() const

Public Static Attributes

static int kSub = 8

Protected Functions

void Initialize()
void RecordEpoch(int k)
void OnPosterior(const IslPosteriorMsg &msg)

Protected Attributes

int seed_ = 42
double dt_s_ = 60.0
double duration_s_ = 21600.0
int moon_gravity_degree_filter_ = 8
int moon_gravity_order_filter_ = 8
bool include_earth_ = true
bool include_sun_ = true
bool use_relativity_ = true
double integration_step_s_ = 60.0
double range_sigma_m_ = 1.0
double range_rate_sigma_mps_ = 1.0e-3
bool include_time_transfer_ = true
bool include_frequency_transfer_ = true
double time_transfer_sigma_m_ = 1.0
double frequency_transfer_sigma_mps_ = 1.0e-3
double pseudorange_sigma_m_ = 1.0
bool include_station_doppler_ = true
double station_doppler_sigma_mps_ = 1.0e-3
double process_accel_sigma_mps2_ = 1.0e-8
double initial_position_sigma_m_ = 200.0
double initial_velocity_sigma_mps_ = 0.1
double initial_clock_bias_sigma_s_ = 1.0e-6
double initial_clock_drift_sigma_sps_ = 1.0e-9
double consider_position_sigma_m_ = 500.0
double consider_velocity_sigma_mps_ = 0.05
double consider_clock_bias_sigma_s_ = 1.0e-6
double consider_clock_drift_sigma_sps_ = 1.0e-9
double consider_exchange_interval_s_ = 600.0
bool exchange_use_covariance_intersection_ = false
double exchange_ci_weight_ = -1.0
std::vector<std::string> neighbor_names_
std::vector<std::string> station_names_
bool initialized_ = false
Spacecraft *self_ = nullptr
std::string sat_name_
std::vector<Spacecraft*> neighbors_
std::vector<std::pair<Vec3, std::string>> stations_bf_
std::vector<double> station_mask_deg_
Ptr<IslOdtsApp> filter_
Ptr<LunaNetSatApp> host_
Ptr<JointOrbitClockDynamics> exchange_dyn_
Real epoch0_ = 0.0
int n_blk_ = 0
double next_exchange_s_ = 0.0
int total_anchors_ = 0
std::mt19937 rng_
std::map<std::string, IslPosteriorMsg> inbox_
VecXd t_grid_
MatXd truth_state_
MatXd own_est_
MatXd own_cov_diag_
MatXd own_cov_full_