File plugin.cpp
File List > offline_imu > plugin.cpp
Go to the documentation of this file
#include "plugin.hpp"
#include "illixr/data_loading.hpp"
#include "illixr/iterators/csv_iterator.hpp"
#include
using namespace ILLIXR;
using namespace ILLIXR::data_format;
inline std::map<ullong, sensor_types> read_data(std::ifstream& gt_file, const std::string& file_name) {
(void) file_name;
std::map<ullong, sensor_types> data;
for (csv_iterator row{gt_file, 1}; row != csv_iterator{}; ++row) {
ullong t = std::stoull(row[0]);
Eigen::Vector3d av{std::stod(row[1]), std::stod(row[2]), std::stod(row[3])};
Eigen::Vector3d la{std::stod(row[4]), std::stod(row[5]), std::stod(row[6])};
data[t].imu0 = {av, la};
}
return data;
}
[[maybe_unused]] offline_imu::offline_imu(const std::string& name, phonebook* pb)
: threadloop{name, pb}
, switchboard_{phonebook_->lookup_impl<switchboard>()}
, sensor_data_{load_data<sensor_types>("imu0", "offline_imu", &read_data, switchboard_)}
, sensor_data_it_{sensor_data_.cbegin()}
, imu_{switchboard_->get_writer<imu_type>("imu")}
, dataset_first_time_{sensor_data_it_->first}
, dataset_now_{0}
#ifndef __ANDROID__
, imu_cam_log_{record_logger_}
#endif
, clock_{phonebook_->lookup_impl<relative_clock>()} {
}
ILLIXR::threadloop::skip_option offline_imu::_p_should_skip() {
if (sensor_data_it_ != sensor_data_.end()) {
assert(dataset_now_ < sensor_data_it_->first);
dataset_now_ = sensor_data_it_->first;
// Sleep for the difference between the current IMU vs 1st IMU and current UNIX time vs UNIX time the component was
// init
std::this_thread::sleep_for(std::chrono::nanoseconds{dataset_now_ - dataset_first_time_} -
clock_->now().time_since_epoch());
return skip_option::run;
} else {
return skip_option::stop;
}
}
void offline_imu::_p_one_iteration() {
assert(sensor_data_it_ != sensor_data_.end());
time_point real_now(std::chrono::duration<long long, std::nano>{dataset_now_ - dataset_first_time_});
const sensor_types& sensor_datum = sensor_data_it_->second;
imu_.put(imu_.allocate<imu_type>(imu_type{real_now, (sensor_datum.imu0.angular_v), (sensor_datum.imu0.linear_a)}));
++sensor_data_it_;
}
PLUGIN_MAIN(offline_imu)