Program Listing for File Inertial.hpp

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

#pragma once

#include <memory>

#include <navtk/inertial/AidingAltData.hpp>
#include <navtk/inertial/ImuErrors.hpp>
#include <navtk/inertial/InertialPosVelAtt.hpp>
#include <navtk/inertial/Mechanization.hpp>
#include <navtk/inertial/MechanizationOptions.hpp>
#include <navtk/inertial/MechanizationStandard.hpp>
#include <navtk/inertial/StandardPosVelAtt.hpp>
#include <navtk/inertial/WanderPosVelAtt.hpp>
#include <navtk/inertial/mechanization_standard.hpp>
#include <navtk/not_null.hpp>
#include <navtk/tensors.hpp>

namespace navtk {
namespace inertial {

using MechanizationFunction = std::function<not_null<std::shared_ptr<InertialPosVelAtt>>(
    const Vector3& dv,
    const Vector3& dth,
    const double dt,
    const not_null<std::shared_ptr<InertialPosVelAtt>> ref,
    const not_null<std::shared_ptr<InertialPosVelAtt>> old_ref,
    const MechanizationOptions& options,
    AidingAltData* aiding_alt_data)>;

class Inertial final {

public:
    explicit Inertial(const not_null<std::shared_ptr<InertialPosVelAtt>> start_pva =
                          std::make_shared<StandardPosVelAtt>(),
                      const MechanizationOptions& mech_options = MechanizationOptions{},
                      MechanizationFunction mech_fun =
                          static_cast<not_null<std::shared_ptr<InertialPosVelAtt>> (*)(
                              const Vector3&,
                              const Vector3&,
                              const double,
                              const not_null<std::shared_ptr<InertialPosVelAtt>>,
                              const not_null<std::shared_ptr<InertialPosVelAtt>>,
                              const MechanizationOptions&,
                              AidingAltData* aiding_alt_data)>(mechanization_standard));

    explicit Inertial(not_null<std::shared_ptr<Mechanization>> mech_class,
                      const not_null<std::shared_ptr<InertialPosVelAtt>> start_pva =
                          std::make_shared<StandardPosVelAtt>(),
                      const MechanizationOptions& mech_options = MechanizationOptions{});

    Inertial(const Inertial& ins);

    Inertial& operator=(const Inertial& ins);

    Inertial(Inertial&&) = default;

    Inertial& operator=(Inertial&&) = default;

    ~Inertial() noexcept = default;

    void reset(const not_null<std::shared_ptr<InertialPosVelAtt>> new_pva,
               const std::shared_ptr<InertialPosVelAtt> old_pva = nullptr);

    void reset(StandardPosVelAtt new_pva);

    void reset(WanderPosVelAtt new_pva);

    not_null<std::shared_ptr<InertialPosVelAtt>> get_solution() const;

    Vector3 get_gyro_biases() const;

    void set_gyro_biases(Vector3 gyro_biases);

    Vector3 get_gyro_scale_factors() const;

    void set_gyro_scale_factors(Vector3 gyro_scale_factors);

    Vector3 get_accel_biases() const;

    void set_accel_biases(Vector3 accel_biases);

    Vector3 get_accel_scale_factors() const;

    void set_accel_scale_factors(Vector3 accel_scale_factors);

    void set_imu_errors(const ImuErrors& errors);

    void mechanize(const aspn_xtensor::TypeTimestamp& time,
                   const Vector3& accel_meas,
                   const Vector3& gyro_meas,
                   AidingAltData* aiding_alt_data = nullptr);
    double integrated_alt_error;

private:
    not_null<std::shared_ptr<InertialPosVelAtt>> pva;
    not_null<std::shared_ptr<InertialPosVelAtt>> pva_old1;
    Vector3 gyro_bias;
    Vector3 gyro_scale_factor;
    Vector3 accel_bias;
    Vector3 accel_scale_factor;
    MechanizationFunction _mech_fun;
    MechanizationOptions _mech_options;

    void apply_error_model(double dt);
    Vector3 dv_cpy;
    Vector3 dth_cpy;
};

}  // namespace inertial
}  // namespace navtk