Program Listing for File lunanet_ephemeris.h

Return to documentation for file (applications/ephemeris/lunanet_ephemeris.h)

#pragma once

#include <string>
#include <vector>

#include "lupnt/conversions/frame_converter.h"
#include "lupnt/core/constants.h"
#include "lupnt/core/definitions.h"

namespace lupnt {

  struct EphemerisFitErrorStats {
    Vec4d rms_pos_m = Vec4d::Zero();    // [R, T, N, 3D] position RMS error [m]
    Vec4d rms_vel_mps = Vec4d::Zero();  // [R, T, N, 3D] velocity RMS error [m/s]
    Vec4d p95_pos_m = Vec4d::Zero();    // [R, T, N, 3D] 95th-percentile |position error| [m]
    Vec4d p95_vel_mps = Vec4d::Zero();  // [R, T, N, 3D] 95th-percentile |velocity error| [m/s]
  };

  struct EphemerisFitOptions {
    int poly_order = 8;

    bool use_keplerian_baseline = true;

    double gm = GM_MOON;

    Frame frame = Frame::MOON_CI;

    int num_fourier_terms = 0;
  };

  class LansEphemeris {
  public:
    LansEphemeris() = default;
    explicit LansEphemeris(EphemerisFitOptions options) : options_(options) {}

    VecXd Fit(const VecXd& t_s, const MatXd& rv) const;

    MatXd Eval(const VecXd& t_s, const VecXd& params) const;

    EphemerisFitErrorStats EvalError(const VecXd& t_s, const MatXd& rv_ref,
                                     const VecXd& params) const;

    int NumParams() const;

    std::vector<std::string> ParamNames() const;

    const EphemerisFitOptions& GetOptions() const { return options_; }

  private:
    EphemerisFitOptions options_;
  };

}  // namespace lupnt