INSTINCT Code Coverage Report


Directory: src/
File: Nodes/DataProvider/State/PosVelAttFile.cpp
Date: 2025-11-25 23:34:18
Exec Total Coverage
Lines: 168 293 57.3%
Functions: 12 16 75.0%
Branches: 276 1106 25.0%

Line Branch Exec Source
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
14 #include "Navigation/Transformations/CoordinateFrames.hpp"
15 #include "Navigation/Transformations/Units.hpp"
16
17 #include <Eigen/src/Core/DiagonalMatrix.h>
18 #include "internal/FlowManager.hpp"
19
20 #include "NodeData/State/PosVelAtt.hpp"
21
22 115 NAV::PosVelAttFile::PosVelAttFile()
23
3/6
✓ Branch 1 taken 115 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 115 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 115 times.
✗ Branch 9 not taken.
115 : Node(typeStatic())
24 {
25 LOG_TRACE("{}: called", name);
26
27 115 _hasConfig = true;
28 115 _guiConfigDefaultWindowSize = { 488, 248 };
29
30
4/8
✓ Branch 1 taken 115 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 115 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 345 times.
✓ Branch 9 taken 115 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
575 CreateOutputPin("PosVelAtt", Pin::Type::Flow, { Pos::type(), PosVel::type(), PosVelAtt::type() }, &PosVelAttFile::pollData);
31
2/4
✓ Branch 2 taken 115 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 115 times.
✗ Branch 7 not taken.
230 CreateOutputPin("Header Columns", Pin::Type::Object, { "std::vector<std::string>" }, &_headerColumns);
32 230 }
33
34 232 NAV::PosVelAttFile::~PosVelAttFile()
35 {
36 LOG_TRACE("{}: called", nameId());
37 232 }
38
39 229 std::string NAV::PosVelAttFile::typeStatic()
40 {
41
1/2
✓ Branch 1 taken 229 times.
✗ Branch 2 not taken.
458 return "PosVelAttFile";
42 }
43
44 std::string NAV::PosVelAttFile::type() const
45 {
46 return typeStatic();
47 }
48
49 114 std::string NAV::PosVelAttFile::category()
50 {
51
1/2
✓ Branch 1 taken 114 times.
✗ Branch 2 not taken.
228 return "Data Provider";
52 }
53
54 void NAV::PosVelAttFile::guiConfig()
55 {
56 if (auto res = FileReader::guiConfig(".csv,.*", { ".csv" }, size_t(id), nameId()))
57 {
58 LOG_DEBUG("{}: Path changed to {}", nameId(), _path);
59 flow::ApplyChanges();
60 if (res == FileReader::PATH_CHANGED)
61 {
62 doReinitialize();
63 }
64 else
65 {
66 doDeinitialize();
67 }
68 }
69
70 // Header info
71 if (ImGui::BeginTable(fmt::format("##PvaHeaders ({})", id.AsPointer()).c_str(), 4,
72 ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg))
73 {
74 ImGui::TableSetupColumn("Time", ImGuiTableColumnFlags_WidthFixed);
75 ImGui::TableSetupColumn("Position", ImGuiTableColumnFlags_WidthFixed);
76 ImGui::TableSetupColumn("Velocity", ImGuiTableColumnFlags_WidthFixed);
77 ImGui::TableSetupColumn("Attitude", ImGuiTableColumnFlags_WidthFixed);
78 ImGui::TableHeadersRow();
79
80 auto TextColoredIfExists = [this](int index, const std::vector<const char*>& searchTexts) {
81 ImGui::TableSetColumnIndex(index);
82 for (const auto& text : searchTexts)
83 {
84 if (std::ranges::find(_headerColumns, text) != _headerColumns.end())
85 {
86 ImGui::TextUnformatted(text);
87 return;
88 }
89 }
90
91 ImGui::TextDisabled("%s", searchTexts.front());
92 };
93
94 ImGui::TableNextRow();
95 TextColoredIfExists(0, { "GpsCycle" });
96 TextColoredIfExists(1, { "X-ECEF [m]", "Pos ECEF X [m]" });
97 TextColoredIfExists(2, { "X velocity ECEF [m/s]", "Vel ECEF X [m/s]" });
98 TextColoredIfExists(3, { "n_Quat_b w" });
99 ImGui::TableNextRow();
100 TextColoredIfExists(0, { "GpsWeek" });
101 TextColoredIfExists(1, { "Y-ECEF [m]", "Pos ECEF Y [m]" });
102 TextColoredIfExists(2, { "Y velocity ECEF [m/s]", "Vel ECEF Y [m/s]" });
103 TextColoredIfExists(3, { "n_Quat_b x" });
104 ImGui::TableNextRow();
105 TextColoredIfExists(0, { "GpsToW [s]" });
106 TextColoredIfExists(1, { "Z-ECEF [m]", "Pos ECEF Z [m]" });
107 TextColoredIfExists(2, { "Z velocity ECEF [m/s]", "Vel ECEF Z [m/s]" });
108 TextColoredIfExists(3, { "n_Quat_b y" });
109 ImGui::TableNextRow();
110 TextColoredIfExists(1, { "Latitude [deg]" });
111 TextColoredIfExists(2, { "North velocity [m/s]", "Vel N [m/s]" });
112 TextColoredIfExists(3, { "n_Quat_b z" });
113 ImGui::TableNextRow();
114 TextColoredIfExists(1, { "Longitude [deg]" });
115 TextColoredIfExists(2, { "East velocity [m/s]", "Vel E [m/s]" });
116 TextColoredIfExists(3, { "Roll [deg]" });
117 ImGui::TableNextRow();
118 TextColoredIfExists(1, { "Altitude [m]" });
119 TextColoredIfExists(2, { "Down velocity [m/s]", "Vel D [m/s]" });
120 TextColoredIfExists(3, { "Pitch [deg]" });
121 ImGui::TableNextRow();
122 TextColoredIfExists(3, { "Yaw [deg]" });
123
124 ImGui::EndTable();
125 }
126 }
127
128 [[nodiscard]] json NAV::PosVelAttFile::save() const
129 {
130 LOG_TRACE("{}: called", nameId());
131
132 json j;
133
134 j["FileReader"] = FileReader::save();
135 j["pinType"] = outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier;
136
137 return j;
138 }
139
140 1 void NAV::PosVelAttFile::restore(json const& j)
141 {
142 LOG_TRACE("{}: called", nameId());
143
144
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 if (j.contains("FileReader"))
145 {
146 1 FileReader::restore(j.at("FileReader"));
147 }
148
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 if (j.contains("pinType"))
149 {
150 1 j.at("pinType").get_to(outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier);
151 }
152 1 }
153
154 1 bool NAV::PosVelAttFile::initialize()
155 {
156 LOG_TRACE("{}: called", nameId());
157
158
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 if (FileReader::initialize())
159 {
160
2/2
✓ Branch 4 taken 13 times.
✓ Branch 5 taken 1 times.
14 for (auto& col : _headerColumns)
161 {
162
3/6
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 13 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 13 times.
✗ Branch 8 not taken.
52 str::replace(col, "GpsTow [s]", "GpsToW [s]");
163 }
164
165 19 auto hasCol = [&](const char* text) {
166
1/2
✓ Branch 2 taken 19 times.
✗ Branch 3 not taken.
19 return std::ranges::find(_headerColumns, text) != _headerColumns.end();
167 1 };
168
169
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
1 if (!hasCol("GpsCycle") || !hasCol("GpsWeek") || !hasCol("GpsToW [s]"))
170 {
171 LOG_ERROR("{}: A PosVelAtt File needs a time. Please add columns 'GpsCycle', 'GpsWeek' and 'GpsToW [s]'.", nameId());
172 return false;
173 }
174
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (!((hasCol("X-ECEF [m]") || hasCol("Pos ECEF X [m]"))
175
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 && (hasCol("Y-ECEF [m]") || hasCol("Pos ECEF Y [m]"))
176
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
1 && (hasCol("Z-ECEF [m]") || hasCol("Pos ECEF Z [m]")))
177
2/16
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
2 && !(hasCol("Latitude [deg]") && hasCol("Longitude [deg]") && hasCol("Altitude [m]")))
178 {
179 LOG_ERROR("{}: A PosVelAtt File needs a position. Please provide"
180 " either 'X-ECEF [m]', 'Y-ECEF [m]', 'Z-ECEF [m]'"
181 " or 'Latitude [deg]', 'Longitude [deg]', 'Altitude [m]'.",
182 nameId());
183 return false;
184 }
185 1 _fileContent = FileContent::Pos;
186
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
3 outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier = std::vector{ Pos::type() };
187
188
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 if (((hasCol("X velocity ECEF [m/s]") || hasCol("Vel ECEF X [m/s]"))
189
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 && (hasCol("Y velocity ECEF [m/s]") || hasCol("Vel ECEF Y [m/s]"))
190
4/8
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
1 && (hasCol("Z velocity ECEF [m/s]") || hasCol("Vel ECEF Z [m/s]")))
191
2/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
2 || ((hasCol("North velocity [m/s]") || hasCol("Vel N [m/s]"))
192 && (hasCol("East velocity [m/s]") || hasCol("Vel E [m/s]"))
193 && (hasCol("Down velocity [m/s]") || hasCol("Vel D [m/s]"))))
194 {
195 1 _fileContent = FileContent::PosVel;
196
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
3 outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier = std::vector{ PosVel::type() };
197
198
1/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
1 if ((hasCol("n_Quat_b w") && hasCol("n_Quat_b x") && hasCol("n_Quat_b y") && hasCol("n_Quat_b z"))
199
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
1 || (hasCol("Roll [deg]") && hasCol("Pitch [deg]") && hasCol("Yaw [deg]")))
200 {
201 1 _fileContent = FileContent::PosVelAtt;
202
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
3 outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier = std::vector{ PosVelAtt::type() };
203 }
204 }
205
206
2/2
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 1 times.
3 for (auto& link : outputPins[OUTPUT_PORT_INDEX_PVA].links)
207 {
208
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
2 if (auto* pin = link.getConnectedPin())
209 {
210
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 outputPins[OUTPUT_PORT_INDEX_PVA].recreateLink(*pin);
211 }
212 }
213
214 1 return true;
215 }
216
217 outputPins[OUTPUT_PORT_INDEX_PVA].dataIdentifier = { Pos::type(), PosVel::type(), PosVelAtt::type() };
218 return false;
219 3 }
220
221 1 void NAV::PosVelAttFile::deinitialize()
222 {
223 LOG_TRACE("{}: called", nameId());
224
225 1 FileReader::deinitialize();
226 1 }
227
228 2 bool NAV::PosVelAttFile::resetNode()
229 {
230 2 FileReader::resetReader();
231
232 2 return true;
233 }
234
235 6003 std::shared_ptr<const NAV::NodeData> NAV::PosVelAttFile::pollData()
236 {
237 6003 std::shared_ptr<Pos> obs;
238
1/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 6003 times.
✗ Branch 3 not taken.
6003 switch (_fileContent)
239 {
240 case FileContent::Pos:
241 obs = std::make_shared<Pos>();
242 break;
243 case FileContent::PosVel:
244 obs = std::make_shared<PosVel>();
245 break;
246 6003 case FileContent::PosVelAtt:
247
1/2
✓ Branch 1 taken 6003 times.
✗ Branch 2 not taken.
6003 obs = std::make_shared<PosVelAtt>();
248 6003 break;
249 }
250
251 // Read line
252 12006 std::string line;
253
1/2
✓ Branch 1 taken 6003 times.
✗ Branch 2 not taken.
6003 getline(line);
254 // Remove any starting non text characters
255
2/4
✓ Branch 1 taken 6003 times.
✗ Branch 2 not taken.
✓ Branch 7 taken 6003 times.
✗ Branch 8 not taken.
12005 line.erase(line.begin(), std::ranges::find_if(line, [](int ch) { return std::isgraph(ch); }));
256
257
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 6002 times.
6003 if (line.empty())
258 {
259 1 return nullptr;
260 }
261
262 // Convert line into stream
263
1/2
✓ Branch 2 taken 6002 times.
✗ Branch 3 not taken.
12004 std::stringstream lineStream(line);
264 12004 std::string cell;
265
266 6002 std::optional<uint16_t> gpsCycle = 0;
267 6002 std::optional<uint16_t> gpsWeek;
268 6002 std::optional<long double> gpsToW;
269 6002 std::optional<double> e_position_x;
270 6002 std::optional<double> e_position_y;
271 6002 std::optional<double> e_position_z;
272 6002 std::optional<double> e_positionStdDev_x;
273 6002 std::optional<double> e_positionStdDev_y;
274 6002 std::optional<double> e_positionStdDev_z;
275 6002 std::optional<double> lla_position_x;
276 6002 std::optional<double> lla_position_y;
277 6002 std::optional<double> lla_position_z;
278 6002 std::optional<double> n_positionStdDev_n;
279 6002 std::optional<double> n_positionStdDev_e;
280 6002 std::optional<double> n_positionStdDev_d;
281 6002 std::optional<double> e_velocity_x;
282 6002 std::optional<double> e_velocity_y;
283 6002 std::optional<double> e_velocity_z;
284 6002 std::optional<double> e_velocityStdDev_x;
285 6002 std::optional<double> e_velocityStdDev_y;
286 6002 std::optional<double> e_velocityStdDev_z;
287 6002 std::optional<double> n_velocity_n;
288 6002 std::optional<double> n_velocity_e;
289 6002 std::optional<double> n_velocity_d;
290 6002 std::optional<double> n_velocityStdDev_n;
291 6002 std::optional<double> n_velocityStdDev_e;
292 6002 std::optional<double> n_velocityStdDev_d;
293 6002 std::optional<double> n_Quat_b_w;
294 6002 std::optional<double> n_Quat_b_x;
295 6002 std::optional<double> n_Quat_b_y;
296 6002 std::optional<double> n_Quat_b_z;
297 6002 std::optional<double> roll;
298 6002 std::optional<double> pitch;
299 6002 std::optional<double> yaw;
300
301 // Split line at comma
302
2/2
✓ Branch 5 taken 78026 times.
✓ Branch 6 taken 6002 times.
84028 for (const auto& column : _headerColumns)
303 {
304
3/6
✓ Branch 1 taken 78026 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 78026 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 78026 times.
✗ Branch 7 not taken.
78026 if (std::getline(lineStream, cell, ','))
305 {
306 // Remove any trailing non text characters
307
2/4
✓ Branch 3 taken 78026 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 78026 times.
✗ Branch 8 not taken.
607423 cell.erase(std::ranges::find_if(cell, [](int ch) { return std::iscntrl(ch); }), cell.end());
308
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 78026 times.
78026 if (cell.empty())
309 {
310 continue;
311 }
312
313
4/6
✓ Branch 1 taken 78026 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6002 times.
✓ Branch 4 taken 72024 times.
✓ Branch 6 taken 6002 times.
✗ Branch 7 not taken.
78026 if (column == "GpsCycle") { gpsCycle = static_cast<uint16_t>(std::stoul(cell)); }
314
4/6
✓ Branch 1 taken 72024 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6002 times.
✓ Branch 4 taken 66022 times.
✓ Branch 6 taken 6002 times.
✗ Branch 7 not taken.
72024 else if (column == "GpsWeek") { gpsWeek = static_cast<uint16_t>(std::stoul(cell)); }
315
4/6
✓ Branch 1 taken 66022 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6002 times.
✓ Branch 4 taken 60020 times.
✓ Branch 6 taken 6002 times.
✗ Branch 7 not taken.
66022 else if (column == "GpsToW [s]") { gpsToW = std::stold(cell); }
316
317
8/12
✓ Branch 1 taken 60020 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 60020 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 60020 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6002 times.
✓ Branch 9 taken 54018 times.
✓ Branch 10 taken 6002 times.
✓ Branch 11 taken 54018 times.
✓ Branch 13 taken 6002 times.
✗ Branch 14 not taken.
60020 else if (column == "X-ECEF [m]" || column == "Pos ECEF X [m]") { e_position_x = std::stod(cell); }
318
8/12
✓ Branch 1 taken 54018 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 54018 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 54018 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6002 times.
✓ Branch 9 taken 48016 times.
✓ Branch 10 taken 6002 times.
✓ Branch 11 taken 48016 times.
✓ Branch 13 taken 6002 times.
✗ Branch 14 not taken.
54018 else if (column == "Y-ECEF [m]" || column == "Pos ECEF Y [m]") { e_position_y = std::stod(cell); }
319
8/12
✓ Branch 1 taken 48016 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 48016 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 48016 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6002 times.
✓ Branch 9 taken 42014 times.
✓ Branch 10 taken 6002 times.
✓ Branch 11 taken 42014 times.
✓ Branch 13 taken 6002 times.
✗ Branch 14 not taken.
48016 else if (column == "Z-ECEF [m]" || column == "Pos ECEF Z [m]") { e_position_z = std::stod(cell); }
320
2/6
✓ Branch 1 taken 42014 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 42014 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
42014 else if (column == "X-ECEF StDev [m]") { e_positionStdDev_x = std::stod(cell); }
321
2/6
✓ Branch 1 taken 42014 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 42014 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
42014 else if (column == "Y-ECEF StDev [m]") { e_positionStdDev_y = std::stod(cell); }
322
2/6
✓ Branch 1 taken 42014 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 42014 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
42014 else if (column == "Z-ECEF StDev [m]") { e_positionStdDev_z = std::stod(cell); }
323
324
2/6
✓ Branch 1 taken 42014 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 42014 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
42014 else if (column == "Latitude [deg]") { lla_position_x = deg2rad(std::stod(cell)); }
325
2/6
✓ Branch 1 taken 42014 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 42014 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
42014 else if (column == "Longitude [deg]") { lla_position_y = deg2rad(std::stod(cell)); }
326
2/6
✓ Branch 1 taken 42014 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 42014 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
42014 else if (column == "Altitude [m]") { lla_position_z = std::stod(cell); }
327
2/6
✓ Branch 1 taken 42014 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 42014 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
42014 else if (column == "North StDev [m]") { n_positionStdDev_n = deg2rad(std::stod(cell)); }
328
2/6
✓ Branch 1 taken 42014 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 42014 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
42014 else if (column == "East StDev [m]") { n_positionStdDev_e = deg2rad(std::stod(cell)); }
329
2/6
✓ Branch 1 taken 42014 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 42014 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
42014 else if (column == "Down StDev [m]") { n_positionStdDev_d = std::stod(cell); }
330
331
8/12
✓ Branch 1 taken 42014 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 42014 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 42014 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6002 times.
✓ Branch 9 taken 36012 times.
✓ Branch 10 taken 6002 times.
✓ Branch 11 taken 36012 times.
✓ Branch 13 taken 6002 times.
✗ Branch 14 not taken.
42014 else if (column == "X velocity ECEF [m/s]" || column == "Vel ECEF X [m/s]") { e_velocity_x = std::stod(cell); }
332
8/12
✓ Branch 1 taken 36012 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36012 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 36012 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6002 times.
✓ Branch 9 taken 30010 times.
✓ Branch 10 taken 6002 times.
✓ Branch 11 taken 30010 times.
✓ Branch 13 taken 6002 times.
✗ Branch 14 not taken.
36012 else if (column == "Y velocity ECEF [m/s]" || column == "Vel ECEF Y [m/s]") { e_velocity_y = std::stod(cell); }
333
8/12
✓ Branch 1 taken 30010 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 30010 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 30010 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 6002 times.
✓ Branch 9 taken 24008 times.
✓ Branch 10 taken 6002 times.
✓ Branch 11 taken 24008 times.
✓ Branch 13 taken 6002 times.
✗ Branch 14 not taken.
30010 else if (column == "Z velocity ECEF [m/s]" || column == "Vel ECEF Z [m/s]") { e_velocity_z = std::stod(cell); }
334
2/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24008 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
24008 else if (column == "X velocity ECEF StdDev [m/s]") { e_velocityStdDev_x = std::stod(cell); }
335
2/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24008 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
24008 else if (column == "Y velocity ECEF StdDev [m/s]") { e_velocityStdDev_y = std::stod(cell); }
336
2/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24008 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
24008 else if (column == "Z velocity ECEF StdDev [m/s]") { e_velocityStdDev_z = std::stod(cell); }
337
338
5/12
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24008 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 24008 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 24008 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 24008 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
24008 else if (column == "North velocity [m/s]" || column == "Vel N [m/s]") { n_velocity_n = std::stod(cell); }
339
5/12
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24008 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 24008 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 24008 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 24008 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
24008 else if (column == "East velocity [m/s]" || column == "Vel E [m/s]") { n_velocity_e = std::stod(cell); }
340
5/12
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24008 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 24008 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 24008 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 24008 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
24008 else if (column == "Down velocity [m/s]" || column == "Vel D [m/s]") { n_velocity_d = std::stod(cell); }
341
2/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24008 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
24008 else if (column == "North velocity StDev [m/s]") { n_velocityStdDev_n = std::stod(cell); }
342
2/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24008 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
24008 else if (column == "East velocity StDev [m/s]") { n_velocityStdDev_e = std::stod(cell); }
343
2/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24008 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
24008 else if (column == "Down velocity StDev [m/s]") { n_velocityStdDev_d = std::stod(cell); }
344
345
2/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24008 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
24008 else if (column == "n_Quat_b w") { n_Quat_b_w = std::stod(cell); }
346
2/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24008 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
24008 else if (column == "n_Quat_b x") { n_Quat_b_x = std::stod(cell); }
347
2/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24008 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
24008 else if (column == "n_Quat_b y") { n_Quat_b_y = std::stod(cell); }
348
2/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24008 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
24008 else if (column == "n_Quat_b z") { n_Quat_b_z = std::stod(cell); }
349
350
4/6
✓ Branch 1 taken 24008 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6002 times.
✓ Branch 4 taken 18006 times.
✓ Branch 6 taken 6002 times.
✗ Branch 7 not taken.
24008 else if (column == "Roll [deg]") { roll = deg2rad(std::stod(cell)); }
351
4/6
✓ Branch 1 taken 18006 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6002 times.
✓ Branch 4 taken 12004 times.
✓ Branch 6 taken 6002 times.
✗ Branch 7 not taken.
18006 else if (column == "Pitch [deg]") { pitch = deg2rad(std::stod(cell)); }
352
4/6
✓ Branch 1 taken 12004 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6002 times.
✓ Branch 4 taken 6002 times.
✓ Branch 6 taken 6002 times.
✗ Branch 7 not taken.
12004 else if (column == "Yaw [deg]") { yaw = deg2rad(std::stod(cell)); }
353 }
354 }
355
356
4/8
✓ Branch 1 taken 6002 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6002 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6002 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6002 times.
✗ Branch 10 not taken.
6002 if (gpsCycle.has_value() && gpsWeek.has_value() && gpsToW.has_value())
357 {
358
4/8
✓ Branch 2 taken 6002 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6002 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6002 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 6002 times.
✗ Branch 12 not taken.
6002 obs->insTime = InsTime(gpsCycle.value(), gpsWeek.value(), gpsToW.value());
359 }
360 else
361 {
362 LOG_WARN("{}: A PosVelAtt File needs a time.", nameId());
363 return nullptr;
364 }
365
366
2/4
✓ Branch 0 taken 6002 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6002 times.
✗ Branch 3 not taken.
6002 if (_fileContent == FileContent::PosVel || _fileContent == FileContent::PosVelAtt)
367 {
368
4/8
✓ Branch 1 taken 6002 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6002 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6002 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6002 times.
✗ Branch 10 not taken.
6002 if (e_velocity_x.has_value() && e_velocity_y.has_value() && e_velocity_z.has_value())
369 {
370
0/4
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
6002 auto lla_pos = lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value()
371
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6002 times.
6002 ? Eigen::Vector3d(*lla_position_x, *lla_position_y, *lla_position_z)
372
2/6
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 7 taken 6002 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6002 times.
✗ Branch 11 not taken.
6002 : trafo::ecef2lla_WGS84(Eigen::Vector3d(*e_position_x, *e_position_y, *e_position_z));
373
5/10
✓ Branch 4 taken 6002 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6002 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6002 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 6002 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 6002 times.
✗ Branch 17 not taken.
6002 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
1/2
✓ Branch 1 taken 6002 times.
✗ Branch 2 not taken.
6002 n_velocity_n = n_vel.x();
375
1/2
✓ Branch 1 taken 6002 times.
✗ Branch 2 not taken.
6002 n_velocity_e = n_vel.y();
376
1/2
✓ Branch 1 taken 6002 times.
✗ Branch 2 not taken.
6002 n_velocity_d = n_vel.z();
377 }
378 else if (n_velocity_n.has_value() && n_velocity_e.has_value() && n_velocity_d.has_value())
379 {
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)
382 : trafo::ecef2lla_WGS84(Eigen::Vector3d(*e_position_x, *e_position_y, *e_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();
387 }
388
389
2/4
✓ Branch 2 taken 6002 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6002 times.
✗ Branch 6 not taken.
12004 if (e_position_x.has_value() && e_position_y.has_value() && e_position_z.has_value()
390
5/10
✓ Branch 0 taken 6002 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 6002 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 6002 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 6002 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 6002 times.
✗ Branch 12 not taken.
12004 && e_velocity_x.has_value() && e_velocity_y.has_value() && e_velocity_z.has_value())
391 {
392
1/2
✓ Branch 2 taken 6002 times.
✗ Branch 3 not taken.
6002 if (auto posVel = std::reinterpret_pointer_cast<PosVel>(obs))
393 {
394
0/4
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
6002 if (e_positionStdDev_x.has_value() && e_positionStdDev_y.has_value() && e_positionStdDev_z.has_value()
395
2/10
✗ Branch 0 not taken.
✓ Branch 1 taken 6002 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 6002 times.
6002 && e_velocityStdDev_x.has_value() && e_velocityStdDev_y.has_value() && e_velocityStdDev_z.has_value())
396 {
397 ;
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())
402 .finished()
403 .asDiagonal()
404 .toDenseMatrix());
405 }
406 else
407 {
408
5/10
✓ Branch 2 taken 6002 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6002 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6002 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 6002 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 6002 times.
✗ Branch 15 not taken.
6002 posVel->setPosition_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() });
409
5/10
✓ Branch 2 taken 6002 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6002 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6002 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 6002 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 6002 times.
✗ Branch 15 not taken.
6002 posVel->setVelocity_e(Eigen::Vector3d{ e_velocity_x.value(), e_velocity_y.value(), e_velocity_z.value() });
410 }
411 6002 }
412 }
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())
415 {
416 if (auto posVel = std::reinterpret_pointer_cast<PosVel>(obs))
417 {
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())
420 {
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())
425 .finished()
426 .asDiagonal()
427 .toDenseMatrix());
428 }
429 else
430 {
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() });
433 }
434 }
435 }
436 else
437 {
438 LOG_WARN("{}: A PosVel/PosVelAtt file needs a position and velocity.", nameId());
439 return nullptr;
440 }
441 6002 }
442 else if (_fileContent == FileContent::Pos)
443 {
444 if (e_position_x.has_value() && e_position_y.has_value() && e_position_z.has_value())
445 {
446 if (e_positionStdDev_x.has_value() && e_positionStdDev_y.has_value() && e_positionStdDev_z.has_value())
447 {
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());
450 }
451 else
452 {
453 obs->setPosition_e(Eigen::Vector3d{ e_position_x.value(), e_position_y.value(), e_position_z.value() });
454 }
455 }
456 else if (lla_position_x.has_value() && lla_position_y.has_value() && lla_position_z.has_value())
457 {
458 if (n_positionStdDev_n.has_value() && n_positionStdDev_e.has_value() && n_positionStdDev_d.has_value())
459 {
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());
462 }
463 else
464 {
465 obs->setPosition_lla(Eigen::Vector3d{ lla_position_x.value(), lla_position_y.value(), lla_position_z.value() });
466 }
467 }
468 else
469 {
470 LOG_WARN("{}: A Pos file needs a position.", nameId());
471 return nullptr;
472 }
473 }
474
475
1/2
✓ Branch 0 taken 6002 times.
✗ Branch 1 not taken.
6002 if (_fileContent == FileContent::PosVelAtt)
476 {
477
2/10
✗ Branch 1 not taken.
✓ Branch 2 taken 6002 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 6002 times.
6002 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())
478 {
479 if (auto posVelAtt = std::reinterpret_pointer_cast<PosVelAtt>(obs))
480 {
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() });
482 }
483 }
484
4/8
✓ Branch 1 taken 6002 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6002 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6002 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6002 times.
✗ Branch 10 not taken.
6002 else if (roll.has_value() && pitch.has_value() && yaw.has_value())
485 {
486
1/2
✓ Branch 2 taken 6002 times.
✗ Branch 3 not taken.
6002 if (auto posVelAtt = std::reinterpret_pointer_cast<PosVelAtt>(obs))
487 {
488
5/10
✓ Branch 2 taken 6002 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6002 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 6002 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 6002 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 6002 times.
✗ Branch 15 not taken.
6002 posVelAtt->setAttitude_n_Quat_b(trafo::n_Quat_b(roll.value(), pitch.value(), yaw.value()));
489 6002 }
490 }
491 }
492
493
1/2
✓ Branch 2 taken 6002 times.
✗ Branch 3 not taken.
6002 invokeCallbacks(OUTPUT_PORT_INDEX_PVA, obs);
494 6002 return obs;
495 6003 }
496