Skip to content

File plugin.hpp

File List > gtsam_integrator > plugin.hpp

Go to the documentation of this file

#pragma once
#include "gtsam/navigation/CombinedImuFactor.h" // Used if IMU combined is off.
#include "gtsam/navigation/ImuFactor.h"
#include "illixr/data_format/imu.hpp"
#include "illixr/phonebook.hpp"
#include "illixr/plugin.hpp"
#include "illixr/switchboard.hpp"
#include "third_party/filter.h"

using ImuBias = gtsam::imuBias::ConstantBias;

using imu_int_t = ILLIXR::data_format::imu_integrator_input;
using imu_t     = ILLIXR::data_format::imu_type;
using bias_t    = ImuBias;
using nav_t     = gtsam::NavState;
using pim_t     = gtsam::PreintegratedCombinedMeasurements;
using pim_ptr_t = gtsam::PreintegrationType*;

namespace ILLIXR {
class gtsam_integrator : public plugin {
public:
    [[maybe_unused]] gtsam_integrator(const std::string& name, phonebook* pb);
    void callback(const switchboard::ptr<const data_format::imu_type>& datum);

private:
    class pim_object {
    public:
        explicit pim_object(const imu_int_t& imu_int_input);
        ~pim_object();
        void                 reset_integration_and_set_bias(const imu_int_t& imu_int_input) noexcept;
        void                 integrate_measurement(const imu_t& imu_input, const imu_t& imu_input_next) noexcept;
        [[nodiscard]] bias_t bias_hat() const noexcept;
        [[nodiscard]] nav_t  predict() const noexcept;

    private:
        bias_t    imu_bias_;
        nav_t     nav_state_lkf_;
        pim_ptr_t pim_;
    };

    void                                      clean_imu_vec(time_point timestamp);
    void                                      propagate_imu_values(time_point real_time);
    static std::vector<data_format::imu_type> select_imu_readings(const std::vector<data_format::imu_type>& imu_data,
                                                                  const time_point time_begin, const time_point time_end);
    static data_format::imu_type interpolate_imu(const data_format::imu_type& imu_1, const data_format::imu_type& imu_2,
                                                 time_point timestamp);

    const std::shared_ptr<switchboard>    switchboard_;
    const std::shared_ptr<relative_clock> clock_;

    // IMU Data, Sequence Flag, and State Vars Needed
    switchboard::reader<data_format::imu_integrator_input> imu_integrator_input_;

    // Write IMU Biases for PP
    switchboard::writer<data_format::imu_raw_type> imu_raw_;

    std::shared_ptr<spdlog::logger> log_;

    std::vector<one_euro_filter<Eigen::Array<double, 3, 1>, double>> filters_;
    bool                                                             has_prev_ = false;
    Eigen::Matrix<double, 3, 1>                                      prev_euler_angles_;
    std::vector<data_format::imu_type>                               imu_vector_;

    // std::vector filtered_poses;

    [[maybe_unused]] time_point last_cam_time_{};
    duration                    last_imu_offset_{};

    std::unique_ptr<pim_object> pim_obj_;
};
} // namespace ILLIXR