232 std::shared_ptr<Pos> obs;
236 obs = std::make_shared<Pos>();
239 obs = std::make_shared<PosVel>();
242 obs = std::make_shared<PosVelAtt>();
250 line.erase(line.begin(), std::ranges::find_if(line, [](
int ch) { return std::isgraph(ch); }));
258 std::stringstream lineStream(line);
261 std::optional<uint16_t> gpsCycle = 0;
262 std::optional<uint16_t> gpsWeek;
263 std::optional<long double> gpsToW;
264 std::optional<double> e_position_x;
265 std::optional<double> e_position_y;
266 std::optional<double> e_position_z;
267 std::optional<double> e_positionStdDev_x;
268 std::optional<double> e_positionStdDev_y;
269 std::optional<double> e_positionStdDev_z;
270 std::optional<double> lla_position_x;
271 std::optional<double> lla_position_y;
272 std::optional<double> lla_position_z;
273 std::optional<double> n_positionStdDev_n;
274 std::optional<double> n_positionStdDev_e;
275 std::optional<double> n_positionStdDev_d;
276 std::optional<double> e_velocity_x;
277 std::optional<double> e_velocity_y;
278 std::optional<double> e_velocity_z;
279 std::optional<double> e_velocityStdDev_x;
280 std::optional<double> e_velocityStdDev_y;
281 std::optional<double> e_velocityStdDev_z;
282 std::optional<double> n_velocity_n;
283 std::optional<double> n_velocity_e;
284 std::optional<double> n_velocity_d;
285 std::optional<double> n_velocityStdDev_n;
286 std::optional<double> n_velocityStdDev_e;
287 std::optional<double> n_velocityStdDev_d;
288 std::optional<double> n_Quat_b_w;
289 std::optional<double> n_Quat_b_x;
290 std::optional<double> n_Quat_b_y;
291 std::optional<double> n_Quat_b_z;
292 std::optional<double> roll;
293 std::optional<double> pitch;
294 std::optional<double> yaw;
299 if (std::getline(lineStream, cell,
','))
302 cell.erase(std::ranges::find_if(cell, [](
int ch) {
return std::iscntrl(ch); }), cell.end());
308 if (column ==
"GpsCycle") { gpsCycle =
static_cast<uint16_t
>(std::stoul(cell)); }
309 else if (column ==
"GpsWeek") { gpsWeek =
static_cast<uint16_t
>(std::stoul(cell)); }
310 else if (column ==
"GpsToW [s]") { gpsToW = std::stold(cell); }
312 else if (column ==
"Pos ECEF X [m]") { e_position_x = std::stod(cell); }
313 else if (column ==
"Pos ECEF Y [m]") { e_position_y = std::stod(cell); }
314 else if (column ==
"Pos ECEF Z [m]") { e_position_z = std::stod(cell); }
315 else if (column ==
"Pos StdDev ECEF X [m]") { e_positionStdDev_x = std::stod(cell); }
316 else if (column ==
"Pos StdDev ECEF Y [m]") { e_positionStdDev_y = std::stod(cell); }
317 else if (column ==
"Pos StdDev ECEF Z [m]") { e_positionStdDev_z = std::stod(cell); }
319 else if (column ==
"Latitude [deg]") { lla_position_x =
deg2rad(std::stod(cell)); }
320 else if (column ==
"Longitude [deg]") { lla_position_y =
deg2rad(std::stod(cell)); }
321 else if (column ==
"Altitude [m]") { lla_position_z = std::stod(cell); }
322 else if (column ==
"Pos StdDev N [m]") { n_positionStdDev_n =
deg2rad(std::stod(cell)); }
323 else if (column ==
"Pos StdDev E [m]") { n_positionStdDev_e =
deg2rad(std::stod(cell)); }
324 else if (column ==
"Pos StdDev D [m]") { n_positionStdDev_d = std::stod(cell); }
326 else if (column ==
"X velocity ECEF [m/s]") { e_velocity_x = std::stod(cell); }
327 else if (column ==
"Y velocity ECEF [m/s]") { e_velocity_y = std::stod(cell); }
328 else if (column ==
"Z velocity ECEF [m/s]") { e_velocity_z = std::stod(cell); }
329 else if (column ==
"Vel StdDev ECEF X [m/s]") { e_velocityStdDev_x = std::stod(cell); }
330 else if (column ==
"Vel StdDev ECEF Y [m/s]") { e_velocityStdDev_y = std::stod(cell); }
331 else if (column ==
"Vel StdDev ECEF Z [m/s]") { e_velocityStdDev_z = std::stod(cell); }
333 else if (column ==
"Vel N [m/s]") { n_velocity_n = std::stod(cell); }
334 else if (column ==
"Vel E [m/s]") { n_velocity_e = std::stod(cell); }
335 else if (column ==
"Vel D [m/s]") { n_velocity_d = std::stod(cell); }
336 else if (column ==
"Vel StdDev N [m/s]") { n_velocityStdDev_n = std::stod(cell); }
337 else if (column ==
"Vel StdDev E [m/s]") { n_velocityStdDev_e = std::stod(cell); }
338 else if (column ==
"Vel StdDev D [m/s]") { n_velocityStdDev_d = std::stod(cell); }
340 else if (column ==
"n_Quat_b w") { n_Quat_b_w = std::stod(cell); }
341 else if (column ==
"n_Quat_b x") { n_Quat_b_x = std::stod(cell); }
342 else if (column ==
"n_Quat_b y") { n_Quat_b_y = std::stod(cell); }
343 else if (column ==
"n_Quat_b z") { n_Quat_b_z = std::stod(cell); }
345 else if (column ==
"Roll [deg]") { roll =
deg2rad(std::stod(cell)); }
346 else if (column ==
"Pitch [deg]") { pitch =
deg2rad(std::stod(cell)); }
347 else if (column ==
"Yaw [deg]") { yaw =
deg2rad(std::stod(cell)); }
351 if (gpsCycle.has_value() && gpsWeek.has_value() && gpsToW.has_value())
353 obs->insTime =
InsTime(gpsCycle.value(), gpsWeek.value(), gpsToW.value());
363 if (e_velocity_x.has_value() && e_velocity_y.has_value() && e_velocity_z.has_value())
365 auto lla_pos = lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value()
366 ? Eigen::Vector3d(*lla_position_x, *lla_position_y, *lla_position_z)
368 auto n_vel =
trafo::n_Quat_e(lla_pos.x(), lla_pos.y()) * Eigen::Vector3d(*e_velocity_x, *e_velocity_y, *e_velocity_z);
369 n_velocity_n = n_vel.x();
370 n_velocity_e = n_vel.y();
371 n_velocity_d = n_vel.z();
373 else if (n_velocity_n.has_value() && n_velocity_e.has_value() && n_velocity_d.has_value())
375 auto lla_pos = lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value()
376 ? Eigen::Vector3d(*lla_position_x, *lla_position_y, *lla_position_z)
378 auto e_vel =
trafo::e_Quat_n(lla_pos.x(), lla_pos.y()) * Eigen::Vector3d(*e_velocity_x, *e_velocity_y, *e_velocity_z);
379 e_velocity_x = e_vel.x();
380 e_velocity_y = e_vel.y();
381 e_velocity_z = e_vel.z();
384 if (e_position_x.has_value() && e_position_y.has_value() && e_position_z.has_value()
385 && e_velocity_x.has_value() && e_velocity_y.has_value() && e_velocity_z.has_value())
387 if (
auto posVel = std::reinterpret_pointer_cast<PosVel>(obs))
389 if (e_positionStdDev_x.has_value() && e_positionStdDev_y.has_value() && e_positionStdDev_z.has_value()
390 && e_velocityStdDev_x.has_value() && e_velocityStdDev_y.has_value() && e_velocityStdDev_z.has_value())
393 posVel->setPosVelAndCov_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() },
394 Eigen::Vector3d{ e_velocity_x.value(), e_velocity_y.value(), e_velocity_z.value() },
395 (
Eigen::Vector6d() << e_positionStdDev_x.value(), e_positionStdDev_y.value(), e_positionStdDev_z.value(),
396 e_velocityStdDev_x.value(), e_velocityStdDev_y.value(), e_velocityStdDev_z.value())
403 posVel->setPosition_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() });
404 posVel->setVelocity_e(Eigen::Vector3d{ e_velocity_x.value(), e_velocity_y.value(), e_velocity_z.value() });
408 else if (lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value()
409 && n_velocity_n.has_value() && n_velocity_e.has_value() && n_velocity_d.has_value())
411 if (
auto posVel = std::reinterpret_pointer_cast<PosVel>(obs))
413 if (n_positionStdDev_n.has_value() && n_positionStdDev_e.has_value() && n_positionStdDev_d.has_value()
414 && n_velocityStdDev_n.has_value() && n_velocityStdDev_e.has_value() && n_velocityStdDev_d.has_value())
416 posVel->setPosVelAndCov_n(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() },
417 Eigen::Vector3d{ n_velocity_n.value(), n_velocity_e.value(), n_velocity_d.value() },
418 (
Eigen::Vector6d() << n_positionStdDev_n.value(), n_positionStdDev_e.value(), n_positionStdDev_d.value(),
419 n_velocityStdDev_n.value(), n_velocityStdDev_e.value(), n_velocityStdDev_d.value())
426 posVel->setPosition_lla(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() });
427 posVel->setVelocity_n(Eigen::Vector3d{ n_velocity_n.value(), n_velocity_e.value(), n_velocity_d.value() });
433 LOG_WARN(
"{}: A PosVel/PosVelAtt file needs a position and velocity.",
nameId());
439 if (e_position_x.has_value() && e_position_y.has_value() && e_position_z.has_value())
441 if (e_positionStdDev_x.has_value() && e_positionStdDev_y.has_value() && e_positionStdDev_z.has_value())
443 obs->setPositionAndCov_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() },
444 Eigen::DiagonalMatrix<double, 3>{ e_positionStdDev_x.value(), e_positionStdDev_y.value(), e_positionStdDev_z.value() }.toDenseMatrix());
448 obs->setPosition_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() });
451 else if (lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value())
453 if (n_positionStdDev_n.has_value() && n_positionStdDev_e.has_value() && n_positionStdDev_d.has_value())
455 obs->setPositionAndCov_n(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() },
456 Eigen::DiagonalMatrix<double, 3>{ n_positionStdDev_n.value(), n_positionStdDev_e.value(), n_positionStdDev_d.value() }.toDenseMatrix());
460 obs->setPosition_lla(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() });
472 if (n_Quat_b_w.has_value() && n_Quat_b_x.has_value() && n_Quat_b_y.has_value() && n_Quat_b_z.has_value())
474 if (
auto posVelAtt = std::reinterpret_pointer_cast<PosVelAtt>(obs))
476 posVelAtt->setAttitude_n_Quat_b(Eigen::Quaterniond{ n_Quat_b_w.value(), n_Quat_b_x.value(), n_Quat_b_y.value(), n_Quat_b_z.value() });
479 else if (roll.has_value() && pitch.has_value() && yaw.has_value())
481 if (
auto posVelAtt = std::reinterpret_pointer_cast<PosVelAtt>(obs))
483 posVelAtt->setAttitude_n_Quat_b(
trafo::n_Quat_b(roll.value(), pitch.value(), yaw.value()));