ros_parser.cpp
Go to the documentation of this file.
1 #include "ros_parser.h"
2 #include "data_tamer_parser/data_tamer_parser.hpp"
4 #include <queue>
5 #include <algorithm>
6 #include <unordered_map>
7 #include <tuple>
8 #include <vector>
9 #include <string>
10 #include <utility>
11 
12 using namespace PJ;
13 using namespace RosMsgParser;
14 
16 constexpr double RAD_TO_DEG = 180.0 / M_PI;
17 
18 static std::unordered_map<uint64_t, DataTamerParser::Schema> _global_data_tamer_schemas;
19 
20 ParserROS::ParserROS(const std::string& topic_name, const std::string& type_name,
21  const std::string& schema, RosMsgParser::Deserializer* deserializer,
23  : MessageParser(topic_name, data)
24  , _parser(topic_name, type_name, schema)
25  , _deserializer(deserializer)
26  , _topic(topic_name)
27 {
28  auto policy =
29  clampLargeArray() ? Parser::KEEP_LARGE_ARRAYS : Parser::DISCARD_LARGE_ARRAYS;
30 
32 
33  const auto& root_fields = _parser.getSchema()->root_msg->fields();
34  _has_header = !root_fields.empty() && root_fields.front().type().baseName() == "std_"
35  "msgs/"
36  "Header";
37 
38  using std::placeholders::_1;
39  using std::placeholders::_2;
40  if (Msg::Empty::id() == type_name)
41  {
42  _customized_parser = std::bind(&ParserROS::parseEmpty, this, _1, _2);
43  }
44  else if (Msg::DiagnosticArray::id() == type_name)
45  {
46  _customized_parser = std::bind(&ParserROS::parseDiagnosticMsg, this, _1, _2);
47  }
48  else if (Msg::JointState::id() == type_name)
49  {
50  _customized_parser = std::bind(&ParserROS::parseJointStateMsg, this, _1, _2);
51  }
52  else if (Msg::TFMessage::id() == type_name)
53  {
54  _customized_parser = std::bind(&ParserROS::parseTF2Msg, this, _1, _2);
55  }
56  else if (Msg::DataTamerSchemas::id() == type_name)
57  {
58  _customized_parser = std::bind(&ParserROS::parseDataTamerSchemas, this, _1, _2);
59  }
60  else if (Msg::DataTamerSnapshot::id() == type_name)
61  {
62  _customized_parser = std::bind(&ParserROS::parseDataTamerSnapshot, this, _1, _2);
63  }
64  else if (Msg::Imu::id() == type_name)
65  {
66  _customized_parser = std::bind(&ParserROS::parseImu, this, _1, _2);
67  }
68  else if (Msg::Pose::id() == type_name)
69  {
70  _customized_parser = std::bind(&ParserROS::parsePose, this, _1, _2);
71  }
72  else if (Msg::PoseStamped::id() == type_name)
73  {
74  _customized_parser = std::bind(&ParserROS::parsePoseStamped, this, _1, _2);
75  }
76  else if (Msg::Odometry::id() == type_name)
77  {
78  _customized_parser = std::bind(&ParserROS::parseOdometry, this, _1, _2);
79  }
80  else if (Msg::Transform::id() == type_name)
81  {
82  _customized_parser = std::bind(&ParserROS::parseTransform, this, _1, _2);
83  }
84  else if (Msg::TransformStamped::id() == type_name)
85  {
86  _customized_parser = std::bind(&ParserROS::parseTransformStamped, this, _1, _2);
87  }
88  else if (Msg::PalStatisticsNames::id() == type_name || type_name == "plotjuggler_msgs/"
89  "StatisticsNames")
90  {
91  _customized_parser = std::bind(&ParserROS::parsePalStatisticsNames, this, _1, _2);
92  }
93  else if (Msg::PalStatisticsValues::id() == type_name || type_name == "plotjuggler_msgs/"
94  "StatisticsValues")
95  {
96  _customized_parser = std::bind(&ParserROS::parsePalStatisticsValues, this, _1, _2);
97  }
98  else if ("tsl_msgs/TSLDefinition" == type_name)
99  {
100  _customized_parser = std::bind(&ParserROS::parseTSLDefinition, this, _1, _2);
101  }
102  else if ("tsl_msgs/TSLValues" == type_name)
103  {
104  _customized_parser = std::bind(&ParserROS::parseTSLValues, this, _1, _2);
105  }
106 }
107 
108 bool ParserROS::parseMessage(const PJ::MessageRef serialized_msg, double& timestamp)
109 {
110  if (_customized_parser)
111  {
112  _deserializer->init(
113  Span<const uint8_t>(serialized_msg.data(), serialized_msg.size()));
115  return true;
116  }
117 
118  _parser.deserialize(serialized_msg, &_flat_msg, _deserializer.get());
119 
120  if (_has_header && this->useEmbeddedTimestamp())
121  {
122  double ts = 0;
123  if (_deserializer->isROS2())
124  {
125  auto sec = _flat_msg.value[0].second.convert<double>();
126  auto nsec = _flat_msg.value[1].second.convert<double>();
127  ts = sec + 1e-9 * nsec;
128  }
129  else
130  {
131  ts = _flat_msg.value[1].second.convert<RosMsgParser::Time>().toSec();
132  }
133  timestamp = (ts > 0) ? ts : timestamp;
134  }
135 
136  std::string series_name;
137 
138  for (const auto& [key, str] : _flat_msg.name)
139  {
140  key.toStr(series_name);
141  StringSeries& data = getStringSeries(series_name);
142  data.pushBack({ timestamp, str });
143  }
144 
145  for (const auto& [key, value] : _flat_msg.value)
146  {
147  key.toStr(series_name);
148  PlotData& data = getSeries(series_name);
149 
151  {
152  // bypass the truncation check
153  if (value.getTypeID() == BuiltinType::INT64)
154  {
155  data.pushBack({ timestamp, double(value.convert<int64_t>()) });
156  continue;
157  }
158  if (value.getTypeID() == BuiltinType::UINT64)
159  {
160  data.pushBack({ timestamp, double(value.convert<uint64_t>()) });
161  continue;
162  }
163  }
164  try
165  {
166  data.pushBack({ timestamp, value.convert<double>() });
167  }
168  catch (RangeException& ex)
169  {
170  std::string msg = std::string(ex.what());
171  if (msg == "Floating point truncated")
172  {
173  msg += ".\n\nYou can disable this check in:\n"
174  "App -> Preferences... -> Behavior -> Parsing";
175  }
176  throw std::runtime_error(msg);
177  }
178  }
179  return true;
180 }
181 
182 void ParserROS::setLargeArraysPolicy(bool clamp, unsigned max_size)
183 {
184  auto policy = clamp ? RosMsgParser::Parser::KEEP_LARGE_ARRAYS :
186 
187  _parser.setMaxArrayPolicy(policy, max_size);
188  MessageParser::setLargeArraysPolicy(clamp, max_size);
189 }
190 
191 //------------------------------------------------------------------------
192 
194 {
196  // only ROS1 as the files header.seq
197  if (dynamic_cast<ROS_Deserializer*>(_deserializer.get()) != nullptr)
198  {
199  header.seq = _deserializer->deserializeUInt32();
200  }
201 
202  header.stamp.sec = _deserializer->deserializeUInt32();
203  header.stamp.nanosec = _deserializer->deserializeUInt32();
204 
205  const double ts = header.stamp.toSec();
206  if (useEmbeddedTimestamp() && ts > 0)
207  {
208  timestamp = ts;
209  }
210  _deserializer->deserializeString(header.frame_id);
211 
212  return header;
213 }
214 
215 void ParserROS::parseHeader(const std::string& prefix, double& timestamp)
216 {
217  const auto header = readHeader(timestamp);
218 
219  getSeries(prefix + "/header/stamp").pushBack({ timestamp, header.stamp.toSec() });
220  getStringSeries(prefix + "/header/frame_id").pushBack({ timestamp, header.frame_id });
221  if (dynamic_cast<ROS_Deserializer*>(_deserializer.get()) != nullptr)
222  {
223  getSeries(prefix + "/header/seq").pushBack({ timestamp, double(header.seq) });
224  }
225 }
226 
227 void ParserROS::parseEmpty(const std::string& prefix, double& timestamp)
228 {
229  getSeries(prefix).pushBack({ timestamp, 0 });
230 }
231 
232 void ParserROS::parseVector3(const std::string& prefix, double& timestamp)
233 {
234  auto x = _deserializer->deserialize(FLOAT64).convert<double>();
235  auto y = _deserializer->deserialize(FLOAT64).convert<double>();
236  auto z = _deserializer->deserialize(FLOAT64).convert<double>();
237  getSeries(prefix + "/x").pushBack({ timestamp, x });
238  getSeries(prefix + "/y").pushBack({ timestamp, y });
239  getSeries(prefix + "/z").pushBack({ timestamp, z });
240 }
241 
242 void ParserROS::parsePoint(const std::string& prefix, double& timestamp)
243 {
244  auto x = _deserializer->deserialize(FLOAT64).convert<double>();
245  auto y = _deserializer->deserialize(FLOAT64).convert<double>();
246  auto z = _deserializer->deserialize(FLOAT64).convert<double>();
247  getSeries(prefix + "/x").pushBack({ timestamp, x });
248  getSeries(prefix + "/y").pushBack({ timestamp, y });
249  getSeries(prefix + "/z").pushBack({ timestamp, z });
250 }
251 
252 void ParserROS::parseQuaternion(const std::string& prefix, double& timestamp)
253 {
254  PJ::Msg::Quaternion quat;
255  quat.x = _deserializer->deserialize(FLOAT64).convert<double>();
256  quat.y = _deserializer->deserialize(FLOAT64).convert<double>();
257  quat.z = _deserializer->deserialize(FLOAT64).convert<double>();
258  quat.w = _deserializer->deserialize(FLOAT64).convert<double>();
259  getSeries(prefix + "/x").pushBack({ timestamp, quat.x });
260  getSeries(prefix + "/y").pushBack({ timestamp, quat.y });
261  getSeries(prefix + "/z").pushBack({ timestamp, quat.z });
262  getSeries(prefix + "/w").pushBack({ timestamp, quat.w });
263 
264  auto rpy = Msg::QuaternionToRPY(quat);
265  getSeries(prefix + "/roll").pushBack({ timestamp, rpy.roll });
266  getSeries(prefix + "/pitch").pushBack({ timestamp, rpy.pitch });
267  getSeries(prefix + "/yaw").pushBack({ timestamp, rpy.yaw });
268 }
269 
270 void ParserROS::parseTwist(const std::string& prefix, double& timestamp)
271 {
272  parseVector3(prefix + "/linear", timestamp);
273  parseVector3(prefix + "/angular", timestamp);
274 }
275 
276 void ParserROS::parseTwistWithCovariance(const std::string& prefix, double& timestamp)
277 {
278  parseTwist(prefix + "/twist", timestamp);
279  parseCovariance<6>(prefix + "/covariance", timestamp);
280 }
281 
282 void ParserROS::parseTransform(const std::string& prefix, double& timestamp)
283 {
284  parsePoint(prefix + "/translation", timestamp);
285  parseQuaternion(prefix + "/rotation", timestamp);
286 }
287 
288 void ParserROS::parseTransformStamped(const std::string& prefix, double& timestamp)
289 {
290  parseHeader(prefix + "/header", timestamp);
291 
292  std::string child_frame_id;
293  _deserializer->deserializeString(child_frame_id);
294  getStringSeries(prefix + "/child_frame_id").pushBack({ timestamp, child_frame_id });
295 
296  parseTransform(prefix + "/transform", timestamp);
297 }
298 
299 void ParserROS::parsePose(const std::string& prefix, double& timestamp)
300 {
301  parseVector3(prefix + "/position", timestamp);
302  parseQuaternion(prefix + "/orientation", timestamp);
303 }
304 
305 void ParserROS::parsePoseStamped(const std::string& prefix, double& timestamp)
306 {
307  parseHeader(prefix + "/header", timestamp);
308  parsePose(prefix + "/pose", timestamp);
309 }
310 
311 void ParserROS::parsePoseWithCovariance(const std::string& prefix, double& timestamp)
312 {
313  parsePose(prefix + "/pose", timestamp);
314  parseCovariance<6>(prefix + "/covariance", timestamp);
315 }
316 
317 void ParserROS::parseImu(const std::string& prefix, double& timestamp)
318 {
319  parseHeader(prefix + "/header", timestamp);
320 
321  parseQuaternion(prefix + "/orientation", timestamp);
322  parseCovariance<3>(prefix + "/orientation_covariance", timestamp);
323 
324  parseVector3(prefix + "/angular_velocity", timestamp);
325  parseCovariance<3>(prefix + "/angular_velocity_covariance", timestamp);
326 
327  parseVector3(prefix + "/linear_acceleration", timestamp);
328  parseCovariance<3>(prefix + "/linear_acceleration_covariance", timestamp);
329 }
330 
331 void ParserROS::parseOdometry(const std::string& prefix, double& timestamp)
332 {
333  parseHeader(prefix + "/header", timestamp);
334  std::string child_frame_id;
335  _deserializer->deserializeString(child_frame_id);
336  getStringSeries(prefix + "/child_frame_id").pushBack({ timestamp, child_frame_id });
337  parsePoseWithCovariance(prefix + "/pose", timestamp);
338  parseTwistWithCovariance(prefix + "/twist", timestamp);
339 }
340 
341 void ParserROS::parseDiagnosticMsg(const std::string& prefix, double& timestamp)
342 {
343  thread_local Msg::DiagnosticArray msg;
344 
345  parseHeader(prefix + "/header", timestamp);
346 
347  size_t status_count = _deserializer->deserializeUInt32();
348  msg.status.resize(status_count);
349 
350  for (size_t st = 0; st < status_count; st++)
351  {
352  auto& status = msg.status[st];
353  status.level = _deserializer->deserialize(BYTE).convert<uint8_t>();
354  _deserializer->deserializeString(status.name);
355  _deserializer->deserializeString(status.message);
356  _deserializer->deserializeString(status.hardware_id);
357 
358  status.key_value.clear();
359 
360  size_t key_value_count = _deserializer->deserializeUInt32();
361  std::string key;
362  std::string value_str;
363  for (size_t kv = 0; kv < key_value_count; kv++)
364  {
365  _deserializer->deserializeString(key);
366  _deserializer->deserializeString(value_str);
367  status.key_value.push_back({ key, value_str });
368  }
369  }
370 
371  //------ Now create the series --------
372 
373  std::string series_name;
374 
375  for (const auto& status : msg.status)
376  {
377  for (const auto& kv : status.key_value)
378  {
379  if (status.hardware_id.empty())
380  {
381  series_name = fmt::format("{}/{}/{}", prefix, status.name, kv.first);
382  }
383  else
384  {
385  series_name =
386  fmt::format("{}/{}/{}/{}", prefix, status.hardware_id, status.name, kv.first);
387  }
388 
389  bool ok;
390  double value = QString::fromStdString(kv.second).toDouble(&ok);
391 
392  if (ok)
393  {
394  getSeries(series_name).pushBack({ timestamp, value });
395  }
396  else
397  {
398  getStringSeries(series_name).pushBack({ timestamp, kv.second });
399  }
400  }
401  }
402 }
403 
404 void ParserROS::parseJointStateMsg(const std::string& prefix, double& timestamp)
405 {
406  thread_local Msg::JointState msg;
407 
408  msg.name.clear();
409  msg.position.clear();
410  msg.velocity.clear();
411  msg.effort.clear();
412 
413  parseHeader(prefix, timestamp);
414 
415  size_t name_size = _deserializer->deserializeUInt32();
416  if (name_size > 0)
417  {
418  msg.name.resize(name_size);
419  for (auto& name : msg.name)
420  {
421  _deserializer->deserializeString(name);
422  }
423  }
424 
425  //-----------
426  size_t pos_size = _deserializer->deserializeUInt32();
427  if (pos_size > 0)
428  {
429  msg.position.resize(pos_size);
430  for (auto& pos : msg.position)
431  {
432  pos = _deserializer->deserialize(FLOAT64).convert<double>();
433  }
434  }
435  //-----------
436  size_t vel_size = _deserializer->deserializeUInt32();
437  if (vel_size > 0)
438  {
439  msg.velocity.resize(vel_size);
440  for (auto& vel : msg.velocity)
441  {
442  vel = _deserializer->deserialize(FLOAT64).convert<double>();
443  }
444  }
445  //-----------
446  size_t eff_size = _deserializer->deserializeUInt32();
447  if (eff_size > 0)
448  {
449  msg.effort.resize(eff_size);
450  for (auto& eff : msg.effort)
451  {
452  eff = _deserializer->deserialize(FLOAT64).convert<double>();
453  }
454  }
455  //---------------------------
456  std::string series_name;
457  for (size_t i = 0; i < std::min(name_size, pos_size); i++)
458  {
459  series_name = fmt::format("{}/{}/position", _topic, msg.name[i]);
460  getSeries(series_name).pushBack({ timestamp, msg.position[i] });
461  }
462  for (size_t i = 0; i < std::min(name_size, vel_size); i++)
463  {
464  series_name = fmt::format("{}/{}/velocity", _topic, msg.name[i]);
465  getSeries(series_name).pushBack({ timestamp, msg.velocity[i] });
466  }
467  for (size_t i = 0; i < std::min(name_size, eff_size); i++)
468  {
469  series_name = fmt::format("{}/{}/effort", _topic, msg.name[i]);
470  getSeries(series_name).pushBack({ timestamp, msg.effort[i] });
471  }
472 }
473 
474 void ParserROS::parseTF2Msg(const std::string& prefix, double& timestamp)
475 {
476  const size_t transform_size = _deserializer->deserializeUInt32();
477 
478  if (transform_size == 0)
479  {
480  return;
481  }
482 
483  for (size_t i = 0; i < transform_size; i++)
484  {
485  const auto header = readHeader(timestamp);
486  std::string child_frame_id;
487  _deserializer->deserializeString(child_frame_id);
488 
489  std::string new_prefix;
490  if (header.frame_id.empty())
491  {
492  new_prefix = fmt::format("{}/{}", prefix, child_frame_id);
493  }
494  else
495  {
496  new_prefix = fmt::format("{}/{}/{}", prefix, header.frame_id, child_frame_id);
497  }
498  parseTransform(new_prefix, timestamp);
499  }
500 }
501 
502 void ParserROS::parseDataTamerSchemas(const std::string& prefix, double& timestamp)
503 {
504  const size_t vector_size = _deserializer->deserializeUInt32();
505 
506  for (size_t i = 0; i < vector_size; i++)
507  {
508  DataTamerParser::Schema schema;
509  schema.hash = _deserializer->deserialize(BuiltinType::UINT64).convert<uint64_t>();
510  std::string channel_name;
511  _deserializer->deserializeString(channel_name);
512  std::string schema_text;
513  _deserializer->deserializeString(schema_text);
514 
515  auto dt_schema = DataTamerParser::BuilSchemaFromText(schema_text);
516  dt_schema.channel_name = channel_name;
517  _global_data_tamer_schemas.insert({ dt_schema.hash, dt_schema });
518  }
519 }
520 
521 void ParserROS::parseDataTamerSnapshot(const std::string& prefix, double& timestamp)
522 {
523  DataTamerParser::SnapshotView snapshot;
524 
525  snapshot.timestamp =
526  _deserializer->deserialize(BuiltinType::UINT64).convert<uint64_t>();
527  snapshot.schema_hash =
528  _deserializer->deserialize(BuiltinType::UINT64).convert<uint64_t>();
529 
530  auto active_mask = _deserializer->deserializeByteSequence();
531  snapshot.active_mask = { active_mask.data(), active_mask.size() };
532 
533  auto payload = _deserializer->deserializeByteSequence();
534  snapshot.payload = { payload.data(), payload.size() };
535 
536  auto it = _global_data_tamer_schemas.find(snapshot.schema_hash);
537  if (it == _global_data_tamer_schemas.end())
538  {
539  return;
540  }
541  const auto& dt_schema = it->second;
542 
543  const auto toDouble = [](const auto& value) { return static_cast<double>(value); };
544 
545  auto callback = [&](const std::string& name_field,
546  const DataTamerParser::VarNumber& value) {
547  double timestamp = double(snapshot.timestamp) * 1e-9;
548  auto name = fmt::format("{}/{}/{}", _topic_name, dt_schema.channel_name, name_field);
549  getSeries(name).pushBack({ timestamp, std::visit(toDouble, value) });
550  };
551 
552  DataTamerParser::ParseSnapshot(dt_schema, snapshot, callback);
553 }
554 
555 static std::unordered_map<uint32_t, std::vector<std::string>> _pal_statistics_names;
556 
557 void ParserROS::parsePalStatisticsNames(const std::string& prefix, double& timestamp)
558 {
559  const auto header = readHeader(timestamp);
560  std::vector<std::string> names;
561  const size_t vector_size = _deserializer->deserializeUInt32();
562  names.resize(vector_size);
563  for (auto& name : names)
564  {
565  _deserializer->deserializeString(name);
566  }
567  uint32_t names_version = _deserializer->deserializeUInt32();
568  _pal_statistics_names[names_version] = std::move(names);
569 }
570 
571 void ParserROS::parsePalStatisticsValues(const std::string& prefix, double& timestamp)
572 {
573  const auto header = readHeader(timestamp);
574  std::vector<double> values;
575  const size_t vector_size = _deserializer->deserializeUInt32();
576  values.resize(vector_size);
577 
578  for (auto& value : values)
579  {
580  value = _deserializer->deserialize(BuiltinType::FLOAT64).convert<double>();
581  }
582  uint32_t names_version = _deserializer->deserializeUInt32();
583  auto it = _pal_statistics_names.find(names_version);
584  if (it != _pal_statistics_names.end())
585  {
586  const auto& names = it->second;
587  const size_t N = std::min(names.size(), values.size());
588  for (size_t i = 0; i < N; i++)
589  {
590  auto& series = getSeries(fmt::format("{}/{}", prefix, names[i]));
591  series.pushBack({ timestamp, values[i] });
592  }
593  }
594 }
595 
596 constexpr static std::array<BuiltinType, 11> _tsl_type_order = {
600 };
601 static std::unordered_map<std::uint64_t, std::vector<std::string>> _tsl_definitions;
602 // Add a buffer for messages that are received before their definition
603 static std::unordered_map<
604  std::uint64_t, std::queue<std::tuple<std::string, double, std::vector<double>>>>
606 inline void ParserROS::process_tsl_values(const std::string& prefix,
607  const double& timestamp,
608  const std::vector<std::string>& definition,
609  const std::vector<double>& values)
610 {
611  const std::size_t N = std::min(definition.size(), values.size());
612  for (size_t i = 0; i < N; i++)
613  {
614  auto& series = getSeries(fmt::format("{}/{}", prefix, definition[i]));
615  series.pushBack({ timestamp, values[i] });
616  }
617 }
618 
619 void ParserROS::parseTSLDefinition(const std::string& prefix, double& timestamp)
620 {
621  // region Deserialize into a flattened array of signal names since the type
622  // is not relevant inside plotjuggler any more
623  std::uint32_t sec = _deserializer->deserializeUInt32(); // stamp
624  std::uint32_t nsec = _deserializer->deserializeUInt32(); // stamp
625  std::size_t definition_hash =
626  _deserializer->deserialize(BuiltinType::UINT64).extract<std::size_t>();
627 
628  // Return if definition has already been parsed
629  if (_tsl_definitions.count(definition_hash) != 0)
630  {
631  // Do i have to flush the buffer in order to not create memory leaks?
632  return;
633  }
634  // Create the definition
635  std::vector<std::string> definition;
636 
637  std::size_t num_signals = 0;
638  std::size_t index = 0;
639  for (auto const& _ : _tsl_type_order)
640  {
641  num_signals = _deserializer->deserializeUInt32();
642  definition.resize(definition.size() + num_signals);
643  for (; index < definition.size(); index++)
644  {
645  _deserializer->deserializeString(definition[index]);
646  }
647  }
648  // endregion
649 
650  // Insert the scheme
651  _tsl_definitions[definition_hash] = std::move(definition);
652 
653  // Process all the stuff in the buffer
654  auto& buffer_queue = _tsl_values_buffer[definition_hash];
655  while (!buffer_queue.empty())
656  {
657  const auto& tuple = buffer_queue.front();
658  process_tsl_values(std::get<0>(tuple), std::get<1>(tuple),
659  _tsl_definitions[definition_hash], std::get<2>(tuple));
660  buffer_queue.pop();
661  }
662 }
663 void ParserROS::parseTSLValues(const std::string& prefix, double& timestamp)
664 {
665  // region Deserialize into a flattened array of double values since the type
666  // is not relevant inside plotjuggler any more
667  std::uint32_t sec = _deserializer->deserializeUInt32(); // stamp
668  std::uint32_t nsec = _deserializer->deserializeUInt32(); // stamp
669  std::size_t definition_hash =
670  _deserializer->deserialize(BuiltinType::UINT64).extract<std::size_t>();
671 
672  // Create the definition
673  std::vector<double> values;
674 
675  std::size_t num_signals = 0;
676  std::size_t index = 0;
677  for (auto const& type_id : _tsl_type_order)
678  {
679  num_signals = _deserializer->deserializeUInt32();
680  values.resize(values.size() + num_signals);
681  for (; index < values.size(); index++)
682  {
683  values[index] = _deserializer->deserialize(type_id).convert<double>();
684  }
685  }
686  // endregion
687 
688  // If no definition was found, add to the queue and return
689  if (_tsl_definitions.count(definition_hash) == 0)
690  {
691  _tsl_values_buffer[definition_hash].push({ prefix, timestamp, std::move(values) });
692  return;
693  }
694 
695  // Process the signal
696  process_tsl_values(prefix, timestamp, _tsl_definitions[definition_hash], values);
697 }
ParserROS::_strict_truncation_check
bool _strict_truncation_check
Definition: ros_parser.h:74
RosMsgParser::FLOAT32
@ FLOAT32
Definition: builtin_types.hpp:56
ParserROS::parseTwistWithCovariance
void parseTwistWithCovariance(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:276
PJ::TimeseriesBase
Definition: timeseries.h:16
quaternion_type
static ROSType quaternion_type(Msg::Quaternion::id())
RosMsgParser::ROSType
ROSType.
Definition: ros_type.hpp:39
ParserROS::parseEmpty
void parseEmpty(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:227
PJ::StringSeries::pushBack
void pushBack(const Point &p) override
Definition: stringseries.h:39
PJ::MessageParser::_topic_name
std::string _topic_name
Definition: messageparser_base.h:118
nonstd::span_lite::size_t
span_CONFIG_SIZE_TYPE size_t
Definition: span.hpp:576
definition
const char * definition()
ParserROS::parsePalStatisticsNames
void parsePalStatisticsNames(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:557
PJ::TimeseriesBase::pushBack
void pushBack(const Point &p) override
Definition: timeseries.h:61
RosMsgParser::INT8
@ INT8
Definition: builtin_types.hpp:52
RosMsgParser::Parser::setMaxArrayPolicy
void setMaxArrayPolicy(MaxArrayPolicy discard_entire_array, size_t max_array_size)
Definition: ros_parser.hpp:74
RosMsgParser::BYTE
@ BYTE
Definition: builtin_types.hpp:46
ParserROS::parseTSLValues
void parseTSLValues(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:663
PJ::MessageRef::data
const uint8_t * data() const
Definition: messageparser_base.h:51
PJ::Msg::Quaternion::w
double w
Definition: special_messages.h:96
PJ::MessageParser::useEmbeddedTimestamp
virtual bool useEmbeddedTimestamp() const
Definition: messageparser_base.h:106
mqtt_test_proto.x
x
Definition: mqtt_test_proto.py:34
ParserROS::_deserializer
std::unique_ptr< RosMsgParser::Deserializer > _deserializer
Definition: ros_parser.h:27
mqtt_test_proto.msg
msg
Definition: mqtt_test_proto.py:43
PJ::MessageParser::maxArraySize
unsigned maxArraySize() const
Definition: messageparser_base.h:96
ParserROS::parseTransformStamped
void parseTransformStamped(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:288
ok
ROSCPP_DECL bool ok()
mqtt_test_proto.y
y
Definition: mqtt_test_proto.py:35
ParserROS::_customized_parser
std::function< void(const std::string &prefix, double &)> _customized_parser
Definition: ros_parser.h:71
ParserROS::readHeader
PJ::Msg::Header readHeader(double &timestamp)
Definition: ros_parser.cpp:193
mqtt_test_proto.z
z
Definition: mqtt_test_proto.py:36
ParserROS::parseJointStateMsg
void parseJointStateMsg(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:404
M_PI
#define M_PI
Definition: qwt_math.h:56
RAD_TO_DEG
constexpr double RAD_TO_DEG
Definition: ros_parser.cpp:16
start_test_publisher.timestamp
timestamp
Definition: start_test_publisher.py:32
PJ::Msg::Quaternion::id
static const char * id()
Definition: special_messages.h:98
RosMsgParser::UINT8
@ UINT8
Definition: builtin_types.hpp:48
RosMsgParser::FLOAT64
@ FLOAT64
Definition: builtin_types.hpp:57
RosMsgParser
Definition: builtin_types.hpp:34
ParserROS::process_tsl_values
void process_tsl_values(const std::string &prefix, const double &timestamp, const std::vector< std::string > &definition, const std::vector< double > &values)
Definition: ros_parser.cpp:606
RosMsgParser::Parser::KEEP_LARGE_ARRAYS
@ KEEP_LARGE_ARRAYS
Definition: ros_parser.hpp:69
RosMsgParser::UINT64
@ UINT64
Definition: builtin_types.hpp:51
ParserROS::setLargeArraysPolicy
void setLargeArraysPolicy(bool clamp, unsigned max_size) override
Definition: ros_parser.cpp:182
ParserROS::parseDiagnosticMsg
void parseDiagnosticMsg(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:341
RosMsgParser::RangeException
Definition: exceptions.hpp:76
backward::details::move
const T & move(const T &v)
Definition: backward.hpp:394
ParserROS::parseMessage
bool parseMessage(const PJ::MessageRef serialized_msg, double &timestamp) override
Definition: ros_parser.cpp:108
PJ::MessageParser
The MessageParser is the base class used to parse a message with a specific encoding+schema.
Definition: messageparser_base.h:75
ParserROS::parseImu
void parseImu(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:317
PJ::MessageParser::getSeries
PlotData & getSeries(const std::string &key)
Definition: messageparser_base.h:120
PJ::Msg::Quaternion::x
double x
Definition: special_messages.h:93
PJ::MessageParser::getStringSeries
StringSeries & getStringSeries(const std::string &key)
Definition: messageparser_base.h:125
ParserROS::_topic
std::string _topic
Definition: ros_parser.h:29
ParserROS::parsePose
void parsePose(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:299
ParserROS::parseHeader
void parseHeader(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:215
_tsl_values_buffer
static std::unordered_map< std::uint64_t, std::queue< std::tuple< std::string, double, std::vector< double > > > > _tsl_values_buffer
Definition: ros_parser.cpp:605
RosMsgParser::UINT32
@ UINT32
Definition: builtin_types.hpp:50
ParserROS::parseTransform
void parseTransform(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:282
format
auto format(const text_style &ts, const S &format_str, const Args &... args) -> std::basic_string< Char >
Definition: color.h:543
RosMsgParser::UINT16
@ UINT16
Definition: builtin_types.hpp:49
ParserROS::parseDataTamerSnapshot
void parseDataTamerSnapshot(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:521
RosMsgParser::Deserializer
Definition: deserializer.hpp:20
RosMsgParser::Parser::deserialize
bool deserialize(Span< const uint8_t > buffer, FlatMessage *flat_output, Deserializer *deserializer) const
deserializeIntoFlatContainer takes a raw buffer of memory and extract information from it....
Definition: rosx_introspection/src/ros_parser.cpp:76
RosMsgParser::FlatMessage::name
std::vector< std::pair< FieldsVector, std::string > > name
List of all those parsed fields that can be represented by a "string".
Definition: ros_parser.hpp:42
_tsl_type_order
constexpr static std::array< BuiltinType, 11 > _tsl_type_order
Definition: ros_parser.cpp:596
RosMsgParser::FlatMessage::value
std::vector< std::pair< FieldsVector, Variant > > value
Definition: ros_parser.hpp:39
toDouble
double toDouble(const void *data)
Definition: dataload_zcm.cpp:196
ParserROS::_parser
RosMsgParser::Parser _parser
Definition: ros_parser.h:26
PJ::Msg::DiagnosticArray
Definition: special_messages.h:55
ParserROS::parseTF2Msg
void parseTF2Msg(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:474
nonstd::span_lite::span
Definition: span.hpp:581
ParserROS::parsePoseStamped
void parsePoseStamped(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:305
RosMsgParser::RangeException::what
const char * what() const
Definition: exceptions.hpp:120
RosMsgParser::ROS_Deserializer
Definition: deserializer.hpp:63
PJ::Msg::QuaternionToRPY
RPY QuaternionToRPY(Quaternion q)
Definition: special_messages.cpp:4
PJ::Msg::JointState
Definition: special_messages.h:232
PJ::MessageRef
Definition: messageparser_base.h:28
core.h
ParserROS::parseOdometry
void parseOdometry(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:331
PJ
Definition: dataloader_base.h:16
ParserROS::parseTSLDefinition
void parseTSLDefinition(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:619
RosMsgParser::Parser::DISCARD_LARGE_ARRAYS
@ DISCARD_LARGE_ARRAYS
Definition: ros_parser.hpp:68
ParserROS::parseQuaternion
void parseQuaternion(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:252
mqtt_test.data
dictionary data
Definition: mqtt_test.py:22
PJ::MessageRef::size
size_t size() const
Definition: messageparser_base.h:61
_tsl_definitions
static std::unordered_map< std::uint64_t, std::vector< std::string > > _tsl_definitions
Definition: ros_parser.cpp:601
_global_data_tamer_schemas
static std::unordered_map< uint64_t, DataTamerParser::Schema > _global_data_tamer_schemas
Definition: ros_parser.cpp:18
ParserROS::parseVector3
void parseVector3(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:232
PJ::PlotDataMapRef
Definition: plotdata.h:34
RosMsgParser::BOOL
@ BOOL
Definition: builtin_types.hpp:45
PJ::MessageParser::clampLargeArray
bool clampLargeArray() const
Definition: messageparser_base.h:101
ParserROS::parsePoint
void parsePoint(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:242
ParserROS::parseTwist
void parseTwist(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:270
ros_parser.h
PJ::Msg::Quaternion::z
double z
Definition: special_messages.h:95
header
const std::string header
PJ::Msg::Header
Definition: special_messages.h:25
ParserROS::ParserROS
ParserROS(const std::string &topic_name, const std::string &type_name, const std::string &schema, RosMsgParser::Deserializer *deserializer, PJ::PlotDataMapRef &data)
Definition: ros_parser.cpp:20
ParserROS::parsePalStatisticsValues
void parsePalStatisticsValues(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:571
ParserROS::_flat_msg
RosMsgParser::FlatMessage _flat_msg
Definition: ros_parser.h:28
RosMsgParser::Time
Definition: builtin_types.hpp:150
PJ::Msg::Quaternion::y
double y
Definition: special_messages.h:94
RosMsgParser::INT16
@ INT16
Definition: builtin_types.hpp:53
ParserROS::_has_header
bool _has_header
Definition: ros_parser.h:73
RosMsgParser::Parser::getSchema
const std::shared_ptr< MessageSchema > & getSchema() const
getSchema provides some metadata amount a registered ROSMessage.
Definition: rosx_introspection/src/ros_parser.cpp:49
PJ::Msg::Quaternion
Definition: special_messages.h:91
RosMsgParser::INT32
@ INT32
Definition: builtin_types.hpp:54
_pal_statistics_names
static std::unordered_map< uint32_t, std::vector< std::string > > _pal_statistics_names
Definition: ros_parser.cpp:555
PJ::StringSeries
Definition: stringseries.h:17
RosMsgParser::INT64
@ INT64
Definition: builtin_types.hpp:55
ParserROS::parsePoseWithCovariance
void parsePoseWithCovariance(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:311
ParserROS::parseDataTamerSchemas
void parseDataTamerSchemas(const std::string &prefix, double &timestamp)
Definition: ros_parser.cpp:502


plotjuggler
Author(s): Davide Faconti
autogenerated on Mon May 26 2025 02:22:38