Program Listing for File lander_gnc_app.h

Return to documentation for file (applications/lander/lander_gnc_app.h)

#pragma once

#include <string>
#include <vector>

#include "lupnt/applications/application.h"
#include "lupnt/core/config.h"
#include "lupnt/core/definitions.h"

namespace lupnt {

  struct LanderGncConfig {
    std::string start_epoch_utc = "2027-03-01T00:00:00";
    double duration_s = 300.0;
    double dt_s = 0.5;

    double descent_start_east_m = -2500.0;
    double descent_start_north_m = 400.0;
    double descent_end_east_m = 0.0;
    double descent_end_north_m = 0.0;
    double descent_start_alt_m = 2000.0;
    double descent_end_alt_m = 15.0;
    double descent_heading_deg = 0.0;

    MatXd ref_traj_enu;
  };

  class LanderGncApp : public Application {
  public:
    LanderGncApp() = default;
    explicit LanderGncApp(Config& config);

    void SetReferenceTrajectoryEnu(const MatXd& ref_traj_enu) { cfg_.ref_traj_enu = ref_traj_enu; }

    void Setup() override;
    void Step(Real t) override;
    void Log(Real /*t*/) override {}

    void EnsureInitialized();

    // ---- Truth accessors (valid after EnsureInitialized) ----------------------
    int N() const { return N_; }
    double dt() const { return dt_; }
    const Vec3d& TruthPos(int k) const { return r_truth_[k]; }
    const Vec3d& TruthVel(int k) const { return v_truth_[k]; }
    const Mat3d& TruthAtt(int k) const { return R_truth_[k]; }
    const Vec3d& SpecificForce(int k) const { return f_body_truth_[k]; }
    const Vec3d& AngularRate(int k) const { return w_body_truth_[k]; }
    double Altitude(int k) const { return Alt_[k]; }
    Vec3d EnuTruth(int k) const { return Vec3d(Ee_[k], Nn_[k], Uu_[k]); }

    const LanderGncConfig& config() const { return cfg_; }
    const MatXd& traj_enu_truth() const { return traj_enu_truth_; }
    const VecXd& alt_truth() const { return alt_truth_res_; }

  private:
    void InitScenario();
    void WriteLanderState(int k);

    LanderGncConfig cfg_;
    bool initialized_ = false;
    int N_ = 0;
    double dt_ = 0.5;

    // Local ENU tangent frame (from the shared World).
    Mat3d R_enu2pa_ = Mat3d::Identity();
    Vec3d up_hat_pa_ = Vec3d::UnitZ();

    // Truth trajectory.
    std::vector<double> Ee_, Nn_, Uu_, Alt_;
    std::vector<Vec3d> r_truth_, v_truth_;
    std::vector<Mat3d> R_truth_;
    std::vector<Vec3d> f_body_truth_, w_body_truth_;

    MatXd traj_enu_truth_;
    VecXd alt_truth_res_;
  };

}  // namespace lupnt