Skip to content

File plugin.cpp

File List > plugins > record_imu_cam > plugin.cpp

Go to the documentation of this file

#include "plugin.hpp"

#include 
#include 
#include 
#include 
#include 

using namespace ILLIXR;
using namespace ILLIXR::data_format;

[[maybe_unused]] record_imu_cam::record_imu_cam(const std::string& name, phonebook* pb)
    : plugin{name, pb}
    , switchboard_{phonebook_->lookup_impl<switchboard>()}
    , cam_{switchboard_->get_buffered_reader<binocular_cam_type>("cam")}
    , record_data_{get_record_data_path()}
    , cam0_data_dir_{record_data_ / "cam0" / "data"}
    , cam1_data_dir_{record_data_ / "cam1" / "data"} {
    // check folder exist, if exist delete it
    boost::filesystem::remove_all(record_data_);

    // create imu0 directory
    boost::filesystem::path imu_dir = record_data_ / "imu0";
    boost::filesystem::create_directories(imu_dir);
    std::string imu_file = imu_dir.string() + "/data.csv";
    imu_wt_file_.open(imu_file, std::ofstream::out);
    imu_wt_file_ << "#timestamp [ns],w_x [rad s<-1],w_y [rad s<-1],w_z [rad s<-1],a_x [m s<-2],a_y [m s<-2],a_z [m s<-2]"
                 << std::endl;

    // create cam0 directory
    boost::filesystem::create_directories(cam0_data_dir_);
    std::string cam0_file = (record_data_ / "cam0" / "data.csv").string();
    cam0_wt_file_.open(cam0_file, std::ofstream::out);
    cam0_wt_file_ << "#timestamp [ns],filename" << std::endl;

    // create cam1 directory
    boost::filesystem::create_directories(cam1_data_dir_);
    std::string cam1_file = (record_data_ / "cam1" / "data.csv").string();
    cam1_wt_file_.open(cam1_file, std::ofstream::out);
    cam1_wt_file_ << "#timestamp [ns],filename" << std::endl;

    switchboard_->schedule<imu_type>(id_, "imu", [this](const switchboard::ptr<const imu_type>& datum, const std::size_t&) {
        this->dump_data(datum);
    });
}

void record_imu_cam::dump_data(const switchboard::ptr<const imu_type>& datum) {
    long            timestamp = datum->time.time_since_epoch().count();
    Eigen::Vector3d angular_v = datum->angular_v;
    Eigen::Vector3d linear_a  = datum->linear_a;

    // write imu0
    imu_wt_file_ << timestamp << "," << std::setprecision(17) << angular_v[0] << "," << angular_v[1] << "," << angular_v[2]
                 << "," << linear_a[0] << "," << linear_a[1] << "," << linear_a[2] << std::endl;

    // write cam0 and cam1
    switchboard::ptr<const binocular_cam_type> cam;
    cam                  = cam_.size() == 0 ? nullptr : cam_.dequeue();
    std::string cam0_img = cam0_data_dir_.string() + "/" + std::to_string(timestamp) + ".png";
    std::string cam1_img = cam1_data_dir_.string() + "/" + std::to_string(timestamp) + ".png";
    if (cam != nullptr) {
        cam0_wt_file_ << timestamp << "," << timestamp << ".png " << std::endl;
        cv::imwrite(cam0_img, cam->at(image::LEFT_EYE));
        cam1_wt_file_ << timestamp << "," << timestamp << ".png " << std::endl;
        cv::imwrite(cam1_img, cam->at(image::RIGHT_EYE));
    }
}

record_imu_cam::~record_imu_cam() {
    imu_wt_file_.close();
    cam0_wt_file_.close();
    cam1_wt_file_.close();
}

// TODO: This should come from a yaml file
boost::filesystem::path record_imu_cam::get_record_data_path() {
    boost::filesystem::path ILLIXR_DIR = boost::filesystem::current_path();
    return ILLIXR_DIR / "data_record";
}

// This line makes the plugin importable by Spindle
PLUGIN_MAIN(record_imu_cam)