Skip to content

File Spacecraft.hpp

File List > astrea > astro > astro > platforms > vehicles > Spacecraft.hpp

Go to the documentation of this file

#pragma once

#include <string>

#include <units/units.hpp>

#include <astro/astro.fwd.hpp>
#include <astro/platforms/Vehicle.hpp>
#include <astro/platforms/thrusters/Thruster.hpp>
#include <astro/state/StateHistory.hpp>

namespace astrea {
namespace astro {

class Spacecraft : public ThrusterPlatform {

  public:
    Spacecraft() { generate_id(); };

    Spacecraft(const GeneralPerturbations& gp, const AstrodynamicsSystem& sys);

    virtual ~Spacecraft() = default;

    bool operator==(const Spacecraft& other) const;

    RadiusVector<frames::earth::icrf> get_inertial_position(const Date& date) const override;

    VelocityVector<frames::earth::icrf> get_inertial_velocity(const Date& date) const override;

    void set_state_history(const StateHistory& history);

    void store_state(const State& state);

    State& get_initial_state() { return _stateHistory.begin()->second; }

    const State& get_initial_state() const { return _stateHistory.begin()->second; }

    StateHistory& get_state_history();

    const StateHistory& get_state_history() const;

    Mass get_mass() const;

    Unitless get_coefficient_of_drag() const;

    Unitless get_coefficient_of_lift() const;

    Unitless get_coefficient_of_reflectivity() const;

    SurfaceArea get_ram_area() const;

    SurfaceArea get_solar_area() const;

    SurfaceArea get_lift_area() const;

    std::size_t get_id() const { return _id; }

    std::string get_name() const { return _name; }

    void set_mass(const Mass& mass);

    void set_coefficient_of_drag(const Unitless& cd);

    void set_coefficient_of_lift(const Unitless& cl);

    void set_coefficient_of_reflectivity(const Unitless& cr);

    void set_ram_area(const SurfaceArea& ramArea);

    void set_solar_area(const SurfaceArea& solarArea);

    void set_lift_area(const SurfaceArea& liftArea);

    void set_name(const std::string& name);

    // I hate this
    using PayloadPlatform<Thruster>::attach_payload;
    using PayloadPlatform<Thruster>::get_payloads;

    static constexpr Mass DEFAULT_MASS = 1000.0 * astrea::detail::mass_unit; // Default mass of the spacecraft
    static constexpr Unitless DEFAULT_COEFFICIENT_OF_DRAG = 2.2 * astrea::detail::unitless; // Default coefficient of drag
    static constexpr Unitless DEFAULT_COEFFICIENT_OF_LIFT = 0.9 * astrea::detail::unitless; // Default coefficient of lift
    static constexpr Unitless DEFAULT_COEFFICIENT_OF_REFLECTIVITY =
        1.1 * astrea::detail::unitless; // Default coefficient of reflectivity
    static constexpr SurfaceArea DEFAULT_RAM_AREA = 1.0 * mp_units::pow<2>(astrea::detail::minor_distance_unit); // Default ram area
    static constexpr SurfaceArea DEFAULT_SOLAR_AREA = 1.0 * mp_units::pow<2>(astrea::detail::minor_distance_unit); // Default solar area
    static constexpr SurfaceArea DEFAULT_LIFT_AREA = 1.0 * mp_units::pow<2>(astrea::detail::minor_distance_unit); // Default lift area

  protected:
    std::size_t _id;   // Unique identifier for the spacecraft, generated from its properties
    std::string _name; // Name of the spacecraft, can be set by the user

    // Spacecraft properties
    Mass _mass                          = DEFAULT_MASS;                        
    Unitless _coefficientOfDrag         = DEFAULT_COEFFICIENT_OF_DRAG;         
    Unitless _coefficientOfLift         = DEFAULT_COEFFICIENT_OF_LIFT;         
    Unitless _coefficientOfReflectivity = DEFAULT_COEFFICIENT_OF_REFLECTIVITY; 
    SurfaceArea _ramArea                = DEFAULT_RAM_AREA;                    
    SurfaceArea _sunArea                = DEFAULT_SOLAR_AREA;                  
    SurfaceArea _liftArea               = DEFAULT_LIFT_AREA;                   

    // State history
    StateHistory _stateHistory; // History of states for the spacecraft

    void generate_id();
};

static_assert(IsUserDefinedVehicle<Spacecraft>, "Spacecraft must satisfy the IsVehicle concept");

} // namespace astro
} // namespace astrea