237 std::shared_ptr<Pos> obs;
241 obs = std::make_shared<Pos>();
244 obs = std::make_shared<PosVel>();
247 obs = std::make_shared<PosVelAtt>();
255 line.erase(line.begin(), std::ranges::find_if(line, [](
int ch) { return std::isgraph(ch); }));
263 std::stringstream lineStream(line);
266 std::optional<uint16_t> gpsCycle = 0;
267 std::optional<uint16_t> gpsWeek;
268 std::optional<long double> gpsToW;
269 std::optional<double> e_position_x;
270 std::optional<double> e_position_y;
271 std::optional<double> e_position_z;
272 std::optional<double> e_positionStdDev_x;
273 std::optional<double> e_positionStdDev_y;
274 std::optional<double> e_positionStdDev_z;
275 std::optional<double> lla_position_x;
276 std::optional<double> lla_position_y;
277 std::optional<double> lla_position_z;
278 std::optional<double> n_positionStdDev_n;
279 std::optional<double> n_positionStdDev_e;
280 std::optional<double> n_positionStdDev_d;
281 std::optional<double> e_velocity_x;
282 std::optional<double> e_velocity_y;
283 std::optional<double> e_velocity_z;
284 std::optional<double> e_velocityStdDev_x;
285 std::optional<double> e_velocityStdDev_y;
286 std::optional<double> e_velocityStdDev_z;
287 std::optional<double> n_velocity_n;
288 std::optional<double> n_velocity_e;
289 std::optional<double> n_velocity_d;
290 std::optional<double> n_velocityStdDev_n;
291 std::optional<double> n_velocityStdDev_e;
292 std::optional<double> n_velocityStdDev_d;
293 std::optional<double> n_Quat_b_w;
294 std::optional<double> n_Quat_b_x;
295 std::optional<double> n_Quat_b_y;
296 std::optional<double> n_Quat_b_z;
297 std::optional<double> roll;
298 std::optional<double> pitch;
299 std::optional<double> yaw;
304 if (std::getline(lineStream, cell,
','))
307 cell.erase(std::ranges::find_if(cell, [](
int ch) {
return std::iscntrl(ch); }), cell.end());
313 if (column ==
"GpsCycle") { gpsCycle =
static_cast<uint16_t
>(std::stoul(cell)); }
314 else if (column ==
"GpsWeek") { gpsWeek =
static_cast<uint16_t
>(std::stoul(cell)); }
315 else if (column ==
"GpsToW [s]") { gpsToW = std::stold(cell); }
317 else if (column ==
"X-ECEF [m]" || column ==
"Pos ECEF X [m]") { e_position_x = std::stod(cell); }
318 else if (column ==
"Y-ECEF [m]" || column ==
"Pos ECEF Y [m]") { e_position_y = std::stod(cell); }
319 else if (column ==
"Z-ECEF [m]" || column ==
"Pos ECEF Z [m]") { e_position_z = std::stod(cell); }
320 else if (column ==
"X-ECEF StDev [m]") { e_positionStdDev_x = std::stod(cell); }
321 else if (column ==
"Y-ECEF StDev [m]") { e_positionStdDev_y = std::stod(cell); }
322 else if (column ==
"Z-ECEF StDev [m]") { e_positionStdDev_z = std::stod(cell); }
324 else if (column ==
"Latitude [deg]") { lla_position_x =
deg2rad(std::stod(cell)); }
325 else if (column ==
"Longitude [deg]") { lla_position_y =
deg2rad(std::stod(cell)); }
326 else if (column ==
"Altitude [m]") { lla_position_z = std::stod(cell); }
327 else if (column ==
"North StDev [m]") { n_positionStdDev_n =
deg2rad(std::stod(cell)); }
328 else if (column ==
"East StDev [m]") { n_positionStdDev_e =
deg2rad(std::stod(cell)); }
329 else if (column ==
"Down StDev [m]") { n_positionStdDev_d = std::stod(cell); }
331 else if (column ==
"X velocity ECEF [m/s]" || column ==
"Vel ECEF X [m/s]") { e_velocity_x = std::stod(cell); }
332 else if (column ==
"Y velocity ECEF [m/s]" || column ==
"Vel ECEF Y [m/s]") { e_velocity_y = std::stod(cell); }
333 else if (column ==
"Z velocity ECEF [m/s]" || column ==
"Vel ECEF Z [m/s]") { e_velocity_z = std::stod(cell); }
334 else if (column ==
"X velocity ECEF StdDev [m/s]") { e_velocityStdDev_x = std::stod(cell); }
335 else if (column ==
"Y velocity ECEF StdDev [m/s]") { e_velocityStdDev_y = std::stod(cell); }
336 else if (column ==
"Z velocity ECEF StdDev [m/s]") { e_velocityStdDev_z = std::stod(cell); }
338 else if (column ==
"North velocity [m/s]" || column ==
"Vel N [m/s]") { n_velocity_n = std::stod(cell); }
339 else if (column ==
"East velocity [m/s]" || column ==
"Vel E [m/s]") { n_velocity_e = std::stod(cell); }
340 else if (column ==
"Down velocity [m/s]" || column ==
"Vel D [m/s]") { n_velocity_d = std::stod(cell); }
341 else if (column ==
"North velocity StDev [m/s]") { n_velocityStdDev_n = std::stod(cell); }
342 else if (column ==
"East velocity StDev [m/s]") { n_velocityStdDev_e = std::stod(cell); }
343 else if (column ==
"Down velocity StDev [m/s]") { n_velocityStdDev_d = std::stod(cell); }
345 else if (column ==
"n_Quat_b w") { n_Quat_b_w = std::stod(cell); }
346 else if (column ==
"n_Quat_b x") { n_Quat_b_x = std::stod(cell); }
347 else if (column ==
"n_Quat_b y") { n_Quat_b_y = std::stod(cell); }
348 else if (column ==
"n_Quat_b z") { n_Quat_b_z = std::stod(cell); }
350 else if (column ==
"Roll [deg]") { roll =
deg2rad(std::stod(cell)); }
351 else if (column ==
"Pitch [deg]") { pitch =
deg2rad(std::stod(cell)); }
352 else if (column ==
"Yaw [deg]") { yaw =
deg2rad(std::stod(cell)); }
356 if (gpsCycle.has_value() && gpsWeek.has_value() && gpsToW.has_value())
358 obs->insTime =
InsTime(gpsCycle.value(), gpsWeek.value(), gpsToW.value());
368 if (e_velocity_x.has_value() && e_velocity_y.has_value() && e_velocity_z.has_value())
370 auto lla_pos = lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value()
371 ? Eigen::Vector3d(*lla_position_x, *lla_position_y, *lla_position_z)
373 auto n_vel =
trafo::n_Quat_e(lla_pos.x(), lla_pos.y()) * Eigen::Vector3d(*e_velocity_x, *e_velocity_y, *e_velocity_z);
374 n_velocity_n = n_vel.x();
375 n_velocity_e = n_vel.y();
376 n_velocity_d = n_vel.z();
378 else if (n_velocity_n.has_value() && n_velocity_e.has_value() && n_velocity_d.has_value())
380 auto lla_pos = lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value()
381 ? Eigen::Vector3d(*lla_position_x, *lla_position_y, *lla_position_z)
383 auto e_vel =
trafo::e_Quat_n(lla_pos.x(), lla_pos.y()) * Eigen::Vector3d(*e_velocity_x, *e_velocity_y, *e_velocity_z);
384 e_velocity_x = e_vel.x();
385 e_velocity_y = e_vel.y();
386 e_velocity_z = e_vel.z();
389 if (e_position_x.has_value() && e_position_y.has_value() && e_position_z.has_value()
390 && e_velocity_x.has_value() && e_velocity_y.has_value() && e_velocity_z.has_value())
392 if (
auto posVel = std::reinterpret_pointer_cast<PosVel>(obs))
394 if (e_positionStdDev_x.has_value() && e_positionStdDev_y.has_value() && e_positionStdDev_z.has_value()
395 && e_velocityStdDev_x.has_value() && e_velocityStdDev_y.has_value() && e_velocityStdDev_z.has_value())
398 posVel->setPosVelAndCov_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() },
399 Eigen::Vector3d{ e_velocity_x.value(), e_velocity_y.value(), e_velocity_z.value() },
400 (
Eigen::Vector6d() << e_positionStdDev_x.value(), e_positionStdDev_y.value(), e_positionStdDev_z.value(),
401 e_velocityStdDev_x.value(), e_velocityStdDev_y.value(), e_velocityStdDev_z.value())
408 posVel->setPosition_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() });
409 posVel->setVelocity_e(Eigen::Vector3d{ e_velocity_x.value(), e_velocity_y.value(), e_velocity_z.value() });
413 else if (lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value()
414 && n_velocity_n.has_value() && n_velocity_e.has_value() && n_velocity_d.has_value())
416 if (
auto posVel = std::reinterpret_pointer_cast<PosVel>(obs))
418 if (n_positionStdDev_n.has_value() && n_positionStdDev_e.has_value() && n_positionStdDev_d.has_value()
419 && n_velocityStdDev_n.has_value() && n_velocityStdDev_e.has_value() && n_velocityStdDev_d.has_value())
421 posVel->setPosVelAndCov_n(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() },
422 Eigen::Vector3d{ n_velocity_n.value(), n_velocity_e.value(), n_velocity_d.value() },
423 (
Eigen::Vector6d() << n_positionStdDev_n.value(), n_positionStdDev_e.value(), n_positionStdDev_d.value(),
424 n_velocityStdDev_n.value(), n_velocityStdDev_e.value(), n_velocityStdDev_d.value())
431 posVel->setPosition_lla(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() });
432 posVel->setVelocity_n(Eigen::Vector3d{ n_velocity_n.value(), n_velocity_e.value(), n_velocity_d.value() });
438 LOG_WARN(
"{}: A PosVel/PosVelAtt file needs a position and velocity.",
nameId());
444 if (e_position_x.has_value() && e_position_y.has_value() && e_position_z.has_value())
446 if (e_positionStdDev_x.has_value() && e_positionStdDev_y.has_value() && e_positionStdDev_z.has_value())
448 obs->setPositionAndCov_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() },
449 Eigen::DiagonalMatrix<double, 3>{ e_positionStdDev_x.value(), e_positionStdDev_y.value(), e_positionStdDev_z.value() }.toDenseMatrix());
453 obs->setPosition_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() });
456 else if (lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value())
458 if (n_positionStdDev_n.has_value() && n_positionStdDev_e.has_value() && n_positionStdDev_d.has_value())
460 obs->setPositionAndCov_n(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() },
461 Eigen::DiagonalMatrix<double, 3>{ n_positionStdDev_n.value(), n_positionStdDev_e.value(), n_positionStdDev_d.value() }.toDenseMatrix());
465 obs->setPosition_lla(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() });
477 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())
479 if (
auto posVelAtt = std::reinterpret_pointer_cast<PosVelAtt>(obs))
481 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() });
484 else if (roll.has_value() && pitch.has_value() && yaw.has_value())
486 if (
auto posVelAtt = std::reinterpret_pointer_cast<PosVelAtt>(obs))
488 posVelAtt->setAttitude_n_Quat_b(
trafo::n_Quat_b(roll.value(), pitch.value(), yaw.value()));