Program Listing for File lunar_gnss_combined_measurement.h

Return to documentation for file (measurements/lunar_gnss_combined_measurement.h)

#pragma once

#include <utility>
#include <vector>

#include "lupnt/core/definitions.h"
#include "lupnt/measurements/gnss_measurement.h"
#include "lupnt/measurements/measurement.h"
#include "lupnt/measurements/measurement_utils.h"

namespace lupnt {

  class LunarGnssCombinedMeasurement : public MeasurementClone<LunarGnssCombinedMeasurement> {
  public:
    struct TdcpPair {
      GnssChannel current;
      GnssChannel previous;
    };

    struct Config {
      std::vector<GnssChannel> channels;
      GnssMeasurementOptions current_options;
      GnssMeasurementOptions carrier_options;
      std::vector<TdcpPair> tdcp_pairs;
      bool use_tdcp = false;
      double tdcp_sigma_m = 0.0;
      double filter_tdcp_noise_inflation_m = 0.0;
    };

    LunarGnssCombinedMeasurement() = default;
    explicit LunarGnssCombinedMeasurement(Config config) : config_(std::move(config)) {}

    const Config& GetConfig() const { return config_; }
    void SetConfig(const Config& config) { config_ = config; }

    MeasData Compute(const State& x, MatXd* H = nullptr) const override;

    // ---- Reusable model helpers (shared with truth-data generation) ----------------------

    static VecXd ComputeMeasurementVector(const State& x, const std::vector<GnssChannel>& channels,
                                          const GnssMeasurementOptions& options,
                                          MatXd* H = nullptr);

    static MatXd MeasurementCovariance(const std::vector<GnssChannel>& channels,
                                       const GnssMeasurementOptions& options);

    static std::vector<TdcpPair> MakeTdcpPairs(const std::vector<GnssChannel>& current,
                                               const std::vector<GnssChannel>& previous);

    static VecXd ComputeTdcpVector(const State& current_state, const State& previous_state,
                                   const std::vector<TdcpPair>& pairs,
                                   const GnssMeasurementOptions& options, MatXd* H = nullptr);

    static MatXd TdcpCovariance(const std::vector<TdcpPair>& pairs, double tdcp_sigma_m,
                                double filter_tdcp_inflation_m);

  private:
    static Real CarrierRangeMeters(const State& x, const GnssChannel& channel,
                                   const GnssMeasurementOptions& options, MatXd* H = nullptr);

    Config config_;
  };

}  // namespace lupnt