Program Listing for File AlignBase.hpp

Return to documentation for file (src/navtk/inertial/AlignBase.hpp)

#pragma once

#include <navtk/aspn.hpp>
#include <navtk/filtering/containers/ImuModel.hpp>
#include <navtk/filtering/containers/NavSolution.hpp>
#include <navtk/inertial/ImuErrors.hpp>
#include <navtk/tensors.hpp>

namespace navtk {
namespace inertial {

enum class MotionNeeded {
    NO_MOTION,
    MOTION_NEEDED,
    ANY_MOTION
};

class AlignBase {
public:
    enum class AlignmentStatus {
        ALIGNING_COARSE,
        ALIGNING_FINE,
        ALIGNED_GOOD
    };

    enum class CovarianceFormat {
        PINSON15NEDBLOCK,
        PINSON21NEDBLOCK,
    };

public:
    virtual ~AlignBase() = default;

    AlignBase(bool supports_static,
              bool supports_dynamic,
              const filtering::ImuModel& model = filtering::stim300_model());

    AlignBase(const AlignBase& other) = default;

    AlignBase(AlignBase&& other) = default;

    AlignBase& operator=(const AlignBase& other) = default;

    AlignBase& operator=(AlignBase&& other) = default;

    virtual AlignmentStatus process(std::shared_ptr<aspn_xtensor::AspnBase> message) = 0;

    bool requires_dynamic();

    AlignmentStatus check_alignment_status();

    virtual std::pair<bool, filtering::NavSolution> get_computed_alignment() const;

    virtual std::pair<bool, Matrix> get_computed_covariance(
        const CovarianceFormat format = CovarianceFormat::PINSON15NEDBLOCK) const;

    virtual std::pair<bool, ImuErrors> get_imu_errors() const;

    virtual MotionNeeded motion_needed() const = 0;

protected:
    Matrix bias_stats_from_model(
        const CovarianceFormat format = CovarianceFormat::PINSON15NEDBLOCK) const;

    AlignmentStatus alignment_status = AlignmentStatus::ALIGNING_COARSE;

    std::pair<bool, filtering::NavSolution> computed_alignment;

    std::vector<aspn_xtensor::MeasurementImu> align_buffer;

    std::vector<aspn_xtensor::MeasurementPosition> gps_buffer;

    bool supports_static;

    bool supports_dynamic;

    filtering::ImuModel model;
};

}  // namespace inertial
}  // namespace navtk