Skip to content

File plugin.cpp

File List > device_rx > plugin.cpp

Go to the documentation of this file

#include "plugin.hpp"

#include "illixr/network/net_config.hpp"

#include 

using namespace ILLIXR;
using namespace ILLIXR::data_format;

[[maybe_unused]] offload_reader::offload_reader(const std::string& name, phonebook* pb)
    : threadloop{name, pb}
    , switchboard_{phonebook_->lookup_impl<switchboard>()}
    , clock_{phonebook_->lookup_impl<relative_clock>()}
    , vio_pose_reader_{switchboard_->get_buffered_reader<switchboard::event_wrapper<std::string>>("vio_pose")}
    , pose_{switchboard_->get_writer<pose::head_pose_type>("slow_pose")}
    , imu_integrator_input_{switchboard_->get_writer<imu_integrator_input>("imu_integrator_input")} {
    spdlogger(switchboard_->get_env_char("OFFLOAD_VIO_LOG_LEVEL"));
    pose::head_pose_type datum_pose_tmp{time_point{}, Eigen::Vector3f{0, 0, 0}, Eigen::Quaternionf{1, 0, 0, 0}};
    switchboard::ptr<pose::head_pose_type> datum_pose = pose_.allocate<pose::head_pose_type>(std::move(datum_pose_tmp));
    pose_.put(std::move(datum_pose));
}

ILLIXR::threadloop::skip_option offload_reader::_p_should_skip() {
    return skip_option::run;
}

void offload_reader::_p_one_iteration() {
    if (vio_pose_reader_.size() > 0) {
        auto                   buffer_ptr   = vio_pose_reader_.dequeue();
        std::string            buffer_str   = **buffer_ptr;
        std::string::size_type end_position = buffer_str.find(delimiter);
        // process the data
        vio_output_proto::VIOOutput vio_output;
        bool                        success = vio_output.ParseFromString(buffer_str.substr(0, end_position));
        if (success) {
            receive_vio_output(vio_output);
        } else {
            spdlog::get(name_)->error("[offload_vio.device_rx: Cannot parse VIO output!!");
        }
    }
}

void offload_reader::receive_vio_output(const vio_output_proto::VIOOutput& vio_output) {
    const vio_output_proto::SlowPose& slow_pose = vio_output.slow_pose();

    pose::head_pose_type datum_pose_tmp{
        time_point{std::chrono::nanoseconds{slow_pose.timestamp()}},
        Eigen::Vector3f{static_cast<float>(slow_pose.position().x()), static_cast<float>(slow_pose.position().y()),
                        static_cast<float>(slow_pose.position().z())},
        Eigen::Quaternionf{static_cast<float>(slow_pose.rotation().w()), static_cast<float>(slow_pose.rotation().x()),
                           static_cast<float>(slow_pose.rotation().y()), static_cast<float>(slow_pose.rotation().z())}};

    switchboard::ptr<pose::head_pose_type> datum_pose = pose_.allocate<pose::head_pose_type>(std::move(datum_pose_tmp));
    pose_.put(std::move(datum_pose));

    const vio_output_proto::IMUIntInput& imu_int_input = vio_output.imu_int_input();

    imu_integrator_input datum_imu_int_tmp{
        time_point{std::chrono::nanoseconds{imu_int_input.last_cam_integration_time()}},
        duration(std::chrono::nanoseconds{imu_int_input.t_offset()}),
        imu_params{
            imu_int_input.imu_params().gyro_noise(),
            imu_int_input.imu_params().acc_noise(),
            imu_int_input.imu_params().gyro_walk(),
            imu_int_input.imu_params().acc_walk(),
            Eigen::Matrix<double, 3, 1>{
                imu_int_input.imu_params().n_gravity().x(),
                imu_int_input.imu_params().n_gravity().y(),
                imu_int_input.imu_params().n_gravity().z(),
            },
            imu_int_input.imu_params().imu_integration_sigma(),
            imu_int_input.imu_params().nominal_rate(),
        },
        Eigen::Vector3d{imu_int_input.biasacc().x(), imu_int_input.biasacc().y(), imu_int_input.biasacc().z()},
        Eigen::Vector3d{imu_int_input.biasgyro().x(), imu_int_input.biasgyro().y(), imu_int_input.biasgyro().z()},
        Eigen::Matrix<double, 3, 1>{imu_int_input.position().x(), imu_int_input.position().y(), imu_int_input.position().z()},
        Eigen::Matrix<double, 3, 1>{imu_int_input.velocity().x(), imu_int_input.velocity().y(), imu_int_input.velocity().z()},
        Eigen::Quaterniond{imu_int_input.rotation().w(), imu_int_input.rotation().x(), imu_int_input.rotation().y(),
                           imu_int_input.rotation().z()}};

    switchboard::ptr<imu_integrator_input> datum_imu_int =
        imu_integrator_input_.allocate<imu_integrator_input>(std::move(datum_imu_int_tmp));
    imu_integrator_input_.put(std::move(datum_imu_int));
}

PLUGIN_MAIN(offload_reader)