Program Listing for File world.h

Return to documentation for file (simulations/world.h)

#pragma once

#include <string>

#include "lupnt/core/config.h"
#include "lupnt/core/definitions.h"
#include "lupnt/core/object.h"
#include "lupnt/interfaces/lola_dem.h"
#include "lupnt/states/state.h"

namespace lupnt {

  class Simulation;
  class NBodyDynamics;

  class World : public Object<World> {
  public:
    World() = default;

    explicit World(Config& world_config);

    void SetSimulation(Simulation* sim) { sim_ = sim; }

    Real GetEpoch() const { return epoch_; }
    Frame GetFrame() const { return frame_; }
    const Config& GetForceModel() const { return force_model_; }
    bool HasForceModel() const { return has_force_model_; }

    Ptr<NBodyDynamics> MakeDynamics() const;

    Ptr<NBodyDynamics> MakeDynamics(double cr, double area_m2, double mass_kg) const;

    Ptr<NBodyDynamics> MakeTruthDynamics() const;

    const Config& GetPlasma() const { return plasma_; }
    bool HasPlasma() const { return has_plasma_; }

    double GetGM() const { return gm_; }
    Vec3d Gravity(const Vec3d& r) const;

    bool HasTerrain() const { return has_dem_; }
    const LunarDem& GetDem() const { return dem_; }
    double GetElevation(double east_m, double north_m) const;
    Vec3d EnuToWorld(double east_m, double north_m, double up_m) const;
    const Mat3d& REnuToWorld() const { return R_enu2world_; }
    const Vec3d& SiteCenterWorld() const { return r_center_world_; }
    double SiteLatDeg() const { return site_lat_deg_; }
    double SiteLonDeg() const { return site_lon_deg_; }

    Cart6 GetStateAt(const std::string& agent_name, Real t) const;

  private:
    Simulation* sim_ = nullptr;
    Real epoch_ = 0.0;
    Frame frame_ = Frame::MOON_CI;

    // Orbital force model.
    bool has_force_model_ = false;
    Config force_model_;  // NBodyDynamics-style force-model block

    // Ionosphere/plasmasphere signal-delay environment (shared truth property).
    bool has_plasma_ = false;
    Config plasma_;  // `plasma:` block; schema consumed by the GNSS ODTS app

    // Point-mass gravity (surface INS).
    double gm_ = 0.0;  // set from `gravity.body` (default MOON) in the constructor

    // Terrain / DEM (surface scenarios).
    bool has_dem_ = false;
    LunarDem dem_;
    double dem_cx_ = 0.0, dem_cy_ = 0.0;     // DEM native center coords
    Vec3d r_center_world_ = Vec3d::Zero();   // ENU origin in the world frame
    Mat3d R_enu2world_ = Mat3d::Identity();  // ENU -> world rotation
    double site_lat_deg_ = 0.0, site_lon_deg_ = 0.0;
  };

}  // namespace lupnt