Program Listing for File constellation.cc

Return to documentation for file (agents/constellation.cc)

#include "lupnt/agents/constellation.h"

#include <regex>

#include "lupnt/agents/satellite.h"
#include "lupnt/conversions/state_conversions.h"
#include "lupnt/devices/comms.h"
#include "lupnt/dynamics/numerical_orbit_dynamics.h"
#include "lupnt/states/state.h"
#include "lupnt/states/tle.h"

namespace lupnt {

  Constellation::Constellation() {}

  Constellation::Constellation(Config& config) {
    auto tle_name = config["tle"].as<std::string>();
    name_ = config["name"].as<std::string>();
    for (auto tle : TLE::FromFile(tle_name)) {
      // Classical Orbital Elements
      Real T = SECS_DAY / tle.mean_motion;
      Real a = pow((T * T * GM_EARTH) / (4.0 * PI * PI), 1.0 / 3.0);
      Real e = tle.eccentricity;
      Real i = tle.inclination * RAD;
      Real Omega = tle.raan * RAD;
      Real w = tle.arg_perigee * RAD;
      Real rad_per_sec = tle.mean_motion * 2 * PI / SECS_DAY;
      Real dt = GetLupntEpoch() - tle.epoch_tai;
      Real M = WrapToPi(tle.mean_anomaly * RAD + rad_per_sec * dt);

      // State and Dynamics
      State coe = ClassicalOE({a, e, i, Omega, w, M}, Frame::GCRF);
      State rv = ClassicalToCart(coe, GM_EARTH);
      auto dyn = MakePtr<CartesianTwoBodyDynamics>(GM_EARTH);
      Config attitude_config(config["attitude_dynamics"]);
      auto attitude_dyn = MakePtr<FixedPointingDynamics>(attitude_config);
      Real frequency = config["frequency"].as<Real>();
      std::string name = name_ + "/" + std::regex_replace(tle.name, std::regex(" "), "_");

      // Devices
      auto gnss_transmitter = MakePtr<Transmitter>();
      gnss_transmitter->SetName(name + "/gnss_transmitter");

      // Satellite
      auto sat = MakePtr<Satellite>();
      sat->SetTime(0.0);
      sat->SetState(rv);
      sat->SetAttitude(Attitude(Vec4(1.0, 0.0, 0.0, 0.0), Vec3(0.0, 0.0, 0.0), Frame::GCRF));
      sat->SetName(name);
      sat->SetFrequency(frequency);
      sat->SetDynamics(std::move(dyn));
      sat->AddDevice(std::move(gnss_transmitter));
      sat->SetAttitudeDynamics(std::move(attitude_dyn));

      satellites_.push_back(std::move(sat));
    }
  }

  void Constellation::Setup() {
    for (auto& sat : satellites_) sat->Setup();
  }

  void Constellation::Step(Real time) {
    for (auto& sat : satellites_) sat->Step(time);
  }

  void Constellation::SetSimulation(Simulation* sim) {
    sim_ = sim;
    for (auto& sat : satellites_) sat->SetSimulation(sim);
  }

}  // namespace lupnt