24 const std::string& transformIdentifier,
const std::string& timeString,
25 const bool saveCovarianceFlag) {
26 if (fileStreams.find(transformIdentifier) == fileStreams.end()) {
28 const std::string stateFileName = savePath + timeString +
"/" + transformIdentifier +
".csv";
32 fileStreams[transformIdentifier].open(stateFileName, std::ofstream::out | std::ofstream::app);
34 fileStreams[transformIdentifier] <<
"time, x, y, z, quat_x, quat_y, quat_z, quat_w, roll, pitch, yaw\n";
36 if (saveCovarianceFlag) {
37 const std::string covarianceFileName = savePath + timeString +
"/" + transformIdentifier +
"_covariance.csv";
40 fileStreams[transformIdentifier +
"_covariance"].open(covarianceFileName, std::ofstream::out | std::ofstream::app);
42 fileStreams[transformIdentifier +
"_covariance"] <<
"time, cov_t1_t1, cov_t1_t2, cov_t1_t3, cov_t1_r1, cov_t1_r2, cov_t1_r3, "
43 "cov_t2_t1, cov_t2_t2, cov_t2_t3, cov_t2_r1, cov_t2_r2, cov_t2_r3, "
44 "cov_t3_t1, cov_t3_t2, cov_t3_t3, cov_t3_r1, cov_t3_r2, cov_t3_r3, "
45 "cov_r1_t1, cov_r1_t2, cov_r1_t3, cov_r1_r1, cov_r1_r2, cov_r1_r3, "
46 "cov_r2_t1, cov_r2_t2, cov_r2_t3, cov_r2_r1, cov_r2_r2, cov_r2_r3, "
47 "cov_r3_t1, cov_r3_t2, cov_r3_t3, cov_r3_r1, cov_r3_r2, cov_r3_r3\n";
129 const std::string& transformIdentifier,
const double timeStamp,
const bool saveCovarianceFlag,
130 const std::optional<Eigen::Matrix<double, 6, 6>>& optionalPoseCovarianceInWorldRos) {
131 fileStreams[transformIdentifier] << std::setprecision(14) << timeStamp <<
", " << pose.x() <<
", " << pose.y() <<
", " << pose.z() <<
", "
132 << pose.rotation().toQuaternion().x() <<
", " << pose.rotation().toQuaternion().y() <<
", "
133 << pose.rotation().toQuaternion().z() <<
", " << pose.rotation().toQuaternion().w() <<
", "
134 << pose.rotation().roll() <<
", " << pose.rotation().pitch() <<
", " << pose.rotation().yaw() <<
"\n";
136 if (saveCovarianceFlag) {
137 if (!optionalPoseCovarianceInWorldRos) {
138 throw std::runtime_error(
"FileLogger: Pose covariance not provided for writing to file.");
140 const auto& poseCovarianceInWorldRos = optionalPoseCovarianceInWorldRos.value();
141 fileStreams[transformIdentifier +
"_covariance"]
142 << std::setprecision(14) << timeStamp <<
", " << poseCovarianceInWorldRos(0, 0) <<
", " << poseCovarianceInWorldRos(0, 1) <<
", "
143 << poseCovarianceInWorldRos(0, 2) <<
", " << poseCovarianceInWorldRos(0, 3) <<
", " << poseCovarianceInWorldRos(0, 4) <<
", "
144 << poseCovarianceInWorldRos(0, 5) <<
", " << poseCovarianceInWorldRos(1, 0) <<
", " << poseCovarianceInWorldRos(1, 1) <<
", "
145 << poseCovarianceInWorldRos(1, 2) <<
", " << poseCovarianceInWorldRos(1, 3) <<
", " << poseCovarianceInWorldRos(1, 4) <<
", "
146 << poseCovarianceInWorldRos(1, 5) <<
", " << poseCovarianceInWorldRos(2, 0) <<
", " << poseCovarianceInWorldRos(2, 1) <<
", "
147 << poseCovarianceInWorldRos(2, 2) <<
", " << poseCovarianceInWorldRos(2, 3) <<
", " << poseCovarianceInWorldRos(2, 4) <<
", "
148 << poseCovarianceInWorldRos(2, 5) <<
", " << poseCovarianceInWorldRos(3, 0) <<
", " << poseCovarianceInWorldRos(3, 1) <<
", "
149 << poseCovarianceInWorldRos(3, 2) <<
", " << poseCovarianceInWorldRos(3, 3) <<
", " << poseCovarianceInWorldRos(3, 4) <<
", "
150 << poseCovarianceInWorldRos(3, 5) <<
", " << poseCovarianceInWorldRos(4, 0) <<
", " << poseCovarianceInWorldRos(4, 1) <<
", "
151 << poseCovarianceInWorldRos(4, 2) <<
", " << poseCovarianceInWorldRos(4, 3) <<
", " << poseCovarianceInWorldRos(4, 4) <<
", "
152 << poseCovarianceInWorldRos(4, 5) <<
", " << poseCovarianceInWorldRos(5, 0) <<
", " << poseCovarianceInWorldRos(5, 1) <<
", "
153 << poseCovarianceInWorldRos(5, 2) <<
", " << poseCovarianceInWorldRos(5, 3) <<
", " << poseCovarianceInWorldRos(5, 4) <<
", "
154 << poseCovarianceInWorldRos(5, 5) <<
"\n";
175 const std::string& stateCategoryIdentifier,
const double timeStamp) {
176 fileStreams[stateCategoryIdentifier] << std::setprecision(14) << timeStamp <<
", " << imuBias.accelerometer().x() <<
", "
177 << imuBias.accelerometer().y() <<
", " << imuBias.accelerometer().z() <<
", "
178 << imuBias.gyroscope().x() <<
", " << imuBias.gyroscope().y() <<
", " << imuBias.gyroscope().z()