2 #include "data_tamer_parser/data_tamer_parser.hpp"
6 #include <unordered_map>
24 , _parser(topic_name, type_name, schema)
25 , _deserializer(deserializer)
29 clampLargeArray() ? Parser::KEEP_LARGE_ARRAYS : Parser::DISCARD_LARGE_ARRAYS;
34 _has_header = !root_fields.empty() && root_fields.front().type().baseName() ==
"std_"
38 using std::placeholders::_1;
39 using std::placeholders::_2;
40 if (Msg::Empty::id() == type_name)
44 else if (Msg::DiagnosticArray::id() == type_name)
48 else if (Msg::JointState::id() == type_name)
52 else if (Msg::TFMessage::id() == type_name)
56 else if (Msg::DataTamerSchemas::id() == type_name)
60 else if (Msg::DataTamerSnapshot::id() == type_name)
64 else if (Msg::Imu::id() == type_name)
68 else if (Msg::Pose::id() == type_name)
72 else if (Msg::PoseStamped::id() == type_name)
76 else if (Msg::Odometry::id() == type_name)
80 else if (Msg::Transform::id() == type_name)
84 else if (Msg::TransformStamped::id() == type_name)
88 else if (Msg::PalStatisticsNames::id() == type_name || type_name ==
"plotjuggler_msgs/"
93 else if (Msg::PalStatisticsValues::id() == type_name || type_name ==
"plotjuggler_msgs/"
98 else if (
"tsl_msgs/TSLDefinition" == type_name)
102 else if (
"tsl_msgs/TSLValues" == type_name)
127 ts = sec + 1e-9 * nsec;
136 std::string series_name;
140 key.toStr(series_name);
147 key.toStr(series_name);
155 data.pushBack({
timestamp, double(value.convert<int64_t>()) });
160 data.pushBack({
timestamp, double(value.convert<uint64_t>()) });
170 std::string
msg = std::string(ex.
what());
171 if (
msg ==
"Floating point truncated")
173 msg +=
".\n\nYou can disable this check in:\n"
174 "App -> Preferences... -> Behavior -> Parsing";
176 throw std::runtime_error(
msg);
188 MessageParser::setLargeArraysPolicy(clamp, max_size);
205 const double ts =
header.stamp.toSec();
279 parseCovariance<6>(prefix +
"/covariance",
timestamp);
292 std::string child_frame_id;
314 parseCovariance<6>(prefix +
"/covariance",
timestamp);
322 parseCovariance<3>(prefix +
"/orientation_covariance",
timestamp);
325 parseCovariance<3>(prefix +
"/angular_velocity_covariance",
timestamp);
328 parseCovariance<3>(prefix +
"/linear_acceleration_covariance",
timestamp);
334 std::string child_frame_id;
348 msg.status.resize(status_count);
350 for (
size_t st = 0; st < status_count; st++)
352 auto& status =
msg.status[st];
358 status.key_value.clear();
362 std::string value_str;
363 for (
size_t kv = 0; kv < key_value_count; kv++)
367 status.key_value.push_back({ key, value_str });
373 std::string series_name;
375 for (
const auto& status :
msg.status)
377 for (
const auto& kv : status.key_value)
379 if (status.hardware_id.empty())
381 series_name =
fmt::format(
"{}/{}/{}", prefix, status.name, kv.first);
386 fmt::format(
"{}/{}/{}/{}", prefix, status.hardware_id, status.name, kv.first);
390 double value = QString::fromStdString(kv.second).toDouble(&
ok);
409 msg.position.clear();
410 msg.velocity.clear();
418 msg.name.resize(name_size);
419 for (
auto& name :
msg.name)
429 msg.position.resize(pos_size);
430 for (
auto& pos :
msg.position)
439 msg.velocity.resize(vel_size);
440 for (
auto& vel :
msg.velocity)
449 msg.effort.resize(eff_size);
450 for (
auto& eff :
msg.effort)
456 std::string series_name;
457 for (
size_t i = 0; i < std::min(name_size, pos_size); i++)
462 for (
size_t i = 0; i < std::min(name_size, vel_size); i++)
467 for (
size_t i = 0; i < std::min(name_size, eff_size); i++)
476 const size_t transform_size =
_deserializer->deserializeUInt32();
478 if (transform_size == 0)
483 for (
size_t i = 0; i < transform_size; i++)
486 std::string child_frame_id;
489 std::string new_prefix;
490 if (
header.frame_id.empty())
492 new_prefix =
fmt::format(
"{}/{}", prefix, child_frame_id);
504 const size_t vector_size =
_deserializer->deserializeUInt32();
506 for (
size_t i = 0; i < vector_size; i++)
508 DataTamerParser::Schema schema;
510 std::string channel_name;
512 std::string schema_text;
515 auto dt_schema = DataTamerParser::BuilSchemaFromText(schema_text);
516 dt_schema.channel_name = channel_name;
523 DataTamerParser::SnapshotView snapshot;
527 snapshot.schema_hash =
531 snapshot.active_mask = { active_mask.data(), active_mask.size() };
534 snapshot.payload = { payload.data(), payload.size() };
541 const auto& dt_schema = it->second;
543 const auto toDouble = [](
const auto& value) {
return static_cast<double>(value); };
545 auto callback = [&](
const std::string& name_field,
546 const DataTamerParser::VarNumber& value) {
547 double timestamp = double(snapshot.timestamp) * 1e-9;
552 DataTamerParser::ParseSnapshot(dt_schema, snapshot, callback);
560 std::vector<std::string> names;
561 const size_t vector_size =
_deserializer->deserializeUInt32();
562 names.resize(vector_size);
563 for (
auto& name : names)
574 std::vector<double> values;
575 const size_t vector_size =
_deserializer->deserializeUInt32();
576 values.resize(vector_size);
578 for (
auto& value : values)
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++)
591 series.pushBack({
timestamp, values[i] });
603 static std::unordered_map<
604 std::uint64_t, std::queue<std::tuple<std::string, double, std::vector<double>>>>
608 const std::vector<std::string>& definition,
609 const std::vector<double>& values)
612 for (
size_t i = 0; i < N; i++)
615 series.pushBack({
timestamp, values[i] });
655 while (!buffer_queue.empty())
657 const auto& tuple = buffer_queue.front();
673 std::vector<double> values;
680 values.resize(values.size() + num_signals);
681 for (; index < values.size(); index++)
683 values[index] =
_deserializer->deserialize(type_id).convert<
double>();