0.5.0
Loading...
Searching...
No Matches
PosVelAttFile.cpp
Go to the documentation of this file.
1// This file is part of INSTINCT, the INS Toolkit for Integrated
2// Navigation Concepts and Training by the Institute of Navigation of
3// the University of Stuttgart, Germany.
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#include "PosVelAttFile.hpp"
10
11#include "util/Logger.hpp"
12#include "util/StringUtil.hpp"
13
16
18#include <Eigen/src/Core/DiagonalMatrix.h>
19namespace nm = NAV::NodeManager;
21
23
25 : Node(typeStatic())
26{
27 LOG_TRACE("{}: called", name);
28
29 _hasConfig = true;
30 _guiConfigDefaultWindowSize = { 488, 248 };
31
33 nm::CreateOutputPin(this, "Header Columns", Pin::Type::Object, { "std::vector<std::string>" }, &_headerColumns);
34}
35
40
42{
43 return "PosVelAttFile";
44}
45
46std::string NAV::PosVelAttFile::type() const
47{
48 return typeStatic();
49}
50
52{
53 return "Data Provider";
54}
55
57{
58 if (auto res = FileReader::guiConfig(".csv,.*", { ".csv" }, size_t(id), nameId()))
59 {
60 LOG_DEBUG("{}: Path changed to {}", nameId(), _path);
62 if (res == FileReader::PATH_CHANGED)
63 {
65 }
66 else
67 {
69 }
70 }
71
72 // Header info
73 if (ImGui::BeginTable(fmt::format("##PvaHeaders ({})", id.AsPointer()).c_str(), 4,
74 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg))
75 {
76 ImGui::TableSetupColumn("Time", ImGuiTableColumnFlags_WidthFixed);
77 ImGui::TableSetupColumn("Position", ImGuiTableColumnFlags_WidthFixed);
78 ImGui::TableSetupColumn("Velocity", ImGuiTableColumnFlags_WidthFixed);
79 ImGui::TableSetupColumn("Attitude", ImGuiTableColumnFlags_WidthFixed);
80 ImGui::TableHeadersRow();
81
82 auto TextColoredIfExists = [this](int index, const std::vector<const char*>& searchTexts) {
83 ImGui::TableSetColumnIndex(index);
84 for (const auto& text : searchTexts)
85 {
86 if (std::ranges::find(_headerColumns, text) != _headerColumns.end())
87 {
88 ImGui::TextUnformatted(text);
89 return;
90 }
91 }
92
93 ImGui::TextDisabled("%s", searchTexts.front());
94 };
95
96 ImGui::TableNextRow();
97 TextColoredIfExists(0, { "GpsCycle" });
98 TextColoredIfExists(1, { "X-ECEF [m]", "Pos ECEF X [m]" });
99 TextColoredIfExists(2, { "X velocity ECEF [m/s]", "Vel ECEF X [m/s]" });
100 TextColoredIfExists(3, { "n_Quat_b w" });
101 ImGui::TableNextRow();
102 TextColoredIfExists(0, { "GpsWeek" });
103 TextColoredIfExists(1, { "Y-ECEF [m]", "Pos ECEF Y [m]" });
104 TextColoredIfExists(2, { "Y velocity ECEF [m/s]", "Vel ECEF Y [m/s]" });
105 TextColoredIfExists(3, { "n_Quat_b x" });
106 ImGui::TableNextRow();
107 TextColoredIfExists(0, { "GpsToW [s]" });
108 TextColoredIfExists(1, { "Z-ECEF [m]", "Pos ECEF Z [m]" });
109 TextColoredIfExists(2, { "Z velocity ECEF [m/s]", "Vel ECEF Z [m/s]" });
110 TextColoredIfExists(3, { "n_Quat_b y" });
111 ImGui::TableNextRow();
112 TextColoredIfExists(1, { "Latitude [deg]" });
113 TextColoredIfExists(2, { "North velocity [m/s]", "Vel N [m/s]" });
114 TextColoredIfExists(3, { "n_Quat_b z" });
115 ImGui::TableNextRow();
116 TextColoredIfExists(1, { "Longitude [deg]" });
117 TextColoredIfExists(2, { "East velocity [m/s]", "Vel E [m/s]" });
118 TextColoredIfExists(3, { "Roll [deg]" });
119 ImGui::TableNextRow();
120 TextColoredIfExists(1, { "Altitude [m]" });
121 TextColoredIfExists(2, { "Down velocity [m/s]", "Vel D [m/s]" });
122 TextColoredIfExists(3, { "Pitch [deg]" });
123 ImGui::TableNextRow();
124 TextColoredIfExists(3, { "Yaw [deg]" });
125
126 ImGui::EndTable();
127 }
128}
129
130[[nodiscard]] json NAV::PosVelAttFile::save() const
131{
132 LOG_TRACE("{}: called", nameId());
133
134 json j;
135
136 j["FileReader"] = FileReader::save();
137 j["pinType"] = outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier;
138
139 return j;
140}
141
143{
144 LOG_TRACE("{}: called", nameId());
145
146 if (j.contains("FileReader"))
147 {
148 FileReader::restore(j.at("FileReader"));
149 }
150 if (j.contains("pinType"))
151 {
152 j.at("pinType").get_to(outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier);
153 }
154}
155
157{
158 LOG_TRACE("{}: called", nameId());
159
161 {
162 for (auto& col : _headerColumns)
163 {
164 str::replace(col, "GpsTow [s]", "GpsToW [s]");
165 }
166
167 auto hasCol = [&](const char* text) {
168 return std::ranges::find(_headerColumns, text) != _headerColumns.end();
169 };
170
171 if (!hasCol("GpsCycle") || !hasCol("GpsWeek") || !hasCol("GpsToW [s]"))
172 {
173 LOG_ERROR("{}: A PosVelAtt File needs a time. Please add columns 'GpsCycle', 'GpsWeek' and 'GpsToW [s]'.", nameId());
174 return false;
175 }
176 if (!((hasCol("X-ECEF [m]") || hasCol("Pos ECEF X [m]"))
177 && (hasCol("Y-ECEF [m]") || hasCol("Pos ECEF Y [m]"))
178 && (hasCol("Z-ECEF [m]") || hasCol("Pos ECEF Z [m]")))
179 && !(hasCol("Latitude [deg]") && hasCol("Longitude [deg]") && hasCol("Altitude [m]")))
180 {
181 LOG_ERROR("{}: A PosVelAtt File needs a position. Please provide"
182 " either 'X-ECEF [m]', 'Y-ECEF [m]', 'Z-ECEF [m]'"
183 " or 'Latitude [deg]', 'Longitude [deg]', 'Altitude [m]'.",
184 nameId());
185 return false;
186 }
188 outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier = std::vector{ Pos::type() };
189
190 if (((hasCol("X velocity ECEF [m/s]") || hasCol("Vel ECEF X [m/s]"))
191 && (hasCol("Y velocity ECEF [m/s]") || hasCol("Vel ECEF Y [m/s]"))
192 && (hasCol("Z velocity ECEF [m/s]") || hasCol("Vel ECEF Z [m/s]")))
193 || ((hasCol("North velocity [m/s]") || hasCol("Vel N [m/s]"))
194 && (hasCol("East velocity [m/s]") || hasCol("Vel E [m/s]"))
195 && (hasCol("Down velocity [m/s]") || hasCol("Vel D [m/s]"))))
196 {
198 outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier = std::vector{ PosVel::type() };
199
200 if ((hasCol("n_Quat_b w") && hasCol("n_Quat_b x") && hasCol("n_Quat_b y") && hasCol("n_Quat_b z"))
201 || (hasCol("Roll [deg]") && hasCol("Pitch [deg]") && hasCol("Yaw [deg]")))
202 {
204 outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier = std::vector{ PosVelAtt::type() };
205 }
206 }
207
208 for (auto& link : outputPins[OUTPUT_PORT_INDEX_PVA].links)
209 {
210 if (auto* pin = link.getConnectedPin())
211 {
212 outputPins[OUTPUT_PORT_INDEX_PVA].recreateLink(*pin);
213 }
214 }
215
216 return true;
217 }
218
220 return false;
221}
222
224{
225 LOG_TRACE("{}: called", nameId());
226
228}
229
231{
233
234 return true;
235}
236
237std::shared_ptr<const NAV::NodeData> NAV::PosVelAttFile::pollData()
238{
239 std::shared_ptr<Pos> obs;
240 switch (_fileContent)
241 {
242 case FileContent::Pos:
243 obs = std::make_shared<Pos>();
244 break;
246 obs = std::make_shared<PosVel>();
247 break;
249 obs = std::make_shared<PosVelAtt>();
250 break;
251 }
252
253 // Read line
254 std::string line;
255 getline(line);
256 // Remove any starting non text characters
257 line.erase(line.begin(), std::ranges::find_if(line, [](int ch) { return std::isgraph(ch); }));
258
259 if (line.empty())
260 {
261 return nullptr;
262 }
263
264 // Convert line into stream
265 std::stringstream lineStream(line);
266 std::string cell;
267
268 std::optional<uint16_t> gpsCycle = 0;
269 std::optional<uint16_t> gpsWeek;
270 std::optional<long double> gpsToW;
271 std::optional<double> e_position_x;
272 std::optional<double> e_position_y;
273 std::optional<double> e_position_z;
274 std::optional<double> e_positionStdDev_x;
275 std::optional<double> e_positionStdDev_y;
276 std::optional<double> e_positionStdDev_z;
277 std::optional<double> lla_position_x;
278 std::optional<double> lla_position_y;
279 std::optional<double> lla_position_z;
280 std::optional<double> n_positionStdDev_n;
281 std::optional<double> n_positionStdDev_e;
282 std::optional<double> n_positionStdDev_d;
283 std::optional<double> e_velocity_x;
284 std::optional<double> e_velocity_y;
285 std::optional<double> e_velocity_z;
286 std::optional<double> e_velocityStdDev_x;
287 std::optional<double> e_velocityStdDev_y;
288 std::optional<double> e_velocityStdDev_z;
289 std::optional<double> n_velocity_n;
290 std::optional<double> n_velocity_e;
291 std::optional<double> n_velocity_d;
292 std::optional<double> n_velocityStdDev_n;
293 std::optional<double> n_velocityStdDev_e;
294 std::optional<double> n_velocityStdDev_d;
295 std::optional<double> n_Quat_b_w;
296 std::optional<double> n_Quat_b_x;
297 std::optional<double> n_Quat_b_y;
298 std::optional<double> n_Quat_b_z;
299 std::optional<double> roll;
300 std::optional<double> pitch;
301 std::optional<double> yaw;
302
303 // Split line at comma
304 for (const auto& column : _headerColumns)
305 {
306 if (std::getline(lineStream, cell, ','))
307 {
308 // Remove any trailing non text characters
309 cell.erase(std::ranges::find_if(cell, [](int ch) { return std::iscntrl(ch); }), cell.end());
310 if (cell.empty())
311 {
312 continue;
313 }
314
315 if (column == "GpsCycle") { gpsCycle = static_cast<uint16_t>(std::stoul(cell)); }
316 else if (column == "GpsWeek") { gpsWeek = static_cast<uint16_t>(std::stoul(cell)); }
317 else if (column == "GpsToW [s]") { gpsToW = std::stold(cell); }
318
319 else if (column == "X-ECEF [m]" || column == "Pos ECEF X [m]") { e_position_x = std::stod(cell); }
320 else if (column == "Y-ECEF [m]" || column == "Pos ECEF Y [m]") { e_position_y = std::stod(cell); }
321 else if (column == "Z-ECEF [m]" || column == "Pos ECEF Z [m]") { e_position_z = std::stod(cell); }
322 else if (column == "X-ECEF StDev [m]") { e_positionStdDev_x = std::stod(cell); }
323 else if (column == "Y-ECEF StDev [m]") { e_positionStdDev_y = std::stod(cell); }
324 else if (column == "Z-ECEF StDev [m]") { e_positionStdDev_z = std::stod(cell); }
325
326 else if (column == "Latitude [deg]") { lla_position_x = deg2rad(std::stod(cell)); }
327 else if (column == "Longitude [deg]") { lla_position_y = deg2rad(std::stod(cell)); }
328 else if (column == "Altitude [m]") { lla_position_z = std::stod(cell); }
329 else if (column == "North StDev [m]") { n_positionStdDev_n = deg2rad(std::stod(cell)); }
330 else if (column == "East StDev [m]") { n_positionStdDev_e = deg2rad(std::stod(cell)); }
331 else if (column == "Down StDev [m]") { n_positionStdDev_d = std::stod(cell); }
332
333 else if (column == "X velocity ECEF [m/s]" || column == "Vel ECEF X [m/s]") { e_velocity_x = std::stod(cell); }
334 else if (column == "Y velocity ECEF [m/s]" || column == "Vel ECEF Y [m/s]") { e_velocity_y = std::stod(cell); }
335 else if (column == "Z velocity ECEF [m/s]" || column == "Vel ECEF Z [m/s]") { e_velocity_z = std::stod(cell); }
336 else if (column == "X velocity ECEF StdDev [m/s]") { e_velocityStdDev_x = std::stod(cell); }
337 else if (column == "Y velocity ECEF StdDev [m/s]") { e_velocityStdDev_y = std::stod(cell); }
338 else if (column == "Z velocity ECEF StdDev [m/s]") { e_velocityStdDev_z = std::stod(cell); }
339
340 else if (column == "North velocity [m/s]" || column == "Vel N [m/s]") { n_velocity_n = std::stod(cell); }
341 else if (column == "East velocity [m/s]" || column == "Vel E [m/s]") { n_velocity_e = std::stod(cell); }
342 else if (column == "Down velocity [m/s]" || column == "Vel D [m/s]") { n_velocity_d = std::stod(cell); }
343 else if (column == "North velocity StDev [m/s]") { n_velocityStdDev_n = std::stod(cell); }
344 else if (column == "East velocity StDev [m/s]") { n_velocityStdDev_e = std::stod(cell); }
345 else if (column == "Down velocity StDev [m/s]") { n_velocityStdDev_d = std::stod(cell); }
346
347 else if (column == "n_Quat_b w") { n_Quat_b_w = std::stod(cell); }
348 else if (column == "n_Quat_b x") { n_Quat_b_x = std::stod(cell); }
349 else if (column == "n_Quat_b y") { n_Quat_b_y = std::stod(cell); }
350 else if (column == "n_Quat_b z") { n_Quat_b_z = std::stod(cell); }
351
352 else if (column == "Roll [deg]") { roll = deg2rad(std::stod(cell)); }
353 else if (column == "Pitch [deg]") { pitch = deg2rad(std::stod(cell)); }
354 else if (column == "Yaw [deg]") { yaw = deg2rad(std::stod(cell)); }
355 }
356 }
357
358 if (gpsCycle.has_value() && gpsWeek.has_value() && gpsToW.has_value())
359 {
360 obs->insTime = InsTime(gpsCycle.value(), gpsWeek.value(), gpsToW.value());
361 }
362 else
363 {
364 LOG_WARN("{}: A PosVelAtt File needs a time.", nameId());
365 return nullptr;
366 }
367
369 {
370 if (e_velocity_x.has_value() && e_velocity_y.has_value() && e_velocity_z.has_value())
371 {
372 auto lla_pos = lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value()
373 ? Eigen::Vector3d(*lla_position_x, *lla_position_y, *lla_position_z)
374 : trafo::ecef2lla_WGS84(Eigen::Vector3d(*e_position_x, *e_position_y, *e_position_z));
375 auto n_vel = trafo::n_Quat_e(lla_pos.x(), lla_pos.y()) * Eigen::Vector3d(*e_velocity_x, *e_velocity_y, *e_velocity_z);
376 n_velocity_n = n_vel.x();
377 n_velocity_e = n_vel.y();
378 n_velocity_d = n_vel.z();
379 }
380 else if (n_velocity_n.has_value() && n_velocity_e.has_value() && n_velocity_d.has_value())
381 {
382 auto lla_pos = lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value()
383 ? Eigen::Vector3d(*lla_position_x, *lla_position_y, *lla_position_z)
384 : trafo::ecef2lla_WGS84(Eigen::Vector3d(*e_position_x, *e_position_y, *e_position_z));
385 auto e_vel = trafo::e_Quat_n(lla_pos.x(), lla_pos.y()) * Eigen::Vector3d(*e_velocity_x, *e_velocity_y, *e_velocity_z);
386 e_velocity_x = e_vel.x();
387 e_velocity_y = e_vel.y();
388 e_velocity_z = e_vel.z();
389 }
390
391 if (e_position_x.has_value() && e_position_y.has_value() && e_position_z.has_value()
392 && e_velocity_x.has_value() && e_velocity_y.has_value() && e_velocity_z.has_value())
393 {
394 if (auto posVel = std::reinterpret_pointer_cast<PosVel>(obs))
395 {
396 if (e_positionStdDev_x.has_value() && e_positionStdDev_y.has_value() && e_positionStdDev_z.has_value()
397 && e_velocityStdDev_x.has_value() && e_velocityStdDev_y.has_value() && e_velocityStdDev_z.has_value())
398 {
399 ;
400 posVel->setPosVelAndCov_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() },
401 Eigen::Vector3d{ e_velocity_x.value(), e_velocity_y.value(), e_velocity_z.value() },
402 (Eigen::Vector6d() << e_positionStdDev_x.value(), e_positionStdDev_y.value(), e_positionStdDev_z.value(),
403 e_velocityStdDev_x.value(), e_velocityStdDev_y.value(), e_velocityStdDev_z.value())
404 .finished()
405 .asDiagonal()
406 .toDenseMatrix());
407 }
408 else
409 {
410 posVel->setPosition_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() });
411 posVel->setVelocity_e(Eigen::Vector3d{ e_velocity_x.value(), e_velocity_y.value(), e_velocity_z.value() });
412 }
413 }
414 }
415 else if (lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value()
416 && n_velocity_n.has_value() && n_velocity_e.has_value() && n_velocity_d.has_value())
417 {
418 if (auto posVel = std::reinterpret_pointer_cast<PosVel>(obs))
419 {
420 if (n_positionStdDev_n.has_value() && n_positionStdDev_e.has_value() && n_positionStdDev_d.has_value()
421 && n_velocityStdDev_n.has_value() && n_velocityStdDev_e.has_value() && n_velocityStdDev_d.has_value())
422 {
423 posVel->setPosVelAndCov_n(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() },
424 Eigen::Vector3d{ n_velocity_n.value(), n_velocity_e.value(), n_velocity_d.value() },
425 (Eigen::Vector6d() << n_positionStdDev_n.value(), n_positionStdDev_e.value(), n_positionStdDev_d.value(),
426 n_velocityStdDev_n.value(), n_velocityStdDev_e.value(), n_velocityStdDev_d.value())
427 .finished()
428 .asDiagonal()
429 .toDenseMatrix());
430 }
431 else
432 {
433 posVel->setPosition_lla(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() });
434 posVel->setVelocity_n(Eigen::Vector3d{ n_velocity_n.value(), n_velocity_e.value(), n_velocity_d.value() });
435 }
436 }
437 }
438 else
439 {
440 LOG_WARN("{}: A PosVel/PosVelAtt file needs a position and velocity.", nameId());
441 return nullptr;
442 }
443 }
444 else if (_fileContent == FileContent::Pos)
445 {
446 if (e_position_x.has_value() && e_position_y.has_value() && e_position_z.has_value())
447 {
448 if (e_positionStdDev_x.has_value() && e_positionStdDev_y.has_value() && e_positionStdDev_z.has_value())
449 {
450 obs->setPositionAndCov_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() },
451 Eigen::DiagonalMatrix<double, 3>{ e_positionStdDev_x.value(), e_positionStdDev_y.value(), e_positionStdDev_z.value() }.toDenseMatrix());
452 }
453 else
454 {
455 obs->setPosition_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() });
456 }
457 }
458 else if (lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value())
459 {
460 if (n_positionStdDev_n.has_value() && n_positionStdDev_e.has_value() && n_positionStdDev_d.has_value())
461 {
462 obs->setPositionAndCov_n(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() },
463 Eigen::DiagonalMatrix<double, 3>{ n_positionStdDev_n.value(), n_positionStdDev_e.value(), n_positionStdDev_d.value() }.toDenseMatrix());
464 }
465 else
466 {
467 obs->setPosition_lla(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() });
468 }
469 }
470 else
471 {
472 LOG_WARN("{}: A Pos file needs a position.", nameId());
473 return nullptr;
474 }
475 }
476
478 {
479 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())
480 {
481 if (auto posVelAtt = std::reinterpret_pointer_cast<PosVelAtt>(obs))
482 {
483 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 }
485 }
486 else if (roll.has_value() && pitch.has_value() && yaw.has_value())
487 {
488 if (auto posVelAtt = std::reinterpret_pointer_cast<PosVelAtt>(obs))
489 {
490 posVelAtt->setAttitude_n_Quat_b(trafo::n_Quat_b(roll.value(), pitch.value(), yaw.value()));
491 }
492 }
493 }
494
496 return obs;
497}
Transformation collection.
Save/Load the Nodes.
nlohmann::json json
json namespace
Utility class for logging to console and file.
#define LOG_DEBUG
Debug information. Should not be called on functions which receive observations (spamming)
Definition Logger.hpp:67
#define LOG_ERROR
Error occurred, which stops part of the program to work, but not everything.
Definition Logger.hpp:73
#define LOG_WARN
Error occurred, but a fallback option exists and program continues to work normally.
Definition Logger.hpp:71
#define LOG_TRACE
Detailled info to trace the execution of the program. Should not be called on functions which receive...
Definition Logger.hpp:65
Manages all Nodes.
PosVelAtt File Reader.
Position, Velocity and Attitude Storage Class.
Utility functions for working with std::strings.
bool initialize()
Initialize the file reader.
void restore(const json &j)
Restores the node from a json object.
std::string _path
Path to the file.
@ PATH_CHANGED
The path changed and exists.
std::vector< std::string > _headerColumns
Header Columns of a CSV file.
GuiResult guiConfig(const char *vFilters, const std::vector< std::string > &extensions, size_t id, const std::string &nameId)
ImGui config.
void resetReader()
Moves the read cursor to the start.
auto & getline(std::string &str)
Reads a line from the filestream.
json save() const
Saves the node into a json object.
void deinitialize()
Deinitialize the file reader.
The class is responsible for all time-related tasks.
Definition InsTime.hpp:710
bool doDeinitialize(bool wait=false)
Asks the node worker to deinitialize the node.
Definition Node.cpp:395
ImVec2 _guiConfigDefaultWindowSize
Definition Node.hpp:410
std::vector< OutputPin > outputPins
List of output pins.
Definition Node.hpp:399
Node(std::string name)
Constructor.
Definition Node.cpp:30
std::string nameId() const
Node name and id.
Definition Node.cpp:253
std::string name
Name of the Node.
Definition Node.hpp:395
bool doReinitialize(bool wait=false)
Asks the node worker to reinitialize the node.
Definition Node.cpp:350
void invokeCallbacks(size_t portIndex, const std::shared_ptr< const NodeData > &data)
Calls all registered callbacks on the specified output port.
Definition Node.cpp:180
bool _hasConfig
Flag if the config window should be shown.
Definition Node.hpp:413
void deinitialize() override
Deinitialize the node.
bool resetNode() override
Resets the node. Moves the read cursor to the start.
static std::string category()
String representation of the Class Category.
@ PosVel
Position and Velocity.
@ PosVelAtt
Position, Velocity and Attitude.
void guiConfig() override
ImGui config window which is shown on double click.
json save() const override
Saves the node into a json object.
void restore(const json &j) override
Restores the node from a json object.
std::string type() const override
String representation of the Class Type.
bool initialize() override
Initialize the node.
static constexpr size_t OUTPUT_PORT_INDEX_PVA
Flow (PosVelAtt)
~PosVelAttFile() override
Destructor.
FileContent _fileContent
Data included in the file.
static std::string typeStatic()
String representation of the Class Type.
PosVelAttFile()
Default constructor.
std::shared_ptr< const NodeData > pollData()
Polls data from the file.
static std::string type()
Returns the type of the data class.
Definition PosVelAtt.hpp:29
static std::string type()
Returns the type of the data class.
Definition PosVel.hpp:27
static std::string type()
Returns the type of the data class.
Definition Pos.hpp:36
Matrix< double, 6, 1 > Vector6d
Double 6x1 Eigen::Vector.
Definition Eigen.hpp:32
OutputPin * CreateOutputPin(Node *node, const char *name, Pin::Type pinType, const std::vector< std::string > &dataIdentifier, OutputPin::PinData data=static_cast< void * >(nullptr), int idx=-1)
Create an Output Pin object.
void ApplyChanges()
Signals that there have been changes to the flow.
static bool replace(std::string &str, const std::string &from, const std::string &to, CaseSensitivity cs=RespectCase)
Replaces the first occurrence of a search pattern with another sequence.
Eigen::Vector3< typename Derived::Scalar > ecef2lla_WGS84(const Eigen::MatrixBase< Derived > &e_position)
Converts Earth-centered-Earth-fixed coordinates into latitude, longitude and altitude using WGS84.
Eigen::Quaternion< Scalar > e_Quat_n(const Scalar &latitude, const Scalar &longitude)
Quaternion for rotations from navigation to Earth-fixed frame.
Eigen::Quaternion< Scalar > n_Quat_e(const Scalar &latitude, const Scalar &longitude)
Quaternion for rotations from Earth-fixed to navigation frame.
Eigen::Quaternion< Scalar > n_Quat_b(Scalar roll, Scalar pitch, Scalar yaw)
Quaternion for rotations from body to navigation frame.
constexpr auto deg2rad(const T &deg)
Convert Degree to Radians.
Definition Units.hpp:21
@ Flow
NodeData Trigger.
Definition Pin.hpp:52
@ Object
Generic Object.
Definition Pin.hpp:57